From b5cdb2d335546e62eb9d365348d8dbb6b7936d09 Mon Sep 17 00:00:00 2001 From: Sheikah <> Date: Thu, 19 Jan 2023 00:11:51 +0800 Subject: [PATCH] test in progress --- .gitignore | 7 + .mxproject | 33 + .vscode/c_cpp_properties.json | 33 + .vscode/settings.json | 7 + .vscode/tasks.json | 33 + Core/APP/app.c | 387 + Core/APP/app.h | 0 Core/Inc/gpio.h | 49 + Core/Inc/main.h | 107 + Core/Inc/spi.h | 52 + Core/Inc/stm32g0xx_hal_conf.h | 351 + Core/Inc/stm32g0xx_it.h | 62 + Core/Inc/tim.h | 52 + Core/Inc/usart.h | 52 + Core/RotaryCoder/RotaryCoder.c | 26 + Core/RotaryCoder/RotaryCoder.h | 13 + Core/ST7735/Images/digi18x32.h | 53 + Core/ST7735/UI/monoimg.c | 52 + Core/ST7735/UI/monoimg.h | 19 + Core/ST7735/UI/ui.c | 26 + Core/ST7735/UI/ui.h | 4 + Core/ST7735/st7735.c | 283 + Core/ST7735/st7735.h | 247 + Core/SWI2C/i2c_sw.c | 764 + Core/SWI2C/i2c_sw.h | 54 + Core/SWI2C/readme.md | 43 + Core/Src/gpio.c | 111 + Core/Src/main.c | 216 + Core/Src/spi.c | 119 + Core/Src/stm32g0xx_hal_msp.c | 81 + Core/Src/stm32g0xx_it.c | 145 + Core/Src/system_stm32g0xx.c | 302 + Core/Src/tim.c | 141 + Core/Src/usart.c | 140 + Core/kt0915/KT0915.C | 810 + Core/kt0915/KT0915.h | 582 + Drivers/CMSIS/Core/Include/cmsis_armcc.h | 894 + Drivers/CMSIS/Core/Include/cmsis_armclang.h | 1444 + .../CMSIS/Core/Include/cmsis_armclang_ltm.h | 1891 + Drivers/CMSIS/Core/Include/cmsis_compiler.h | 283 + Drivers/CMSIS/Core/Include/cmsis_gcc.h | 2168 + Drivers/CMSIS/Core/Include/cmsis_iccarm.h | 964 + Drivers/CMSIS/Core/Include/cmsis_version.h | 39 + Drivers/CMSIS/Core/Include/core_armv81mml.h | 2968 + Drivers/CMSIS/Core/Include/core_armv8mbl.h | 1921 + Drivers/CMSIS/Core/Include/core_armv8mml.h | 2835 + Drivers/CMSIS/Core/Include/core_cm0.h | 952 + Drivers/CMSIS/Core/Include/core_cm0plus.h | 1085 + Drivers/CMSIS/Core/Include/core_cm1.h | 979 + Drivers/CMSIS/Core/Include/core_cm23.h | 1996 + Drivers/CMSIS/Core/Include/core_cm3.h | 1937 + Drivers/CMSIS/Core/Include/core_cm33.h | 2910 + Drivers/CMSIS/Core/Include/core_cm35p.h | 2910 + Drivers/CMSIS/Core/Include/core_cm4.h | 2124 + Drivers/CMSIS/Core/Include/core_cm7.h | 2725 + Drivers/CMSIS/Core/Include/core_sc000.h | 1025 + Drivers/CMSIS/Core/Include/core_sc300.h | 1912 + Drivers/CMSIS/Core/Include/mpu_armv7.h | 272 + Drivers/CMSIS/Core/Include/mpu_armv8.h | 346 + Drivers/CMSIS/Core/Include/tz_context.h | 70 + Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c | 58 + .../CMSIS/Core/Template/ARMv8-M/tz_context.c | 200 + .../DSP/DSP_Lib_TestSuite/CMakeLists.txt | 136 + .../Common/JTest/inc/arr_desc/arr_desc.h | 220 + .../Common/JTest/inc/jtest.h | 17 + .../Common/JTest/inc/jtest_cycle.h | 79 + .../Common/JTest/inc/jtest_define.h | 37 + .../Common/JTest/inc/jtest_fw.h | 282 + .../Common/JTest/inc/jtest_group.h | 66 + .../Common/JTest/inc/jtest_group_call.h | 126 + .../Common/JTest/inc/jtest_group_define.h | 87 + .../Common/JTest/inc/jtest_pf.h | 85 + .../Common/JTest/inc/jtest_systick.h | 94 + .../Common/JTest/inc/jtest_test.h | 100 + .../Common/JTest/inc/jtest_test_call.h | 121 + .../Common/JTest/inc/jtest_test_define.h | 133 + .../Common/JTest/inc/jtest_test_ret.h | 17 + .../Common/JTest/inc/jtest_util.h | 27 + .../Common/JTest/inc/opt_arg/opt_arg.h | 15 + .../Common/JTest/inc/opt_arg/pp_narg.h | 25 + .../Common/JTest/inc/opt_arg/splice.h | 8 + .../Common/JTest/inc/util/util.h | 52 + .../Common/JTest/src/jtest_cycle.c | 9 + .../JTest/src/jtest_dump_str_segments.c | 36 + .../Common/JTest/src/jtest_fw.c | 9 + .../Common/JTest/src/jtest_trigger_action.c | 37 + .../DSP_Lib_TestSuite/Common/inc/all_tests.h | 9 + .../basic_math_tests/basic_math_templates.h | 267 + .../basic_math_tests/basic_math_test_data.h | 46 + .../basic_math_tests/basic_math_test_group.h | 9 + .../inc/basic_math_tests/basic_math_tests.h | 17 + .../complex_math_templates.h | 222 + .../complex_math_test_data.h | 50 + .../complex_math_test_group.h | 9 + .../complex_math_tests/complex_math_tests.h | 14 + .../controller_tests/controller_templates.h | 46 + .../controller_tests/controller_test_data.h | 33 + .../controller_tests/controller_test_group.h | 9 + .../inc/controller_tests/controller_tests.h | 11 + .../inc/fast_math_tests/fast_math_templates.h | 102 + .../inc/fast_math_tests/fast_math_test_data.h | 29 + .../fast_math_tests/fast_math_test_group.h | 9 + .../inc/filtering_tests/filtering_templates.h | 91 + .../inc/filtering_tests/filtering_test_data.h | 81 + .../filtering_tests/filtering_test_group.h | 9 + .../inc/filtering_tests/filtering_tests.h | 15 + .../intrinsics_tests/intrinsics_templates.h | 166 + .../intrinsics_tests/intrinsics_test_data.h | 27 + .../intrinsics_tests/intrinsics_test_group.h | 9 + .../Common/inc/math_helper.h | 52 + .../inc/matrix_tests/matrix_templates.h | 370 + .../inc/matrix_tests/matrix_test_data.h | 54 + .../inc/matrix_tests/matrix_test_group.h | 9 + .../Common/inc/matrix_tests/matrix_tests.h | 17 + .../statistics_tests/statistics_templates.h | 157 + .../statistics_tests/statistics_test_data.h | 44 + .../statistics_tests/statistics_test_group.h | 9 + .../inc/statistics_tests/statistics_tests.h | 15 + .../inc/support_tests/support_templates.h | 120 + .../inc/support_tests/support_test_data.h | 31 + .../inc/support_tests/support_test_group.h | 9 + .../Common/inc/support_tests/support_tests.h | 11 + .../Common/inc/templates/template.h | 88 + .../Common/inc/templates/test_templates.h | 466 + .../inc/transform_tests/transform_templates.h | 181 + .../inc/transform_tests/transform_test_data.h | 48 + .../transform_tests/transform_test_group.h | 9 + .../inc/transform_tests/transform_tests.h | 13 + .../Common/inc/type_abbrev.h | 37 + .../Common/platform/ARMCC/Retarget.c | 52 + .../Common/platform/ARMCC/startup_armv6-m.s | 111 + .../Common/platform/ARMCC/startup_armv7-m.s | 134 + .../platform/ARMCLANG/startup_armv6-m.S | 127 + .../platform/ARMCLANG/startup_armv7-m.S | 159 + .../Common/platform/GCC/Retarget.c | 106 + .../Common/platform/GCC/startup_armv6-m.S | 263 + .../Common/platform/GCC/startup_armv7-m.S | 257 + .../Common/platform/startup_generic.S | 68 + .../Common/platform/system_ARMCM0.c | 56 + .../Common/platform/system_ARMCM23.c | 82 + .../Common/platform/system_ARMCM3.c | 68 + .../Common/platform/system_ARMCM33.c | 99 + .../Common/platform/system_ARMCM4.c | 83 + .../Common/platform/system_ARMCM7.c | 85 + .../Common/platform/system_ARMSC000.c | 56 + .../Common/platform/system_ARMSC300.c | 72 + .../Common/platform/system_ARMv8MBL.c | 76 + .../Common/platform/system_ARMv8MML.c | 99 + .../Common/platform/system_generic.c | 27 + .../DSP_Lib_TestSuite/Common/src/all_tests.c | 62 + .../Common/src/basic_math_tests/abs_tests.c | 32 + .../Common/src/basic_math_tests/add_tests.c | 33 + .../basic_math_test_common_data.c | 101 + .../basic_math_tests/basic_math_test_group.c | 17 + .../src/basic_math_tests/dot_prod_tests.c | 33 + .../Common/src/basic_math_tests/mult_tests.c | 33 + .../src/basic_math_tests/negate_tests.c | 32 + .../src/basic_math_tests/offset_tests.c | 33 + .../Common/src/basic_math_tests/scale_tests.c | 52 + .../Common/src/basic_math_tests/shift_tests.c | 31 + .../Common/src/basic_math_tests/sub_tests.c | 33 + .../src/complex_math_tests/cmplx_conj_tests.c | 31 + .../complex_math_tests/cmplx_dot_prod_tests.c | 31 + .../cmplx_mag_squared_tests.c | 31 + .../src/complex_math_tests/cmplx_mag_tests.c | 31 + .../cmplx_mult_cmplx_tests.c | 31 + .../complex_math_tests/cmplx_mult_real_test.c | 31 + .../complex_math_test_common_data.c | 114 + .../complex_math_test_group.c | 14 + .../controller_test_common_data.c | 499 + .../controller_tests/controller_test_group.c | 13 + .../src/controller_tests/pid_reset_tests.c | 52 + .../Common/src/controller_tests/pid_tests.c | 79 + .../src/controller_tests/sin_cos_tests.c | 151 + .../src/fast_math_tests/fast_math_tests.c | 38 + .../fast_math_tests_common_data.c | 370 + .../Common/src/filtering_tests/biquad_tests.c | 244 + .../Common/src/filtering_tests/conv_tests.c | 473 + .../src/filtering_tests/correlate_tests.c | 310 + .../filtering_test_common_data.c | 757 + .../filtering_tests/filtering_test_group.c | 17 + .../Common/src/filtering_tests/fir_tests.c | 402 + .../Common/src/filtering_tests/iir_tests.c | 76 + .../Common/src/filtering_tests/lms_tests.c | 219 + .../src/intrinsics_tests/intrinsics_tests.c | 62 + .../intrinsics_tests_common_data.c | 189 + .../DSP/DSP_Lib_TestSuite/Common/src/main.c | 31 + .../Common/src/math_helper.c | 509 + .../Common/src/matrix_tests/mat_add_tests.c | 31 + .../src/matrix_tests/mat_cmplx_mult_tests.c | 59 + .../Common/src/matrix_tests/mat_init_tests.c | 58 + .../src/matrix_tests/mat_inverse_tests.c | 92 + .../src/matrix_tests/mat_mult_fast_tests.c | 57 + .../Common/src/matrix_tests/mat_mult_tests.c | 59 + .../Common/src/matrix_tests/mat_scale_tests.c | 90 + .../Common/src/matrix_tests/mat_sub_tests.c | 34 + .../Common/src/matrix_tests/mat_trans_tests.c | 33 + .../matrix_tests/matrix_test_common_data.c | 259 + .../src/matrix_tests/matrix_test_group.c | 19 + .../Common/src/statistics_tests/max_tests.c | 36 + .../Common/src/statistics_tests/mean_tests.c | 36 + .../Common/src/statistics_tests/min_tests.c | 36 + .../Common/src/statistics_tests/power_tests.c | 36 + .../Common/src/statistics_tests/rms_tests.c | 34 + .../statistics_test_common_data.c | 94 + .../statistics_tests/statistics_test_group.c | 14 + .../Common/src/statistics_tests/std_tests.c | 34 + .../Common/src/statistics_tests/var_tests.c | 34 + .../Common/src/support_tests/copy_tests.c | 33 + .../Common/src/support_tests/fill_tests.c | 36 + .../support_tests/support_test_common_data.c | 85 + .../src/support_tests/support_test_group.c | 10 + .../Common/src/support_tests/x_to_y_tests.c | 80 + .../src/transform_tests/cfft_family_tests.c | 183 + .../Common/src/transform_tests/cfft_tests.c | 144 + .../Common/src/transform_tests/dct4_tests.c | 197 + .../src/transform_tests/rfft_fast_tests.c | 75 + .../Common/src/transform_tests/rfft_tests.c | 94 + .../transform_tests/transform_test_group.c | 11 + .../transform_tests_common_data.c | 3311 + .../DspLibTest_FVP/ARMv8MBLl_config.txt | 11 + .../DspLibTest_FVP/ARMv8MMLl_config.txt | 13 + .../DspLibTest_FVP/ARMv8MMLld_config.txt | 13 + .../DspLibTest_FVP/ARMv8MMLldfsp_config.txt | 13 + .../DspLibTest_FVP/ARMv8MMLlfsp_config.txt | 13 + .../DspLibTest_FVP/cortexM0l_config.txt | 8 + .../DspLibTest_FVP/cortexM3l_config.txt | 8 + .../DspLibTest_FVP/cortexM4l_config.txt | 9 + .../DspLibTest_FVP/cortexM4lf_config.txt | 9 + .../DspLibTest_FVP/cortexM7l_config.txt | 9 + .../DspLibTest_FVP/cortexM7lfdp_config.txt | 9 + .../DspLibTest_FVP/cortexM7lfsp_config.txt | 9 + .../DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.c | 63 + .../DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.h | 578 + .../DspLibTest_FVP_A5/RTE/CMSIS/handlers.c | 153 + .../RTE/Device/ARMCA5/mem_ARMCA5.h | 94 + .../RTE/Device/ARMCA5/mmu_ARMCA5.c | 235 + .../RTE/Device/ARMCA5/startup_ARMCA5.c | 138 + .../RTE/Device/ARMCA5/system_ARMCA5.c | 93 + .../RTE/Device/ARMCA5/system_ARMCA5.h | 65 + .../DspLibTest_FVP_A5/RTE/RTE_Components.h | 20 + .../DspLibTest_FVP_A5/main.c | 34 + .../DspLibTest_MPS2/HowTo.txt | 29 + .../DspLibTest_SV_FVP/ARMv8MBLl_config.txt | 11 + .../DspLibTest_SV_FVP/ARMv8MMLl_config.txt | 13 + .../DspLibTest_SV_FVP/ARMv8MMLld_config.txt | 13 + .../ARMv8MMLldfsp_config.txt | 13 + .../DspLibTest_SV_FVP/ARMv8MMLlfsp_config.txt | 13 + .../DspLibTest_SV_FVP/cortexM0l_config.txt | 8 + .../DspLibTest_SV_FVP/cortexM3l_config.txt | 8 + .../DspLibTest_SV_FVP/cortexM4l_config.txt | 9 + .../DspLibTest_SV_FVP/cortexM4lf_config.txt | 9 + .../DspLibTest_SV_FVP/cortexM7l_config.txt | 9 + .../DspLibTest_SV_FVP/cortexM7lfdp_config.txt | 9 + .../DspLibTest_SV_FVP/cortexM7lfsp_config.txt | 9 + .../DspLibTest_SV_MPS2/ARMv8MBLl_config.txt | 11 + .../DspLibTest_SV_MPS2/ARMv8MMLl_config.txt | 13 + .../DspLibTest_SV_MPS2/ARMv8MMLld_config.txt | 13 + .../ARMv8MMLldfsp_config.txt | 13 + .../ARMv8MMLlfsp_config.txt | 13 + .../DspLibTest_SV_MPS2/cortexM0l_config.txt | 8 + .../DspLibTest_SV_MPS2/cortexM3l_config.txt | 8 + .../DspLibTest_SV_MPS2/cortexM4l_config.txt | 9 + .../DspLibTest_SV_MPS2/cortexM4lf_config.txt | 9 + .../DspLibTest_SV_MPS2/cortexM7l_config.txt | 9 + .../cortexM7lfdp_config.txt | 9 + .../cortexM7lfsp_config.txt | 9 + Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo.txt | 137 + .../CMSIS/DSP/DSP_Lib_TestSuite/HowTo_SV.txt | 117 + .../DSP_Lib_TestSuite/RefLibs/CMakeLists.txt | 78 + .../DSP/DSP_Lib_TestSuite/RefLibs/inc/ref.h | 1401 + .../BasicMathFunctions/BasicMathFunctions.c | 11 + .../RefLibs/src/BasicMathFunctions/abs.c | 53 + .../RefLibs/src/BasicMathFunctions/add.c | 57 + .../RefLibs/src/BasicMathFunctions/dot_prod.c | 65 + .../RefLibs/src/BasicMathFunctions/mult.c | 64 + .../RefLibs/src/BasicMathFunctions/negate.c | 53 + .../RefLibs/src/BasicMathFunctions/offset.c | 57 + .../RefLibs/src/BasicMathFunctions/scale.c | 69 + .../RefLibs/src/BasicMathFunctions/shift.c | 73 + .../RefLibs/src/BasicMathFunctions/sub.c | 57 + .../ComplexMathFunctions.c | 8 + .../src/ComplexMathFunctions/cmplx_conj.c | 40 + .../src/ComplexMathFunctions/cmplx_dot_prod.c | 72 + .../src/ComplexMathFunctions/cmplx_mag.c | 49 + .../ComplexMathFunctions/cmplx_mag_squared.c | 46 + .../ComplexMathFunctions/cmplx_mult_cmplx.c | 56 + .../ComplexMathFunctions/cmplx_mult_real.c | 52 + .../ControllerFunctions/ControllerFunctions.c | 4 + .../RefLibs/src/ControllerFunctions/pid.c | 97 + .../RefLibs/src/ControllerFunctions/sin_cos.c | 21 + .../src/FastMathFunctions/FastMathFunctions.c | 5 + .../RefLibs/src/FastMathFunctions/cos.c | 11 + .../RefLibs/src/FastMathFunctions/sin.c | 11 + .../RefLibs/src/FastMathFunctions/sqrt.c | 15 + .../FilteringFunctions/FilteringFunctions.c | 12 + .../RefLibs/src/FilteringFunctions/biquad.c | 713 + .../RefLibs/src/FilteringFunctions/conv.c | 350 + .../src/FilteringFunctions/correlate.c | 513 + .../RefLibs/src/FilteringFunctions/fir.c | 325 + .../src/FilteringFunctions/fir_decimate.c | 386 + .../src/FilteringFunctions/fir_interpolate.c | 291 + .../src/FilteringFunctions/fir_lattice.c | 241 + .../src/FilteringFunctions/fir_sparse.c | 485 + .../src/FilteringFunctions/iir_lattice.c | 271 + .../RefLibs/src/FilteringFunctions/lms.c | 695 + .../src/HelperFunctions/HelperFunctions.c | 4 + .../RefLibs/src/HelperFunctions/mat_helper.c | 193 + .../RefLibs/src/HelperFunctions/ref_helper.c | 103 + .../RefLibs/src/Intrinsics/Intrinsics_.c | 3 + .../RefLibs/src/Intrinsics/intrinsics.c | 238 + .../src/MatrixFunctions/MatrixFunctions.c | 9 + .../RefLibs/src/MatrixFunctions/mat_add.c | 58 + .../src/MatrixFunctions/mat_cmplx_mult.c | 118 + .../RefLibs/src/MatrixFunctions/mat_inverse.c | 57 + .../RefLibs/src/MatrixFunctions/mat_mult.c | 91 + .../RefLibs/src/MatrixFunctions/mat_scale.c | 64 + .../RefLibs/src/MatrixFunctions/mat_sub.c | 58 + .../RefLibs/src/MatrixFunctions/mat_trans.c | 77 + .../StatisticsFunctions/StatisticsFunctions.c | 8 + .../RefLibs/src/StatisticsFunctions/max.c | 85 + .../RefLibs/src/StatisticsFunctions/mean.c | 61 + .../RefLibs/src/StatisticsFunctions/min.c | 85 + .../RefLibs/src/StatisticsFunctions/power.c | 61 + .../RefLibs/src/StatisticsFunctions/rms.c | 65 + .../RefLibs/src/StatisticsFunctions/std.c | 74 + .../RefLibs/src/StatisticsFunctions/var.c | 70 + .../src/SupportFunctions/SupportFunctions.c | 6 + .../RefLibs/src/SupportFunctions/copy.c | 53 + .../RefLibs/src/SupportFunctions/fill.c | 53 + .../src/SupportFunctions/fixed_to_fixed.c | 79 + .../src/SupportFunctions/fixed_to_float.c | 53 + .../src/SupportFunctions/float_to_fixed.c | 52 + .../TransformFunctions/TransformFunctions.c | 4 + .../src/TransformFunctions/bitreversal.c | 30 + .../RefLibs/src/TransformFunctions/cfft.c | 598 + .../RefLibs/src/TransformFunctions/dct4.c | 89 + .../RefLibs/src/TransformFunctions/rfft.c | 302 + .../ARM/arm_class_marks_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_class_marks_example_f32.c | 211 + .../ARM/arm_convolution_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_convolution_example_f32.c | 247 + .../ARM/arm_convolution_example/math_helper.c | 466 + .../ARM/arm_convolution_example/math_helper.h | 63 + .../ARM/arm_dotproduct_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_dotproduct_example_f32.c | 178 + .../ARM/arm_fft_bin_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_fft_bin_example/arm_fft_bin_data.c | 308 + .../arm_fft_bin_example_f32.c | 158 + .../Examples/ARM/arm_fir_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../ARM/arm_fir_example/arm_fir_data.c | 134 + .../ARM/arm_fir_example/arm_fir_example_f32.c | 233 + .../ARM/arm_fir_example/math_helper.c | 466 + .../ARM/arm_fir_example/math_helper.h | 63 + .../Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_graphic_equalizer_data.c | 134 + .../arm_graphic_equalizer_example_q31.c | 411 + .../math_helper.c | 466 + .../math_helper.h | 63 + .../arm_linear_interp_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_linear_interp_data.c | 23616 +++++++ .../arm_linear_interp_example_f32.c | 204 + .../arm_linear_interp_example/math_helper.c | 466 + .../arm_linear_interp_example/math_helper.h | 63 + .../ARM/arm_matrix_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_matrix_example_f32.c | 233 + .../ARM/arm_matrix_example/math_helper.c | 466 + .../ARM/arm_matrix_example/math_helper.h | 63 + .../arm_signal_converge_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_signal_converge_data.c | 269 + .../arm_signal_converge_example_f32.c | 259 + .../arm_signal_converge_example/math_helper.c | 466 + .../arm_signal_converge_example/math_helper.h | 63 + .../ARM/arm_sin_cos_example/Abstract.txt | 4 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_sin_cos_example_f32.c | 161 + .../ARM/arm_variance_example/Abstract.txt | 4 + .../ARM/arm_variance_example/CMakeLists.txt | 46 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 159 + .../RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 163 + .../RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 163 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 163 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../arm_variance_example_f32.c | 225 + .../DSP/Examples/ARM/boot/RTE_Components.h | 5 + Drivers/CMSIS/DSP/Include/arm_common_tables.h | 378 + Drivers/CMSIS/DSP/Include/arm_const_structs.h | 66 + Drivers/CMSIS/DSP/Include/arm_math.h | 7361 ++ .../CMSIS/DSP/Lib/ARM/arm_cortexM0b_math.lib | Bin 0 -> 2399752 bytes .../CMSIS/DSP/Lib/ARM/arm_cortexM0l_math.lib | Bin 0 -> 2399668 bytes .../CMSIS/DSP/Lib/GCC/libarm_cortexM0l_math.a | Bin 0 -> 5267312 bytes .../CMSIS/DSP/Lib/IAR/iar_cortexM0b_math.a | Bin 0 -> 3260800 bytes .../CMSIS/DSP/Lib/IAR/iar_cortexM0l_math.a | Bin 0 -> 3255522 bytes .../cmsisdsp_pkg/src/cmsismodule.c | 408 + .../cmsisdsp_pkg/src/cmsismodule.h | 15360 +++++ .../PythonWrapper/cmsisdsp_pkg/src/fftinit.c | 262 + .../BasicMathFunctions/BasicMathFunctions.c | 63 + .../Source/BasicMathFunctions/CMakeLists.txt | 16 + .../Source/BasicMathFunctions/arm_abs_f32.c | 146 + .../Source/BasicMathFunctions/arm_abs_q15.c | 132 + .../Source/BasicMathFunctions/arm_abs_q31.c | 132 + .../Source/BasicMathFunctions/arm_abs_q7.c | 134 + .../Source/BasicMathFunctions/arm_add_f32.c | 145 + .../Source/BasicMathFunctions/arm_add_q15.c | 126 + .../Source/BasicMathFunctions/arm_add_q31.c | 108 + .../Source/BasicMathFunctions/arm_add_q7.c | 109 + .../BasicMathFunctions/arm_dot_prod_f32.c | 163 + .../BasicMathFunctions/arm_dot_prod_q15.c | 120 + .../BasicMathFunctions/arm_dot_prod_q31.c | 115 + .../BasicMathFunctions/arm_dot_prod_q7.c | 139 + .../Source/BasicMathFunctions/arm_mult_f32.c | 148 + .../Source/BasicMathFunctions/arm_mult_q15.c | 143 + .../Source/BasicMathFunctions/arm_mult_q31.c | 119 + .../Source/BasicMathFunctions/arm_mult_q7.c | 119 + .../BasicMathFunctions/arm_negate_f32.c | 145 + .../BasicMathFunctions/arm_negate_q15.c | 126 + .../BasicMathFunctions/arm_negate_q31.c | 132 + .../Source/BasicMathFunctions/arm_negate_q7.c | 126 + .../BasicMathFunctions/arm_offset_f32.c | 147 + .../BasicMathFunctions/arm_offset_q15.c | 121 + .../BasicMathFunctions/arm_offset_q31.c | 128 + .../Source/BasicMathFunctions/arm_offset_q7.c | 116 + .../Source/BasicMathFunctions/arm_scale_f32.c | 159 + .../Source/BasicMathFunctions/arm_scale_q15.c | 144 + .../Source/BasicMathFunctions/arm_scale_q31.c | 191 + .../Source/BasicMathFunctions/arm_scale_q7.c | 129 + .../Source/BasicMathFunctions/arm_shift_q15.c | 201 + .../Source/BasicMathFunctions/arm_shift_q31.c | 181 + .../Source/BasicMathFunctions/arm_shift_q7.c | 175 + .../Source/BasicMathFunctions/arm_sub_f32.c | 148 + .../Source/BasicMathFunctions/arm_sub_q15.c | 126 + .../Source/BasicMathFunctions/arm_sub_q31.c | 108 + .../Source/BasicMathFunctions/arm_sub_q7.c | 109 + Drivers/CMSIS/DSP/Source/CMakeLists.txt | 223 + .../DSP/Source/CommonTables/CMakeLists.txt | 31 + .../DSP/Source/CommonTables/CommonTables.c | 31 + .../Source/CommonTables/arm_common_tables.c | 57215 ++++++++++++++++ .../Source/CommonTables/arm_const_structs.c | 486 + .../ComplexMathFunctions/CMakeLists.txt | 16 + .../ComplexMathFunctions.c | 46 + .../ComplexMathFunctions/arm_cmplx_conj_f32.c | 161 + .../ComplexMathFunctions/arm_cmplx_conj_q15.c | 157 + .../ComplexMathFunctions/arm_cmplx_conj_q31.c | 137 + .../arm_cmplx_dot_prod_f32.c | 233 + .../arm_cmplx_dot_prod_q15.c | 154 + .../arm_cmplx_dot_prod_q31.c | 153 + .../ComplexMathFunctions/arm_cmplx_mag_f32.c | 188 + .../ComplexMathFunctions/arm_cmplx_mag_q15.c | 162 + .../ComplexMathFunctions/arm_cmplx_mag_q31.c | 130 + .../arm_cmplx_mag_squared_f32.c | 184 + .../arm_cmplx_mag_squared_q15.c | 161 + .../arm_cmplx_mag_squared_q31.c | 129 + .../arm_cmplx_mult_cmplx_f32.c | 194 + .../arm_cmplx_mult_cmplx_q15.c | 136 + .../arm_cmplx_mult_cmplx_q31.c | 137 + .../arm_cmplx_mult_real_f32.c | 169 + .../arm_cmplx_mult_real_q15.c | 182 + .../arm_cmplx_mult_real_q31.c | 148 + .../Source/ControllerFunctions/CMakeLists.txt | 37 + .../ControllerFunctions/ControllerFunctions.c | 37 + .../ControllerFunctions/arm_pid_init_f32.c | 75 + .../ControllerFunctions/arm_pid_init_q15.c | 95 + .../ControllerFunctions/arm_pid_init_q31.c | 92 + .../ControllerFunctions/arm_pid_reset_f32.c | 54 + .../ControllerFunctions/arm_pid_reset_q15.c | 54 + .../ControllerFunctions/arm_pid_reset_q31.c | 54 + .../ControllerFunctions/arm_sin_cos_f32.c | 146 + .../ControllerFunctions/arm_sin_cos_q31.c | 110 + .../Source/FastMathFunctions/CMakeLists.txt | 51 + .../FastMathFunctions/FastMathFunctions.c | 37 + .../Source/FastMathFunctions/arm_cos_f32.c | 122 + .../Source/FastMathFunctions/arm_cos_q15.c | 84 + .../Source/FastMathFunctions/arm_cos_q31.c | 84 + .../Source/FastMathFunctions/arm_sin_f32.c | 122 + .../Source/FastMathFunctions/arm_sin_q15.c | 77 + .../Source/FastMathFunctions/arm_sin_q31.c | 77 + .../Source/FastMathFunctions/arm_sqrt_q15.c | 144 + .../Source/FastMathFunctions/arm_sqrt_q31.c | 144 + .../Source/FilteringFunctions/CMakeLists.txt | 128 + .../FilteringFunctions/FilteringFunctions.c | 127 + .../arm_biquad_cascade_df1_32x64_init_q31.c | 94 + .../arm_biquad_cascade_df1_32x64_q31.c | 458 + .../arm_biquad_cascade_df1_f32.c | 495 + .../arm_biquad_cascade_df1_fast_q15.c | 250 + .../arm_biquad_cascade_df1_fast_q31.c | 296 + .../arm_biquad_cascade_df1_init_f32.c | 91 + .../arm_biquad_cascade_df1_init_q15.c | 96 + .../arm_biquad_cascade_df1_init_q31.c | 95 + .../arm_biquad_cascade_df1_q15.c | 363 + .../arm_biquad_cascade_df1_q31.c | 247 + .../arm_biquad_cascade_df2T_f32.c | 523 + .../arm_biquad_cascade_df2T_f64.c | 443 + .../arm_biquad_cascade_df2T_init_f32.c | 211 + .../arm_biquad_cascade_df2T_init_f64.c | 86 + .../arm_biquad_cascade_stereo_df2T_f32.c | 285 + .../arm_biquad_cascade_stereo_df2T_init_f32.c | 86 + .../Source/FilteringFunctions/arm_conv_f32.c | 816 + .../arm_conv_fast_opt_q15.c | 366 + .../FilteringFunctions/arm_conv_fast_q15.c | 663 + .../FilteringFunctions/arm_conv_fast_q31.c | 558 + .../FilteringFunctions/arm_conv_opt_q15.c | 362 + .../FilteringFunctions/arm_conv_opt_q7.c | 360 + .../FilteringFunctions/arm_conv_partial_f32.c | 676 + .../arm_conv_partial_fast_opt_q15.c | 387 + .../arm_conv_partial_fast_q15.c | 700 + .../arm_conv_partial_fast_q31.c | 618 + .../arm_conv_partial_opt_q15.c | 386 + .../arm_conv_partial_opt_q7.c | 390 + .../FilteringFunctions/arm_conv_partial_q15.c | 752 + .../FilteringFunctions/arm_conv_partial_q31.c | 634 + .../FilteringFunctions/arm_conv_partial_q7.c | 753 + .../Source/FilteringFunctions/arm_conv_q15.c | 696 + .../Source/FilteringFunctions/arm_conv_q31.c | 581 + .../Source/FilteringFunctions/arm_conv_q7.c | 700 + .../FilteringFunctions/arm_correlate_f32.c | 893 + .../arm_correlate_fast_opt_q15.c | 345 + .../arm_correlate_fast_q15.c | 614 + .../arm_correlate_fast_q31.c | 601 + .../arm_correlate_opt_q15.c | 341 + .../FilteringFunctions/arm_correlate_opt_q7.c | 388 + .../FilteringFunctions/arm_correlate_q15.c | 696 + .../FilteringFunctions/arm_correlate_q31.c | 682 + .../FilteringFunctions/arm_correlate_q7.c | 800 + .../FilteringFunctions/arm_fir_decimate_f32.c | 703 + .../arm_fir_decimate_fast_q15.c | 595 + .../arm_fir_decimate_fast_q31.c | 390 + .../arm_fir_decimate_init_f32.c | 105 + .../arm_fir_decimate_init_q15.c | 106 + .../arm_fir_decimate_init_q31.c | 105 + .../FilteringFunctions/arm_fir_decimate_q15.c | 595 + .../FilteringFunctions/arm_fir_decimate_q31.c | 387 + .../Source/FilteringFunctions/arm_fir_f32.c | 715 + .../FilteringFunctions/arm_fir_fast_q15.c | 332 + .../FilteringFunctions/arm_fir_fast_q31.c | 324 + .../FilteringFunctions/arm_fir_init_f32.c | 81 + .../FilteringFunctions/arm_fir_init_q15.c | 137 + .../FilteringFunctions/arm_fir_init_q31.c | 80 + .../FilteringFunctions/arm_fir_init_q7.c | 81 + .../arm_fir_interpolate_f32.c | 914 + .../arm_fir_interpolate_init_f32.c | 106 + .../arm_fir_interpolate_init_q15.c | 106 + .../arm_fir_interpolate_init_q31.c | 105 + .../arm_fir_interpolate_q15.c | 479 + .../arm_fir_interpolate_q31.c | 481 + .../FilteringFunctions/arm_fir_lattice_f32.c | 453 + .../arm_fir_lattice_init_f32.c | 70 + .../arm_fir_lattice_init_q15.c | 70 + .../arm_fir_lattice_init_q31.c | 70 + .../FilteringFunctions/arm_fir_lattice_q15.c | 506 + .../FilteringFunctions/arm_fir_lattice_q31.c | 505 + .../Source/FilteringFunctions/arm_fir_q15.c | 332 + .../Source/FilteringFunctions/arm_fir_q31.c | 288 + .../Source/FilteringFunctions/arm_fir_q7.c | 323 + .../FilteringFunctions/arm_fir_sparse_f32.c | 341 + .../arm_fir_sparse_init_f32.c | 93 + .../arm_fir_sparse_init_q15.c | 93 + .../arm_fir_sparse_init_q31.c | 92 + .../arm_fir_sparse_init_q7.c | 93 + .../FilteringFunctions/arm_fir_sparse_q15.c | 341 + .../FilteringFunctions/arm_fir_sparse_q31.c | 357 + .../FilteringFunctions/arm_fir_sparse_q7.c | 341 + .../FilteringFunctions/arm_iir_lattice_f32.c | 354 + .../arm_iir_lattice_init_f32.c | 77 + .../arm_iir_lattice_init_q15.c | 77 + .../arm_iir_lattice_init_q31.c | 77 + .../FilteringFunctions/arm_iir_lattice_q15.c | 396 + .../FilteringFunctions/arm_iir_lattice_q31.c | 356 + .../Source/FilteringFunctions/arm_lms_f32.c | 533 + .../FilteringFunctions/arm_lms_init_f32.c | 81 + .../FilteringFunctions/arm_lms_init_q15.c | 92 + .../FilteringFunctions/arm_lms_init_q31.c | 92 + .../FilteringFunctions/arm_lms_norm_f32.c | 564 + .../arm_lms_norm_init_f32.c | 92 + .../arm_lms_norm_init_q15.c | 98 + .../arm_lms_norm_init_q31.c | 97 + .../FilteringFunctions/arm_lms_norm_q15.c | 297 + .../FilteringFunctions/arm_lms_norm_q31.c | 311 + .../Source/FilteringFunctions/arm_lms_q15.c | 262 + .../Source/FilteringFunctions/arm_lms_q31.c | 283 + .../DSP/Source/MatrixFunctions/CMakeLists.txt | 16 + .../Source/MatrixFunctions/MatrixFunctions.c | 53 + .../Source/MatrixFunctions/arm_mat_add_f32.c | 232 + .../Source/MatrixFunctions/arm_mat_add_q15.c | 149 + .../Source/MatrixFunctions/arm_mat_add_q31.c | 139 + .../MatrixFunctions/arm_mat_cmplx_mult_f32.c | 631 + .../MatrixFunctions/arm_mat_cmplx_mult_q15.c | 340 + .../MatrixFunctions/arm_mat_cmplx_mult_q31.c | 283 + .../Source/MatrixFunctions/arm_mat_init_f32.c | 76 + .../Source/MatrixFunctions/arm_mat_init_q15.c | 67 + .../Source/MatrixFunctions/arm_mat_init_q31.c | 72 + .../MatrixFunctions/arm_mat_inverse_f32.c | 1127 + .../MatrixFunctions/arm_mat_inverse_f64.c | 673 + .../Source/MatrixFunctions/arm_mat_mult_f32.c | 534 + .../MatrixFunctions/arm_mat_mult_fast_q15.c | 483 + .../MatrixFunctions/arm_mat_mult_fast_q31.c | 374 + .../Source/MatrixFunctions/arm_mat_mult_q15.c | 357 + .../Source/MatrixFunctions/arm_mat_mult_q31.c | 196 + .../MatrixFunctions/arm_mat_scale_f32.c | 221 + .../MatrixFunctions/arm_mat_scale_q15.c | 170 + .../MatrixFunctions/arm_mat_scale_q31.c | 164 + .../Source/MatrixFunctions/arm_mat_sub_f32.c | 226 + .../Source/MatrixFunctions/arm_mat_sub_q15.c | 144 + .../Source/MatrixFunctions/arm_mat_sub_q31.c | 139 + .../MatrixFunctions/arm_mat_trans_f32.c | 284 + .../MatrixFunctions/arm_mat_trans_q15.c | 182 + .../MatrixFunctions/arm_mat_trans_q31.c | 146 + .../Source/StatisticsFunctions/CMakeLists.txt | 16 + .../StatisticsFunctions/StatisticsFunctions.c | 53 + .../Source/StatisticsFunctions/arm_max_f32.c | 271 + .../Source/StatisticsFunctions/arm_max_q15.c | 148 + .../Source/StatisticsFunctions/arm_max_q31.c | 148 + .../Source/StatisticsFunctions/arm_max_q7.c | 148 + .../Source/StatisticsFunctions/arm_mean_f32.c | 166 + .../Source/StatisticsFunctions/arm_mean_q15.c | 114 + .../Source/StatisticsFunctions/arm_mean_q31.c | 110 + .../Source/StatisticsFunctions/arm_mean_q7.c | 112 + .../Source/StatisticsFunctions/arm_min_f32.c | 268 + .../Source/StatisticsFunctions/arm_min_q15.c | 149 + .../Source/StatisticsFunctions/arm_min_q31.c | 149 + .../Source/StatisticsFunctions/arm_min_q7.c | 149 + .../StatisticsFunctions/arm_power_f32.c | 175 + .../StatisticsFunctions/arm_power_q15.c | 132 + .../StatisticsFunctions/arm_power_q31.c | 121 + .../Source/StatisticsFunctions/arm_power_q7.c | 136 + .../Source/StatisticsFunctions/arm_rms_f32.c | 176 + .../Source/StatisticsFunctions/arm_rms_q15.c | 134 + .../Source/StatisticsFunctions/arm_rms_q31.c | 124 + .../Source/StatisticsFunctions/arm_std_f32.c | 188 + .../Source/StatisticsFunctions/arm_std_q15.c | 161 + .../Source/StatisticsFunctions/arm_std_q31.c | 147 + .../Source/StatisticsFunctions/arm_var_f32.c | 234 + .../Source/StatisticsFunctions/arm_var_q15.c | 164 + .../Source/StatisticsFunctions/arm_var_q31.c | 147 + .../Source/SupportFunctions/CMakeLists.txt | 16 + .../SupportFunctions/SupportFunctions.c | 48 + .../Source/SupportFunctions/arm_copy_f32.c | 152 + .../Source/SupportFunctions/arm_copy_q15.c | 96 + .../Source/SupportFunctions/arm_copy_q31.c | 98 + .../DSP/Source/SupportFunctions/arm_copy_q7.c | 95 + .../Source/SupportFunctions/arm_fill_f32.c | 151 + .../Source/SupportFunctions/arm_fill_q15.c | 100 + .../Source/SupportFunctions/arm_fill_q31.c | 98 + .../DSP/Source/SupportFunctions/arm_fill_q7.c | 99 + .../SupportFunctions/arm_float_to_q15.c | 244 + .../SupportFunctions/arm_float_to_q31.c | 252 + .../Source/SupportFunctions/arm_float_to_q7.c | 253 + .../SupportFunctions/arm_q15_to_float.c | 166 + .../Source/SupportFunctions/arm_q15_to_q31.c | 138 + .../Source/SupportFunctions/arm_q15_to_q7.c | 146 + .../SupportFunctions/arm_q31_to_float.c | 159 + .../Source/SupportFunctions/arm_q31_to_q15.c | 134 + .../Source/SupportFunctions/arm_q31_to_q7.c | 110 + .../Source/SupportFunctions/arm_q7_to_float.c | 179 + .../Source/SupportFunctions/arm_q7_to_q15.c | 143 + .../Source/SupportFunctions/arm_q7_to_q31.c | 121 + .../Source/TransformFunctions/CMakeLists.txt | 116 + .../TransformFunctions/TransformFunctions.c | 60 + .../TransformFunctions/arm_bitreversal.c | 229 + .../TransformFunctions/arm_bitreversal2.S | 216 + .../TransformFunctions/arm_bitreversal2.c | 99 + .../Source/TransformFunctions/arm_cfft_f32.c | 629 + .../Source/TransformFunctions/arm_cfft_q15.c | 332 + .../Source/TransformFunctions/arm_cfft_q31.c | 254 + .../TransformFunctions/arm_cfft_radix2_f32.c | 470 + .../arm_cfft_radix2_init_f32.c | 197 + .../arm_cfft_radix2_init_q15.c | 182 + .../arm_cfft_radix2_init_q31.c | 179 + .../TransformFunctions/arm_cfft_radix2_q15.c | 689 + .../TransformFunctions/arm_cfft_radix2_q31.c | 337 + .../TransformFunctions/arm_cfft_radix4_f32.c | 1200 + .../arm_cfft_radix4_init_f32.c | 156 + .../arm_cfft_radix4_init_q15.c | 145 + .../arm_cfft_radix4_init_q31.c | 141 + .../TransformFunctions/arm_cfft_radix4_q15.c | 1809 + .../TransformFunctions/arm_cfft_radix4_q31.c | 827 + .../TransformFunctions/arm_cfft_radix8_f32.c | 285 + .../Source/TransformFunctions/arm_dct4_f32.c | 448 + .../TransformFunctions/arm_dct4_init_f32.c | 131 + .../TransformFunctions/arm_dct4_init_q15.c | 130 + .../TransformFunctions/arm_dct4_init_q31.c | 130 + .../Source/TransformFunctions/arm_dct4_q15.c | 381 + .../Source/TransformFunctions/arm_dct4_q31.c | 383 + .../Source/TransformFunctions/arm_rfft_f32.c | 309 + .../TransformFunctions/arm_rfft_fast_f32.c | 320 + .../arm_rfft_fast_init_f32.c | 344 + .../TransformFunctions/arm_rfft_init_f32.c | 139 + .../TransformFunctions/arm_rfft_init_q15.c | 158 + .../TransformFunctions/arm_rfft_init_q31.c | 160 + .../Source/TransformFunctions/arm_rfft_q15.c | 380 + .../Source/TransformFunctions/arm_rfft_q31.c | 292 + .../Device/ST/STM32G0xx/Include/stm32g030xx.h | 7439 ++ .../Device/ST/STM32G0xx/Include/stm32g031xx.h | 7980 +++ .../Device/ST/STM32G0xx/Include/stm32g041xx.h | 8288 +++ .../Device/ST/STM32G0xx/Include/stm32g050xx.h | 7563 ++ .../Device/ST/STM32G0xx/Include/stm32g051xx.h | 8515 +++ .../Device/ST/STM32G0xx/Include/stm32g061xx.h | 8823 +++ .../Device/ST/STM32G0xx/Include/stm32g070xx.h | 7725 +++ .../Device/ST/STM32G0xx/Include/stm32g071xx.h | 9249 +++ .../Device/ST/STM32G0xx/Include/stm32g081xx.h | 9557 +++ .../Device/ST/STM32G0xx/Include/stm32g0b0xx.h | 9341 +++ .../Device/ST/STM32G0xx/Include/stm32g0b1xx.h | 11267 +++ .../Device/ST/STM32G0xx/Include/stm32g0c1xx.h | 11575 ++++ .../Device/ST/STM32G0xx/Include/stm32g0xx.h | 244 + .../ST/STM32G0xx/Include/system_stm32g0xx.h | 103 + Drivers/CMSIS/Device/ST/STM32G0xx/LICENSE.txt | 6 + .../Templates/arm/startup_stm32g030xx.s | 234 + .../Templates/arm/startup_stm32g031xx.s | 244 + .../Templates/arm/startup_stm32g041xx.s | 246 + .../Templates/arm/startup_stm32g050xx.s | 237 + .../Templates/arm/startup_stm32g051xx.s | 246 + .../Templates/arm/startup_stm32g061xx.s | 248 + .../Templates/arm/startup_stm32g070xx.s | 240 + .../Templates/arm/startup_stm32g071xx.s | 249 + .../Templates/arm/startup_stm32g081xx.s | 252 + .../Templates/arm/startup_stm32g0b0xx.s | 242 + .../Templates/arm/startup_stm32g0b1xx.s | 249 + .../Templates/arm/startup_stm32g0c1xx.s | 252 + .../Templates/gcc/startup_stm32g030xx.s | 270 + .../Templates/gcc/startup_stm32g031xx.s | 286 + .../Templates/gcc/startup_stm32g041xx.s | 290 + .../Templates/gcc/startup_stm32g050xx.s | 278 + .../Templates/gcc/startup_stm32g051xx.s | 288 + .../Templates/gcc/startup_stm32g061xx.s | 293 + .../Templates/gcc/startup_stm32g070xx.s | 282 + .../Templates/gcc/startup_stm32g071xx.s | 295 + .../Templates/gcc/startup_stm32g081xx.s | 299 + .../Templates/gcc/startup_stm32g0b0xx.s | 285 + .../Templates/gcc/startup_stm32g0b1xx.s | 295 + .../Templates/gcc/startup_stm32g0c1xx.s | 299 + .../iar/linker/stm32g030xx_flash.icf | 33 + .../Templates/iar/linker/stm32g030xx_sram.icf | 33 + .../iar/linker/stm32g031xx_flash.icf | 33 + .../Templates/iar/linker/stm32g031xx_sram.icf | 33 + .../iar/linker/stm32g041xx_flash.icf | 33 + .../Templates/iar/linker/stm32g041xx_sram.icf | 33 + .../iar/linker/stm32g050xx_flash.icf | 33 + .../Templates/iar/linker/stm32g050xx_sram.icf | 33 + .../iar/linker/stm32g051xx_flash.icf | 33 + .../Templates/iar/linker/stm32g051xx_sram.icf | 33 + .../iar/linker/stm32g061xx_flash.icf | 33 + .../Templates/iar/linker/stm32g061xx_sram.icf | 33 + .../iar/linker/stm32g070xx_flash.icf | 33 + .../Templates/iar/linker/stm32g070xx_sram.icf | 33 + .../iar/linker/stm32g071xx_flash.icf | 33 + .../Templates/iar/linker/stm32g071xx_sram.icf | 33 + .../iar/linker/stm32g081xx_flash.icf | 33 + .../Templates/iar/linker/stm32g081xx_sram.icf | 31 + .../iar/linker/stm32g0b0xx_flash.icf | 34 + .../Templates/iar/linker/stm32g0b0xx_sram.icf | 31 + .../iar/linker/stm32g0b1xx_flash.icf | 34 + .../Templates/iar/linker/stm32g0b1xx_sram.icf | 31 + .../iar/linker/stm32g0c1xx_flash.icf | 34 + .../Templates/iar/linker/stm32g0c1xx_sram.icf | 31 + .../Templates/iar/startup_stm32g030xx.s | 259 + .../Templates/iar/startup_stm32g031xx.s | 284 + .../Templates/iar/startup_stm32g041xx.s | 289 + .../Templates/iar/startup_stm32g050xx.s | 274 + .../Templates/iar/startup_stm32g051xx.s | 289 + .../Templates/iar/startup_stm32g061xx.s | 294 + .../Templates/iar/startup_stm32g070xx.s | 277 + .../Templates/iar/startup_stm32g071xx.s | 298 + .../Templates/iar/startup_stm32g081xx.s | 304 + .../Templates/iar/startup_stm32g0b0xx.s | 282 + .../Templates/iar/startup_stm32g0b1xx.s | 298 + .../Templates/iar/startup_stm32g0c1xx.s | 304 + .../Source/Templates/system_stm32g0xx.c | 302 + Drivers/CMSIS/Include/cmsis_armcc.h | 894 + Drivers/CMSIS/Include/cmsis_armclang.h | 1444 + Drivers/CMSIS/Include/cmsis_armclang_ltm.h | 1891 + Drivers/CMSIS/Include/cmsis_compiler.h | 283 + Drivers/CMSIS/Include/cmsis_gcc.h | 2168 + Drivers/CMSIS/Include/cmsis_iccarm.h | 964 + Drivers/CMSIS/Include/cmsis_version.h | 39 + Drivers/CMSIS/Include/core_armv81mml.h | 2968 + Drivers/CMSIS/Include/core_armv8mbl.h | 1921 + Drivers/CMSIS/Include/core_armv8mml.h | 2835 + Drivers/CMSIS/Include/core_cm0.h | 952 + Drivers/CMSIS/Include/core_cm0plus.h | 1085 + Drivers/CMSIS/Include/core_cm1.h | 979 + Drivers/CMSIS/Include/core_cm23.h | 1996 + Drivers/CMSIS/Include/core_cm3.h | 1937 + Drivers/CMSIS/Include/core_cm33.h | 2910 + Drivers/CMSIS/Include/core_cm35p.h | 2910 + Drivers/CMSIS/Include/core_cm4.h | 2124 + Drivers/CMSIS/Include/core_cm7.h | 2725 + Drivers/CMSIS/Include/core_sc000.h | 1025 + Drivers/CMSIS/Include/core_sc300.h | 1912 + Drivers/CMSIS/Include/mpu_armv7.h | 272 + Drivers/CMSIS/Include/mpu_armv8.h | 346 + Drivers/CMSIS/Include/tz_context.h | 70 + Drivers/CMSIS/LICENSE.txt | 201 + .../cifar10/RTE/Compiler/EventRecorderConf.h | 44 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 242 + .../cifar10/RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 262 + .../cifar10/RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 262 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.c | 295 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 262 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../cifar10/RTE/_ARMCM0/RTE_Components.h | 24 + .../cifar10/RTE/_ARMCM3/RTE_Components.h | 22 + .../cifar10/RTE/_ARMCM4_FP/RTE_Components.h | 22 + .../cifar10/RTE/_ARMCM7_SP/RTE_Components.h | 22 + .../cifar10/arm_nnexamples_cifar10.cpp | 196 + .../cifar10/arm_nnexamples_cifar10_inputs.h | 6 + .../arm_nnexamples_cifar10_parameter.h | 43 + .../cifar10/arm_nnexamples_cifar10_weights.h | 26 + .../ARM/arm_nn_examples/cifar10/readme.txt | 4 + .../gru/RTE/Compiler/EventRecorderConf.h | 44 + .../gru/RTE/Device/ARMCM0/startup_ARMCM0.s | 242 + .../gru/RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../gru/RTE/Device/ARMCM3/startup_ARMCM3.s | 262 + .../gru/RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../gru/RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 262 + .../gru/RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../gru/RTE/Device/ARMCM7_SP/startup_ARMCM7.c | 295 + .../gru/RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 262 + .../gru/RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../gru/RTE/_ARMCM0/RTE_Components.h | 24 + .../gru/RTE/_ARMCM3/RTE_Components.h | 22 + .../gru/RTE/_ARMCM4_FP/RTE_Components.h | 22 + .../gru/RTE/_ARMCM7_SP/RTE_Components.h | 22 + .../gru/arm_nnexamples_gru.cpp | 221 + .../gru/arm_nnexamples_gru_test_data.h | 23 + .../ARM/arm_nn_examples/gru/readme.txt | 4 + .../arm_nnexamples_cifar10.cpp | 196 + .../arm_nnexamples_cifar10_inputs.h | 6 + .../arm_nnexamples_cifar10_parameter.h | 43 + .../arm_nnexamples_cifar10_weights.h | 26 + .../NN-example-cifar10/readme_iar.txt | 7 + .../NN-example-gru/arm_nnexamples_gru.cpp | 221 + .../arm_nnexamples_gru_test_data.h | 23 + .../NN-example-gru/readme_iar.txt | 7 + Drivers/CMSIS/NN/Include/arm_nn_tables.h | 56 + Drivers/CMSIS/NN/Include/arm_nnfunctions.h | 1075 + .../CMSIS/NN/Include/arm_nnsupportfunctions.h | 269 + .../RTE/Device/ARMCM0/startup_ARMCM0.s | 242 + .../nn_test/RTE/Device/ARMCM0/system_ARMCM0.c | 56 + .../RTE/Device/ARMCM3/startup_ARMCM3.s | 262 + .../nn_test/RTE/Device/ARMCM3/system_ARMCM3.c | 68 + .../RTE/Device/ARMCM4/startup_ARMCM4.s | 262 + .../nn_test/RTE/Device/ARMCM4/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM4_FP/startup_ARMCM4.s | 262 + .../RTE/Device/ARMCM4_FP/system_ARMCM4.c | 83 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.c | 295 + .../RTE/Device/ARMCM7_SP/startup_ARMCM7.s | 262 + .../RTE/Device/ARMCM7_SP/system_ARMCM7.c | 85 + .../STM32F411RETx/startup_stm32f411xe.s | 395 + .../Device/STM32F411RETx/system_stm32f4xx.c | 763 + .../nn_test/RTE/_ARMCM0/RTE_Components.h | 20 + .../nn_test/RTE/_ARMCM3/RTE_Components.h | 26 + .../nn_test/RTE/_ARMCM4_FP/RTE_Components.h | 26 + .../nn_test/RTE/_ARMCM7_SP/RTE_Components.h | 26 + .../arm_convolve_HWC_q15_ref.c | 71 + .../arm_convolve_HWC_q15_ref_nonsquare.c | 83 + .../arm_convolve_HWC_q7_ref.c | 72 + .../arm_convolve_HWC_q7_ref_nonsquare.c | 78 + .../arm_depthwise_separable_conv_HWC_q7_ref.c | 70 + ...wise_separable_conv_HWC_q7_ref_nonsquare.c | 75 + ...m_fully_connected_mat_q7_vec_q15_opt_ref.c | 120 + .../arm_fully_connected_mat_q7_vec_q15_ref.c | 43 + .../arm_fully_connected_q15_opt_ref.c | 119 + .../arm_fully_connected_q15_ref.c | 43 + .../arm_fully_connected_q7_opt_ref.c | 138 + .../arm_fully_connected_q7_ref.c | 43 + .../Ref_Implementations/arm_nn_mult_ref.c | 58 + .../Ref_Implementations/arm_pool_ref.c | 96 + .../Ref_Implementations/arm_relu_ref.c | 42 + .../fully_connected_testing_weights.h | 7 + .../Ref_Implementations/ref_functions.h | 250 + .../nn_test/arm_nnexamples_nn_test.cpp | 801 + .../nn_test/arm_nnexamples_nn_test.h | 78 + .../CMSIS/NN/NN_Lib_Tests/nn_test/readme.txt | 4 + .../arm_nn_activations_q15.c | 101 + .../arm_nn_activations_q7.c | 91 + .../Source/ActivationFunctions/arm_relu_q15.c | 106 + .../Source/ActivationFunctions/arm_relu_q7.c | 110 + .../arm_convolve_1x1_HWC_q7_fast_nonsquare.c | 235 + .../arm_convolve_HWC_q15_basic.c | 207 + .../arm_convolve_HWC_q15_fast.c | 255 + .../arm_convolve_HWC_q15_fast_nonsquare.c | 265 + .../arm_convolve_HWC_q7_RGB.c | 279 + .../arm_convolve_HWC_q7_basic.c | 230 + .../arm_convolve_HWC_q7_basic_nonsquare.c | 228 + .../arm_convolve_HWC_q7_fast.c | 408 + .../arm_convolve_HWC_q7_fast_nonsquare.c | 379 + .../arm_depthwise_conv_u8_basic_ver1.c | 239 + .../arm_depthwise_separable_conv_HWC_q7.c | 418 + ...epthwise_separable_conv_HWC_q7_nonsquare.c | 411 + .../arm_nn_mat_mult_kernel_q7_q15.c | 187 + .../arm_nn_mat_mult_kernel_q7_q15_reordered.c | 138 + .../arm_fully_connected_mat_q7_vec_q15.c | 199 + .../arm_fully_connected_mat_q7_vec_q15_opt.c | 403 + .../arm_fully_connected_q15.c | 193 + .../arm_fully_connected_q15_opt.c | 332 + .../arm_fully_connected_q7.c | 198 + .../arm_fully_connected_q7_opt.c | 484 + .../NNSupportFunctions/arm_nn_mult_q15.c | 147 + .../NNSupportFunctions/arm_nn_mult_q7.c | 119 + .../Source/NNSupportFunctions/arm_nntables.c | 297 + .../arm_q7_to_q15_no_shift.c | 134 + .../arm_q7_to_q15_reordered_no_shift.c | 145 + .../Source/PoolingFunctions/arm_pool_q7_HWC.c | 460 + .../Source/SoftmaxFunctions/arm_softmax_q15.c | 120 + .../Source/SoftmaxFunctions/arm_softmax_q7.c | 121 + Drivers/CMSIS/RTOS/Template/cmsis_os.h | 698 + Drivers/CMSIS/RTOS2/Include/cmsis_os2.h | 756 + Drivers/CMSIS/RTOS2/Include/os_tick.h | 71 + Drivers/CMSIS/RTOS2/Source/os_systick.c | 132 + Drivers/CMSIS/RTOS2/Source/os_tick_gtim.c | 187 + Drivers/CMSIS/RTOS2/Source/os_tick_ptim.c | 165 + Drivers/CMSIS/RTOS2/Template/cmsis_os.h | 922 + Drivers/CMSIS/RTOS2/Template/cmsis_os1.c | 361 + Drivers/CMSIS/docs/General/html/LICENSE.txt | 201 + .../Inc/Legacy/stm32_hal_legacy.h | 4014 ++ .../Inc/stm32_assert_template.h | 56 + .../STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal.h | 838 + .../Inc/stm32g0xx_hal_adc.h | 1943 + .../Inc/stm32g0xx_hal_adc_ex.h | 186 + .../Inc/stm32g0xx_hal_cec.h | 804 + .../Inc/stm32g0xx_hal_comp.h | 883 + .../Inc/stm32g0xx_hal_conf_template.h | 355 + .../Inc/stm32g0xx_hal_cortex.h | 385 + .../Inc/stm32g0xx_hal_crc.h | 342 + .../Inc/stm32g0xx_hal_crc_ex.h | 150 + .../Inc/stm32g0xx_hal_cryp.h | 645 + .../Inc/stm32g0xx_hal_cryp_ex.h | 130 + .../Inc/stm32g0xx_hal_dac.h | 538 + .../Inc/stm32g0xx_hal_dac_ex.h | 230 + .../Inc/stm32g0xx_hal_def.h | 213 + .../Inc/stm32g0xx_hal_dma.h | 803 + .../Inc/stm32g0xx_hal_dma_ex.h | 278 + .../Inc/stm32g0xx_hal_exti.h | 387 + .../Inc/stm32g0xx_hal_fdcan.h | 1436 + .../Inc/stm32g0xx_hal_flash.h | 1033 + .../Inc/stm32g0xx_hal_flash_ex.h | 116 + .../Inc/stm32g0xx_hal_gpio.h | 362 + .../Inc/stm32g0xx_hal_gpio_ex.h | 836 + .../Inc/stm32g0xx_hal_hcd.h | 563 + .../Inc/stm32g0xx_hal_i2c.h | 839 + .../Inc/stm32g0xx_hal_i2c_ex.h | 177 + .../Inc/stm32g0xx_hal_i2s.h | 554 + .../Inc/stm32g0xx_hal_irda.h | 891 + .../Inc/stm32g0xx_hal_irda_ex.h | 296 + .../Inc/stm32g0xx_hal_iwdg.h | 237 + .../Inc/stm32g0xx_hal_lptim.h | 856 + .../Inc/stm32g0xx_hal_pcd.h | 624 + .../Inc/stm32g0xx_hal_pcd_ex.h | 88 + .../Inc/stm32g0xx_hal_pwr.h | 325 + .../Inc/stm32g0xx_hal_pwr_ex.h | 640 + .../Inc/stm32g0xx_hal_rcc.h | 3135 + .../Inc/stm32g0xx_hal_rcc_ex.h | 1590 + .../Inc/stm32g0xx_hal_rng.h | 379 + .../Inc/stm32g0xx_hal_rtc.h | 981 + .../Inc/stm32g0xx_hal_rtc_ex.h | 1156 + .../Inc/stm32g0xx_hal_smartcard.h | 1136 + .../Inc/stm32g0xx_hal_smartcard_ex.h | 492 + .../Inc/stm32g0xx_hal_smbus.h | 791 + .../Inc/stm32g0xx_hal_smbus_ex.h | 154 + .../Inc/stm32g0xx_hal_spi.h | 851 + .../Inc/stm32g0xx_hal_spi_ex.h | 73 + .../Inc/stm32g0xx_hal_tim.h | 2465 + .../Inc/stm32g0xx_hal_tim_ex.h | 494 + .../Inc/stm32g0xx_hal_uart.h | 1745 + .../Inc/stm32g0xx_hal_uart_ex.h | 771 + .../Inc/stm32g0xx_hal_usart.h | 908 + .../Inc/stm32g0xx_hal_usart_ex.h | 462 + .../Inc/stm32g0xx_hal_wwdg.h | 306 + .../Inc/stm32g0xx_ll_adc.h | 5419 ++ .../Inc/stm32g0xx_ll_bus.h | 1306 + .../Inc/stm32g0xx_ll_comp.h | 968 + .../Inc/stm32g0xx_ll_cortex.h | 585 + .../Inc/stm32g0xx_ll_crc.h | 461 + .../Inc/stm32g0xx_ll_crs.h | 780 + .../Inc/stm32g0xx_ll_dac.h | 1801 + .../Inc/stm32g0xx_ll_dma.h | 2270 + .../Inc/stm32g0xx_ll_dmamux.h | 1838 + .../Inc/stm32g0xx_ll_exti.h | 1557 + .../Inc/stm32g0xx_ll_gpio.h | 958 + .../Inc/stm32g0xx_ll_i2c.h | 2272 + .../Inc/stm32g0xx_ll_iwdg.h | 338 + .../Inc/stm32g0xx_ll_lptim.h | 1470 + .../Inc/stm32g0xx_ll_lpuart.h | 2651 + .../Inc/stm32g0xx_ll_pwr.h | 1526 + .../Inc/stm32g0xx_ll_rcc.h | 3973 ++ .../Inc/stm32g0xx_ll_rng.h | 399 + .../Inc/stm32g0xx_ll_rtc.h | 4215 ++ .../Inc/stm32g0xx_ll_spi.h | 2284 + .../Inc/stm32g0xx_ll_system.h | 2085 + .../Inc/stm32g0xx_ll_tim.h | 5275 ++ .../Inc/stm32g0xx_ll_ucpd.h | 1863 + .../Inc/stm32g0xx_ll_usart.h | 4401 ++ .../Inc/stm32g0xx_ll_usb.h | 887 + .../Inc/stm32g0xx_ll_utils.h | 343 + .../Inc/stm32g0xx_ll_wwdg.h | 328 + Drivers/STM32G0xx_HAL_Driver/LICENSE.txt | 6 + .../STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c | 759 + .../Src/stm32g0xx_hal_adc.c | 2978 + .../Src/stm32g0xx_hal_adc_ex.c | 384 + .../Src/stm32g0xx_hal_cec.c | 997 + .../Src/stm32g0xx_hal_comp.c | 1151 + .../Src/stm32g0xx_hal_cortex.c | 418 + .../Src/stm32g0xx_hal_crc.c | 516 + .../Src/stm32g0xx_hal_crc_ex.c | 223 + .../Src/stm32g0xx_hal_cryp.c | 5592 ++ .../Src/stm32g0xx_hal_cryp_ex.c | 386 + .../Src/stm32g0xx_hal_dac.c | 1515 + .../Src/stm32g0xx_hal_dac_ex.c | 692 + .../Src/stm32g0xx_hal_dma.c | 1193 + .../Src/stm32g0xx_hal_dma_ex.c | 320 + .../Src/stm32g0xx_hal_exti.c | 670 + .../Src/stm32g0xx_hal_fdcan.c | 3514 + .../Src/stm32g0xx_hal_flash.c | 720 + .../Src/stm32g0xx_hal_flash_ex.c | 1307 + .../Src/stm32g0xx_hal_gpio.c | 550 + .../Src/stm32g0xx_hal_hcd.c | 2840 + .../Src/stm32g0xx_hal_i2c.c | 7159 ++ .../Src/stm32g0xx_hal_i2c_ex.c | 364 + .../Src/stm32g0xx_hal_i2s.c | 1871 + .../Src/stm32g0xx_hal_irda.c | 3011 + .../Src/stm32g0xx_hal_iwdg.c | 282 + .../Src/stm32g0xx_hal_lptim.c | 2526 + .../Src/stm32g0xx_hal_msp_template.c | 100 + .../Src/stm32g0xx_hal_pcd.c | 2263 + .../Src/stm32g0xx_hal_pcd_ex.c | 333 + .../Src/stm32g0xx_hal_pwr.c | 542 + .../Src/stm32g0xx_hal_pwr_ex.c | 1016 + .../Src/stm32g0xx_hal_rcc.c | 1457 + .../Src/stm32g0xx_hal_rcc_ex.c | 1678 + .../Src/stm32g0xx_hal_rng.c | 839 + .../Src/stm32g0xx_hal_rtc.c | 1922 + .../Src/stm32g0xx_hal_rtc_ex.c | 1982 + .../Src/stm32g0xx_hal_smartcard.c | 3182 + .../Src/stm32g0xx_hal_smartcard_ex.c | 495 + .../Src/stm32g0xx_hal_smbus.c | 2775 + .../Src/stm32g0xx_hal_smbus_ex.c | 250 + .../Src/stm32g0xx_hal_spi.c | 4382 ++ .../Src/stm32g0xx_hal_spi_ex.c | 112 + .../Src/stm32g0xx_hal_tim.c | 7925 +++ .../Src/stm32g0xx_hal_tim_ex.c | 2893 + ...tm32g0xx_hal_timebase_rtc_alarm_template.c | 349 + ...m32g0xx_hal_timebase_rtc_wakeup_template.c | 303 + .../Src/stm32g0xx_hal_timebase_tim_template.c | 211 + .../Src/stm32g0xx_hal_uart.c | 4700 ++ .../Src/stm32g0xx_hal_uart_ex.c | 1092 + .../Src/stm32g0xx_hal_usart.c | 3849 ++ .../Src/stm32g0xx_hal_usart_ex.c | 541 + .../Src/stm32g0xx_hal_wwdg.c | 420 + .../Src/stm32g0xx_ll_adc.c | 787 + .../Src/stm32g0xx_ll_comp.c | 252 + .../Src/stm32g0xx_ll_crc.c | 103 + .../Src/stm32g0xx_ll_crs.c | 83 + .../Src/stm32g0xx_ll_dac.c | 293 + .../Src/stm32g0xx_ll_dma.c | 367 + .../Src/stm32g0xx_ll_exti.c | 293 + .../Src/stm32g0xx_ll_gpio.c | 278 + .../Src/stm32g0xx_ll_i2c.c | 234 + .../Src/stm32g0xx_ll_lptim.c | 318 + .../Src/stm32g0xx_ll_lpuart.c | 311 + .../Src/stm32g0xx_ll_pwr.c | 82 + .../Src/stm32g0xx_ll_rcc.c | 1380 + .../Src/stm32g0xx_ll_rng.c | 145 + .../Src/stm32g0xx_ll_rtc.c | 861 + .../Src/stm32g0xx_ll_spi.c | 547 + .../Src/stm32g0xx_ll_tim.c | 1369 + .../Src/stm32g0xx_ll_ucpd.c | 186 + .../Src/stm32g0xx_ll_usart.c | 468 + .../Src/stm32g0xx_ll_usb.c | 1398 + .../Src/stm32g0xx_ll_utils.c | 574 + Makefile | 217 + Makefile.bak | 209 + STM32G030C8Tx_FLASH.ld | 189 + cmd.jexe | 9 + flash.sh | 3 + openocd.cfg | 5 + openocd.gdb | 40 + radio-gnumake_test.ioc | 240 + startup_stm32g030xx.s | 270 + tools/img/image-to-mem.py | 33 + 1163 files changed, 636480 insertions(+) create mode 100644 .gitignore create mode 100644 .mxproject create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 Core/APP/app.c create mode 100644 Core/APP/app.h create mode 100644 Core/Inc/gpio.h create mode 100644 Core/Inc/main.h create mode 100644 Core/Inc/spi.h create mode 100644 Core/Inc/stm32g0xx_hal_conf.h create mode 100644 Core/Inc/stm32g0xx_it.h create mode 100644 Core/Inc/tim.h create mode 100644 Core/Inc/usart.h create mode 100644 Core/RotaryCoder/RotaryCoder.c create mode 100644 Core/RotaryCoder/RotaryCoder.h create mode 100644 Core/ST7735/Images/digi18x32.h create mode 100644 Core/ST7735/UI/monoimg.c create mode 100644 Core/ST7735/UI/monoimg.h create mode 100644 Core/ST7735/UI/ui.c create mode 100644 Core/ST7735/UI/ui.h create mode 100644 Core/ST7735/st7735.c create mode 100644 Core/ST7735/st7735.h create mode 100644 Core/SWI2C/i2c_sw.c create mode 100644 Core/SWI2C/i2c_sw.h create mode 100644 Core/SWI2C/readme.md create mode 100644 Core/Src/gpio.c create mode 100644 Core/Src/main.c create mode 100644 Core/Src/spi.c create mode 100644 Core/Src/stm32g0xx_hal_msp.c create mode 100644 Core/Src/stm32g0xx_it.c create mode 100644 Core/Src/system_stm32g0xx.c create mode 100644 Core/Src/tim.c create mode 100644 Core/Src/usart.c create mode 100644 Core/kt0915/KT0915.C create mode 100644 Core/kt0915/KT0915.h create mode 100644 Drivers/CMSIS/Core/Include/cmsis_armcc.h create mode 100644 Drivers/CMSIS/Core/Include/cmsis_armclang.h create mode 100644 Drivers/CMSIS/Core/Include/cmsis_armclang_ltm.h create mode 100644 Drivers/CMSIS/Core/Include/cmsis_compiler.h create mode 100644 Drivers/CMSIS/Core/Include/cmsis_gcc.h create mode 100644 Drivers/CMSIS/Core/Include/cmsis_iccarm.h create mode 100644 Drivers/CMSIS/Core/Include/cmsis_version.h create mode 100644 Drivers/CMSIS/Core/Include/core_armv81mml.h create mode 100644 Drivers/CMSIS/Core/Include/core_armv8mbl.h create mode 100644 Drivers/CMSIS/Core/Include/core_armv8mml.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm0.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm0plus.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm1.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm23.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm3.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm33.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm35p.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm4.h create mode 100644 Drivers/CMSIS/Core/Include/core_cm7.h create mode 100644 Drivers/CMSIS/Core/Include/core_sc000.h create mode 100644 Drivers/CMSIS/Core/Include/core_sc300.h create mode 100644 Drivers/CMSIS/Core/Include/mpu_armv7.h create mode 100644 Drivers/CMSIS/Core/Include/mpu_armv8.h create mode 100644 Drivers/CMSIS/Core/Include/tz_context.h create mode 100644 Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c create mode 100644 Drivers/CMSIS/Core/Template/ARMv8-M/tz_context.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/arr_desc/arr_desc.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_cycle.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_define.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group_call.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group_define.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_pf.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_systick.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_call.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_define.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_ret.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_util.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/opt_arg.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/pp_narg.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/splice.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/util/util.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_cycle.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_dump_str_segments.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_fw.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_trigger_action.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/all_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/fast_math_tests/fast_math_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/fast_math_tests/fast_math_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/fast_math_tests/fast_math_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/filtering_tests/filtering_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/filtering_tests/filtering_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/filtering_tests/filtering_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/filtering_tests/filtering_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/intrinsics_tests/intrinsics_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/intrinsics_tests/intrinsics_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/intrinsics_tests/intrinsics_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/math_helper.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/templates/template.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/templates/test_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_templates.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_test_data.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_test_group.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_tests.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/type_abbrev.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/Retarget.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/startup_armv6-m.s create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/startup_armv7-m.s create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/startup_armv6-m.S create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/startup_armv7-m.S create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/Retarget.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/startup_armv6-m.S create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/startup_armv7-m.S create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/startup_generic.S create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM23.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM33.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMSC000.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMSC300.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMv8MBL.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMv8MML.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_generic.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/all_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/abs_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/add_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/basic_math_test_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/basic_math_test_group.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/dot_prod_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/mult_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/negate_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/offset_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/scale_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/shift_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/sub_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_conj_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_dot_prod_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mag_squared_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mag_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mult_cmplx_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mult_real_test.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/complex_math_test_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/complex_math_test_group.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/controller_test_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/controller_test_group.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/pid_reset_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/pid_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/sin_cos_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/fast_math_tests/fast_math_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/fast_math_tests/fast_math_tests_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/biquad_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/conv_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/correlate_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/filtering_test_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/filtering_test_group.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/fir_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/iir_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/lms_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/intrinsics_tests/intrinsics_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/intrinsics_tests/intrinsics_tests_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/main.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/math_helper.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_add_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_cmplx_mult_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_init_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_inverse_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_mult_fast_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_mult_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_scale_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_sub_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_trans_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/matrix_test_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/matrix_test_group.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/max_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/mean_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/min_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/power_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/rms_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/statistics_test_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/statistics_test_group.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/std_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/var_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/copy_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/fill_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/support_test_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/support_test_group.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/x_to_y_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/cfft_family_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/cfft_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/rfft_fast_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/rfft_tests.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/transform_test_group.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/transform_tests_common_data.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MBLl_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLl_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLld_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLldfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLlfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM0l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM3l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM4l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM4lf_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7lfdp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7lfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/handlers.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/mem_ARMCA5.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/mmu_ARMCA5.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/startup_ARMCA5.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/system_ARMCA5.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/system_ARMCA5.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/RTE_Components.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/main.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_MPS2/HowTo.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MBLl_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLl_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLld_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLldfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLlfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM0l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM3l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM4l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM4lf_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7lfdp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7lfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MBLl_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLl_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLld_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLldfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLlfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM0l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM3l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM4l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM4lf_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7l_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7lfdp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7lfsp_config.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo_SV.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/inc/ref.h create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/BasicMathFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/abs.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/add.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/dot_prod.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/mult.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/negate.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/offset.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/scale.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/shift.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/sub.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/ComplexMathFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_conj.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_dot_prod.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mag.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mag_squared.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mult_cmplx.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mult_real.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/ControllerFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/pid.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/sin_cos.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/FastMathFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/cos.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/sin.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/sqrt.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/FilteringFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/biquad.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/conv.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/correlate.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_decimate.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_interpolate.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_lattice.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_sparse.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/iir_lattice.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/lms.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/HelperFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/mat_helper.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/ref_helper.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/Intrinsics/Intrinsics_.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/Intrinsics/intrinsics.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/MatrixFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_add.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_cmplx_mult.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_inverse.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_mult.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_scale.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_sub.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_trans.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/StatisticsFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/max.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/mean.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/min.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/power.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/rms.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/std.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/var.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/SupportFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/copy.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/fill.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/fixed_to_fixed.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/fixed_to_float.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/float_to_fixed.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/TransformFunctions.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/cfft.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/dct4.c create mode 100644 Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/rfft.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/arm_class_marks_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/arm_convolution_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/math_helper.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/math_helper.h create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/arm_dotproduct_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/arm_fft_bin_data.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/arm_fft_bin_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/arm_fir_data.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/arm_fir_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/math_helper.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/math_helper.h create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/arm_graphic_equalizer_data.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/arm_graphic_equalizer_example_q31.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/math_helper.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/math_helper.h create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_data.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/math_helper.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/math_helper.h create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/arm_matrix_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/math_helper.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/math_helper.h create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/arm_signal_converge_data.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/arm_signal_converge_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/math_helper.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/math_helper.h create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/arm_sin_cos_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/Abstract.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/arm_variance_example_f32.c create mode 100644 Drivers/CMSIS/DSP/Examples/ARM/boot/RTE_Components.h create mode 100644 Drivers/CMSIS/DSP/Include/arm_common_tables.h create mode 100644 Drivers/CMSIS/DSP/Include/arm_const_structs.h create mode 100644 Drivers/CMSIS/DSP/Include/arm_math.h create mode 100644 Drivers/CMSIS/DSP/Lib/ARM/arm_cortexM0b_math.lib create mode 100644 Drivers/CMSIS/DSP/Lib/ARM/arm_cortexM0l_math.lib create mode 100644 Drivers/CMSIS/DSP/Lib/GCC/libarm_cortexM0l_math.a create mode 100644 Drivers/CMSIS/DSP/Lib/IAR/iar_cortexM0b_math.a create mode 100644 Drivers/CMSIS/DSP/Lib/IAR/iar_cortexM0l_math.a create mode 100644 Drivers/CMSIS/DSP/PythonWrapper/cmsisdsp_pkg/src/cmsismodule.c create mode 100644 Drivers/CMSIS/DSP/PythonWrapper/cmsisdsp_pkg/src/cmsismodule.h create mode 100644 Drivers/CMSIS/DSP/PythonWrapper/cmsisdsp_pkg/src/fftinit.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_add_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/CommonTables/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/CommonTables/CommonTables.c create mode 100644 Drivers/CMSIS/DSP/Source/CommonTables/arm_common_tables.c create mode 100644 Drivers/CMSIS/DSP/Source/CommonTables/arm_const_structs.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/ComplexMathFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/ControllerFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/FastMathFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/arm_cos_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/arm_sin_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/FilteringFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_opt_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/MatrixFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f64.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/StatisticsFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_max_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_min_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_power_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_std_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_var_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/SupportFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_copy_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_copy_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_copy_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_copy_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_fill_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_fill_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_fill_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_fill_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_float.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_float.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q7.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_float.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/CMakeLists.txt create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/TransformFunctions.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.S create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix8_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_dct4_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_rfft_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_f32.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q31.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q15.c create mode 100644 Drivers/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q31.c create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g030xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g031xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g041xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g050xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g051xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g061xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g070xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g071xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g081xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g0b0xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g0b1xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g0c1xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g0xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Include/system_stm32g0xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/LICENSE.txt create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g030xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g031xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g041xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g050xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g051xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g061xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g070xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g071xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g081xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g0b0xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g0b1xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g0c1xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g030xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g031xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g041xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g050xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g051xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g061xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g070xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g071xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g081xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g0b0xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g0b1xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g0c1xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g030xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g030xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g031xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g031xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g041xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g041xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g050xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g050xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g051xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g051xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g061xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g061xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g070xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g070xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g071xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g071xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g081xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g081xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g0b0xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g0b0xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g0b1xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g0b1xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g0c1xx_flash.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/linker/stm32g0c1xx_sram.icf create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g030xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g031xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g041xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g050xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g051xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g061xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g070xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g071xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g081xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g0b0xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g0b1xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g0c1xx.s create mode 100644 Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/system_stm32g0xx.c create mode 100644 Drivers/CMSIS/Include/cmsis_armcc.h create mode 100644 Drivers/CMSIS/Include/cmsis_armclang.h create mode 100644 Drivers/CMSIS/Include/cmsis_armclang_ltm.h create mode 100644 Drivers/CMSIS/Include/cmsis_compiler.h create mode 100644 Drivers/CMSIS/Include/cmsis_gcc.h create mode 100644 Drivers/CMSIS/Include/cmsis_iccarm.h create mode 100644 Drivers/CMSIS/Include/cmsis_version.h create mode 100644 Drivers/CMSIS/Include/core_armv81mml.h create mode 100644 Drivers/CMSIS/Include/core_armv8mbl.h create mode 100644 Drivers/CMSIS/Include/core_armv8mml.h create mode 100644 Drivers/CMSIS/Include/core_cm0.h create mode 100644 Drivers/CMSIS/Include/core_cm0plus.h create mode 100644 Drivers/CMSIS/Include/core_cm1.h create mode 100644 Drivers/CMSIS/Include/core_cm23.h create mode 100644 Drivers/CMSIS/Include/core_cm3.h create mode 100644 Drivers/CMSIS/Include/core_cm33.h create mode 100644 Drivers/CMSIS/Include/core_cm35p.h create mode 100644 Drivers/CMSIS/Include/core_cm4.h create mode 100644 Drivers/CMSIS/Include/core_cm7.h create mode 100644 Drivers/CMSIS/Include/core_sc000.h create mode 100644 Drivers/CMSIS/Include/core_sc300.h create mode 100644 Drivers/CMSIS/Include/mpu_armv7.h create mode 100644 Drivers/CMSIS/Include/mpu_armv8.h create mode 100644 Drivers/CMSIS/Include/tz_context.h create mode 100644 Drivers/CMSIS/LICENSE.txt create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Compiler/EventRecorderConf.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM7_SP/startup_ARMCM7.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/_ARMCM0/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/_ARMCM3/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/_ARMCM4_FP/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/RTE/_ARMCM7_SP/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/arm_nnexamples_cifar10.cpp create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/arm_nnexamples_cifar10_inputs.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/arm_nnexamples_cifar10_parameter.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/arm_nnexamples_cifar10_weights.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/cifar10/readme.txt create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Compiler/EventRecorderConf.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM7_SP/startup_ARMCM7.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/_ARMCM0/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/_ARMCM3/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/_ARMCM4_FP/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/RTE/_ARMCM7_SP/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/arm_nnexamples_gru.cpp create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/arm_nnexamples_gru_test_data.h create mode 100644 Drivers/CMSIS/NN/Examples/ARM/arm_nn_examples/gru/readme.txt create mode 100644 Drivers/CMSIS/NN/Examples/IAR/iar_nn_examples/NN-example-cifar10/arm_nnexamples_cifar10.cpp create mode 100644 Drivers/CMSIS/NN/Examples/IAR/iar_nn_examples/NN-example-cifar10/arm_nnexamples_cifar10_inputs.h create mode 100644 Drivers/CMSIS/NN/Examples/IAR/iar_nn_examples/NN-example-cifar10/arm_nnexamples_cifar10_parameter.h create mode 100644 Drivers/CMSIS/NN/Examples/IAR/iar_nn_examples/NN-example-cifar10/arm_nnexamples_cifar10_weights.h create mode 100644 Drivers/CMSIS/NN/Examples/IAR/iar_nn_examples/NN-example-cifar10/readme_iar.txt create mode 100644 Drivers/CMSIS/NN/Examples/IAR/iar_nn_examples/NN-example-gru/arm_nnexamples_gru.cpp create mode 100644 Drivers/CMSIS/NN/Examples/IAR/iar_nn_examples/NN-example-gru/arm_nnexamples_gru_test_data.h create mode 100644 Drivers/CMSIS/NN/Examples/IAR/iar_nn_examples/NN-example-gru/readme_iar.txt create mode 100644 Drivers/CMSIS/NN/Include/arm_nn_tables.h create mode 100644 Drivers/CMSIS/NN/Include/arm_nnfunctions.h create mode 100644 Drivers/CMSIS/NN/Include/arm_nnsupportfunctions.h create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM0/startup_ARMCM0.s create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM0/system_ARMCM0.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM3/startup_ARMCM3.s create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM3/system_ARMCM3.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM4/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM4/system_ARMCM4.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM4_FP/startup_ARMCM4.s create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM4_FP/system_ARMCM4.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM7_SP/startup_ARMCM7.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM7_SP/startup_ARMCM7.s create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/ARMCM7_SP/system_ARMCM7.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/STM32F411RETx/startup_stm32f411xe.s create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/Device/STM32F411RETx/system_stm32f4xx.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/_ARMCM0/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/_ARMCM3/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/_ARMCM4_FP/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/RTE/_ARMCM7_SP/RTE_Components.h create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_convolve_HWC_q15_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_convolve_HWC_q15_ref_nonsquare.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_convolve_HWC_q7_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_convolve_HWC_q7_ref_nonsquare.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_depthwise_separable_conv_HWC_q7_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_depthwise_separable_conv_HWC_q7_ref_nonsquare.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_fully_connected_mat_q7_vec_q15_opt_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_fully_connected_mat_q7_vec_q15_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_fully_connected_q15_opt_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_fully_connected_q15_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_fully_connected_q7_opt_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_fully_connected_q7_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_nn_mult_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_pool_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/arm_relu_ref.c create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/fully_connected_testing_weights.h create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/Ref_Implementations/ref_functions.h create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/arm_nnexamples_nn_test.cpp create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/arm_nnexamples_nn_test.h create mode 100644 Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/readme.txt create mode 100644 Drivers/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q15.c create mode 100644 Drivers/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q7.c create mode 100644 Drivers/CMSIS/NN/Source/ActivationFunctions/arm_relu_q15.c create mode 100644 Drivers/CMSIS/NN/Source/ActivationFunctions/arm_relu_q7.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_HWC_q7_fast_nonsquare.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_basic.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast_nonsquare.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_RGB.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic_nonsquare.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast_nonsquare.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_u8_basic_ver1.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7_nonsquare.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15.c create mode 100644 Drivers/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15_reordered.c create mode 100644 Drivers/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15.c create mode 100644 Drivers/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15_opt.c create mode 100644 Drivers/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15.c create mode 100644 Drivers/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15_opt.c create mode 100644 Drivers/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7.c create mode 100644 Drivers/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7_opt.c create mode 100644 Drivers/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q15.c create mode 100644 Drivers/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q7.c create mode 100644 Drivers/CMSIS/NN/Source/NNSupportFunctions/arm_nntables.c create mode 100644 Drivers/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_no_shift.c create mode 100644 Drivers/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_no_shift.c create mode 100644 Drivers/CMSIS/NN/Source/PoolingFunctions/arm_pool_q7_HWC.c create mode 100644 Drivers/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q15.c create mode 100644 Drivers/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q7.c create mode 100644 Drivers/CMSIS/RTOS/Template/cmsis_os.h create mode 100644 Drivers/CMSIS/RTOS2/Include/cmsis_os2.h create mode 100644 Drivers/CMSIS/RTOS2/Include/os_tick.h create mode 100644 Drivers/CMSIS/RTOS2/Source/os_systick.c create mode 100644 Drivers/CMSIS/RTOS2/Source/os_tick_gtim.c create mode 100644 Drivers/CMSIS/RTOS2/Source/os_tick_ptim.c create mode 100644 Drivers/CMSIS/RTOS2/Template/cmsis_os.h create mode 100644 Drivers/CMSIS/RTOS2/Template/cmsis_os1.c create mode 100644 Drivers/CMSIS/docs/General/html/LICENSE.txt create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32_assert_template.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_adc.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_adc_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_cec.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_comp.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_conf_template.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_cortex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_crc.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_crc_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_cryp.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_cryp_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dac.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dac_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_def.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_exti.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_fdcan.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_hcd.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_i2c.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_i2c_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_i2s.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_irda.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_irda_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_iwdg.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_lptim.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pcd.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pcd_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rng.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rtc.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rtc_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_smartcard.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_smartcard_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_smbus.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_smbus_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_usart.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_usart_ex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_wwdg.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_adc.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_bus.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_comp.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_cortex.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_crc.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_crs.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_dac.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_dma.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_dmamux.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_exti.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_gpio.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_i2c.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_iwdg.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_lptim.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_lpuart.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_pwr.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_rcc.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_rng.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_rtc.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_spi.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_system.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_tim.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_ucpd.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_usart.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_usb.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_utils.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_wwdg.h create mode 100644 Drivers/STM32G0xx_HAL_Driver/LICENSE.txt create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_adc.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_adc_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cec.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_comp.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cortex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_crc.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_crc_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cryp.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cryp_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dac.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dac_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_exti.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_fdcan.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_gpio.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_hcd.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_i2c.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_i2c_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_i2s.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_irda.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_iwdg.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_lptim.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_msp_template.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pcd.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pcd_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rng.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smartcard.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smartcard_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smbus.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smbus_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_rtc_alarm_template.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_rtc_wakeup_template.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_tim_template.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_usart.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_usart_ex.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_wwdg.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_adc.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_comp.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crc.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crs.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dac.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_exti.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_gpio.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_i2c.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lptim.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lpuart.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_pwr.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rng.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rtc.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_spi.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_tim.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_ucpd.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usart.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usb.c create mode 100644 Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_utils.c create mode 100644 Makefile create mode 100644 Makefile.bak create mode 100644 STM32G030C8Tx_FLASH.ld create mode 100644 cmd.jexe create mode 100755 flash.sh create mode 100644 openocd.cfg create mode 100644 openocd.gdb create mode 100644 radio-gnumake_test.ioc create mode 100644 startup_stm32g030xx.s create mode 100644 tools/img/image-to-mem.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..51cf81c --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +build +__pycache__ +tools/img/*.png +tools/img/*.psd +tools/img/*.jpg +tools/img/*.c +tools/img/*.h diff --git a/.mxproject b/.mxproject new file mode 100644 index 0000000..bf796e7 --- /dev/null +++ b/.mxproject @@ -0,0 +1,33 @@ +[PreviousLibFiles] +LibFiles=Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_rcc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_bus.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_system.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_utils.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ramfunc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_gpio.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_pwr.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_cortex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_cortex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_def.h;Drivers/STM32G0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_exti.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_exti.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_tim.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_usart.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_lpuart.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart_ex.h;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_gpio.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma_ex.c;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_dma.h;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_dmamux.h;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cortex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_exti.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_rcc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_bus.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_system.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_utils.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ramfunc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_gpio.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_pwr.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_cortex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_cortex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_def.h;Drivers/STM32G0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_exti.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_exti.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_tim.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_usart.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_lpuart.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart_ex.h;Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g030xx.h;Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g0xx.h;Drivers/CMSIS/Device/ST/STM32G0xx/Include/system_stm32g0xx.h;Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/system_stm32g0xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_armclang_ltm.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv81mml.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm35p.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; + +[PreviousUsedMakefileFiles] +SourceFiles=Core/Src/main.c;Core/Src/gpio.c;Core/Src/spi.c;Core/Src/tim.c;Core/Src/usart.c;Core/Src/stm32g0xx_it.c;Core/Src/stm32g0xx_hal_msp.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_gpio.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cortex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_exti.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c;Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/system_stm32g0xx.c;Core/Src/system_stm32g0xx.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_gpio.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cortex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_exti.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c;Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/system_stm32g0xx.c;Core/Src/system_stm32g0xx.c;;; +HeaderPath=Drivers/STM32G0xx_HAL_Driver/Inc;Drivers/STM32G0xx_HAL_Driver/Inc/Legacy;Drivers/CMSIS/Device/ST/STM32G0xx/Include;Drivers/CMSIS/Include;Core/Inc; +CDefines=USE_HAL_DRIVER;STM32G030xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + +[PreviousGenFiles] +AdvancedFolderStructure=true +HeaderFileListSize=7 +HeaderFiles#0=../Core/Inc/gpio.h +HeaderFiles#1=../Core/Inc/spi.h +HeaderFiles#2=../Core/Inc/tim.h +HeaderFiles#3=../Core/Inc/usart.h +HeaderFiles#4=../Core/Inc/stm32g0xx_it.h +HeaderFiles#5=../Core/Inc/stm32g0xx_hal_conf.h +HeaderFiles#6=../Core/Inc/main.h +HeaderFolderListSize=1 +HeaderPath#0=../Core/Inc +HeaderFiles=; +SourceFileListSize=7 +SourceFiles#0=../Core/Src/gpio.c +SourceFiles#1=../Core/Src/spi.c +SourceFiles#2=../Core/Src/tim.c +SourceFiles#3=../Core/Src/usart.c +SourceFiles#4=../Core/Src/stm32g0xx_it.c +SourceFiles#5=../Core/Src/stm32g0xx_hal_msp.c +SourceFiles#6=../Core/Src/main.c +SourceFolderListSize=1 +SourcePath#0=../Core/Src +SourceFiles=; + diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..b930875 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,33 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "Core/Inc", + "Drivers/STM32G0xx_HAL_Driver/Inc/**", + "Drivers/STM32G0xx_HAL_Driver/Inc", + "Drivers/STM32G0xx_HAL_Driver/Inc/Legacy", + "Drivers/CMSIS/Device/ST/STM32G0xx/Include", + "Drivers/CMSIS/Include", + "Core/kt0915", + "Core/ST7735", + "Core/RotaryCoder", + "Core/SWI2C" + ], + "defines": [], + "compilerPath": "/usr/bin/arm-none-eabi-gcc", + "cStandard": "c17", + "cppStandard": "c++14", + "intelliSenseMode": "linux-gcc-arm", + "compilerArgs": [ + "-ICore/Inc \\", + "-IDrivers/STM32G0xx_HAL_Driver/Inc \\", + "-IDrivers/STM32G0xx_HAL_Driver/Inc/Legacy \\", + "-IDrivers/CMSIS/Device/ST/STM32G0xx/Include \\", + "-IDrivers/CMSIS/Include" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2323574 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "C_Cpp.errorSquiggles": "disabled", + "files.associations": { + "KT0915.C": "cpp", + "tim.h": "c" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..62a9a96 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: arm-none-eabi-gcc 生成活动文件", + "command": "/usr/bin/arm-none-eabi-gcc", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}", + "-ICore/Inc \\", + "-IDrivers/STM32G0xx_HAL_Driver/Inc \\", + "-IDrivers/STM32G0xx_HAL_Driver/Inc/Legacy \\", + "-IDrivers/CMSIS/Device/ST/STM32G0xx/Include \\", + "-IDrivers/CMSIS/Include" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "编译器: /usr/bin/arm-none-eabi-gcc" + } + ] +} \ No newline at end of file diff --git a/Core/APP/app.c b/Core/APP/app.c new file mode 100644 index 0000000..e57cd38 --- /dev/null +++ b/Core/APP/app.c @@ -0,0 +1,387 @@ +#include +#include +#include +#include +#include + +uint8_t app_setup(void){ + +} +/* +Shows the static content on display +*/ +void showTemplate() +{ + + int maxX1 = tft.width() - 2; + int maxY1 = tft.height() - 5; + + tft.fillScreen(COLOR_BLACK); + + tft.drawRect(2, 2, maxX1, maxY1, COLOR_YELLOW); + tft.drawLine(2, 40, maxX1, 40, COLOR_YELLOW); + tft.drawLine(2, 60, maxX1, 60, COLOR_YELLOW); +} + +void clearStatus() +{ + + char *unit; + char *bandMode; + + int maxX1 = tft.width() - 6; + int maxY1 = tft.height() - 6; + + tft.fillRect(3, 3, maxX1, 35, COLOR_BLACK); + // tft.fillRect(3,61,maxX1, maxY1 - 61, COLOR_BLACK); + + if (band[bandIdx].mode == MODE_FM) + { + unit = (char *)"MHz"; + bandMode = (char *)"FM"; + } + else + { + unit = (char *)"KHz"; + bandMode = (char *)"AM"; + } + tft.setFont(&Serif_plain_7); + printValue(135, 15, oldMode, bandMode, 7, COLOR_YELLOW); + printValue(135, 36, oldUnit, unit, 7, COLOR_YELLOW); +} + +/* + Prevents blinking during the frequency display. + Erases the old digits if it has changed and print the new digit values. +*/ +void printValue(int col, int line, char *oldValue, char *newValue, uint8_t space, uint16_t color) +{ + int c = col; + char *pOld; + char *pNew; + + pOld = oldValue; + pNew = newValue; + + // prints just changed digits + while (*pOld && *pNew) + { + if (*pOld != *pNew) + { + // Erases olde value + tft.setTextColor(COLOR_BLACK); + tft.setCursor(c, line); + tft.print(*pOld); + // Writes new value + tft.setTextColor(color); + tft.setCursor(c, line); + tft.print(*pNew); + } + pOld++; + pNew++; + c += space; + } + + // Is there anything else to erase? + tft.setTextColor(COLOR_BLACK); + while (*pOld) + { + tft.setCursor(c, line); + tft.print(*pOld); + pOld++; + c += space; + } + + // Is there anything else to print? + tft.setTextColor(color); + while (*pNew) + { + tft.setCursor(c, line); + tft.print(*pNew); + pNew++; + c += space; + } + + // Save the current content to be tested next time + strcpy(oldValue, newValue); +} + +/* + Shows frequency information on Display +*/ +void showFrequency() +{ + char freq[15]; + char aux[15]; + + currentFrequency = rx.getFrequency(); + + // Serial.println(currentFrequency); + + tft.setFont(&DSEG7_Classic_Mini_Regular_30); + tft.setTextSize(1); + + if (band[bandIdx].mode == MODE_FM) // FM + { + sprintf(aux, "%6.6lu", currentFrequency); + freq[0] = aux[0]; + freq[1] = aux[1]; + freq[2] = aux[2]; + freq[3] = '\0'; + freq[4] = aux[3]; + freq[5] = aux[4]; + freq[6] = '\0'; + + printValue(2, 36, &oldFreq[0], &freq[0], 23, COLOR_RED); + printValue(82, 36, &oldFreq[4], &freq[4], 23, COLOR_RED); + tft.setCursor(80, 35); + tft.print('.'); + } + else // AM + { + sprintf(aux, "%5lu", currentFrequency); + freq[0] = aux[0]; + freq[1] = aux[1]; + freq[2] = aux[2]; + freq[3] = aux[3]; + freq[4] = aux[4]; + freq[5] = '\0'; + printValue(2, 36, &oldFreq[0], &freq[0], 23, COLOR_RED); + } +} + +/* + Show some basic information on display +*/ +void showStatus() +{ + resetBuffer(); + clearStatus(); + showFrequency(); + showVolume(); + showBandwidth(); +} + +/* ******************************* + Shows RSSI status +*/ +void showRSSI() +{ + /* + char rssi[15]; + + // Check AM or FM + sprintf(rssi, "%3.3udBuV", (band[bandIdx].mode == MODE_FM)? rx.getFmRssi():rx.getAmRssi()); + tft.setFont(&Serif_plain_14); + tft.setTextSize(1); + printValue(5, 55, oldRssi, rssi, 11, COLOR_WHITE); + */ +} + +void showBandwidth() +{ + char sBw[15]; + + if (band[bandIdx].mode != MODE_AM) + return; + + sprintf(sBw, "%cKHz", am_bw[bwIdx]); + + tft.setFont(&Serif_plain_14); + tft.setTextSize(1); + printValue(5, 80, oldBW, sBw, 11, COLOR_WHITE); +} + +void showStereo() +{ + // char stereo[10]; + // sprintf(stereo, "%s", (rx.isFmStereo()) ? "St" : "Mo"); + // tft.setFont(&Serif_plain_14); + // tft.setTextSize(1); + // printValue(125, 55, oldStereo, stereo, 15, COLOR_WHITE); +} + +/* + Shows the volume level on LCD +*/ +void showVolume() +{ + // char sVolume[15]; + // sprintf(sVolume, "Vol: %2.2u", rx.getVolume()); + // printValue(80, 56, oldVolume, sVolume, 6, 1); +} + +/********************************************************* + + *********************************************************/ + +void showSplash() +{ + // Splash + tft.setFont(&Serif_plain_14); + tft.setTextSize(1); + tft.setTextColor(COLOR_YELLOW); + tft.setCursor(45, 23); + tft.print("KT0915"); + tft.setCursor(15, 50); + tft.print("Arduino Library"); + tft.setCursor(25, 80); + tft.print("By PU2CLR"); + tft.setFont(&Serif_plain_14); + tft.setTextSize(0); + tft.setCursor(12, 110); + tft.print("Ricardo L. Caratti"); + delay(4000); +} + +void bandUp() +{ + // save the current frequency for the band + band[bandIdx].default_frequency = currentFrequency; + + if (bandIdx < lastBand) + { + bandIdx++; + } + else + { + bandIdx = 0; + } + useBand(); +} + +void bandDown() +{ + // save the current frequency for the band + band[bandIdx].default_frequency = currentFrequency; + + if (bandIdx > 0) + { + bandIdx--; + } + else + { + bandIdx = lastBand; + } + useBand(); +} + +void useBand() +{ + + if (band[bandIdx].mode == MODE_FM) + { + rx.setFM(band[bandIdx].minimum_frequency, band[bandIdx].maximum_frequency, band[bandIdx].default_frequency, band[bandIdx].step); + rx.setDeEmphasis(DE_EMPHASIS_75); + // rx.setSoftMute(TURN_OFF); + rx.setFmAfc(TURN_ON); + rx.setMono(TURN_OFF); // Force stereo + } + else + { + rx.setAM(band[bandIdx].minimum_frequency, band[bandIdx].maximum_frequency, band[bandIdx].default_frequency, band[bandIdx].step); + rx.setAmAfc(TURN_ON); + rx.setSoftMute(TURN_OFF); + rx.setAmSpace(0); // Sets Am space channel to 1Khz. + } + delay(100); + currentFrequency = band[bandIdx].default_frequency; + rx.setFrequency(currentFrequency); + showStatus(); +} + +/** + * Used to test the receiver functions implemented by the library + */ +void doBandwidth() +{ + if (bwIdx == 3) + bwIdx = 0; + bwIdx++; + rx.setAmBandwidth(bwIdx); + showBandwidth(); + showFrequency(); + delay(300); +} + +void doStereo() +{ + rx.setMono((bSt = !bSt)); + bShow = true; + showStereo(); + delay(100); +} + +/** + Process seek command. + The seek direction is based on the last encoder direction rotation. +*/ +void doSeek() +{ + delay(200); + bShow = true; + showFrequency(); +} + +/* + Button - Volume control +*/ +void volumeButton(byte d) +{ + + if (d == 1) + rx.setVolumeUp(); + else + rx.setVolumeDown(); + + showVolume(); + delay(MIN_ELAPSED_TIME); // waits a little more for releasing the button. +} + +void doFilter() +{ +} + +void APP_loop() +{ + + // Check if the encoder has moved. + if (encoderCount != 0) + { + if (encoderCount == 1) + { + rx.setFrequencyUp(); + } + else + { + rx.setFrequencyDown(); + } + showFrequency(); + bShow = true; + encoderCount = 0; + } + + // Check button commands + if ((millis() - elapsedButton) > MIN_ELAPSED_TIME) + { + // check if some button is pressed + if (digitalRead(BAND_MODE_SWITCH_UP) == LOW) + bandUp(); + else if (digitalRead(BAND_MODE_SWITCH_DOWN) == LOW) + bandDown(); + else if (digitalRead(VOL_UP) == LOW) + volumeButton(1); + else if (digitalRead(VOL_DOWN) == LOW) + volumeButton(-1); + else if (digitalRead(SWITCH_BW) == LOW) + doBandwidth(); + } + + if ((millis() - pollin_elapsed) > POLLING_TIME) + { + showRSSI(); + pollin_elapsed = millis(); + } + + delay(100); +} \ No newline at end of file diff --git a/Core/APP/app.h b/Core/APP/app.h new file mode 100644 index 0000000..e69de29 diff --git a/Core/Inc/gpio.h b/Core/Inc/gpio.h new file mode 100644 index 0000000..21a3b5a --- /dev/null +++ b/Core/Inc/gpio.h @@ -0,0 +1,49 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.h + * @brief This file contains all the function prototypes for + * the gpio.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_GPIO_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ GPIO_H__ */ + diff --git a/Core/Inc/main.h b/Core/Inc/main.h new file mode 100644 index 0000000..c2c976d --- /dev/null +++ b/Core/Inc/main.h @@ -0,0 +1,107 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define ENCODER_KEY_Pin GPIO_PIN_13 +#define ENCODER_KEY_GPIO_Port GPIOC +#define KEY_1_Pin GPIO_PIN_0 +#define KEY_1_GPIO_Port GPIOA +#define KEY_2_Pin GPIO_PIN_1 +#define KEY_2_GPIO_Port GPIOA +#define KEY_3_Pin GPIO_PIN_2 +#define KEY_3_GPIO_Port GPIOA +#define KEY_4_Pin GPIO_PIN_3 +#define KEY_4_GPIO_Port GPIOA +#define KEY_5_Pin GPIO_PIN_4 +#define KEY_5_GPIO_Port GPIOA +#define LCD_BK_Pin GPIO_PIN_6 +#define LCD_BK_GPIO_Port GPIOA +#define LED_2_Pin GPIO_PIN_8 +#define LED_2_GPIO_Port GPIOA +#define ENCODER_A_Pin GPIO_PIN_6 +#define ENCODER_A_GPIO_Port GPIOC +#define ENCODER_B_Pin GPIO_PIN_7 +#define ENCODER_B_GPIO_Port GPIOC +#define LED_3_Pin GPIO_PIN_11 +#define LED_3_GPIO_Port GPIOA +#define LED_4_Pin GPIO_PIN_12 +#define LED_4_GPIO_Port GPIOA +#define LED_STATUS_Pin GPIO_PIN_15 +#define LED_STATUS_GPIO_Port GPIOA +#define LCD_RST_Pin GPIO_PIN_0 +#define LCD_RST_GPIO_Port GPIOD +#define KEY_6_Pin GPIO_PIN_1 +#define KEY_6_GPIO_Port GPIOD +#define LCD_DC_Pin GPIO_PIN_2 +#define LCD_DC_GPIO_Port GPIOD +#define LED_1_Pin GPIO_PIN_3 +#define LED_1_GPIO_Port GPIOD +#define SWI2C_SCL_Pin GPIO_PIN_3 +#define SWI2C_SCL_GPIO_Port GPIOB +#define SWI2C_SDA_Pin GPIO_PIN_4 +#define SWI2C_SDA_GPIO_Port GPIOB + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/Core/Inc/spi.h b/Core/Inc/spi.h new file mode 100644 index 0000000..b5039ed --- /dev/null +++ b/Core/Inc/spi.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_H__ +#define __SPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern SPI_HandleTypeDef hspi1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_SPI1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SPI_H__ */ + diff --git a/Core/Inc/stm32g0xx_hal_conf.h b/Core/Inc/stm32g0xx_hal_conf.h new file mode 100644 index 0000000..baab2c3 --- /dev/null +++ b/Core/Inc/stm32g0xx_hal_conf.h @@ -0,0 +1,351 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g0xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32G0xx_HAL_CONF_H +#define STM32G0xx_HAL_CONF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +/* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_COMP_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_EXTI_MODULE_ENABLED */ +/* #define HAL_FDCAN_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_I2C_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Register Callbacks selection ############################## */ +/** + * @brief This is the list of modules where register callback can be used + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0u +#define USE_HAL_CEC_REGISTER_CALLBACKS 0u +#define USE_HAL_COMP_REGISTER_CALLBACKS 0u +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u +#define USE_HAL_DAC_REGISTER_CALLBACKS 0u +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0u +#define USE_HAL_HCD_REGISTER_CALLBACKS 0u +#define USE_HAL_I2C_REGISTER_CALLBACKS 0u +#define USE_HAL_I2S_REGISTER_CALLBACKS 0u +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u +#define USE_HAL_PCD_REGISTER_CALLBACKS 0u +#define USE_HAL_RNG_REGISTER_CALLBACKS 0u +#define USE_HAL_RTC_REGISTER_CALLBACKS 0u +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u +#define USE_HAL_SPI_REGISTER_CALLBACKS 0u +#define USE_HAL_TIM_REGISTER_CALLBACKS 0u +#define USE_HAL_UART_REGISTER_CALLBACKS 0u +#define USE_HAL_USART_REGISTER_CALLBACKS 0u +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) +#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE 48000000U /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ +#endif + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) +#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations +in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) +#define LSE_VALUE (32768UL) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S1 peripheral + * This value is used by the RCC HAL module to compute the I2S1 clock source + * frequency. + */ +#if !defined (EXTERNAL_I2S1_CLOCK_VALUE) +#define EXTERNAL_I2S1_CLOCK_VALUE (12288000UL) /*!< Value of the I2S1 External clock source in Hz*/ +#endif /* EXTERNAL_I2S1_CLOCK_VALUE */ + +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +/** + * @brief External clock source for I2S2 peripheral + * This value is used by the RCC HAL module to compute the I2S2 clock source + * frequency. + */ +#if !defined (EXTERNAL_I2S2_CLOCK_VALUE) + #define EXTERNAL_I2S2_CLOCK_VALUE 48000U /*!< Value of the I2S2 External clock source in Hz*/ +#endif /* EXTERNAL_I2S2_CLOCK_VALUE */ +#endif + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 3U /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* ################## CRYP peripheral configuration ########################## */ + +#define USE_HAL_CRYP_SUSPEND_RESUME 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include modules header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32g0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32g0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32g0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32g0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32g0xx_hal_adc.h" +#include "stm32g0xx_hal_adc_ex.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32g0xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "stm32g0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32g0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32g0xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32g0xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32g0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32g0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED +#include "stm32g0xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32g0xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32g0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32g0xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32g0xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32g0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32g0xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32g0xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32g0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32g0xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32g0xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32g0xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32g0xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32g0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32g0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32g0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32g0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32g0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for functions parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32G0xx_HAL_CONF_H */ diff --git a/Core/Inc/stm32g0xx_it.h b/Core/Inc/stm32g0xx_it.h new file mode 100644 index 0000000..6a81aa9 --- /dev/null +++ b/Core/Inc/stm32g0xx_it.h @@ -0,0 +1,62 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g0xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32G0xx_IT_H +#define __STM32G0xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32G0xx_IT_H */ diff --git a/Core/Inc/tim.h b/Core/Inc/tim.h new file mode 100644 index 0000000..0daba35 --- /dev/null +++ b/Core/Inc/tim.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file tim.h + * @brief This file contains all the function prototypes for + * the tim.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __TIM_H__ +#define __TIM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern TIM_HandleTypeDef htim3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_TIM3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIM_H__ */ + diff --git a/Core/Inc/usart.h b/Core/Inc/usart.h new file mode 100644 index 0000000..f9008d9 --- /dev/null +++ b/Core/Inc/usart.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file usart.h + * @brief This file contains all the function prototypes for + * the usart.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USART_H__ +#define __USART_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern UART_HandleTypeDef huart1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_USART1_UART_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USART_H__ */ + diff --git a/Core/RotaryCoder/RotaryCoder.c b/Core/RotaryCoder/RotaryCoder.c new file mode 100644 index 0000000..54f550b --- /dev/null +++ b/Core/RotaryCoder/RotaryCoder.c @@ -0,0 +1,26 @@ +#include "RotaryCoder.h" + +uint16_t COUNT; +uint16_t DIR; + +uint8_t EC11_init(void) +{ + COUNT = 0; + DIR = 0; + HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); + // HAL_TIM_Encoder_Start_IT(&htim3,TIM_CHANNEL_ALL); + return 1; +} + +uint16_t EC11_DIR(void) +{ + DIR = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3); + // STATUS.DATA.COUNT = __HAL_TIM_GET_COUNTER(&htim3); + return DIR; +} + +uint16_t EC11_COUNT(void) +{ + COUNT = __HAL_TIM_GET_COUNTER(&htim3); + return COUNT; +} \ No newline at end of file diff --git a/Core/RotaryCoder/RotaryCoder.h b/Core/RotaryCoder/RotaryCoder.h new file mode 100644 index 0000000..379642f --- /dev/null +++ b/Core/RotaryCoder/RotaryCoder.h @@ -0,0 +1,13 @@ +// Rotary encoder library for Arduino. +#include "main.h" +#include "tim.h" + +#ifndef rotary_h +#define rotary_h + +uint8_t +EC11_init(void); +// Process pin(s) +uint16_t EC11_DIR(void); +uint16_t EC11_COUNT(void); +#endif diff --git a/Core/ST7735/Images/digi18x32.h b/Core/ST7735/Images/digi18x32.h new file mode 100644 index 0000000..0e61b56 --- /dev/null +++ b/Core/ST7735/Images/digi18x32.h @@ -0,0 +1,53 @@ +#pragma once +#include + +const uint8_t IMG_DIGI_18_32[] = { + 0xB3, 0x1F, 0x00, 0xFC, 0xFA, 0xF6, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, + 0xF6, 0xFA, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xF8, 0xFC, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, + 0x0E, 0x0E, 0x0E, 0x0E, 0xF6, 0xFA, 0xFC, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E, 0x0E, 0x0E, 0x0E, + 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xF6, 0xFA, 0xFC, 0x00, 0x00, 0xFC, 0xF8, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF8, 0xFC, 0x00, 0x00, 0xFC, 0xFA, 0xF6, + 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0xFC, + 0xFA, 0xF6, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x06, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x06, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xF6, 0xFA, + 0xFC, 0x00, 0x00, 0xFC, 0xFA, 0xF6, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, + 0xF6, 0xFA, 0xFC, 0x00, 0x00, 0xFC, 0xFA, 0xF6, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, + 0x0E, 0x0E, 0xF6, 0xFA, 0xFC, 0x00, 0x00, 0xFF, 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBF, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBF, 0x7F, 0xFF, 0x00, 0x00, 0xFF, + 0x7F, 0xBF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBF, 0x7F, 0xFF, 0x00, + 0x00, 0xFF, 0x7F, 0xBF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0x7F, 0xBF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0x7F, 0xBF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0xBF, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0x7F, 0xBF, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBF, 0x7F, 0xFF, 0x00, 0x00, 0xFE, 0xFC, 0xF8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFE, 0x00, 0x00, 0xFE, + 0xFD, 0xFB, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFB, 0xFD, + 0xFE, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0xFB, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0xFB, 0xFD, 0xFE, 0x00, 0x00, 0xFE, 0xFD, 0xFB, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0xFB, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFE, 0x00, 0x00, 0xFE, 0xFD, 0xFB, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFB, 0xFD, 0xFE, 0x00, 0x00, 0x00, 0x01, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFB, 0xFD, 0xFE, 0x00, 0x00, 0x7F, + 0xBF, 0xDF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xDF, 0xBF, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, + 0x7F, 0x00, 0x00, 0x7F, 0xBF, 0xDF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xDF, 0xBF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xDF, 0xBF, 0x7F, 0x00, 0x00, 0x7F, 0xBF, 0xDF, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xDF, 0xBF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x7F, 0x00, 0x00, 0x7F, + 0xBF, 0xDF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xDF, 0xBF, 0x7F, 0x00, + 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xDF, 0xBF, + 0x7F, 0x00, +}; +const uint32_t DATA_SIZE_DIGI_18_32 = 722; + diff --git a/Core/ST7735/UI/monoimg.c b/Core/ST7735/UI/monoimg.c new file mode 100644 index 0000000..39dc90c --- /dev/null +++ b/Core/ST7735/UI/monoimg.c @@ -0,0 +1,52 @@ +#include +#include "monoimg.h" + +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#define min(a,b) ((a) <= (b) ? (a) : (b)) + +uint8_t mimg_get_pixel_unsafe(const uint8_t *img, uint8_t x, uint8_t y) { + // MVLSB format + uint8_t width = img[0] + 1; + uint16_t index = (y >> 3) * width + x + 2; + uint8_t offset = y & 0x07; + uint8_t value = (img[index] >> offset) & 0x01; + return value; // return 1 or 0 +} + +uint8_t mimg_get_pixel(const uint8_t *img, uint16_t x, uint16_t y) { + // MVLSB format + uint8_t width = img[0] + 1; + uint8_t height = img[1] + 1; + if (x >= width || y >= height) { + return 0; + } + return mimg_get_pixel_unsafe(img, (uint8_t)x, (uint8_t)y); +} + +void mimg_draw(mimg_FunctionSetPixel set_pixel, uint16_t x, uint16_t y, uint16_t color, const uint8_t *img, mimg_Area area) { + uint8_t width_s1 = img[0]; // width - 1 + uint8_t height_s1 = img[1]; // height - 1 + uint8_t ix = min(area.x, width_s1); + uint8_t iy = min(area.y, height_s1); + uint8_t iw = min(area.w, width_s1 - ix + 1); + uint8_t ih = min(area.h, height_s1 - iy + 1); + uint8_t off_x, off_y; + for (off_y = 0; off_y < ih; off_y ++) { + for (off_x = 0; off_x < iw; off_x ++) { + if (mimg_get_pixel_unsafe(img, ix + off_x, iy + off_y)) { + set_pixel(x + off_x, y + off_y, color); + } + } + } +} + +mimg_Area mimg_get_tile_area(const uint8_t *img, uint8_t cols, uint8_t rows, uint8_t index) { + uint8_t width = img[0] + 1; + uint8_t height = img[1] + 1; + mimg_Area area; + area.w = width / cols; + area.h = height / rows; + area.y = (index / cols) * area.h; + area.x = (index % cols) * area.w; + return area; +} diff --git a/Core/ST7735/UI/monoimg.h b/Core/ST7735/UI/monoimg.h new file mode 100644 index 0000000..5d5285d --- /dev/null +++ b/Core/ST7735/UI/monoimg.h @@ -0,0 +1,19 @@ +#pragma once +#include + +typedef void (*mimg_FunctionSetPixel)(uint16_t x, uint16_t y, uint16_t color); +typedef struct mimg_Area +{ + uint8_t x; + uint8_t y; + uint8_t w; + uint8_t h; +} mimg_Area; + + +/** get a pixel from img, return 1 or 0 */ +uint8_t mimg_get_pixel(const uint8_t *img, uint16_t x, uint16_t y); +/** draw a part of img {ix, iy, iw, ih} , at (x, y) with color */ +void mimg_draw(mimg_FunctionSetPixel set_pixel, uint16_t x, uint16_t y, uint16_t color, const uint8_t *img, mimg_Area area); +/** calc tile area */ +mimg_Area mimg_get_tile_area(const uint8_t *img, uint8_t cols, uint8_t rows, uint8_t index); diff --git a/Core/ST7735/UI/ui.c b/Core/ST7735/UI/ui.c new file mode 100644 index 0000000..576059d --- /dev/null +++ b/Core/ST7735/UI/ui.c @@ -0,0 +1,26 @@ +#include +#include "Images/digi18x32.h" +#include "monoimg.h" +#include "st7735.h" + +void ui_text_number18x32(uint32_t num, uint16_t x, uint16_t y, uint16_t color) { + uint32_t tmp = num; + uint32_t div = 1; + uint8_t num_count = 0; + while (tmp > 0) { + tmp = tmp / 10; + num_count ++; + div = div * 10; + } + div = div / 10; + while (div > 0) { + tmp = (num / div) % 10; + printf("div: %d x: %d tmp: %d\n", div, x, tmp); + mimg_Area area = mimg_get_tile_area(IMG_DIGI_18_32, 10, 1, tmp); + mimg_draw(ST7735_DrawPixel, x, y, color, IMG_DIGI_18_32, area); + x = x + 18; + div = div / 10; + } +} + +// TODO: 绘制文字的方法 diff --git a/Core/ST7735/UI/ui.h b/Core/ST7735/UI/ui.h new file mode 100644 index 0000000..31e647e --- /dev/null +++ b/Core/ST7735/UI/ui.h @@ -0,0 +1,4 @@ +#pragma once +#include + +void ui_text_number18x32(uint32_t num, uint16_t x, uint16_t y, uint16_t color); diff --git a/Core/ST7735/st7735.c b/Core/ST7735/st7735.c new file mode 100644 index 0000000..533cd8e --- /dev/null +++ b/Core/ST7735/st7735.c @@ -0,0 +1,283 @@ +/* vim: set ai et ts=4 sw=4: */ +#include "st7735.h" + +#define DELAY 0x80 + +// based on Adafruit ST7735 library for Arduino +static const uint8_t + init_cmds1[] = { // Init for 7735R, part 1 (red or green tab) + 15, // 15 commands in list: + ST7735_SWRESET, DELAY, // 1: Software reset, 0 args, w/delay + 150, // 150 ms delay + ST7735_SLPOUT, DELAY, // 2: Out of sleep mode, 0 args, w/delay + 255, // 500 ms delay + ST7735_FRMCTR1, 3, // 3: Frame rate ctrl - normal mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ST7735_FRMCTR2, 3, // 4: Frame rate control - idle mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ST7735_FRMCTR3, 6, // 5: Frame rate ctrl - partial mode, 6 args: + 0x01, 0x2C, 0x2D, // Dot inversion mode + 0x01, 0x2C, 0x2D, // Line inversion mode + ST7735_INVCTR, 1, // 6: Display inversion ctrl, 1 arg, no delay: + 0x07, // No inversion + ST7735_PWCTR1, 3, // 7: Power control, 3 args, no delay: + 0xA2, + 0x02, // -4.6V + 0x84, // AUTO mode + ST7735_PWCTR2, 1, // 8: Power control, 1 arg, no delay: + 0xC5, // VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD + ST7735_PWCTR3, 2, // 9: Power control, 2 args, no delay: + 0x0A, // Opamp current small + 0x00, // Boost frequency + ST7735_PWCTR4, 2, // 10: Power control, 2 args, no delay: + 0x8A, // BCLK/2, Opamp current small & Medium low + 0x2A, + ST7735_PWCTR5, 2, // 11: Power control, 2 args, no delay: + 0x8A, 0xEE, + ST7735_VMCTR1, 1, // 12: Power control, 1 arg, no delay: + 0x0E, + ST7735_INVOFF, 0, // 13: Don't invert display, no args, no delay + ST7735_MADCTL, 1, // 14: Memory access control (directions), 1 arg: + ST7735_ROTATION, // row addr/col addr, bottom to top refresh + ST7735_COLMOD, 1, // 15: set color mode, 1 arg, no delay: + 0x05}, // 16-bit color + +#if (defined(ST7735_IS_128X128) || defined(ST7735_IS_160X128)) + init_cmds2[] = { // Init for 7735R, part 2 (1.44" display) + 2, // 2 commands in list: + ST7735_CASET, 4, // 1: Column addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x7F, // XEND = 127 + ST7735_RASET, 4, // 2: Row addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x7F}, // XEND = 127 +#endif // ST7735_IS_128X128 + +#ifdef ST7735_IS_160X80 + init_cmds2[] = { // Init for 7735S, part 2 (160x80 display) + 3, // 3 commands in list: + ST7735_CASET, 4, // 1: Column addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x4F, // XEND = 79 + ST7735_RASET, 4, // 2: Row addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x9F, // XEND = 159 + ST7735_INVOFF, 0}, // 3: Invert colors +#endif + + init_cmds3[] = { // Init for 7735R, part 3 (red or green tab) + 4, // 4 commands in list: + ST7735_GMCTRP1, 16, // 1: Magical unicorn dust, 16 args, no delay: + 0x02, 0x1c, 0x07, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29, 0x25, 0x2B, 0x39, 0x00, 0x01, 0x03, 0x10, ST7735_GMCTRN1, 16, // 2: Sparkles and rainbows, 16 args, no delay: + 0x03, 0x1d, 0x07, 0x06, 0x2E, 0x2C, 0x29, 0x2D, 0x2E, 0x2E, 0x37, 0x3F, 0x00, 0x00, 0x02, 0x10, ST7735_NORON, DELAY, // 3: Normal display on, no args, w/delay + 10, // 10 ms delay + ST7735_DISPON, DELAY, // 4: Main screen turn on, no args w/delay + 100}; // 100 ms delay + +static void ST7735_Select() +{ + HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_RESET); +} + +void ST7735_Unselect() +{ + HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_SET); +} + +static void ST7735_Reset() +{ + HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_RESET); + HAL_Delay(5); + HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_SET); +} + +static void ST7735_WriteCommand(uint8_t cmd) +{ + HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_RESET); + HAL_SPI_Transmit(&ST7735_SPI_PORT, &cmd, sizeof(cmd), HAL_MAX_DELAY); + // SPI_Write(&cmd, sizeof(cmd)); +} + +static void ST7735_WriteData(uint8_t *buff, size_t buff_size) +{ + HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_SET); + HAL_SPI_Transmit(&ST7735_SPI_PORT, buff, buff_size, HAL_MAX_DELAY); + // SPI_Write(buff, buff_size); +} + +static void ST7735_ExecuteCommandList(const uint8_t *addr) +{ + uint8_t numCommands, numArgs; + uint16_t ms; + + numCommands = *addr++; + while (numCommands--) + { + uint8_t cmd = *addr++; + ST7735_WriteCommand(cmd); + + numArgs = *addr++; + // If high bit set, delay follows args + ms = numArgs & DELAY; + numArgs &= ~DELAY; + if (numArgs) + { + ST7735_WriteData((uint8_t *)addr, numArgs); + addr += numArgs; + } + + if (ms) + { + ms = *addr++; + if (ms == 255) + ms = 500; + HAL_Delay(ms); + } + } +} + +static void ST7735_SetAddressWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) +{ + // column address set + ST7735_WriteCommand(ST7735_CASET); + uint8_t data[] = {0x00, x0 + ST7735_XSTART, 0x00, x1 + ST7735_XSTART}; + ST7735_WriteData(data, sizeof(data)); + + // row address set + ST7735_WriteCommand(ST7735_RASET); + data[1] = y0 + ST7735_YSTART; + data[3] = y1 + ST7735_YSTART; + ST7735_WriteData(data, sizeof(data)); + + // write to RAM + ST7735_WriteCommand(ST7735_RAMWR); +} + +void ST7735_Init() +{ + ST7735_Select(); + ST7735_Reset(); + ST7735_ExecuteCommandList(init_cmds1); + ST7735_ExecuteCommandList(init_cmds2); + ST7735_ExecuteCommandList(init_cmds3); + ST7735_Unselect(); +} + +void ST7735_DrawPixel(uint16_t x, uint16_t y, uint16_t color) //画点 +{ + if ((x >= ST7735_WIDTH) || (y >= ST7735_HEIGHT)) + return; + + ST7735_Select(); + + ST7735_SetAddressWindow(x, y, x + 1, y + 1); + uint8_t data[] = {color >> 8, color & 0xFF}; + ST7735_WriteData(data, sizeof(data)); + + ST7735_Unselect(); +} + +void ST7735_DrawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1,uint16_t color) //画线 +{ + int16_t temp; + int16_t steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + temp = x0; + x0 = y0; + y0 = temp; + + temp = x1; + x0 = y1; + y1 = temp; + } + + if (x0 > x1) { + temp = x1; + x1 = x0; + x0 = temp; + + temp = y1; + y1 = y0; + y0 = temp; + } + + int16_t dx, dy; + dx = x1 - x0; + dy = abs(y1 - y0); + + int16_t err = dx / 2; + int16_t ystep; + + if (y0 < y1) { + ystep = 1; + } else { + ystep = -1; + } + + for (; x0 <= x1; x0++) { + if (steep) { + ST7735_DrawPixel(y0, x0, color); + } else { + ST7735_DrawPixel(x0, y0, color); + } + err -= dy; + if (err < 0) { + y0 += ystep; + err += dx; + } + } +} + +void ST7735_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) //矩形填充 +{ + // clipping + if ((x >= ST7735_WIDTH) || (y >= ST7735_HEIGHT)) + return; + if ((x + w - 1) >= ST7735_WIDTH) + w = ST7735_WIDTH - x; + if ((y + h - 1) >= ST7735_HEIGHT) + h = ST7735_HEIGHT - y; + + ST7735_Select(); + ST7735_SetAddressWindow(x, y, x + w - 1, y + h - 1); + + uint8_t data[] = {color >> 8, color & 0xFF}; + HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_SET); + for (y = h; y > 0; y--) + { + for (x = w; x > 0; x--) + { + HAL_SPI_Transmit(&ST7735_SPI_PORT, data, sizeof(data), HAL_MAX_DELAY); + // SPI_Write(data, sizeof(data)); + } + } + + ST7735_Unselect(); +} + +void ST7735_FillScreen(uint16_t color) //全屏填充 +{ + ST7735_FillRectangle(0, 0, ST7735_WIDTH, ST7735_HEIGHT, color); +} + +void ST7735_DrawImage(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint16_t *data) //画图像 +{ + if ((x >= ST7735_WIDTH) || (y >= ST7735_HEIGHT)) + return; + if ((x + w - 1) >= ST7735_WIDTH) + return; + if ((y + h - 1) >= ST7735_HEIGHT) + return; + + ST7735_Select(); + ST7735_SetAddressWindow(x, y, x + w - 1, y + h - 1); + ST7735_WriteData((uint8_t *)data, sizeof(uint16_t) * w * h); + ST7735_Unselect(); +} + +void ST7735_InvertColors(bool invert) //反转颜色 +{ + ST7735_Select(); + ST7735_WriteCommand(invert ? ST7735_INVON : ST7735_INVOFF); + ST7735_Unselect(); +} diff --git a/Core/ST7735/st7735.h b/Core/ST7735/st7735.h new file mode 100644 index 0000000..587ba8e --- /dev/null +++ b/Core/ST7735/st7735.h @@ -0,0 +1,247 @@ +/* vim: set ai et ts=4 sw=4: */ +#ifndef __ST7735_H__ +#define __ST7735_H__ + +#include +#include +#include "main.h" + +#define ST7735_MADCTL_MY 0x80 +#define ST7735_MADCTL_MX 0x40 +#define ST7735_MADCTL_MV 0x20 +#define ST7735_MADCTL_ML 0x10 +#define ST7735_MADCTL_RGB 0x00 +#define ST7735_MADCTL_BGR 0x08 +#define ST7735_MADCTL_MH 0x04 + +/*** Redefine if necessary ***/ +#define ST7735_SPI_PORT hspi1 // +extern SPI_HandleTypeDef ST7735_SPI_PORT; + +#define ST7735_RES_Pin LCD_RST_Pin +#define ST7735_RES_GPIO_Port LCD_RST_GPIO_Port + +#define ST7735_DC_Pin LCD_DC_Pin +#define ST7735_DC_GPIO_Port LCD_DC_GPIO_Port + +#define ST7735_CS_Pin GPIO_PIN_15 +#define ST7735_CS_GPIO_Port GPIOA + +/* // AliExpress/eBay 1.8" display, default orientation +#define ST7735_IS_160X128 1 +#define ST7735_WIDTH 128 +#define ST7735_HEIGHT 160 +#define ST7735_XSTART 0 +#define ST7735_YSTART 0 +#define ST7735_ROTATION (ST7735_MADCTL_MX | ST7735_MADCTL_MY) + */ + +// AliExpress/eBay 1.8" display, rotate right +/* +#define ST7735_IS_160X128 1 +#define ST7735_WIDTH 160 +#define ST7735_HEIGHT 128 +#define ST7735_XSTART 0 +#define ST7735_YSTART 0 +#define ST7735_ROTATION (ST7735_MADCTL_MY | ST7735_MADCTL_MV) +*/ + +// AliExpress/eBay 1.8" display, rotate left +/* +#define ST7735_IS_160X128 1 +#define ST7735_WIDTH 160 +#define ST7735_HEIGHT 128 +#define ST7735_XSTART 0 +#define ST7735_YSTART 0 +#define ST7735_ROTATION (ST7735_MADCTL_MX | ST7735_MADCTL_MV) +*/ + +// AliExpress/eBay 1.8" display, upside down +/* +#define ST7735_IS_160X128 1 +#define ST7735_WIDTH 128 +#define ST7735_HEIGHT 160 +#define ST7735_XSTART 0 +#define ST7735_YSTART 0 +#define ST7735_ROTATION (0) +*/ + +// WaveShare ST7735S-based 1.8" display, default orientation +/* +#define ST7735_IS_160X128 1 +#define ST7735_WIDTH 128 +#define ST7735_HEIGHT 160 +#define ST7735_XSTART 2 +#define ST7735_YSTART 1 +#define ST7735_ROTATION (ST7735_MADCTL_MX | ST7735_MADCTL_MY | ST7735_MADCTL_RGB) + */ + +// WaveShare ST7735S-based 1.8" display, rotate right +/* +#define ST7735_IS_160X128 1 +#define ST7735_WIDTH 160 +#define ST7735_HEIGHT 128 +#define ST7735_XSTART 1 +#define ST7735_YSTART 2 +#define ST7735_ROTATION (ST7735_MADCTL_MY | ST7735_MADCTL_MV | ST7735_MADCTL_RGB) +*/ + +// WaveShare ST7735S-based 1.8" display, rotate left + +#define ST7735_IS_160X128 1 +#define ST7735_WIDTH 160 +#define ST7735_HEIGHT 128 +#define ST7735_XSTART 1 +#define ST7735_YSTART 2 +#define ST7735_ROTATION (ST7735_MADCTL_MX | ST7735_MADCTL_MV | ST7735_MADCTL_RGB) + + +// WaveShare ST7735S-based 1.8" display, upside down +/* +#define ST7735_IS_160X128 1 +#define ST7735_WIDTH 128 +#define ST7735_HEIGHT 160 +#define ST7735_XSTART 2 +#define ST7735_YSTART 1 +#define ST7735_ROTATION (ST7735_MADCTL_RGB) +*/ + +/* // 1.44" display, default orientation +#define ST7735_IS_128X128 1 +#define ST7735_WIDTH 128 +#define ST7735_HEIGHT 128 +#define ST7735_XSTART 2 +#define ST7735_YSTART 3 +#define ST7735_ROTATION (ST7735_MADCTL_MX | ST7735_MADCTL_MY | ST7735_MADCTL_BGR) + */ +// 1.44" display, rotate right +/* +#define ST7735_IS_128X128 1 +#define ST7735_WIDTH 128 +#define ST7735_HEIGHT 128 +#define ST7735_XSTART 3 +#define ST7735_YSTART 2 +#define ST7735_ROTATION (ST7735_MADCTL_MY | ST7735_MADCTL_MV | ST7735_MADCTL_BGR) +*/ + +// 1.44" display, rotate left +/* +#define ST7735_IS_128X128 1 +#define ST7735_WIDTH 128 +#define ST7735_HEIGHT 128 +#define ST7735_XSTART 1 +#define ST7735_YSTART 2 +#define ST7735_ROTATION (ST7735_MADCTL_MX | ST7735_MADCTL_MV | ST7735_MADCTL_BGR) +*/ + +// 1.44" display, upside down +/* +#define ST7735_IS_128X128 1 +#define ST7735_WIDTH 128 +#define ST7735_HEIGHT 128 +#define ST7735_XSTART 2 +#define ST7735_YSTART 1 +#define ST7735_ROTATION (ST7735_MADCTL_BGR) +*/ + +// mini 160x80 display (it's unlikely you want the default orientation) +/* +#define ST7735_IS_160X80 1 +#define ST7735_XSTART 26 +#define ST7735_YSTART 1 +#define ST7735_WIDTH 80 +#define ST7735_HEIGHT 160 +#define ST7735_ROTATION (ST7735_MADCTL_MX | ST7735_MADCTL_MY | ST7735_MADCTL_BGR) +*/ + +// mini 160x80, rotate left +/* +#define ST7735_IS_160X80 1 +#define ST7735_XSTART 1 +#define ST7735_YSTART 26 +#define ST7735_WIDTH 160 +#define ST7735_HEIGHT 80 +#define ST7735_ROTATION (ST7735_MADCTL_MX | ST7735_MADCTL_MV | ST7735_MADCTL_BGR) +*/ + +// mini 160x80, rotate right +/* +#define ST7735_IS_160X80 1 +#define ST7735_XSTART 0 +#define ST7735_YSTART 24 +#define ST7735_WIDTH 160 +#define ST7735_HEIGHT 80 +#define ST7735_ROTATION (ST7735_MADCTL_MY | ST7735_MADCTL_MV | ST7735_MADCTL_BGR) + */ + +/****************************/ + +#define ST7735_NOP 0x00 +#define ST7735_SWRESET 0x01 +#define ST7735_RDDID 0x04 +#define ST7735_RDDST 0x09 + +#define ST7735_SLPIN 0x10 +#define ST7735_SLPOUT 0x11 +#define ST7735_PTLON 0x12 +#define ST7735_NORON 0x13 + +#define ST7735_INVOFF 0x20 +#define ST7735_INVON 0x21 +#define ST7735_DISPOFF 0x28 +#define ST7735_DISPON 0x29 +#define ST7735_CASET 0x2A +#define ST7735_RASET 0x2B +#define ST7735_RAMWR 0x2C +#define ST7735_RAMRD 0x2E + +#define ST7735_PTLAR 0x30 +#define ST7735_COLMOD 0x3A +#define ST7735_MADCTL 0x36 + +#define ST7735_FRMCTR1 0xB1 +#define ST7735_FRMCTR2 0xB2 +#define ST7735_FRMCTR3 0xB3 +#define ST7735_INVCTR 0xB4 +#define ST7735_DISSET5 0xB6 + +#define ST7735_PWCTR1 0xC0 +#define ST7735_PWCTR2 0xC1 +#define ST7735_PWCTR3 0xC2 +#define ST7735_PWCTR4 0xC3 +#define ST7735_PWCTR5 0xC4 +#define ST7735_VMCTR1 0xC5 + +#define ST7735_RDID1 0xDA +#define ST7735_RDID2 0xDB +#define ST7735_RDID3 0xDC +#define ST7735_RDID4 0xDD + +#define ST7735_PWCTR6 0xFC + +#define ST7735_GMCTRP1 0xE0 +#define ST7735_GMCTRN1 0xE1 + +// Color definitions +#define ST7735_BLACK 0x0000 +#define ST7735_BLUE 0x001F +#define ST7735_RED 0xF800 +#define ST7735_GREEN 0x07E0 +#define ST7735_CYAN 0x07FF +#define ST7735_MAGENTA 0xF81F +#define ST7735_YELLOW 0xFFE0 +#define ST7735_WHITE 0xFFFF +#define ST7735_COLOR565(r, g, b) (((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3)) + +// call before initializing any SPI devices +void ST7735_Unselect(void); + +void ST7735_Init(void); +void ST7735_DrawPixel(uint16_t x, uint16_t y, uint16_t color); +void ST7735_DrawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1,uint16_t color); +void ST7735_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color); +void ST7735_FillScreen(uint16_t color); +void ST7735_DrawImage(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const uint16_t* data); +void ST7735_InvertColors(bool invert); + +#endif // __ST7735_H__ diff --git a/Core/SWI2C/i2c_sw.c b/Core/SWI2C/i2c_sw.c new file mode 100644 index 0000000..6581342 --- /dev/null +++ b/Core/SWI2C/i2c_sw.c @@ -0,0 +1,764 @@ +#include "i2c_sw.h" + + +#define SW_I2C_WAIT_TIME 22 + + +#define I2C_READ 0x01 +#define READ_CMD 1 +#define WRITE_CMD 0 + +#define SW_I2C1_SCL_GPIO GPIO_SW_I2C1_SCL +#define SW_I2C1_SDA_GPIO GPIO_SW_I2C1_SDA +#define SW_I2C1_SCL_PIN GPIO_SW_I2C1_SCL_PIN +#define SW_I2C1_SDA_PIN GPIO_SW_I2C1_SDA_PIN +/* +#define SW_I2Cx_SCL_GPIO GPIO_SW_I2Cx_SCL +#define SW_I2Cx_SDA_GPIO GPIO_SW_I2Cx_SDA +#define SW_I2Cx_SCL_PIN GPIO_SW_I2Cx_SCL_PIN +#define SW_I2Cx_SDA_PIN GPIO_SW_I2Cx_SDA_PIN +*/ + +#ifndef TRUE + #define TRUE 1 +#endif +#ifndef FALSE + #define FALSE 0 +#endif + +void TIMER__Wait_us(__IO uint32_t nCount) +{ + for (; nCount != 0;nCount--); +} + + +/* //Systick功能实现us延时,参数SYSCLK为系统时钟 +#define AHB_INPUT 64 //请按RCC中设置的AHB时钟频率填写到这里(单位MHz) + +void TIMER__Wait_us(__IO uint32_t uS) //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015) +{ + uint32_t temp; + SysTick->LOAD=AHB_INPUT*uS; //重装计数初值(当主频是72MHz,72次为1微秒) + SysTick->VAL=0x00; //清空定时器的计数器 + SysTick->CTRL=0x00000005; //内部时钟FCLK,打开定时器 + do + { + temp=SysTick->CTRL; + } + while(temp&0x01&&!(temp&(1<<16))); //等待时间到达 + SysTick->CTRL=0x00000004; //关闭定时器 + SysTick->VAL=0x00; //清空定时器的计数器 +} */ + + +void SW_I2C_initial(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; + + GPIO_InitStructure.Pin = GPIO_SW_I2C1_SCL_PIN; + HAL_GPIO_Init(GPIO_SW_I2C1_SCL, &GPIO_InitStructure); + GPIO_InitStructure.Pin = GPIO_SW_I2C1_SDA_PIN; + HAL_GPIO_Init(GPIO_SW_I2C1_SDA, &GPIO_InitStructure); + + /* + GPIO_InitStructure.Pin = GPIO_SW_I2Cx_SCL_PIN; + HAL_GPIO_Init(GPIO_SW_I2Cx_SCL, &GPIO_InitStructure); + GPIO_InitStructure.Pin = GPIO_SW_I2Cx_SDA_PIN; + HAL_GPIO_Init(GPIO_SW_I2Cx_SDA, &GPIO_InitStructure); + */ + + +} + +void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_SET); +} + +void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_RESET); +} + +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + uint8_t Ret; + Ret=(uint16_t)HAL_GPIO_ReadPin(GPIOx,GPIO_Pin); + return Ret; +} + +void sda_high(uint8_t sel) +{ + if(sel == 1) + GPIO_SetBits(SW_I2C1_SDA_GPIO, SW_I2C1_SDA_PIN); + //else if(sel==x) ... +} + + +void sda_low(uint8_t sel) +{ + if(sel == 1) + GPIO_ResetBits(SW_I2C1_SDA_GPIO, SW_I2C1_SDA_PIN); + //else if(sel==x) ... +} + + +void scl_high(uint8_t sel) +{ + if(sel == 1) + GPIO_SetBits(SW_I2C1_SCL_GPIO, SW_I2C1_SCL_PIN); + //else if(sel==x) ... +} + + +void scl_low(uint8_t sel) +{ + if(sel == 1) + GPIO_ResetBits(SW_I2C1_SCL_GPIO, SW_I2C1_SCL_PIN); + //else if(sel==x) ... +} + +void sda_out(uint8_t sel, uint8_t out) +{ + if (out) + { + sda_high(sel); + } + else + { + sda_low(sel); + } +} + +void sda_in_mode(uint8_t sel) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Mode=GPIO_MODE_INPUT; + + if(sel == 1) + { + GPIO_InitStructure.Pin = SW_I2C1_SDA_PIN; + HAL_GPIO_Init(SW_I2C1_SDA_GPIO, &GPIO_InitStructure); + } + //else if(sel==x) ... + +} + +void sda_out_mode(uint8_t sel) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD; + + if(sel == 1) + { + GPIO_InitStructure.Pin = SW_I2C1_SDA_PIN; + HAL_GPIO_Init(SW_I2C1_SDA_GPIO, &GPIO_InitStructure); + } + //else if(sel==x) ... +} + +void scl_in_mode(uint8_t sel) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD; + + if(sel == 1) + { + GPIO_InitStructure.Pin = SW_I2C1_SCL_PIN; + HAL_GPIO_Init(SW_I2C1_SCL_GPIO, &GPIO_InitStructure); + } + //else if(sel==x) ... +} + +void scl_out_mode(uint8_t sel) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD; + + if(sel == 1) + { + GPIO_InitStructure.Pin = SW_I2C1_SCL_PIN; + HAL_GPIO_Init(SW_I2C1_SCL_GPIO, &GPIO_InitStructure); + } + //else if(sel==x) ... +} + +void i2c_clk_data_out(uint8_t sel) +{ + scl_high(sel); + TIMER__Wait_us(SW_I2C_WAIT_TIME); + scl_low(sel); + +} + +void i2c_port_initial(uint8_t sel) +{ + sda_high(sel); + scl_high(sel); +} + +void i2c_start_condition(uint8_t sel) +{ + sda_high(sel); + scl_high(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + sda_low(sel); + TIMER__Wait_us(SW_I2C_WAIT_TIME); + scl_low(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME << 1); +} + +void i2c_stop_condition(uint8_t sel) +{ + sda_low(sel); + scl_high(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + sda_high(sel); + TIMER__Wait_us(SW_I2C_WAIT_TIME); +} + +uint8_t i2c_check_ack(uint8_t sel) +{ + uint8_t ack; + int i; + unsigned int temp; + + sda_in_mode(sel); + + scl_high(sel); + + ack = 0; + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + for (i = 10; i > 0; i--) + { + temp = !(SW_I2C_ReadVal_SDA(sel)); + if (temp) + { + ack = 1; + break; + } + } + scl_low(sel); + sda_out_mode(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + return ack; +} + +void i2c_check_not_ack(uint8_t sel) +{ + sda_in_mode(sel); + i2c_clk_data_out(sel); + sda_out_mode(sel); + TIMER__Wait_us(SW_I2C_WAIT_TIME); +} + +void i2c_check_not_ack_continue(uint8_t sel) +{ + + i2c_clk_data_out(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); +} + +void i2c_slave_address(uint8_t sel, uint8_t IICID, uint8_t readwrite) +{ + int x; + + if (readwrite) + { + IICID |= I2C_READ; + //printf("%d",IICID); + } + else + { + IICID &= ~I2C_READ; + //printf("%d",IICID); + } + + scl_low(sel); + + for (x = 7; x >= 0; x--) + { + sda_out(sel, IICID & (1 << x)); + TIMER__Wait_us(SW_I2C_WAIT_TIME); + i2c_clk_data_out(sel); + + } +} + +void i2c_register_address(uint8_t sel, uint8_t addr) +{ + int x; + + scl_low(sel); + + for (x = 7; x >= 0; x--) + { + sda_out(sel, addr & (1 << x)); + TIMER__Wait_us(SW_I2C_WAIT_TIME); + i2c_clk_data_out(sel); + + } +} + +void i2c_send_ack(uint8_t sel) +{ + sda_out_mode(sel); + sda_low(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + scl_high(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME << 1); + + sda_low(sel); + TIMER__Wait_us(SW_I2C_WAIT_TIME << 1); + + scl_low(sel); + + sda_out_mode(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); +} + + +uint8_t SW_I2C_ReadVal_SDA(uint8_t sel) +{ + if(sel == 1) + return GPIO_ReadInputDataBit(SW_I2C1_SDA_GPIO, SW_I2C1_SDA_PIN); + return 0; +} + +uint8_t SW_I2C_ReadVal_SCL(uint8_t sel) +{ + if(sel == 1) + return GPIO_ReadInputDataBit(SW_I2C1_SCL_GPIO, SW_I2C1_SCL_PIN); + + return 0; +} + +void SW_I2C_Write_Data(uint8_t sel, uint8_t data) +{ + int x; + + scl_low(sel); + + for (x = 7; x >= 0; x--) + { + sda_out(sel, data & (1 << x)); + TIMER__Wait_us(SW_I2C_WAIT_TIME); + i2c_clk_data_out(sel); + + } +} + +uint8_t SW_I2C_Read_Data(uint8_t sel) +{ + int x; + uint8_t readdata = 0; + + sda_in_mode(sel); + + for (x = 8; x--;) + { + scl_high(sel); + + readdata <<= 1; + if (SW_I2C_ReadVal_SDA(sel)) + readdata |= 0x01; + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + scl_low(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + } + + sda_out_mode(sel); + return readdata; +} + +uint8_t SW_I2C_WriteControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t data) +{ + uint8_t returnack = TRUE; + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_register_address(sel, regaddr); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + SW_I2C_Write_Data(sel, data); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_stop_condition(sel); + + return returnack; +} + +uint8_t SW_I2C_WriteControl_8Bit_OnlyRegAddr(uint8_t sel, uint8_t IICID, uint8_t regaddr) +{ + uint8_t returnack = TRUE; + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + i2c_register_address(sel, regaddr); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + + + return returnack; +} + +uint8_t SW_I2C_WriteControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint16_t data) +{ + uint8_t returnack = TRUE; + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_register_address(sel, regaddr); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + SW_I2C_Write_Data(sel, (data >> 8) & 0xFF); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + SW_I2C_Write_Data(sel, data & 0xFF); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_stop_condition(sel); + + return returnack; +} + +uint8_t SW_I2C_ReadControl_8Bit_OnlyRegAddr(uint8_t sel, uint8_t IICID, uint8_t regaddr) +{ + uint8_t returnack = TRUE; + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_register_address(sel, regaddr); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_stop_condition(sel); + + return returnack; +} + +uint8_t SW_I2C_ReadControl_8Bit_OnlyData(uint8_t sel, uint8_t IICID) +{ + uint8_t readdata = 0; + + i2c_port_initial(sel); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, READ_CMD); + i2c_check_ack(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + readdata = SW_I2C_Read_Data(sel); + + i2c_check_not_ack(sel); + + i2c_stop_condition(sel); + + return readdata; +} + +uint16_t SW_I2C_ReadControl_16Bit_OnlyData(uint8_t sel, uint8_t IICID) +{ + uint8_t readimsi = 0; + uint16_t readdata = 0; + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, READ_CMD); + i2c_check_not_ack(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + readimsi = SW_I2C_Read_Data(sel); + i2c_check_not_ack_continue(sel); + + readdata = readimsi<<8; + + readimsi = SW_I2C_Read_Data(sel); + i2c_check_not_ack(sel); + + + readdata |= readimsi; + + i2c_stop_condition(sel); + + return readdata; +} + +uint8_t SW_I2C_ReadControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr) +{ + uint8_t readdata = 0; + + i2c_port_initial(sel); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + i2c_check_ack(sel); + + i2c_register_address(sel, regaddr); + i2c_check_ack(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, READ_CMD); + i2c_check_ack(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + readdata = SW_I2C_Read_Data(sel); + + i2c_check_not_ack(sel); + + //i2c_stop_condition(sel); + i2c_start_condition(sel); + + return readdata; +} + +uint16_t SW_I2C_ReadControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr) +{ + uint16_t readdata = 0; + + i2c_port_initial(sel); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + i2c_check_ack(sel); + + i2c_register_address(sel, regaddr); + i2c_check_ack(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, READ_CMD); + i2c_check_ack(sel); + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + readdata = SW_I2C_Read_Data(sel); + i2c_send_ack(sel); + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + readdata = ((readdata << 8) | SW_I2C_Read_Data(sel)); + + i2c_check_not_ack(sel); + + i2c_stop_condition(sel); + + i2c_start_condition(sel); //TODO + i2c_slave_address(sel, IICID, WRITE_CMD); + i2c_check_ack(sel); + i2c_stop_condition(sel); + + return readdata; +} + +uint8_t SW_I2C_ReadnControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata)) +{ + uint8_t returnack = TRUE; + uint8_t index; + + i2c_port_initial(sel); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + if (!i2c_check_ack(sel)) { returnack = FALSE; } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_register_address(sel, regaddr); + if (!i2c_check_ack(sel)) { returnack = FALSE; } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, READ_CMD); + if (!i2c_check_ack(sel)) { returnack = FALSE; } + + for ( index = 0 ; index < rcnt ; index++){ + TIMER__Wait_us(SW_I2C_WAIT_TIME); + pdata[index] = SW_I2C_Read_Data(sel); + } + + pdata[rcnt-1] = SW_I2C_Read_Data(sel); + + i2c_check_not_ack(sel); + + i2c_stop_condition(sel); + + i2c_start_condition(sel); //TODO + i2c_slave_address(sel, IICID, WRITE_CMD); + i2c_check_ack(sel); + i2c_stop_condition(sel); + + return returnack; +} + +uint8_t SW_I2C_Multi_ReadnControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata)) +{ + uint8_t returnack = TRUE; + uint8_t index; + + i2c_port_initial(sel); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + if (!i2c_check_ack(sel)) { returnack = FALSE; } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_register_address(sel, regaddr); + if (!i2c_check_ack(sel)) { returnack = FALSE; } + + TIMER__Wait_us(SW_I2C_WAIT_TIME); + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, READ_CMD); + if (!i2c_check_ack(sel)) { returnack = FALSE; } + + for ( index = 0 ; index < (rcnt-1) ; index++){ + TIMER__Wait_us(SW_I2C_WAIT_TIME); + pdata[index] = SW_I2C_Read_Data(sel); + i2c_send_ack(sel); + + } + + pdata[rcnt-1] = SW_I2C_Read_Data(sel); + + i2c_check_not_ack(sel); + + i2c_stop_condition(sel); + + i2c_start_condition(sel); //TODO + i2c_slave_address(sel, IICID, WRITE_CMD); + i2c_check_ack(sel); + i2c_stop_condition(sel); + + return returnack; +} + +uint8_t SW_I2C_Check_SlaveAddr(uint8_t sel, uint8_t IICID) +{ + uint8_t returnack = TRUE; + + i2c_start_condition(sel); + + i2c_slave_address(sel, IICID, WRITE_CMD); + if (!i2c_check_ack(sel)) + { + returnack = FALSE; + } + + return returnack; +} + +uint8_t SW_I2C_UTIL_WRITE(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t data) +{ + return SW_I2C_WriteControl_8Bit(sel, IICID<<1, regaddr, data); +} + +uint8_t SW_I2C_UTIL_Read(uint8_t sel, uint8_t IICID, uint8_t regaddr) +{ + return SW_I2C_ReadControl_8Bit(sel, IICID<<1, regaddr); +} + +uint8_t SW_I2C_UTIL_Read_Multi(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata)) +{ + return SW_I2C_Multi_ReadnControl_8Bit(sel, IICID<<1, regaddr, rcnt, pdata); +} diff --git a/Core/SWI2C/i2c_sw.h b/Core/SWI2C/i2c_sw.h new file mode 100644 index 0000000..a93dd19 --- /dev/null +++ b/Core/SWI2C/i2c_sw.h @@ -0,0 +1,54 @@ +#ifndef __I2C_SW_H +#define __I2C_SW_H + +/* includes */ +#include "main.h" +#include "stdio.h" + +/* defines */ +#define GPIO_SW_I2C1_SCL SWI2C_SCL_GPIO_Port +#define GPIO_SW_I2C1_SDA SWI2C_SDA_GPIO_Port +#define GPIO_SW_I2C1_SCL_PIN SWI2C_SCL_Pin +#define GPIO_SW_I2C1_SDA_PIN SWI2C_SDA_Pin +/* +#define GPIO_SW_I2Cx_SCL GPIOx +#define GPIO_SW_I2Cx_SDA GPIOx +#define GPIO_SW_I2Cx_SCL_PIN GPIO_PIN_x +#define GPIO_SW_I2Cx_SDA_PIN GPIO_PIN_x +*/ + +#define SW_I2C1 1 +//#define SW_I2Cx x + + +/* functions */ +void TIMER__Wait_us(__IO uint32_t uS); + +void SW_I2C_initial(void); + +void i2c_port_initial(uint8_t sel); + +uint8_t SW_I2C_ReadVal_SDA(uint8_t sel); + +void SW_I2C_Write_Data(uint8_t sel, uint8_t data); +uint8_t SW_I2C_Read_Data(uint8_t sel); + +uint8_t SW_I2C_WriteControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t data); +uint8_t SW_I2C_WriteControl_8Bit_OnlyRegAddr(uint8_t sel, uint8_t IICID, uint8_t regaddr); +uint8_t SW_I2C_WriteControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint16_t data); + +uint8_t SW_I2C_ReadControl_8Bit_OnlyRegAddr(uint8_t sel, uint8_t IICID, uint8_t regaddr); +uint8_t SW_I2C_ReadControl_8Bit_OnlyData(uint8_t sel, uint8_t IICID); +uint16_t SW_I2C_ReadControl_16Bit_OnlyData(uint8_t sel, uint8_t IICID); +uint8_t SW_I2C_ReadControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr); +uint16_t SW_I2C_ReadControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr); + +uint8_t SW_I2C_ReadnControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata)); +uint8_t SW_I2C_Multi_ReadnControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata)); +uint8_t SW_I2C_Check_SlaveAddr(uint8_t sel, uint8_t IICID); + +uint8_t SW_I2C_UTIL_WRITE(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t data); +uint8_t SW_I2C_UTIL_Read(uint8_t sel, uint8_t IICID, uint8_t regaddr); +uint8_t SW_I2C_UTIL_Read_Multi(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint8_t rcnt, uint8_t (*pdata)); + +#endif /* __I2C_SW_H */ diff --git a/Core/SWI2C/readme.md b/Core/SWI2C/readme.md new file mode 100644 index 0000000..e69f4b2 --- /dev/null +++ b/Core/SWI2C/readme.md @@ -0,0 +1,43 @@ +# Soft I2C For STM32 using HAL + +That is Edited version of [Original version](https://schkorea.tistory.com/437) for stm32 + +**usage:** + +define GPIO in `i2c_sw.h`: + +```c +#define GPIO_SW_I2C1_SCL GPIOB +#define GPIO_SW_I2C1_SDA GPIOB +#define GPIO_SW_I2C1_SCL_PIN GPIO_PIN_13 +#define GPIO_SW_I2C1_SDA_PIN GPIO_PIN_14 +``` + +That example is for `stm32f103` , for use other micro replace `#include "stm32f1xx_hal_gpio.h"` in `i2c_sw.h`. + +This library has the ability to activate more than 10 software I2C , which have been commented in this library, but by default only one of them has been activated. + +**Example:** + +```c +#include "i2c_sw.h" + +int main() +{ + SW_I2C_initial(); + i2c_port_initial(SW_I2C1); + + while(1) + { + //Write DATA to Reg at Reg_Addr from I2C_Add Device connected to SW_I2C1 + SW_I2C_WriteControl_8Bit(SW_I2C1,I2C_Add,Reg_Addr,DATA); + //Read DATA at Reg_Add from I2C_Add Device connected to SW_I2C1 + DATA=SW_I2C_ReadControl_8Bit(SW_I2C1,I2C_Add,Reg_Add); + } + +} + +``` + + + diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c new file mode 100644 index 0000000..6597512 --- /dev/null +++ b/Core/Src/gpio.c @@ -0,0 +1,111 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.c + * @brief This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "gpio.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure GPIO */ +/*----------------------------------------------------------------------------*/ +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI +*/ +void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, LCD_BK_Pin|LED_2_Pin|LED_3_Pin|LED_4_Pin + |LED_STATUS_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOD, LCD_RST_Pin|LCD_DC_Pin|LED_1_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, SWI2C_SCL_Pin|SWI2C_SDA_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = ENCODER_KEY_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(ENCODER_KEY_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : PAPin PAPin PAPin PAPin + PAPin */ + GPIO_InitStruct.Pin = KEY_1_Pin|KEY_2_Pin|KEY_3_Pin|KEY_4_Pin + |KEY_5_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : PAPin PAPin PAPin PAPin + PAPin */ + GPIO_InitStruct.Pin = LCD_BK_Pin|LED_2_Pin|LED_3_Pin|LED_4_Pin + |LED_STATUS_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : PDPin PDPin PDPin */ + GPIO_InitStruct.Pin = LCD_RST_Pin|LCD_DC_Pin|LED_1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = KEY_6_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(KEY_6_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : PBPin PBPin */ + GPIO_InitStruct.Pin = SWI2C_SCL_Pin|SWI2C_SDA_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ diff --git a/Core/Src/main.c b/Core/Src/main.c new file mode 100644 index 0000000..be365d9 --- /dev/null +++ b/Core/Src/main.c @@ -0,0 +1,216 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "spi.h" +#include "tim.h" +#include "usart.h" +#include "gpio.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include +#include "RotaryCoder.h" +#include "st7735.h" +#include "ui.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +/* USER CODE BEGIN PFP */ +#ifdef __GNUC__ +int _write(int fd, char *ptr, int len) +{ + HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF); + return len; +} +#endif +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ +void LCD_init() +{ + ST7735_Init(); // 屏幕初始化 + HAL_GPIO_WritePin(LCD_BK_GPIO_Port, LCD_BK_Pin, GPIO_PIN_SET); + //const char ready[] = "Init Ready!\r\n"; + //HAL_UART_Transmit(&huart1, (uint8_t *)ready, sizeof(ready) - 1, HAL_MAX_DELAY); +} +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART1_UART_Init(); + MX_SPI1_Init(); + MX_TIM3_Init(); + /* USER CODE BEGIN 2 */ + /*EC11_init(); + uint16_t Count; + uint16_t Diretion;*/ + printf("program start\n"); + LCD_init(); + ST7735_FillScreen(ST7735_WHITE); + printf("Begin draw number\n"); + ui_text_number18x32(10086, 0, 0, 0xFF00); + printf("End draw number\n"); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + /* USER CODE BEGIN 3 */ + HAL_GPIO_TogglePin(LED_STATUS_GPIO_Port,LED_STATUS_Pin); + HAL_Delay(300); + + /* + Count = EC11_COUNT(); + Diretion = EC11_DIR(); + printf("DIRE:%d COUNT:%d \r\n",Diretion,Count); + HAL_Delay(500); + */ + + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1; + RCC_OscInitStruct.PLL.PLLN = 16; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/Core/Src/spi.c b/Core/Src/spi.c new file mode 100644 index 0000000..014437c --- /dev/null +++ b/Core/Src/spi.c @@ -0,0 +1,119 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SPI_HandleTypeDef hspi1; + +/* SPI1 init function */ +void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(spiHandle->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* SPI1 clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) +{ + + if(spiHandle->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/Src/stm32g0xx_hal_msp.c b/Core/Src/stm32g0xx_hal_msp.c new file mode 100644 index 0000000..7267e99 --- /dev/null +++ b/Core/Src/stm32g0xx_hal_msp.c @@ -0,0 +1,81 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g0xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/Src/stm32g0xx_it.c b/Core/Src/stm32g0xx_it.c new file mode 100644 index 0000000..5b5e5f7 --- /dev/null +++ b/Core/Src/stm32g0xx_it.c @@ -0,0 +1,145 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g0xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32g0xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M0+ Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) + { + } + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVC_IRQn 0 */ + + /* USER CODE END SVC_IRQn 0 */ + /* USER CODE BEGIN SVC_IRQn 1 */ + + /* USER CODE END SVC_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32G0xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32g0xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/Src/system_stm32g0xx.c b/Core/Src/system_stm32g0xx.c new file mode 100644 index 0000000..f142e1a --- /dev/null +++ b/Core/Src/system_stm32g0xx.c @@ -0,0 +1,302 @@ +/** + ****************************************************************************** + * @file system_stm32g0xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32g0xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the HSI (8 MHz then 16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32g0xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB Prescaler | 1 + *----------------------------------------------------------------------------- + * HSI Division factor | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 8 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * Require 48MHz for RNG | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + * Copyright (c) 2018-2021 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32g0xx_system + * @{ + */ + +/** @addtogroup STM32G0xx_System_Private_Includes + * @{ + */ + +#include "stm32g0xx.h" + +#if !defined (HSE_VALUE) +#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +#if !defined (LSI_VALUE) + #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/ +#endif /* LSI_VALUE */ + +#if !defined (LSE_VALUE) + #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/ +#endif /* LSE_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/* Note: Following vector table addresses must be defined in line with linker + configuration. */ +/*!< Uncomment the following line if you need to relocate the vector table + anywhere in Flash or Sram, else the vector table is kept at the automatic + remap of boot address selected */ +/* #define USER_VECT_TAB_ADDRESS */ + +#if defined(USER_VECT_TAB_ADDRESS) +/*!< Uncomment the following line if you need to relocate your vector Table + in Sram else user remap will be done in Flash. */ +/* #define VECT_TAB_SRAM */ +#if defined(VECT_TAB_SRAM) +#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000UL; + + const uint32_t AHBPrescTable[16UL] = {0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL, 6UL, 7UL, 8UL, 9UL}; + const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL}; + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* Configure the Vector Table location -------------------------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation */ +#endif /* USER_VECT_TAB_ADDRESS */ +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) / HSI division factor + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is LSI, SystemCoreClock will contain the LSI_VALUE + * + * - If SYSCLK source is LSE, SystemCoreClock will contain the LSE_VALUE + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (**) HSI_VALUE is a constant defined in stm32g0xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32g0xx_hal_conf.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp; + uint32_t pllvco; + uint32_t pllr; + uint32_t pllsource; + uint32_t pllm; + uint32_t hsidiv; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_0: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + + case (RCC_CFGR_SWS_1 | RCC_CFGR_SWS_0): /* LSI used as system clock */ + SystemCoreClock = LSI_VALUE; + break; + + case RCC_CFGR_SWS_2: /* LSE used as system clock */ + SystemCoreClock = LSE_VALUE; + break; + + case RCC_CFGR_SWS_1: /* PLL used as system clock */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL; + + if(pllsource == 0x03UL) /* HSE used as PLL clock source */ + { + pllvco = (HSE_VALUE / pllm); + } + else /* HSI used as PLL clock source */ + { + pllvco = (HSI_VALUE / pllm); + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL); + + SystemCoreClock = pllvco/pllr; + break; + + case 0x00000000U: /* HSI used as system clock */ + default: /* HSI used as system clock */ + hsidiv = (1UL << ((READ_BIT(RCC->CR, RCC_CR_HSIDIV))>> RCC_CR_HSIDIV_Pos)); + SystemCoreClock = (HSI_VALUE/hsidiv); + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/Core/Src/tim.c b/Core/Src/tim.c new file mode 100644 index 0000000..8ce3912 --- /dev/null +++ b/Core/Src/tim.c @@ -0,0 +1,141 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file tim.c + * @brief This file provides code for the configuration + * of the TIM instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "tim.h" + +/* USER CODE BEGIN 0 */ +#include "usart.h" +/* USER CODE END 0 */ + +TIM_HandleTypeDef htim3; + +/* TIM3 init function */ +void MX_TIM3_Init(void) +{ + + /* USER CODE BEGIN TIM3_Init 0 */ + + /* USER CODE END TIM3_Init 0 */ + + TIM_Encoder_InitTypeDef sConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM3_Init 1 */ + + /* USER CODE END TIM3_Init 1 */ + htim3.Instance = TIM3; + htim3.Init.Prescaler = 0; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 255; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + sConfig.EncoderMode = TIM_ENCODERMODE_TI1; + sConfig.IC1Polarity = TIM_ICPOLARITY_FALLING; + sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; + sConfig.IC1Prescaler = TIM_ICPSC_DIV1; + sConfig.IC1Filter = 0; + sConfig.IC2Polarity = TIM_ICPOLARITY_FALLING; + sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; + sConfig.IC2Prescaler = TIM_ICPSC_DIV1; + sConfig.IC2Filter = 0; + if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + +} + +void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(tim_encoderHandle->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* TIM3 clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**TIM3 GPIO Configuration + PC6 ------> TIM3_CH1 + PC7 ------> TIM3_CH2 + */ + GPIO_InitStruct.Pin = ENCODER_A_Pin|ENCODER_B_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } +} + +void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) +{ + + if(tim_encoderHandle->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + + /**TIM3 GPIO Configuration + PC6 ------> TIM3_CH1 + PC7 ------> TIM3_CH2 + */ + HAL_GPIO_DeInit(GPIOC, ENCODER_A_Pin|ENCODER_B_Pin); + + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ +/* +void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) +{ + if(htim->Instance->CR1==0x01)//顺时针 + //Rotary=1; + HAL_UART_Transmit(&huart1,"CW\r\n",10,1000); + HAL_TIM_Encoder_Stop_IT(&htim3,TIM_CHANNEL_ALL); + if(htim->Instance->CR1==0x11)//逆时针 + //Rotary=0; + HAL_UART_Transmit(&huart1,"ccw\r\n",10,1000); + HAL_TIM_Encoder_Stop_IT(&htim3,TIM_CHANNEL_ALL); +} +*/ +/* USER CODE END 1 */ diff --git a/Core/Src/usart.c b/Core/Src/usart.c new file mode 100644 index 0000000..5146291 --- /dev/null +++ b/Core/Src/usart.c @@ -0,0 +1,140 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file usart.c + * @brief This file provides code for the configuration + * of the USART instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "usart.h" + +/* USER CODE BEGIN 0 */ +#include +/* USER CODE END 0 */ + +UART_HandleTypeDef huart1; + +/* USART1 init function */ + +void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; + huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + if(uartHandle->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + + /** Initializes the peripherals clocks + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + + /* USART1 clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } +} + +void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) +{ + + if(uartHandle->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/kt0915/KT0915.C b/Core/kt0915/KT0915.C new file mode 100644 index 0000000..e1a609c --- /dev/null +++ b/Core/kt0915/KT0915.C @@ -0,0 +1,810 @@ +#include "KT0915.h" + +#define enablePort GPIOB + +int deviceAddress = KT0915_I2C_ADDRESS; +int enablePin = GPIO_PIN_0; +uint16_t currentStep; //Stores the current step +uint32_t currentFrequency; //Stores the current frequency +uint32_t minimumFrequency; //Stores the minimum frequency for the current band +uint32_t maximumFrequency; //Stores the maximum frequency for the current band +uint8_t currentMode; //Stores the current mode +uint8_t currentRefClockType = OSCILLATOR_32KHZ; //Stores the crystal type +uint8_t currentRefClockEnabled = REF_CLOCK_DISABLE; //Strores 0 = Crystal; 1 = Reference clock +uint8_t currentDialMode = DIAL_MODE_OFF; //Stores the default Dial Mode (OFF) +uint16_t deviceId; +uint8_t currentVolume = 15; + +uint8_t KT0915_getCurrentMode() { return currentMode; }; + +/* //Set I2C Address + +void KT0915_setI2CBusAddress(int N_deviceAddress) +{ + deviceAddress = N_deviceAddress; +} */ + +void KT0915_setRegister(int reg, uint16_t parameter) +{ + + word16_to_bytes param; + + param.raw = parameter; + //SW_I2C_WriteControl_16Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr, uint16_t data); + SW_I2C_WriteControl_16Bit(SW_I2C1,deviceAddress,reg,param.raw); //USE SOFT I2C + HAL_Delay(6); +} + +uint16_t KT0915_getRegister(int reg) +{ + + word16_to_bytes result; + + //SW_I2C_ReadControl_8Bit(uint8_t sel, uint8_t IICID, uint8_t regaddr) + result.refined = SW_I2C_ReadControl_16Bit(SW_I2C1,deviceAddress,reg); + HAL_Delay(6); + + return result.raw; +} + +uint16_t KT0915_getDeviceId() +{ + deviceId = KT0915_getRegister(REG_CHIP_ID); + return deviceId; +} + +uint8_t KT0915_isCrystalReady() +{ + kt09xx_statusa reg; + reg.raw = KT0915_getRegister(REG_STATUSA); + return reg.refined.XTAL_OK; +} + +uint8_t KT0915_PLLStatus() +{ + kt09xx_statusa reg; + reg.raw = KT0915_getRegister(REG_STATUSA); + return reg.refined.PLL_LOCK; +} + +uint8_t KT0915_LOStatus() +{ + kt09xx_statusa reg; + reg.raw = KT0915_getRegister(REG_STATUSA); + return reg.refined.LO_LOCK; +} + +/* + * * Crystal type table + * | Dec | binary | Description | defined constant | + * | -- | ------ | ----------- | --------------- | + * | 0 | 0000 | 32.768KHz | OSCILLATOR_32KHZ | + * | 1 | 0001 | 6.5MHz | OSCILLATOR_6_5MHZ | + * | 2 | 0010 | 7.6MHz | OSCILLATOR_7_6MHZ | + * | 3 | 0011 | 12MHz | OSCILLATOR_12MHZ | + * | 4 | 0100 | 13MHz | OSCILLATOR_13MHZ | + * | 5 | 0101 | 15.2MHz | OSCILLATOR_15_2MHZ | + * | 6 | 0110 | 19.2MHz | OSCILLATOR_19_2MHZ | + * | 7 | 0111 | 24MHz | OSCILLATOR_24MHZ | + * | 8 | 1000 | 26MHz | OSCILLATOR_26MHZ | + * | 9 | 1001 | ?? 38KHz ?? | OSCILLATOR_38KHz | + * + */ + +void KT0915_setReferenceClockType(uint8_t crystal, uint8_t ref_clock) +{ + kt09xx_amsyscfg reg; + reg.raw = KT0915_getRegister(REG_AMSYSCFG); // Gets the current value of the register + reg.refined.REFCLK = crystal; // Changes just crystal parameter + reg.refined.RCLK_EN = ref_clock; // Reference Clock Enable => Crystal + KT0915_setRegister(REG_AMSYSCFG, reg.raw); // Strores the new value to the register + + currentRefClockType = crystal; + currentRefClockEnabled = ref_clock; +} + + +void KT0915_enable(uint8_t on_off) +{ + if (on_off == 0) { + return; + } else { + //HAL_GPIO_WritePin(GPIOx,GPIO_Pin,GPIO_PIN_SET); + HAL_GPIO_WritePin(enablePort,enablePin,GPIO_PIN_SET); + TIMER__Wait_us(10); + } +} + +/** + * @ingroup GA03 + * @todo You need to check mechanical Tune features + * @brief Sets Tune Dial Mode Interface On + * @details This method sets the KT0915 to deal with a mechanical tuning via an external 100K resistor. + * @details KT0915 supports a unique Dial Mode (mechanical tuning wheel with a variable resistor) which is + * @details enabled by GPIO1 to 2 (10). The dial can be a variable resistor with the tap connected to CH (pin 1). + * + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); pages 19 and 20. + * + * @param minimu_frequency Start frequency for the user band + * @param maximum_frequency Final frequency for the user band + */ +void KT0915_setTuneDialModeOn(uint32_t minimu_frequency, uint32_t maximum_frequency) +{ + kt09xx_amsyscfg reg; + kt09xx_gpiocfg gpio; + kt09xx_userstartch uf; + kt09xx_userguard ug; + kt09xx_userchannum uc; + + reg.raw = KT0915_getRegister(REG_AMSYSCFG); // Gets the current value from the register + reg.refined.USERBAND = currentDialMode = DIAL_MODE_ON; + KT0915_setRegister(REG_AMSYSCFG, reg.raw); // Strores the new value in the register + + gpio.raw = KT0915_getRegister(REG_GPIOCFG); // Gets the current value from the register + gpio.refined.GPIO1 = 2; // Sets Dial Mode interface (pin 1/CH) + KT0915_setRegister(REG_GPIOCFG, gpio.raw); // Stores the new value in the register + + // TODO: Sets the frequency limits for user and + + if (currentMode == MODE_AM) + { + uf.refined.USER_START_CHAN = minimu_frequency; + uc.refined.USER_CHAN_NUM = (maximum_frequency - minimu_frequency) / currentStep; + ug.refined.USER_GUARD = 0x0011; + } + else + { + uf.refined.USER_START_CHAN = minimu_frequency / 50; + uc.refined.USER_CHAN_NUM = ((maximum_frequency - minimu_frequency) / 50) / currentStep; + ug.refined.USER_GUARD = 0x001D; + } + + KT0915_setRegister(REG_USERSTARTCH, uf.raw); + KT0915_setRegister(REG_USERGUARD, ug.raw); + KT0915_setRegister(REG_USERCHANNUM, uc.raw); +}; + +/** + * @ingroup GA03 + * @brief Turns the Tune Dial Mode interface Off + * @see setTuneDialModeOn + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. + */ +void KT0915_setTuneDialModeOff() +{ + kt09xx_amsyscfg reg; + kt09xx_gpiocfg gpio; + reg.raw = KT0915_getRegister(REG_AMSYSCFG); // Gets the current value of the register + reg.refined.USERBAND = currentDialMode = DIAL_MODE_OFF; + KT0915_setRegister(REG_AMSYSCFG, reg.raw); // Strores the new value to the register + + gpio.raw = KT0915_getRegister(REG_GPIOCFG); // Gets the current value of the register + gpio.refined.GPIO1 = 0; // Sets MCU (Arduino) control (High Z) + KT0915_setRegister(REG_GPIOCFG, gpio.raw); // Stores the new value in the register +} + +/** + * @ingroup GA03 + * @brief Sets Volume Dial Mode Interface On + * @details This method sets the KT0915 to deal with a mechanical volume control via an external 100K resistor. + * @details KT0915 supports a unique Dial Mode which is enabled by GPIO2 to 2 (10). + * @details The dial can be a variable resistor with the tap connected to VOL (pin 16). + * + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. + */ +void KT0915_setVolumeDialModeOn() +{ + kt09xx_gpiocfg gpio; + gpio.raw = KT0915_getRegister(REG_GPIOCFG); // Gets the current value from the register + gpio.refined.GPIO2 = 2; // Sets Dial Mode interface (pin 16/VOL) + KT0915_setRegister(REG_GPIOCFG, gpio.raw); // Stores the new value in the register +}; + +/** + * @ingroup GA03 + * @brief Turns the Volume Dial Mode interface Off + * @see setVolumeDialModeOn + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. + */ +void KT0915_setVolumeDialModeOff() +{ + kt09xx_gpiocfg gpio; + gpio.raw = KT0915_getRegister(REG_GPIOCFG); // Gets the current value of the register + gpio.refined.GPIO2 = 0; // Sets to MCU (Arduino) control (High Z) + KT0915_setRegister(REG_GPIOCFG, gpio.raw); // Stores the new value in the register +} + +/** + * @ingroup GA03 + * @brief Audio Gain + * @details This function set the audio gain you want to use. See table below. + * | value | Gain Selection | + * | ----- | -------------- | + * | 0 | 3dB | + * | 1 | 6dB | + * | 2 | -3dB | + * | 3 | 0dB | + * + * @param gain See table above + */ +void KT0915_setAudioGain(uint8_t gain) +{ + kt09xx_amsyscfg r; + r.raw = KT0915_getRegister(REG_AMSYSCFG); + r.refined.AU_GAIN = gain; + KT0915_setRegister(REG_AMSYSCFG, r.raw); +} + +/** + * @ingroup GA03 + * @brief Sets the audio volume level + * @details This method is used to control the audio volume level. The value 0 mutes the device and 31 sets the device to the maximum volume. + * @param volume between 0 and 31. + */ +void KT0915_setVolume(uint8_t volume) +{ + kt09xx_rxcfg rx; + + rx.raw = KT0915_getRegister(REG_RXCFG); + rx.refined.VOLUME = volume; + KT0915_setRegister(REG_RXCFG, rx.raw); + currentVolume = volume; +} + +/** + * @ingroup GA03 + * @brief Increases the audio volume + * + */ +void KT0915_setVolumeUp() +{ + if (currentVolume == 31) + return; + KT0915_setVolume(currentVolume + 1); +} + +/** + * @ingroup GA03 + * @brief Decreases the audio volume + * + */ +void KT0915_setVolumeDown() +{ + if (currentVolume == 0) + return; + KT0915_setVolume(currentVolume - 1); +} + +/** + * @ingroup GA03 + * @brief Returns the current audio volume + * @details Returns a value between 0 and 31. + * @return uint8_t Value between 0 and 31. + */ +uint8_t KT0915_getVolume() +{ + return currentVolume; +} + +void KT0915_SetStandby(uint8_t on_off) +{ + kt09xx_rxcfg rx; + + rx.raw = KT0915_getRegister(REG_RXCFG); + rx.refined.STDBY = on_off; + KT0915_setRegister(REG_RXCFG, rx.raw); +} + +/** + * @ingroup GA03 + * @brief AM and FM Softmute control + * @details The internal KT0915 device register, FM and AM SMUTE 0 means enable and 1 disable. This function inverts this concept. So 1 means enable and 0 disable. + * + * @param on_off 1 = ON (enable); 0 = OFF disable + */ +void KT0915_setSoftMute(uint8_t on_off) +{ + kt09xx_volume v; + v.raw = KT0915_getRegister(REG_VOLUME); + v.refined.AMDSMUTE = v.refined.FMDSMUTE = !on_off; + KT0915_setRegister(REG_VOLUME, v.raw); // Stores the new values of the register +} + +/** + * @ingroup GA03 + * @brief Sets the bass level + * @details Bass Boost Effect Mode Selection + * | Value | Level | + * | ----- | ------- | + * | 0 | Disable | + * | 1 | Low | + * | 2 | Med | + * | 3 | High | + * + * @param on_off see table above + */ +void KT0915_setAudioBass(uint8_t bass) +{ + kt09xx_volume v; + v.raw = KT0915_getRegister(REG_VOLUME); + v.refined.BASS = bass; + KT0915_setRegister(REG_VOLUME, v.raw); // Stores the new values of the register +} + +/** + * @brief Sets the output audio mute + * + * @param mute_on_off 1 = mute; 0 unmute + */ +void KT0915_setAudioMute(uint8_t mute_on_off) +{ + kt09xx_volume v; + + v.raw = KT0915_getRegister(REG_VOLUME); + v.refined.DMUTE = !mute_on_off; + KT0915_setRegister(REG_VOLUME, v.raw); // Stores the new values of the register +} + +/** + * @ingroup GA03 + * @brief Sets Audio DAC Anti-pop Configuration + * + * @details Bass Boost Effect Mode Selection + * | Value | AC - coupling capacitor | + * | ----- | ------------------------- | + * | 0 | 100uF | + * | 1 | 60uF | + * | 2 | 20uF | + * | 3 | 10uF | + * + * @param on_off see table above + */ +void KT091_setAudioAntiPop(uint8_t value) +{ + kt09xx_volume v; + v.refined.POP = value; + KT0915_setRegister(REG_VOLUME, v.raw); // Stores the new values of the register +} + +/** + * @ingroup GA03 + * @brief Sets the Left Channel Inverse Control + * @details If enable, inverts the left channel audio signal + * @details A fully differential audio signal can be got from LOUT an ROUT if the INV_LEFT_AUDIO bit and MONO bit are set to 1. + * @param value ENABLE_ON (1); ENABLE_OFF (0) + */ +void KT0915_setLeftChannelInverseControl(uint8_t enable_disable) +{ + kt09xx_amdsp r; + r.raw = KT0915_getRegister(REG_AMDSP); + r.refined.INV_LEFT_AUDIO = enable_disable; + KT0915_setRegister(REG_AMDSP,r.raw); +} + +/** + * @ingroup GA03 + * @brief Receiver startup + * @details You have to use this method to configure the way that the device will work. For example: enable and disable device control; oscillator type and reference clock type (crystal or external) + * @details The tabe below shows the oscillator frequencies supported by the device. + * @details If you omit the crystal type parameter, will be considered 0 (32.768KHz). + * @details For a low frequency crystal oscillator, selects 32.768KHz or 38KHz crystals. + * @details Alternatively, you can use a CMOS level external reference clock may be used by setting + * @details the parameter ref_clock to 1 (REF_CLOCK_ENABLE) and setting the reference clock according to the table below. + * @details The code below shows how to use the setup function. + * @details the enable_pin parameter sets the way you are controlling the KT0915 pin 9. + * + * @code + * #include + * #define RESET_PIN 12 // set it to -1 if you want to use the RST pin of your MCU. + * KT0915 radio; + * void setup() { + * // Set the parameter enablePin to -1 if you are controlling the enable status via circuit; Select OSCILLATOR_32KHZ, OSCILLATOR_12MHZ etc + * // radio.setup(RESET_PIN); Instead the line below, if you use this line, the crystal type considered will be 32.768KHz. + * radio.setup(RESET_PIN, OSCILLATOR_12MHZ, REF_CLOCK_DISABLE ); + * } + * @endcode + * + * Oscillator frequencies supported + * | Dec | binary | Description | defined constant | + * | -- | ------ | ----------- | --------------- | + * | 0 | 0000 | 32.768KHz | OSCILLATOR_32KHZ | + * | 1 | 0001 | 6.5MHz | OSCILLATOR_6_5MHZ | + * | 2 | 0010 | 7.6MHz | OSCILLATOR_7_6MHZ | + * | 3 | 0011 | 12MHz | OSCILLATOR_12MHZ | + * | 4 | 0100 | 13MHz | OSCILLATOR_13MHZ | + * | 5 | 0101 | 15.2MHz | OSCILLATOR_15_2MHZ | + * | 6 | 0110 | 19.2MHz | OSCILLATOR_19_2MHZ | + * | 7 | 0111 | 24MHz | OSCILLATOR_24MHZ | + * | 8 | 1000 | 26MHz | OSCILLATOR_26MHZ | + * | 9 | 1001 | 38KHz | OSCILLATOR_38KHz | + * + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); 3.6 Crystal and reference clock; page 9. + * @see setReferenceClockType + * + * @param enablePin if >= 0, then you control the device enable or disable status. if -1, you are using the circuit to crontole that. + * @param oscillator_type oscillator type. You can use crystal or external clock. See comments and table above. + * @param ref_clock set to 0 if you are using crystal (Reference clock disabled - default); set to 1 if you are using an external reference clock. + */ +void KT0915_setup(uint8_t oscillator_type, uint8_t ref_clock) +{ + KT0915_enable(1); + HAL_Delay(5); + KT0915_setReferenceClockType(oscillator_type, ref_clock); + KT0915_setVolume(currentVolume); +} + +/** + * @defgroup GA04 Tune Methods + * @section GA04 Tune Methods + * @details Methods to tune and set the receiver mode + */ + + +/** + * @ingroup GA04 + * @brief Sets the receiver Stereo or Mono + * @details Set this parameter to true to force mono or false to stereo + * @param on_off true = mono; fale = stereo + */ +void KT0915_setMono(uint8_t on_off) +{ + kt09xx_dspcfga reg; + reg.raw = KT0915_getRegister(REG_DSPCFGA); + reg.refined.MONO = on_off; + KT0915_setRegister(REG_DSPCFGA, reg.raw); +} + +/** + * @ingroup GA04 + * @brief Return true if the stereo indicator is set to 3; + * @return true is stereo + */ +uint8_t KT0915_isFmStereo() +{ + kt09xx_statusa r; + r.raw = KT0915_getRegister(REG_STATUSA); + return (r.refined.ST == 3); +} + +/** + * @ingroup GA04 + * @brief Gets the current FM RSSI + * + * @return int RSSI value + */ +int KT0915_getFmRssi() +{ + kt09xx_statusa r; + r.raw = KT0915_getRegister(REG_STATUSA); + return (r.refined.FMRSSI * 3); +}; + +/** + * @ingroup GA04 + * @brief Gets the current AM RSSI + * + * @return int RSSI value + */ +int KT0915_getAmRssi() +{ + kt09xx_amdstatusa r; + r.raw = KT0915_getRegister(REG_AMSTATUSA); + return (r.refined.AMRSSI * 3); +}; + +/** + * @ingroup GA04 + * @brief Gets current SNR value + * + * @return int FM SNR value + */ +int KT0915_getFmSnr() +{ + kt09xx_statusc r; + r.raw = KT0915_getRegister(REG_STATUSC); + return (r.refined.FMSNR); +}; + + +/** + * @ingroup GA04 + * @brief Sets the De-emphasis Time Constant Selection + * @param value 0 = 75us; 1 = 50us + */ +void KT0915_setDeEmphasis(uint8_t value) +{ + kt09xx_dspcfga reg; + reg.raw = KT0915_getRegister(REG_DSPCFGA); + reg.refined.DE = value; + KT0915_setRegister(REG_DSPCFGA, reg.raw); +} + +/** + * @ingroup GA04 + * @brief Sets FM AFC Disable Control + * @details This function inverts the register enable/disable concept. So, here, 1 means enable and 0 disable. + * @param on_off 1 = enable AFC; 0 = disable AFC. + */ +void KT0915_setFmAfc(uint8_t on_off) +{ + kt09xx_locfga r; + r.refined.FMAFCD = !on_off; + KT0915_setRegister(REG_LOCFGA, r.raw); +} + +/** + * @ingroup GA04 + * @brief Sets AM AFC Disable Control + * @details This function inverts the register enable/disable concept. So, here, 1 means enable and 0 disable. + * @param on_off 1 = enable AFC; 0 = disable AFC. + */ +void KT0915_setAmAfc(uint8_t on_off) +{ + kt09xx_amsyscfg r; + r.raw = KT0915_getRegister(REG_AMSYSCFG); // Gets the current value of the register + r.refined.RESERVED1 = 1; + r.refined.AMAFCD = !on_off; + KT0915_setRegister(REG_AMSYSCFG, r.raw); +} + +/** + * @ingroup GA04 + * @brief Sets the AM Space + * @details Selects AM channel space + * + * | value | space | + * | ----- | ----- | + * | 0 | 1KHz | + * | 1 | 9KHz | + * | 2 | 10KHz | + * | 3 | 10KHz | + * + * @param value See table above + */ +void KT0915_setAmSpace(uint8_t value) +{ + kt09xx_amcfg r; + r.raw = KT0915_getRegister(REG_AMCFG); + r.refined.AMSPACE = value; + KT0915_setRegister(REG_AMCFG, r.raw); +} + +/** + * @ingroup GA04 + * @brief Sets AM Channel Bandwidth Selection + * @details Configures the AM Bandwidth + * + * | value | Bandwidth | + * | ----- | --------- | + * | 0 | 2KHz | + * | 1 | 2KHz | + * | 2 | 4KHz | + * | 3 | 6KHz | + * + * @param value See table above + */ +void KT0915_setAmBandwidth(uint8_t value) +{ + kt09xx_amdsp r; + r.raw = KT0915_getRegister(REG_AMDSP); + r.refined.AM_BW = value; + KT0915_setRegister(REG_AMDSP, r.raw); +} + +/** + * @ingroup GA04 + * @brief Gets current AM Channel Bandwidth Selection + * + * | value | Bandwidth | + * | ----- | --------- | + * | 0 | 2KHz | + * | 1 | 2KHz | + * | 2 | 4KHz | + * | 3 | 6KHz | + * + * @return See table above + */ +uint8_t KT0915_getAmBandwidth() +{ + kt09xx_amdsp r; + r.raw = KT0915_getRegister(REG_AMDSP); + return r.refined.AM_BW; +} + + + +/** + * @todo Adjust setTuneDialOn() + * @ingroup GA04 + * @brief Sets the receiver to FM mode + * @details Configures the receiver on FM mode; Also sets the band limits, defaul frequency and step. + * + * @param minimum_frequency minimum frequency for the band + * @param maximum_frequency maximum frequency for the band + * @param default_frequency default freuency + * @param step increment and decrement frequency step + */ +void KT0915_setFM(uint32_t minimum_frequency, uint32_t maximum_frequency, uint32_t default_frequency, uint16_t step) +{ + kt09xx_amsyscfg reg; + + currentStep = step; + currentFrequency = default_frequency; + minimumFrequency = minimum_frequency; + maximumFrequency = maximum_frequency; + currentMode = MODE_FM; + + reg.raw = KT0915_getRegister(REG_AMSYSCFG); + reg.refined.AM_FM = MODE_FM; + reg.refined.USERBAND = currentDialMode; + reg.refined.REFCLK = currentRefClockType; + reg.refined.RCLK_EN = currentRefClockEnabled; + KT0915_setRegister(REG_AMSYSCFG, reg.raw); // Stores the new value in the register + + if (currentDialMode == DIAL_MODE_ON) + KT0915_setTuneDialModeOn(minimum_frequency, maximum_frequency); + else + KT0915_setFrequency(default_frequency); +}; + +/** + * @todo Adjust setTuneDialOn() + * @ingroup GA04 + * @brief Sets the receiver to AM mode + * @details Configures the receiver on AM mode; Also sets the band limits, defaul frequency and step. + * + * @param minimum_frequency minimum frequency for the band + * @param maximum_frequency maximum frequency for the band + * @param default_frequency default freuency + * @param step increment and decrement frequency step + */ +void KT0915_setAM(uint32_t minimum_frequency, uint32_t maximum_frequency, uint32_t default_frequency, uint16_t step, uint8_t am_space) +{ + kt09xx_amsyscfg reg; + + currentStep = step; + currentFrequency = default_frequency; + minimumFrequency = minimum_frequency; + maximumFrequency = maximum_frequency; + currentMode = MODE_AM; + + reg.raw = KT0915_getRegister(REG_AMSYSCFG); + reg.refined.AM_FM = MODE_AM; + reg.refined.USERBAND = currentDialMode; + reg.refined.REFCLK = currentRefClockType; + reg.refined.RCLK_EN = currentRefClockEnabled; + KT0915_setRegister(REG_AMSYSCFG, reg.raw); // Stores the new value in the register + KT0915_setAmSpace(am_space); + + if (currentDialMode == DIAL_MODE_ON) + KT0915_setTuneDialModeOn(minimum_frequency, maximum_frequency); + else + KT0915_setFrequency(default_frequency); +} + +/** + * @ingroup GA04 + * @brief Sets the current frequency + * + * @param frequency + */ +void KT0915_setFrequency(uint32_t frequency) +{ + kt09xx_amchan reg_amchan; + kt09xx_tune reg_tune; + + if (currentMode == MODE_AM) + { + reg_amchan.refined.AMTUNE = 1; // TODO Check + reg_amchan.refined.AMCHAN = frequency; + KT0915_setRegister(REG_AMCHAN, reg_amchan.raw); + } + else + { + reg_tune.refined.FMTUNE = 1; // // TODO Check + reg_tune.refined.RESERVED = 0; + reg_tune.refined.FMCHAN = frequency / 50; + KT0915_setRegister(REG_TUNE, reg_tune.raw); + } + + currentFrequency = frequency; + + TIMER__Wait_us(30); +} + +/** + * @ingroup GA04 + * @brief Increments the frequency one step + * @details if the frequency plus the step value is greater than the maximum frequency for the band, + * @details tne current frequency will be set to minimum frequency. + * + * @see setFrequency + */ +void KT0915_frequencyUp() +{ + currentFrequency += currentStep; + if (currentFrequency > maximumFrequency) + currentFrequency = minimumFrequency; + + KT0915_setFrequency(currentFrequency); +} + +/** + * @ingroup GA04 + * @brief Decrements the frequency one step + * @details if the frequency minus the step value is less than the minimum frequency for the band, + * @details tne current frequency will be set to minimum frequency. + * + * @see setFrequency + */ +void KT0915_frequencyDown() +{ + currentFrequency -= currentStep; + if (currentFrequency < minimumFrequency) + currentFrequency = maximumFrequency; + + KT0915_setFrequency(currentFrequency); +}; + +/** + * @ingroup GA04 + * @brief Sets the frequency step + * @details Sets increment and decrement frequency + * @param step Values: 1, 5, 9, 10, 100, 200 in KHz + */ +void KT0915_setStep(uint16_t step) +{ + currentStep = step; +} + +/** + * @ingroup GA04 + * @brief Gets the current frequency + * @return frequency in KHz + */ +uint32_t KT0915_getFrequency() +{ + return currentFrequency; +} + +/** + * @ingroup GA04 + * @brief Gets the FM Channel Setting + * @details This method returns the current channel value for FM tune. + * @details The channel value multiplied by 50 is the current FM frequency in KHz. + * @return FM Channel number + */ +uint16_t KT0915_getFmCurrentChannel() { + kt09xx_tune r; + r.raw = KT0915_getRegister(REG_TUNE); + return r.refined.FMCHAN; +}; + +/** + * @ingroup GA04 + * @brief Gets the current AM Channel Setting + * @details This method returns the current channel value for AM tune + * @details Actually this value is the AM current frequency in KHz + * @return AM Channel number (frequency in KHz) + */ +uint16_t KT0915_getAmCurrentChannel() { + kt09xx_amchan r; + r.raw = KT0915_getRegister(REG_AMCHAN); + return r.refined.AMCHAN; +}; + + +/** + * @todo Not enough information to do this so far. + * @ingroup GA04 + * @brief Should Seek a station + * @details However, there no enough information to implement it. + */ +void KT0915_seekStation() +{ + // TODO +} + + + + diff --git a/Core/kt0915/KT0915.h b/Core/kt0915/KT0915.h new file mode 100644 index 0000000..c23ccca --- /dev/null +++ b/Core/kt0915/KT0915.h @@ -0,0 +1,582 @@ + +/** + * @mainpage PU2CLR KT0915 Arduino Library + * @brief PU2CLR KT0915 Arduino Library implementation.
+ * @details This is an Arduino library for the KT0915, BROADCAST RECEIVER.
+ * @details It works with I2C protocol and can provide an easier interface for controlling the KT0915 device.
+ * @details This library was built based on KT0915 Datasheet from KTMicro (Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip TM). + * @details Others sources help the author to build this library. They are referenced in the documentation for this library on: https://github.com/pu2clr/KT0915 + * @details This library uses the I2C protocols to read and write KT0915 registers. In this context, registers are memory position into the device. + * @details The KT0915 is a full band AM (LW, MW and SW) and FM DSP receiver that can provide you a easy way to build a high quality radio with low cost. + * @details This device, will surprise hobbyists and experimenters with its simplicity. + * + * This library can be freely distributed using the MIT Free Software model. + * + * Copyright (c) 2020 Ricardo Lima Caratti. + * Contact: pu2clr@gmail.com + */ + +/* #include +#include */ +#include "main.h" +#include "i2c_sw.h" + +#define KT0915_I2C_ADDRESS 0x6A //arduino:0x35 It is needed to check it when the KT0915 device arrives. + +#define MODE_FM 0 +#define MODE_AM 1 + +#define TURN_ON 1 +#define TURN_OFF 0 +#define ENABLE_ON 1 +#define ENABLE_OFF 0 + +#define DE_EMPHASIS_75 0 +#define DE_EMPHASIS_50 1 + +#define OSCILLATOR_32KHZ 0 // 32.768KHz +#define OSCILLATOR_6_5MHZ 1 // 6.5MHz +#define OSCILLATOR_7_6MHZ 2 // 7.6MHz +#define OSCILLATOR_12MHZ 3 // 12MHz +#define OSCILLATOR_13MHZ 4 // 13MHz +#define OSCILLATOR_15_2MHZ 5 // 15.2MHz +#define OSCILLATOR_19_2MHZ 6 // 19.2MHz +#define OSCILLATOR_24MHZ 7 // 24MHz +#define OSCILLATOR_26MHZ 8 // 26MHz +#define OSCILLATOR_38KHz 9 // 38KHz + +#define REF_CLOCK_ENABLE 1 // Reference Clock +#define REF_CLOCK_DISABLE 0 // Crystal Clock + +#define DIAL_MODE_ON 1 // Mechanical tuning (Via 100K resistor) +#define DIAL_MODE_OFF 0 // MCU (Arduino) tuning + +#define REG_CHIP_ID 0x01 +#define REG_SEEK 0x02 +#define REG_TUNE 0x03 +#define REG_VOLUME 0x04 +#define REG_DSPCFGA 0x05 +#define REG_LOCFGA 0x0A +#define REG_LOCFGC 0x0C +#define REG_RXCFG 0x0F +#define REG_STATUSA 0x12 +#define REG_STATUSB 0x13 +#define REG_STATUSC 0x14 +#define REG_AMSYSCFG 0x16 +#define REG_AMCHAN 0x17 +#define REG_AMCALI 0x18 +#define REG_GPIOCFG 0x1D +#define REG_AMDSP 0x22 +#define REG_AMSTATUSA 0x24 +#define REG_AMSTATUSB 0x25 +#define REG_SOFTMUTE 0x2E +#define REG_USERSTARTCH 0x2F +#define REG_USERGUARD 0x30 +#define REG_USERCHANNUM 0x31 +#define REG_AMCFG 0x33 +#define REG_AMCFG2 0x34 +#define REG_AFC 0x3C + +//typedef uint8_t bool; + +/** + * @defgroup GA01 Union, Structure and Defined Data Types + * @brief KT0915 Defined Data Types + * @details Defined Data Types is a way to represent the KT0915 registers information + * @details Some information appears to be inaccurate due to translation problems from Chinese to English. + * @details The information shown here was extracted from Datasheet: + * @details KT0915 stereo FM / TV / MW / SW / LW digital tuning radio documentation. + * @details Other information seems incomplete even in the original Chinese Datasheet. + * @details For example: Reg 10 (0x0A). There is no information about it. The Reg11 and 12 seem wrong + */ + +/** + * @ingroup GA01 + * @brief 3.10.1. CHIP ID (Address 0x01) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 15. + */ +typedef union { + uint16_t chip_id; + char chip_id_ascii[2]; +} kt09xx_chip_id; + +/** + * @ingroup GA01 + * @brief 3.10.2. SEEK (Address 0x02) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 15. + */ +typedef union { + struct + { + uint8_t DMUTEL : 1; //!< Left Channel Mute Control; 0 = Left channel mute enable; 1 = Left channel mute disable + uint8_t DMUTER : 1; //!< Right Channel Mute Control; 0 = Left channel mute enable; 1 = Left channel mute disable + uint8_t FMSPACE : 2; //!< FM Channel Spacing; 00 = 200KHz; 01 = 100KHz; 10 = 50KHz + uint16_t RESERVED : 11; //!< Reserved + } refinied; + uint16_t raw; +} kt09xx_seek; + +/** + * @ingroup GA01 + * @brief 3.10.3. TUNE (Address 0x03) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 15. + */ +typedef union { + struct + { + uint16_t FMCHAN : 12; //!< FM Channel Setting FMCHAN<11:0>=Frequency (KHz) / 50KHz. For example, if desired channel is 86MHz, then the FMCHAN<11:0> should be 0x06B8. + uint8_t RESERVED : 3; //!< Reserved + uint8_t FMTUNE : 1; //!< FM Tune Enable; 0 = Normal operation 1 = Start to tune to desired FM channel + } refined; + uint16_t raw; +} kt09xx_tune; + +/** + * @ingroup GA01 + * @brief 3.10.4. VOLUME (Address 0x04) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 15/16. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 4; //!< Reserved + uint8_t POP : 2; //!< Audio DAC Anti - pop Configuration00 : 100uF AC - coupling capacitor 01 : 10 : 11 : Reserved 60uF AC - coupling capacitor 20uF AC - coupling capacitor 10uF AC - coupling capacitor. + uint8_t RESERVED2 : 2; //!< Reserved + uint8_t BASS : 2; //!< Bass Boost Effect Mode Selection; 00 = Disable; 01 = Low ; 10 = Med; 11 = High. + uint8_t RESERVED3 : 3; //!< Reserved + uint8_t DMUTE : 1; //!< Mute Disable; 0 = Mute enable; 1 = Mute disable. + uint8_t AMDSMUTE : 1; //!< AM Softmute Disable; 0 = AM softmute enable; 1 = AM softmute disable. + uint8_t FMDSMUTE : 1; //!< AM Softmute Disable; 0 = FM softmute enable; 1 = FM softmute disable. + } refined; + uint16_t raw; +} kt09xx_volume; + +/** + * @ingroup GA01 + * @brief 3.10.5. DSPCFGA (Address 0x05) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 16/17. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 5; //!< Reserved + uint8_t DBLND : 1; //!< Blend disable; 0 = Blend enable; 1 = Blend disable + uint8_t RESERVED2 : 2; //!< Reserved + uint8_t BLNDADJ : 2; //! Stereo/Mono Blend; Level Adjustment 00 = High; 01 = Highest 10; = Lowest 11 = Low + uint8_t RESERVED3 : 1; //!< Reserved + uint8_t DE : 1; //!< De-emphasis Time Constant Selection. 0 = 75us; 1 = 50us. + uint8_t RESERVED4 : 3; //!< Reserved + uint8_t MONO : 1; //!< Mono Select; 0 = Stereo; 1 = Force mono + } refined; + uint16_t raw; +} kt09xx_dspcfga; + +/** + * @ingroup GA01 + * @brief 3.10.6. LOCFGA (Address 0x0A) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 17. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 8; //!< Reserved + uint8_t FMAFCD : 1; //!< AFC Disable Control Bit; 0 = AFC enable; 1 = AFC disable. + uint8_t RESERVED2 : 7; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_locfga; // LOCFGA + +/** + * @ingroup GA01 + * @brief 3.10.7. LOCFGC (Address 0x0C) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 17. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 3; //!< Reserved + uint8_t CAMPUSBAND_EN : 1; //!< Campus FM Band Enable; 0 = User can only use 64MHz ~110MHz; 1 = User can extend the FM band down to 32MHz + uint16_t RESERVED2 : 12; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_locfgc; // LOCFGC + +/** + * @ingroup GA01 + * @brief 3.10.8. RXCFG (Address 0x0F) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 17. + */ +typedef union { + struct + { + uint8_t VOLUME : 5; //!< Volume Control 11111 = 0dB 11110 = -2dB 11101 = -4dB .... 00010 = -58dB 00001 = -60dB 00000 = Mute + uint8_t RESERVED1 : 7; //!< Campus FM Band Enable; 0 = User can only use 64MHz ~110MHz; 1 = User can extend the FM band down to 32MHz + uint8_t STDBY : 1; //!< Standby Mode Enable. 0 = Disable; 1 = Enable + uint8_t RESERVED2 : 3; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_rxcfg; // RXCFG + +/** + * @ingroup GA01 + * @brief 3.10.19. STATUSA (Address 0x12) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 18. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 3; //!< Reserved + uint8_t FMRSSI : 5; //!< FM RSSI Value Indicator; RSSI starts from -100dBm and step is 3dB namely; RSSI(dBm) = -100 + FMRSSI<4:0> *3dB + uint8_t ST : 2; //!< Stereo Indicator; 11 = Stereo state; Other = Mono state + uint8_t LO_LOCK : 1; //!< LO Synthesizer Ready Indicator; 0 = Not ready; 1 = Ready + uint8_t PLL_LOCK : 1; //!< System PLL Ready Indicator; 0 = Not ready; 1 = System PLL ready + uint8_t RESERVED2 : 2; //!< Reserved + uint8_t STC : 1; //!< Seek/Tune Complete; 0 = Not Complete; 1 = Complete; Every time the Seek/tune process begins, the STC bit will clear to zero by hardware. + uint8_t XTAL_OK : 1; //!< Crystal ready indictor; 0 = Not ready; 1 = Crystal is ok + } refined; + uint16_t raw; +} kt09xx_statusa; // STATUSA + +/** + * @ingroup GA01 + * @brief 3.10.10. STATUSB (Address 0x13) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 18. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 1; //!< Reserved + uint16_t RDCHAN : 15; //!< Current Channel Indicator + } refined; + uint16_t raw; +} kt09xx_statusb; // STATUSB + +/** + * @ingroup GA01 + * @brief 3.10.11. STATUSC (Address 0x14) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 18/19. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 6; //!< Reserved + uint8_t FMSNR : 7; //!< Channel SNR value is FM mode.; 0000000 = Minimum SNR; 1111111 = Maximum SNR + uint8_t CHIPRDY : 1; //!< Chip Ready Indicator; 0 = Chip is not ready; 1 = Chip is ready, calibration done + uint8_t RESERVED2 : 1; //!< Reserved + uint8_t PWSTATUS : 1; //!< Power Status Indicator; 0 = Power not ready; 1 = Power ready + } refined; + uint16_t raw; +} kt09xx_statusc; // STATUSC + +/** + * @ingroup GA01 + * @brief 3.10.12. AMSYSCFG (Address 0x16) + * @details The table below shows REFCLK possibvle values + * + * Crystal type table + * | Dec | binary | Description | defined constant | + * | -- | ------ | ----------- | --------------- | + * | 0 | 0000 | 32.768KHz | OSCILLATOR_32KHZ | + * | 1 | 0001 | 6.5MHz | OSCILLATOR_6_5MHZ | + * | 2 | 0010 | 7.6MHz | OSCILLATOR_7_6MHZ | + * | 3 | 0011 | 12MHz | OSCILLATOR_12MHZ | + * | 4 | 0100 | 13MHz | OSCILLATOR_13MHZ | + * | 5 | 0101 | 15.2MHz | OSCILLATOR_15_2MHZ | + * | 6 | 0110 | 19.2MHz | OSCILLATOR_19_2MHZ | + * | 7 | 0111 | 24MHz | OSCILLATOR_24MHZ | + * | 8 | 1000 | 26MHz | OSCILLATOR_26MHZ | + * | 9 | 1001 | ?? 38KHz ?? | OSCILLATOR_38KHz | + * + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 19. + * + */ +typedef union { + struct + { + uint8_t AMAFCD : 1; //!< AFC Disable Control in AM Mode; 0 = Enable; 1 = Disable + uint8_t RESERVED1 : 5; //!< Reserved + uint8_t AU_GAIN : 2; //!< Audio Gain Selection; 01 = 6dB; 00 = 3dB; 11 = 0dB; 10 = -3dB + uint8_t REFCLK : 4; //!< See Crystal type table + uint8_t RCLK_EN : 1; //!< Reference Clock Enable; 0 = Crystal; 1 = Reference clock + uint8_t RESERVED2 : 1; //!< Reserved + uint8_t USERBAND : 1; //!< User Definition Band Enable; 0 = Use internal defined band; 1 = Use user-defined band which is specified in USER_START_CHAN<14:0>, USER_GUARD<8:0> and USER_CHAN_NUM<11:0> + uint8_t AM_FM : 1; //!< AM/FM Mode Control; 0 = FM mode; 1 = AM mode + } refined; + uint16_t raw; +} kt09xx_amsyscfg; // AMSYSCFG + +/** + * @ingroup GA01 + * @brief 3.10.13. AMCHAN (Address 0x17) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. + */ +typedef union { + struct + { + uint16_t AMCHAN : 15; //!< AM Channel Setting; AMCHAN<14:0> = Frequency(in KHz) + uint8_t AMTUNE : 1; //!< AM Tune Enable + } refined; + uint16_t raw; +} kt09xx_amchan; // AMCHAN + +/** + * @ingroup GA01 + * @brief 3.10.14. AMCALI (Address 0x18) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. + */ +typedef union { + struct + { + uint16_t CAP_INDEX : 14; //!< On Chip Capacitor for AM Antenna Calibration; 0x0000 = Minimum capacitor; 0x3FFF = Maximum capacitor + uint8_t RESERVED1 : 2; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_amcali; // AMCALI + +/** + * @ingroup GA01 + * @brief 3.10.15. GPIOCFG (Address 0x1D) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. + */ +typedef union { + struct + { + uint8_t GPIO1 : 2; //!< CH Pin Mode Selection; 00 = High Z; 01 = Key controlled channel increase / decrease; 10 = Dial controlled channel increase / decrease; 11 = Reserved + uint8_t GPIO2 : 2; //!< VOL Pin Mode Selection; 00 = High Z; 01 = Key controlled volume increase/decrease; 10 = Dial controlled volume increase/decrease; 11 = Reserved + uint16_t RESERVED : 12; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_gpiocfg; // GPIOCFG + +/** + * @ingroup GA01 + * @brief 3.10.16. AMDSP (Address 0x22) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); pages 20 and 21. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 3; //!< Reserved + uint8_t INV_LEFT_AUDIO : 1; //!< Left channel inverse control; 0 = Normal operation; 1 = Inversing the left channel audio signal + uint8_t RESERVED2 : 2; //!< Reserved + uint8_t AM_BW : 2; //!< AM Channel Bandwidth Selection; 00 = 2KHz; 01 = 2KHz; 10 = 4KHz; 11 = 6KHz + uint8_t RESERVED3 : 8; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_amdsp; // AMDSP + +/** + * @ingroup GA01 + * @brief 3.10.17. AMSTATUSA (Address 0x24) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 21. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 8; //!< Reserved + uint8_t AMRSSI : 5; //!< AM Channel RSSI; AM RSSI starts from -90dBm and step is 3dB, namely AMRSSI(dBm) = -90 + AMRSSI<4:0> *3dB + uint8_t RESERVED2 : 3; //!< Reserved + + } refined; + uint16_t raw; +} kt09xx_amdstatusa; // AMSTATUSA + +/** + * @ingroup GA01 + * @brief 3.10.18. AMSTATUSB (Address 0x25) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 21. + */ +typedef union { + struct + { + uint8_t AM_AFCDELTAF : 8; //!< Signed binary, max 16KHz , min -16KHz, step is 128Hz. + uint8_t RESERVED : 8; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_amdstatusb; // AMSTATUSB + +/** + * @ingroup GA01 + * @brief 3.10.19. SOFTMUTE (Address 0x2Eh) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 21. + */ +typedef union { + struct + { + uint8_t FM_SMTH : 3; //!< FM Softmute Start Threshold; 000 = Lowest ... 111 = Highest + uint8_t SMMD : 1; //!< Softmute Mode Selection; 0 = RSSI mode; 1 = SNR mode (only effective in FM mode) + uint8_t VOLUMET : 5; //!< Softmute target Volume. 0 = RSSI; 1 = SNR mode (only effective in FM mode) + uint8_t AM_SMTH : 3; //!< AM Softmute Start Level. 000 = Lowest ... 111 = Highest + uint8_t SMUTER : 2; //!< Softmute Attack/Recover Rate; 00 = Slowest; 01 = Fastest (RSSI mode only); 10 = Fast; 11 = Slow + uint8_t SMUTEA : 2; //!< Softmute Attenuation; 00 = Strong; 01 = Strongest; 10 = Weak; 11 = Weakest + } refined; + uint16_t raw; +} kt09xx_softmute; // SOFTMUTE + +/** + * @ingroup GA01 + * @brief 3.10.20. USERSTARTCH (Address 0x2F) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 22. + */ +typedef union { + struct + { + uint16_t USER_START_CHAN : 15; //!< User band start channel, only effect when USERBAND=1. See section 3.7.3. of the Datasheet + uint8_t RESERVED : 1; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_userstartch; // USERSTARTCH + +/** + * @ingroup GA01 + * @brief 3.10.21. USERGUARD (Address 0x30) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 22. + */ +typedef union { + struct + { + uint16_t USER_GUARD : 9; //!< User band guard number, only effective when USERBAND=1. See section 3.7.2. + uint8_t RESERVED : 7; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_userguard; // USERGUARD + +/** + * @ingroup GA01 + * @brief 3.10.22. USERCHANNUM (Address 0x31) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip(TM); page 22. + */ +typedef union { + struct + { + uint16_t USER_CHAN_NUM : 12; //!< User band channel number, only effective when USERBAND=1. See section 3.7.3. + uint8_t RESERVED : 4; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_userchannum; // USERCHANNUM + +/** + * @ingroup GA01 + * @brief 3.10.23. AMCFG (Address 0x33) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip(TM); page 23. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 5; //!< Reserved + uint8_t KEY_MODE : 2; //!< Working mode selection when key mode is selected. 00 = Working mode A; 01 = Working mode B Others = Reserved; For detailed information about working mode A and working mode B, please refer to section 3.7.1. + uint8_t RESERVED2 : 7; //!< Reserved + uint8_t AMSPACE : 2; //!< AM Channel Space Selection; 00 = 1KHz; 01 = 9KHz; 10 = 10KHz; 11 = 10KHz. + } refined; + uint16_t raw; +} kt09xx_amcfg; // AMCFG + +/** + * @ingroup GA01 + * @brief 3.10.24. AMCFG2 (Address 0x34h) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip(TM); page 23. + */ +typedef union { + struct + { + uint8_t RESERVED1 : 1; //!< Reserved + uint8_t TIME2 : 3; //!< 000 = Fastest...... 111 = Slowest + uint8_t TIME1 : 2; //!< 00 = Shortest...... 11 = Longest + uint16_t RESERVED2 : 10; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_amcfg2; // AMCFG2 + +/** + * @ingroup GA01 + * @brief 3.10.25. AFC (Address 0x3Ch) + * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip(TM); page 23. + */ +typedef union { + struct + { + uint8_t FM_AFC_DELTAF : 8; //!< Frequency difference between CHAN and received signal, calculated by AFC block in two’s complement format. Range is - 127 to +127. Unit is KHz. This register is valid when STC=1 + uint8_t RESERVED1 : 8; //!< Reserved + } refined; + uint16_t raw; +} kt09xx_afc; // AFC + +/** + * @ingroup GA01 + * @brief Converts 16 bits word to two bytes + */ +typedef union { + uint16_t refined; + uint16_t raw; +} word16_to_bytes; + + + + void KT0915_setRegister(int reg, uint16_t parameter); + uint16_t KT0915_getRegister(int reg); + + uint16_t KT0915_getDeviceId(void); + void KT0915_enable(uint8_t on_off); + // void KT0915_setI2CBusAddress(int N_deviceAddress); //TODO CHECK + void KT0915_setReferenceClockType(uint8_t crystal, uint8_t ref_clock); + uint8_t KT0915_isCrystalReady(void); + void KT0915_setup(uint8_t oscillator_type, uint8_t ref_clock); + + void KT0915_setTuneDialModeOn(uint32_t minimu_frequency, uint32_t maximum_frequency); + void KT0915_setTuneDialModeOff(void); + void KT0915_setVolumeDialModeOn(void); + void KT0915_setVolumeDialModeOff(void); + void KT0915_setAudioGain(uint8_t gain); + + void KT0915_setLeftChannelInverseControl(uint8_t enable_disable); + + void KT0915_setVolume(uint8_t value); + void KT0915_setVolumeUp(void); + void KT0915_setVolumeDown(void); + uint8_t KT0915_getVolume(void); + + void KT0915_SetStandby(uint8_t on_off); + + void KT0915_setSoftMute(uint8_t on_off); + void KT0915_setAudioBass(uint8_t bass); + void KT0915_setAudioAntiPop(uint8_t value); + void KT0915_setAudioMute(uint8_t mute_on_off); + + void KT0915_setDeEmphasis(uint8_t value); + void KT0915_setMono(uint8_t on_off); + + void KT0915_setFmAfc(uint8_t on_off); + void KT0915_setAmAfc(uint8_t on_off); + + void KT0915_setFM(uint32_t minimum_frequency, uint32_t maximum_frequency, uint32_t default_frequency, uint16_t step); + + void KT0915_setAM(uint32_t minimum_frequency, uint32_t maximum_frequency, uint32_t default_frequency, uint16_t step, uint8_t am_space); + void KT0915_setAmSpace(uint8_t value); + void KT0915_setAmBandwidth(uint8_t value); + uint8_t KT0915_getAmBandwidth(void); + + uint8_t KT0915_isFmStereo(void); //bool + + void KT0915_setFrequency(uint32_t frequency); + void KT0915_setStep(uint16_t step); + void KT0915_frequencyUp(void); + void KT0915_frequencyDown(void); + inline void KT0915_setFrequencyUp() { KT0915_frequencyUp(); }; // Just an alias + inline void KT0915_setFrequencyDown() { KT0915_frequencyDown(); }; // Just an alias + + uint32_t KT0915_getFrequency(void); + + uint16_t KT0915_getFmCurrentChannel(void); + uint16_t KT0915_getAmCurrentChannel(void); + + void KT0915_seekStation(void); + + + + int KT0915_getFmRssi(void); + int KT0915_getAmRssi(void); + int KT0915_getFmSnr(void); + uint8_t KT0915_PLLStatus(void); + uint8_t KT0915_LOStatus(void); + + diff --git a/Drivers/CMSIS/Core/Include/cmsis_armcc.h b/Drivers/CMSIS/Core/Include/cmsis_armcc.h new file mode 100644 index 0000000..da9d654 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/cmsis_armcc.h @@ -0,0 +1,894 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.1.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + +/* CMSIS compiler control DSP macros */ +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __ARM_FEATURE_DSP 1 +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __memory_changed() +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/Drivers/CMSIS/Core/Include/cmsis_armclang.h b/Drivers/CMSIS/Core/Include/cmsis_armclang.h new file mode 100644 index 0000000..478f75b --- /dev/null +++ b/Drivers/CMSIS/Core/Include/cmsis_armclang.h @@ -0,0 +1,1444 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +#define __SADD8 __builtin_arm_sadd8 +#define __QADD8 __builtin_arm_qadd8 +#define __SHADD8 __builtin_arm_shadd8 +#define __UADD8 __builtin_arm_uadd8 +#define __UQADD8 __builtin_arm_uqadd8 +#define __UHADD8 __builtin_arm_uhadd8 +#define __SSUB8 __builtin_arm_ssub8 +#define __QSUB8 __builtin_arm_qsub8 +#define __SHSUB8 __builtin_arm_shsub8 +#define __USUB8 __builtin_arm_usub8 +#define __UQSUB8 __builtin_arm_uqsub8 +#define __UHSUB8 __builtin_arm_uhsub8 +#define __SADD16 __builtin_arm_sadd16 +#define __QADD16 __builtin_arm_qadd16 +#define __SHADD16 __builtin_arm_shadd16 +#define __UADD16 __builtin_arm_uadd16 +#define __UQADD16 __builtin_arm_uqadd16 +#define __UHADD16 __builtin_arm_uhadd16 +#define __SSUB16 __builtin_arm_ssub16 +#define __QSUB16 __builtin_arm_qsub16 +#define __SHSUB16 __builtin_arm_shsub16 +#define __USUB16 __builtin_arm_usub16 +#define __UQSUB16 __builtin_arm_uqsub16 +#define __UHSUB16 __builtin_arm_uhsub16 +#define __SASX __builtin_arm_sasx +#define __QASX __builtin_arm_qasx +#define __SHASX __builtin_arm_shasx +#define __UASX __builtin_arm_uasx +#define __UQASX __builtin_arm_uqasx +#define __UHASX __builtin_arm_uhasx +#define __SSAX __builtin_arm_ssax +#define __QSAX __builtin_arm_qsax +#define __SHSAX __builtin_arm_shsax +#define __USAX __builtin_arm_usax +#define __UQSAX __builtin_arm_uqsax +#define __UHSAX __builtin_arm_uhsax +#define __USAD8 __builtin_arm_usad8 +#define __USADA8 __builtin_arm_usada8 +#define __SSAT16 __builtin_arm_ssat16 +#define __USAT16 __builtin_arm_usat16 +#define __UXTB16 __builtin_arm_uxtb16 +#define __UXTAB16 __builtin_arm_uxtab16 +#define __SXTB16 __builtin_arm_sxtb16 +#define __SXTAB16 __builtin_arm_sxtab16 +#define __SMUAD __builtin_arm_smuad +#define __SMUADX __builtin_arm_smuadx +#define __SMLAD __builtin_arm_smlad +#define __SMLADX __builtin_arm_smladx +#define __SMLALD __builtin_arm_smlald +#define __SMLALDX __builtin_arm_smlaldx +#define __SMUSD __builtin_arm_smusd +#define __SMUSDX __builtin_arm_smusdx +#define __SMLSD __builtin_arm_smlsd +#define __SMLSDX __builtin_arm_smlsdx +#define __SMLSLD __builtin_arm_smlsld +#define __SMLSLDX __builtin_arm_smlsldx +#define __SEL __builtin_arm_sel +#define __QADD __builtin_arm_qadd +#define __QSUB __builtin_arm_qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/Drivers/CMSIS/Core/Include/cmsis_armclang_ltm.h b/Drivers/CMSIS/Core/Include/cmsis_armclang_ltm.h new file mode 100644 index 0000000..1b5a965 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/cmsis_armclang_ltm.h @@ -0,0 +1,1891 @@ +/**************************************************************************//** + * @file cmsis_armclang_ltm.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V1.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2018-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/Drivers/CMSIS/Core/Include/cmsis_compiler.h b/Drivers/CMSIS/Core/Include/cmsis_compiler.h new file mode 100644 index 0000000..21a2c71 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/cmsis_compiler.h @@ -0,0 +1,283 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.1.0 + * @date 09. October 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6.6 LTM (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #include "cmsis_armclang_ltm.h" + + /* + * Arm Compiler above 6.10.1 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #define __RESTRICT __restrict + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/Drivers/CMSIS/Core/Include/cmsis_gcc.h b/Drivers/CMSIS/Core/Include/cmsis_gcc.h new file mode 100644 index 0000000..1e08e7e --- /dev/null +++ b/Drivers/CMSIS/Core/Include/cmsis_gcc.h @@ -0,0 +1,2168 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START + +/** + \brief Initializes data and bss sections + \details This default implementations initialized all data and additional bss + sections relying on .copy.table and .zero.table specified properly + in the used linker script. + + */ +__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) +{ + extern void _start(void) __NO_RETURN; + + typedef struct { + uint32_t const* src; + uint32_t* dest; + uint32_t wlen; + } __copy_table_t; + + typedef struct { + uint32_t* dest; + uint32_t wlen; + } __zero_table_t; + + extern const __copy_table_t __copy_table_start__; + extern const __copy_table_t __copy_table_end__; + extern const __zero_table_t __zero_table_start__; + extern const __zero_table_t __zero_table_end__; + + for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = pTable->src[i]; + } + } + + for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = 0u; + } + } + + _start(); +} + +#define __PROGRAM_START __cmsis_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP __StackTop +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT __StackLimit +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section(".vectors"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/Drivers/CMSIS/Core/Include/cmsis_iccarm.h b/Drivers/CMSIS/Core/Include/cmsis_iccarm.h new file mode 100644 index 0000000..7af7562 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/cmsis_iccarm.h @@ -0,0 +1,964 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.1.0 + * @date 08. May 2019 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2019 IAR Systems +// Copyright (c) 2017-2019 Arm Limited. All rights reserved. +// +// 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 __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #if __ICCARM_V8 + #define __RESTRICT __restrict + #else + /* Needs IAR language extensions */ + #define __RESTRICT restrict + #endif +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + +#ifndef __PROGRAM_START +#define __PROGRAM_START __iar_program_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP CSTACK$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT CSTACK$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __vector_table +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE @".intvec" +#endif + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/Drivers/CMSIS/Core/Include/cmsis_version.h b/Drivers/CMSIS/Core/Include/cmsis_version.h new file mode 100644 index 0000000..3174cf6 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.3 + * @date 24. June 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 3U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/Drivers/CMSIS/Core/Include/core_armv81mml.h b/Drivers/CMSIS/Core/Include/core_armv81mml.h new file mode 100644 index 0000000..8cee930 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_armv81mml.h @@ -0,0 +1,2968 @@ +/**************************************************************************//** + * @file core_armv81mml.h + * @brief CMSIS Armv8.1-M Mainline Core Peripheral Access Layer Header File + * @version V1.0.0 + * @date 15. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2018-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV81MML_H_GENERIC +#define __CORE_ARMV81MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMV81MML + @{ + */ + +#include "cmsis_version.h" + +#define __ARM_ARCH_8M_MAIN__ 1 // patching for now +/* CMSIS ARMV81MML definitions */ +#define __ARMv81MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv81MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv81MML_CMSIS_VERSION ((__ARMv81MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv81MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV81MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV81MML_H_DEPENDANT +#define __CORE_ARMV81MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv81MML_REV + #define __ARMv81MML_REV 0x0000U + #warning "__ARMv81MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv81MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ +#define MPU_RLAR_PXN_Msk (0x1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV81MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_armv8mbl.h b/Drivers/CMSIS/Core/Include/core_armv8mbl.h new file mode 100644 index 0000000..266f180 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_armv8mbl.h @@ -0,0 +1,1921 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MBL_H_GENERIC +#define __CORE_ARMV8MBL_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MBL + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M ( 2U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MBL_H_DEPENDANT +#define __CORE_ARMV8MBL_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MBL_REV + #define __ARMv8MBL_REV 0x0000U + #warning "__ARMv8MBL_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MBL */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_armv8mml.h b/Drivers/CMSIS/Core/Include/core_armv8mml.h new file mode 100644 index 0000000..ba5d83f --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_armv8mml.h @@ -0,0 +1,2835 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 12. September 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MML_H_GENERIC +#define __CORE_ARMV8MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS Armv8MML definitions */ +#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MML_H_DEPENDANT +#define __CORE_ARMV8MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MML_REV + #define __ARMv8MML_REV 0x0000U + #warning "__ARMv8MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm0.h b/Drivers/CMSIS/Core/Include/core_cm0.h new file mode 100644 index 0000000..70e4505 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm0.h @@ -0,0 +1,952 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 13. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M0 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t vectors = 0x0U; + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M0 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t vectors = 0x0U; + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm0plus.h b/Drivers/CMSIS/Core/Include/core_cm0plus.h new file mode 100644 index 0000000..fe7b424 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm0plus.h @@ -0,0 +1,1085 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 13. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t vectors = SCB->VTOR; +#else + uint32_t vectors = 0x0U; +#endif + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M0+ does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t vectors = SCB->VTOR; +#else + uint32_t vectors = 0x0U; +#endif + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm1.h b/Drivers/CMSIS/Core/Include/core_cm1.h new file mode 100644 index 0000000..44c2a49 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm1.h @@ -0,0 +1,979 @@ +/**************************************************************************//** + * @file core_cm1.h + * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File + * @version V1.0.1 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM1_H_GENERIC +#define __CORE_CM1_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M1 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM1 definitions */ +#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ + __CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (1U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM1_H_DEPENDANT +#define __CORE_CM1_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM1_REV + #define __CM1_REV 0x0100U + #warning "__CM1_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M1 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ + +#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M1 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M1 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm23.h b/Drivers/CMSIS/Core/Include/core_cm23.h new file mode 100644 index 0000000..49f4a5b --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm23.h @@ -0,0 +1,1996 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM23_H_GENERIC +#define __CORE_CM23_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M23 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ + __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (23U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM23_H_DEPENDANT +#define __CORE_CM23_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM23_REV + #define __CM23_REV 0x0000U + #warning "__CM23_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M23 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm3.h b/Drivers/CMSIS/Core/Include/core_cm3.h new file mode 100644 index 0000000..1f69e8b --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm3.h @@ -0,0 +1,1937 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 13. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M3 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (3U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200U + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1U]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ +#endif + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm33.h b/Drivers/CMSIS/Core/Include/core_cm33.h new file mode 100644 index 0000000..2f1d98e --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm33.h @@ -0,0 +1,2910 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM33_H_GENERIC +#define __CORE_CM33_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_FP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm35p.h b/Drivers/CMSIS/Core/Include/core_cm35p.h new file mode 100644 index 0000000..7d34367 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm35p.h @@ -0,0 +1,2910 @@ +/**************************************************************************//** + * @file core_cm35p.h + * @brief CMSIS Cortex-M35P Core Peripheral Access Layer Header File + * @version V1.0.0 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM35P_H_GENERIC +#define __CORE_CM35P_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M35P + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM35P definitions */ +#define __CM35P_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM35P_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM35P_CMSIS_VERSION ((__CM35P_CMSIS_VERSION_MAIN << 16U) | \ + __CM35P_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (35U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_FP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM35P_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM35P_H_DEPENDANT +#define __CORE_CM35P_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM35P_REV + #define __CM35P_REV 0x0000U + #warning "__CM35P_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M35P */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM35P_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm4.h b/Drivers/CMSIS/Core/Include/core_cm4.h new file mode 100644 index 0000000..90c2a72 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm4.h @@ -0,0 +1,2124 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 13. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M4 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ +#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M4 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_cm7.h b/Drivers/CMSIS/Core/Include/core_cm7.h new file mode 100644 index 0000000..3da3c43 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_cm7.h @@ -0,0 +1,2725 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V5.1.1 + * @date 28. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM7_H_GENERIC +#define __CORE_CM7_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M7 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (7U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM7_H_DEPENDANT +#define __CORE_CM7_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM7_REV + #define __CM7_REV 0x0000U + #warning "__CM7_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DTCM_PRESENT + #define __DTCM_PRESENT 0U + #warning "__DTCM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M7 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED3[93U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ + +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISDYNADD_Pos 26U /*!< ACTLR: DISDYNADD Position */ +#define SCnSCB_ACTLR_DISDYNADD_Msk (1UL << SCnSCB_ACTLR_DISDYNADD_Pos) /*!< ACTLR: DISDYNADD Mask */ + +#define SCnSCB_ACTLR_DISISSCH1_Pos 21U /*!< ACTLR: DISISSCH1 Position */ +#define SCnSCB_ACTLR_DISISSCH1_Msk (0x1FUL << SCnSCB_ACTLR_DISISSCH1_Pos) /*!< ACTLR: DISISSCH1 Mask */ + +#define SCnSCB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ +#define SCnSCB_ACTLR_DISDI_Msk (0x1FUL << SCnSCB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ + +#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ +#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (1UL << SCnSCB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ + +#define SCnSCB_ACTLR_DISBTACALLOC_Pos 14U /*!< ACTLR: DISBTACALLOC Position */ +#define SCnSCB_ACTLR_DISBTACALLOC_Msk (1UL << SCnSCB_ACTLR_DISBTACALLOC_Pos) /*!< ACTLR: DISBTACALLOC Mask */ + +#define SCnSCB_ACTLR_DISBTACREAD_Pos 13U /*!< ACTLR: DISBTACREAD Position */ +#define SCnSCB_ACTLR_DISBTACREAD_Msk (1UL << SCnSCB_ACTLR_DISBTACREAD_Pos) /*!< ACTLR: DISBTACREAD Mask */ + +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ +#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ + +#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED3[981U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ +#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = SCB->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## Cache functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_CacheFunctions Cache Functions + \brief Functions that configure Instruction and Data cache. + @{ + */ + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + +#define __SCB_DCACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ +#define __SCB_ICACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_FORCEINLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ + + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable I-Cache + \details Turns off I-Cache + */ +__STATIC_FORCEINLINE void SCB_DisableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache + */ +__STATIC_FORCEINLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief I-Cache Invalidate by address + \details Invalidates I-Cache for the given address. + I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + I-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] isize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (void *addr, int32_t isize) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + if ( isize > 0 ) { + int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_ICACHE_LINE_SIZE; + op_size -= __SCB_ICACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_FORCEINLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable D-Cache + \details Turns off D-Cache + */ +__STATIC_FORCEINLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_FORCEINLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address. + D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (void *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are cleaned. + \param[in] addr address + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + +/*@} end of CMSIS_Core_CacheFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_sc000.h b/Drivers/CMSIS/Core/Include/core_sc000.h new file mode 100644 index 0000000..f315013 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_sc000.h @@ -0,0 +1,1025 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC000_H_GENERIC +#define __CORE_SC000_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC000_H_DEPENDANT +#define __CORE_SC000_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC000_REV + #define __SC000_REV 0x0000U + #warning "__SC000_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC000 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + uint32_t RESERVED1[154U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the SC000 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M0 and M0+ do not require the architectural barrier - assume SC000 is the same */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/core_sc300.h b/Drivers/CMSIS/Core/Include/core_sc300.h new file mode 100644 index 0000000..ad031f2 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/core_sc300.h @@ -0,0 +1,1912 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 31. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC300_H_GENERIC +#define __CORE_SC300_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC3000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (300U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC300_H_DEPENDANT +#define __CORE_SC300_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC300_REV + #define __SC300_REV 0x0000U + #warning "__SC300_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC300 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED1[129U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t vectors = (uint32_t )SCB->VTOR; + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Core/Include/mpu_armv7.h b/Drivers/CMSIS/Core/Include/mpu_armv7.h new file mode 100644 index 0000000..337eb65 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/mpu_armv7.h @@ -0,0 +1,272 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.1.0 + * @date 08. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2017-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes + +#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access +#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only +#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only +#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access +#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only +#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Memory Access Attributes +* +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +*/ +#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ + ((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ + ((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \ + (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ + (((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ + (((MPU_RASR_ENABLE_Msk)))) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) + +/** +* MPU Memory Access Attribute for strongly ordered memory. +* - TEX: 000b +* - Shareable +* - Non-cacheable +* - Non-bufferable +*/ +#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) + +/** +* MPU Memory Access Attribute for device memory. +* - TEX: 000b (if shareable) or 010b (if non-shareable) +* - Shareable or non-shareable +* - Non-cacheable +* - Bufferable (if shareable) or non-bufferable (if non-shareable) +* +* \param IsShareable Configures the device memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) + +/** +* MPU Memory Access Attribute for normal memory. +* - TEX: 1BBb (reflecting outer cacheability rules) +* - Shareable or non-shareable +* - Cacheable or non-cacheable (reflecting inner cacheability rules) +* - Bufferable or non-bufferable (reflecting inner cacheability rules) +* +* \param OuterCp Configures the outer cache policy. +* \param InnerCp Configures the inner cache policy. +* \param IsShareable Configures the memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) + +/** +* MPU Memory Access Attribute non-cacheable policy. +*/ +#define ARM_MPU_CACHEP_NOCACHE 0U + +/** +* MPU Memory Access Attribute write-back, write and read allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_WRA 1U + +/** +* MPU Memory Access Attribute write-through, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WT_NWA 2U + +/** +* MPU Memory Access Attribute write-back, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_NWA 3U + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/Drivers/CMSIS/Core/Include/mpu_armv8.h b/Drivers/CMSIS/Core/Include/mpu_armv8.h new file mode 100644 index 0000000..2fe28b6 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/mpu_armv8.h @@ -0,0 +1,346 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU + * @version V5.1.0 + * @date 08. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2017-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + ((BASE & MPU_RBAR_BASE_Msk) | \ + ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +#if defined(MPU_RLAR_PXN_Pos) + +/** \brief Region Limit Address Register with PXN value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((PXN << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +#endif + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/Drivers/CMSIS/Core/Include/tz_context.h b/Drivers/CMSIS/Core/Include/tz_context.h new file mode 100644 index 0000000..d4c1474 --- /dev/null +++ b/Drivers/CMSIS/Core/Include/tz_context.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * @file tz_context.h + * @brief Context Management for Armv8-M TrustZone + * @version V1.0.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef TZ_CONTEXT_H +#define TZ_CONTEXT_H + +#include + +#ifndef TZ_MODULEID_T +#define TZ_MODULEID_T +/// \details Data type that identifies secure software modules called by a process. +typedef uint32_t TZ_ModuleId_t; +#endif + +/// \details TZ Memory ID identifies an allocated memory slot. +typedef uint32_t TZ_MemoryId_t; + +/// Initialize secure context memory system +/// \return execution status (1: success, 0: error) +uint32_t TZ_InitContextSystem_S (void); + +/// Allocate context memory for calling secure software modules in TrustZone +/// \param[in] module identifies software modules called from non-secure mode +/// \return value != 0 id TrustZone memory slot identifier +/// \return value 0 no memory available or internal error +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); + +/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); + +/// Load secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); + +/// Store secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); + +#endif // TZ_CONTEXT_H diff --git a/Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c b/Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c new file mode 100644 index 0000000..cde9ff0 --- /dev/null +++ b/Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c @@ -0,0 +1,58 @@ +/****************************************************************************** + * @file main_s.c + * @brief Code template for secure main function + * @version V1.1.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2013-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +/* Use CMSE intrinsics */ +#include + +#include "RTE_Components.h" +#include CMSIS_device_header + +/* TZ_START_NS: Start address of non-secure application */ +#ifndef TZ_START_NS +#define TZ_START_NS (0x200000U) +#endif + +/* typedef for non-secure callback functions */ +typedef void (*funcptr_void) (void) __attribute__((cmse_nonsecure_call)); + +/* Secure main() */ +int main(void) { + funcptr_void NonSecure_ResetHandler; + + /* Add user setup code for secure part here*/ + + /* Set non-secure main stack (MSP_NS) */ + __TZ_set_MSP_NS(*((uint32_t *)(TZ_START_NS))); + + /* Get non-secure reset handler */ + NonSecure_ResetHandler = (funcptr_void)(*((uint32_t *)((TZ_START_NS) + 4U))); + + /* Start non-secure state software application */ + NonSecure_ResetHandler(); + + /* Non-secure software does not return, this code is not executed */ + while (1) { + __NOP(); + } +} diff --git a/Drivers/CMSIS/Core/Template/ARMv8-M/tz_context.c b/Drivers/CMSIS/Core/Template/ARMv8-M/tz_context.c new file mode 100644 index 0000000..298bbf7 --- /dev/null +++ b/Drivers/CMSIS/Core/Template/ARMv8-M/tz_context.c @@ -0,0 +1,200 @@ +/****************************************************************************** + * @file tz_context.c + * @brief Context Management for Armv8-M TrustZone - Sample implementation + * @version V1.1.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2016-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "RTE_Components.h" +#include CMSIS_device_header +#include "tz_context.h" + +/// Number of process slots (threads may call secure library code) +#ifndef TZ_PROCESS_STACK_SLOTS +#define TZ_PROCESS_STACK_SLOTS 8U +#endif + +/// Stack size of the secure library code +#ifndef TZ_PROCESS_STACK_SIZE +#define TZ_PROCESS_STACK_SIZE 256U +#endif + +typedef struct { + uint32_t sp_top; // stack space top + uint32_t sp_limit; // stack space limit + uint32_t sp; // current stack pointer +} stack_info_t; + +static stack_info_t ProcessStackInfo [TZ_PROCESS_STACK_SLOTS]; +static uint64_t ProcessStackMemory[TZ_PROCESS_STACK_SLOTS][TZ_PROCESS_STACK_SIZE/8U]; +static uint32_t ProcessStackFreeSlot = 0xFFFFFFFFU; + + +/// Initialize secure context memory system +/// \return execution status (1: success, 0: error) +__attribute__((cmse_nonsecure_entry)) +uint32_t TZ_InitContextSystem_S (void) { + uint32_t n; + + if (__get_IPSR() == 0U) { + return 0U; // Thread Mode + } + + for (n = 0U; n < TZ_PROCESS_STACK_SLOTS; n++) { + ProcessStackInfo[n].sp = 0U; + ProcessStackInfo[n].sp_limit = (uint32_t)&ProcessStackMemory[n]; + ProcessStackInfo[n].sp_top = (uint32_t)&ProcessStackMemory[n] + TZ_PROCESS_STACK_SIZE; + *((uint32_t *)ProcessStackMemory[n]) = n + 1U; + } + *((uint32_t *)ProcessStackMemory[--n]) = 0xFFFFFFFFU; + + ProcessStackFreeSlot = 0U; + + // Default process stack pointer and stack limit + __set_PSPLIM((uint32_t)ProcessStackMemory); + __set_PSP ((uint32_t)ProcessStackMemory); + + // Privileged Thread Mode using PSP + __set_CONTROL(0x02U); + + return 1U; // Success +} + + +/// Allocate context memory for calling secure software modules in TrustZone +/// \param[in] module identifies software modules called from non-secure mode +/// \return value != 0 id TrustZone memory slot identifier +/// \return value 0 no memory available or internal error +__attribute__((cmse_nonsecure_entry)) +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module) { + uint32_t slot; + + (void)module; // Ignore (fixed Stack size) + + if (__get_IPSR() == 0U) { + return 0U; // Thread Mode + } + + if (ProcessStackFreeSlot == 0xFFFFFFFFU) { + return 0U; // No slot available + } + + slot = ProcessStackFreeSlot; + ProcessStackFreeSlot = *((uint32_t *)ProcessStackMemory[slot]); + + ProcessStackInfo[slot].sp = ProcessStackInfo[slot].sp_top; + + return (slot + 1U); +} + + +/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +__attribute__((cmse_nonsecure_entry)) +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id) { + uint32_t slot; + + if (__get_IPSR() == 0U) { + return 0U; // Thread Mode + } + + if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) { + return 0U; // Invalid ID + } + + slot = id - 1U; + + if (ProcessStackInfo[slot].sp == 0U) { + return 0U; // Inactive slot + } + ProcessStackInfo[slot].sp = 0U; + + *((uint32_t *)ProcessStackMemory[slot]) = ProcessStackFreeSlot; + ProcessStackFreeSlot = slot; + + return 1U; // Success +} + + +/// Load secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +__attribute__((cmse_nonsecure_entry)) +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id) { + uint32_t slot; + + if ((__get_IPSR() == 0U) || ((__get_CONTROL() & 2U) == 0U)) { + return 0U; // Thread Mode or using Main Stack for threads + } + + if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) { + return 0U; // Invalid ID + } + + slot = id - 1U; + + if (ProcessStackInfo[slot].sp == 0U) { + return 0U; // Inactive slot + } + + // Setup process stack pointer and stack limit + __set_PSPLIM(ProcessStackInfo[slot].sp_limit); + __set_PSP (ProcessStackInfo[slot].sp); + + return 1U; // Success +} + + +/// Store secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +__attribute__((cmse_nonsecure_entry)) +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id) { + uint32_t slot; + uint32_t sp; + + if ((__get_IPSR() == 0U) || ((__get_CONTROL() & 2U) == 0U)) { + return 0U; // Thread Mode or using Main Stack for threads + } + + if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) { + return 0U; // Invalid ID + } + + slot = id - 1U; + + if (ProcessStackInfo[slot].sp == 0U) { + return 0U; // Inactive slot + } + + sp = __get_PSP(); + if ((sp < ProcessStackInfo[slot].sp_limit) || + (sp > ProcessStackInfo[slot].sp_top)) { + return 0U; // SP out of range + } + ProcessStackInfo[slot].sp = sp; + + // Default process stack pointer and stack limit + __set_PSPLIM((uint32_t)ProcessStackMemory); + __set_PSP ((uint32_t)ProcessStackMemory); + + return 1U; // Success +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/CMakeLists.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/CMakeLists.txt new file mode 100644 index 0000000..e7ceca2 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/CMakeLists.txt @@ -0,0 +1,136 @@ +cmake_minimum_required (VERSION 3.6) +cmake_policy(SET CMP0077 NEW) +# The tests are assuming that MATRIX_CHECK is enabled when building +# CMSIS-DSP. +set(MATRIXCHECK ON) +set(FASTMATHCOMPUTATIONS OFF) +option(DUMPPATTERN "Dump test patterns when test is failing" ON) + +option(CUSTOMIZE_TESTS "Enable customizations of tests" ON) +option(BASICMATH_TESTS "Enable Basic Math testing" ON) +option(COMPLEXMATH_TESTS "Enable Complex Math testing" ON) +option(CONTROLLER_TESTS "Enable Controller testing" ON) +option(FASTMATH_TESTS "Enable Fast Math testing" ON) +option(INTRINSICS_TESTS "Enable Intrinsics testing" ON) +option(FILTERING_TESTS "Enable Filtering testing" ON) +option(MATRIX_TESTS "Enable Matrix testing" ON) +option(STATISTICS_TESTS "Enable Statistics testing" ON) +option(SUPPORT_TESTS "Enable Support testing" ON) +option(TRANSFORM_TESTS "Enable Transform testing" ON) + + +project(DSP_Lib_TestSuite) + +# Needed to find the config modules +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/..) + + +set(ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../..) + + +file(GLOB MAIN "Common/src/*.c") +file(GLOB BASICMATH_TESTS_SRC "Common/src/basic_math_tests/*.c") +file(GLOB COMPLEXMATH_TESTS_SRC "Common/src/complex_math_tests/*.c") +file(GLOB CONTROLLER_TESTS_SRC "Common/src/controller_tests/*.c") +file(GLOB FASTMATH_TESTS_SRC "Common/src/fast_math_tests/*.c") +file(GLOB FILTERING_TESTS_SRC "Common/src/filtering_tests/*.c") +file(GLOB INTRINSINCS_TESTS_SRC "Common/src/intrinsics_tests/*.c") +file(GLOB MATRIX_TESTS_SRC "Common/src/matrix_tests/*.c") +file(GLOB STATISTICS_TESTS_SRC "Common/src/statistics_tests/*.c") +file(GLOB SUPPORT_TESTS_SRC "Common/src/support_tests/*.c") +file(GLOB TRANSFORM_TESTS_SRC "Common/src/transform_tests/*.c") +file(GLOB JTEST_MAIN "Common/JTest/src/*.c") + +set(TESTSRC ${MAIN} + ${BASICMATH_TESTS_SRC} + ${COMPLEXMATH_TESTS_SRC} + ${CONTROLLER_TESTS_SRC} + ${FASTMATH_TESTS_SRC} + ${FILTERING_TESTS_SRC} + ${INTRINSINCS_TESTS_SRC} + ${MATRIX_TESTS_SRC} + ${STATISTICS_TESTS_SRC} + ${SUPPORT_TESTS_SRC} + ${TRANSFORM_TESTS_SRC} + ${JTEST_MAIN} + ) + +set(JINCS + Common/JTest/inc + Common/JTest/inc/arr_desc + Common/inc/basic_math_tests + Common/inc/complex_math_tests + Common/inc/controller_tests + Common/inc/fast_math_tests + Common/inc/filtering_tests + Common/inc/intrinsics_tests + Common/inc/matrix_tests + Common/inc/statistics_tests + Common/inc/support_tests + Common/inc/transform_tests + ) + +add_subdirectory(../Source bin_dsp) +add_subdirectory(RefLibs bin_ref) + + +add_executable(DSP_Lib_TestSuite) + +if (CUSTOMIZE_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE CUSTOMIZE_TESTS) +endif() + +if (BASICMATH_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_BASICMATH_TESTS) +endif() +if (COMPLEXMATH_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_COMPLEXMATH_TESTS) +endif() +if (CONTROLLER_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_CONTROLLER_TESTS) +endif() +if (FASTMATH_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_FASTMATH_TESTS) +endif() +if (FILTERING_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_FILTERING_TESTS) +endif() +if (INTRINSICS_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_INTRINSICS_TESTS) +endif() +if (MATRIX_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_MATRIX_TESTS) +endif() +if (STATISTICS_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_STATISTICS_TESTS) +endif() +if (SUPPORT_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_SUPPORT_TESTS) +endif() +if (TRANSFORM_TESTS) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE ENABLE_TRANSFORM_TESTS) +endif() + + +if (DUMPPATTERN) + target_compile_definitions(DSP_Lib_TestSuite PRIVATE DUMPPATTERN) +endif() + +# Change behavior of configBoot for scatter file +set(TESTFRAMEWORK ON) + +include(configBoot) + +file(COPY ${ROOT}/CMSIS/DSP/Examples/ARM/boot/RTE_Components.h DESTINATION tempLink) + +target_link_libraries(DSP_Lib_TestSuite PRIVATE CMSISDSP) +target_link_libraries(DSP_Lib_TestSuite PRIVATE DspRefLibs) + +target_sources(DSP_Lib_TestSuite PRIVATE ${TESTSRC}) + +### Includes +target_include_directories(DSP_Lib_TestSuite PRIVATE "Common/inc") +target_include_directories(DSP_Lib_TestSuite PRIVATE "Common/inc/templates") +target_include_directories(DSP_Lib_TestSuite PRIVATE ${JINCS}) + + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/arr_desc/arr_desc.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/arr_desc/arr_desc.h new file mode 100644 index 0000000..effab26 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/arr_desc/arr_desc.h @@ -0,0 +1,220 @@ +#ifndef _ARR_DESC_H_ +#define _ARR_DESC_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ +#include +#include /* memset() */ +#include "../util/util.h" /* CONCAT() */ + +/*--------------------------------------------------------------------------------*/ +/* Type Definitions */ +/*--------------------------------------------------------------------------------*/ + +/** + * Array-descriptor struct. + */ +typedef struct ARR_DESC_struct +{ + void * data_ptr; /* Pointer to the array contents. */ + int32_t element_count; /* Number of current elements. */ + int32_t element_size; /* Size of current elements in bytes. */ + int32_t underlying_size; /* Size of underlying array in bytes. */ +} ARR_DESC_t; + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Prefix of the array variable's name when creating an array and an array + * descriptor at the same time. + */ +#define ARR_DESC_ARR_PREFIX ARR_DESC_ARR_ + +/** + * Evaluate to the array variable's name when creating an array and an array + * descriptor at the same time. + */ +#define ARR_DESC_ARR_NAME(name) \ + CONCAT(ARR_DESC_ARR_PREFIX, name) + +/** + * Define an #ARR_DESC_t by itself. + * + * @note The user must supply an array to store the data used by the + * #ARR_DESC_t. + */ +#define ARR_DESC_INTERNAL_DEFINE(name, data_ptr, \ + element_count, element_size) \ + ARR_DESC_t name = { \ + data_ptr, \ + element_count, \ + element_size, \ + element_count * element_size \ + } \ + +/** + * Define both an array and an #ARR_DESC_t that describes it. + * + * @note Use the #CURLY() macro for the content field; it provides the curly + * braces necessary for an array initialization. + */ +#define ARR_DESC_DEFINE(type, name, element_count, content) \ + type ARR_DESC_ARR_NAME(name)[element_count] = content; \ + ARR_DESC_INTERNAL_DEFINE(name, \ + &ARR_DESC_ARR_NAME(name), \ + element_count, \ + sizeof(type)) /* Note the lacking semicolon */ + +/** + * Create a #ARR_DESC_t which refers to a subset of the data in another. + * + * The new #ARR_DESC_t shares the same underlying array as the aliased + * #ARR_DESC_t, but only describes a subset of the originals values. + */ +#define ARR_DESC_DEFINE_SUBSET(name, original, element_cnt) \ + ARR_DESC_INTERNAL_DEFINE(name, \ + &ARR_DESC_ARR_NAME(original), \ + element_cnt, \ + sizeof(ARR_DESC_ARR_NAME(original)[0]) \ + ) /* Note the lacking semicolon */ + +/** + * Creat an #ARR_DESC_t which points to the data in an existing array. + * + * @param start_idx Offset in array_ptr of first element. + * @param element_cnt Number of elements to include in the #ARR_DESC_t. + * + * @example + * + * float my_floats[4] = {0.0f, 1.0f, 2.0f, 3.0f}; + * + * ARR_DESC_DEFINE_USING_ARR(my_arr_desc, my_floats, 1, 3); + * + * printf("Element 0: %f\n", ARR_DESC_ELT(float, 0, &my_arr_desc)); + * printf("Element 1: %f\n", ARR_DESC_ELT(float, 1, &my_arr_desc)); + * + * Outputs: + * + * Element 0: 1.000000 + * Element 1: 2.000000 + * + * @warning There are no checks in place to catch invalid start indices; This + * is left to the user. + */ +#define ARR_DESC_DEFINE_USING_ARR(type, name, array_ptr, start_idx, element_cnt) \ + ARR_DESC_INTERNAL_DEFINE( \ + name, \ + (type *) (array_ptr + start_idx), \ + element_cnt, \ + sizeof(type) \ + ) /* Note the lacking semicolon*/ + +/** + * Declare an #ARR_DESC_t object. + */ +#define ARR_DESC_DECLARE(name) \ + extern ARR_DESC_t name /* Note the lacking semicolon */ + +/** + * Evaluate to the number of bytes stored in the #ARR_DESC_t. + */ +#define ARR_DESC_BYTES(arr_desc_ptr) \ + ((arr_desc_ptr)->element_count * (arr_desc_ptr)->element_size) + +/** + * Set the contents of #ARR_DESC_t to value. + */ +#define ARR_DESC_MEMSET(arr_desc_ptr, value, bytes) \ + do \ + { \ + memset((arr_desc_ptr)->data_ptr, \ + value, \ + BOUND(0, \ + (arr_desc_ptr)->underlying_size, \ + bytes) \ + ); \ + } while (0) + +/** + * Perform a memcpy of 'bytes' bytes from the source #ARR_DESC_t to the + * destination #ARR_DESC_t. + */ +#define ARR_DESC_MEMCPY(arr_desc_dest_ptr, arr_desc_src_ptr, bytes) \ + do \ + { \ + memcpy((arr_desc_dest_ptr)->data_ptr, \ + (arr_desc_src_ptr)->data_ptr, \ + BOUND(0, \ + (arr_desc_dest_ptr)->underlying_size, \ + bytes)); \ + } while (0) + +/** + * Evaluate to true if the source #ARR_DESC_t contents will fit into the + * destination #ARR_DESC_t and false otherwise. + */ +#define ARR_DESC_COPYABLE(arr_desc_dest_ptr, arr_desc_src_ptr) \ + (ARR_DESC_BYTES(arr_desc_src_ptr) <= \ + (arr_desc_dest_ptr)->underlying_size) + +/** + * Copy all the data from the source #ARR_DESC_t to the destination + * #ARR_DESC_t. + * + * @note If the destination #ARR_DESC_t is too small to fit the source data the + * copy is aborted and nothing happens. + */ +#define ARR_DESC_COPY(arr_desc_dest_ptr, arr_desc_src_ptr) \ + do \ + { \ + if (ARR_DESC_COPYABLE(arr_desc_dest_ptr, \ + arr_desc_src_ptr)) \ + { \ + ARR_DESC_MEMCPY(arr_desc_dest_ptr, \ + arr_desc_src_ptr, \ + ARR_DESC_BYTES(arr_desc_src_ptr)); \ + /* Update the properties*/ \ + (arr_desc_dest_ptr)->element_count = \ + (arr_desc_src_ptr)->element_count; \ + (arr_desc_dest_ptr)->element_size = \ + (arr_desc_src_ptr)->element_size; \ + } \ + } while (0) + +/** + * Compare the data in two #ARR_DESC_t structs for the specified number of + * bytes. + */ +#define ARR_DESC_MEMCMP(arr_desc_ptr_a, arr_desc_ptr_b, bytes) \ + memcmp((arr_desc_ptr_a)->data_ptr, \ + (arr_desc_ptr_b)->data_ptr, \ + bytes) /* Note the lacking semicolon */ \ + +/** + * Zero out the contents of the #ARR_DESC_t. + */ +#define ARR_DESC_ZERO(arr_desc_ptr) \ + ARR_DESC_MEMSET(arr_desc_ptr, \ + 0, \ + (arr_desc_ptr)->underlying_size) + +/** + * Evaluate to the data address in #ARR_DESC_t at offset. + */ +#define ARR_DESC_DATA_ADDR(type, arr_desc_ptr, offset) \ + ((void*)(((type *) \ + ((arr_desc_ptr)->data_ptr)) \ + + offset)) + +/** + * Evaluate to the element in #ARR_DESC_t with type at idx. + */ +#define ARR_DESC_ELT(type, idx, arr_desc_ptr) \ + (*((type *) ARR_DESC_DATA_ADDR(type, \ + arr_desc_ptr, \ + idx))) + +#endif /* _ARR_DESC_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest.h new file mode 100644 index 0000000..9d0af06 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest.h @@ -0,0 +1,17 @@ +#ifndef _JTEST_H_ +#define _JTEST_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "jtest_fw.h" +#include "jtest_test.h" +#include "jtest_test_define.h" +#include "jtest_test_call.h" +#include "jtest_group.h" +#include "jtest_group_define.h" +#include "jtest_group_call.h" +#include "jtest_cycle.h" + +#endif /* _JTEST_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_cycle.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_cycle.h new file mode 100644 index 0000000..96d13cd --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_cycle.h @@ -0,0 +1,79 @@ +#ifndef _JTEST_CYCLE_H_ +#define _JTEST_CYCLE_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "jtest_fw.h" /* JTEST_DUMP_STRF() */ +#include "jtest_systick.h" +#include "jtest_util.h" /* STR() */ + +/*--------------------------------------------------------------------------------*/ +/* Declare Module Variables */ +/*--------------------------------------------------------------------------------*/ +extern const char * JTEST_CYCLE_STRF; + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Wrap the function call, fn_call, to count execution cycles and display the + * results. + */ +/* skipp function name + param +#define JTEST_COUNT_CYCLES(fn_call) \ + do \ + { \ + uint32_t __jtest_cycle_end_count; \ + \ + JTEST_SYSTICK_RESET(SysTick); \ + JTEST_SYSTICK_START(SysTick); \ + \ + fn_call; \ + \ + __jtest_cycle_end_count = \ + JTEST_SYSTICK_VALUE(SysTick); \ + \ + JTEST_SYSTICK_RESET(SysTick); \ + JTEST_DUMP_STRF(JTEST_CYCLE_STRF, \ + STR(fn_call), \ + (JTEST_SYSTICK_INITIAL_VALUE - \ + __jtest_cycle_end_count)); \ + } while (0) +*/ +#ifndef ARMv7A + +#define JTEST_COUNT_CYCLES(fn_call) \ + do \ + { \ + uint32_t __jtest_cycle_end_count; \ + \ + JTEST_SYSTICK_RESET(SysTick); \ + JTEST_SYSTICK_START(SysTick); \ + \ + fn_call; \ + \ + __jtest_cycle_end_count = \ + JTEST_SYSTICK_VALUE(SysTick); \ + \ + JTEST_SYSTICK_RESET(SysTick); \ + JTEST_DUMP_STRF(JTEST_CYCLE_STRF, \ + (JTEST_SYSTICK_INITIAL_VALUE - \ + __jtest_cycle_end_count)); \ + } while (0) + +#else +/* TODO */ +#define JTEST_COUNT_CYCLES(fn_call) \ + do \ + { \ + fn_call; \ + } while (0) + +#endif + +#endif /* _JTEST_CYCLE_H_ */ + + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_define.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_define.h new file mode 100644 index 0000000..cbec329 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_define.h @@ -0,0 +1,37 @@ +#ifndef _JTEST_DEFINE_H_ +#define _JTEST_DEFINE_H_ + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Makes a symbol for use as a struct name. Names made this way have two parts; + * the first parts is a prefix common to all structs of that class. The second + * is a specifier which differs for each instance of that struct type. + */ +#define JTEST_STRUCT_NAME(prefix, specifier) \ + CONCAT(prefix, specifier) + +/** + * Define a struct with type with a name generated by #JTEST_STRUCT_NAME(). + */ +#define JTEST_DEFINE_STRUCT(type, struct_name) \ + type struct_name + +/** + * Declare a struct with type with a name generated by #JTEST_STRUCT_NAME(). + */ +#define JTEST_DECLARE_STRUCT(struct_definition) \ + extern struct_definition + +/** + * Define and initialize a struct (created with JTEST_DEFINE_STRUCT()) and + * initialize it with init_values. + */ +#define JTEST_INIT_STRUCT(struct_definition, init_values) \ + struct_definition = { \ + init_values \ + } + +#endif /* _JTEST_DEFINE_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h new file mode 100644 index 0000000..8c6df9d --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_fw.h @@ -0,0 +1,282 @@ +#ifndef _JTEST_FW_H_ +#define _JTEST_FW_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include /* int32_t */ +#include /* strcpy() */ +#include /* sprintf() */ +#include "jtest_pf.h" /* Extend JTEST_FW_t with Pass/Fail data */ +#include "jtest_group.h" + +/*--------------------------------------------------------------------------------*/ +/* Type Definitions */ +/*--------------------------------------------------------------------------------*/ + +/** + * A struct used to interface with the Keil Debugger. + */ +typedef struct JTEST_FW_struct +{ + /* Action Triggers: The Keil debugger monitors these values for changes. In + * response to a change, the debugger executes code on the host. */ + volatile int32_t test_start; + volatile int32_t test_end; + volatile int32_t group_start; + volatile int32_t group_end; + volatile int32_t dump_str; + volatile int32_t dump_data; + volatile int32_t exit_fw; + + JTEST_GROUP_t * current_group_ptr; + + /* Buffers: The C-code cannot send strings and data directly to the + * debugging framework. Instead, the debugger can be told to read 128 byte + * (by default) chunks of memory. Data received in this manner requires + * post-processing to be legible.*/ + char * str_buffer; + char * data_buffer; + + /* Pass/Fail Data */ + JTEST_PF_MEMBERS; + +} JTEST_FW_t; + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Default name for the JTEST_FW struct. + * + * Define your own if you want the variable containing the #JTEST_FW_t to have + * a different name. + */ +#ifndef JTEST_FW +#define JTEST_FW JTEST_FW +#endif + +/** + * Default name for the JTEST_FW_STR_BUFFER. + * + * Define your own if you want the variable containing the char buffer to have + * a different name. + */ +#ifndef JTEST_FW_STR_BUFFER +#define JTEST_FW_STR_BUFFER JTEST_FW_STR_BUFFER +#endif + +/** + * Size of the #JTEST_FW_t, output string-buffer. + * + * If you change this value, make sure the "dump_str_fn" and "dump_data_fn" + * functions in jtest_fns.ini uses the same size. If you aren't sure, read the + * documentation Keil Debugger Command 'DISPLAY'. + */ +#define JTEST_BUF_SIZE 256 + + +/** + * The maximum number of bytes output at once using #JTEST_DUMP_STRF(). + */ +#define JTEST_STR_MAX_OUTPUT_SIZE 128 + +/** + * The maximum number of block transimissions needed to send a string from a + * buffer with JTEST_BUF_SIZE. + */ +#define JTEST_STR_MAX_OUTPUT_SEGMENTS \ + (JTEST_BUF_SIZE / JTEST_STR_MAX_OUTPUT_SIZE) + +/** + * Initialize the JTEST framework. + */ +#define JTEST_INIT() \ + do \ + { \ + JTEST_FW.str_buffer = JTEST_FW_STR_BUFFER; \ + } while (0) + +/* Debugger Action-triggering Macros */ +/*--------------------------------------------------------------------------------*/ + +/** + * Dispatch macro to trigger various actions in the Keil Debugger. + */ +#define JTEST_TRIGGER_ACTION(action_name) \ + do \ + { \ + action_name(); \ + } while (0) + +/** + * Trigger the "Test Start" action in the Keil Debugger. + */ +#define JTEST_ACT_TEST_START() \ + JTEST_TRIGGER_ACTION(test_start) + +/** + * Trigger the "Test End" action in the Keil Debugger. + */ +#define JTEST_ACT_TEST_END() \ + JTEST_TRIGGER_ACTION(test_end) + + +/** + * Trigger the "Group Start" action in the Keil Debugger. + */ +#define JTEST_ACT_GROUP_START() \ + JTEST_TRIGGER_ACTION(group_start) + +/** + * Trigger the "Group End" action in the Keil Debugger. + */ +#define JTEST_ACT_GROUP_END() \ + JTEST_TRIGGER_ACTION(group_end) + + +/** + * Fill the buffer named buf_name with value and dump it to the Keil debugger + * using action. + */ +#if defined(ARMv7A) || defined(FILEIO) + +#define JTEST_ACT_DUMP(action, buf_name, value) \ + do \ + { \ + JTEST_CLEAR_BUFFER(buf_name); \ + printf("%s",value); \ + strcpy(JTEST_FW.buf_name, (value)); \ + JTEST_TRIGGER_ACTION(action); \ + } while (0) + +#else + +#define JTEST_ACT_DUMP(action, buf_name, value) \ + do \ + { \ + JTEST_CLEAR_BUFFER(buf_name); \ + strcpy(JTEST_FW.buf_name, (value)); \ + JTEST_TRIGGER_ACTION(action); \ + } while (0) + +#endif +/** + * Trigger the "Exit Framework" action in the Keil Debugger. + */ +#define JTEST_ACT_EXIT_FW() \ + do \ + { \ + JTEST_TRIGGER_ACTION(exit_fw); \ + } while (0) + + +/* Buffer Manipulation Macros */ +/*--------------------------------------------------------------------------------*/ + +/** + * Clear the JTEST_FW buffer with name buf_name. + */ +#define JTEST_CLEAR_BUFFER(buf_name) \ + do \ + { \ + memset(JTEST_FW.buf_name, 0, JTEST_BUF_SIZE); \ + } while (0) + +/** + * Clear the memory needed for the JTEST_FW's string buffer. + */ +#define JTEST_CLEAR_STR_BUFFER() \ + JTEST_CLEAR_BUFFER(str_buffer) + +/** + * Clear the memory needed for the JTEST_FW's data buffer. + */ +#define JTEST_CLEAR_DATA_BUFFER() \ + JTEST_CLEAR_BUFFER(data_buffer) + +/** + * Dump the given string to the Keil Debugger. + */ +#define JTEST_DUMP_STR(string) \ + JTEST_ACT_DUMP(dump_str, str_buffer, string) + +/** + * Dump a formatted string to the Keil Debugger. + */ +#if defined(ARMv7A) || defined(FILEIO) + +#define JTEST_DUMP_STRF(format_str, ... ) \ + do \ + { \ + JTEST_CLEAR_STR_BUFFER(); \ + sprintf(JTEST_FW.str_buffer,format_str, __VA_ARGS__); \ + printf("%s",JTEST_FW.str_buffer); \ + jtest_dump_str_segments(); \ + } while (0) + +#else + +#define JTEST_DUMP_STRF(format_str, ... ) \ + do \ + { \ + JTEST_CLEAR_STR_BUFFER(); \ + sprintf(JTEST_FW.str_buffer,format_str, __VA_ARGS__); \ + jtest_dump_str_segments(); \ + } while (0) + +#endif + +/* Pass/Fail Macros */ +/*--------------------------------------------------------------------------------*/ + +/** + * Increment the number of passed tests in #JTEST_FW. + */ +#define JTEST_FW_INC_PASSED(amount) \ + JTEST_PF_INC_PASSED(&JTEST_FW, amount) + +/** + * Increment the number of passed tests in #JTEST_FW. + */ +#define JTEST_FW_INC_FAILED(amount) \ + JTEST_PF_INC_FAILED(&JTEST_FW, amount) + +/* Manipulating the Current Group */ +/*--------------------------------------------------------------------------------*/ + +/** + * Evaluate to the current_group_ptr in #JTEST_FW. + */ +#define JTEST_CURRENT_GROUP_PTR() \ + (JTEST_FW.current_group_ptr) + +#define JTEST_SET_CURRENT_GROUP(group_ptr) \ + do \ + { \ + JTEST_CURRENT_GROUP_PTR() = group_ptr; \ + } while (0) + +/*--------------------------------------------------------------------------------*/ +/* Declare Global Variables */ +/*--------------------------------------------------------------------------------*/ +extern char JTEST_FW_STR_BUFFER[JTEST_BUF_SIZE]; +extern volatile JTEST_FW_t JTEST_FW; + +/*--------------------------------------------------------------------------------*/ +/* Function Prototypes */ +/*--------------------------------------------------------------------------------*/ +void jtest_dump_str_segments(void); + +void test_start (void); +void test_end (void); +void group_start (void); +void group_end (void); +void dump_str (void); +void dump_data (void); +void exit_fw (void); + + +#endif /* _JTEST_FW_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group.h new file mode 100644 index 0000000..3b37ae4 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group.h @@ -0,0 +1,66 @@ +#ifndef _JTEST_GROUP_H_ +#define _JTEST_GROUP_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "jtest_pf.h" +#include "jtest_util.h" + +/*--------------------------------------------------------------------------------*/ +/* Type Definitions */ +/*--------------------------------------------------------------------------------*/ + +/** + * A struct which represents a group of #JTEST_TEST_t structs. This struct is + * used to run the group of tests, and report on their outcomes. + */ +typedef struct JTEST_GROUP_struct +{ + void (* group_fn_ptr) (void); /**< Pointer to the test group */ + char * name_str; /**< Name of the group */ + + /* Extend the #JTEST_GROUP_t with Pass/Fail information.*/ + JTEST_PF_MEMBERS; +} JTEST_GROUP_t; + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Set the name of JTEST_GROUP_t. + */ +#define JTEST_GROUP_SET_NAME(group_ptr, name) \ + JTEST_SET_STRUCT_ATTRIBUTE(group_ptr, name_str, name) + +#define JTEST_GROUP_SET_FN(group_ptr, fn_ptr) \ + JTEST_SET_STRUCT_ATTRIBUTE(group_ptr, group_fn_ptr, fn_ptr) + +/** + * Increment the number of tests passed in the JTEST_GROUP_t pointed to by + * group_ptr. + */ +#define JTEST_GROUP_INC_PASSED(group_ptr, amount) \ + JTEST_PF_INC_PASSED(group_ptr, amount) + +/** + * Increment the number of tests failed in the JTEST_GROUP_t pointed to by + * group_ptr. + */ +#define JTEST_GROUP_INC_FAILED(group_ptr, amount) \ + JTEST_PF_INC_FAILED(group_ptr, amount) + +/** + * Reset the pass/fail information of the #JTEST_GROUP_t pointed to by + * group_ptr. + */ +#define JTEST_GROUP_RESET_PF(group_ptr) \ + do \ + { \ + JTEST_PF_RESET_PASSED(group_ptr); \ + JTEST_PF_RESET_FAILED(group_ptr); \ + } while (0) + +#endif /* _JTEST_GROUP_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group_call.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group_call.h new file mode 100644 index 0000000..d565a4c --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group_call.h @@ -0,0 +1,126 @@ +#ifndef _JTEST_GROUP_CALL_H_ +#define _JTEST_GROUP_CALL_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "jtest_fw.h" +#include + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Execute the test in the #JTEST_GROUP_t struct associated witht he identifier + * group_fn. + */ +#define JTEST_GROUP_RUN(group_fn) \ + do \ + { \ + JTEST_DUMP_STR("Group Name:\n"); \ + JTEST_DUMP_STR(JTEST_GROUP_STRUCT_NAME(group_fn).name_str); \ + JTEST_GROUP_STRUCT_NAME(group_fn).group_fn_ptr(); \ + } while (0) + + +/** + * Update the enclosing #JTEST_GROUP_t's pass/fail information using the + * current #JTEST_GROUP_t's. + * + * @param group_ptr Pointer to the current #JTEST_GROUP_t. + * @param parent_ptr Pointer to the enclosing #JTEST_GROUP_t. + * + * @warning Only run this if the current #JTEST_GROUP_t is being called within + * the context of another #JTEST_GROUP_t. + */ +#define JTEST_GROUP_UPDATE_PARENT_GROUP_PF(group_ptr, parent_group_ptr) \ + do \ + { \ + JTEST_GROUP_INC_PASSED(parent_group_ptr, \ + (group_ptr)->passed); \ + JTEST_GROUP_INC_FAILED(parent_group_ptr, \ + (group_ptr)->failed); \ + } while (0) + +/** + * Update the #JTEST_FW's pass/fail information using the current + * #JTEST_GROUP_t's. + */ +#define JTEST_GROUP_UPDATE_FW_PF(group_ptr) \ + do \ + { \ + JTEST_FW_INC_PASSED((group_ptr)->passed); \ + JTEST_FW_INC_FAILED((group_ptr)->failed); \ + } while (0) + +/** + * Update the enclosing context with the current #JTEST_GROUP_t's pass/fail + * information. If this group isn't in an enclosing group, it updates the + * #JTEST_FW's pass/fail info by default. + */ +#define JTEST_GROUP_UPDATE_PARENT_GROUP_OR_FW_PF(group_ptr, \ + parent_group_ptr) \ + do \ + { \ + /* Update the pass fail counts in the parent group */ \ + if (parent_group_ptr /* Null implies Top*/) \ + { \ + JTEST_GROUP_UPDATE_PARENT_GROUP_PF( \ + group_ptr, \ + parent_group_ptr); \ + } else { \ + JTEST_GROUP_UPDATE_FW_PF( \ + group_ptr); \ + } \ + } while (0) + +/** + * Dump the results of running the #JTEST_GROUP_t to the Keil Debugger. + */ +#define JTEST_GROUP_DUMP_RESULTS(group_ptr) \ + do \ + { \ + JTEST_DUMP_STRF( \ + "Tests Run: %" PRIu32 "\n" \ + "----------\n" \ + " Passed: %" PRIu32 "\n" \ + " Failed: %" PRIu32 "\n", \ + (group_ptr)->passed + (group_ptr)->failed, \ + (group_ptr)->passed, \ + (group_ptr)->failed); \ + } while (0) + +/** + * Call the #JTEST_GROUP_t associated with the identifier group_fn. + */ +#define JTEST_GROUP_CALL(group_fn) \ + do \ + { /* Save the current group from JTEST_FW_t before swapping */ \ + /* it to this group (in order to restore it later )*/ \ + JTEST_GROUP_t * __jtest_temp_group_ptr = \ + JTEST_CURRENT_GROUP_PTR(); \ + JTEST_SET_CURRENT_GROUP(&JTEST_GROUP_STRUCT_NAME(group_fn)); \ + \ + /* Reset this group's pass/fail count. Each group */ \ + /* should only remember counts for its last execution. */ \ + JTEST_GROUP_RESET_PF(JTEST_CURRENT_GROUP_PTR()); \ + \ + /* Run the current group */ \ + JTEST_ACT_GROUP_START(); \ + JTEST_GROUP_RUN(group_fn); \ + JTEST_ACT_GROUP_END(); \ + \ + /* Update the pass fail counts in the parent group (or FW) */ \ + JTEST_GROUP_UPDATE_PARENT_GROUP_OR_FW_PF( \ + JTEST_CURRENT_GROUP_PTR(), \ + __jtest_temp_group_ptr); \ + \ + JTEST_GROUP_DUMP_RESULTS(JTEST_CURRENT_GROUP_PTR()); \ + \ + /* Restore the previously current group */ \ + JTEST_SET_CURRENT_GROUP(__jtest_temp_group_ptr); \ + } while (0) + +#endif /* _JTEST_GROUP_CALL_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group_define.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group_define.h new file mode 100644 index 0000000..b3a86c0 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_group_define.h @@ -0,0 +1,87 @@ +#ifndef _JTEST_GROUP_DEFINE_H_ +#define _JTEST_GROUP_DEFINE_H_ + + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "jtest_util.h" +#include "jtest_define.h" +#include "jtest_group.h" + +/* For defining macros with optional arguments */ +#include "opt_arg/opt_arg.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Prefix for all #JTEST_GROUP_t structs. + */ +#define JTEST_GROUP_STRUCT_NAME_PREFIX G_JTEST_GROUP_STRUCT_ + +/** + * Define test template used by #JTEST_GROUP_t tests. + */ +#define JTEST_GROUP_FN_TEMPLATE(group_fn) \ + void group_fn(void) + +#define JTEST_GROUP_FN_PROTOTYPE JTEST_GROUP_FN_TEMPLATE /**< Alias for + #JTEST_GROUP_FN_TEMPLATE. */ + +/** + * Evaluate to the name of the #JTEST_GROUP_t struct associated with group_fn. + */ +#define JTEST_GROUP_STRUCT_NAME(group_fn) \ + JTEST_STRUCT_NAME(JTEST_GROUP_STRUCT_NAME_PREFIX, group_fn) + +/** + * Define a #JTEST_GROUP_t struct based on the given group_fn. + */ +#define JTEST_GROUP_DEFINE_STRUCT(group_fn) \ + JTEST_DEFINE_STRUCT(JTEST_GROUP_t, \ + JTEST_GROUP_STRUCT_NAME(group_fn)) + +/** + * Declare a #JTEST_GROUP_t struct based on the given group_fn. + */ +#define JTEST_GROUP_DECLARE_STRUCT(group_fn) \ + JTEST_DECLARE_STRUCT(JTEST_GROUP_DEFINE_STRUCT(group_fn)) + +/** + * Contents needed to initialize a JTEST_GROUP_t struct. + */ +#define JTEST_GROUP_STRUCT_INIT(group_fn) \ + group_fn, \ + STR_NL(group_fn), \ + JTEST_PF_MEMBER_INIT + +/** + * Initialize the contents of a #JTEST_GROUP_t struct. + */ +#define JTEST_GROUP_INIT(group_fn) \ + JTEST_GROUP_DEFINE_STRUCT(group_fn) = { \ + JTEST_GROUP_STRUCT_INIT(group_fn) \ + } + +/* Test Definition Macro */ +/*--------------------------------------------------------------------------------*/ + +/** + * Define a #JTEST_GROUP_t object and a test function. + */ +#define JTEST_DEFINE_GROUP(group_fn) \ + JTEST_GROUP_FN_PROTOTYPE(group_fn); \ + JTEST_GROUP_INIT(group_fn); \ + JTEST_GROUP_FN_PROTOTYPE(group_fn) /* Notice the lacking semicolon */ + +/** + * Declare a #JTEST_GROUP_t object and a test function prototype. + */ +#define JTEST_DECLARE_GROUP(group_fn) \ + JTEST_GROUP_FN_PROTOTYPE(group_fn); \ + JTEST_GROUP_DECLARE_STRUCT(group_fn) /* Note the lacking semicolon */ + +#endif /* _JTEST_GROUP_DEFINE_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_pf.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_pf.h new file mode 100644 index 0000000..2b005b6 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_pf.h @@ -0,0 +1,85 @@ +#ifndef _JTEST_PF_H_ +#define _JTEST_PF_H_ + +/*--------------------------------------------------------------------------------*/ +/* Purpose */ +/*--------------------------------------------------------------------------------*/ +/* jtest_pf.h Contains macros useful for capturing pass/fail data. */ + + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Members that can be added to other structs to extend them pass/fail data and + * corresponding functionality. + */ +#define JTEST_PF_MEMBERS \ + uint32_t passed; \ + uint32_t failed /* Note the lacking semicolon*/ \ + +/** + * Used for initializing JTEST_PF_MEMBERS in a struct declaration. + */ +#define JTEST_PF_MEMBER_INIT \ + 0, \ + 0 + +/* Member-Incrementing Macros */ +/*--------------------------------------------------------------------------------*/ + +/** + * Dispatch macro for incrementing #JTEST_PF_MEMBERS. + * + * @param xxx Values: 'passed', 'failed' + */ +#define JTEST_PF_INC_XXX(xxx, struct_pf_ptr, amount) \ + do \ + { \ + ((struct_pf_ptr)->xxx) += (amount); \ + } while (0) + +/** + * Specialization of the #JTEST_PF_INC_XXX macro to increment the passed + * member. + */ +#define JTEST_PF_INC_PASSED(struct_pf_ptr, amount) \ + JTEST_PF_INC_XXX(passed, struct_pf_ptr, amount) + + +/** + * Specialization of the #JTEST_PF_INC_XXX macro to increment the failed + * member. + */ +#define JTEST_PF_INC_FAILED(struct_pf_ptr, amount) \ + JTEST_PF_INC_XXX(failed, struct_pf_ptr, amount) + + +/* Member-Resetting Macros */ +/*--------------------------------------------------------------------------------*/ + +/** + * Dispatch macro for setting #JTEST_PF_MEMBERS to zero. + * + * @param xxx Values: 'passed', 'failed' + */ +#define JTEST_PF_RESET_XXX(xxx, struct_pf_ptr) \ + do \ + { \ + ((struct_pf_ptr)->xxx) = UINT32_C(0); \ + } while (0) + +/** + * Specialization of #JTEST_PF_RESET_XXX for the 'passed' member. + */ +#define JTEST_PF_RESET_PASSED(struct_pf_ptr) \ + JTEST_PF_RESET_XXX(passed, struct_pf_ptr) + +/** + * Specialization of #JTEST_PF_RESET_XXX for the 'failed' member. + */ +#define JTEST_PF_RESET_FAILED(struct_pf_ptr) \ + JTEST_PF_RESET_XXX(failed, struct_pf_ptr) + +#endif /* _JTEST_PF_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_systick.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_systick.h new file mode 100644 index 0000000..9f320b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_systick.h @@ -0,0 +1,94 @@ +#ifndef _JTEST_SYSTICK_H_ +#define _JTEST_SYSTICK_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +/* Get access to the SysTick structure. */ +#if defined ARMCM0 + #include "ARMCM0.h" +#elif defined ARMCM0P + #include "ARMCM0plus.h" +#elif defined ARMCM0P_MPU + #include "ARMCM0plus_MPU.h" +#elif defined ARMCM3 + #include "ARMCM3.h" +#elif defined ARMCM4 + #include "ARMCM4.h" +#elif defined ARMCM4_FP + #include "ARMCM4_FP.h" +#elif defined ARMCM7 + #include "ARMCM7.h" +#elif defined ARMCM7_SP + #include "ARMCM7_SP.h" +#elif defined ARMCM7_DP + #include "ARMCM7_DP.h" +#elif defined ARMSC000 + #include "ARMSC000.h" +#elif defined ARMSC300 + #include "ARMSC300.h" +#elif defined ARMv8MBL + #include "ARMv8MBL.h" +#elif defined ARMv8MML + #include "ARMv8MML.h" +#elif defined ARMv8MML_DSP + #include "ARMv8MML_DSP.h" +#elif defined ARMv8MML_SP + #include "ARMv8MML_SP.h" +#elif defined ARMv8MML_DSP_SP + #include "ARMv8MML_DSP_SP.h" +#elif defined ARMv8MML_DP + #include "ARMv8MML_DP.h" +#elif defined ARMv8MML_DSP_DP + #include "ARMv8MML_DSP_DP.h" +#elif defined ARMv7A + /* TODO */ +#else + #warning "no appropriate header file found!" +#endif + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Initial value for the SysTick module. + * + * This is also the maximum value, important as SysTick is a decrementing counter. + */ +#define JTEST_SYSTICK_INITIAL_VALUE 0xFFFFFF + +/** + * Reset the SysTick, decrementing timer to it's maximum value and disable it. + * + * This macro should leave the SysTick timer in a state that's ready for cycle + * counting. + */ +#define JTEST_SYSTICK_RESET(systick_ptr) \ + do \ + { \ + (systick_ptr)->CTRL = SysTick_CTRL_CLKSOURCE_Msk; \ + \ + (systick_ptr)->LOAD = JTEST_SYSTICK_INITIAL_VALUE; \ + (systick_ptr)->VAL = JTEST_SYSTICK_INITIAL_VALUE; \ + } while (0) + +/** + * Start the SysTick timer, sourced by the processor clock. + */ +#define JTEST_SYSTICK_START(systick_ptr) \ + do \ + { \ + (systick_ptr)->CTRL = \ + SysTick_CTRL_ENABLE_Msk | \ + SysTick_CTRL_CLKSOURCE_Msk; \ + } while (0) + +/** + * Evaluate to the current value of the SysTick timer. + */ +#define JTEST_SYSTICK_VALUE(systick_ptr) \ + ((systick_ptr)->VAL) + +#endif /* _JTEST_SYSTICK_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test.h new file mode 100644 index 0000000..023145f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test.h @@ -0,0 +1,100 @@ +#ifndef _JTEST_TEST_H_ +#define _JTEST_TEST_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include +#include "jtest_util.h" +#include "jtest_test_ret.h" + +/*--------------------------------------------------------------------------------*/ +/* Type Definitions */ +/*--------------------------------------------------------------------------------*/ + +/** + * A struct which represents a Test in the JTEST framework. This struct is + * used to enable, run, and describe the test it represents. + */ +typedef struct JTEST_TEST_struct +{ + JTEST_TEST_RET_t ( * test_fn_ptr)(void); /**< Pointer to the test function. */ + char * test_fn_str; /**< Name of the test function */ + char * fut_str; /**< Name of the function under test. */ + + /** + * Flags that govern how the #JTEST_TEST_t behaves. + */ + union { + struct { + unsigned enabled : 1; + unsigned unused : 7; + } bits; + uint8_t byte; /* Access all flags at once. */ + } flags; + +} JTEST_TEST_t; + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Assign a test function to the #JTEST_TEST_t struct. + */ +#define JTEST_TEST_SET_FN(jtest_test_ptr, fn_ptr) \ + JTEST_SET_STRUCT_ATTRIBUTE(jtest_test_ptr, test_fn_ptr, fn_ptr) + +/** + * Specify a function under test (FUT) for the #JTEST_TEST_t struct. + */ +#define JTEST_TEST_SET_FUT(jtest_test_ptr, str) \ + JTEST_SET_STRUCT_ATTRIBUTE(jtest_test_ptr, fut_str, str) + +/* Macros concerning JTEST_TEST_t flags */ +/*--------------------------------------------------------------------------------*/ + +#define JTEST_TEST_FLAG_SET 1 /**< Value of a set #JTEST_TEST_t flag. */ +#define JTEST_TEST_FLAG_CLR 0 /**< Value of a cleared #JTEST_TEST_t flag. */ + +/** + * Evaluate to the flag in #JTEST_TEST_t having flag_name. + */ +#define JTEST_TEST_FLAG(jtest_test_ptr, flag_name) \ + ((jtest_test_ptr)->flags.bits.flag_name) + +/** + * Dispatch macro for setting and clearing #JTEST_TEST_t flags. + * + * @param jtest_test_ptr Pointer to a #JTEST_TEST_t struct. + * @param flag_name Name of the flag to set in #JTEST_TEST_t.flags.bits + * @param xxx Vaid values: "SET" or "CLR" + * + * @note This function depends on JTEST_TEST_FLAG_SET and JTEST_TEST_FLAG_CLR. + */ +#define JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, xxx) \ + do \ + { \ + JTEST_TEST_FLAG(jtest_test_ptr, flag_name) = JTEST_TEST_FLAG_##xxx ; \ + } while (0) + +/** + * Specification of #JTEST_TEST_XXX_FLAG to set #JTEST_TEST_t flags. + */ +#define JTEST_TEST_SET_FLAG(jtest_test_ptr, flag_name) \ + JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, SET) + +/** + * Specification of #JTEST_TEST_XXX_FLAG to clear #JTEST_TEST_t flags. + */ +#define JTEST_TEST_CLR_FLAG(jtest_test_ptr, flag_name) \ + JTEST_TEST_XXX_FLAG(jtest_test_ptr, flag_name, CLR) + +/** + * Evaluate to true if the #JTEST_TEST_t is enabled. + */ +#define JTEST_TEST_IS_ENABLED(jtest_test_ptr) \ + (JTEST_TEST_FLAG(jtest_test_ptr, enabled) == JTEST_TEST_FLAG_SET) + +#endif /* _JTEST_TEST_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_call.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_call.h new file mode 100644 index 0000000..9325185 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_call.h @@ -0,0 +1,121 @@ +#ifndef _JTEST_TEST_CALL_H_ +#define _JTEST_TEST_CALL_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ +#include "jtest_test.h" +#include "jtest_test_define.h" +#include "jtest_fw.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Exectute the test in the #JTEST_TEST_t struct associated with the identifier + * test_fn and store the result in retval. + */ +#define JTEST_TEST_RUN(retval, test_fn) \ + do \ + { \ + JTEST_DUMP_STR("Test Name:\n"); \ + JTEST_DUMP_STR(JTEST_TEST_STRUCT_NAME(test_fn).test_fn_str); \ + JTEST_DUMP_STR("Function Under Test:\n"); \ + JTEST_DUMP_STR(JTEST_TEST_STRUCT_NAME(test_fn).fut_str); \ + retval = JTEST_TEST_STRUCT_NAME(test_fn).test_fn_ptr(); \ + } while (0) + +/** + * Update the enclosing #JTEST_GROUP_t's pass/fail information based on + * test_retval. + * + * @param test_retval A #JTEST_TEST_RET_enum for the current test. + * + * @warning Only use if #JTEST_TEST_t is called in the context of a + * #JTEST_GROUP_t. + */ +#define JTEST_TEST_UPDATE_PARENT_GROUP_PF(test_retval) \ + do \ + { \ + /* Update enclosing JTEST_GROUP_t with pass/fail info */ \ + if (test_retval == JTEST_TEST_PASSED) \ + { \ + JTEST_GROUP_INC_PASSED(JTEST_CURRENT_GROUP_PTR(), 1); \ + } else { \ + JTEST_GROUP_INC_FAILED(JTEST_CURRENT_GROUP_PTR(), 1); \ + } \ + } while (0) + +/** + * Update the #JTEST_FW with pass/fail information based on test_retval. + * + * @param test_retval A #JTEST_TEST_RET_enum for the current test. + */ +#define JTEST_TEST_UPDATE_FW_PF(test_retval) \ + do \ + { \ + /* Update the JTEST_FW with pass/fail info */ \ + if (test_retval == JTEST_TEST_PASSED) \ + { \ + JTEST_FW_INC_PASSED( 1); \ + } else { \ + JTEST_FW_INC_FAILED(1); \ + } \ + } while (0) + +/** + * Update the enclosing JTEST_GROUP_t's pass/fail information, or the + * #JTEST_FW's if this test has no enclosing #JTEST_GROUP_t. + * + * @param test_retval A #JTEST_TEST_RET_enum for the current test. + */ +#define JTEST_TEST_UPDATE_PARENT_GROUP_OR_FW_PF(test_retval) \ + do \ + { \ + /* Update pass-fail information */ \ + if (JTEST_CURRENT_GROUP_PTR() /* Non-null */) \ + { \ + JTEST_TEST_UPDATE_PARENT_GROUP_PF(test_retval); \ + } else { \ + JTEST_TEST_UPDATE_FW_PF(test_retval); \ + } \ + } while (0) + +/** + * Dump the results of the test to the Keil Debugger. + */ +#define JTEST_TEST_DUMP_RESULTS(test_retval) \ + do \ + { \ + if (test_retval == JTEST_TEST_PASSED) \ + { \ + JTEST_DUMP_STR("Test Passed\n"); \ + } else { \ + JTEST_DUMP_STR("Test Failed\n"); \ + } \ + } while (0) + +/** + * Call the #JTEST_TEST_t assocaited with the identifier test_fn. + */ +#define JTEST_TEST_CALL(test_fn) \ + do \ + { \ + if (JTEST_TEST_IS_ENABLED(&JTEST_TEST_STRUCT_NAME(test_fn))) \ + { \ + /* Default to failure */ \ + JTEST_TEST_RET_t __jtest_test_ret = JTEST_TEST_FAILED; \ + \ + JTEST_ACT_TEST_START(); \ + JTEST_TEST_RUN(__jtest_test_ret, test_fn); \ + \ + /* Update pass-fail information */ \ + JTEST_TEST_UPDATE_PARENT_GROUP_OR_FW_PF(__jtest_test_ret); \ + \ + JTEST_TEST_DUMP_RESULTS(__jtest_test_ret); \ + JTEST_ACT_TEST_END(); \ + } \ + } while (0) + +#endif /* _JTEST_TEST_CALL_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_define.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_define.h new file mode 100644 index 0000000..1447dd0 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_define.h @@ -0,0 +1,133 @@ +#ifndef _JTEST_TEST_DEFINE_H_ +#define _JTEST_TEST_DEFINE_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "jtest_util.h" +#include "jtest_define.h" +#include "jtest_test.h" + +/* For defining macros with optional arguments */ +#include "opt_arg/opt_arg.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Prefix for all #JTEST_TEST_t structs. + */ +#define JTEST_TEST_STRUCT_NAME_PREFIX G_JTEST_TEST_STRUCT_ + +/** + * Define test template used by #JTEST_TEST_t tests. + */ +#define JTEST_TEST_FN_TEMPLATE(test_fn) \ + JTEST_TEST_RET_t test_fn(void) + +#define JTEST_TEST_FN_PROTOTYPE JTEST_TEST_FN_TEMPLATE /**< Alias for + * #JTEST_TEST_FN_TEMPLATE. */ + +/** + * Evaluate to the name of the #JTEST_TEST_t struct associated with test_fn. + */ +#define JTEST_TEST_STRUCT_NAME(test_fn) \ + JTEST_STRUCT_NAME(JTEST_TEST_STRUCT_NAME_PREFIX, test_fn) + +/** + * Define a #JTEST_TEST_t struct based on the given test_fn. + */ +#define JTEST_TEST_DEFINE_STRUCT(test_fn) \ + JTEST_DEFINE_STRUCT(JTEST_TEST_t, \ + JTEST_TEST_STRUCT_NAME(test_fn)) + +/** + * Declare a #JTEST_TEST_t struct based on the given test_fn. + */ +#define JTEST_TEST_DECLARE_STRUCT(test_fn) \ + JTEST_DECLARE_STRUCT(JTEST_TEST_DEFINE_STRUCT(test_fn)) + +/** + * Contents needed to initialize a JTEST_TEST_t struct. + */ +#define JTEST_TEST_STRUCT_INIT(test_fn, fut, enable) \ + test_fn, \ + STR_NL(test_fn), \ + STR_NL(fut), \ + { \ + { \ + enable, \ + 0 \ + } \ + } \ + + +/** + * Initialize the contents of a #JTEST_TEST_t struct. + */ +#define JTEST_TEST_INIT(test_fn, fut, enable) \ + JTEST_TEST_DEFINE_STRUCT(test_fn) = { \ + JTEST_TEST_STRUCT_INIT(test_fn, fut, enable) \ + } + +/* Test Definition Macro */ +/*--------------------------------------------------------------------------------*/ + +/** + * Define a #JTEST_TEST_t object and a test function. + */ +#define _JTEST_DEFINE_TEST(test_fn, fut, enable) \ + JTEST_TEST_FN_PROTOTYPE(test_fn); \ + JTEST_TEST_INIT(test_fn, fut, enable); \ + JTEST_TEST_FN_PROTOTYPE(test_fn) /* Notice the lacking semicolon */ + +/** + * Declare a #JTEST_TEST_t object and a test function prototype. + */ +#define JTEST_DECLARE_TEST(test_fn) \ + JTEST_TEST_FN_PROTOTYPE(test_fn); \ + JTEST_TEST_DECLARE_STRUCT(test_fn) /* Note the lacking semicolon */ + +/*--------------------------------------------------------------------------------*/ +/* Macros with optional arguments */ +/*--------------------------------------------------------------------------------*/ + +/* Top-level Interface */ +#define JTEST_DEFINE_TEST(...) \ + JTEST_DEFINE_TEST_(PP_NARG(__VA_ARGS__), ##__VA_ARGS__) + +/* Dispatch Macro*/ +#define JTEST_DEFINE_TEST_(N, ...) \ + SPLICE(JTEST_DEFINE_TEST_, N)(__VA_ARGS__) + +/* Default Arguments */ +#define JTEST_DEFINE_TEST_DEFAULT_FUT /* Blank */ +#define JTEST_DEFINE_TEST_DEFAULT_ENABLE \ + JTEST_TRUE /* Tests enabled by + * default. */ + +/* Dispatch Cases*/ +#define JTEST_DEFINE_TEST_1(_1) \ + _JTEST_DEFINE_TEST( \ + _1, \ + JTEST_DEFINE_TEST_DEFAULT_FUT, \ + JTEST_DEFINE_TEST_DEFAULT_ENABLE \ + ) + +#define JTEST_DEFINE_TEST_2(_1, _2) \ + _JTEST_DEFINE_TEST( \ + _1, \ + _2, \ + JTEST_DEFINE_TEST_DEFAULT_ENABLE \ + ) + +#define JTEST_DEFINE_TEST_3(_1, _2, _3) \ + _JTEST_DEFINE_TEST( \ + _1, \ + _2, \ + _3 \ + ) + +#endif /* _JTEST_TEST_DEFINE_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_ret.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_ret.h new file mode 100644 index 0000000..c3176e5 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_test_ret.h @@ -0,0 +1,17 @@ +#ifndef _JTEST_TEST_RET_H_ +#define _JTEST_TEST_RET_H_ + +/*--------------------------------------------------------------------------------*/ +/* Type Definitions */ +/*--------------------------------------------------------------------------------*/ + +/** + * Values a #JTEST_TEST_t can return. + */ +typedef enum JTEST_TEST_RET_enum +{ + JTEST_TEST_PASSED, + JTEST_TEST_FAILED +} JTEST_TEST_RET_t; + +#endif /* _JTEST_TEST_RET_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_util.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_util.h new file mode 100644 index 0000000..3e07d2e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/jtest_util.h @@ -0,0 +1,27 @@ +#ifndef _JTEST_UTIL_H_ +#define _JTEST_UTIL_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "util/util.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/* Define boolean values for the framework. */ +#define JTEST_TRUE 1 /**< Value used for TRUE in JTEST. */ +#define JTEST_FALSE 0 /**< Value used for FALSE in JTEST. */ + +/** + * Set the value of the attribute in the struct to by struct_ptr to value. + */ +#define JTEST_SET_STRUCT_ATTRIBUTE(struct_ptr, attribute, value) \ + do \ + { \ + (struct_ptr)->attribute = (value); \ + } while (0) + +#endif /* _JTEST_UTIL_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/opt_arg.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/opt_arg.h new file mode 100644 index 0000000..683be1d --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/opt_arg.h @@ -0,0 +1,15 @@ +#ifndef _OPT_ARG_H_ +#define _OPT_ARG_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "pp_narg.h" +#include "splice.h" + +/* If you are Joseph Jaoudi, you have a snippet which expands into an + example. If you are not Joseph, but possess his code, study the examples. If + you have no examples, turn back contact Joseph. */ + +#endif /* _OPT_ARG_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/pp_narg.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/pp_narg.h new file mode 100644 index 0000000..d3248f4 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/pp_narg.h @@ -0,0 +1,25 @@ +#ifndef _PP_NARG_H_ +#define _PP_NARG_H_ + +#define PP_NARG(...) \ + PP_NARG_(__VA_ARGS__,PP_RSEQ_N()) +#define PP_NARG_(...) \ + PP_ARG_N(__VA_ARGS__) +#define PP_ARG_N( \ + _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \ + _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \ + _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \ + _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \ + _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \ + _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \ + _61,_62,_63,N,...) N +#define PP_RSEQ_N() \ + 63,62,61,60, \ + 59,58,57,56,55,54,53,52,51,50, \ + 49,48,47,46,45,44,43,42,41,40, \ + 39,38,37,36,35,34,33,32,31,30, \ + 29,28,27,26,25,24,23,22,21,20, \ + 19,18,17,16,15,14,13,12,11,10, \ + 9,8,7,6,5,4,3,2,1,0 + +#endif /* _PP_NARG_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/splice.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/splice.h new file mode 100644 index 0000000..ec9142b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/opt_arg/splice.h @@ -0,0 +1,8 @@ +#ifndef _SPLICE_H_ +#define _SPLICE_H_ + +#define SPLICE(a,b) SPLICE_1(a,b) +#define SPLICE_1(a,b) SPLICE_2(a,b) +#define SPLICE_2(a,b) a##b + +#endif /* _SPLICE_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/util/util.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/util/util.h new file mode 100644 index 0000000..f56e0e6 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/inc/util/util.h @@ -0,0 +1,52 @@ +#ifndef _UTIL_H_ +#define _UTIL_H_ + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Convert a symbol to a string and add a 'NewLine'. + */ +#define STR_NL(x) STR1_NL(x) +#define STR1_NL(x) (STR2_NL(x)"\n") +#define STR2_NL(x) #x + +/** + * Convert a symbol to a string. + */ +#define STR(x) STR1(x) +#define STR1(x) STR2(x) +#define STR2(x) #x + +/** + * Concatenate two symbols. + */ +#define CONCAT(a, b) CONCAT1(a, b) +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a##b + + +/** + * Place curly braces around a varaible number of macro arguments. + */ +#define CURLY(...) {__VA_ARGS__} + +/** + * Place parenthesis around a variable number of macro arguments. + */ +#define PAREN(...) (__VA_ARGS__) + +/* Standard min/max macros. */ +#define MIN(x,y) (((x) < (y)) ? (x) : (y) ) +#define MAX(x,y) (((x) > (y)) ? (x) : (y) ) + +/** + * Bound value using low and high limits. + * + * Evaluate to a number in the range, endpoint inclusive. + */ +#define BOUND(low, high, value) \ + MAX(MIN(high, value), low) + +#endif /* _UTIL_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_cycle.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_cycle.c new file mode 100644 index 0000000..24d552d --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_cycle.c @@ -0,0 +1,9 @@ +#include "../inc/jtest_cycle.h" +#include + +/*--------------------------------------------------------------------------------*/ +/* Define Module Variables */ +/*--------------------------------------------------------------------------------*/ + +/* const char * JTEST_CYCLE_STRF = "Running: %s\nCycles: %" PRIu32 "\n"; */ +const char * JTEST_CYCLE_STRF = "Cycles: %" PRIu32 "\n"; /* function name + parameter string skipped */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_dump_str_segments.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_dump_str_segments.c new file mode 100644 index 0000000..c3a9bf8 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_dump_str_segments.c @@ -0,0 +1,36 @@ +#include "jtest_fw.h" + +/** + * Dump the JTEST_FW.str_buffer the Keil framework in pieces. + * + * The JTEST_FW.str_buffer contains more characters than the Keil framework can + * dump at once. This function dumps them in blocks. + */ +void jtest_dump_str_segments(void) +{ + uint32_t seg_idx = 0; + uint32_t memmove_idx = 0; + uint32_t seg_cnt = + (strlen(JTEST_FW.str_buffer) / JTEST_STR_MAX_OUTPUT_SIZE) + 1; + + for( seg_idx = 0; seg_idx < seg_cnt; ++seg_idx) + { + JTEST_TRIGGER_ACTION(dump_str); + + if (seg_idx < JTEST_STR_MAX_OUTPUT_SEGMENTS) + { + memmove_idx = 0; + while (memmove_idx < (seg_cnt - seg_idx -1) ) + { + memmove( + JTEST_FW.str_buffer+ + (memmove_idx* JTEST_STR_MAX_OUTPUT_SIZE), + JTEST_FW.str_buffer+ + ((memmove_idx+1)*JTEST_STR_MAX_OUTPUT_SIZE), + JTEST_BUF_SIZE); + ++memmove_idx; + } + } + } + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_fw.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_fw.c new file mode 100644 index 0000000..69d7a63 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_fw.c @@ -0,0 +1,9 @@ +#include "../inc/jtest.h" + +/*--------------------------------------------------------------------------------*/ +/* Define Global Variables */ +/*--------------------------------------------------------------------------------*/ + +char JTEST_FW_STR_BUFFER[JTEST_BUF_SIZE] = {0}; + +volatile JTEST_FW_t JTEST_FW = {0}; diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_trigger_action.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_trigger_action.c new file mode 100644 index 0000000..a3901da --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/JTest/src/jtest_trigger_action.c @@ -0,0 +1,37 @@ + +#include "jtest_fw.h" + +void test_start (void) { +// ; + JTEST_FW.test_start++; +} + +void test_end (void) { +// ; + JTEST_FW.test_end++; +} + +void group_start (void) { +// ; + JTEST_FW.group_start++; +} + +void group_end (void) { +// ; + JTEST_FW.group_end++; +} + +void dump_str (void) { +// ; + JTEST_FW.dump_str++; +} + +void dump_data (void) { +// ; + JTEST_FW.dump_data++; +} + +void exit_fw (void) { +// ; + JTEST_FW.exit_fw++; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/all_tests.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/all_tests.h new file mode 100644 index 0000000..df1e998 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/all_tests.h @@ -0,0 +1,9 @@ +#ifndef _ALL_TESTS_H_ +#define _ALL_TESTS_H_ + +/*--------------------------------------------------------------------------------*/ +/* Declare Test Groups */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(all_tests); + +#endif /* _ALL_TESTS_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_templates.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_templates.h new file mode 100644 index 0000000..958ef78 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_templates.h @@ -0,0 +1,267 @@ +#ifndef _BASIC_MATH_TEMPLATES_H_ +#define _BASIC_MATH_TEMPLATES_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ +#include "test_templates.h" + +/*--------------------------------------------------------------------------------*/ +/* Group Specific Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Compare the outputs used by basic math tests for the function under test and + * the reference function. + */ +#define BASIC_MATH_COMPARE_INTERFACE(block_size, output_type) \ + TEST_ASSERT_BUFFERS_EQUAL( \ + basic_math_output_ref.data_ptr, \ + basic_math_output_fut.data_ptr, \ + block_size * sizeof(output_type)) + +/* + * Comparison SNR thresholds for the data types used in basic_math_tests. + */ +#define BASIC_MATH_SNR_THRESHOLD_float32_t 120 +#define BASIC_MATH_SNR_THRESHOLD_q31_t 100 +#define BASIC_MATH_SNR_THRESHOLD_q15_t 75 +#define BASIC_MATH_SNR_THRESHOLD_q7_t 25 + +/** + * Compare reference and fut outputs using SNR. + * + * @note The outputs are converted to float32_t before comparison. + */ +#define BASIC_MATH_SNR_COMPARE_INTERFACE(block_size, output_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + basic_math_output_f32_ref, \ + basic_math_output_ref.data_ptr, \ + basic_math_output_f32_fut, \ + basic_math_output_fut.data_ptr, \ + block_size, \ + output_type, \ + BASIC_MATH_SNR_THRESHOLD_##output_type \ + ); \ + } while (0) + + +/** + * Compare reference and fut outputs using SNR. + * + * @note The outputs are converted to float32_t before comparison. + */ +#define BASIC_MATH_SNR_ELT1_COMPARE_INTERFACE(block_size, output_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + basic_math_output_f32_ref, \ + basic_math_output_ref.data_ptr, \ + basic_math_output_f32_fut, \ + basic_math_output_fut.data_ptr, \ + 1, \ + output_type, \ + BASIC_MATH_SNR_THRESHOLD_##output_type \ + ); \ + } while (0) + + + +/*--------------------------------------------------------------------------------*/ +/* Input Interfaces */ +/*--------------------------------------------------------------------------------*/ +/* + * General: + * Input interfaces provide inputs to functions inside test templates. They + * ONLY provide the inputs. The output variables should be hard coded. + * + * The input interfaces must have the following format: + * + * ARM_xxx_INPUT_INTERFACE() or + * REF_xxx_INPUT_INTERFACE() + * + * The xxx must be lowercase, and is intended to be the indentifying substring + * in the function's name. Acceptable values are 'sub' or 'add' from the + * functions arm_add_q31. + */ + +#define ARM_abs_INPUT_INTERFACE(input, block_size) \ + PAREN(input, basic_math_output_fut.data_ptr, block_size) + +#define REF_abs_INPUT_INTERFACE(input, block_size) \ + PAREN(input, basic_math_output_ref.data_ptr, block_size) + +#define ARM_add_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \ + +#define REF_add_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \ + +#define ARM_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, block_size, basic_math_output_fut.data_ptr) \ + +#define REF_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, block_size, basic_math_output_ref.data_ptr) \ + +#define ARM_mult_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \ + +#define REF_mult_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \ + +#define ARM_negate_INPUT_INTERFACE(input, block_size) \ + PAREN(input, basic_math_output_fut.data_ptr, block_size) + +#define REF_negate_INPUT_INTERFACE(input, block_size) \ + PAREN(input, basic_math_output_ref.data_ptr, block_size) + +#define ARM_offset_INPUT_INTERFACE(input, elt, block_size) \ + PAREN(input, elt, basic_math_output_fut.data_ptr, block_size) \ + +#define REF_offset_INPUT_INTERFACE(input, elt, block_size) \ + PAREN(input, elt, basic_math_output_ref.data_ptr, block_size) \ + +#define ARM_shift_INPUT_INTERFACE(input, elt, block_size) \ + PAREN(input, elt, basic_math_output_fut.data_ptr, block_size) \ + +#define REF_shift_INPUT_INTERFACE(input, elt, block_size) \ + PAREN(input, elt, basic_math_output_ref.data_ptr, block_size) \ + +#define ARM_scale_float_INPUT_INTERFACE(input, elt, block_size) \ + PAREN(input, elt, basic_math_output_fut.data_ptr, block_size) \ + +#define REF_scale_float_INPUT_INTERFACE(input, elt, block_size) \ + PAREN(input, elt, basic_math_output_ref.data_ptr, block_size) \ + +/* These two are for the fixed point functions */ +#define ARM_scale_INPUT_INTERFACE(input, elt1, elt2, block_size) \ + PAREN(input, elt1, elt2, basic_math_output_fut.data_ptr, block_size) \ + +#define REF_scale_INPUT_INTERFACE(input, elt1, elt2, block_size) \ + PAREN(input, elt1, elt2, basic_math_output_ref.data_ptr, block_size) \ + +#define ARM_sub_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, basic_math_output_fut.data_ptr, block_size) \ + +#define REF_sub_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, basic_math_output_ref.data_ptr, block_size) \ + + +/*--------------------------------------------------------------------------------*/ +/* Test Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Specialization of #TEST_TEMPLATE_BUF1_BLK() for basic math tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name, \ + suffix, \ + input_type, \ + output_type) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_BUF1_BLK( \ + basic_math_f_all, \ + basic_math_block_sizes, \ + input_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + BASIC_MATH_COMPARE_INTERFACE); \ + } + +/** + * Specialization of #TEST_TEMPLATE_BUF2_BLK() for basic math tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(fn_name, \ + suffix, \ + input_type, \ + output_type, \ + comparison_interface) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_BUF2_BLK( \ + basic_math_f_all, \ + basic_math_f_all, \ + basic_math_block_sizes, \ + input_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + comparison_interface); \ + } + +/** + * Specialization of #TEST_TEMPLATE_BUF1_ELT1_BLK() for basic math tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT1_BLK(fn_name, \ + suffix, \ + input_type, \ + elt_type, \ + output_type) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_BUF1_ELT1_BLK( \ + basic_math_f_all, \ + basic_math_elts, \ + basic_math_block_sizes, \ + input_type, \ + elt_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + BASIC_MATH_COMPARE_INTERFACE); \ + } + +/** + * Specialization of #TEST_TEMPLATE_BUF1_ELT2_BLK() for basic math tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT2_BLK(fn_name, \ + suffix, \ + input_type, \ + elt1_type, \ + elt2_type, \ + output_type) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_BUF1_ELT2_BLK( \ + basic_math_f_all, \ + basic_math_elts, \ + basic_math_elts2, \ + basic_math_block_sizes, \ + input_type, \ + elt1_type, \ + elt2_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + BASIC_MATH_COMPARE_INTERFACE); \ + } + +#endif /* _BASIC_MATH_TEMPLATES_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_test_data.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_test_data.h new file mode 100644 index 0000000..2f0b239 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_test_data.h @@ -0,0 +1,46 @@ +#ifndef ARM_BASIC_MATH_TEST_DATA_H +#define ARM_BASIC_MATH_TEST_DATA_H + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "arr_desc.h" +#include "arm_math.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ +#define BASIC_MATH_MAX_INPUT_ELEMENTS 32 +#define BASIC_MATH_BIGGEST_INPUT_TYPE float32_t + +/*--------------------------------------------------------------------------------*/ +/* Declare Variables */ +/*--------------------------------------------------------------------------------*/ + +/* Input/Output Buffers */ +ARR_DESC_DECLARE(basic_math_output_fut); +ARR_DESC_DECLARE(basic_math_output_ref); + +extern BASIC_MATH_BIGGEST_INPUT_TYPE +basic_math_output_f32_ref[BASIC_MATH_MAX_INPUT_ELEMENTS]; + +extern BASIC_MATH_BIGGEST_INPUT_TYPE +basic_math_output_f32_fut[BASIC_MATH_MAX_INPUT_ELEMENTS]; + +/* Block Sizes*/ +ARR_DESC_DECLARE(basic_math_block_sizes); + +/* Numbers */ +ARR_DESC_DECLARE(basic_math_elts); +ARR_DESC_DECLARE(basic_math_elts2); +ARR_DESC_DECLARE(basic_math_eltsf); + +/* Float Inputs */ +ARR_DESC_DECLARE(basic_math_zeros); +ARR_DESC_DECLARE(basic_math_f_2); +ARR_DESC_DECLARE(basic_math_f_15); +ARR_DESC_DECLARE(basic_math_f_32); +ARR_DESC_DECLARE(basic_math_f_all); + +#endif diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_test_group.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_test_group.h new file mode 100644 index 0000000..ece92c7 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_test_group.h @@ -0,0 +1,9 @@ +#ifndef _BASIC_MATH_TEST_GROUP_H_ +#define _BASIC_MATH_TEST_GROUP_H_ + +/*--------------------------------------------------------------------------------*/ +/* Declare Test Groups */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(basic_math_tests); + +#endif /* _BASIC_MATH_TEST_GROUP_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_tests.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_tests.h new file mode 100644 index 0000000..0550444 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/basic_math_tests/basic_math_tests.h @@ -0,0 +1,17 @@ +#ifndef _BASIC_MATH_TESTS_H_ +#define _BASIC_MATH_TESTS_H_ + +/*--------------------------------------------------------------------------------*/ +/* Test/Group Declarations */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(abs_tests); +JTEST_DECLARE_GROUP(add_tests); +JTEST_DECLARE_GROUP(dot_prod_tests); +JTEST_DECLARE_GROUP(mult_tests); +JTEST_DECLARE_GROUP(negate_tests); +JTEST_DECLARE_GROUP(offset_tests); +JTEST_DECLARE_GROUP(scale_tests); +JTEST_DECLARE_GROUP(shift_tests); +JTEST_DECLARE_GROUP(sub_tests); + +#endif /* _BASIC_MATH_TESTS_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_templates.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_templates.h new file mode 100644 index 0000000..3b7f22f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_templates.h @@ -0,0 +1,222 @@ +#ifndef _COMPLEX_MATH_TEMPLATES_H_ +#define _COMPLEX_MATH_TEMPLATES_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ +#include "test_templates.h" + +/*--------------------------------------------------------------------------------*/ +/* Group Specific Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Compare the real outputs from the function under test and the reference + * function. + */ +#define COMPLEX_MATH_COMPARE_RE_INTERFACE(block_size, output_type) \ + TEST_ASSERT_BUFFERS_EQUAL( \ + complex_math_output_ref_a.data_ptr, \ + complex_math_output_fut_a.data_ptr, \ + block_size * sizeof(output_type)) + +/** + * Compare the real and imaginary outputs from the function under test and the + * reference function. + */ +#define COMPLEX_MATH_COMPARE_CMPLX_INTERFACE(block_size, output_type) \ + do \ + { \ + COMPLEX_MATH_COMPARE_RE_INTERFACE(block_size * 2, output_type); \ + } while (0) + + +/* + * Comparison SNR thresholds for the data types used in complex_math_tests. + */ +#define COMPLEX_MATH_SNR_THRESHOLD_float32_t 120 +#define COMPLEX_MATH_SNR_THRESHOLD_q31_t 100 +#define COMPLEX_MATH_SNR_THRESHOLD_q15_t 75 + +/** + * Compare reference and fut outputs using SNR. + * + * The output_suffix specifies which output buffers to use for the + * comparison. An output_suffix of 'a' expands to the following buffers: + * + * - complex_math_output_f32_ref_a + * - complex_math_output_f32_fut_a + * - complex_math_output_ref_a + * - complex_math_output_fut_a + * + * @note The outputs are converted to float32_t before comparison. + */ +#define COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size, \ + output_type, \ + output_suffix) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + complex_math_output_f32_ref_##output_suffix, \ + complex_math_output_ref_##output_suffix.data_ptr, \ + complex_math_output_f32_fut_##output_suffix, \ + complex_math_output_fut_##output_suffix.data_ptr, \ + block_size, \ + output_type, \ + COMPLEX_MATH_SNR_THRESHOLD_##output_type \ + ); \ + } while (0) + +/** + * Specification of #COMPLEX_MATH_SNR_COMPARE_INTERFACE() for real outputs. + */ +#define COMPLEX_MATH_SNR_COMPARE_RE_INTERFACE(block_size, \ + output_type) \ + COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size, \ + output_type, \ + a) + +/** + * Specification of #COMPLEX_MATH_SNR_COMPARE_INTERFACE() for complex outputs. + */ +#define COMPLEX_MATH_SNR_COMPARE_CMPLX_INTERFACE(block_size, \ + output_type) \ + COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size * 2, \ + output_type, \ + a) + +/** + * Compare reference and fut split outputs using SNR. + * + * 'Split' refers to two separate output buffers; one for real and one for + * complex. + */ +#define COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size, \ + output_type, \ + a); \ + COMPLEX_MATH_SNR_COMPARE_OUT_INTERFACE(block_size, \ + output_type, \ + b); \ + } while (0) + + +/*--------------------------------------------------------------------------------*/ +/* Input Interfaces */ +/*--------------------------------------------------------------------------------*/ +/* + * General: + * Input interfaces provide inputs to functions inside test templates. They + * ONLY provide the inputs. The output variables should be hard coded. + * + * The input interfaces must have the following format: + * + * ARM_xxx_INPUT_INTERFACE() or + * REF_xxx_INPUT_INTERFACE() + * + * The xxx must be lowercase, and is intended to be the indentifying substring + * in the function's name. Acceptable values are 'sub' or 'add' from the + * functions arm_add_q31. + */ + +#define ARM_cmplx_conj_INPUT_INTERFACE(input, block_size) \ + PAREN(input, complex_math_output_fut_a.data_ptr, block_size) + +#define REF_cmplx_conj_INPUT_INTERFACE(input, block_size) \ + PAREN(input, complex_math_output_ref_a.data_ptr, block_size) + +#define ARM_cmplx_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, block_size, \ + complex_math_output_fut_a.data_ptr, \ + complex_math_output_fut_b.data_ptr) + +#define REF_cmplx_dot_prod_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, block_size, \ + complex_math_output_ref_a.data_ptr, \ + complex_math_output_ref_b.data_ptr) + +#define ARM_cmplx_mag_INPUT_INTERFACE(input, block_size) \ + PAREN(input, complex_math_output_fut_a.data_ptr, block_size) + +#define REF_cmplx_mag_INPUT_INTERFACE(input, block_size) \ + PAREN(input, complex_math_output_ref_a.data_ptr, block_size) + +#define ARM_cmplx_mag_squared_INPUT_INTERFACE(input, block_size) \ + PAREN(input, complex_math_output_fut_a.data_ptr, block_size) + +#define REF_cmplx_mag_squared_INPUT_INTERFACE(input, block_size) \ + PAREN(input, complex_math_output_ref_a.data_ptr, block_size) + +#define ARM_cmplx_mult_cmplx_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, complex_math_output_fut_a.data_ptr, block_size) + +#define REF_cmplx_mult_cmplx_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, complex_math_output_ref_a.data_ptr, block_size) + +#define ARM_cmplx_mult_real_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, complex_math_output_fut_a.data_ptr, block_size) + +#define REF_cmplx_mult_real_INPUT_INTERFACE(input_a, input_b, block_size) \ + PAREN(input_a, input_b, complex_math_output_ref_a.data_ptr, block_size) + +/*--------------------------------------------------------------------------------*/ +/* Test Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Specialization of #TEST_TEMPLATE_BUF1_BLK() for complex math tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name, \ + suffix, \ + input_type, \ + output_type, \ + comparison_interface) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_BUF1_BLK( \ + complex_math_f_all, \ + complex_math_block_sizes, \ + input_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + comparison_interface); \ + } + +/** + * Specialization of #TEST_TEMPLATE_BUF2_BLK1() for complex math tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK(fn_name, \ + suffix, \ + input_type, \ + output_type, \ + comparison_interface) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_BUF2_BLK( \ + complex_math_f_all, \ + complex_math_f_all, \ + complex_math_block_sizes, \ + input_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + comparison_interface); \ + } + +#endif /* _COMPLEX_MATH_TEMPLATES_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_test_data.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_test_data.h new file mode 100644 index 0000000..df561b4 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_test_data.h @@ -0,0 +1,50 @@ +#ifndef _COMPLEX_MATH_TEST_DATA_H_ +#define _COMPLEX_MATH_TEST_DATA_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "arr_desc.h" +#include "arm_math.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ +#define COMPLEX_MATH_MAX_INPUT_ELEMENTS 32 +#define COMPLEX_MATH_BIGGEST_INPUT_TYPE float32_t + +/*--------------------------------------------------------------------------------*/ +/* Decalare Variables */ +/*--------------------------------------------------------------------------------*/ + +/* Input/Output Buffers */ +ARR_DESC_DECLARE(complex_math_output_fut_a); +ARR_DESC_DECLARE(complex_math_output_fut_b); +ARR_DESC_DECLARE(complex_math_output_ref_a); +ARR_DESC_DECLARE(complex_math_output_ref_b); + +extern COMPLEX_MATH_BIGGEST_INPUT_TYPE +complex_math_output_f32_ref_a[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2]; + +extern COMPLEX_MATH_BIGGEST_INPUT_TYPE +complex_math_output_f32_ref_b[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2]; + +extern COMPLEX_MATH_BIGGEST_INPUT_TYPE +complex_math_output_f32_fut_a[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2]; + +extern COMPLEX_MATH_BIGGEST_INPUT_TYPE +complex_math_output_f32_fut_b[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2]; + +/* Block Sizes*/ +ARR_DESC_DECLARE(complex_math_block_sizes); + +/* Float Inputs */ +ARR_DESC_DECLARE(complex_math_zeros); +ARR_DESC_DECLARE(complex_math_f_2); +ARR_DESC_DECLARE(complex_math_f_15); +ARR_DESC_DECLARE(complex_math_f_32); +ARR_DESC_DECLARE(complex_math_f_all); + + +#endif /* _COMPLEX_MATH_TEST_DATA_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_test_group.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_test_group.h new file mode 100644 index 0000000..5c2ea1f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_test_group.h @@ -0,0 +1,9 @@ +#ifndef _COMPLEX_MATH_TEST_GROUP_H_ +#define _COMPLEX_MATH_TEST_GROUP_H_ + +/*--------------------------------------------------------------------------------*/ +/* Declare Test Groups */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(complex_math_tests); + +#endif /* _COMPLEX_MATH_TEST_GROUP_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_tests.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_tests.h new file mode 100644 index 0000000..ab4f0ae --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/complex_math_tests/complex_math_tests.h @@ -0,0 +1,14 @@ +#ifndef _COMPLEX_MATH_TESTS_H_ +#define _COMPLEX_MATH_TESTS_H_ + +/*--------------------------------------------------------------------------------*/ +/* Test/Group Declarations */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(cmplx_conj_tests); +JTEST_DECLARE_GROUP(cmplx_dot_prod_tests); +JTEST_DECLARE_GROUP(cmplx_mag_tests); +JTEST_DECLARE_GROUP(cmplx_mag_squared_tests); +JTEST_DECLARE_GROUP(cmplx_mult_cmplx_tests); +JTEST_DECLARE_GROUP(cmplx_mult_real_tests); + +#endif /* _COMPLEX_MATH_TESTS_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_templates.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_templates.h new file mode 100644 index 0000000..f7956fb --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_templates.h @@ -0,0 +1,46 @@ +#ifndef _CONTROLLER_TEMPLATES_H_ +#define _CONTROLLER_TEMPLATES_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "test_templates.h" +#include /* memcpy() */ + +/*--------------------------------------------------------------------------------*/ +/* Group Specific Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Comparison SNR thresholds for the data types used in transform_tests. + */ +#define CONTROLLER_SNR_THRESHOLD_float32_t 110 +#define CONTROLLER_SNR_THRESHOLD_q31_t 100 +#define CONTROLLER_SNR_THRESHOLD_q15_t 45 + +/** + * Compare the outputs from the function under test and the reference + * function using SNR. + */ +#define CONTROLLER_SNR_COMPARE_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + controller_output_f32_ref, \ + (output_type *) controller_output_ref, \ + controller_output_f32_fut, \ + (output_type *) controller_output_fut, \ + block_size, \ + output_type, \ + CONTROLLER_SNR_THRESHOLD_##output_type \ + ); \ + } while (0) + + +/*--------------------------------------------------------------------------------*/ +/* TEST Templates */ +/*--------------------------------------------------------------------------------*/ + +#endif /* _CONTROLLER_TEMPLATES_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_test_data.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_test_data.h new file mode 100644 index 0000000..5aa63eb --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_test_data.h @@ -0,0 +1,33 @@ +#ifndef _CONTROLLER_TEST_DATA_H_ +#define _CONTROLLER_TEST_DATA_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "arm_math.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +#define CONTROLLER_MAX_LEN 1024 +#define CONTROLLER_MAX_COEFFS_LEN (12 * 3) +#define TRANFORM_BIGGEST_INPUT_TYPE float32_t + +/*--------------------------------------------------------------------------------*/ +/* Variable Declarations */ +/*--------------------------------------------------------------------------------*/ + +extern float32_t controller_output_fut[CONTROLLER_MAX_LEN]; +extern float32_t controller_output_ref[CONTROLLER_MAX_LEN]; +extern float32_t controller_output_f32_fut[CONTROLLER_MAX_LEN]; +extern float32_t controller_output_f32_ref[CONTROLLER_MAX_LEN]; +extern const float32_t controller_f32_inputs[CONTROLLER_MAX_LEN]; +extern const q31_t controller_q31_inputs[CONTROLLER_MAX_LEN]; +extern const q15_t * controller_q15_inputs; +extern const float32_t controller_f32_coeffs[CONTROLLER_MAX_COEFFS_LEN]; +extern const q31_t controller_q31_coeffs[CONTROLLER_MAX_COEFFS_LEN]; +extern const q15_t controller_q15_coeffs[CONTROLLER_MAX_COEFFS_LEN]; + +#endif /* _CONTROLLER_TEST_DATA_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_test_group.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_test_group.h new file mode 100644 index 0000000..baead25 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_test_group.h @@ -0,0 +1,9 @@ +#ifndef _CONTROLLER_TEST_GROUP_H_ +#define _CONTROLLER_TEST_GROUP_H_ + +/*--------------------------------------------------------------------------------*/ +/* Declare Test Group */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(controller_tests); + +#endif /* _CONTROLLER_TEST_GROUP_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_tests.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_tests.h new file mode 100644 index 0000000..41996a8 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/controller_tests/controller_tests.h @@ -0,0 +1,11 @@ +#ifndef _CONTROLLER_TESTS_H_ +#define _CONTROLLER_TESTS_H_ + +/*--------------------------------------------------------------------------------*/ +/* Test/Group Declarations */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(pid_reset_tests); +JTEST_DECLARE_GROUP(sin_cos_tests); +JTEST_DECLARE_GROUP(pid_tests); + +#endif /* _CONTROLLER_TESTS_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/fast_math_tests/fast_math_templates.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/fast_math_tests/fast_math_templates.h new file mode 100644 index 0000000..5b49512 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/fast_math_tests/fast_math_templates.h @@ -0,0 +1,102 @@ +#ifndef _FAST_MATH_TEMPLATES_H_ +#define _FAST_MATH_TEMPLATES_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "test_templates.h" +#include /* memcpy() */ + +/*--------------------------------------------------------------------------------*/ +/* Group Specific Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Comparison SNR thresholds for the data types used in transform_tests. + */ +#define FAST_MATH_SNR_THRESHOLD_float32_t 95 +#define FAST_MATH_SNR_THRESHOLD_q31_t 95 +#define FAST_MATH_SNR_THRESHOLD_q15_t 45 + +/** + * Compare the outputs from the function under test and the reference + * function using SNR. + */ +#define FAST_MATH_SNR_COMPARE_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + fast_math_output_f32_ref, \ + (output_type *) fast_math_output_ref, \ + fast_math_output_f32_fut, \ + (output_type *) fast_math_output_fut, \ + block_size, \ + output_type, \ + FAST_MATH_SNR_THRESHOLD_##output_type \ + ); \ + } while (0) + + +/*--------------------------------------------------------------------------------*/ +/* TEST Templates */ +/*--------------------------------------------------------------------------------*/ + +#define SQRT_TEST_TEMPLATE_ELT1(suffix) \ + \ + JTEST_DEFINE_TEST(arm_sqrt_##suffix##_test, arm_sqrt_##suffix) \ + { \ + uint32_t i; \ + \ + JTEST_COUNT_CYCLES( \ + for(i=0;i /* memcpy() */ + +/*--------------------------------------------------------------------------------*/ +/* Group Specific Templates */ +/*--------------------------------------------------------------------------------*/ + +/** +* Comparison SNR thresholds for the data types used in transform_tests. +*/ +#define INTRINSICS_SNR_THRESHOLD_q63_t 120 +#define INTRINSICS_SNR_THRESHOLD_q31_t 95 + +/** +* Compare the outputs from the function under test and the reference +* function using SNR. +*/ +#define INTRINSICS_SNR_COMPARE_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + intrinsics_output_f32_ref, \ + (output_type##_t *) intrinsics_output_ref, \ + intrinsics_output_f32_fut, \ + (output_type##_t *) intrinsics_output_fut, \ + block_size, \ + output_type, \ + INTRINSICS_SNR_THRESHOLD_##output_type##_t \ + ); \ + } while (0) + + +/*--------------------------------------------------------------------------------*/ +/* TEST Templates */ +/*--------------------------------------------------------------------------------*/ + +#define INTRINSICS_TEST_TEMPLATE_ELT1(functionName, dataType) \ + \ + JTEST_DEFINE_TEST(functionName##_test, functionName) \ + { \ + uint32_t i; \ + \ + JTEST_COUNT_CYCLES( \ + for(i=0;ipData, \ + ((output_type *) &matrix_output_fut)->pData, \ + ((output_type *) &matrix_output_fut)->numRows * \ + ((output_type *) &matrix_output_ref)->numCols * \ + sizeof(output_content_type)) + +/** + * Comparison SNR thresholds for the data types used in matrix_tests. + */ +#define MATRIX_SNR_THRESHOLD 120 + +/** + * Compare the outputs from the function under test and the reference + * function using SNR. + */ +#define MATRIX_SNR_COMPARE_INTERFACE(output_type, output_content_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + (float32_t *)matrix_output_f32_ref, \ + ((output_type *) &matrix_output_ref)->pData, \ + (float32_t *)matrix_output_f32_fut, \ + ((output_type *) &matrix_output_ref)->pData, \ + ((output_type *) &matrix_output_fut)->numRows * \ + ((output_type *) &matrix_output_ref)->numCols, \ + output_content_type, \ + MATRIX_SNR_THRESHOLD \ + ); \ + } while (0) + +/** + * Compare the outputs from the function under test and the reference + * function using SNR. This is special for float64_t + */ +#define MATRIX_DBL_SNR_COMPARE_INTERFACE(output_type) \ + do \ + { \ + TEST_ASSERT_DBL_SNR( \ + (float64_t *)matrix_output_f32_ref, \ + (float64_t *)matrix_output_f32_fut, \ + ((output_type *) &matrix_output_fut)->numRows * \ + ((output_type *) &matrix_output_ref)->numCols, \ + MATRIX_SNR_THRESHOLD \ + ); \ + } while (0) + +/*--------------------------------------------------------------------------------*/ +/* Input Interfaces */ +/*--------------------------------------------------------------------------------*/ +/* + * General: + * Input interfaces provide inputs to functions inside test templates. They + * ONLY provide the inputs. The output variables should be hard coded. + * + * The input interfaces must have the following format: + * + * ARM_xxx_INPUT_INTERFACE() or + * REF_xxx_INPUT_INTERFACE() + * + * The xxx must be lowercase, and is intended to be the indentifying substring + * in the function's name. Acceptable values are 'sub' or 'add' from the + * functions arm_add_q31. + */ + +#define ARM_mat_add_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut) + +#define REF_mat_add_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref) + +#define ARM_mat_cmplx_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut) + +#define REF_mat_cmplx_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref) + +#define ARM_mat_inverse_INPUT_INTERFACE(input_ptr) \ + PAREN(input_ptr, (void *) &matrix_output_fut) + +#define REF_mat_inverse_INPUT_INTERFACE(input_ptr) \ + PAREN(input_ptr, (void *) &matrix_output_ref) + +#define ARM_mat_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut) + +#define REF_mat_mult_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref) + +#define ARM_mat_mult_fast_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut) + +#define REF_mat_mult_fast_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref) + +#define ARM_mat_sub_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_fut) + +#define REF_mat_sub_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, (void *) &matrix_output_ref) + +#define ARM_mat_trans_INPUT_INTERFACE(input_ptr) \ + PAREN(input_ptr, (void *) &matrix_output_fut) + +#define REF_mat_trans_INPUT_INTERFACE(input_ptr) \ + PAREN(input_ptr, (void *) &matrix_output_ref) + +/*--------------------------------------------------------------------------------*/ +/* Dimension Validation Interfaces */ +/*--------------------------------------------------------------------------------*/ + +#define MATRIX_TEST_VALID_ADDITIVE_DIMENSIONS(input_type, \ + matrix_a_ptr, \ + matrix_b_ptr) \ + ((((input_type) (matrix_a_ptr))->numRows == \ + ((input_type) (matrix_b_ptr))->numRows) && \ + (((input_type) (matrix_a_ptr))->numCols == \ + ((input_type) (matrix_b_ptr))->numCols)) + +#define MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS(input_type, \ + matrix_a_ptr, \ + matrix_b_ptr) \ + (((input_type) (matrix_a_ptr))->numCols == \ + ((input_type) (matrix_b_ptr))->numRows) + +#define MATRIX_TEST_VALID_SQUARE_DIMENSIONS(input_type, \ + matrix_ptr) \ + (((input_type)(matrix_ptr))->numRows == \ + ((input_type)(matrix_ptr))->numCols) + +#define MATRIX_TEST_VALID_DIMENSIONS_ALWAYS(input_type, \ + matrix_ptr) \ + (1 == 1) \ + +/*--------------------------------------------------------------------------------*/ +/* Output Configuration Interfaces */ +/*--------------------------------------------------------------------------------*/ +/* The matrix tests assume the output matrix is always the correct size. These + * interfaces size the properly size the output matrices according to the input + * matrices and the operation at hand.*/ + +#define MATRIX_TEST_CONFIG_ADDITIVE_OUTPUT(input_type, \ + matrix_a_ptr, \ + matrix_b_ptr) \ + do \ + { \ + ((input_type) &matrix_output_fut)->numRows = \ + ((input_type)(matrix_a_ptr))->numRows; \ + ((input_type) &matrix_output_fut)->numCols = \ + ((input_type)(matrix_a_ptr))->numCols; \ + ((input_type) &matrix_output_ref)->numRows = \ + ((input_type)(matrix_a_ptr))->numRows; \ + ((input_type) &matrix_output_ref)->numCols = \ + ((input_type)(matrix_a_ptr))->numCols; \ + } while (0) + +#define MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT(input_type, \ + matrix_a_ptr, \ + matrix_b_ptr) \ + do \ + { \ + ((input_type) &matrix_output_fut)->numRows = \ + ((input_type)(matrix_a_ptr))->numRows; \ + ((input_type) &matrix_output_fut)->numCols = \ + ((input_type)(matrix_b_ptr))->numCols; \ + ((input_type) &matrix_output_ref)->numRows = \ + ((input_type)(matrix_a_ptr))->numRows; \ + ((input_type) &matrix_output_ref)->numCols = \ + ((input_type)(matrix_b_ptr))->numCols; \ + } while (0) + +#define MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT(input_type, \ + matrix_ptr) \ + do \ + { \ + ((input_type) &matrix_output_fut)->numRows = \ + ((input_type)(matrix_ptr))->numRows; \ + ((input_type) &matrix_output_fut)->numCols = \ + ((input_type)(matrix_ptr))->numCols; \ + ((input_type) &matrix_output_ref)->numRows = \ + ((input_type)(matrix_ptr))->numRows; \ + ((input_type) &matrix_output_ref)->numCols = \ + ((input_type)(matrix_ptr))->numCols; \ + } while (0) + +#define MATRIX_TEST_CONFIG_TRANSPOSE_OUTPUT(input_type, \ + matrix_ptr) \ + do \ + { \ + ((input_type) &matrix_output_fut)->numRows = \ + ((input_type)(matrix_ptr))->numCols; \ + ((input_type) &matrix_output_fut)->numCols = \ + ((input_type)(matrix_ptr))->numRows; \ + ((input_type) &matrix_output_ref)->numRows = \ + ((input_type)(matrix_ptr))->numCols; \ + ((input_type) &matrix_output_ref)->numCols = \ + ((input_type)(matrix_ptr))->numRows; \ + } while (0) + +/*--------------------------------------------------------------------------------*/ +/* TEST Templates */ +/*--------------------------------------------------------------------------------*/ + +#define MATRIX_TEST_TEMPLATE_ELT1(arr_desc_inputs, \ + input_type, \ + output_type, output_content_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + output_config_interface, \ + dim_validation_interface, \ + compare_interface) \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + input_idx, input_type, input, arr_desc_inputs \ + , \ + JTEST_DUMP_STRF("Matrix Dimensions: %dx%d\n", \ + (int)input->numRows, \ + (int)input->numCols); \ + \ + if (dim_validation_interface(input_type, \ + input)) { \ + output_config_interface(input_type, \ + input); \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface(input), \ + ref, ref_arg_interface(input)); \ + compare_interface(output_type, \ + output_content_type); \ + } else { \ + arm_status matrix_test_retval; \ + TEST_CALL_FUT( \ + matrix_test_retval = fut, \ + fut_arg_interface(input)); \ + \ + /* If dimensions are known bad, the fut should */ \ + /* detect it. */ \ + if ( matrix_test_retval != ARM_MATH_SIZE_MISMATCH) { \ + return JTEST_TEST_FAILED; \ + } \ + }); \ + return JTEST_TEST_PASSED; \ + } while (0) + + +#define MATRIX_TEST_TEMPLATE_ELT2(arr_desc_inputs_a, \ + arr_desc_inputs_b, \ + input_type, \ + output_type, output_content_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + output_config_interface, \ + dim_validation_interface, \ + compare_interface) \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + input_a_idx, input_type, input_a, arr_desc_inputs_a \ + , \ + input_type input_b = ARR_DESC_ELT( \ + input_type, input_a_idx, \ + &(arr_desc_inputs_b)); \ + \ + JTEST_DUMP_STRF("Matrix Dimensions: A %dx%d B %dx%d\n", \ + (int)input_a->numRows, \ + (int)input_a->numCols, \ + (int)input_b->numRows, \ + (int)input_b->numCols); \ + \ + if (dim_validation_interface(input_type, \ + input_a, \ + input_b)) { \ + \ + output_config_interface(input_type, \ + input_a, \ + input_b); \ + \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface(input_a, input_b), \ + ref, ref_arg_interface(input_a, input_b)); \ + \ + compare_interface(output_type, output_content_type); \ + \ + } else { \ + arm_status matrix_test_retval; \ + TEST_CALL_FUT( \ + matrix_test_retval = fut, fut_arg_interface(input_a, input_b)); \ + \ + /* If dimensions are known bad, the fut should */ \ + /* detect it. */ \ + if ( matrix_test_retval != ARM_MATH_SIZE_MISMATCH) { \ + return JTEST_TEST_FAILED; \ + } \ + }); \ + return JTEST_TEST_PASSED; \ + } while (0) + +/** + * Specialization of #MATRIX_TEST_TEMPLATE_ELT2() for matrix tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define MATRIX_DEFINE_TEST_TEMPLATE_ELT2(fn_name, suffix, \ + output_config_interface, \ + dim_validation_interface, \ + comparison_interface) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + MATRIX_TEST_TEMPLATE_ELT2( \ + matrix_##suffix##_a_inputs, \ + matrix_##suffix##_b_inputs, \ + arm_matrix_instance_##suffix * , \ + arm_matrix_instance_##suffix, \ + TYPE_FROM_ABBREV(suffix), \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + output_config_interface, \ + dim_validation_interface, \ + comparison_interface); \ + } \ + +/** + * Specialization of #MATRIX_TEST_TEMPLATE_ELT1() for matrix tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define MATRIX_DEFINE_TEST_TEMPLATE_ELT1(fn_name, suffix, \ + output_config_interface, \ + dim_validation_interface) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + MATRIX_TEST_TEMPLATE_ELT1( \ + matrix_##suffix##_a_inputs, \ + arm_matrix_instance_##suffix * , \ + arm_matrix_instance_##suffix, \ + TYPE_FROM_ABBREV(suffix), \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + output_config_interface, \ + dim_validation_interface, \ + MATRIX_COMPARE_INTERFACE); \ + } \ + + +#endif /* _MATRIX_TEMPLATES_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_test_data.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_test_data.h new file mode 100644 index 0000000..5940ae3 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_test_data.h @@ -0,0 +1,54 @@ +#ifndef _MATRIX_TEST_DATA_H_ +#define _MATRIX_TEST_DATA_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "arr_desc.h" +#include "arm_math.h" /* float32_t */ + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ +#define MATRIX_TEST_MAX_ROWS 4 +#define MATRIX_TEST_MAX_COLS 4 +#define MATRIX_TEST_BIGGEST_INPUT_TYPE float64_t +#define MATRIX_TEST_MAX_ELTS (MATRIX_TEST_MAX_ROWS * MATRIX_TEST_MAX_COLS) +#define MATRIX_MAX_COEFFS_LEN 16 +#define MATRIX_MAX_SHIFTS_LEN 5 + +/** + * Declare the matrix inputs defined by MATRIX_DEFINE_INPUTS. + */ +#define MATRIX_DECLARE_INPUTS(suffix) \ + ARR_DESC_DECLARE(matrix_##suffix##_a_inputs); \ + ARR_DESC_DECLARE(matrix_##suffix##_b_inputs); \ + ARR_DESC_DECLARE(matrix_##suffix##_invertible_inputs) + + +/*--------------------------------------------------------------------------------*/ +/* Declare Variables */ +/*--------------------------------------------------------------------------------*/ + +/* Input/Output Buffers */ +extern arm_matrix_instance_f32 matrix_output_fut; +extern arm_matrix_instance_f32 matrix_output_ref; +extern arm_matrix_instance_f64 matrix_output_fut64; +extern arm_matrix_instance_f64 matrix_output_ref64; +extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_f32_fut[MATRIX_TEST_MAX_ELTS]; +extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_f32_ref[MATRIX_TEST_MAX_ELTS]; +extern MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_scratch[MATRIX_TEST_MAX_ELTS]; + +/* Matrix Inputs */ +MATRIX_DECLARE_INPUTS(f64); +MATRIX_DECLARE_INPUTS(f32); +MATRIX_DECLARE_INPUTS(q31); +MATRIX_DECLARE_INPUTS(q15); + +extern const float32_t matrix_f32_scale_values[MATRIX_MAX_COEFFS_LEN]; +extern const q31_t matrix_q31_scale_values[MATRIX_MAX_COEFFS_LEN]; +extern const q15_t matrix_q15_scale_values[MATRIX_MAX_COEFFS_LEN]; +extern const int32_t matrix_shift_values[MATRIX_MAX_SHIFTS_LEN]; + +#endif /* _MATRIX_TEST_DATA_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_test_group.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_test_group.h new file mode 100644 index 0000000..017b125 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_test_group.h @@ -0,0 +1,9 @@ +#ifndef _MATRIX_TEST_GROUP_H_ +#define _MATRIX_TEST_GROUP_H_ + +/*--------------------------------------------------------------------------------*/ +/* Declare Test Groups */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(matrix_tests); + +#endif /* _MATRIX_TEST_GROUP_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_tests.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_tests.h new file mode 100644 index 0000000..9947c02 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/matrix_tests/matrix_tests.h @@ -0,0 +1,17 @@ +#ifndef _MATRIX_TESTS_H_ +#define _MATRIX_TESTS_H_ + +/*--------------------------------------------------------------------------------*/ +/* Test/Group Declarations */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(mat_add_tests); +JTEST_DECLARE_GROUP(mat_cmplx_mult_tests); +JTEST_DECLARE_GROUP(mat_init_tests); +JTEST_DECLARE_GROUP(mat_inverse_tests); +JTEST_DECLARE_GROUP(mat_mult_tests); +JTEST_DECLARE_GROUP(mat_mult_fast_tests); +JTEST_DECLARE_GROUP(mat_sub_tests); +JTEST_DECLARE_GROUP(mat_trans_tests); +JTEST_DECLARE_GROUP(mat_scale_tests); + +#endif /* _MATRIX_TESTS_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_templates.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_templates.h new file mode 100644 index 0000000..ddca35c --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_templates.h @@ -0,0 +1,157 @@ +#ifndef _STATISTICS_TEMPLATES_H_ +#define _STATISTICS_TEMPLATES_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "test_templates.h" + +/*--------------------------------------------------------------------------------*/ +/* Group Specific Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Compare the outputs from the function under test and the reference function. + */ +#define STATISTICS_COMPARE_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + TEST_ASSERT_BUFFERS_EQUAL( \ + statistics_output_ref.data_ptr, \ + statistics_output_fut.data_ptr, \ + 1 * sizeof(output_type) /* All fns return one value*/ \ + ); \ + TEST_ASSERT_EQUAL( \ + statistics_idx_fut, \ + statistics_idx_ref); \ + } while (0) \ + +/* + * Comparison SNR thresholds for the data types used in statistics_tests. + */ +#define STATISTICS_SNR_THRESHOLD_float32_t 120 +#define STATISTICS_SNR_THRESHOLD_q31_t 100 +#define STATISTICS_SNR_THRESHOLD_q15_t 60 +#define STATISTICS_SNR_THRESHOLD_q7_t 30 + +/** + * Compare reference and fut outputs using SNR. + * + * @note The outputs are converted to float32_t before comparison. + */ +#define STATISTICS_SNR_COMPARE_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + statistics_output_f32_ref, \ + statistics_output_ref.data_ptr, \ + statistics_output_f32_fut, \ + statistics_output_fut.data_ptr, \ + 1, /* All fns return one element*/ \ + output_type, \ + STATISTICS_SNR_THRESHOLD_##output_type \ + ); \ + } while (0) + + + +/*--------------------------------------------------------------------------------*/ +/* Input Interfaces */ +/*--------------------------------------------------------------------------------*/ +/* + * General: + * Input interfaces provide inputs to functions inside test templates. They + * ONLY provide the inputs. The output variables should be hard coded. + * + * The input interfaces must have the following format: + * + * ARM_xxx_INPUT_INTERFACE() or + * REF_xxx_INPUT_INTERFACE() + * + * The xxx must be lowercase, and is intended to be the indentifying substring + * in the function's name. Acceptable values are 'sub' or 'add' from the + * functions arm_add_q31. + */ + +#define ARM_max_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, \ + statistics_output_fut.data_ptr, &statistics_idx_fut) + +#define REF_max_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, \ + statistics_output_ref.data_ptr, &statistics_idx_ref) + +#define ARM_mean_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_fut.data_ptr) + +#define REF_mean_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_ref.data_ptr) + +#define ARM_min_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, \ + statistics_output_fut.data_ptr, &statistics_idx_fut) + +#define REF_min_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, \ + statistics_output_ref.data_ptr, &statistics_idx_ref) + +#define ARM_power_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_fut.data_ptr) + +#define REF_power_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_ref.data_ptr) + +#define ARM_rms_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_fut.data_ptr) + +#define REF_rms_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_ref.data_ptr) + +#define ARM_std_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_fut.data_ptr) + +#define REF_std_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_ref.data_ptr) + +#define ARM_var_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_fut.data_ptr) + +#define REF_var_INPUT_INTERFACE(input, block_size) \ + PAREN(input, block_size, statistics_output_ref.data_ptr) + + +/*--------------------------------------------------------------------------------*/ +/* Test Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Specialization of #TEST_TEMPLATE_BUF1_BLK() for statistics tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name, \ + suffix, \ + input_type, \ + output_type, \ + comparison_interface) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_BUF1_BLK( \ + statistics_f_all, \ + statistics_block_sizes, \ + input_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + comparison_interface); \ + } + + +#endif /* _STATISTICS_TEMPLATES_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_test_data.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_test_data.h new file mode 100644 index 0000000..3e1ee09 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_test_data.h @@ -0,0 +1,44 @@ +#ifndef _STATISTICS_TEST_DATA_H_ +#define _STATISTICS_TEST_DATA_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "arr_desc.h" +#include "arm_math.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ +#define STATISTICS_MAX_INPUT_ELEMENTS 32 +#define STATISTICS_BIGGEST_INPUT_TYPE float32_t + +/*--------------------------------------------------------------------------------*/ +/* Declare Variables */ +/*--------------------------------------------------------------------------------*/ + +/* Input/Output Buffers */ +ARR_DESC_DECLARE(statistics_output_fut); +ARR_DESC_DECLARE(statistics_output_ref); +extern uint32_t statistics_idx_fut; +extern uint32_t statistics_idx_ref; + +extern STATISTICS_BIGGEST_INPUT_TYPE +statistics_output_f32_ref[STATISTICS_MAX_INPUT_ELEMENTS]; + +extern STATISTICS_BIGGEST_INPUT_TYPE +statistics_output_f32_fut[STATISTICS_MAX_INPUT_ELEMENTS]; + + +/* Block Sizes */ +ARR_DESC_DECLARE(statistics_block_sizes); + +/* Float Inputs */ +ARR_DESC_DECLARE(statistics_zeros); +ARR_DESC_DECLARE(statistics_f_2); +ARR_DESC_DECLARE(statistics_f_15); +ARR_DESC_DECLARE(statistics_f_32); +ARR_DESC_DECLARE(statistics_f_all); + +#endif /* _STATISTICS_TEST_DATA_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_test_group.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_test_group.h new file mode 100644 index 0000000..d1446ed --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_test_group.h @@ -0,0 +1,9 @@ +#ifndef _STATISTICS_TEST_GROUP_H_ +#define _STATISTICS_TEST_GROUP_H_ + +/*--------------------------------------------------------------------------------*/ +/* Declare Test Groups */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(statistics_tests); + +#endif /* _STATISTICS_TEST_GROUP_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_tests.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_tests.h new file mode 100644 index 0000000..20df03e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/statistics_tests/statistics_tests.h @@ -0,0 +1,15 @@ +#ifndef _STATISTICS_TESTS_H_ +#define _STATISTICS_TESTS_H_ + +/*--------------------------------------------------------------------------------*/ +/* Test/Group Declarations */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(max_tests); +JTEST_DECLARE_GROUP(mean_tests); +JTEST_DECLARE_GROUP(min_tests); +JTEST_DECLARE_GROUP(power_tests); +JTEST_DECLARE_GROUP(rms_tests); +JTEST_DECLARE_GROUP(std_tests); +JTEST_DECLARE_GROUP(var_tests); + +#endif /* _STATISTICS_TESTS_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_templates.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_templates.h new file mode 100644 index 0000000..bc94791 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_templates.h @@ -0,0 +1,120 @@ +#ifndef _SUPPORT_TEMPLATES_H_ +#define _SUPPORT_TEMPLATES_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "test_templates.h" + +/*--------------------------------------------------------------------------------*/ +/* Group Specific Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Compare the outputs from the function under test and the reference function. + */ +#define SUPPORT_COMPARE_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + TEST_ASSERT_BUFFERS_EQUAL( \ + support_output_ref.data_ptr, \ + support_output_fut.data_ptr, \ + block_size * sizeof(output_type)); \ + } while (0) \ + +/*--------------------------------------------------------------------------------*/ +/* Input Interfaces */ +/*--------------------------------------------------------------------------------*/ +/* + * General: + * Input interfaces provide inputs to functions inside test templates. They + * ONLY provide the inputs. The output variables should be hard coded. + * + * The input interfaces must have the following format: + * + * ARM_xxx_INPUT_INTERFACE() or + * REF_xxx_INPUT_INTERFACE() + * + * The xxx must be lowercase, and is intended to be the indentifying substring + * in the function's name. Acceptable values are 'sub' or 'add' from the + * functions arm_add_q31. + */ + +#define ARM_copy_INPUT_INTERFACE(input, block_size) \ + PAREN(input, support_output_fut.data_ptr, block_size) + +#define REF_copy_INPUT_INTERFACE(input, block_size) \ + PAREN(input, support_output_ref.data_ptr, block_size) + +#define ARM_fill_INPUT_INTERFACE(elt, block_size) \ + PAREN(elt, support_output_fut.data_ptr, block_size) + +#define REF_fill_INPUT_INTERFACE(elt, block_size) \ + PAREN(elt, support_output_ref.data_ptr, block_size) + +#define ARM_x_to_y_INPUT_INTERFACE(input, block_size) \ + PAREN(input, support_output_fut.data_ptr, block_size) + +#define REF_x_to_y_INPUT_INTERFACE(input, block_size) \ + PAREN(input, support_output_ref.data_ptr, block_size) + +/*--------------------------------------------------------------------------------*/ +/* Test Templates */ +/*--------------------------------------------------------------------------------*/ + + +/** + * Specialization of #TEST_TEMPLATE_BUF1_BLK() for support tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define SUPPORT_DEFINE_TEST_TEMPLATE_BUF1_BLK(fn_name, \ + suffix, \ + input_type, \ + output_type, \ + comparison_interface) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_BUF1_BLK( \ + support_f_all, \ + support_block_sizes, \ + input_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + comparison_interface); \ + } + +/** + * Specialization of #TEST_TEMPLATE_ELT1_BLK() for support tests. + * + * @note This macro relies on the existance of ARM_xxx_INPUT_INTERFACE and + * REF_xxx_INPUT_INTERFACEs. + */ +#define SUPPORT_DEFINE_TEST_TEMPLATE_ELT1_BLK(fn_name, \ + suffix, \ + elt_type, \ + output_type, \ + comparison_interface) \ + JTEST_DEFINE_TEST(arm_##fn_name##_##suffix##_test, \ + arm_##fn_name##_##suffix) \ + { \ + TEST_TEMPLATE_ELT1_BLK( \ + support_elts, \ + support_block_sizes, \ + elt_type, \ + output_type, \ + arm_##fn_name##_##suffix, \ + ARM_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + REF_##fn_name##_INPUT_INTERFACE, \ + comparison_interface); \ + } + +#endif /* _SUPPORT_TEMPLATES_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_test_data.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_test_data.h new file mode 100644 index 0000000..cc6c636 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_test_data.h @@ -0,0 +1,31 @@ +#ifndef ARM_SUPPORT_TEST_DATA_H +#define ARM_SUPPORT_TEST_DATA_H + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "arr_desc.h" + +/*--------------------------------------------------------------------------------*/ +/* Declare Variables */ +/*--------------------------------------------------------------------------------*/ + +/* Input/Output Buffers */ +ARR_DESC_DECLARE(support_output_fut); +ARR_DESC_DECLARE(support_output_ref); + +/* Block Sizes*/ +ARR_DESC_DECLARE(support_block_sizes); + +/* Numbers */ +ARR_DESC_DECLARE(support_elts); + +/* Float Inputs */ +ARR_DESC_DECLARE(support_zeros); +ARR_DESC_DECLARE(support_f_2); +ARR_DESC_DECLARE(support_f_15); +ARR_DESC_DECLARE(support_f_32); +ARR_DESC_DECLARE(support_f_all); + +#endif diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_test_group.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_test_group.h new file mode 100644 index 0000000..ef3a768 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_test_group.h @@ -0,0 +1,9 @@ +#ifndef _SUPPORT_TEST_GROUP_H_ +#define _SUPPORT_TEST_GROUP_H_ + +/*--------------------------------------------------------------------------------*/ +/* Declare Test Groups */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(support_tests); + +#endif /* _SUPPORT_TEST_GROUP_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_tests.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_tests.h new file mode 100644 index 0000000..2eab273 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/support_tests/support_tests.h @@ -0,0 +1,11 @@ +#ifndef _SUPPORT_TESTS_H_ +#define _SUPPORT_TESTS_H_ + +/*--------------------------------------------------------------------------------*/ +/* Test/Group Declarations */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(copy_tests); +JTEST_DECLARE_GROUP(fill_tests); +JTEST_DECLARE_GROUP(x_to_y_tests); + +#endif /* _SUPPORT_TESTS_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/templates/template.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/templates/template.h new file mode 100644 index 0000000..e4577d1 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/templates/template.h @@ -0,0 +1,88 @@ +#ifndef _TEMPLATE_H_ +#define _TEMPLATE_H_ + +/*--------------------------------------------------------------------------------*/ +/* Looping and Iteration */ +/*--------------------------------------------------------------------------------*/ + +/** + * Template for the general structure of a loop. + */ +#define TEMPLATE_LOOP(setup, loop_def, body) \ + do \ + { \ + setup; \ + loop_def { \ + body; \ + } \ + } while (0) + +/** + * Template for looping over an array-like sequence. + */ +#define TEMPLATE_DO_ARR_LIKE(iter_idx, type, \ + arr, arr_length, \ + iter_elem_setup, \ + body) \ + do \ + { \ + TEMPLATE_LOOP( \ + int iter_idx, \ + for(iter_idx = 0; iter_idx < (arr_length); ++iter_idx), \ + iter_elem_setup; \ + body); \ + } while (0) + +/** + * Template for looping over the contents of an array. + */ +#define TEMPLATE_DO_ARR(iter_idx, type, iter_elem, arr, arr_length, body) \ + do \ + { \ + TEMPLATE_DO_ARR_LIKE( \ + iter_idx, type, arr, arr_length, \ + type iter_elem = (arr)[iter_idx], \ + body); \ + } while (0) + +/** + * Template for looping over the contents of an #ARR_DESC. + */ +#define TEMPLATE_DO_ARR_DESC(iter_idx, type, iter_elem, arr_desc, body) \ + do \ + { \ + TEMPLATE_DO_ARR_LIKE( \ + iter_idx, type, arr_desc, (arr_desc).element_count, \ + type iter_elem = ARR_DESC_ELT(type, iter_idx, &(arr_desc)), \ + body); \ + } while (0) + +/*--------------------------------------------------------------------------------*/ +/* Test Definition */ +/*--------------------------------------------------------------------------------*/ + +/** + * Template for the general structure of a test. + */ +#define TEMPLATE_TEST(setup, body, teardown) \ + do \ + { \ + setup; \ + body; \ + teardown; \ + } while (0) + +/** + * Template for calling a function. + * + * @note Surround function arguments with the #PAREN() macro. + * + * @example + * void my_func(int arg1, int arg2); + * + * TEMPLATE_CALL_FN(my_func, PAREN(3, 7)); + */ +#define TEMPLATE_CALL_FN(fn, fn_args) \ + fn fn_args + +#endif /* _TEMPLATE_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/templates/test_templates.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/templates/test_templates.h new file mode 100644 index 0000000..3fa7c66 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/templates/test_templates.h @@ -0,0 +1,466 @@ +#ifndef _TEST_TEMPLATES_H_ +#define _TEST_TEMPLATES_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ +#include "template.h" +#include /* memcmp() */ +#include /* PRIu32 */ +#include "math_helper.h" /* arm_snr_f32() */ + +/*--------------------------------------------------------------------------------*/ +/* Function Aliases for use in Templates. */ +/*--------------------------------------------------------------------------------*/ +#define ref_q31_t_to_float ref_q31_to_float +#define ref_q15_t_to_float ref_q15_to_float +#define ref_q7_t_to_float ref_q7_to_float +#define ref_float_to_q31_t ref_float_to_q31 +#define ref_float_to_q15_t ref_float_to_q15 +#define ref_float_to_q7_t ref_float_to_q7 +#define ref_float32_t_to_float ref_copy_f32 +#define ref_float_to_float32_t ref_copy_f32 + + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Call the function-under-test. + */ +#define TEST_CALL_FUT(fut, fut_args) \ + JTEST_COUNT_CYCLES(TEMPLATE_CALL_FN(fut, fut_args)) + +/** + * Call the reference-function. + */ +#define TEST_CALL_REF(ref, ref_args) \ + TEMPLATE_CALL_FN(ref, ref_args) + +/** + * Call the function-under-test and the reference-function. + */ +#define TEST_CALL_FUT_AND_REF(fut, fut_args, ref, ref_args) \ + do { \ + TEST_CALL_FUT(fut, fut_args); \ + TEST_CALL_REF(ref, ref_args); \ + } while (0) + +/** + * This macro eats a variable number of arguments and evaluates to a null + * statement. + */ +#define TEST_NULL_STATEMENT(...) (void) "TEST_NULL_STATEMENT" + +/** + * A function name, Usable in any template where a fut or ref name is accepted, + * that evaluates to a #TEST_NULL_STATEMENT(). + */ +#define TEST_NULL_FN TEST_NULL_STATEMENT + +/** + * Assert that buffers A and B are byte-equivalent for a number of bytes. + */ + +#define TEST_ASSERT_BUFFERS_EQUAL(buf_a, buf_b, bytes)\ + do \ + { \ + if (memcmp(buf_a, buf_b, bytes) != 0) \ + { \ + return JTEST_TEST_FAILED; \ + } \ + } while (0) + + + + +/** + * Assert that the two entities are equal. + */ +#define TEST_ASSERT_EQUAL(a, b) \ + do \ + { \ + if ((a) != (b)) \ + { \ + return JTEST_TEST_FAILED;\ + } \ + } while (0) + +/** + * Convert elements to from src_type to float. + */ +#define TEST_CONVERT_TO_FLOAT(src_ptr, dst_ptr, block_size, src_type) \ + do \ + { \ + ref_##src_type##_to_float( \ + src_ptr, \ + dst_ptr, \ + block_size); \ + } while (0) \ + +/** + * Convert elements to from float to dst_type . + */ +#define TEST_CONVERT_FLOAT_TO(src_ptr, dst_ptr, block_size, dst_type) \ + do \ + { \ + ref_float_to_##dst_type( \ + src_ptr, \ + dst_ptr, \ + block_size); \ + } while (0) \ + +/** + * Assert that the SNR between a reference and test sample is above a given + * threshold. + */ + +#define TEST_ASSERT_SNR(ref_ptr, tst_ptr, block_size, threshold) \ + do \ + { \ + float32_t snr = arm_snr_f32(ref_ptr, tst_ptr, block_size);\ + if ( snr <= threshold) \ + { \ + JTEST_DUMP_STRF("SNR: %f\n", snr); \ + return JTEST_TEST_FAILED; \ + } \ + } while (0) + + +/** + * Assert that the SNR between a reference and test sample is above a given + * threshold. Special case for float64_t + */ + +#define TEST_ASSERT_DBL_SNR(ref_ptr, tst_ptr, block_size, threshold)\ + do \ + { \ + float64_t snr = arm_snr_f64(ref_ptr, tst_ptr, block_size); \ + if ( snr <= threshold) \ + { \ + JTEST_DUMP_STRF("SNR: %f\n", snr); \ + return JTEST_TEST_FAILED; \ + } \ + } while (0) + + +/** + * Compare test and reference elements by converting to float and + * calculating an SNR. + * + * This macro is a merger of the #TEST_CONVERT_TO_FLOAT() and + * #TEST_ASSERT_SNR() macros. + */ +#define TEST_CONVERT_AND_ASSERT_SNR(ref_dst_ptr, ref_src_ptr, \ + tst_dst_ptr, tst_src_ptr, \ + block_size, \ + tst_src_type, \ + threshold) \ + do \ + { \ + TEST_CONVERT_TO_FLOAT(ref_src_ptr, \ + ref_dst_ptr, \ + block_size, \ + tst_src_type); \ + TEST_CONVERT_TO_FLOAT(tst_src_ptr, \ + tst_dst_ptr, \ + block_size, \ + tst_src_type); \ + TEST_ASSERT_SNR(ref_dst_ptr, \ + tst_dst_ptr, \ + block_size, \ + threshold); \ + } while (0) + +/** + * Execute statements only if the combination of block size, function type + * specifier, and input ARR_DESC_t are valid. + * + * @example An ARR_DESC_t that contains 64 bytes cant service a 32 element + * block size if they are extracted in float32_t increments. + * + * 8 * 32 = 256 > 64. + */ +#define TEST_DO_VALID_BLOCKSIZE(block_size, fn_type_spec, \ + input_arr_desc, body) \ + do \ + { \ + if (block_size * sizeof(fn_type_spec) <= \ + ARR_DESC_BYTES(input_arr_desc)) \ + { \ + JTEST_DUMP_STRF("Block Size: %"PRIu32"\n", block_size); \ + body; \ + } \ + } while (0) \ + +/** + * Template for tests that rely on one input buffer and a blocksize parameter. + * + * The buffer is an #ARR_DESC_t. It is iterated over and it's values are + * passed to the function under test and reference functions through their + * appropriate argument interfaces. The argument interfaces this template to + * execute structurally similar functions. + * + */ +#define TEST_TEMPLATE_BUF1_BLK(arr_desc_inputs, \ + arr_desc_block_sizes, \ + input_type, output_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + compare_interface) \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + input_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs \ + , \ + TEMPLATE_DO_ARR_DESC( \ + block_size_idx, uint32_t, block_size, arr_desc_block_sizes \ + , \ + void * input_data_ptr = input_ptr->data_ptr; \ + \ + TEST_DO_VALID_BLOCKSIZE( \ + block_size, input_type, input_ptr \ + , \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + input_data_ptr, block_size), \ + ref, ref_arg_interface( \ + input_data_ptr, block_size)); \ + \ + compare_interface(block_size, output_type)))); \ + \ + return JTEST_TEST_PASSED; \ + \ + } while (0) + +/** + * Template for tests that rely on an input buffer and an element. + * + * An element can is any thing which doesn't walk and talk like a + * sequence. Examples include numbers, and structures. + */ +#define TEST_TEMPLATE_BUF1_ELT1(arr_desc_inputs, \ + arr_desc_elts, \ + input_type, elt_type, output_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + compare_interface) \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + input_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs \ + , \ + TEMPLATE_DO_ARR_DESC( \ + elt_idx, elt_type, elt, arr_desc_elts \ + , \ + void * input_data_ptr = input_ptr->data_ptr; \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface(input_data_ptr, elt), \ + ref, ref_arg_interface(input_data_ptr, elt)); \ + \ + compare_interface(output_type))); \ + return JTEST_TEST_PASSED; \ + } while (0) + +/** + * Template for tests that rely on an input buffer, an element, and a blocksize + * parameter. + */ +#define TEST_TEMPLATE_BUF1_ELT1_BLK(arr_desc_inputs, \ + arr_desc_elts, \ + arr_desc_block_sizes, \ + input_type, elt_type, output_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + compare_interface); \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + inut_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs \ + , \ + TEMPLATE_DO_ARR_DESC( \ + block_size_idx, uint32_t, block_size, \ + arr_desc_block_sizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + elt_idx, elt_type, elt, arr_desc_elts \ + , \ + void * input_data_ptr = input_ptr->data_ptr; \ + TEST_DO_VALID_BLOCKSIZE( \ + block_size, input_type, input_ptr, \ + \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + input_data_ptr, elt, block_size), \ + ref, ref_arg_interface( \ + input_data_ptr, elt, block_size)); \ + compare_interface(block_size, output_type))))); \ + return JTEST_TEST_PASSED; \ + } while (0) + +/** + * Template for tests that rely on an input buffer, two elements, and a blocksize + * parameter. + */ +#define TEST_TEMPLATE_BUF1_ELT2_BLK(arr_desc_inputs, \ + arr_desc_elt1s, \ + arr_desc_elt2s, \ + arr_desc_block_sizes, \ + input_type, elt1_type, \ + elt2_type, output_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + compare_interface) \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + inut_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs \ + , \ + TEMPLATE_DO_ARR_DESC( \ + block_size_idx, uint32_t, block_size, \ + arr_desc_block_sizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + elt1_idx, elt1_type, elt1, arr_desc_elt1s \ + , \ + TEMPLATE_DO_ARR_DESC( \ + elt2_idx, elt2_type, elt2, arr_desc_elt2s \ + , \ + void * input_data_ptr = input_ptr->data_ptr; \ + TEST_DO_VALID_BLOCKSIZE( \ + block_size, input_type, input_ptr, \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + input_data_ptr, elt1, elt2, block_size), \ + ref, ref_arg_interface( \ + input_data_ptr, elt1, elt2, block_size)); \ + compare_interface(block_size, output_type)))))); \ + return JTEST_TEST_PASSED; \ + } while (0) + +/** + * Template for tests that rely on two input buffers and a blocksize parameter. + * + * The two #ARR_DESC_t, input buffers are iterated through in parallel. The + * length of the first #ARR_DESC_t determines the length of the iteration. + */ +#define TEST_TEMPLATE_BUF2_BLK(arr_desc_inputs_a, \ + arr_desc_inputs_b, \ + arr_desc_block_sizes, \ + input_type, output_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + compare_interface) \ + do \ + { \ + /* Iterate over two input arrays in parallel.*/ \ + TEMPLATE_DO_ARR_DESC( \ + input_idx, ARR_DESC_t *, input_ptr, arr_desc_inputs_a \ + , \ + TEMPLATE_DO_ARR_DESC( \ + block_size_idx, uint32_t, block_size, arr_desc_block_sizes, \ + void * input_a_ptr = input_ptr->data_ptr; \ + void * input_b_ptr = ARR_DESC_ELT( \ + ARR_DESC_t *, input_idx, \ + &(arr_desc_inputs_b))->data_ptr; \ + \ + TEST_DO_VALID_BLOCKSIZE( \ + block_size, input_type, input_ptr \ + , \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + input_a_ptr, input_b_ptr, block_size), \ + ref, ref_arg_interface( \ + input_a_ptr, input_b_ptr, block_size)); \ + \ + compare_interface(block_size, output_type)))); \ + return JTEST_TEST_PASSED; \ + } while (0) + +/** + * Test template that uses a single element. + */ +#define TEST_TEMPLATE_ELT1(arr_desc_elts, \ + elt_type, output_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + compare_interface) \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + elt_idx, elt_type, elt, arr_desc_elts \ + , \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + elt), \ + ref, ref_arg_interface( \ + elt)); \ + /* Comparison interfaces typically accept */ \ + /* a block_size. Pass a dummy value 1.*/ \ + compare_interface(1, output_type)); \ + return JTEST_TEST_PASSED; \ + } while (0) + +/** + * Test template that iterates over two sets of elements in parallel. + * + * The length of the first set determines the number of iteratsions. + */ +#define TEST_TEMPLATE_ELT2(arr_desc_elts_a, \ + arr_desc_elts_b, \ + elt_a_type, elt_b_type, output_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + compare_interface) \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + elt_a_idx, elt_a_type, elt_a, arr_desc_elts_a \ + , \ + elt_b_type * elt_b = ARR_DESC_ELT( \ + elt_b_type, \ + elt_a_idx, \ + arr_desc_elts_b); \ + \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + elt_a, elt_b), \ + ref, ref_arg_interface( \ + elt_a, elt_b)); \ + /* Comparison interfaces typically accept */ \ + /* a block_size. Pass a dummy value 1.*/ \ + compare_interface(1, output_type)); \ + return JTEST_TEST_PASSED; \ + } while (0) + +/** + * Test template that uses an element and a block size. + */ +#define TEST_TEMPLATE_ELT1_BLK(arr_desc_elts, \ + arr_desc_block_sizes, \ + elt_type, output_type, \ + fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + compare_interface) \ + do \ + { \ + TEMPLATE_DO_ARR_DESC( \ + block_size_idx, uint32_t, block_size, \ + arr_desc_block_sizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + elt_idx, elt_type, elt, arr_desc_elts \ + , \ + JTEST_DUMP_STRF("Block Size: %d\n", \ + (int)block_size); \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + elt, block_size), \ + ref, ref_arg_interface( \ + elt, block_size)); \ + compare_interface(block_size, output_type))); \ + return JTEST_TEST_PASSED; \ + } while (0) + +#endif /* _TEST_TEMPLATES_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_templates.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_templates.h new file mode 100644 index 0000000..c6314b5 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_templates.h @@ -0,0 +1,181 @@ +#ifndef _TRANSFORM_TEMPLATES_H_ +#define _TRANSFORM_TEMPLATES_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "test_templates.h" +#include /* memcpy() */ + +/*--------------------------------------------------------------------------------*/ +/* Group Specific Templates */ +/*--------------------------------------------------------------------------------*/ + +/** + * Comparison SNR thresholds for the data types used in transform_tests. + */ +#define TRANSFORM_SNR_THRESHOLD_float32_t 90 +#define TRANSFORM_SNR_THRESHOLD_q31_t 90 +#define TRANSFORM_SNR_THRESHOLD_q15_t 30 + +#define DCT4_TRANSFORM_SNR_THRESHOLD_float32_t 80 +#define DCT4_TRANSFORM_SNR_THRESHOLD_q31_t 75 +#define DCT4_TRANSFORM_SNR_THRESHOLD_q15_t 11 + +/** + * Compare the outputs from the function under test and the reference + * function using SNR. + */ +#define TRANSFORM_SNR_COMPARE_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + transform_fft_output_f32_ref, \ + (output_type *) transform_fft_output_ref, \ + transform_fft_output_f32_fut, \ + (output_type *) transform_fft_output_fut, \ + block_size, \ + output_type, \ + TRANSFORM_SNR_THRESHOLD_##output_type \ + ); \ + } while (0) + +/** + * Compare the outputs from the function under test and the reference + * function using SNR. + */ +#define DCT_TRANSFORM_SNR_COMPARE_INTERFACE(block_size, \ + output_type) \ + do \ + { \ + TEST_CONVERT_AND_ASSERT_SNR( \ + transform_fft_output_f32_ref, \ + (output_type *) transform_fft_output_ref, \ + transform_fft_output_f32_fut, \ + (output_type *) transform_fft_output_fut, \ + block_size, \ + output_type, \ + DCT4_TRANSFORM_SNR_THRESHOLD_##output_type \ + ); \ + } while (0) \ + +/** + * Specialization on #TRANSFORM_SNR_COMPARE_INTERFACE() to fix the block_size + * for complex datasets. + */ +#define TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE(block_size, output_type) \ + /* Complex numbers have two components*/ \ + TRANSFORM_SNR_COMPARE_INTERFACE(block_size * 2, output_type ) + +/** + * This macro copys data from the input_ptr into input arrays. + * + * Some functions modify their input data; in order to provide the same data to + * multiple tests, copies must be made so the changes from one function don't + * impact the others. + */ +#define TRANSFORM_COPY_INPUTS(input_ptr, \ + bytes) \ + do \ + { \ + memcpy( \ + transform_fft_input_fut, \ + input_ptr, \ + bytes); \ + memcpy( \ + transform_fft_input_ref, \ + input_ptr, \ + bytes); \ + } while (0) + +/** + * This macro copys data from the input_ptr into input arrays. It also creates + * symmetric input data for rfft inverse. + * + * The 4.534234f just makes the middle entry of the array semi random. It's + * actual value doesn't seem to matter much. + * + * Some functions modify their input data; in order to provide the same data to + * multiple tests, copies must be made so the changes from one function don't + * impact the others. + */ +#define TRANSFORM_PREPARE_INVERSE_INPUTS(input_ptr, \ + fftlen, input_type, bytes) \ + do \ + { \ + uint32_t i; \ + \ + memcpy( \ + transform_fft_input_fut, \ + input_ptr, \ + bytes); \ + \ + ((input_type*)transform_fft_input_fut)[1] = 0; \ + ((input_type*)transform_fft_input_fut)[fftlen + 0] = 0; \ + ((input_type*)transform_fft_input_fut)[fftlen + 1] = 0; \ + for(i=1;i>= 1; \ + *((type*)transform_fft_inplace_input_ref + i) >>= 1;} \ + } while (0) + +/** + * This macro copys data from the input_ptr into the in-place input arrays. + * + * Some functions modify their input data; in order to provide the same data to + * multiple tests, copies must be made so the changes from one function don't + * impact the others. + */ +#define TRANSFORM_PREPARE_INPLACE_INPUTS(input_ptr, \ + bytes) \ + do \ + { \ + memcpy( \ + transform_fft_inplace_input_fut, \ + input_ptr, \ + bytes); \ + memcpy( \ + transform_fft_inplace_input_ref, \ + input_ptr, \ + bytes); \ + } while (0) + + +#endif /* _TRANSFORM_TEMPLATES_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_test_data.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_test_data.h new file mode 100644 index 0000000..bda5e12 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_test_data.h @@ -0,0 +1,48 @@ +#ifndef _TRANSFORM_TEST_DATA_H_ +#define _TRANSFORM_TEST_DATA_H_ + +/*--------------------------------------------------------------------------------*/ +/* Includes */ +/*--------------------------------------------------------------------------------*/ + +#include "arr_desc.h" +#include "arm_math.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +#define TRANSFORM_MAX_FFT_LEN 4096 +#define TRANFORM_BIGGEST_INPUT_TYPE float32_t + +/*--------------------------------------------------------------------------------*/ +/* Variable Declarations */ +/*--------------------------------------------------------------------------------*/ + +/* Lengths are multiplied by 2 to accomodate complex numbers*/ +extern float32_t transform_fft_output_fut[TRANSFORM_MAX_FFT_LEN * 2]; +extern float32_t transform_fft_output_ref[TRANSFORM_MAX_FFT_LEN * 2]; +extern float32_t transform_fft_input_fut[TRANSFORM_MAX_FFT_LEN * 2]; +extern float32_t transform_fft_input_ref[TRANSFORM_MAX_FFT_LEN * 2]; +extern float32_t transform_fft_output_f32_fut[TRANSFORM_MAX_FFT_LEN * 2]; +extern float32_t transform_fft_output_f32_ref[TRANSFORM_MAX_FFT_LEN * 2]; +extern float32_t * transform_fft_inplace_input_fut; +extern float32_t * transform_fft_inplace_input_ref; +extern float32_t transform_fft_f32_inputs[TRANSFORM_MAX_FFT_LEN * 2]; +extern q31_t transform_fft_q31_inputs[TRANSFORM_MAX_FFT_LEN * 2]; +extern q15_t * transform_fft_q15_inputs; +extern q15_t dct4_transform_fft_q15_inputs[TRANSFORM_MAX_FFT_LEN * 2]; + +/* FFT Lengths */ +ARR_DESC_DECLARE(transform_radix2_fftlens); +ARR_DESC_DECLARE(transform_radix4_fftlens); +ARR_DESC_DECLARE(transform_rfft_fftlens); +ARR_DESC_DECLARE(transform_rfft_fast_fftlens); +ARR_DESC_DECLARE(transform_dct_fftlens); + +/* CFFT Structs */ +ARR_DESC_DECLARE(transform_cfft_f32_structs); +ARR_DESC_DECLARE(transform_cfft_q31_structs); +ARR_DESC_DECLARE(transform_cfft_q15_structs); + +#endif /* _TRANSFORM_TEST_DATA_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_test_group.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_test_group.h new file mode 100644 index 0000000..c1c7c9e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_test_group.h @@ -0,0 +1,9 @@ +#ifndef _TRANSFORM_TEST_GROUP_H_ +#define _TRANSFORM_TEST_GROUP_H_ + +/*--------------------------------------------------------------------------------*/ +/* Declare Test Groups */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(transform_tests); + +#endif /* _TRANSFORM_TEST_GROUP_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_tests.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_tests.h new file mode 100644 index 0000000..874c83f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/transform_tests/transform_tests.h @@ -0,0 +1,13 @@ +#ifndef _TRANSFORM_TESTS_H_ +#define _TRANSFORM_TESTS_H_ + +/*--------------------------------------------------------------------------------*/ +/* Test/Group Declarations */ +/*--------------------------------------------------------------------------------*/ +JTEST_DECLARE_GROUP(cfft_tests); +JTEST_DECLARE_GROUP(cfft_family_tests); +JTEST_DECLARE_GROUP(dct4_tests); +JTEST_DECLARE_GROUP(rfft_tests); +JTEST_DECLARE_GROUP(rfft_fast_tests); + +#endif /* _TRANSFORM_TESTS_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/type_abbrev.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/type_abbrev.h new file mode 100644 index 0000000..5909124 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/inc/type_abbrev.h @@ -0,0 +1,37 @@ +#ifndef _TYPE_ABBREV_H_ +#define _TYPE_ABBREV_H_ + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +/** + * Expand the abbreviation for a type into the type itself. + */ +#define TYPE_FROM_ABBREV(abbrev) \ + TYPE_ABBREV_##abbrev \ + +/** + * Expand the type to an abbreviation for that type. + * + * Inverse of #TYPE_FROM_ABBREV(). + * + * @note Should be able to get a type back by writing. + * TYPE_FROM_ABBREV(ABBREV_FROM_TYPE(type)) + */ +#define ABBREV_FROM_TYPE(type) \ + TYPE_SUFFIX_##type + +#define TYPE_ABBREV_f64 float64_t +#define TYPE_ABBREV_f32 float32_t +#define TYPE_ABBREV_q31 q31_t +#define TYPE_ABBREV_q15 q15_t +#define TYPE_ABBREV_q7 q7_t + +#define TYPE_SUFFIX_float64_t f64 +#define TYPE_SUFFIX_float32_t f32 +#define TYPE_SUFFIX_q31_t q31 +#define TYPE_SUFFIX_q15_t q15 +#define TYPE_SUFFIX_q7_t q7 + +#endif /* _TYPE_ABBREV_H_ */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/Retarget.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/Retarget.c new file mode 100644 index 0000000..ffac3df --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/Retarget.c @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------------- + * Name: Retarget.c + * Purpose: 'Retarget' layer for target-dependent low level functions + * Note(s): + *---------------------------------------------------------------------------- + * This file is part of the uVision/ARM development tools. + * This software may only be used under the terms of a valid, current, + * end user licence from KEIL for a compatible version of KEIL software + * development tools. Nothing else gives you the right to use this software. + * + * This software is supplied "AS IS" without warranties of any kind. + * + * Copyright (c) 2011 Keil - An ARM Company. All rights reserved. + *----------------------------------------------------------------------------*/ + +#include +#include +#include "Serial.h" + +#pragma import(__use_no_semihosting_swi) + + + +struct __FILE { int handle; /* Add whatever you need here */ }; +FILE __stdout; +FILE __stdin; + + +int fputc(int c, FILE *f) { + return (SER_PutChar(c)); +} + + +int fgetc(FILE *f) { + return (SER_GetChar()); +} + + +int ferror(FILE *f) { + /* Your implementation of ferror */ + return EOF; +} + + +void _ttywrch(int c) { + SER_PutChar(c); +} + + +void _sys_exit(int return_code) { +label: goto label; /* endless loop */ +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/startup_armv6-m.s b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/startup_armv6-m.s new file mode 100644 index 0000000..5c78027 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/startup_armv6-m.s @@ -0,0 +1,111 @@ +;/* File: startup_armv6-m.s +; * Purpose: startup file for armv7-m architecture devices. +; * Should be used with ARMCC +; * Version: V2.00 +; * Date: 16 November 2015 +; * +; */ +;/* Copyright (c) 2011 - 2014 ARM LIMITED +; +; All rights reserved. +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; - Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; - Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; - Neither the name of ARM nor the names of its contributors may be used +; to endorse or promote products derived from this software without +; specific prior written permission. +; * +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +; ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE +; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +; POSSIBILITY OF SUCH DAMAGE. +; ---------------------------------------------------------------------------*/ + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + IMPORT ||Image$$ARM_LIB_STACK$$ZI$$Limit|| + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD ||Image$$ARM_LIB_STACK$$ZI$$Limit|| ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + BKPT #0 + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + BKPT #0 + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + + ALIGN + + END diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/startup_armv7-m.s b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/startup_armv7-m.s new file mode 100644 index 0000000..11e5886 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCC/startup_armv7-m.s @@ -0,0 +1,134 @@ +;/* File: startup_armv7-m.s +; * Purpose: startup file for armv7-m architecture devices. +; * Should be used with ARMCC +; * Version: V2.00 +; * Date: 16 November 2015 +; * +; */ +;/* Copyright (c) 2011 - 2014 ARM LIMITED +; +; All rights reserved. +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; - Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; - Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; - Neither the name of ARM nor the names of its contributors may be used +; to endorse or promote products derived from this software without +; specific prior written permission. +; * +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +; ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE +; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +; POSSIBILITY OF SUCH DAMAGE. +; ---------------------------------------------------------------------------*/ + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + IMPORT ||Image$$ARM_LIB_STACK$$ZI$$Limit|| + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD ||Image$$ARM_LIB_STACK$$ZI$$Limit|| ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + BKPT #0 + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + BKPT #0 + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + BKPT #0 + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + BKPT #0 + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + BKPT #0 + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + + ALIGN + + END diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/startup_armv6-m.S b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/startup_armv6-m.S new file mode 100644 index 0000000..c87b893 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/startup_armv6-m.S @@ -0,0 +1,127 @@ +/* File: startup_armv6-m.S + * Purpose: startup file for armv6-m architecture devices. + * Should be used with ARMCLANG + * Version: V2.00 + * Date: 16 November 2015 + * + */ +/* Copyright (c) 2011 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ +/* + ;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +*/ + + + .syntax unified + .arch armv6-m + +/* .eabi_attribute Tag_ABI_align8_preserved,1 www.support.code-red-tech.com/CodeRedWiki/Preserve8 */ +.eabi_attribute 25, 1 /* Tag_ABI_align_preserved */ + + .global Image$$ARM_LIB_STACK$$ZI$$Limit + + + .section RESET, "x" + .align 2 + .globl __Vectors + .globl __Vectors_End + .globl __Vectors_Size +__Vectors: + .long Image$$ARM_LIB_STACK$$ZI$$Limit /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ +__Vectors_End: + + .equ __Vectors_Size, __Vectors_End - __Vectors + + + .text + .thumb + .align 2 + + .globl Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function + .thumb_func +Reset_Handler: + bl SystemInit + bl __main + + .globl NMI_Handler + .weak NMI_Handler + .type NMI_Handler, %function + .thumb_func +NMI_Handler: + bkpt #0 + b . + + .globl HardFault_Handler + .weak HardFault_Handler + .type HardFault_Handler, %function + .thumb_func +HardFault_Handler: + bkpt #0 + b . + + .globl SVC_Handler + .weak SVC_Handler + .type SVC_Handler, %function + .thumb_func +SVC_Handler: + bkpt #0 + b . + + .globl PendSV_Handler + .weak PendSV_Handler + .type PendSV_Handler, %function + .thumb_func +PendSV_Handler: + bkpt #0 + b . + + .globl SysTick_Handler + .weak SysTick_Handler + .type SysTick_Handler, %function + .thumb_func +SysTick_Handler: + bkpt #0 + b . + + .end diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/startup_armv7-m.S b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/startup_armv7-m.S new file mode 100644 index 0000000..bf6c54e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/ARMCLANG/startup_armv7-m.S @@ -0,0 +1,159 @@ +/* File: startup_armv7-m.S + * Purpose: startup file for armv7-m architecture devices. + * Should be used with ARMCLANG + * Version: V2.00 + * Date: 16 November 2015 + * + */ +/* Copyright (c) 2011 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ +/* + ;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +*/ + + + .syntax unified + .arch armv7-m + +/* .eabi_attribute Tag_ABI_align8_preserved,1 www.support.code-red-tech.com/CodeRedWiki/Preserve8 */ +.eabi_attribute 25, 1 /* Tag_ABI_align_preserved */ + + .global Image$$ARM_LIB_STACK$$ZI$$Limit + + + .section RESET, "x" + .align 2 + .globl __Vectors + .globl __Vectors_End + .globl __Vectors_Size +__Vectors: + .long Image$$ARM_LIB_STACK$$ZI$$Limit /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ +__Vectors_End: + + .equ __Vectors_Size, __Vectors_End - __Vectors + + + .text + .thumb + .align 2 + + .globl Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function + .thumb_func +Reset_Handler: + bl SystemInit + bl __main + + .globl NMI_Handler + .weak NMI_Handler + .type NMI_Handler, %function + .thumb_func +NMI_Handler: + bkpt #0 + b . + + .globl HardFault_Handler + .weak HardFault_Handler + .type HardFault_Handler, %function + .thumb_func +HardFault_Handler: + bkpt #0 + b . + + .globl MemManage_Handler + .weak MemManage_Handler + .type MemManage_Handler, %function + .thumb_func +MemManage_Handler: + bkpt #0 + b . + + .globl BusFault_Handler + .weak BusFault_Handler + .type BusFault_Handler, %function + .thumb_func +BusFault_Handler: + bkpt #0 + b . + + .globl UsageFault_Handler + .weak UsageFault_Handler + .type UsageFault_Handler, %function + .thumb_func +UsageFault_Handler: + bkpt #0 + b . + + .globl SVC_Handler + .weak SVC_Handler + .type SVC_Handler, %function + .thumb_func +SVC_Handler: + bkpt #0 + b . + + .globl DebugMon_Handler + .weak DebugMon_Handler + .type DebugMon_Handler, %function + .thumb_func +DebugMon_Handler: + bkpt #0 + b . + + .globl PendSV_Handler + .weak PendSV_Handler + .type PendSV_Handler, %function + .thumb_func +PendSV_Handler: + bkpt #0 + b . + + .globl SysTick_Handler + .weak SysTick_Handler + .type SysTick_Handler, %function + .thumb_func +SysTick_Handler: + bkpt #0 + b . + + .end diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/Retarget.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/Retarget.c new file mode 100644 index 0000000..0ab6c13 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/Retarget.c @@ -0,0 +1,106 @@ +/*---------------------------------------------------------------------------- + * Name: Retarget.c + * Purpose: 'Retarget' layer for target-dependent low level functions + * Note(s): + *---------------------------------------------------------------------------- + * This file is part of the uVision/ARM development tools. + * This software may only be used under the terms of a valid, current, + * end user licence from KEIL for a compatible version of KEIL software + * development tools. Nothing else gives you the right to use this software. + * + * This software is supplied "AS IS" without warranties of any kind. + * + * Copyright (c) 2012 Keil - An ARM Company. All rights reserved. + *----------------------------------------------------------------------------*/ + +#include +#include +#include + +int SER_PutChar (int c) { + + return (c); +} + +int SER_GetChar (void) { + + return (-1); +} + +/*-- GCC - Newlib runtime support --------------------------------------------*/ + +extern int __HeapBase; +extern int __HeapLimit; + +int _open (const char * path, int flags, ...) +{ + return (-1); +} + +int _close (int fd) +{ + return (-1); +} + +int _lseek (int fd, int ptr, int dir) +{ + return (0); +} + +int __attribute__((weak)) _fstat (int fd, struct stat * st) +{ + memset (st, 0, sizeof (* st)); + st->st_mode = S_IFCHR; + return (0); +} + +int _isatty (int fd) +{ + return (1); +} + +int _read (int fd, char * ptr, int len) +{ + char c; + int i; + + for (i = 0; i < len; i++) + { + c = SER_GetChar(); + if (c == 0x0D) break; + *ptr++ = c; + SER_PutChar(c); + } + return (len - i); +} + +int _write (int fd, char * ptr, int len) +{ + int i; + + for (i = 0; i < len; i++) SER_PutChar (*ptr++); + return (i); +} + +caddr_t _sbrk (int incr) +{ + static char * heap; + char * prev_heap; + + if (heap == NULL) + { + heap = (char *)&__HeapBase; + } + + prev_heap = heap; + + if ((heap + incr) > (char *)&__HeapLimit) + { + errno = ENOMEM; + return (caddr_t) -1; + } + + heap += incr; + + return (caddr_t) prev_heap; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/startup_armv6-m.S b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/startup_armv6-m.S new file mode 100644 index 0000000..c928912 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/startup_armv6-m.S @@ -0,0 +1,263 @@ +/* File: startup_armv6-m.S + * Purpose: startup file for armv6-m architecture devices. + * Should be used with GCC for ARM Embedded Processors + * Version: V2.00 + * Date: 16 November 2015 + * + */ +/* Copyright (c) 2011 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 1 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + bkpt #0 + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + .end diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/startup_armv7-m.S b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/startup_armv7-m.S new file mode 100644 index 0000000..2320877 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/GCC/startup_armv7-m.S @@ -0,0 +1,257 @@ +/* File: startup_armv7-m.S + * Purpose: startup file for armv7-m architecture devices. + * Should be used with GCC for ARM Embedded Processors + * Version: V2.00 + * Date: 16 November 2015 + * + */ +/* Copyright (c) 2011 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00000400 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000C00 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + .size __Vectors, . - __Vectors + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START _start +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + bkpt #0 + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + .end diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/startup_generic.S b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/startup_generic.S new file mode 100644 index 0000000..b8d454e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/startup_generic.S @@ -0,0 +1,68 @@ + +#if defined (__CC_ARM) + #if (defined (ARMCM0)) + #include "ARMCC\startup_armv6-m.s" + #elif (defined (ARMCM0P) || defined (ARMCM0P_MPU)) + #include "ARMCC\startup_armv6-m.s" + #elif (defined (ARMCM3)) + #include "ARMCC\startup_armv7-m.s" + #elif (defined (ARMCM4) || defined (ARMCM4_FP)) + #include "ARMCC\startup_armv7-m.s" + #elif (defined (ARMCM7) || defined (ARMCM7_SP) || defined (ARMCM7_DP)) + #include "ARMCC\startup_armv7-m.s" + #elif (defined (ARMv8MBL)) + #include "ARMCC\startup_armv6-m.s" + #elif (defined (ARMv8MML) || defined (ARMv8MML_DSP) || \ + defined (ARMv8MML_SP) || defined (ARMv8MML_DSP_SP) || \ + defined (ARMv8MML_DP) || defined (ARMv8MML_DSP_DP) ) + #include "ARMCC\startup_armv7-m.s" + #else + #error "No appropriate startup file found!" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if (defined (ARMCM0)) + #include "ARMCLANG\startup_armv6-m.S" + #elif (defined (ARMCM0P) || defined (ARMCM0P_MPU)) + #include "ARMCLANG\startup_armv6-m.S" + #elif (defined (ARMCM3)) + #include "ARMCLANG\startup_armv7-m.S" + #elif (defined (ARMCM4) || defined (ARMCM4_FP)) + #include "ARMCLANG\startup_armv7-m.S" + #elif (defined (ARMCM7) || defined (ARMCM7_SP) || defined (ARMCM7_DP)) + #include "ARMCLANG\startup_armv7-m.S" + #elif (defined (ARMv8MBL)) + #include "ARMCLANG\startup_armv6-m.S" + #elif (defined (ARMv8MML) || defined (ARMv8MML_DSP) || \ + defined (ARMv8MML_SP) || defined (ARMv8MML_DSP_SP) || \ + defined (ARMv8MML_DP) || defined (ARMv8MML_DSP_DP) ) + #include "ARMCLANG\startup_armv7-m.S" + #else + #error "No appropriate startup file found!" + #endif + +#elif defined (__GNUC__) + #if (defined (ARMCM0)) + #include "GCC\startup_armv6-m.S" + #elif (defined (ARMCM0P) || defined (ARMCM0P_MPU)) + #include "GCC\startup_armv6-m.S" + #elif (defined (ARMCM3)) + #include "GCC\startup_armv7-m.S" + #elif (defined (ARMCM4) || defined (ARMCM4_FP)) + #include "GCC\startup_armv7-m.S" + #elif (defined (ARMCM7) || defined (ARMCM7_SP) || defined (ARMCM7_DP)) + #include "GCC\startup_armv7-m.S" + #elif (defined (ARMv8MBL)) + #include "GCC\startup_armv6-m.S" + #elif (defined (ARMv8MML) || defined (ARMv8MML_DSP) || \ + defined (ARMv8MML_SP) || defined (ARMv8MML_DSP_SP) || \ + defined (ARMv8MML_DP) || defined (ARMv8MML_DSP_DP) ) + #include "GCC\startup_armv7-m.S" + #else + #error "No appropriate startup file found!" + #endif + +#else + #error "Compiler not supported!" +#endif + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM0.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM0.c new file mode 100644 index 0000000..b272255 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device Series + * @version V5.00 + * @date 07. September 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM23.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM23.c new file mode 100644 index 0000000..791ee34 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM23.c @@ -0,0 +1,82 @@ +/**************************************************************************//** + * @file system_ARMCM23.c + * @brief CMSIS Device System Source File for + * ARMCM23 Device Series + * @version V5.00 + * @date 21. October 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#if defined (ARMCM23) + #include "ARMCM23.h" +#elif defined (ARMCM23_TZ) + #include "ARMCM23_TZ.h" + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #include "partition_ARMCM23.h" + #endif +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + TZ_SAU_Setup(); +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM3.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM3.c new file mode 100644 index 0000000..2544c43 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device Series + * @version V5.00 + * @date 07. September 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM33.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM33.c new file mode 100644 index 0000000..287119c --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM33.c @@ -0,0 +1,99 @@ +/**************************************************************************//** + * @file system_ARMCM33.c + * @brief CMSIS Device System Source File for + * ARMCM33 Device Series + * @version V5.00 + * @date 02. November 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#if defined (ARMCM33) + #include "ARMCM33.h" +#elif defined (ARMCM33_TZ) + #include "ARMCM33_TZ.h" + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #include "partition_ARMCM33.h" + #endif +#elif defined (ARMCM33_DSP_FP) + #include "ARMCM33_DSP_FP.h" +#elif defined (ARMCM33_DSP_FP_TZ) + #include "ARMCM33_DSP_FP_TZ.h" + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #include "partition_ARMCM33.h" + #endif +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* set CP10 Full Access */ + (3U << 11U*2U) ); /* set CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + TZ_SAU_Setup(); +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM4.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM4.c new file mode 100644 index 0000000..cea212e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device Series + * @version V5.00 + * @date 07. September 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* set CP10 Full Access */ + (3U << 11U*2U) ); /* set CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM7.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM7.c new file mode 100644 index 0000000..6a99c08 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device Series + * @version V5.00 + * @date 07. September 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* set CP10 Full Access */ + (3U << 11U*2U) ); /* set CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMSC000.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMSC000.c new file mode 100644 index 0000000..7fda345 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMSC000.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMSC000.c + * @brief CMSIS Device System Source File for + * for ARMSC000 Device Series + * @version V5.00 + * @date 07. September 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#include "ARMSC000.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMSC300.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMSC300.c new file mode 100644 index 0000000..3db4ee7 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMSC300.c @@ -0,0 +1,72 @@ +/**************************************************************************//** + * @file system_ARMSC300.c + * @brief CMSIS Device System Source File for + * ARMSC300 Device Series + * @version V5.00 + * @date 07. September 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#include "ARMSC300.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMv8MBL.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMv8MBL.c new file mode 100644 index 0000000..8310b8f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMv8MBL.c @@ -0,0 +1,76 @@ +/**************************************************************************//** + * @file system_ARMv8MBL.c + * @brief CMSIS Device System Source File for + * ARMv8MBL Device Series + * @version V5.00 + * @date 07. September 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#include "ARMv8MBL.h" + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #include "partition_ARMv8MBL.h" +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + TZ_SAU_Setup(); +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMv8MML.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMv8MML.c new file mode 100644 index 0000000..bd77100 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_ARMv8MML.c @@ -0,0 +1,99 @@ +/**************************************************************************//** + * @file system_ARMv8MML.c + * @brief CMSIS Device System Source File for + * ARMv8MML Device Series + * @version V5.00 + * @date 02. November 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ + +#if defined (ARMv8MML) + #include "ARMv8MML.h" +#elif defined (ARMv8MML_DSP) + #include "ARMv8MML_DSP.h" +#elif defined (ARMv8MML_SP) + #include "ARMv8MML_SP.h" +#elif defined (ARMv8MML_DSP_SP) + #include "ARMv8MML_DSP_SP.h" +#elif defined (ARMv8MML_DP) + #include "ARMv8MML_DP.h" +#elif defined (ARMv8MML_DSP_DP) + #include "ARMv8MML_DSP_DP.h" +#else + #error device not specified! +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #include "partition_ARMv8MML.h" +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL ( 5000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (5U * XTAL) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* set CP10 Full Access */ + (3U << 11U*2U) ); /* set CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + TZ_SAU_Setup(); +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_generic.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_generic.c new file mode 100644 index 0000000..37d82ab --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/platform/system_generic.c @@ -0,0 +1,27 @@ + +#if (defined (ARMCM0)) + #include "system_ARMCM0.c" + +#elif (defined (ARMCM0P)) + #include "system_ARMCM0plus.c" + +#elif (defined (ARMCM3)) + #include "system_ARMCM3.c" + +#elif (defined (ARMCM4) || defined (ARMCM4_FP)) + #include "system_ARMCM4.c" + +#elif (defined (ARMCM7) || defined (ARMCM7_SP) || defined (ARMCM7_DP)) + #include "system_ARMCM7.c" + +#elif defined (ARMv8MBL) + #include "system_ARMv8MBL.c" + +#elif (defined (ARMv8MML) || defined (ARMv8MML_DSP) || \ + defined (ARMv8MML_SP) || defined (ARMv8MML_DSP_SP) || \ + defined (ARMv8MML_DP) || defined (ARMv8MML_DSP_DP) ) + #include "system_ARMv8MML.c" + +#else + #error "No appropriate system file found!" +#endif diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/all_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/all_tests.c new file mode 100644 index 0000000..1e471f9 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/all_tests.c @@ -0,0 +1,62 @@ +#include "jtest.h" +#include "basic_math_test_group.h" +#include "complex_math_test_group.h" +#include "controller_test_group.h" +#include "fast_math_test_group.h" +#include "filtering_test_group.h" +#include "matrix_test_group.h" +#include "statistics_test_group.h" +#include "support_test_group.h" +#include "transform_test_group.h" +#include "intrinsics_test_group.h" + +JTEST_DEFINE_GROUP(all_tests) +{ + /* + To skip a test, comment it out + */ +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_BASICMATH_TESTS) + JTEST_GROUP_CALL(basic_math_tests); +#endif + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_COMPLEXMATH_TESTS) + JTEST_GROUP_CALL(complex_math_tests); +#endif + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_CONTROLLER_TESTS) + JTEST_GROUP_CALL(controller_tests); +#endif + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_FASTMATH_TESTS) + JTEST_GROUP_CALL(fast_math_tests); +#endif + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_FILTERING_TESTS) + /* Biquad df2T_f32 will fail with Neon. The test must be updated. + Neon implementation is requiring a different initialization. + */ + JTEST_GROUP_CALL(filtering_tests); +#endif + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_MATRIX_TESTS) + JTEST_GROUP_CALL(matrix_tests); +#endif + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_STATISTICS_TESTS) + JTEST_GROUP_CALL(statistics_tests); +#endif() + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_SUPPORT_TESTS) + JTEST_GROUP_CALL(support_tests); +#endif + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_TRANSFORM_TESTS) + JTEST_GROUP_CALL(transform_tests); +#endif + +#if !defined(CUSTOMIZE_TESTS) || defined(ENABLE_INTRINSICS_TESTS) + JTEST_GROUP_CALL(intrinsics_tests); +#endif + + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/abs_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/abs_tests.c new file mode 100644 index 0000000..6e6bedb --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/abs_tests.c @@ -0,0 +1,32 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_ABS_TEST(suffix) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + abs, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix)) + +JTEST_ARM_ABS_TEST(f32); +JTEST_ARM_ABS_TEST(q31); +JTEST_ARM_ABS_TEST(q15); +JTEST_ARM_ABS_TEST(q7 ); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(abs_tests) +{ + JTEST_TEST_CALL(arm_abs_f32_test); + JTEST_TEST_CALL(arm_abs_q31_test); + JTEST_TEST_CALL(arm_abs_q15_test); + JTEST_TEST_CALL(arm_abs_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/add_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/add_tests.c new file mode 100644 index 0000000..a2d043c --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/add_tests.c @@ -0,0 +1,33 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_ADD_TEST(suffix) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK( \ + add, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + BASIC_MATH_COMPARE_INTERFACE) + +JTEST_ARM_ADD_TEST(f32); +JTEST_ARM_ADD_TEST(q31); +JTEST_ARM_ADD_TEST(q15); +JTEST_ARM_ADD_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(add_tests) +{ + JTEST_TEST_CALL(arm_add_f32_test); + JTEST_TEST_CALL(arm_add_q31_test); + JTEST_TEST_CALL(arm_add_q15_test); + JTEST_TEST_CALL(arm_add_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/basic_math_test_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/basic_math_test_common_data.c new file mode 100644 index 0000000..86728f9 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/basic_math_test_common_data.c @@ -0,0 +1,101 @@ +#include "basic_math_test_data.h" + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(BASIC_MATH_BIGGEST_INPUT_TYPE, + basic_math_output_fut, + BASIC_MATH_MAX_INPUT_ELEMENTS, + CURLY(0)); + +ARR_DESC_DEFINE(BASIC_MATH_BIGGEST_INPUT_TYPE, + basic_math_output_ref, + BASIC_MATH_MAX_INPUT_ELEMENTS, + CURLY(0)); + +BASIC_MATH_BIGGEST_INPUT_TYPE +basic_math_output_f32_ref[BASIC_MATH_MAX_INPUT_ELEMENTS]; + +BASIC_MATH_BIGGEST_INPUT_TYPE +basic_math_output_f32_fut[BASIC_MATH_MAX_INPUT_ELEMENTS]; + +/*--------------------------------------------------------------------------------*/ +/* Block Sizes */ +/*--------------------------------------------------------------------------------*/ + +/* + To change test parameter values add/remove values inside CURLY and update + the preceeding parameter to reflect the number of values inside CURLY. +*/ + +ARR_DESC_DEFINE(uint32_t, + basic_math_block_sizes, + 4, + CURLY( 2, 7, 15, 32)); + +/*--------------------------------------------------------------------------------*/ +/* Numbers */ +/*--------------------------------------------------------------------------------*/ + +/* + To change test parameter values add/remove values inside CURLY and update + the preceeding parameter to reflect the number of values inside CURLY. +*/ + +ARR_DESC_DEFINE(uint32_t, + basic_math_elts, + 4, + CURLY( 0, 1, 0x80000000, 0x7fffffff)); + +ARR_DESC_DEFINE(int8_t, + basic_math_elts2, + 5, + CURLY( 0, 3, -3, -7, 7)); + +ARR_DESC_DEFINE(float32_t, + basic_math_eltsf, + 6, + CURLY( 0.0f, 1.0f, 1.254001, -1.665584, -127.435646, 245.34634267)); + +/*--------------------------------------------------------------------------------*/ +/* Test Data */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(float32_t, + basic_math_f_32, + 32, + CURLY( + -0.432565, -1.665584, 0.125332, 0.287676, -1.146471, + 1.190915, 1.189164, -0.037633, 0.327292, 0.174639, + -0.186709, 0.725791, -0.588317, 2.183186, -0.136396, + 0.113931, 1.066768, 0.059281, -0.095648, -0.832349, + 0.294411, -1.336182, 0.714325, 1.623562, -0.691776, + 0.857997, 1.254001, -1.593730, -1.440964, 0.571148, + -0.399886, 0.689997 + )); + +/* Alias the 32 element array with wrappers that end sooner. */ +ARR_DESC_DEFINE_SUBSET(basic_math_f_15, + basic_math_f_32, + 15); + +ARR_DESC_DEFINE_SUBSET(basic_math_f_2, + basic_math_f_32, + 2); + +ARR_DESC_DEFINE(float32_t, + basic_math_zeros, + 32, + CURLY(0)); + +/* Aggregate all float datasets. */ +ARR_DESC_DEFINE(ARR_DESC_t *, + basic_math_f_all, + 4, + CURLY( + &basic_math_zeros, + &basic_math_f_2, + &basic_math_f_15, + &basic_math_f_32 + )); diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/basic_math_test_group.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/basic_math_test_group.c new file mode 100644 index 0000000..7b219fe --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/basic_math_test_group.c @@ -0,0 +1,17 @@ +#include "jtest.h" +#include "basic_math_tests.h" + +JTEST_DEFINE_GROUP(basic_math_tests) +{ + JTEST_GROUP_CALL(abs_tests); + JTEST_GROUP_CALL(add_tests); + JTEST_GROUP_CALL(dot_prod_tests); + JTEST_GROUP_CALL(mult_tests); + JTEST_GROUP_CALL(negate_tests); + JTEST_GROUP_CALL(offset_tests); + JTEST_GROUP_CALL(scale_tests); + JTEST_GROUP_CALL(shift_tests); + JTEST_GROUP_CALL(sub_tests); + + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/dot_prod_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/dot_prod_tests.c new file mode 100644 index 0000000..ed758a1 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/dot_prod_tests.c @@ -0,0 +1,33 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_DOT_PROD_TEST(suffix) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK( \ + dot_prod, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + BASIC_MATH_SNR_ELT1_COMPARE_INTERFACE) + +JTEST_ARM_DOT_PROD_TEST(f32); +JTEST_ARM_DOT_PROD_TEST(q31); +JTEST_ARM_DOT_PROD_TEST(q15); +JTEST_ARM_DOT_PROD_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(dot_prod_tests) +{ + JTEST_TEST_CALL(arm_dot_prod_f32_test); + JTEST_TEST_CALL(arm_dot_prod_q31_test); + JTEST_TEST_CALL(arm_dot_prod_q15_test); + JTEST_TEST_CALL(arm_dot_prod_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/mult_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/mult_tests.c new file mode 100644 index 0000000..a94bf68 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/mult_tests.c @@ -0,0 +1,33 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MULT_TEST(suffix, compare_interface) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK( \ + mult, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + compare_interface) + +JTEST_ARM_MULT_TEST(f32, BASIC_MATH_COMPARE_INTERFACE); +JTEST_ARM_MULT_TEST(q31, BASIC_MATH_SNR_COMPARE_INTERFACE); +JTEST_ARM_MULT_TEST(q15, BASIC_MATH_COMPARE_INTERFACE); +JTEST_ARM_MULT_TEST(q7 , BASIC_MATH_COMPARE_INTERFACE); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mult_tests) +{ + JTEST_TEST_CALL(arm_mult_f32_test); + JTEST_TEST_CALL(arm_mult_q31_test); + JTEST_TEST_CALL(arm_mult_q15_test); + JTEST_TEST_CALL(arm_mult_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/negate_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/negate_tests.c new file mode 100644 index 0000000..276cdac --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/negate_tests.c @@ -0,0 +1,32 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_NEGATE_TEST(suffix) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + negate, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix)) + +JTEST_ARM_NEGATE_TEST(f32); +JTEST_ARM_NEGATE_TEST(q31); +JTEST_ARM_NEGATE_TEST(q15); +JTEST_ARM_NEGATE_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(negate_tests) +{ + JTEST_TEST_CALL(arm_negate_f32_test); + JTEST_TEST_CALL(arm_negate_q31_test); + JTEST_TEST_CALL(arm_negate_q15_test); + JTEST_TEST_CALL(arm_negate_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/offset_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/offset_tests.c new file mode 100644 index 0000000..4e10f78 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/offset_tests.c @@ -0,0 +1,33 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_OFFSET_TEST(suffix) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT1_BLK( \ + offset, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix)) + +JTEST_ARM_OFFSET_TEST(f32); +JTEST_ARM_OFFSET_TEST(q31); +JTEST_ARM_OFFSET_TEST(q15); +JTEST_ARM_OFFSET_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(offset_tests) +{ + JTEST_TEST_CALL(arm_offset_f32_test); + JTEST_TEST_CALL(arm_offset_q31_test); + JTEST_TEST_CALL(arm_offset_q15_test); + JTEST_TEST_CALL(arm_offset_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/scale_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/scale_tests.c new file mode 100644 index 0000000..2839a8f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/scale_tests.c @@ -0,0 +1,52 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + + +#define JTEST_ARM_SCALE_TEST(suffix) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT2_BLK( \ + scale, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), /*elt1_type*/ \ + int8_t, /*elt2_type*/ \ + TYPE_FROM_ABBREV(suffix)) + +/* float32_t defined separately because it has less arguments */ +JTEST_DEFINE_TEST(arm_scale_f32_test, + arm_scale_f32) +{ + TEST_TEMPLATE_BUF1_ELT1_BLK( + basic_math_f_all, + basic_math_eltsf, + basic_math_block_sizes, + float32_t, + float32_t, + float32_t, + arm_scale_f32, + ARM_scale_float_INPUT_INTERFACE, + ref_scale_f32, + REF_scale_float_INPUT_INTERFACE, + BASIC_MATH_COMPARE_INTERFACE); +} + +JTEST_ARM_SCALE_TEST(q31); +JTEST_ARM_SCALE_TEST(q15); +JTEST_ARM_SCALE_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(scale_tests) +{ + JTEST_TEST_CALL(arm_scale_f32_test); + JTEST_TEST_CALL(arm_scale_q31_test); + JTEST_TEST_CALL(arm_scale_q15_test); + JTEST_TEST_CALL(arm_scale_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/shift_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/shift_tests.c new file mode 100644 index 0000000..ed83b63 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/shift_tests.c @@ -0,0 +1,31 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_SHIFT_TEST(suffix) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF1_ELT1_BLK( \ + shift, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + int8_t, /*elt_type*/ \ + TYPE_FROM_ABBREV(suffix)) + +JTEST_ARM_SHIFT_TEST(q31); +JTEST_ARM_SHIFT_TEST(q15); +JTEST_ARM_SHIFT_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(shift_tests) +{ + JTEST_TEST_CALL(arm_shift_q31_test); + JTEST_TEST_CALL(arm_shift_q15_test); + JTEST_TEST_CALL(arm_shift_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/sub_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/sub_tests.c new file mode 100644 index 0000000..a486842 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/basic_math_tests/sub_tests.c @@ -0,0 +1,33 @@ +#include "jtest.h" +#include "basic_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "basic_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_SUB_TEST(suffix) \ + BASIC_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK( \ + sub, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + BASIC_MATH_COMPARE_INTERFACE) + +JTEST_ARM_SUB_TEST(f32); +JTEST_ARM_SUB_TEST(q31); +JTEST_ARM_SUB_TEST(q15); +JTEST_ARM_SUB_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(sub_tests) +{ + JTEST_TEST_CALL(arm_sub_f32_test); + JTEST_TEST_CALL(arm_sub_q31_test); + JTEST_TEST_CALL(arm_sub_q15_test); + JTEST_TEST_CALL(arm_sub_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_conj_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_conj_tests.c new file mode 100644 index 0000000..7fcc0bc --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_conj_tests.c @@ -0,0 +1,31 @@ +#include "jtest.h" +#include "complex_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "complex_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_CMPLX_CONJ_TEST(suffix) \ + COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + cmplx_conj, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + COMPLEX_MATH_SNR_COMPARE_CMPLX_INTERFACE) + +JTEST_ARM_CMPLX_CONJ_TEST(f32); +JTEST_ARM_CMPLX_CONJ_TEST(q31); +JTEST_ARM_CMPLX_CONJ_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(cmplx_conj_tests) +{ + JTEST_TEST_CALL(arm_cmplx_conj_f32_test); + JTEST_TEST_CALL(arm_cmplx_conj_q31_test); + JTEST_TEST_CALL(arm_cmplx_conj_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_dot_prod_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_dot_prod_tests.c new file mode 100644 index 0000000..bcdaf5b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_dot_prod_tests.c @@ -0,0 +1,31 @@ +#include "jtest.h" +#include "complex_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "complex_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_CMPLX_DOT_PROD_TEST(suffix, comparison_interface) \ + COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK( \ + cmplx_dot_prod, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + comparison_interface) + +JTEST_ARM_CMPLX_DOT_PROD_TEST(f32, COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE); +JTEST_ARM_CMPLX_DOT_PROD_TEST(q31, COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE); +JTEST_ARM_CMPLX_DOT_PROD_TEST(q15, COMPLEX_MATH_SNR_COMPARE_SPLIT_INTERFACE); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(cmplx_dot_prod_tests) +{ + JTEST_TEST_CALL(arm_cmplx_dot_prod_f32_test); + JTEST_TEST_CALL(arm_cmplx_dot_prod_q31_test); + JTEST_TEST_CALL(arm_cmplx_dot_prod_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mag_squared_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mag_squared_tests.c new file mode 100644 index 0000000..9ca11fc --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mag_squared_tests.c @@ -0,0 +1,31 @@ +#include "jtest.h" +#include "complex_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "complex_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_CMPLX_MAG_SQUARED_TEST(suffix) \ + COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + cmplx_mag_squared, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + COMPLEX_MATH_COMPARE_RE_INTERFACE) + +JTEST_ARM_CMPLX_MAG_SQUARED_TEST(f32); +JTEST_ARM_CMPLX_MAG_SQUARED_TEST(q31); +JTEST_ARM_CMPLX_MAG_SQUARED_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(cmplx_mag_squared_tests) +{ + JTEST_TEST_CALL(arm_cmplx_mag_squared_f32_test); + JTEST_TEST_CALL(arm_cmplx_mag_squared_q31_test); + JTEST_TEST_CALL(arm_cmplx_mag_squared_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mag_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mag_tests.c new file mode 100644 index 0000000..8711957 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mag_tests.c @@ -0,0 +1,31 @@ +#include "jtest.h" +#include "complex_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "complex_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_CMPLX_MAG_TEST(suffix, comparison_interface) \ + COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + cmplx_mag, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + comparison_interface) + +JTEST_ARM_CMPLX_MAG_TEST(f32, COMPLEX_MATH_COMPARE_RE_INTERFACE); +JTEST_ARM_CMPLX_MAG_TEST(q31, COMPLEX_MATH_SNR_COMPARE_RE_INTERFACE); +JTEST_ARM_CMPLX_MAG_TEST(q15, COMPLEX_MATH_SNR_COMPARE_RE_INTERFACE); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(cmplx_mag_tests) +{ + JTEST_TEST_CALL(arm_cmplx_mag_f32_test); + JTEST_TEST_CALL(arm_cmplx_mag_q31_test); + JTEST_TEST_CALL(arm_cmplx_mag_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mult_cmplx_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mult_cmplx_tests.c new file mode 100644 index 0000000..22c5a70 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mult_cmplx_tests.c @@ -0,0 +1,31 @@ +#include "jtest.h" +#include "complex_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "complex_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_CMPLX_MULT_CMPLX_TEST(suffix) \ + COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK( \ + cmplx_mult_cmplx, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + COMPLEX_MATH_COMPARE_CMPLX_INTERFACE) + +JTEST_ARM_CMPLX_MULT_CMPLX_TEST(f32); +JTEST_ARM_CMPLX_MULT_CMPLX_TEST(q31); +JTEST_ARM_CMPLX_MULT_CMPLX_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(cmplx_mult_cmplx_tests) +{ + JTEST_TEST_CALL(arm_cmplx_mult_cmplx_f32_test); + JTEST_TEST_CALL(arm_cmplx_mult_cmplx_q31_test); + JTEST_TEST_CALL(arm_cmplx_mult_cmplx_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mult_real_test.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mult_real_test.c new file mode 100644 index 0000000..fce7b82 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/cmplx_mult_real_test.c @@ -0,0 +1,31 @@ +#include "jtest.h" +#include "complex_math_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "complex_math_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_CMPLX_MULT_REAL_TEST(suffix, comparison_interface) \ + COMPLEX_MATH_DEFINE_TEST_TEMPLATE_BUF2_BLK( \ + cmplx_mult_real, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + comparison_interface) + +JTEST_ARM_CMPLX_MULT_REAL_TEST(f32, COMPLEX_MATH_COMPARE_CMPLX_INTERFACE); +JTEST_ARM_CMPLX_MULT_REAL_TEST(q31, COMPLEX_MATH_SNR_COMPARE_CMPLX_INTERFACE); +JTEST_ARM_CMPLX_MULT_REAL_TEST(q15, COMPLEX_MATH_COMPARE_CMPLX_INTERFACE); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(cmplx_mult_real_tests) +{ + JTEST_TEST_CALL(arm_cmplx_mult_real_f32_test); + JTEST_TEST_CALL(arm_cmplx_mult_real_q31_test); + JTEST_TEST_CALL(arm_cmplx_mult_real_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/complex_math_test_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/complex_math_test_common_data.c new file mode 100644 index 0000000..396dc2f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/complex_math_test_common_data.c @@ -0,0 +1,114 @@ +#include "complex_math_test_data.h" + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(COMPLEX_MATH_BIGGEST_INPUT_TYPE, + complex_math_output_fut_a, + COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2 /*Complex data has two parts*/, + CURLY(0)); + +ARR_DESC_DEFINE(COMPLEX_MATH_BIGGEST_INPUT_TYPE, + complex_math_output_fut_b, + COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2 /*Complex data has two parts*/, + CURLY(0)); + +ARR_DESC_DEFINE(COMPLEX_MATH_BIGGEST_INPUT_TYPE, + complex_math_output_ref_a, + COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2 /*Complex data has two parts*/, + CURLY(0)); + + +ARR_DESC_DEFINE(COMPLEX_MATH_BIGGEST_INPUT_TYPE, + complex_math_output_ref_b, + COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2 /*Complex data has two parts*/, + CURLY(0)); + + +COMPLEX_MATH_BIGGEST_INPUT_TYPE +complex_math_output_f32_ref_a[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2]; + +COMPLEX_MATH_BIGGEST_INPUT_TYPE +complex_math_output_f32_ref_b[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2]; + +COMPLEX_MATH_BIGGEST_INPUT_TYPE +complex_math_output_f32_fut_a[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2]; + +COMPLEX_MATH_BIGGEST_INPUT_TYPE +complex_math_output_f32_fut_b[COMPLEX_MATH_MAX_INPUT_ELEMENTS * 2]; + +/*--------------------------------------------------------------------------------*/ +/* Block Sizes */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(uint32_t, + complex_math_block_sizes, + 4, + CURLY(1, 2, 15, 32)); + +/*--------------------------------------------------------------------------------*/ +/* Test Data */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(float32_t, + complex_math_f_32, + 32 * 2 /*Complex data has two parts*/, + CURLY( + -0.432564811528220680 , 0.815622288876143300, + -1.665584378238097000 , 0.711908323500893280, + 0.125332306474830680 , 1.290249754932477000, + 0.287676420358548850 , 0.668600505682040320, + -1.146471350681463700 , 1.190838074243369100, + 1.190915465642998800 , -1.202457114773944000, + 1.189164201652103100 , -0.019789557768770449, + -0.037633276593317645 , -0.156717298831980680, + 0.327292361408654140 , -1.604085562001158500, + 0.174639142820924520 , 0.257304234677489860, + -0.186708577681439360 , -1.056472928081482400, + 0.725790548293302700 , 1.415141485872338600, + -0.588316543014188680 , -0.805090404196879830, + 2.183185818197101100 , 0.528743010962224870, + -0.136395883086595700 , 0.219320672667622370, + 0.113931313520809620 , -0.921901624355539130, + 1.066768211359188800 , -2.170674494305262500, + 0.059281460523605348 , -0.059187824521191180, + -0.095648405483669041 , -1.010633706474247400, + -0.832349463650022490 , 0.614463048895480980, + 0.294410816392640380 , 0.507740785341985520, + -1.336181857937804000 , 1.692429870190521400, + 0.714324551818952160 , 0.591282586924175900, + 1.623562064446270700 , -0.643595202682526120, + -0.691775701702286750 , 0.380337251713910140, + 0.857996672828262640 , -1.009115524340785000, + 1.254001421602532400 , -0.019510669530289293, + -1.593729576447476800 , -0.048220789145312269, + -1.440964431901020000 , 0.000043191841625545, + 0.571147623658177950 , -0.317859451247687890, + -0.399885577715363150 , 1.095003738787492500, + 0.689997375464345140 , -1.873990257640960800 + )); + +ARR_DESC_DEFINE_SUBSET(complex_math_f_15, + complex_math_f_32, + 15 * 2 /*Complex data has two parts*/); + +ARR_DESC_DEFINE_SUBSET(complex_math_f_2, + complex_math_f_32, + 2 * 2 /*Complex data has two parts*/); + +ARR_DESC_DEFINE(float32_t, + complex_math_zeros, + 32 * 2 /*Complex data has two parts*/, + CURLY(0)); + +/* Aggregate all float datasets */ +ARR_DESC_DEFINE(ARR_DESC_t *, + complex_math_f_all, + 4, + CURLY( + &complex_math_zeros, + &complex_math_f_2, + &complex_math_f_15, + &complex_math_f_32 + )); diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/complex_math_test_group.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/complex_math_test_group.c new file mode 100644 index 0000000..38546fb --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/complex_math_tests/complex_math_test_group.c @@ -0,0 +1,14 @@ +#include "jtest.h" +#include "complex_math_tests.h" + +JTEST_DEFINE_GROUP(complex_math_tests) +{ + JTEST_GROUP_CALL(cmplx_conj_tests); + JTEST_GROUP_CALL(cmplx_dot_prod_tests); + JTEST_GROUP_CALL(cmplx_mag_tests); + JTEST_GROUP_CALL(cmplx_mag_squared_tests); + JTEST_GROUP_CALL(cmplx_mult_cmplx_tests); + JTEST_GROUP_CALL(cmplx_mult_real_tests); + + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/controller_test_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/controller_test_common_data.c new file mode 100644 index 0000000..661a487 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/controller_test_common_data.c @@ -0,0 +1,499 @@ +#include "controller_test_data.h" + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + +float32_t controller_output_fut[CONTROLLER_MAX_LEN] = {0}; +float32_t controller_output_ref[CONTROLLER_MAX_LEN] = {0}; +float32_t controller_output_f32_fut[CONTROLLER_MAX_LEN] = {0}; +float32_t controller_output_f32_ref[CONTROLLER_MAX_LEN] = {0}; + +const q31_t controller_q31_inputs[CONTROLLER_MAX_LEN] = +{ + 0xC14A5524, 0xCCABDA17, 0xAD6F5B56, 0xFDAFCE3B, 0xA9B226EB, 0x41F6F6A, + 0xA5CE38BF, 0x3A978AFA, 0xBA44B82A, 0x855C0F8, 0x3D060524, 0x93D5E570, + 0x97D7791D, 0xFFE0C38C, 0x26749841, 0xC0A6EE54, 0x218EC386, 0x39FF3726, + 0x8DC1F7CA, 0x702F2CF5, 0xC1142FF1, 0xEC1476AB, 0x15F640DD, 0xE62CCE49, + 0x3805DE7E, 0xF70871FE, 0xCF8BD360, 0x8D19A8A0, 0xD764F821, 0xA58558CF, + 0x8C0CE04D, 0x50A46C19, 0x66D2370D, 0x50FA359A, 0xB646AE24, 0x6CE00F5C, + 0xE6D48948, 0xB55BD831, 0x3B72950A, 0x9EB69530, 0x73394127, 0x773FA6F4, + 0x9805A980, 0x838DE587, 0x9CF597F4, 0xA2AD1691, 0xFA81A473, 0x7CDC7D7F, + 0x4A5190D0, 0xED895BB9, 0x8FD60F35, 0x1A21D530, 0xA0EB6DDA, 0xBDE6A516, + 0x2501A3E1, 0x5ED893C8, 0xE1E175B1, 0xACBBB2F3, 0xED350907, 0xDB140D7E, + 0xEEAE272D, 0xBE229841, 0xC18BFB88, 0xA6BB9B80, 0xBCF090E4, 0x24DB166C, + 0xF9AB7E42, 0x62DF28D1, 0xC7004665, 0xE3F56FC6, 0x419E0C75, 0x46BE9F38, + 0x2432B9B2, 0x758D83E0, 0xDCE12926, 0x3F57CB74, 0x1F4458E2, 0xF1DD639, + 0x83A1FB49, 0x173AFC76, 0x86EF7531, 0x48D32F34, 0x7D3E3063, 0x8F2FB549, + 0x5C314C9, 0x18CBEB6D, 0xA6F8B697, 0x447B9E9C, 0x2E32BA33, 0xD074D715, + 0x81ACD746, 0xE55A4E04, 0x4891860F, 0x1DA3EB4F, 0xE0E6A27F, 0x20BFDEB4, + 0xD0B3A25B, 0x40C10544, 0xC15656C, 0x15405EAE, 0x9858E3E1, 0xA36A9C4E, + 0x88BD21F9, 0xAACF7A68, 0x773665E5, 0xCEDFDF66, 0x617A9610, 0x524FC968, + 0xC2D086CD, 0x5F008079, 0x24DCA447, 0x6A4F5599, 0xB706CD4A, 0x1DE70608, + 0xA33A2EE5, 0x137E488E, 0x98061B7B, 0x4079D69D, 0xA4A897D5, 0xC4CEC8F5, + 0xD75F7883, 0x22406802, 0xF1AD70BB, 0x9D4ADD79, 0xBCBC7CE4, 0xB358C0D8, + 0x85792E47, 0xA7ADAC05, 0x3D19EEAB, 0x331AC0AF, 0x33035831, 0x13D93987, + 0xFC542094, 0x845F317E, 0xDDC4BF8B, 0x1379E50C, 0x5C20193F, 0xFDD58298, + 0x9D482B82, 0x4A6BE062, 0xDC8A757B, 0x272917C1, 0x90E1EFBC, 0x355AD882, + 0xE6F8EA35, 0x604555A1, 0x7DFFFBB, 0xF58AE216, 0x9A11B463, 0xD3541BAD, + 0xA1576756, 0x483BED8D, 0x1F05AFCC, 0xCEA63DFB, 0x55B84677, 0xFB2E04F2, + 0x787AF96C, 0x84A12CD3, 0x460A9BD, 0x9DB22DD8, 0x1A8C7F28, 0x861E452E, + 0x932D3F78, 0x7652D852, 0x73357BBA, 0xEBBB0A58, 0x62536AFA, 0x3F6B65EF, + 0x6DC57B58, 0x9EB798CE, 0xE6B0A740, 0xDFF68B47, 0x3247FB8F, 0xFFF3D302, + 0xA9FD3E40, 0x475A43D1, 0x6FF9528A, 0x2018A09D, 0x47E0F9C9, 0x4CF5F6D3, + 0x2807CE34, 0xDD6FD8ED, 0x234045D1, 0x51CEB5F9, 0x25297896, 0x6443A0FE, + 0x8F4449A9, 0xD4C3E1C6, 0xF01D52F1, 0x4E09C820, 0xF18F0810, 0xE1548689, + 0xF9DE5A1F, 0x5286DC23, 0x48AC3A4B, 0xEA0C1BE0, 0xA1B785DB, 0x7086465D, + 0x1CC10929, 0x1E1D716E, 0xED231D4C, 0x2049D108, 0xB8FF9971, 0x949CF8D4, + 0x441F1E8B, 0xC3D95372, 0x69C324B4, 0xA10BFDC9, 0xC781DE78, 0x82476137, + 0xE163DDF, 0x390DEEC2, 0xAF68CE5B, 0x8E680ABD, 0x8223A615, 0x92593380, + 0x7B1465FE, 0x865AE957, 0x930F53EB, 0xED772EF7, 0x10E916B6, 0xE3BCFA68, + 0x2ACB80BB, 0xE51C5590, 0x994714B5, 0xF30984EE, 0x59BBE1B4, 0xB4867DBC, + 0xB91C706C, 0xBC16C218, 0xA8931CD0, 0x129A66AB, 0x13171F4D, 0x62882872, + 0x4B167FD4, 0xE6902F4C, 0xFA794932, 0xD4B152C, 0xB0856EA9, 0x39466D55, + 0x3669E451, 0x8F5B9E8C, 0x877A3C6A, 0x51B956B4, 0x367EAD2A, 0x9D2C662A, + 0x78FB6880, 0x4E6D40B6, 0x4070EFDC, 0x4DF9679C, 0x20306EDB, 0xE381AAE7, + 0xA55DA748, 0x9B8B617B, 0x3E036FAD, 0x84E4C4A7, 0xD5A3F517, 0x669BA988, + 0x98FDDE8C, 0x67BD85CE, 0x34BBB46C, 0x76994800, 0x85B9D8B6, 0x6DFA2FEF, + 0x205DB5C, 0x9F843C4C, 0x72721B52, 0x73EF6B86, 0x5FB98B61, 0xC323DDAC, + 0x31D424B4, 0xF68C0D7E, 0x162FAF9D, 0x7B2A7A99, 0xF9392693, 0xC42D12C0, + 0x8692A73E, 0xD9A1EE80, 0xDD956856, 0x44E7BDAC, 0x8D874532, 0x5F5C9DD0, + 0x5D167858, 0x8559FEA2, 0x9D821476, 0xD9654ED2, 0x594C0DC7, 0x1A87B506, + 0x3F693200, 0x7A651AB5, 0xA0CCBC8A, 0x9F9E662C, 0x78EF631, 0x2A09DA0, + 0xB088C72F, 0x92EE0D42, 0x360DCD5F, 0xF333FE48, 0x8D63CC06, 0x233A8ACB, + 0x706651ED, 0x7AA5C079, 0x262239D1, 0x3EBBEBB6, 0xA25A4F3D, 0x32581A06, + 0x6E6FD780, 0x5773F7C7, 0x75ED1DDC, 0x90DF2D15, 0xBC79A9BC, 0xB7175917, + 0x354E381C, 0x762AADD7, 0xF643DAC1, 0xF3BBF49E, 0xD2FECE7E, 0x6C8140F4, + 0xD7694875, 0x92D30822, 0xC742A7CF, 0xB792ED98, 0x121CFE24, 0xA04E1EE7, + 0x58CE268, 0x215A080, 0x316CB323, 0xFAB14A31, 0xE1C13C03, 0xFD8EF4F1, + 0xF3F446D0, 0x6C6CEA0A, 0xBBFDF9FB, 0x67242969, 0xBE55A4EB, 0x8FF5534, + 0x52F0DF1C, 0x9710ADE3, 0xD40F4A21, 0x7984E8E7, 0x419545EB, 0x993F7880, + 0xAB246B20, 0x408AABC4, 0xCBF6EA49, 0xC0894C55, 0x4CAA6398, 0xA47856E9, + 0xAF2AE47D, 0x22F55D33, 0xF0D37915, 0xD0634C72, 0xD983671, 0x2BCC5AF8, + 0x9A77D48, 0xC11B5CFA, 0xF107CD7E, 0x3A6B3593, 0xE1425F05, 0x6271812A, + 0x5B838310, 0xBD8418CA, 0x10A58792, 0x239F7137, 0xA13D5071, 0x7F9930D4, + 0xA462664F, 0x54180F8E, 0x291585BA, 0xE586B87A, 0x144B2C12, 0x98E425C7, + 0xBAA4B373, 0x18F0D03C, 0x99462AC0, 0xD8B4D2EF, 0x72473895, 0xA6BF5435, + 0xEDAD53B, 0xE0912FA6, 0x5C33F331, 0x3D93CD7, 0x4D03D752, 0x20699929, + 0xB89962F9, 0x36E781E9, 0xF58B642C, 0x5FCA69E3, 0x5960A7F4, 0xAD5AAFD0, + 0xDF18324A, 0x3DB1E5AA, 0x76BA3876, 0x1BC29AF6, 0xBCC18841, 0x73A60174, + 0x625BFF58, 0x67C57724, 0x4458E53C, 0xE157B095, 0x2B370837, 0x83DF6CE3, + 0xDD08EEFA, 0x3F52A7C2, 0x191B4785, 0x60843D82, 0xB0DE11F1, 0x105EA26C, + 0x6E1C7AA2, 0x47AADD14, 0xB6676D03, 0x3B8D4DF6, 0x737A694, 0x409521DC, + 0x744206A, 0xC722023F, 0x2BE4EAD5, 0x63E11D76, 0xCA4A09AB, 0x5CF2D2B9, + 0x31586916, 0xCDFD7D84, 0xB203F634, 0xAD7329D4, 0xC524582F, 0x2E53E6C1, + 0xBB0E019B, 0xB8538C6A, 0x6A2542D, 0x8A6A00E5, 0x119725CC, 0x5406D347, + 0x1B6FFAF1, 0xECCF71F1, 0x981117F2, 0x7167CA76, 0x74F4B880, 0x77A55F47, + 0x59EADB62, 0x4A331D95, 0xBCBBA76F, 0xA45C4D50, 0xC718D5, 0x87CE05D1, + 0x60D47AD5, 0xA5CA9C40, 0xB0061766, 0xE69B39DF, 0xBD5F1320, 0x9930EAD3, + 0xA8B38325, 0x8DD090F, 0x6A6EEF37, 0x2DF16F66, 0xAB514C7E, 0x31109C58, + 0xFD48C7FC, 0x515341CA, 0x77AB8EA6, 0x41328DAF, 0xBAF8D31E, 0xA4B31611, + 0xED37F331, 0x7A832A22, 0xA22591C7, 0x722D1F89, 0x3B19CF18, 0x261B8A4D, + 0xC3F6F6DB, 0xCF8CED61, 0x990FA250, 0xA02E72A9, 0x560DCEA2, 0xB08E67B4, + 0x3674E663, 0x97CC3852, 0xA7EB2EAC, 0xFFDE0AA8, 0xA64719A, 0x23269EDD, + 0x3C0B339E, 0x86284D40, 0x48D82ECB, 0xA4D4CCF8, 0x43631B91, 0x4BF0C248, + 0xB6497B9B, 0x6827BC58, 0xE30B7AF9, 0xA0CCBF26, 0x6C3B7B71, 0xD744B3ED, + 0xFA25D2F6, 0x4CDE642D, 0xD65B8142, 0xA6F9207F, 0xE7A207BE, 0xDB506684, + 0x44DA4780, 0x9175EA0C, 0x156104AF, 0x4155E1B0, 0x6E3A6886, 0x9DBA1EA2, + 0x5423D9C8, 0xCC024E22, 0x758F852A, 0x1DD6395, 0x2D19CBAD, 0xE164F5A1, + 0xC2084602, 0x89C274AD, 0x13CB5562, 0xD7FE2D5B, 0xE07A4EE5, 0x1672BA91, + 0x4F624CCF, 0x2E5EA4A3, 0x28FEEFAF, 0xBDDA6EF4, 0x32AFD40C, 0x99A5FB3B, + 0xDD1D73A3, 0xA342CB3E, 0xA78445F5, 0x53979C3B, 0x427D7943, 0x5221B58C, + 0xA6CE9A5E, 0xFB50ECA4, 0xBB86E36E, 0x60839F6D, 0xC5E1C2F3, 0xA1B7FB04, + 0xFBB65E0C, 0x78B80F5E, 0xFD8D972B, 0x3BF3BA90, 0x2D572D9, 0x2B5BC920, + 0xB6A0DE01, 0xD274D306, 0xC7C6C855, 0x9CAA669B, 0xB04AA641, 0x4D6B1760, + 0x3E17ED79, 0xD23241B0, 0xA4A6F957, 0xCBDE76AF, 0x4E5F9493, 0x4C215DA5, + 0x33A052B, 0x1A4D80C2, 0x40AEEBCA, 0x390D106B, 0xE9E8E018, 0x5AF3D6CF, + 0xE35E1D4, 0xC4FB1C6, 0x14B6299B, 0x8D2E25F0, 0xCCBF932A, 0xC5AC18B6, + 0x2227567D, 0x86B5CE2F, 0x26344534, 0x22C515EC, 0x2442B70D, 0xEC3721C6, + 0x34EF687D, 0x9C06323A, 0xEAF3EA60, 0x60396F52, 0xEAE78AA1, 0xC9D06CBC, + 0x6F95F6C8, 0x584CC258, 0xBA9A27BB, 0x66DF8D47, 0x9D4804EA, 0x57DD9E67, + 0xF89C7895, 0xF5336111, 0x25C122C8, 0x62742114, 0xCFBF6D26, 0xBF9F6482, + 0xE6F02CD9, 0x11083202, 0xC99E2618, 0x7EBC9351, 0x440112F1, 0xC9DFFBC1, + 0x3BF4DC25, 0xB1BA7FA0, 0x61AF9AED, 0x6B1F7D29, 0xAD865294, 0xE3E01129, + 0x7E9E77A5, 0x100435D7, 0x9FE3A71, 0x88597C81, 0x722849FA, 0x31C5A0AF, + 0xFBA178DC, 0x7F102D31, 0x5CA07864, 0x950E6F98, 0x82C34882, 0x5D041F11, + 0x8C613C57, 0xD398CFD1, 0x426F38AD, 0x5599AB1D, 0xFAFA078D, 0xAB25B413, + 0xD94B32CF, 0xB288FE38, 0x2893BB46, 0x9A0B4168, 0xA91BCA94, 0x653A5E8D, + 0x2174EBBE, 0xDEFE6415, 0x30DA429C, 0xD0C5E40C, 0xB4719AA4, 0xD29CE7A6, + 0x905957CD, 0xCD287499, 0x83CA0AA7, 0xA8385832, 0x25A0CA02, 0xC20D47A4, + 0xB562F556, 0x4BC19E4C, 0xD9E215C7, 0x27E838B4, 0xC58612F4, 0xA2827F6F, + 0xC49DCDBA, 0x679B7362, 0x4E495845, 0xCFD2F0D1, 0x395E76A0, 0x375A655E, + 0x92E2058F, 0x73F9F0CA, 0x61EFF3B3, 0x51FFD362, 0xE7410345, 0x7FDA8B3B, + 0xA219E2E8, 0x17ABE543, 0x26557412, 0x4B30084D, 0xA68E191D, 0xFE0D93DF, + 0x73EF127D, 0x4DECDDB1, 0x77FAF45F, 0xD6002898, 0x92DD0A40, 0x157F6DDF, + 0xC2A55F8E, 0x4359F924, 0xFB630C3F, 0x338B6B58, 0xB2945F75, 0x4FA23A0E, + 0x836EB8C0, 0xB3B18FD, 0x86114337, 0x24668ACB, 0x99BB82F0, 0x924C8A47, + 0xBA959701, 0x81155ABF, 0x8C612D71, 0x36074CA7, 0xD1668C41, 0xE35F58C7, + 0x7FC2802D, 0x8E6A7CF3, 0x65B07D07, 0x815F6A6B, 0x791BF0DD, 0x6E47D719, + 0xC24394C7, 0xE84A6EB, 0xF194AFEE, 0x464A2F52, 0x677579FD, 0xEBA775AE, + 0x1F6EEFF, 0x9A795237, 0x78D9D45F, 0x9D0B344D, 0xBBD34AB7, 0x2F85B12A, + 0x16C5C2AD, 0x3990985D, 0x88DF3351, 0x82811AA5, 0x6D351F41, 0x4066A69D, + 0x86B660BF, 0x6EDB4768, 0xDDD78CF0, 0xB5D74F6E, 0xE89E220C, 0x91439687, + 0x947CC9C9, 0x3857E2BD, 0x302F8AE4, 0x1DABE7F8, 0x4832D6C9, 0x37D58FCB, + 0x4EA8A711, 0xCD7BAC98, 0x19DBF8BC, 0xD8DE8DC2, 0xEAFF7E7B, 0xB7629C93, + 0x792C6E19, 0xF7009192, 0xFF88439D, 0x2E196A66, 0xEC71B78C, 0xEAF4BB3A, + 0x7C16225E, 0x668F337, 0xCBEE1608, 0x6D5B5552, 0x345DC590, 0x681209CC, + 0x7B24A819, 0xD08A1416, 0x99888FE3, 0x9FC7288A, 0x24BD8502, 0xEA1D9678, + 0x20EECA0, 0x59BEA057, 0x5ADE91EB, 0xDEA8E49D, 0xFA200E6F, 0x9149C81D, + 0xF2281E93, 0x8A5B0451, 0x67312D58, 0xE3B849F1, 0xD2217960, 0x7CDF59F3, + 0x33C775C0, 0x9EBA8799, 0x7DF9506, 0xB4E96110, 0xB8FCF3E3, 0xDEA059B2, + 0x8229B6EA, 0x316486F6, 0x43919185, 0x6C0D90F3, 0x1C6F3DF8, 0x38DB92A9, + 0x5CD41244, 0x2C9F0A7B, 0xDF4A315F, 0xF7CE9C66, 0x4C800860, 0x318D53E0, + 0xF105C20D, 0xD753E1F2, 0x750810BA, 0xA17ECCA5, 0x2010140, 0x4D884763, + 0xC2BB0DA7, 0xB2D5BA74, 0x141CECD4, 0x887FDFC3, 0xC64B53, 0x2D2A85F6, + 0x15532B45, 0x5D5CBCE1, 0xBEB9A16A, 0xA214611B, 0x9FC5AC5F, 0x11AE5DD7, + 0xA0B9A5A9, 0xFC648AF4, 0x740009AC, 0xED0E0321, 0xB8E6A61, 0x8910C544, + 0xC74F26C8, 0x9525CCF3, 0xB41AEB59, 0xE61984CE, 0x598B2197, 0xA412E59D, + 0xE1976DD4, 0xB29BBE16, 0x88FD9FB0, 0xB04006F3, 0xB45E309, 0xD5CC15F1, + 0xD9DAF630, 0xDC809335, 0x803ED52, 0xB537F5A5, 0xA994F6EB, 0xF5288568, + 0xF66FD264, 0x2EA2B3A6, 0x647619F3, 0xFFB38C7A, 0x1BC03B9, 0xB6BC3061, + 0xBF30596E, 0xBE2AD27B, 0x8AC04220, 0x641979A3, 0x9ECCBB89, 0xA144FBC1, + 0x4E8FAE26, 0x8C5A9D90, 0x299ED467, 0xD7C9C7E3, 0x1D4865ED, 0x76F31C3D, + 0xCEE81CDF, 0xB479195E, 0x6FFB3AE1, 0xDC8A398, 0x300F7364, 0xC7940AFA, + 0x3B85BE3E, 0xD98CC40D, 0xA24A3D89, 0x3A674204, 0x22888A38, 0x2E77F2D, + 0xA2841C9C, 0xCF0689C3, 0x9FE98922, 0x89335017, 0x2D6B69A7, 0xFEDB63F9, + 0x899AF4EF, 0x9F9F9B40, 0xA4BE97E8, 0xA51DAF7A, 0x16AC50D3, 0xA8D7ED6, + 0xED193443, 0x7615EF1B, 0xB0DF6A4E, 0x64FFE794, 0xE3DB2C9A, 0x7435B022, + 0x556E825C, 0x23802AF9, 0xC25098A4, 0xE75A18BB, 0x70B2A7B9, 0x7FB81BF, + 0x63EF910, 0x6C669591, 0x6574DD2B, 0xCF6E379D, 0xD2B3AFAC, 0x1E6A1101, + 0x1DE22385, 0x2338191F, 0xC69704B6, 0xCBABC599, 0x54EB4809, 0x7839BE6D, + 0xD50017DD, 0x39B1A0E1, 0x288D52D3, 0x2D52668C, 0x20D22A68, 0x4E1207D1, + 0x3FCC0EFE, 0x47F3FE64, 0x25177A90, 0xB4BFDD4D, 0xDA8DBDCE, 0x6F7275A8, + 0x6BEAA655, 0xAA1810FC, 0xE4DB593A, 0x8A4D4BC0, 0x2C402E93, 0xF1C0F7F9, + 0x6F0CC577, 0x70412414, 0x752F9DC1, 0xD82E38EA, 0xAC455F7B, 0x4DCD4EDB, + 0x92BC2696, 0xFB03F135, 0x4FCA1F8C, 0xBD5E75F6, 0x502F41B0, 0x3616D3F1, + 0x2E5B8E31, 0x2026EB19, 0x57E783D7, 0x467BBE00, 0x4703ABA3, 0x1F776B9C, + 0xE2570A84, 0xFEC7DB48, 0x1BD5012, 0xFD0A2D5D, 0x7FCC29F2, 0x291304B6, + 0x99D5D8ED, 0xC7551C8, 0xFD12F38F, 0xBADE8892, 0xDF749997, 0xA5DAE2F, + 0x2B9FA269, 0x5C13CFED, 0x15E9A399, 0x54437F4E, 0xA72DB2AB, 0x56186AA1, + 0xFE4DB55C, 0xA34D7836, 0x2A879760, 0xC63FA94, 0xAC18B207, 0x5FC78B3, + 0x7F10621E, 0xA769E6B2, 0xEC9F4A11, 0xCE3F982C, 0x62BA2EF5, 0xA5F239CD, + 0x73D63FED, 0xE36E9F5E, 0x8AC1DA0E, 0x3F3DB3EB, 0x738326EA, 0x35C366B1, + 0xCD476E86, 0x82F6B208, 0xF11A9FC1, 0x426AC396, 0x7E4D1B93, 0x75E4EDB7, + 0xAF3C44A7, 0x51A5EF5C, 0xFAD2463D, 0x8A5639CA, 0xC995AC78, 0xCC4BE4F6, + 0x3AFE7F8D, 0x66993D04, 0x4386FF37, 0xCBC1C6C2, 0x55A8F5EC, 0xE81A9A75, + 0x30A67E1B, 0x4A4A7D0C, 0x20F7F993, 0x1891805, 0x738976AD, 0xD426E7D6, + 0x3C5CEEBF, 0x4499187F, 0xABF17C97, 0x447C317F, 0x68D8419C, 0x7AAB6456, + 0x421BCF29, 0xF6740F9C, 0x8916BB8D, 0x3D72AAB, 0x9AD54DD7, 0x7549C6EE, + 0x7317342B, 0xA18546D4, 0x1056BDA7, 0x54BBCCCE, 0x8CE63E46, 0x5D146234, + 0x33BE6C63, 0xB250C4E5, 0x89D72335, 0x87C36BA, 0xB65530CC, 0x2DFAC48C, + 0x1663D16F, 0x59B80AA, 0x950274EA, 0x92532D4A, 0x3CEF802D, 0x492FBDA5, + 0xA63A2574, 0xEF8005C2, 0x94A18651, 0xAF627ABA, 0x6829B238, 0xA698F646, + 0xD2598516, 0x10144D36, 0xD9B1D1B9, 0xAB2ACF05, 0x5395B699, 0xA7851C75, + 0x1806C6F3, 0xAE970306, 0x3284B145, 0x98F4FE8F +}; + +/* The source data is random across the q31_t range. Accessing it by word should + remain random. */ +const q15_t * controller_q15_inputs = (q15_t *) controller_q31_inputs; + +const float32_t controller_f32_inputs[CONTROLLER_MAX_LEN] = +{ + 43.0264275639 , -17.0525215570 , -94.8488973910 , -8.1924989580 , + 7.2830326091 , 66.8368719314 , 33.9778190671 , 117.8652289772 , + -129.6077797465, -14.6420815368 , 18.0239223278 , 20.6760530292 , + 55.0375037651 , 1.8674609862 , -85.6534302408 , -33.5750364909 , + 29.2110949614 , 110.4727049460 , -94.1914619387 , -1.4084169343 , + 83.5181653041 , 47.3073514127 , -13.3420621181 , 30.3389699104 , + 12.1188124277 , 100.9730921941 , -114.0146362390, -77.5823200409 , + 37.2019034618 , 40.0026301128 , -58.3387276630 , -34.9472398600 , + -5.1169678311 , -87.7660091118 , -150.5888601131, 56.0349370503 , + 50.2168884079 , -74.2313236767 , 22.3648603560 , -6.8676387051 , + 74.8957303680 , -90.1292012823 , -55.1436241586 , -66.6732976100 , + -6.7918147615 , 7.7612697081 , 35.7892605979 , -20.0470508830 , + 41.8369017546 , -143.7378056984, -41.9127158600 , -108.3531841158, + -57.1917422289 , -124.2808828105, 38.9316388820 , -77.9212517405 , + 37.1990818377 , -28.9545952748 , -155.6371057564, 45.8088886393 , + 36.2537018275 , -6.5727656016 , -104.2070491921, 45.5583813729 , + -19.7674717059 , -80.4802190947 , -1.4444563441 , -42.2142256438 , + 36.6546339194 , -57.0866498590 , 44.4677067511 , 65.7285753407 , + -103.8158864647, 25.4348723711 , -153.5419639389, 39.3608409474 , + 49.1658103436 , 79.5570602275 , 75.2944095996 , 58.9394700746 , + -53.1018534392 , 33.4172444014 , 35.6224682287 , -64.4353396418 , + -125.8464291251, -47.6072111617 , -26.2177687594 , -12.0061322096 , + -17.7887967585 , -28.2926175090 , -62.0691715749 , 40.5098573604 , + -191.1123732593, 119.6750713043 , 19.6182375803 , -26.7615252921 , + 2.2957847015 , -108.3436451287, -50.5906164995 , -5.6360985100 , + -11.6772204201 , -84.2765293757 , -60.9317810068 , 82.0446350218 , + -70.2048296348 , 72.8738253222 , 60.2450218115 , 114.2741231228 , + 46.8180775285 , 6.9915412654 , -8.9909197429 , -78.9165936808 , + 66.4731535459 , -68.4235455651 , -79.8254597080 , -10.6308477115 , + -62.6161569330 , -55.7744410292 , -11.8408366528 , 98.1034940997 , + 35.8213741877 , -54.4694482732 , 86.9631830044 , -53.0343838122 , + -47.4898642865 , -47.2010929590 , -31.3312639685 , -23.0908245172 , + 12.0258009869 , -5.1098204703 , -9.8420230737 , -107.3328761158, + 44.6810431959 , -17.9083820345 , -60.9753512872 , -7.5915088994 , + 17.2250813329 , 57.9176125648 , 124.3004161362 , -63.1950908493 , + 120.5788885640 , -44.1734238117 , -91.7408095116 , -43.5696066595 , + -49.9560710099 , -167.8513443296, -70.9437505499 , -46.4109705355 , + -64.2264526456 , -13.9995803916 , -100.9548186356, 9.9101010575 , + -50.0615130815 , -55.7590145012 , -60.3195153388 , 61.7913378549 , + -102.0850899209, 53.2360193126 , -25.8997883369 , 75.1445512333 , + -113.8148602310, 17.8027281119 , -19.5006822722 , -44.2169628471 , + 107.5017084384 , -113.7909124666, -43.9735396033 , 7.6880981388 , + 46.7384653508 , 9.9047443751 , 81.8646964362 , 132.3812863877 , + -95.6959050236 , -68.5015813484 , 65.8586404494 , 18.5039353889 , + -30.1786166621 , -90.3098515667 , -22.9356228552 , -20.5778272423 , + -2.2127786675 , -35.4418447703 , -51.8722915974 , -107.9024439078, + -51.5940748232 , -51.7463262677 , 74.2795485984 , 94.2205022462 , + 9.7016384049 , -47.3556083155 , -36.7822314478 , -151.6455525363, + -15.7183814485 , 78.2063383182 , 0.1516414969 , 37.9304181609 , + 20.6185902740 , -22.2164106778 , 6.1160554677 , 2.4061326953 , + -111.6681824598, -60.0858917090 , 75.1698614693 , -76.5787410444 , + 28.3391655715 , -2.4946186443 , -68.0378899682 , 104.0893199171 , + -51.8319647254 , 38.8521710524 , 75.9114239564 , 73.9206172905 , + -103.2533029987, 6.9002718274 , -36.6346436319 , -25.1990926265 , + 1.5852145953 , -50.6438436795 , 21.5018844428 , -151.9305562846, + -51.7326681814 , 21.4475994143 , 42.2564011921 , -74.0520586926 , + 49.7370635809 , -13.2957534126 , 36.6746826778 , -31.7005492589 , + 148.4894964268 , 79.7890632353 , 16.8856024809 , 16.1690460177 , + 39.2665169484 , 117.2461167794 , -37.4827984831 , -47.8387803604 , + -95.7025286193 , 34.3058214285 , -124.9536456028, 56.1640195764 , + 94.3636873606 , 35.3992852810 , -38.3920852159 , -100.5738062016, + -29.7837022314 , 42.9133913996 , -34.2715618187 , -14.3589115627 , + -16.5935468750 , 20.4574192236 , -88.7897972666 , -38.6285080386 , + 53.3203422726 , 98.5991486746 , 122.7305462474 , 67.7902817187 , + 5.1764117389 , 5.0632821624 , 21.9288789574 , -78.3140512638 , + -21.2069682335 , 23.6342010925 , 34.4445769455 , 59.1346766615 , + 28.9978778000 , 39.8121180845 , -17.1650033520 , -56.9174900874 , + 17.8157086148 , -112.8801457350, -122.4019040408, 140.8669393157 , + -65.4664329639 , 40.6952775518 , 32.7260891658 , -43.2565155866 , + 19.3945751928 , -20.1815002000 , -67.6601711640 , -18.1921178207 , + -35.6802153684 , 49.9550290306 , 131.4925251016 , -31.2940938167 , + -5.2848453344 , -109.5580577933, 20.2437599390 , -8.8782958734 , + 54.1836717264 , 7.2555852190 , -3.5698316137 , -51.9236786262 , + 6.7861547980 , -104.4814551670, 45.8458629668 , 70.0890876844 , + 38.3572837740 , 61.8024165129 , 68.0176962024 , -12.8193934080 , + -21.4661610917 , -0.9377108815 , -74.2100679061 , 71.0490808147 , + 91.9813889497 , -14.5797640164 , 3.5036749129 , -138.3605478356, + -48.1501349794 , -16.0636922482 , -12.1334197606 , 15.0562207637 , + -34.0878176054 , 55.1075126157 , 97.3829871877 , 0.2053358099 , + -94.8713267382 , 51.5460954054 , 21.2966946363 , 58.1331025047 , + -23.4599044132 , -19.3315856528 , -8.4497193577 , -1.9594679356 , + -33.1906549336 , -144.6825417978, -57.1218958072 , 35.7353406097 , + 61.4666549819 , 14.6536253128 , 82.1632196866 , -44.6230161723 , + -91.1022589278 , -18.5737673927 , -136.8975612334, 56.9606788003 , + 70.7059960183 , -68.2829345081 , -10.2629800455 , -53.6385325047 , + -68.7928766204 , 88.2444688302 , 83.1412324801 , -102.9206928160, + -68.2329763159 , -69.7552955469 , 108.2132269009 , -28.2582329307 , + 5.6685898328 , -36.0392956840 , 43.3269513128 , -8.6436416796 , + -16.5054886972 , 11.5008791788 , 39.6923606683 , -28.9039554061 , + 13.5938214364 , -23.6296332202 , 49.1171161163 , 53.1636857935 , + -62.9672053166 , -54.2594757384 , 48.3838956696 , 8.0469071555 , + -33.6472086213 , -120.5381752144, 55.0880453111 , 17.8990740563 , + 144.9402232336 , 101.7886229203 , -73.3666393712 , -16.4721379138 , + -12.7447935685 , 101.8245160983 , -49.7026860415 , -15.1227790364 , + 65.7430288442 , -131.8695390036, 10.2750933946 , 90.9752774838 , + -26.5859990591 , -95.6962772568 , 76.2174589344 , 24.8796848060 , + -38.8938223046 , 54.1687774852 , -37.3585968996 , -34.6848570502 , + 33.0151011570 , -55.8345877671 , -3.9009101671 , -31.5024971691 , + -9.6863895491 , 91.8719195957 , -58.9993249744 , -25.6887030614 , + -8.0829472205 , 4.6386491741 , -71.4019697167 , -21.3734669095 , + 86.2079144404 , 79.6823974266 , -0.0910915997 , 44.8067718095 , + 58.7204020766 , 72.6856808976 , -50.3373732478 , -116.1175365534, + -15.0884909384 , 5.4593772059 , -63.6553527905 , 37.3460388205 , + -32.2399421679 , 95.7569350513 , -7.3700141964 , -56.0370832967 , + -41.7377150439 , -42.0042856519 , 12.5134312941 , 93.7845584531 , + -32.4801087157 , -33.3976050318 , -24.2252126001 , -46.3199064467 , + -20.3704610276 , 15.8571376404 , 88.9127217235 , -33.1132582267 , + -1.0005675836 , -28.1780471904 , 150.9349379135 , 38.0600520828 , + 36.4338677563 , -3.3709201641 , 29.7709773016 , 16.5064119077 , + 21.3147729463 , 110.6714300904 , 18.8406036507 , 14.8963298097 , + 50.9975960392 , 16.3991140350 , -194.0805845907, -41.6723945839 , + -74.8991127408 , -6.4587655805 , -0.6883628218 , -49.8709647175 , + 194.2265120473 , 64.3043624521 , 16.0040882780 , 68.4032551772 , + -43.4050313128 , 84.6826289824 , -28.1357565943 , 134.6895584120 , + -7.9746152680 , -95.6692886462 , -48.9444370342 , 79.4479343188 , + -50.5345228122 , 52.4800633307 , -14.7735051703 , -20.1510237050 , + 22.5049816980 , 64.4191999102 , 24.8385648232 , 99.4265041360 , + 62.0189508473 , -28.3892600378 , -109.8842008564, -79.0407483407 , + 18.3408112020 , 49.1650536089 , 31.5419844924 , -36.1160722679 , + -132.9148081329, 10.4053531567 , -129.2463715470, -43.4602207151 , + -24.2420653292 , 91.5388317556 , 21.4762248190 , -44.3810909139 , + 18.4098011282 , -45.8691164539 , -20.9831197962 , 16.2076792914 , + 66.0224147666 , -13.6794615513 , 101.2163279622 , -62.4462618603 , + 22.2040981785 , -52.3208382802 , -24.7909079016 , 58.5150375093 , + 18.8569705105 , -55.6083430939 , 131.0273367422 , -34.5209015065 , + 121.4357296573 , -77.2590299593 , -51.5929566898 , 5.0247131098 , + -23.8451707592 , -4.5912313547 , 31.1387246821 , 61.7019310824 , + 49.1912429744 , -50.5836913031 , -74.8182600630 , -21.6209317022 , + 20.9409464654 , -72.7870824583 , -28.3530746820 , -45.0794425434 , + -13.4910629905 , -62.0158772255 , -34.1421181246 , 44.2844972784 , + 8.4213193211 , 79.9349022793 , 60.0160502260 , 32.2272994080 , + -72.2893887746 , 17.3063698247 , -134.6335742431, 64.6499736261 , + 7.1411921919 , -37.5517577873 , 6.2405670930 , 117.1920927305 , + 128.7420689815 , -3.1556854963 , -13.4100422909 , -11.9336372907 , + -8.6022400553 , -102.0033506666, -78.4696575074 , 15.0765861403 , + -111.5219718576, -13.4162786508 , 38.2437013694 , 61.1637732561 , + -34.4804160003 , 107.4438003830 , -79.4193067813 , -81.1842853968 , + -26.2622970331 , 132.3205425408 , -119.1464268477, 67.3048866598 , + 103.3266736715 , -58.1865815617 , 27.6231908601 , -11.2004371750 , + 26.0340617206 , 12.5696123916 , 0.6442714420 , -30.7393043544 , + 1.5314955897 , 49.9110088250 , -106.1358721920, 51.1608329944 , + -32.8684239794 , -27.7215905745 , -11.6450303367 , -36.7731678028 , + 59.9383486599 , -4.6301990580 , 5.0361682939 , -10.5669407980 , + 124.0908762205 , 35.8305364082 , -123.6216777114, -74.2569079167 , + -56.7651776816 , 16.0736385582 , 23.5030632215 , -110.6764295938, + 44.3086821806 , 9.4452708243 , 5.3300080251 , 39.0483916714 , + 151.4550562868 , 62.8957092621 , -116.8103461233, 5.1129927759 , + -33.2252515135 , -9.4522506046 , 22.7026048372 , -15.5264414569 , + 71.2087620034 , 19.1191568332 , 50.3019546809 , -5.6096922409 , + 22.9344126462 , -7.7591876203 , 31.8949515564 , -58.4253952381 , + 66.4341297173 , -19.0583083044 , 96.7695087855 , 20.4934280047 , + 4.9544603116 , -20.8288135920 , -173.2659655408, -62.4883621640 , + -48.5528422703 , 12.1437504278 , 60.2482234666 , -19.6072312919 , + -34.6320214291 , 129.0089698963 , -50.9042160618 , 98.3952661477 , + -4.7051792479 , -13.1768910826 , 69.5138802139 , 58.5748201565 , + -45.9385652563 , 151.7952104306 , 34.2541941013 , -58.0417838381 , + 28.1480473670 , 46.4006562684 , 97.7001828545 , 4.0855607626 , + -32.6097018162 , 16.8913949959 , 105.7266202978 , -89.3978374651 , + -60.9338593128 , -41.2220734230 , 49.9393070783 , 95.0974764854 , + 49.2498366456 , 58.6214364590 , 34.1113830569 , 45.6634098874 , + -22.5356086770 , -97.1978653617 , 86.5565049535 , 70.6118545777 , + -30.6978082909 , 118.7238621666 , 14.5922386932 , 11.3449652072 , + 65.6007783405 , 82.6369678204 , -52.0390492248 , -47.0160551227 , + -95.5142448634 , 99.7162626888 , -36.5523815090 , -42.8042935534 , + 68.3566199798 , -13.8451547552 , -71.1629911780 , 36.2989433752 , + -32.4867163365 , 112.4079947071 , -75.6295117422 , 47.5276421639 , + 51.8078250755 , -26.8715188457 , -9.6291144797 , 40.1999849640 , + -38.4634033246 , 40.9764960915 , -26.1715730268 , 36.5996396515 , + -26.9924731886 , 53.7879986570 , -83.1658398348 , 23.6381378489 , + 43.8794937753 , -55.4133836419 , 90.0266130838 , 14.1036181982 , + -18.1225736715 , 85.1363181151 , -62.5970846379 , -18.5291947838 , + -25.7341986703 , -49.7061342931 , -59.0442763971 , 50.8960636803 , + -87.6471123430 , -36.7217762531 , 22.5952364054 , 11.1107885650 , + -0.5377327229 , 160.8145792630 , 73.3103441505 , 10.1656872354 , + -50.4554350397 , -57.3478171016 , -15.4201715357 , -26.9135446491 , + -4.9891264771 , -37.0226770057 , -80.9919535641 , 50.4418660876 , + -25.8517575250 , -69.9538258421 , -17.5730160671 , 15.9405836751 , + 113.9545230349 , -46.1040379057 , -94.2458635014 , -69.0338522452 , + 43.5813790265 , 107.1836101171 , -55.1012654323 , -77.1529555887 , + -33.1530320656 , -94.5582659641 , -53.6837586872 , 27.0680381378 , + 93.9385415207 , -61.0955216188 , 18.0530957225 , 7.9150142320 , + -12.1218191587 , 34.0173961457 , 40.0084937565 , 9.8119275580 , + 44.2065861274 , -1.8718514394 , 67.4740024215 , 46.7391150131 , + 207.2404815875 , 45.1635364462 , 43.3580102761 , -44.0244218674 , + 83.2387206007 , -8.6441851856 , 12.3993902588 , -22.5091685270 , + -19.8332981376 , 97.9196509289 , -76.6720306234 , 28.9740705859 , + 121.9415248016 , 9.6656982611 , -51.0996453694 , 37.3704374740 , + 74.7589840907 , -113.4066752631, 120.0029566342 , -105.3786221360, + 81.8152755619 , -13.4979932982 , -21.4680758393 , -85.1088235539 , + -65.3610798409 , -35.0444139470 , -48.0220794487 , -41.6210317362 , + 33.1212995259 , -82.1480936443 , -10.5479715135 , 76.4601917004 , + 42.1983651157 , 92.6104239912 , -42.3536237955 , -24.5644182272 , + 30.4446637772 , -90.2899420489 , 63.6723540422 , 103.0895811428 , + 64.1706769263 , -10.7069812309 , 21.8927240409 , 6.3571071738 , + 57.1457649358 , -52.9866276448 , 66.0981829072 , -29.5372056881 , + -79.2252039810 , -136.2440652798, -57.0106422562 , 86.8203548141 , + 66.4244149837 , 53.3230426111 , -66.1283059222 , -131.0402660353, + 8.0548411081 , 122.9088988100 , 1.2626894208 , -60.5059112373 , + -68.8707203082 , -6.4747987200 , 85.8411327244 , 99.9624156733 , + 90.4197864338 , -35.9630441182 , -22.9158275507 , -17.3660128776 , + 16.7845345761 , 34.7219749782 , -39.3513765878 , 1.0460702756 , + -60.9494500182 , 20.0900333387 , -85.9636743832 , 88.4400782168 , + 15.0729628728 , 61.5499846243 , 11.8579871757 , 107.8617581581 , + -42.9393027864 , -62.8422307621 , -19.0589600542 , 4.0750325807 , + -36.0651825425 , 55.7638724501 , -10.4691736080 , -55.5672537178 , + -61.2061519915 , -21.1885348576 , -131.2535612498, 24.7463552676 , + 22.9426321237 , 14.3038202264 , -138.0926317438, -59.0892900856 , + -162.5416439986, 7.1307658250 , -141.1236672256, -4.7173618068 , + -16.7741532807 , -68.2615451173 , -2.6608701102 , 84.1978109826 , + -11.3446202072 , 59.9630033088 , -1.8994925010 , -37.9301641959 , + -119.4435600954, -11.4587491646 , 12.2423215240 , -7.3169898616 , + -67.0373621128 , 36.0198843055 , 53.9791315249 , -134.5885680695, + -83.8330811965 , -16.6714816463 , -8.8498552035 , -24.0513088196 , + -22.9444328877 , -37.7961441531 , 25.1975736186 , -136.1611637464, + -5.0843464033 , -10.3939554694 , 20.7422826935 , 75.6854136623 , + 46.4179626736 , -57.0052830175 , 7.3457235521 , -51.5504447254 , + -158.4375751701, -200.2426967181, -48.1234996261 , 1.6623945527 , + 21.1746524375 , 99.4092980367 , -2.3206772903 , 45.7989166757 , + 2.0181548348 , -88.0556010969 , -59.1527212096 , 47.3607925077 , + -10.4181140309 , 56.3558125650 , -8.9799125560 , -30.0376711812 , + -36.7132904688 , 35.7785050392 , -13.0763909369 , -2.1855594714 , + 18.1550954005 , -28.6711803575 , -55.4495172398 , -2.8812973198 , + -59.9575059158 , 40.0588875786 , 57.4713686602 , -3.2835144853 , + -36.7193552111 , -64.9415131516 , -166.9555466445, -23.5556853844 , + -54.9408569587 , -35.2310451959 , 21.3345143458 , 65.7590671151 , + 51.2214538168 , 46.1271939944 , -42.2235267919 , 127.2329928299 , + 105.2391778600 , 17.6726845966 , -129.9021148044, 8.7065613044 , + -94.0987112511 , -3.5375742950 , -23.1385452379 , 60.6219530633 , + 92.5445564235 , 48.5111974469 , -52.5699309159 , -60.0634811685 , + 25.9034368684 , 140.0249495491 , 1.5918852392 , 38.0266038291 , + 17.5588710703 , 3.4294066089 , -27.6748782173 , 59.6182974489 , + -35.2924781853 , -38.6198576115 , -13.6119803198 , 7.8375587489 , + 22.7250686519 , -28.3524510951 , -34.4269062817 , 22.6464817325 , + -61.6528147860 , -5.9782002429 , 61.4730771294 , 43.5582379527 , + 55.6862408270 , 87.8745651631 , 46.3401042715 , -19.8780979663 , + 74.1272633369 , 29.8590452377 , -12.8665765140 , 34.2931401219 , + 53.9279617551 , -16.9017895140 , -70.1527553166 , -79.6367897992 , + 109.3728271017 , -129.2214826835, -53.4644539730 , -51.5654458993 , + 17.6062148433 , 3.5090251835 , 74.2615941204 , -109.3431097845, + 40.1403465151 , 28.8714561280 , 94.0868659302 , -19.0047033845 , + -60.0967410050 , -19.0998457619 , -67.2027075128 , 72.0711434846 , + -17.8737851232 , 123.7050551274 , 132.6331504104 , 25.5018761009 , + -36.7817189239 , -29.1580893235 , -6.5848563828 , 90.2868948516 , + -35.7017258498 , -68.5675432955 , -52.4888589786 , 47.1377730021 , + -7.4546621940 , -52.0657517138 , -49.0404829633 , -114.6910280126, + -117.6819819437, -32.7856729408 , 31.8232065591 , 12.1192973039 , + 35.2678513420 , -1.0336778293 , 30.7021249679 , 127.0442906046 , + -84.8457819393 , 28.9862843096 , -47.3524701726 , -126.1094998460, + -2.9700276582 , -2.4956545870 , -53.8624121141 , -85.2114117637 , + 76.9057985618 , 137.1205201755 , -19.0830817212 , 14.3407526579 , + -56.5921994449 , -25.6084873186 , -44.9470801106 , -133.3139496090, + 0.3487447576 , 33.4499716730 , 34.7126257844 , -9.3307383323 , + 27.2996276947 , 10.8765676134 , -91.1032360444 , -90.9584216222 , + 1.6981490570 , 96.8557438791 , 56.7726390913 , -44.3246449237 , + 52.3260643361 , 21.5551140465 , 27.4535327381 , 2.0072717479 , + 7.4823125629 , 77.1185863870 , 16.1372262663 , -10.7206012957 +}; + +const float32_t controller_f32_coeffs[CONTROLLER_MAX_COEFFS_LEN] = +{ + /* S->Kp, S->Ki, S->Kd; */ + 0.0000000000 , -1.0336778293 , 56.7726390913 , + 0.3487447576 , 0.0000000000 , 27.4535327381 , + -29.1580893235, 1.6981490570 , 0.0000000000 , + 0.0000000000 , 0.0000000000 , -2.4956545870 , + 0.0000000000 , 8.7065613044 , 0.0000000000 , + 0.0000000000 , 0.0000000000 , 0.0000000000 , + 18.1550954005 , -5.9782002429 , 2.0072717479 , + 33.1212995259 , -82.1480936443, -10.5479715135, + -23.6296332202, 49.1171161163 , 53.1636857935 , + 7.2830326091 , 66.8368719314 , 33.9778190671 , + 9.4452708243 , 5.3300080251 , 39.0483916714 , + 6.9915412654 , -8.9909197429 , -78.9165936808 +}; + +const q31_t controller_q31_coeffs[CONTROLLER_MAX_COEFFS_LEN] = +{ + 0x00000000, 0xFEF760E4, 0x38C5CBAD, + 0x00594756, 0x00000000, 0x1B741AB9, + 0xE2D78775, 0x01B2B9E6, 0x00000000, + 0x00000000, 0x00000000, 0xFD811CC8, + 0x00000000, 0x08B4E134, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, + 0x1227B455, 0xFA0594AB, 0x0201DC90, + 0x211F0D7C, 0xADDA1689, 0xF573B824, + 0xE85ED05B, 0x311DFB52, 0x3529E750, + 0x074874D3, 0x42D63D3D, 0x21FA525A, + 0x0971FD45, 0x05547B68, 0x270C6366, + 0x06FDD5A6, 0xF7025315, 0xB1155A1E +}; + + +const q15_t controller_q15_coeffs[CONTROLLER_MAX_COEFFS_LEN] = +{ + 0x0000, 0xFEF7, 0x38C6, + 0x0059, 0x0000, 0x1B74, + 0xE2D8, 0x01B3, 0x0000, + 0x0000, 0x0000, 0xFD81, + 0x0000, 0x08B5, 0x0000, + 0x0000, 0x0000, 0x0000, + 0x1228, 0xFA06, 0x0202, + 0x211F, 0xADDA, 0xF574, + 0xE85F, 0x311E, 0x352A, + 0x0748, 0x42D6, 0x21FA, + 0x0972, 0x0554, 0x270C, + 0x06FE, 0xF702, 0xB115 +}; diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/controller_test_group.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/controller_test_group.c new file mode 100644 index 0000000..0f9709e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/controller_test_group.c @@ -0,0 +1,13 @@ +#include "jtest.h" +#include "controller_tests.h" + +JTEST_DEFINE_GROUP(controller_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_GROUP_CALL(pid_reset_tests); + JTEST_GROUP_CALL(pid_tests); + JTEST_GROUP_CALL(sin_cos_tests); + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/pid_reset_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/pid_reset_tests.c new file mode 100644 index 0000000..a930dbb --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/pid_reset_tests.c @@ -0,0 +1,52 @@ +#include "jtest.h" +#include "arr_desc.h" +#include "arm_math.h" +#include "type_abbrev.h" +#include "test_templates.h" + +/* Bucket of zeros. For comparison with the output of arm_pid_reset_xxx. */ +ARR_DESC_DEFINE(float32_t, zeroes, 3, CURLY(0)); + +/** + * Define a JTEST_TEST_t for the function arm_pid_reset_xxx function having + * suffix. + */ +#define ARM_PID_RESET_TEST(suffix) \ + JTEST_DEFINE_TEST(arm_pid_reset_##suffix##_test, \ + arm_pid_reset_##suffix) \ + { \ + /* Initialise the pid_instance */ \ + arm_pid_instance_##suffix pid_inst = { 0 }; \ + pid_inst.state[0] = (TYPE_FROM_ABBREV(suffix)) 0xffffffff; \ + pid_inst.state[1] = (TYPE_FROM_ABBREV(suffix)) 0xffffffff; \ + pid_inst.state[2] = (TYPE_FROM_ABBREV(suffix)) 0xffffffff; \ + \ + /* Display cycle count and run test */ \ + JTEST_COUNT_CYCLES(arm_pid_reset_##suffix(&pid_inst)); \ + \ + /* Test correctness */ \ + TEST_ASSERT_BUFFERS_EQUAL( \ + pid_inst.state, \ + zeroes.data_ptr, \ + 3 * sizeof(TYPE_FROM_ABBREV(suffix))); \ + \ + return JTEST_TEST_PASSED; \ + } + +ARM_PID_RESET_TEST(f32); +ARM_PID_RESET_TEST(q31); +ARM_PID_RESET_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(pid_reset_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_pid_reset_f32_test); + JTEST_TEST_CALL(arm_pid_reset_q31_test); + JTEST_TEST_CALL(arm_pid_reset_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/pid_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/pid_tests.c new file mode 100644 index 0000000..2e1c56e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/controller_tests/pid_tests.c @@ -0,0 +1,79 @@ +#include "jtest.h" +#include "arr_desc.h" +#include "arm_math.h" +#include "ref.h" +#include "type_abbrev.h" +#include "test_templates.h" +#include "controller_test_data.h" +#include "controller_templates.h" + +/** + * Define a JTEST_TEST_t for the function arm_pid_xxx function having + * suffix. + */ +#define ARM_PID_TEST(suffix,type) \ + JTEST_DEFINE_TEST(arm_pid_##suffix##_test, arm_pid_##suffix) \ + { \ + uint32_t i,j; \ + \ + arm_pid_instance_##suffix fut_pid_inst = { 0 }; \ + arm_pid_instance_##suffix ref_pid_inst = { 0 }; \ + \ + for(i=0;i 0 ? (x) : -(x)) + +/* + Function to test correctness of sin_cos output by comparing it with reference library +*/ +#define COMPARISON_INTERFACE(type, threshold) \ + if ( (ABS((type) sin_val_ref - (type) sin_val_fut) > \ + (type) threshold ) || \ + (ABS((type) cos_val_ref - (type) cos_val_fut) > \ + (type) threshold)) \ + { \ + JTEST_DUMP_STRF("Error: %f %f\n", \ + ABS((type) sin_val_ref - (type) sin_val_fut), \ + ABS((type) cos_val_ref - (type) cos_val_fut)); \ + return JTEST_TEST_FAILED; \ + } + +/* + Sine and cosine test function for float32_t input +*/ +JTEST_DEFINE_TEST(arm_sin_cos_f32_test, arm_sin_cos_f32) +{ + /* Test function for all input degree values */ + TEMPLATE_DO_ARR_DESC( + degree_idx, TYPE_FROM_ABBREV(f32), + degree, arm_sin_cos_degrees_f32 + , + /* Display cycle count and run test */ + JTEST_COUNT_CYCLES( + arm_sin_cos_f32( + degree, + (TYPE_FROM_ABBREV(f32) *) &sin_val_fut, + (TYPE_FROM_ABBREV(f32) *) &cos_val_fut) + ); + ref_sin_cos_f32( + degree, + (TYPE_FROM_ABBREV(f32) *) &sin_val_ref, + (TYPE_FROM_ABBREV(f32) *) &cos_val_ref); + + /* Test correctness */ + COMPARISON_INTERFACE( + TYPE_FROM_ABBREV(f32), + MAX_DELTA_f32)); + + return JTEST_TEST_PASSED; +} + + +/* + Sine and cosine test function for q31_t input +*/ +JTEST_DEFINE_TEST(arm_sin_cos_q31_test, + arm_sin_cos_q31) +{ + /* Test function for all input degree values */ + TEMPLATE_DO_ARR_DESC( + degree_idx, TYPE_FROM_ABBREV(q31), + degree, arm_sin_cos_degrees_q31 + , + /* Display cycle count and run test */ + JTEST_COUNT_CYCLES( + arm_sin_cos_q31( + degree, + (TYPE_FROM_ABBREV(q31) *) &sin_val_fut, + (TYPE_FROM_ABBREV(q31) *) &cos_val_fut) + ); + ref_sin_cos_q31( + degree, + (TYPE_FROM_ABBREV(q31) *) &sin_val_ref, + (TYPE_FROM_ABBREV(q31) *) &cos_val_ref); + + /* Convert q31 numbers to float for comparison purposes. */ + ref_q31_t_to_float((TYPE_FROM_ABBREV(q31) *) &sin_val_fut, &sin_val_fut, 1); + ref_q31_t_to_float((TYPE_FROM_ABBREV(q31) *) &cos_val_fut, &cos_val_fut, 1); + ref_q31_t_to_float((TYPE_FROM_ABBREV(q31) *) &sin_val_ref, &sin_val_ref, 1); + ref_q31_t_to_float((TYPE_FROM_ABBREV(q31) *) &cos_val_ref, &cos_val_ref, 1); + + /* Test correctness */ + COMPARISON_INTERFACE( + TYPE_FROM_ABBREV(f32), + MAX_DELTA_f32)); + + return JTEST_TEST_PASSED; +} + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(sin_cos_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_sin_cos_f32_test); + JTEST_TEST_CALL(arm_sin_cos_q31_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/fast_math_tests/fast_math_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/fast_math_tests/fast_math_tests.c new file mode 100644 index 0000000..50ec433 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/fast_math_tests/fast_math_tests.c @@ -0,0 +1,38 @@ +#include "jtest.h" +#include "ref.h" +#include "arr_desc.h" +#include "fast_math_templates.h" +#include "fast_math_test_data.h" +#include "type_abbrev.h" + +SQRT_TEST_TEMPLATE_ELT1(q31); +SQRT_TEST_TEMPLATE_ELT1(q15); + +SIN_COS_TEST_TEMPLATE_ELT1(f32, float32_t, sin); +SIN_COS_TEST_TEMPLATE_ELT1(q31, q31_t, sin); +SIN_COS_TEST_TEMPLATE_ELT1(q15, q15_t, sin); + +SIN_COS_TEST_TEMPLATE_ELT1(f32, float32_t, cos); +SIN_COS_TEST_TEMPLATE_ELT1(q31, q31_t, cos); +SIN_COS_TEST_TEMPLATE_ELT1(q15, q15_t, cos); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(fast_math_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_sqrt_q31_test); + JTEST_TEST_CALL(arm_sqrt_q15_test); + + JTEST_TEST_CALL(arm_sin_f32_test); + JTEST_TEST_CALL(arm_sin_q31_test); + JTEST_TEST_CALL(arm_sin_q15_test); + + JTEST_TEST_CALL(arm_cos_f32_test); + JTEST_TEST_CALL(arm_cos_q31_test); + JTEST_TEST_CALL(arm_cos_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/fast_math_tests/fast_math_tests_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/fast_math_tests/fast_math_tests_common_data.c new file mode 100644 index 0000000..1b2d99e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/fast_math_tests/fast_math_tests_common_data.c @@ -0,0 +1,370 @@ +#include "fast_math_test_data.h" + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + +float32_t fast_math_output_fut[FAST_MATH_MAX_LEN] = {0}; +float32_t fast_math_output_ref[FAST_MATH_MAX_LEN] = {0}; +float32_t fast_math_output_f32_fut[FAST_MATH_MAX_LEN] = {0}; +float32_t fast_math_output_f32_ref[FAST_MATH_MAX_LEN] = {0}; + +const q31_t fast_math_q31_inputs[FAST_MATH_MAX_LEN] = +{ + 0x414A5524, 0x4CAB5A17, 0x2D6F5B56, 0x7DAF4E3B, 0x29B226EB, 0x41F6F6A , + 0x25CE38BF, 0x3A970AFA, 0x3A44382A, 0x05540F8 , 0x3D060524, 0x13D56570, + 0x17D7791D, 0x7FE0438C, 0x26741841, 0x40A66E54, 0x218E4386, 0x39FF3726, + 0x0DC177CA, 0x702F2CF5, 0x41142FF1, 0x6C1476AB, 0x15F640DD, 0x662C4E49, + 0x38055E7E, 0x770871FE, 0x4F8B5360, 0x0D1928A0, 0x57647821, 0x258558CF, + 0x0C0C604D, 0x50A46C19, 0x66D2370D, 0x50FA359A, 0x36462E24, 0x6CE00F5C, + 0x66D40948, 0x355B5831, 0x3B72150A, 0x1EB61530, 0x73394127, 0x773F26F4, + 0x18052980, 0x038D6587, 0x1CF517F4, 0x22AD1691, 0x7A812473, 0x7CDC7D7F, + 0x4A5110D0, 0x6D895BB9, 0x0FD60F35, 0x1A215530, 0x20EB6DDA, 0x3DE62516, + 0x250123E1, 0x5ED813C8, 0x61E175B1, 0x2CBB32F3, 0x6D350907, 0x5B140D7E, + 0x6EAE272D, 0x3E221841, 0x418B7B88, 0x26BB1B80, 0x3CF010E4, 0x24DB166C, + 0x79AB7E42, 0x62DF28D1, 0x47004665, 0x63F56FC6, 0x419E0C75, 0x46BE1F38, + 0x243239B2, 0x758D03E0, 0x5CE12926, 0x3F574B74, 0x1F4458E2, 0x71D5639 , + 0x03A17B49, 0x173A7C76, 0x06EF7531, 0x48D32F34, 0x7D3E3063, 0x0F2F3549, + 0x5C314C9 , 0x18CB6B6D, 0x26F83697, 0x447B1E9C, 0x2E323A33, 0x50745715, + 0x01AC5746, 0x655A4E04, 0x4891060F, 0x1DA36B4F, 0x60E6227F, 0x20BF5EB4, + 0x50B3225B, 0x40C10544, 0x415656C , 0x15405EAE, 0x185863E1, 0x236A1C4E, + 0x08BD21F9, 0x2ACF7A68, 0x773665E5, 0x4EDF5F66, 0x617A1610, 0x524F4968, + 0x42D006CD, 0x5F000079, 0x24DC2447, 0x6A4F5599, 0x37064D4A, 0x1DE70608, + 0x233A2EE5, 0x137E488E, 0x18061B7B, 0x4079569D, 0x24A817D5, 0x44CE48F5, + 0x575F7883, 0x22406802, 0x71AD70BB, 0x1D4A5D79, 0x3CBC7CE4, 0x335840D8, + 0x05792E47, 0x27AD2C05, 0x3D196EAB, 0x331A40AF, 0x33035831, 0x13D93987, + 0x7C542094, 0x045F317E, 0x5DC43F8B, 0x1379650C, 0x5C20193F, 0x7DD50298, + 0x1D482B82, 0x4A6B6062, 0x5C8A757B, 0x272917C1, 0x10E16FBC, 0x355A5882, + 0x66F86A35, 0x604555A1, 0x7DF7FBB , 0x758A6216, 0x1A113463, 0x53541BAD, + 0x21576756, 0x483B6D8D, 0x1F052FCC, 0x4EA63DFB, 0x55B84677, 0x7B2E04F2, + 0x787A796C, 0x04A12CD3, 0x46029BD , 0x1DB22DD8, 0x1A8C7F28, 0x061E452E, + 0x132D3F78, 0x76525852, 0x73357BBA, 0x6BBB0A58, 0x62536AFA, 0x3F6B65EF, + 0x6DC57B58, 0x1EB718CE, 0x66B02740, 0x5FF60B47, 0x32477B8F, 0x7FF35302, + 0x29FD3E40, 0x475A43D1, 0x6FF9528A, 0x2018209D, 0x47E079C9, 0x4CF576D3, + 0x28074E34, 0x5D6F58ED, 0x234045D1, 0x51CE35F9, 0x25297896, 0x644320FE, + 0x0F4449A9, 0x54C361C6, 0x701D52F1, 0x4E094820, 0x718F0810, 0x61540689, + 0x79DE5A1F, 0x52865C23, 0x48AC3A4B, 0x6A0C1BE0, 0x21B705DB, 0x7086465D, + 0x1CC10929, 0x1E1D716E, 0x6D231D4C, 0x20495108, 0x38FF1971, 0x149C78D4, + 0x441F1E8B, 0x43D95372, 0x69C324B4, 0x210B7DC9, 0x47815E78, 0x02476137, + 0x6163DDF , 0x390D6EC2, 0x2F684E5B, 0x0E680ABD, 0x02232615, 0x12593380, + 0x7B1465FE, 0x065A6957, 0x130F53EB, 0x6D772EF7, 0x10E916B6, 0x63BC7A68, + 0x2ACB00BB, 0x651C5590, 0x194714B5, 0x730904EE, 0x59BB61B4, 0x34867DBC, + 0x391C706C, 0x3C164218, 0x28931CD0, 0x129A66AB, 0x13171F4D, 0x62882872, + 0x4B167FD4, 0x66902F4C, 0x7A794932, 0x54B152C , 0x30856EA9, 0x39466D55, + 0x36696451, 0x0F5B1E8C, 0x077A3C6A, 0x51B956B4, 0x367E2D2A, 0x1D2C662A, + 0x78FB6880, 0x4E6D40B6, 0x40706FDC, 0x4DF9679C, 0x20306EDB, 0x63812AE7, + 0x255D2748, 0x1B8B617B, 0x3E036FAD, 0x04E444A7, 0x55A37517, 0x669B2988, + 0x18FD5E8C, 0x67BD05CE, 0x34BB346C, 0x76994800, 0x05B958B6, 0x6DFA2FEF, + 0x2055B5C , 0x1F843C4C, 0x72721B52, 0x73EF6B86, 0x5FB90B61, 0x43235DAC, + 0x31D424B4, 0x768C0D7E, 0x162F2F9D, 0x7B2A7A99, 0x79392693, 0x442D12C0, + 0x0692273E, 0x59A16E80, 0x5D956856, 0x44E73DAC, 0x0D874532, 0x5F5C1DD0, + 0x5D167858, 0x05597EA2, 0x1D821476, 0x59654ED2, 0x594C0DC7, 0x1A873506, + 0x3F693200, 0x7A651AB5, 0x20CC3C8A, 0x1F9E662C, 0x78E7631 , 0x2A01DA0 , + 0x3088472F, 0x12EE0D42, 0x360D4D5F, 0x73337E48, 0x0D634C06, 0x233A0ACB, + 0x706651ED, 0x7AA54079, 0x262239D1, 0x3EBB6BB6, 0x225A4F3D, 0x32581A06, + 0x6E6F5780, 0x577377C7, 0x75ED1DDC, 0x10DF2D15, 0x3C7929BC, 0x37175917, + 0x354E381C, 0x762A2DD7, 0x76435AC1, 0x73BB749E, 0x52FE4E7E, 0x6C8140F4, + 0x57694875, 0x12D30822, 0x474227CF, 0x37926D98, 0x121C7E24, 0x204E1EE7, + 0x58C6268 , 0x2152080 , 0x316C3323, 0x7AB14A31, 0x61C13C03, 0x7D8E74F1, + 0x73F446D0, 0x6C6C6A0A, 0x3BFD79FB, 0x67242969, 0x3E5524EB, 0x0FF5534 , + 0x52F05F1C, 0x17102DE3, 0x540F4A21, 0x798468E7, 0x419545EB, 0x193F7880, + 0x2B246B20, 0x408A2BC4, 0x4BF66A49, 0x40894C55, 0x4CAA6398, 0x247856E9, + 0x2F2A647D, 0x22F55D33, 0x70D37915, 0x50634C72, 0x5983671 , 0x2BCC5AF8, + 0x1A77D48 , 0x411B5CFA, 0x71074D7E, 0x3A6B3593, 0x61425F05, 0x6271012A, + 0x5B830310, 0x3D8418CA, 0x10A50792, 0x239F7137, 0x213D5071, 0x7F9930D4, + 0x2462664F, 0x54180F8E, 0x291505BA, 0x6586387A, 0x144B2C12, 0x18E425C7, + 0x3AA43373, 0x18F0503C, 0x19462AC0, 0x58B452EF, 0x72473895, 0x26BF5435, + 0x6DA553B , 0x60912FA6, 0x5C337331, 0x3D93CD7 , 0x4D035752, 0x20691929, + 0x389962F9, 0x36E701E9, 0x758B642C, 0x5FCA69E3, 0x596027F4, 0x2D5A2FD0, + 0x5F18324A, 0x3DB165AA, 0x76BA3876, 0x1BC21AF6, 0x3CC10841, 0x73A60174, + 0x625B7F58, 0x67C57724, 0x4458653C, 0x61573095, 0x2B370837, 0x03DF6CE3, + 0x5D086EFA, 0x3F5227C2, 0x191B4785, 0x60843D82, 0x30DE11F1, 0x105E226C, + 0x6E1C7AA2, 0x47AA5D14, 0x36676D03, 0x3B8D4DF6, 0x7372694 , 0x409521DC, + 0x744206A , 0x4722023F, 0x2BE46AD5, 0x63E11D76, 0x4A4A09AB, 0x5CF252B9, + 0x31586916, 0x4DFD7D84, 0x32037634, 0x2D7329D4, 0x4524582F, 0x2E5366C1, + 0x3B0E019B, 0x38530C6A, 0x6A2542D , 0x0A6A00E5, 0x119725CC, 0x54065347, + 0x1B6F7AF1, 0x6CCF71F1, 0x181117F2, 0x71674A76, 0x74F43880, 0x77A55F47, + 0x59EA5B62, 0x4A331D95, 0x3CBB276F, 0x245C4D50, 0x4718D5 , 0x07CE05D1, + 0x60D47AD5, 0x25CA1C40, 0x30061766, 0x669B39DF, 0x3D5F1320, 0x19306AD3, + 0x28B30325, 0x0DD090F , 0x6A6E6F37, 0x2DF16F66, 0x2B514C7E, 0x31101C58, + 0x7D4847FC, 0x515341CA, 0x77AB0EA6, 0x41320DAF, 0x3AF8531E, 0x24B31611, + 0x6D377331, 0x7A832A22, 0x222511C7, 0x722D1F89, 0x3B194F18, 0x261B0A4D, + 0x43F676DB, 0x4F8C6D61, 0x190F2250, 0x202E72A9, 0x560D4EA2, 0x308E67B4, + 0x36746663, 0x17CC3852, 0x27EB2EAC, 0x7FDE0AA8, 0x264719A , 0x23261EDD, + 0x3C0B339E, 0x06284D40, 0x48D82ECB, 0x24D44CF8, 0x43631B91, 0x4BF04248, + 0x36497B9B, 0x68273C58, 0x630B7AF9, 0x20CC3F26, 0x6C3B7B71, 0x574433ED, + 0x7A2552F6, 0x4CDE642D, 0x565B0142, 0x26F9207F, 0x67A207BE, 0x5B506684, + 0x44DA4780, 0x11756A0C, 0x156104AF, 0x415561B0, 0x6E3A6886, 0x1DBA1EA2, + 0x542359C8, 0x4C024E22, 0x758F052A, 0x1DD6395 , 0x2D194BAD, 0x616475A1, + 0x42084602, 0x09C274AD, 0x13CB5562, 0x57FE2D5B, 0x607A4EE5, 0x16723A91, + 0x4F624CCF, 0x2E5E24A3, 0x28FE6FAF, 0x3DDA6EF4, 0x32AF540C, 0x19A57B3B, + 0x5D1D73A3, 0x23424B3E, 0x278445F5, 0x53971C3B, 0x427D7943, 0x5221358C, + 0x26CE1A5E, 0x7B506CA4, 0x3B86636E, 0x60831F6D, 0x45E142F3, 0x21B77B04, + 0x7BB65E0C, 0x78B80F5E, 0x7D8D172B, 0x3BF33A90, 0x2D572D9 , 0x2B5B4920, + 0x36A05E01, 0x52745306, 0x47C64855, 0x1CAA669B, 0x304A2641, 0x4D6B1760, + 0x3E176D79, 0x523241B0, 0x24A67957, 0x4BDE76AF, 0x4E5F1493, 0x4C215DA5, + 0x33A052B , 0x1A4D00C2, 0x40AE6BCA, 0x390D106B, 0x69E86018, 0x5AF356CF, + 0x63561D4 , 0x44F31C6 , 0x14B6299B, 0x0D2E25F0, 0x4CBF132A, 0x45AC18B6, + 0x2227567D, 0x06B54E2F, 0x26344534, 0x22C515EC, 0x2442370D, 0x6C3721C6, + 0x34EF687D, 0x1C06323A, 0x6AF36A60, 0x60396F52, 0x6AE70AA1, 0x49D06CBC, + 0x6F9576C8, 0x584C4258, 0x3A9A27BB, 0x66DF0D47, 0x1D4804EA, 0x57DD1E67, + 0x789C7895, 0x75336111, 0x25C122C8, 0x62742114, 0x4FBF6D26, 0x3F9F6482, + 0x66F02CD9, 0x11083202, 0x499E2618, 0x7EBC1351, 0x440112F1, 0x49DF7BC1, + 0x3BF45C25, 0x31BA7FA0, 0x61AF1AED, 0x6B1F7D29, 0x2D865294, 0x63E01129, + 0x7E9E77A5, 0x100435D7, 0x1FE3A71 , 0x08597C81, 0x722849FA, 0x31C520AF, + 0x7BA178DC, 0x7F102D31, 0x5CA07864, 0x150E6F98, 0x02C34882, 0x5D041F11, + 0x0C613C57, 0x53984FD1, 0x426F38AD, 0x55992B1D, 0x7AFA078D, 0x2B253413, + 0x594B32CF, 0x32887E38, 0x28933B46, 0x1A0B4168, 0x291B4A94, 0x653A5E8D, + 0x21746BBE, 0x5EFE6415, 0x30DA429C, 0x50C5640C, 0x34711AA4, 0x529C67A6, + 0x105957CD, 0x4D287499, 0x03CA0AA7, 0x28385832, 0x25A04A02, 0x420D47A4, + 0x35627556, 0x4BC11E4C, 0x59E215C7, 0x27E838B4, 0x458612F4, 0x22827F6F, + 0x449D4DBA, 0x679B7362, 0x4E495845, 0x4FD270D1, 0x395E76A0, 0x375A655E, + 0x12E2058F, 0x73F970CA, 0x61EF73B3, 0x51FF5362, 0x67410345, 0x7FDA0B3B, + 0x221962E8, 0x17AB6543, 0x26557412, 0x4B30084D, 0x268E191D, 0x7E0D13DF, + 0x73EF127D, 0x4DEC5DB1, 0x77FA745F, 0x56002898, 0x12DD0A40, 0x157F6DDF, + 0x42A55F8E, 0x43597924, 0x7B630C3F, 0x338B6B58, 0x32945F75, 0x4FA23A0E, + 0x036E38C0, 0x33B18FD , 0x06114337, 0x24660ACB, 0x19BB02F0, 0x124C0A47, + 0x3A951701, 0x01155ABF, 0x0C612D71, 0x36074CA7, 0x51660C41, 0x635F58C7, + 0x7FC2002D, 0x0E6A7CF3, 0x65B07D07, 0x015F6A6B, 0x791B70DD, 0x6E475719, + 0x424314C7, 0x68426EB , 0x71942FEE, 0x464A2F52, 0x677579FD, 0x6BA775AE, + 0x1F66EFF , 0x1A795237, 0x78D9545F, 0x1D0B344D, 0x3BD34AB7, 0x2F85312A, + 0x16C542AD, 0x3990185D, 0x08DF3351, 0x02811AA5, 0x6D351F41, 0x4066269D, + 0x06B660BF, 0x6EDB4768, 0x5DD70CF0, 0x35D74F6E, 0x689E220C, 0x11431687, + 0x147C49C9, 0x385762BD, 0x302F0AE4, 0x1DAB67F8, 0x483256C9, 0x37D50FCB, + 0x4EA82711, 0x4D7B2C98, 0x19DB78BC, 0x58DE0DC2, 0x6AFF7E7B, 0x37621C93, + 0x792C6E19, 0x77001192, 0x7F88439D, 0x2E196A66, 0x6C71378C, 0x6AF43B3A, + 0x7C16225E, 0x6687337 , 0x4BEE1608, 0x6D5B5552, 0x345D4590, 0x681209CC, + 0x7B242819, 0x508A1416, 0x19880FE3, 0x1FC7288A, 0x24BD0502, 0x6A1D1678, + 0x20E6CA0 , 0x59BE2057, 0x5ADE11EB, 0x5EA8649D, 0x7A200E6F, 0x1149481D, + 0x72281E93, 0x0A5B0451, 0x67312D58, 0x63B849F1, 0x52217960, 0x7CDF59F3, + 0x33C775C0, 0x1EBA0799, 0x7DF1506 , 0x34E96110, 0x38FC73E3, 0x5EA059B2, + 0x022936EA, 0x316406F6, 0x43911185, 0x6C0D10F3, 0x1C6F3DF8, 0x38DB12A9, + 0x5CD41244, 0x2C9F0A7B, 0x5F4A315F, 0x77CE1C66, 0x4C800860, 0x318D53E0, + 0x7105420D, 0x575361F2, 0x750810BA, 0x217E4CA5, 0x2010140 , 0x4D884763, + 0x42BB0DA7, 0x32D53A74, 0x141C6CD4, 0x087F5FC3, 0x464B53 , 0x2D2A05F6, + 0x15532B45, 0x5D5C3CE1, 0x3EB9216A, 0x2214611B, 0x1FC52C5F, 0x11AE5DD7, + 0x20B925A9, 0x7C640AF4, 0x740009AC, 0x6D0E0321, 0x38E6A61 , 0x09104544, + 0x474F26C8, 0x15254CF3, 0x341A6B59, 0x661904CE, 0x598B2197, 0x2412659D, + 0x61976DD4, 0x329B3E16, 0x08FD1FB0, 0x304006F3, 0x3456309 , 0x55CC15F1, + 0x59DA7630, 0x5C801335, 0x0036D52 , 0x353775A5, 0x299476EB, 0x75280568, + 0x766F5264, 0x2EA233A6, 0x647619F3, 0x7FB30C7A, 0x1BC03B9 , 0x36BC3061, + 0x3F30596E, 0x3E2A527B, 0x0AC04220, 0x641979A3, 0x1ECC3B89, 0x21447BC1, + 0x4E8F2E26, 0x0C5A1D90, 0x299E5467, 0x57C947E3, 0x1D4865ED, 0x76F31C3D, + 0x4EE81CDF, 0x3479195E, 0x6FFB3AE1, 0x5C82398 , 0x300F7364, 0x47940AFA, + 0x3B853E3E, 0x598C440D, 0x224A3D89, 0x3A674204, 0x22880A38, 0x2E77F2D , + 0x22841C9C, 0x4F0609C3, 0x1FE90922, 0x09335017, 0x2D6B69A7, 0x7EDB63F9, + 0x099A74EF, 0x1F9F1B40, 0x24BE17E8, 0x251D2F7A, 0x16AC50D3, 0x28D7ED6 , + 0x6D193443, 0x76156F1B, 0x30DF6A4E, 0x64FF6794, 0x63DB2C9A, 0x74353022, + 0x556E025C, 0x23802AF9, 0x425018A4, 0x675A18BB, 0x70B227B9, 0x7FB01BF , + 0x63E7910 , 0x6C661591, 0x65745D2B, 0x4F6E379D, 0x52B32FAC, 0x1E6A1101, + 0x1DE22385, 0x2338191F, 0x469704B6, 0x4BAB4599, 0x54EB4809, 0x78393E6D, + 0x550017DD, 0x39B120E1, 0x288D52D3, 0x2D52668C, 0x20D22A68, 0x4E1207D1, + 0x3FCC0EFE, 0x47F37E64, 0x25177A90, 0x34BF5D4D, 0x5A8D3DCE, 0x6F7275A8, + 0x6BEA2655, 0x2A1810FC, 0x64DB593A, 0x0A4D4BC0, 0x2C402E93, 0x71C077F9, + 0x6F0C4577, 0x70412414, 0x752F1DC1, 0x582E38EA, 0x2C455F7B, 0x4DCD4EDB, + 0x12BC2696, 0x7B037135, 0x4FCA1F8C, 0x3D5E75F6, 0x502F41B0, 0x361653F1, + 0x2E5B0E31, 0x20266B19, 0x57E703D7, 0x467B3E00, 0x47032BA3, 0x1F776B9C, + 0x62570A84, 0x7EC75B48, 0x1BD5012 , 0x7D0A2D5D, 0x7FCC29F2, 0x291304B6, + 0x19D558ED, 0x47551C8 , 0x7D12738F, 0x3ADE0892, 0x5F741997, 0x25D2E2F , + 0x2B9F2269, 0x5C134FED, 0x15E92399, 0x54437F4E, 0x272D32AB, 0x56186AA1, + 0x7E4D355C, 0x234D7836, 0x2A871760, 0x4637A94 , 0x2C183207, 0x5FC78B3 , + 0x7F10621E, 0x276966B2, 0x6C9F4A11, 0x4E3F182C, 0x62BA2EF5, 0x25F239CD, + 0x73D63FED, 0x636E1F5E, 0x0AC15A0E, 0x3F3D33EB, 0x738326EA, 0x35C366B1, + 0x4D476E86, 0x02F63208, 0x711A1FC1, 0x426A4396, 0x7E4D1B93, 0x75E46DB7, + 0x2F3C44A7, 0x51A56F5C, 0x7AD2463D, 0x0A5639CA, 0x49952C78, 0x4C4B64F6, + 0x3AFE7F8D, 0x66993D04, 0x43867F37, 0x4BC146C2, 0x55A875EC, 0x681A1A75, + 0x30A67E1B, 0x4A4A7D0C, 0x20F77993, 0x1891805 , 0x738976AD, 0x542667D6, + 0x3C5C6EBF, 0x4499187F, 0x2BF17C97, 0x447C317F, 0x68D8419C, 0x7AAB6456, + 0x421B4F29, 0x76740F9C, 0x09163B8D, 0x3D72AAB , 0x1AD54DD7, 0x754946EE, + 0x7317342B, 0x218546D4, 0x10563DA7, 0x54BB4CCE, 0x0CE63E46, 0x5D146234, + 0x33BE6C63, 0x325044E5, 0x09D72335, 0x07C36BA , 0x365530CC, 0x2DFA448C, + 0x1663516F, 0x59B00AA , 0x150274EA, 0x12532D4A, 0x3CEF002D, 0x492F3DA5, + 0x263A2574, 0x6F8005C2, 0x14A10651, 0x2F627ABA, 0x68293238, 0x26987646, + 0x52590516, 0x10144D36, 0x59B151B9, 0x2B2A4F05, 0x53953699, 0x27851C75, + 0x180646F3, 0x2E970306, 0x32843145, 0x18F4FE8F +}; + +/* The source data is random across the q31_t range. Accessing it by word should + remain random. */ +const q15_t * fast_math_q15_inputs = (q15_t *) fast_math_q31_inputs; + +const float32_t fast_math_f32_inputs[FAST_MATH_MAX_LEN] = +{ + /* Special values close to increments of pi/2 */ + -0.0, 0.0, -1.5E-07, 1.5E-07, 1.5707964, 1.5707965, + -1.5707964, -1.5707965, 3.1415925, 3.1415927, -3.1415925, -3.1415927, + 6.2831855, 6.283186, -6.2831855, -6.283186, + + /* Test some slightly larger values too */ + 10.1, -13.2, + + /* Random values (0, 2pi) */ + -1.3684878, 1.1444261, 0.2627620, 0.6719343, 3.8732286, 5.9040643, + -2.2271110, 2.5800587, 6.1848498, 5.9412493, 4.2514839, 6.2096863, + -4.8181437, 2.1155439, 4.1618680, 1.5341357, 1.8567268, 4.2736867, + -3.3165594, 2.5861183, 3.7864876, 4.7156566, 3.6664471, 3.4670146, + -3.6666823, 3.2158594, 0.5189454, 4.5211925, 6.2590334, 2.2276047, + -6.1025991, 2.1768018, 5.5703194, 2.8569321, 2.5976403, 1.3680509, + -0.7895111, 1.9409676, 4.5622487, 4.9189303, 4.3591961, 0.0615894, + -5.2980657, 5.7951829, 4.8440482, 0.2680398, 2.3762136, 4.4254964, + -4.5836656, 1.4091744, 1.6905207, 4.2287795, 3.0001720, 3.9189258, + -1.4856273, 1.1129014, 5.2128031, 4.8187110, 5.8715002, 0.6778860, + -1.1449692, 0.6226340, 3.0772767, 1.2141962, 5.6290528, 0.6225986, + -0.2775005, 3.5015887, 4.8537297, 1.9599772, 1.1245801, 2.1297213, + -1.3203840, 3.2053828, 5.6948550, 3.9516457, 0.6379562, 2.4558128, + -0.3431663, 3.1496534, 2.7125841, 6.2678565, 5.0994494, 3.0514394, + -5.6199810, 0.8642307, 2.4504731, 5.8267510, 5.7647838, 4.4835177, + 3.8851284, 2.1569414, 5.8812331, 0.7839784, 4.5904032, 4.0619375, + 5.2348483, 2.5024810, 4.7112719, 5.2478452, 2.0260784, 3.4699621, + 6.1520498, 3.4514073, 2.0761128, 3.8922546, 2.2659464, 4.7532896, + 2.6006151, 3.0934955, 4.3652005, 6.1118673, 2.0593452, 5.2640727, + 4.6437278, 5.9952549, 0.2005758, 2.2422740, 4.1635768, 1.7687265, + 1.4475395, 4.4681525, 3.9243074, 3.7109036, 4.1496541, 0.2987948, + 2.1914796, 2.8358565, 1.5136507, 4.4927603, 5.3795520, 1.7687650, + 4.5933278, 0.8655898, 5.2572843, 0.8708603, 3.6958286, 2.3006310, + 5.0690197, 3.1653480, 3.0762120, 5.5106597, 2.2188555, 2.8239372, + 6.0540393, 0.2657649, 6.1132775, 1.1888217, 4.1916405, 3.6847088, + 4.2418564, 2.2683684, 3.8973243, 5.0966113, 0.1209983, 0.5269928, + 6.1248595, 4.0925498, 1.4529100, 2.5352096, 0.7666775, 1.6866509, + 1.6200953, 2.0839142, 0.9565145, 2.1865966, 0.7644026, 5.5552975, + 0.5923686, 5.8436176, 2.5071164, 0.2978322, 2.1511962, 4.6242118, + 4.9931353, 3.4237447, 4.3116692, 5.6148598, 0.3442670, 1.9079607, + 0.2902301, 1.2282167, 4.5249352, 4.5349096, 5.5153742, 3.6595342, + 0.4441228, 5.7977751, 5.0288862, 1.7966571, 3.4159368, 6.1875316, + 4.4967379, 5.2714014, 2.7222564, 2.9570223, 3.5230663, 1.6907520, + 4.7062218, 3.1660203, 4.0640250, 1.9336225, 0.8716326, 2.9881129, + 2.2773988, 4.9518627, 4.9027432, 4.2003861, 0.8388295, 0.1354396, + 3.5175829, 1.8901016, 5.9024853, 6.1631993, 1.8008890, 5.0317023, + 5.6304337, 3.7543702, 5.5544410, 5.9296402, 3.4504620, 4.5765894, + 3.6238793, 0.1624673, 2.8056369, 4.0608350, 3.2748147, 2.3393094, + 5.8881908, 5.2121085, 5.3349614, 2.3407017, 3.7270886, 5.4824095, + 5.8653636, 4.2000849, 1.2992148, 4.1082644, 0.4527132, 2.5555406, + 4.1904544, 5.8667713, 5.0953493, 3.0445066, 4.7547955, 2.6203864, + 6.1059115, 6.2076281, 5.4295991, 2.4434288, 2.8572272, 1.5499814, + 4.9286757, 5.5470323, 5.7410198, 3.5078076, 3.7627993, 0.9354200, + 5.6530665, 2.8299063, 1.2922774, 5.6526739, 4.7914663, 5.5448250, + 1.7903950, 4.2300036, 4.1737937, 0.7716694, 2.5592571, 1.7296789, + 4.5029688, 1.7805566, 5.6309835, 5.1935484, 2.4506089, 3.1284165, + 4.3655898, 5.2424950, 3.8304163, 3.6111801, 2.0485834, 2.8678003, + 4.4849099, 5.5568808, 4.5292698, 0.1169475, 4.2397456, 2.7552322, + 2.7509053, 0.7353640, 5.1187960, 2.0411269, 1.5470969, 2.1533307, + 2.3605433, 3.4340988, 3.5306485, 2.4870244, 2.5015301, 3.2381477, + 4.1313862, 5.9747764, 4.5386496, 2.5137752, 5.2268018, 0.8440727, + 0.3799239, 0.5293398, 0.0000000, 2.0371338, 1.8958053, 0.0733938, + 3.3923238, 0.5992443, 0.9205800, 3.9655772, 5.3992694, 6.1212150, + 3.5866836, 6.2633946, 3.4780043, 3.2387210, 2.0777367, 2.7017810, + 3.0901098, 0.4463392, 5.5778300, 0.4061048, 2.7406309, 5.1938664, + 2.4789345, 3.8545764, 5.1436714, 5.5683790, 5.8503469, 1.1987353, + 1.6247202, 5.6414565, 3.7282025, 3.1657206, 3.8503962, 5.1485818, + 3.3419582, 1.2696753, 2.8518968, 2.6886436, 6.0698884, 3.8959208, + 4.3692639, 4.5249277, 2.1796068, 3.2483466, 3.4978155, 0.9832885, + 3.5315023, 4.3655778, 2.6794992, 5.2544420, 4.5954405, 2.2621418, + 2.8539005, 2.4277593, 4.8729535, 4.6135614, 2.7035154, 4.3589760, + 5.9389515, 4.9274787, 4.4332387, 0.6869673, 2.4500066, 3.7127639, + 2.8863700, 0.3162955, 1.4368865, 5.2413645, 0.0982985, 5.4268554, + 0.4905223, 4.2037186, 3.1429204, 1.3696954, 3.5915675, 0.7677371, + 4.2170618, 3.7673071, 0.3517086, 0.3540136, 0.9581898, 0.1232828, + 2.7342886, 5.2290017, 3.8791769, 3.2680695, 5.4278441, 0.6138541, + 5.7054603, 0.6786889, 3.2483864, 0.8994758, 3.5146290, 0.0287746, + 4.8172051, 5.3325973, 5.7605579, 6.2013046, 3.1738449, 1.7053924, + 0.6330341, 3.1909083, 3.6794907, 4.7933610, 0.5212697, 4.1569315, + 3.2482749, 1.0747264, 5.8971330, 3.7101152, 2.7685894, 5.9182512, + 4.1212281, 2.8396586, 5.2759745, 3.3465722, 3.4801751, 4.2729777, + 2.3071222, 1.5035072, 3.6374836, 5.4468120, 2.5558538, 0.7075818, + 2.7887656, 1.8861142, 2.5219880, 5.2361777, 2.5360737, 2.4515477, + 2.2647672, 0.8812504, 1.6344462, 0.5454754, 2.6979830, 1.6165554, + 1.8695956, 2.6694641, 0.7490013, 3.1105972, 4.4384875, 1.5304166, + 4.9327408, 0.4655185, 2.4748426, 0.0213259, 1.3865538, 0.0081717, + 1.1886509, 0.8952537, 1.6843712, 1.0988793, 0.8711572, 3.7629093, + 5.6615138, 5.9022971, 1.3897429, 3.0327137, 2.3625475, 3.2910070, + 1.6642436, 0.4295011, 2.7415239, 1.0923508, 0.1640358, 5.9984205, + 2.7055177, 6.0416507, 4.7903915, 0.0461730, 4.2728088, 4.4356194, + 4.0534637, 3.4702651, 1.3704176, 4.8529200, 1.4327442, 2.3302118, + 5.5978709, 5.3807748, 2.5285646, 1.9981730, 3.8241692, 5.7189253, + 5.7120324, 3.7170973, 2.0896078, 5.3599569, 2.7796679, 5.6822331, + 0.2084724, 3.3453343, 4.5018856, 1.1265867, 2.1144987, 1.1794352, + 2.0227281, 2.5375066, 3.4467437, 0.3062336, 3.4729184, 1.7266910, + 1.5174002, 1.5277262, 0.9686124, 6.0093412, 5.8789338, 5.1441345, + 4.5758041, 1.1046577, 2.2642776, 1.1862024, 0.0075297, 1.9881224, + 4.3958232, 3.9285942, 3.4121603, 2.7585521, 1.8059588, 3.1520171, + 4.7849358, 4.7903511, 3.6194660, 4.6977042, 4.0560129, 0.7742111, + 3.1692252, 2.1819072, 0.5789810, 0.9289656, 1.2451370, 4.2239985, + 2.7112647, 4.3630684, 1.6134250, 0.0613154, 3.3444332, 1.7554715, + 5.9453394, 5.6953510, 2.4673100, 0.1561700, 4.2187618, 5.2600982, + 6.1041123, 0.3577199, 2.8294680, 3.6597688, 4.3142726, 4.5203293, + 4.0843265, 4.5673388, 2.3489542, 3.6541880, 0.7295941, 0.3622530, + 6.1560465, 1.7896003, 3.7383338, 6.0454361, 1.1672793, 1.2129049, + 2.1466132, 5.8615704, 2.4546365, 1.7166712, 0.9547117, 2.4951084, + 2.3544507, 0.8238180, 2.7334414, 0.5749942, 3.8618151, 0.0689837, + 3.6019012, 4.9620190, 1.4788531, 2.8149909, 3.5773830, 0.3857966, + 3.1182750, 4.0357856, 1.3902536, 5.2593808, 6.1014456, 5.3179177, + 3.1792883, 1.7522271, 4.6911344, 1.4886775, 6.0151778, 3.8972087, + 3.7715583, 1.0845061, 0.5676653, 1.6038597, 5.3945577, 5.7244031, + 4.3959286, 4.5564551, 1.4444168, 3.6194506, 5.0933266, 2.5374227, + 6.2105471, 0.5654792, 2.0165320, 3.2132771, 0.3808010, 4.5596317, + 3.4969429, 3.3260664, 5.2149334, 5.3957421, 4.9576149, 1.9970040, + 2.8413032, 4.7263877, 0.6902815, 0.6895316, 1.6957291, 3.2963937, + 6.1113470, 4.4636294, 1.9594738, 1.8312791, 5.3429527, 5.7280497, + 4.0166905, 1.6045389, 0.5571039, 5.2669152, 3.6738954, 5.9571429, + 0.3834561, 3.6734096, 1.7913869, 5.2007946, 1.2000032, 2.7804978, + 2.4718774, 5.1935175, 4.2529065, 1.3044083, 1.9987109, 0.8407592, + 4.2189258, 3.5876427, 1.0666779, 0.9277486, 2.9912971, 5.7057758, + 3.4694180, 0.2069675, 0.3384307, 5.0583614, 2.8360719, 2.4042372, + 4.9614777, 2.2888819, 3.3448533, 4.4714710, 5.4756485, 2.0652177, + 4.0848120, 6.1250762, 0.4773170, 3.6883502, 2.6005256, 1.9423615, + 1.6577182, 4.7674690, 6.2531264, 1.1722630, 4.9080805, 1.2302350, + 6.2351753, 5.0407581, 2.6654950, 4.5795867, 3.1312479, 5.0830358, + 2.2400117, 0.4602021, 3.7133088, 5.7188788, 1.2174673, 2.7166470, + 4.7071094, 0.2462034, 5.9459353, 4.7983010, 3.5111731, 1.1551193, + 3.1287047, 3.2537199, 6.2470131, 5.3711915, 6.0469623, 4.2659122, + 2.5352740, 5.8746469, 3.0126903, 1.4563896, 2.4899651, 4.4301324, + 3.5095299, 4.7540509, 6.2547920, 6.0471349, 3.3619258, 6.0561746, + 0.7264988, 0.3232592, 1.9122808, 3.6454528, 3.3361480, 5.6624574, + 3.3963785, 2.7142142, 3.4096772, 4.4762342, 0.1047703, 5.0323343, + 0.8954125, 3.0063438, 1.6137441, 2.3190715, 4.1579916, 1.0656836, + 1.7516517, 1.2454643, 1.2256706, 2.0535941, 5.5313259, 2.9600203, + 2.5382144, 1.1261446, 6.0879353, 2.5601199, 5.3060708, 3.8662016, + 2.3663172, 5.5114955, 4.9313732, 2.9213939, 5.1143679, 5.6450910, + 2.6969853, 2.1006537, 3.7488443, 5.6673754, 4.4112136, 2.3716204, + 4.6178643, 5.9948046, 3.4105954, 3.3935850, 1.9547595, 0.4475800, + 1.1434170, 0.5842667, 2.9121888, 0.0586379, 5.7492774, 4.0384655, + 0.0089162, 0.1909163, 1.3098570, 2.8586366, 0.7996361, 0.0543350, + 4.5683759, 2.2249794, 4.9036865, 2.7435946, 2.7429546, 0.3092155, + 0.3118464, 0.5723993, 3.7324447, 1.5147758, 5.2864780, 5.3860266, + 6.0545540, 3.0718480, 1.3842492, 1.4213108, 3.3727372, 4.7884765, + 2.1838288, 2.8980046, 4.0169897, 5.7637923, 1.0151904, 4.4964699, + 3.6300404, 2.7224978, 5.5558613, 2.4696170, 1.1245340, 3.9793522, + 3.9207111, 2.0605178, 5.0451799, 6.2799046, 6.1636676, 0.7981966, + 1.4592079, 0.1484872, 3.8166117, 0.6962355, 2.5601436, 5.5548184, + 3.4440198, 2.3185147, 1.3090764, 2.7705283, 6.0079576, 0.7792778, + 2.9578927, 5.3840384, 0.2726304, 4.3456090, 6.1511471, 1.7798247, + 0.8405677, 4.3057392, 5.7142715, 3.8382030, 5.6547587, 1.2153801, + 4.7401894, 2.1756202, 2.6303011, 0.9784166, 5.1459324, 3.9265103, + 4.6405120, 5.0586705, 0.4223724, 5.9739917, 3.1263686, 4.7447217, + 4.6646686, 5.2221411, 0.9833301, 2.8733554, 3.8836400, 5.8570808, + -5.2470141, 5.6261119, 3.6600718, 3.6615062, 5.3716581, 0.2190677, + -5.5632585, 2.5618482, 0.2285950, 4.6881858, 0.9728179, 0.9042027, + -3.8073530, 1.5989503, 2.0367209, 2.5245268, 2.5533189, 2.4265105, + -3.8314979, 1.0486053, 1.1818174, 0.5945707, 2.0306392, 4.8355201, + -1.4710068, 4.6518534, 4.3531065, 5.1778361, 5.2023364, 1.8432851, + -1.9438243, 3.2862931, 2.0439139, 5.2266206, 5.0912323, 3.4997233, + -1.6522518, 4.2761236, 1.4680860, 2.8678051, 2.4163051, 3.3841326, + -6.2310582, 4.7451897, 6.1603795, 1.4751828, 3.3210347, 0.3231823, + -4.7555888, 3.7823504, 5.3857498, 6.2095284, 5.8401232, 2.5730582, + -0.0021455, 3.3984387, 1.3052100, 1.3777994, 2.0471011, 0.6028680, + -4.6968925, 4.7030205, 3.4136510, 2.1245480, 5.2297066, 3.4719134, + -6.0164208, 5.6098372, 2.2399783, 3.4331443, 2.1782657, 3.9131853, + -5.0053405, 4.6864702, 0.7887674, 5.1672539, 0.1580253, 2.6039335, + -4.5955687, 4.9095176, 2.3077255, 4.6801428, 5.6062801, 1.5243220, + -0.8142818, 1.4141432, 2.1992023, 1.8038058, 5.8275790, 0.3224138, + -3.7238350, 1.0235240, 5.2678588, 1.0528164, 3.1554195, 6.2789723, + -2.2330890, 0.2957980, 1.3424690, 2.4996969, 2.0964990, 1.4426353, + -5.8818165, 4.2926017, 6.0451393, 2.7518666, 5.9083095, 0.0366581, + -3.8346722, 5.0333074, 1.4638661, 5.8588735, 4.7957215, 5.1927356, + -3.6031780, 4.9799375, 2.0674268, 1.4040530, 1.9627813, 3.6726693, + -5.2145043, 1.8250297, 2.5293238, 5.4164658, 3.8625225, 6.2278165, + -1.2798778, 5.1975080, 4.2465638, 1.5641957, 2.9894493, 2.5074636, + -3.7663816, 5.0298329, 0.6601666, 5.1612735, 5.2847013, 2.2274284, + -2.7022061, 3.5954850, 4.4034117, 4.6650751, 4.7619266, 2.4449681, + -2.6973871, 6.0088907, 3.6000853, 5.3389611 +}; diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/biquad_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/biquad_tests.c new file mode 100644 index 0000000..3157d1c --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/biquad_tests.c @@ -0,0 +1,244 @@ +#include "jtest.h" +#include "filtering_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "filtering_templates.h" +#include "type_abbrev.h" + +#define BIQUAD_DEFINE_TEST(suffix, instance_name, config_suffix, output_type) \ + JTEST_DEFINE_TEST(arm_biquad_cascade_##config_suffix##_##suffix##_test, \ + arm_biquad_cascade_##config_suffix##_##suffix) \ + { \ + instance_name biquad_inst_fut = { 0 }; \ + instance_name biquad_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numstages_idx, uint16_t, numStages, filtering_numstages \ + , \ + /* Initialize the BIQUAD Instances */ \ + arm_biquad_cascade_##config_suffix##_init_##suffix( \ + &biquad_inst_fut, numStages, \ + (output_type*)filtering_coeffs_b_##suffix, \ + (void *) filtering_pState); \ + \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Stages: %d\n", \ + (int)blockSize, \ + (int)numStages); \ + \ + JTEST_COUNT_CYCLES( \ + arm_biquad_cascade_##config_suffix##_##suffix( \ + &biquad_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + blockSize)); \ + \ + arm_biquad_cascade_##config_suffix##_init_##suffix( \ + &biquad_inst_ref, numStages, \ + (output_type*)filtering_coeffs_b_##suffix, \ + (void *) filtering_pState); \ + \ + ref_biquad_cascade_##config_suffix##_##suffix( \ + &biquad_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize, \ + output_type))); \ + \ + return JTEST_TEST_PASSED; \ + } + +#define BIQUAD_WITH_POSTSHIFT_DEFINE_TEST(suffix, config_suffix, speed, output_type) \ + JTEST_DEFINE_TEST(arm_biquad_cascade_##config_suffix##speed##_##suffix##_test, \ + arm_biquad_cascade_##config_suffix##speed##_##suffix) \ + { \ + arm_biquad_casd_##config_suffix##_inst_##suffix biquad_inst_fut = { 0 }; \ + arm_biquad_casd_##config_suffix##_inst_##suffix biquad_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numstages_idx, uint16_t, numStages, filtering_numstages \ + , \ + TEMPLATE_DO_ARR_DESC( \ + postshifts_idx, uint8_t, postShift, filtering_postshifts \ + , \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Stages: %d\n" \ + "Post Shift: %d\n", \ + (int)blockSize, \ + (int)numStages, \ + (int)postShift); \ + \ + /* Initialize the BIQUAD Instances */ \ + arm_biquad_cascade_##config_suffix##_init_##suffix( \ + &biquad_inst_fut, numStages, \ + (output_type*)filtering_coeffs_b_##suffix, \ + (void *) filtering_pState, postShift); \ + \ + JTEST_COUNT_CYCLES( \ + arm_biquad_cascade_##config_suffix##speed##_##suffix( \ + &biquad_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + blockSize)); \ + \ + arm_biquad_cascade_##config_suffix##_init_##suffix( \ + &biquad_inst_ref, numStages, \ + (output_type*)filtering_coeffs_b_##suffix, \ + (void *) filtering_pState, postShift); \ + \ + ref_biquad_cascade_##config_suffix##speed##_##suffix( \ + &biquad_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize, \ + output_type)))); \ + \ + return JTEST_TEST_PASSED; \ + } + + +JTEST_DEFINE_TEST(arm_biquad_cas_df1_32x64_q31_test, + arm_biquad_cas_df1_32x64_q31) +{ + arm_biquad_cas_df1_32x64_ins_q31 biquad_inst_fut = { 0 }; + arm_biquad_cas_df1_32x64_ins_q31 biquad_inst_ref = { 0 }; + + TEMPLATE_DO_ARR_DESC( + blocksize_idx, uint32_t, blockSize, filtering_blocksizes + , + TEMPLATE_DO_ARR_DESC( + numstages_idx, uint16_t, numStages, filtering_numstages + , + TEMPLATE_DO_ARR_DESC( + postshifts_idx, uint8_t, postShift, filtering_postshifts + , + /* Initialize the BIQUAD Instances */ + arm_biquad_cas_df1_32x64_init_q31( + &biquad_inst_fut, numStages, + (q31_t*)filtering_coeffs_b_q31, + (void *) filtering_pState, postShift); + + /* Display test parameter values */ + JTEST_DUMP_STRF("Block Size: %d\n" + "Number of Stages: %d\n", + (int)blockSize, + (int)numStages); + + JTEST_COUNT_CYCLES( + arm_biquad_cas_df1_32x64_q31( + &biquad_inst_fut, + (void *) filtering_q31_inputs, + (void *) filtering_output_fut, + blockSize)); + + arm_biquad_cas_df1_32x64_init_q31( + &biquad_inst_ref, numStages, + (q31_t*)filtering_coeffs_b_q31, + (void *) filtering_pState, postShift); + + ref_biquad_cas_df1_32x64_q31( + &biquad_inst_ref, + (void *) filtering_q31_inputs, + (void *) filtering_output_ref, + blockSize); + + FILTERING_SNR_COMPARE_INTERFACE( + blockSize, + q31_t)))); + + return JTEST_TEST_PASSED; +} + +JTEST_DEFINE_TEST(arm_biquad_cascade_df2T_f64_test, + arm_biquad_cascade_df2T_f64) +{ + arm_biquad_cascade_df2T_instance_f64 biquad_inst_fut = { 0 }; + arm_biquad_cascade_df2T_instance_f64 biquad_inst_ref = { 0 }; + + TEMPLATE_DO_ARR_DESC( + blocksize_idx, uint32_t, blockSize, filtering_blocksizes + , + TEMPLATE_DO_ARR_DESC( + numstages_idx, uint16_t, numStages, filtering_numstages + , + /* Display test parameter values */ + JTEST_DUMP_STRF("Block Size: %d\n" + "Number of Stages: %d\n", + (int)blockSize, + (int)numStages); + + /* Initialize the BIQUAD Instances */ + arm_biquad_cascade_df2T_init_f64( + &biquad_inst_fut, numStages, + (float64_t*)filtering_coeffs_b_f64, + (void *) filtering_pState); + + JTEST_COUNT_CYCLES( + arm_biquad_cascade_df2T_f64( + &biquad_inst_fut, + (void *) filtering_f64_inputs, + (void *) filtering_output_fut, + blockSize)); + + arm_biquad_cascade_df2T_init_f64( + &biquad_inst_ref, numStages, + (float64_t*)filtering_coeffs_b_f64, + (void *) filtering_pState); + + ref_biquad_cascade_df2T_f64( + &biquad_inst_ref, + (void *) filtering_f64_inputs, + (void *) filtering_output_ref, + blockSize); + + FILTERING_DBL_SNR_COMPARE_INTERFACE( + blockSize, + float64_t))); + + return JTEST_TEST_PASSED; +} + + +BIQUAD_DEFINE_TEST(f32,arm_biquad_casd_df1_inst_f32, df1,float32_t); +BIQUAD_DEFINE_TEST(f32,arm_biquad_cascade_df2T_instance_f32,df2T,float32_t); +BIQUAD_DEFINE_TEST(f32,arm_biquad_cascade_stereo_df2T_instance_f32,stereo_df2T,float32_t); +BIQUAD_WITH_POSTSHIFT_DEFINE_TEST(q31,df1,,q31_t); +BIQUAD_WITH_POSTSHIFT_DEFINE_TEST(q15,df1,,q15_t); +BIQUAD_WITH_POSTSHIFT_DEFINE_TEST(q31,df1,_fast,q31_t); +BIQUAD_WITH_POSTSHIFT_DEFINE_TEST(q15,df1,_fast,q15_t); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(biquad_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_biquad_cascade_df1_f32_test); + JTEST_TEST_CALL(arm_biquad_cascade_df2T_f32_test); + JTEST_TEST_CALL(arm_biquad_cascade_stereo_df2T_f32_test); + JTEST_TEST_CALL(arm_biquad_cascade_df2T_f64_test); + JTEST_TEST_CALL(arm_biquad_cascade_df1_q31_test); + JTEST_TEST_CALL(arm_biquad_cascade_df1_q15_test); + JTEST_TEST_CALL(arm_biquad_cascade_df1_fast_q31_test); + JTEST_TEST_CALL(arm_biquad_cascade_df1_fast_q15_test); + JTEST_TEST_CALL(arm_biquad_cas_df1_32x64_q31_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/conv_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/conv_tests.c new file mode 100644 index 0000000..dcff668 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/conv_tests.c @@ -0,0 +1,473 @@ +#include "jtest.h" +#include "filtering_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "filtering_templates.h" +#include "type_abbrev.h" + +/*--------------------------------------------------------------------------------*/ +/* Header Stuff */ +/*--------------------------------------------------------------------------------*/ + +#define CONV_MAX_INPUT_ELTS 32 +#define CONV_MAX_OUTPUT_ELTS (CONV_MAX_INPUT_ELTS * 2) + +#define CONV_TEST_VALID_PARTIAL_PARAMS(input_a_len, input_b_len, \ + first_index, num_points) \ + (((((input_a_len) + (input_b_len) - 1)) >= num_points + first_index ) \ + && (num_points > 0)) + +/*--------------------------------------------------------------------------------*/ +/* Input Interfaces */ +/*--------------------------------------------------------------------------------*/ +/* + * General: + * Input interfaces provide inputs to functions inside test templates. They + * ONLY provide the inputs. The output variables should be hard coded. + * + * The input interfaces must have the following format: + * + * ARM_xxx_INPUT_INTERFACE() or + * REF_xxx_INPUT_INTERFACE() + * + * The xxx must be lowercase, and is intended to be the indentifying substring + * in the function's name. Acceptable values are 'sub' or 'add' from the + * functions arm_add_q31. + */ + +#define CONV_arm_conv_INPUT_INTERFACE(input_a, input_a_len, input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, (void*)filtering_output_fut) + +#define CONV_ref_conv_INPUT_INTERFACE(input_a, input_a_len, input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, (void*)filtering_output_ref) + +#define CONV_arm_conv_opt_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_fut, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CONV_ref_conv_opt_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_ref, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CONV_arm_conv_fast_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, (void*)filtering_output_fut) + +#define CONV_ref_conv_fast_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, (void*)filtering_output_ref) + +#define CONV_arm_conv_fast_opt_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_fut, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CONV_ref_conv_fast_opt_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_ref, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CONV_arm_conv_partial_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len, \ + first_index, num_points) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*)filtering_output_fut, first_index, num_points) + +#define CONV_ref_conv_partial_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len, \ + first_index, num_points) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*)filtering_output_ref, first_index, num_points) + +#define CONV_arm_conv_partial_fast_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len, \ + first_index, num_points) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*)filtering_output_fut, first_index, num_points) + +#define CONV_ref_conv_partial_fast_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len, \ + first_index, num_points) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*)filtering_output_ref, first_index, num_points) + +#define CONV_arm_conv_partial_opt_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len, \ + first_index, num_points) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*)filtering_output_fut, first_index, num_points, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CONV_ref_conv_partial_opt_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len, \ + first_index, num_points) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*)filtering_output_ref, first_index, num_points, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CONV_arm_conv_partial_fast_opt_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len, \ + first_index, num_points) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*)filtering_output_fut, first_index, num_points, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CONV_ref_conv_partial_fast_opt_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len, \ + first_index, num_points) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*)filtering_output_ref, first_index, num_points, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +/*--------------------------------------------------------------------------------*/ +/* Convolution Inputs */ +/*--------------------------------------------------------------------------------*/ + +/* The following symbols alias the filtering_q31_inputs array: + * + * - filtering_q15_inputs + * - filtering_q7_inputs + * + * The aliasing conflicts with the instantiation of #ARR_DESC_t structs. + * + * These macro-level aliases allow the #CONV_DEFINE_RAND_INPUT_ARR_DESCS() macro + * to correctly select the filtering_q31_input or filtering_f32_input array, + * within a template, by type_suffix. + * + */ +#define CONV_f32_INPUTS filtering_f32_inputs +#define CONV_q31_INPUTS filtering_q31_inputs +#define CONV_q15_INPUTS filtering_q31_inputs +#define CONV_q7_INPUTS filtering_q31_inputs + +/** + * Defines #ARR_DESC_t objects that wrap existing, type-specific, common + * inputs. + */ +#define CONV_DEFINE_RAND_INPUT_ARR_DESCS(type_suffix) \ + ARR_DESC_DEFINE_USING_ARR( \ + TYPE_FROM_ABBREV(type_suffix), \ + conv_input_rand1_##type_suffix, \ + CONV_##type_suffix##_INPUTS, \ + 0, \ + CONV_MAX_INPUT_ELTS); \ + \ + ARR_DESC_DEFINE_USING_ARR( \ + TYPE_FROM_ABBREV(type_suffix), \ + conv_input_rand2_##type_suffix, \ + CONV_##type_suffix##_INPUTS, \ + 1, \ + CONV_MAX_INPUT_ELTS) /* Note the lacking semicolon */ + +CONV_DEFINE_RAND_INPUT_ARR_DESCS(f32); +CONV_DEFINE_RAND_INPUT_ARR_DESCS(q31); +CONV_DEFINE_RAND_INPUT_ARR_DESCS(q15); +CONV_DEFINE_RAND_INPUT_ARR_DESCS(q7); +ARR_DESC_DEFINE(float32_t, conv_input_zeros, CONV_MAX_INPUT_ELTS, CURLY(0)); + +/** + * Define Input #ARR_DESC_t arrays by type suffix. + * + * Taking inputs in parallel from the 'a' and 'b' arrays yields the following + * test cases (star is convolution): + * + * - zero_array * zero_array + * - zero_array * random_array + * - random_array * zero_array + * - random_array * different_random_arary + */ +#define CONV_DEFINE_ALL_INPUTS(type_suffix) \ + ARR_DESC_DEFINE(ARR_DESC_t *, \ + conv_##type_suffix##_a_inputs, \ + 4, \ + CURLY( \ + &conv_input_zeros, \ + &conv_input_zeros, \ + &conv_input_rand1_##type_suffix, \ + &conv_input_rand1_##type_suffix \ + )); \ + ARR_DESC_DEFINE(ARR_DESC_t *, \ + conv_##type_suffix##_b_inputs, \ + 4, \ + CURLY( \ + &conv_input_zeros, \ + &conv_input_rand1_##type_suffix, \ + &conv_input_zeros, \ + &conv_input_rand2_##type_suffix \ + )) /* Note the lacking semicolon */ + +CONV_DEFINE_ALL_INPUTS(f32); +CONV_DEFINE_ALL_INPUTS(q31); +CONV_DEFINE_ALL_INPUTS(q15); +CONV_DEFINE_ALL_INPUTS(q7); + +/*--------------------------------------------------------------------------------*/ +/* Convolution Lengths */ +/*--------------------------------------------------------------------------------*/ + +/* + * The conv_lens_a and conv_lens_b #ARR_DESC_t objects are accessed in parallel + * to provide convolution-length pairs. Taken in parallel they provide the + * following cases: + * + * - 1 * 1 : Shortest convolution possible. + * - 1 * 2 : Short convolution , one side is degenerate . + * - 17 * 1 : Medium convolution , one side is degenerate . + * - 15 * MAX : Longest convolution , one side is degenerate . + * MAX * MAX : Longest convolution. + */ +ARR_DESC_DEFINE(uint32_t, + conv_lens_a, + 5, + CURLY( + 1, + 1, + 17, + 15, + CONV_MAX_INPUT_ELTS + )); + +ARR_DESC_DEFINE(uint32_t, + conv_lens_b, + 5, + CURLY( + 1, + 2, + 1, + CONV_MAX_INPUT_ELTS, + CONV_MAX_INPUT_ELTS + )); + +/*--------------------------------------------------------------------------------*/ +/* Partial Indexing */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(uint32_t, + first_index_arr_desc, + 4, + CURLY( + 0, + 1, + CONV_MAX_INPUT_ELTS / 2, + CONV_MAX_INPUT_ELTS + )); + +ARR_DESC_DEFINE(uint32_t, + num_points_arr_desc, + 3, + CURLY( + 1, + CONV_MAX_OUTPUT_ELTS / 2, + CONV_MAX_OUTPUT_ELTS + )); + +/*--------------------------------------------------------------------------------*/ +/* Convolution Tests */ +/*--------------------------------------------------------------------------------*/ + +#define CONV_TEST_TEMPLATE(fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + suffix, output_type) \ + JTEST_DEFINE_TEST(fut##_tests, fut) \ + { \ + TEMPLATE_DO_ARR_DESC( \ + input_idx, ARR_DESC_t *, input_ptr, conv_##suffix##_a_inputs \ + , \ + void * input_a_ptr = input_ptr->data_ptr; \ + void * input_b_ptr = ARR_DESC_ELT( \ + ARR_DESC_t *, input_idx, \ + &(conv_##suffix##_b_inputs))->data_ptr; \ + \ + TEMPLATE_DO_ARR_DESC( \ + conv_len_idx, uint32_t, conv_len_a, conv_lens_a \ + , \ + uint32_t conv_len_b = ARR_DESC_ELT( \ + uint32_t, conv_len_idx, &(conv_lens_b)); \ + \ + JTEST_DUMP_STRF("Input A Length: %d\n" \ + "Input B Length: %d\n", \ + (int)conv_len_a, \ + (int)conv_len_b); \ + \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + input_a_ptr, conv_len_a, input_b_ptr, conv_len_b), \ + ref, ref_arg_interface( \ + input_a_ptr, conv_len_a, input_b_ptr, conv_len_b)); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + conv_len_a + conv_len_b - 1, \ + output_type))); \ + \ + return JTEST_TEST_PASSED; \ + } \ + \ + +#define CONV_PARTIAL_TEST_TEMPLATE(fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + suffix, output_type) \ + JTEST_DEFINE_TEST(fut##_tests, fut) \ + { \ + TEMPLATE_DO_ARR_DESC( \ + input_idx, ARR_DESC_t *, input_ptr, conv_##suffix##_a_inputs \ + , \ + void * input_a_ptr = input_ptr->data_ptr; \ + void * input_b_ptr = ARR_DESC_ELT( \ + ARR_DESC_t *, input_idx, \ + &(conv_##suffix##_b_inputs))->data_ptr; \ + TEMPLATE_DO_ARR_DESC( \ + conv_len_idx, uint32_t, conv_len_a, conv_lens_a \ + , \ + uint32_t conv_len_b = ARR_DESC_ELT( \ + uint32_t, conv_len_idx, &(conv_lens_b)); \ + \ + TEMPLATE_DO_ARR_DESC( \ + first_index_idx, uint32_t, first_index, \ + first_index_arr_desc \ + , \ + TEMPLATE_DO_ARR_DESC( \ + num_points_idx, uint32_t, num_points, \ + num_points_arr_desc \ + , \ + if (CONV_TEST_VALID_PARTIAL_PARAMS( \ + conv_len_a, conv_len_b, \ + first_index, num_points)) \ + { \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Input A Length: %d\n" \ + "Input B Length: %d\n" \ + "First Sample Index: %d\n" \ + "Number of Output Points: %d\n", \ + (int)conv_len_a, \ + (int)conv_len_b, \ + (int)first_index, \ + (int)num_points); \ + \ + memset(filtering_output_ref,0, \ + (2*CONV_MAX_INPUT_ELTS)*sizeof(output_type)); \ + memset(filtering_output_fut,0, \ + (2*CONV_MAX_INPUT_ELTS)*sizeof(output_type)); \ + \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + input_a_ptr, conv_len_a, \ + input_b_ptr, conv_len_b, \ + first_index, num_points), \ + ref, ref_arg_interface( \ + input_a_ptr, conv_len_a, \ + input_b_ptr, conv_len_b, \ + first_index, num_points)); \ + \ + FILTERING_SNR_COMPARE_INTERFACE_OFFSET( \ + first_index, \ + num_points, \ + output_type); \ + } else { \ + /* FUT should return ARM_MATH_ARGUMENT_ERROR*/ \ + /* if first_index and num_points don't make */ \ + /* sense*/ \ + \ + arm_status conv_test_retval; \ + TEST_CALL_FUT( \ + conv_test_retval = fut, \ + fut_arg_interface( \ + input_a_ptr, conv_len_a, \ + input_b_ptr, conv_len_b, \ + first_index, num_points)); \ + \ + if (conv_test_retval != ARM_MATH_ARGUMENT_ERROR) { \ + JTEST_DUMP_STR("FUT failed to raise error."); \ + /* return JTEST_TEST_FAILED; */ \ + } \ + })))); \ + \ + return JTEST_TEST_PASSED; \ + } + +#define CONV_DEFINE_TEST(fn_name, suffix, output_type, test_template) \ + test_template( \ + arm_##fn_name##_##suffix, \ + CONV_arm_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + CONV_ref_##fn_name##_INPUT_INTERFACE, \ + suffix, \ + output_type \ + ) /* Note the lacking semicolon*/ + +/* Tests on functions without partial outputs */ +CONV_DEFINE_TEST(conv , f32, float32_t, CONV_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv , q31, q31_t , CONV_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv , q15, q15_t , CONV_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv , q7 , q7_t , CONV_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_opt , q15, q15_t , CONV_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_opt , q7 , q7_t , CONV_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_fast , q31, q31_t , CONV_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_fast , q15, q15_t , CONV_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_fast_opt , q15, q15_t , CONV_TEST_TEMPLATE); + +/* Tests on functions with partial outputs */ +CONV_DEFINE_TEST(conv_partial , f32, float32_t, CONV_PARTIAL_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_partial , q31, q31_t , CONV_PARTIAL_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_partial , q15, q15_t , CONV_PARTIAL_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_partial , q7 , q7_t , CONV_PARTIAL_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_partial_fast , q31, q31_t , CONV_PARTIAL_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_partial_fast , q15, q15_t , CONV_PARTIAL_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_partial_fast_opt , q15, q15_t , CONV_PARTIAL_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_partial_opt , q15, q15_t , CONV_PARTIAL_TEST_TEMPLATE); +CONV_DEFINE_TEST(conv_partial_opt , q7 , q7_t , CONV_PARTIAL_TEST_TEMPLATE); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(conv_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_conv_f32_tests); + JTEST_TEST_CALL(arm_conv_q31_tests); + JTEST_TEST_CALL(arm_conv_q15_tests); + JTEST_TEST_CALL(arm_conv_q7_tests); + + JTEST_TEST_CALL(arm_conv_opt_q15_tests); + JTEST_TEST_CALL(arm_conv_opt_q7_tests); + + JTEST_TEST_CALL(arm_conv_fast_q31_tests); + JTEST_TEST_CALL(arm_conv_fast_q15_tests); + + JTEST_TEST_CALL(arm_conv_fast_opt_q15_tests); + + JTEST_TEST_CALL(arm_conv_partial_f32_tests); + JTEST_TEST_CALL(arm_conv_partial_q31_tests); + JTEST_TEST_CALL(arm_conv_partial_q15_tests); + JTEST_TEST_CALL(arm_conv_partial_q7_tests); + + JTEST_TEST_CALL(arm_conv_partial_fast_q31_tests); + JTEST_TEST_CALL(arm_conv_partial_fast_q15_tests); + + JTEST_TEST_CALL(arm_conv_partial_fast_opt_q15_tests); + + JTEST_TEST_CALL(arm_conv_partial_opt_q15_tests); + JTEST_TEST_CALL(arm_conv_partial_opt_q7_tests); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/correlate_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/correlate_tests.c new file mode 100644 index 0000000..689b075 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/correlate_tests.c @@ -0,0 +1,310 @@ +#include "jtest.h" +#include "filtering_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "filtering_templates.h" +#include "type_abbrev.h" + +/*--------------------------------------------------------------------------------*/ +/* Header Stuff */ +/*--------------------------------------------------------------------------------*/ + +#define CORRELATE_MAX_INPUT_ELTS 32 +#define CORRELATE_MAX_OUTPUT_ELTS (CORRELATE_MAX_INPUT_ELTS * 2) + +/*--------------------------------------------------------------------------------*/ +/* Input Interfaces */ +/*--------------------------------------------------------------------------------*/ +/* + * General: + * Input interfaces provide inputs to functions inside test templates. They + * ONLY provide the inputs. The output variables should be hard coded. + * + * The input interfaces must have the following format: + * + * ARM_xxx_INPUT_INTERFACE() or + * REF_xxx_INPUT_INTERFACE() + * + * The xxx must be lowercase, and is intended to be the indentifying substring + * in the function's name. Acceptable values are 'sub' or 'add' from the + * functions arm_add_q31. + */ + +#define CORRELATE_arm_correlate_INPUT_INTERFACE(input_a, input_a_len, input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, (void*)filtering_output_fut) + +#define CORRELATE_ref_correlate_INPUT_INTERFACE(input_a, input_a_len, input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, (void*)filtering_output_ref) + +#define CORRELATE_arm_correlate_opt_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_fut, \ + (void*) filtering_scratch) + +#define CORRELATE_arm_correlate_opt_q7_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_fut, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CORRELATE_ref_correlate_opt_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_ref, \ + (void*) filtering_scratch) + +#define CORRELATE_ref_correlate_opt_q7_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_ref, \ + (void*) filtering_scratch, \ + (void*) filtering_scratch2) + +#define CORRELATE_arm_correlate_fast_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, (void*)filtering_output_fut) + +#define CORRELATE_ref_correlate_fast_INPUT_INTERFACE(input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, (void*)filtering_output_ref) + +#define CORRELATE_arm_correlate_fast_opt_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_fut, \ + (void*) filtering_scratch) + +#define CORRELATE_ref_correlate_fast_opt_INPUT_INTERFACE( \ + input_a, input_a_len, \ + input_b, input_b_len) \ + PAREN(input_a, input_a_len, input_b, input_b_len, \ + (void*) filtering_output_ref, \ + (void*) filtering_scratch) + +/*--------------------------------------------------------------------------------*/ +/* Convolution Inputs */ +/*--------------------------------------------------------------------------------*/ + +/* The following symbols alias the filtering_q31_inputs array: + * + * - filtering_q15_inputs + * - filtering_q7_inputs + * + * The aliasing conflicts with the instantiation of #ARR_DESC_t structs. + * + * These macro-level aliases allow the #CORRELATE_DEFINE_RAND_INPUT_ARR_DESCS() macro + * to correctly select the filtering_q31_input or filtering_f32_input array, + * within a template, by type_suffix. + * + */ +#define CORRELATE_f32_INPUTS filtering_f32_inputs +#define CORRELATE_q31_INPUTS filtering_q31_inputs +#define CORRELATE_q15_INPUTS filtering_q31_inputs +#define CORRELATE_q7_INPUTS filtering_q31_inputs + +/** + * Defines #ARR_DESC_t objects that wrap existing, type-specific, common + * inputs. + */ +#define CORRELATE_DEFINE_RAND_INPUT_ARR_DESCS(type_suffix) \ + ARR_DESC_DEFINE_USING_ARR( \ + TYPE_FROM_ABBREV(type_suffix), \ + correlate_input_rand1_##type_suffix, \ + CORRELATE_##type_suffix##_INPUTS, \ + 0, \ + CORRELATE_MAX_INPUT_ELTS); \ + \ + ARR_DESC_DEFINE_USING_ARR( \ + TYPE_FROM_ABBREV(type_suffix), \ + correlate_input_rand2_##type_suffix, \ + CORRELATE_##type_suffix##_INPUTS, \ + 1, \ + CORRELATE_MAX_INPUT_ELTS) /* Note the lacking semicolon */ + +CORRELATE_DEFINE_RAND_INPUT_ARR_DESCS(f32); +CORRELATE_DEFINE_RAND_INPUT_ARR_DESCS(q31); +CORRELATE_DEFINE_RAND_INPUT_ARR_DESCS(q15); +CORRELATE_DEFINE_RAND_INPUT_ARR_DESCS(q7); +ARR_DESC_DEFINE(float32_t, correlate_input_zeros, CORRELATE_MAX_INPUT_ELTS, CURLY(0)); + +/** + * Define Input #ARR_DESC_t arrays by type suffix. + * + * Taking inputs in parallel from the 'a' and 'b' arrays yields the following + * test cases (star is correlate): + * + * - zero_array * zero_array + * - zero_array * random_array + * - random_array * zero_array + * - random_array * different_random_arary + */ +#define CORRELATE_DEFINE_ALL_INPUTS(type_suffix) \ + ARR_DESC_DEFINE(ARR_DESC_t *, \ + correlate_##type_suffix##_a_inputs, \ + 4, \ + CURLY( \ + &correlate_input_zeros, \ + &correlate_input_zeros, \ + &correlate_input_rand1_##type_suffix, \ + &correlate_input_rand1_##type_suffix \ + )); \ + ARR_DESC_DEFINE(ARR_DESC_t *, \ + correlate_##type_suffix##_b_inputs, \ + 4, \ + CURLY( \ + &correlate_input_zeros, \ + &correlate_input_rand1_##type_suffix, \ + &correlate_input_zeros, \ + &correlate_input_rand2_##type_suffix \ + )) /* Note the lacking semicolon */ + +CORRELATE_DEFINE_ALL_INPUTS(f32); +CORRELATE_DEFINE_ALL_INPUTS(q31); +CORRELATE_DEFINE_ALL_INPUTS(q15); +CORRELATE_DEFINE_ALL_INPUTS(q7); + +/*--------------------------------------------------------------------------------*/ +/* Convolution Lengths */ +/*--------------------------------------------------------------------------------*/ + +/* + * The correlate_lens_a and correlate_lens_b #ARR_DESC_t objects are accessed in parallel + * to provide correlate-length pairs. Taken in parallel they provide the + * following cases: + * + * - 1 * 1 : Shortest correlate possible. + * - 1 * 2 : Short correlate , one side is degenerate. + * - 17 * 1 : Medium correlate, one side is degenerate. + * - 15 * MAX : Longest correlate. + * MAX * MAX : Longest correlate. + */ +ARR_DESC_DEFINE(uint32_t, + correlate_lens_a, + 5, + CURLY( + 1, + 1, + 17, + 15, + CORRELATE_MAX_INPUT_ELTS + )); + +ARR_DESC_DEFINE(uint32_t, + correlate_lens_b, + 5, + CURLY( + 1, + 2, + 1, + CORRELATE_MAX_INPUT_ELTS, + CORRELATE_MAX_INPUT_ELTS + )); + +/*--------------------------------------------------------------------------------*/ +/* Convolution Tests */ +/*--------------------------------------------------------------------------------*/ + +#define CORRELATE_TEST_TEMPLATE(fut, fut_arg_interface, \ + ref, ref_arg_interface, \ + suffix, output_type) \ + JTEST_DEFINE_TEST(fut##_tests, fut) \ + { \ + TEMPLATE_DO_ARR_DESC( \ + input_idx, ARR_DESC_t *, input_ptr, correlate_##suffix##_a_inputs \ + , \ + void * input_a_ptr = input_ptr->data_ptr; \ + void * input_b_ptr = ARR_DESC_ELT( \ + ARR_DESC_t *, input_idx, \ + &(correlate_##suffix##_b_inputs))->data_ptr; \ + \ + TEMPLATE_DO_ARR_DESC( \ + correlate_len_idx, uint32_t, correlate_len_a, correlate_lens_a \ + , \ + uint32_t correlate_len_b = ARR_DESC_ELT( \ + uint32_t, correlate_len_idx, &(correlate_lens_b)); \ + \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Input A Length: %d\n" \ + "Input B Length: %d\n", \ + (int)correlate_len_a, \ + (int)correlate_len_b); \ + \ + memset(filtering_output_ref,0, \ + (2*CORRELATE_MAX_INPUT_ELTS)*sizeof(output_type)); \ + memset(filtering_output_fut,0, \ + (2*CORRELATE_MAX_INPUT_ELTS)*sizeof(output_type)); \ + \ + TEST_CALL_FUT_AND_REF( \ + fut, fut_arg_interface( \ + input_a_ptr, correlate_len_a, input_b_ptr, correlate_len_b), \ + ref, ref_arg_interface( \ + input_a_ptr, correlate_len_a, input_b_ptr, correlate_len_b)); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + correlate_len_a + correlate_len_b - 2, \ + output_type))); \ + \ + return JTEST_TEST_PASSED; \ + } + +#define CORRELATE_DEFINE_TEST(fn_name, suffix, output_type, test_template) \ + test_template( \ + arm_##fn_name##_##suffix, \ + CORRELATE_arm_##fn_name##_INPUT_INTERFACE, \ + ref_##fn_name##_##suffix, \ + CORRELATE_ref_##fn_name##_INPUT_INTERFACE, \ + suffix, \ + output_type \ + ) /* Note the lacking semicolon*/ + +/* Tests on functions without partial outputs */ +CORRELATE_DEFINE_TEST(correlate , f32, float32_t, CORRELATE_TEST_TEMPLATE); +CORRELATE_DEFINE_TEST(correlate , q31, q31_t , CORRELATE_TEST_TEMPLATE); +CORRELATE_DEFINE_TEST(correlate , q15, q15_t , CORRELATE_TEST_TEMPLATE); +CORRELATE_DEFINE_TEST(correlate , q7 , q7_t , CORRELATE_TEST_TEMPLATE); +CORRELATE_DEFINE_TEST(correlate_opt , q15, q15_t , CORRELATE_TEST_TEMPLATE); + +CORRELATE_TEST_TEMPLATE( + arm_correlate_opt_q7, + CORRELATE_arm_correlate_opt_q7_INPUT_INTERFACE, + ref_correlate_opt_q7, + CORRELATE_ref_correlate_opt_q7_INPUT_INTERFACE, + q7, + q7_t + ); + +CORRELATE_DEFINE_TEST(correlate_fast , q31, q31_t , CORRELATE_TEST_TEMPLATE); +CORRELATE_DEFINE_TEST(correlate_fast , q15, q15_t , CORRELATE_TEST_TEMPLATE); +CORRELATE_DEFINE_TEST(correlate_fast_opt , q15, q15_t , CORRELATE_TEST_TEMPLATE); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(correlate_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_correlate_f32_tests); + JTEST_TEST_CALL(arm_correlate_q31_tests); + JTEST_TEST_CALL(arm_correlate_q15_tests); + JTEST_TEST_CALL(arm_correlate_q7_tests); + + JTEST_TEST_CALL(arm_correlate_opt_q15_tests); + JTEST_TEST_CALL(arm_correlate_opt_q7_tests); + + JTEST_TEST_CALL(arm_correlate_fast_q31_tests); + JTEST_TEST_CALL(arm_correlate_fast_q15_tests); + + JTEST_TEST_CALL(arm_correlate_fast_opt_q15_tests); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/filtering_test_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/filtering_test_common_data.c new file mode 100644 index 0000000..0bea4de --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/filtering_test_common_data.c @@ -0,0 +1,757 @@ +#include "filtering_test_data.h" + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + +//must be max(LMS_MAX_BLOCKSIZE*2, FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_L) +float32_t filtering_output_fut[LMS_MAX_BLOCKSIZE*2] = {0}; +float32_t filtering_output_ref[LMS_MAX_BLOCKSIZE*2] = {0}; +float32_t filtering_output_f32_fut[LMS_MAX_BLOCKSIZE*2] = {0}; +float32_t filtering_output_f32_ref[LMS_MAX_BLOCKSIZE*2] = {0}; +float32_t filtering_input_lms[LMS_MAX_BLOCKSIZE*2] = {0}; +__ALIGNED(8) float32_t filtering_pState[LMS_MAX_BLOCKSIZE + FILTERING_MAX_NUMTAPS] = {0}; +float32_t filtering_scratch[FILTERING_MAX_BLOCKSIZE * 3] = {0}; +float32_t filtering_scratch2[FILTERING_MAX_BLOCKSIZE * 3] = {0}; +float32_t filtering_coeffs_lms[FILTERING_MAX_NUMTAPS]; + +const q31_t filtering_q31_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS] = +{ + 0xC14A5524, 0xCCABDA17, 0xAD6F5B56, 0xFDAFCE3B, 0xA9B226EB, + 0x41F6F6A, 0xA5CE38BF, 0x3A978AFA, 0xBA44B82A, 0x855C0F8, + 0x3D060524, 0x93D5E570, 0x97D7791D, 0xFFE0C38C, 0x26749841, + 0xC0A6EE54, 0x218EC386, 0x39FF3726, 0x8DC1F7CA, 0x702F2CF5, + 0xC1142FF1, 0xEC1476AB, 0x15F640DD, 0xE62CCE49, 0x3805DE7E, + 0xF70871FE, 0xCF8BD360, 0x8D19A8A0, 0xD764F821, 0xA58558CF, + 0x8C0CE04D, 0x50A46C19, 0x66D2370D, 0x50FA359A, 0xB646AE24, + 0x6CE00F5C, 0xE6D48948, 0xB55BD831, 0x3B72950A, 0x9EB69530, + 0x73394127, 0x773FA6F4, 0x9805A980, 0x838DE587, 0x9CF597F4, + 0xA2AD1691, 0xFA81A473, 0x7CDC7D7F, 0x4A5190D0, 0xED895BB9, + 0x8FD60F35, 0x1A21D530, 0xA0EB6DDA, 0xBDE6A516, 0x2501A3E1, + 0x5ED893C8, 0xE1E175B1, 0xACBBB2F3, 0xED350907, 0xDB140D7E, + 0xEEAE272D, 0xBE229841, 0xC18BFB88, 0xA6BB9B80, 0xBCF090E4, + 0x24DB166C, 0xF9AB7E42, 0x62DF28D1, 0xC7004665, 0xE3F56FC6, + 0x419E0C75, 0x46BE9F38, 0x2432B9B2, 0x758D83E0, 0xDCE12926, + 0x3F57CB74, 0x1F4458E2, 0xF1DD639, 0x83A1FB49, 0x173AFC76, + 0x86EF7531, 0x48D32F34, 0x7D3E3063, 0x8F2FB549, 0x5C314C9, + 0x18CBEB6D, 0xA6F8B697, 0x447B9E9C, 0x2E32BA33, 0xD074D715, + 0x81ACD746, 0xE55A4E04, 0x4891860F, 0x1DA3EB4F, 0xE0E6A27F, + 0x20BFDEB4, 0xD0B3A25B, 0x40C10544, 0xC15656C, 0x15405EAE, + 0x9858E3E1, 0xA36A9C4E, 0x88BD21F9, 0xAACF7A68, 0x773665E5, + 0xCEDFDF66, 0x617A9610, 0x524FC968, 0xC2D086CD, 0x5F008079, + 0x24DCA447, 0x6A4F5599, 0xB706CD4A, 0x1DE70608, 0xA33A2EE5, + 0x137E488E, 0x98061B7B, 0x4079D69D, 0xA4A897D5, 0xC4CEC8F5, + 0xD75F7883, 0x22406802, 0xF1AD70BB, 0x9D4ADD79, 0xBCBC7CE4, + 0xB358C0D8, 0x85792E47, 0xA7ADAC05, 0x3D19EEAB, 0x331AC0AF, + 0x33035831, 0x13D93987, 0xFC542094, 0x845F317E, 0xDDC4BF8B, + 0x1379E50C, 0x5C20193F, 0xFDD58298, 0x9D482B82, 0x4A6BE062, + 0xDC8A757B, 0x272917C1, 0x90E1EFBC, 0x355AD882, 0xE6F8EA35, + 0x604555A1, 0x7DFFFBB, 0xF58AE216, 0x9A11B463, 0xD3541BAD, + 0xA1576756, 0x483BED8D, 0x1F05AFCC, 0xCEA63DFB, 0x55B84677, + 0xFB2E04F2, 0x787AF96C, 0x84A12CD3, 0x460A9BD, 0x9DB22DD8, + 0x1A8C7F28, 0x861E452E, 0x932D3F78, 0x7652D852, 0x73357BBA, + 0xEBBB0A58, 0x62536AFA, 0x3F6B65EF, 0x6DC57B58, 0x9EB798CE, + 0xE6B0A740, 0xDFF68B47, 0x3247FB8F, 0xFFF3D302, 0xA9FD3E40, + 0x475A43D1, 0x6FF9528A, 0x2018A09D, 0x47E0F9C9, 0x4CF5F6D3, + 0x2807CE34, 0xDD6FD8ED, 0x234045D1, 0x51CEB5F9, 0x25297896, + 0x6443A0FE, 0x8F4449A9, 0xD4C3E1C6, 0xF01D52F1, 0x4E09C820, + 0xF18F0810, 0xE1548689, 0xF9DE5A1F, 0x5286DC23, 0x48AC3A4B, + 0xEA0C1BE0, 0xA1B785DB, 0x7086465D, 0x1CC10929, 0x1E1D716E, + 0xED231D4C, 0x2049D108, 0xB8FF9971, 0x949CF8D4, 0x441F1E8B, + 0xC3D95372, 0x69C324B4, 0xA10BFDC9, 0xC781DE78, 0x82476137, + 0xE163DDF, 0x390DEEC2, 0xAF68CE5B, 0x8E680ABD, 0x8223A615, + 0x92593380, 0x7B1465FE, 0x865AE957, 0x930F53EB, 0xED772EF7, + 0x10E916B6, 0xE3BCFA68, 0x2ACB80BB, 0xE51C5590, 0x994714B5, + 0xF30984EE, 0x59BBE1B4, 0xB4867DBC, 0xB91C706C, 0xBC16C218, + 0xA8931CD0, 0x129A66AB, 0x13171F4D, 0x62882872, 0x4B167FD4, + 0xE6902F4C, 0xFA794932, 0xD4B152C, 0xB0856EA9, 0x39466D55, + 0x3669E451, 0x8F5B9E8C, 0x877A3C6A, 0x51B956B4, 0x367EAD2A, + 0x9D2C662A, 0x78FB6880, 0x4E6D40B6, 0x4070EFDC, 0x4DF9679C, + 0x20306EDB, 0xE381AAE7, 0xA55DA748, 0x9B8B617B, 0x3E036FAD, + 0x84E4C4A7, 0xD5A3F517, 0x669BA988, 0x98FDDE8C, 0x67BD85CE, + 0x34BBB46C, 0x76994800, 0x85B9D8B6, 0x6DFA2FEF, 0x205DB5C, + 0x9F843C4C, 0x72721B52, 0x73EF6B86, 0x5FB98B61, 0xC323DDAC, + 0x31D424B4, 0xF68C0D7E, 0x162FAF9D, 0x7B2A7A99, 0xF9392693, + 0xC42D12C0, 0x8692A73E, 0xD9A1EE80, 0xDD956856, 0x44E7BDAC, + 0x8D874532, 0x5F5C9DD0, 0x5D167858, 0x8559FEA2, 0x9D821476, + 0xD9654ED2, 0x594C0DC7, 0x1A87B506, 0x3F693200, 0x7A651AB5, + 0xA0CCBC8A, 0x9F9E662C, 0x78EF631, 0x2A09DA0, 0xB088C72F, + 0x92EE0D42, 0x360DCD5F, 0xF333FE48, 0x8D63CC06, 0x233A8ACB, + 0x706651ED, 0x7AA5C079, 0x262239D1, 0x3EBBEBB6, 0xA25A4F3D, + 0x32581A06, 0x6E6FD780, 0x5773F7C7, 0x75ED1DDC, 0x90DF2D15, + 0xBC79A9BC, 0xB7175917, 0x354E381C, 0x762AADD7, 0xF643DAC1, + 0xF3BBF49E, 0xD2FECE7E, 0x6C8140F4, 0xD7694875, 0x92D30822, + 0xC742A7CF, 0xB792ED98, 0x121CFE24, 0xA04E1EE7, 0x58CE268, + 0x215A080, 0x316CB323, 0xFAB14A31, 0xE1C13C03, 0xFD8EF4F1, + 0xF3F446D0, 0x6C6CEA0A, 0xBBFDF9FB, 0x67242969, 0xBE55A4EB, + 0x8FF5534, 0x52F0DF1C, 0x9710ADE3, 0xD40F4A21, 0x7984E8E7, + 0x419545EB, 0x993F7880, 0xAB246B20, 0x408AABC4, 0xCBF6EA49, + 0xC0894C55, 0x4CAA6398, 0xA47856E9, 0xAF2AE47D, 0x22F55D33, + 0xF0D37915, 0xD0634C72, 0xD983671, 0x2BCC5AF8, 0x9A77D48, + 0xC11B5CFA, 0xF107CD7E, 0x3A6B3593, 0xE1425F05, 0x6271812A, + 0x5B838310, 0xBD8418CA, 0x10A58792, 0x239F7137, 0xA13D5071, + 0x7F9930D4, 0xA462664F, 0x54180F8E, 0x291585BA, 0xE586B87A, + 0x144B2C12, 0x98E425C7, 0xBAA4B373, 0x18F0D03C, 0x99462AC0, + 0xD8B4D2EF, 0x72473895, 0xA6BF5435, 0xEDAD53B, 0xE0912FA6, + 0x5C33F331, 0x3D93CD7, 0x4D03D752, 0x20699929, 0xB89962F9, + 0x36E781E9, 0xF58B642C, 0x5FCA69E3, 0x5960A7F4, 0xAD5AAFD0, + 0xDF18324A, 0x3DB1E5AA, 0x76BA3876, 0x1BC29AF6, 0xBCC18841, + 0x73A60174, 0x625BFF58, 0x67C57724, 0x4458E53C, 0xE157B095, + 0x2B370837, 0x83DF6CE3, 0xDD08EEFA, 0x3F52A7C2, 0x191B4785, + 0x60843D82, 0xB0DE11F1, 0x105EA26C, 0x6E1C7AA2, 0x47AADD14, + 0xB6676D03, 0x3B8D4DF6, 0x737A694, 0x409521DC, 0x744206A, + 0xC722023F, 0x2BE4EAD5, 0x63E11D76, 0xCA4A09AB, 0x5CF2D2B9, + 0x31586916, 0xCDFD7D84, 0xB203F634, 0xAD7329D4, 0xC524582F, + 0x2E53E6C1, 0xBB0E019B, 0xB8538C6A, 0x6A2542D, 0x8A6A00E5, + 0x119725CC, 0x5406D347, 0x1B6FFAF1, 0xECCF71F1, 0x981117F2, + 0x7167CA76, 0x74F4B880, 0x77A55F47, 0x59EADB62, 0x4A331D95, + 0xBCBBA76F, 0xA45C4D50, 0xC718D5, 0x87CE05D1, 0x60D47AD5, + 0xA5CA9C40, 0xB0061766, 0xE69B39DF, 0xBD5F1320, 0x9930EAD3, + 0xA8B38325, 0x8DD090F, 0x6A6EEF37, 0x2DF16F66, 0xAB514C7E, + 0x31109C58, 0xFD48C7FC, 0x515341CA, 0x77AB8EA6, 0x41328DAF, + 0xBAF8D31E, 0xA4B31611, 0xED37F331, 0x7A832A22, 0xA22591C7, + 0x722D1F89, 0x3B19CF18, 0x261B8A4D, 0xC3F6F6DB, 0xCF8CED61, + 0x990FA250, 0xA02E72A9, 0x560DCEA2, 0xB08E67B4, 0x3674E663, + 0x97CC3852, 0xA7EB2EAC, 0xFFDE0AA8, 0xA64719A, 0x23269EDD, + 0x3C0B339E, 0x86284D40, 0x48D82ECB, 0xA4D4CCF8, 0x43631B91, + 0x4BF0C248, 0xB6497B9B, 0x6827BC58, 0xE30B7AF9, 0xA0CCBF26, + 0x6C3B7B71, 0xD744B3ED, 0xFA25D2F6, 0x4CDE642D, 0xD65B8142, + 0xA6F9207F, 0xE7A207BE, 0xDB506684, 0x44DA4780, 0x9175EA0C, + 0x156104AF, 0x4155E1B0, 0x6E3A6886, 0x9DBA1EA2, 0x5423D9C8, + 0xCC024E22, 0x758F852A, 0x1DD6395, 0x2D19CBAD, 0xE164F5A1, + 0xC2084602, 0x89C274AD, 0x13CB5562, 0xD7FE2D5B, 0xE07A4EE5, + 0x1672BA91, 0x4F624CCF, 0x2E5EA4A3, 0x28FEEFAF, 0xBDDA6EF4, + 0x32AFD40C, 0x99A5FB3B, 0xDD1D73A3, 0xA342CB3E, 0xA78445F5, + 0x53979C3B, 0x427D7943, 0x5221B58C, 0xA6CE9A5E, 0xFB50ECA4, + 0xBB86E36E, 0x60839F6D, 0xC5E1C2F3, 0xA1B7FB04, 0xFBB65E0C, + 0x78B80F5E, 0xFD8D972B, 0x3BF3BA90, 0x2D572D9, 0x2B5BC920, + 0xB6A0DE01, 0xD274D306, 0xC7C6C855, 0x9CAA669B, 0xB04AA641, + 0x4D6B1760, 0x3E17ED79, 0xD23241B0, 0xA4A6F957, 0xCBDE76AF, + 0x4E5F9493, 0x4C215DA5, 0x33A052B, 0x1A4D80C2, 0x40AEEBCA, + 0x390D106B, 0xE9E8E018, 0x5AF3D6CF, 0xE35E1D4, 0xC4FB1C6, + 0x14B6299B, 0x8D2E25F0, 0xCCBF932A, 0xC5AC18B6, 0x2227567D, + 0x86B5CE2F, 0x26344534, 0x22C515EC, 0x2442B70D, 0xEC3721C6, + 0x34EF687D, 0x9C06323A, 0xEAF3EA60, 0x60396F52, 0xEAE78AA1, + 0xC9D06CBC, 0x6F95F6C8, 0x584CC258, 0xBA9A27BB, 0x66DF8D47, + 0x9D4804EA, 0x57DD9E67, 0xF89C7895, 0xF5336111, 0x25C122C8, + 0x62742114, 0xCFBF6D26, 0xBF9F6482, 0xE6F02CD9, 0x11083202, + 0xC99E2618, 0x7EBC9351, 0x440112F1, 0xC9DFFBC1, 0x3BF4DC25, + 0xB1BA7FA0, 0x61AF9AED, 0x6B1F7D29, 0xAD865294, 0xE3E01129, + 0x7E9E77A5, 0x100435D7, 0x9FE3A71, 0x88597C81, 0x722849FA, + 0x31C5A0AF, 0xFBA178DC, 0x7F102D31, 0x5CA07864, 0x950E6F98, + 0x82C34882, 0x5D041F11, 0x8C613C57, 0xD398CFD1, 0x426F38AD, + 0x5599AB1D, 0xFAFA078D, 0xAB25B413, 0xD94B32CF, 0xB288FE38, + 0x2893BB46, 0x9A0B4168, 0xA91BCA94, 0x653A5E8D, 0x2174EBBE, + 0xDEFE6415, 0x30DA429C, 0xD0C5E40C, 0xB4719AA4, 0xD29CE7A6, + 0x905957CD, 0xCD287499, 0x83CA0AA7, 0xA8385832, 0x25A0CA02, + 0xC20D47A4, 0xB562F556, 0x4BC19E4C, 0xD9E215C7, 0x27E838B4, + 0xC58612F4, 0xA2827F6F, 0xC49DCDBA, 0x679B7362, 0x4E495845, + 0xCFD2F0D1, 0x395E76A0, 0x375A655E, 0x92E2058F, 0x73F9F0CA, + 0x61EFF3B3, 0x51FFD362, 0xE7410345, 0x7FDA8B3B, 0xA219E2E8, + 0x17ABE543, 0x26557412, 0x4B30084D, 0xA68E191D, 0xFE0D93DF, + 0x73EF127D, 0x4DECDDB1, 0x77FAF45F, 0xD6002898, 0x92DD0A40, + 0x157F6DDF, 0xC2A55F8E, 0x4359F924, 0xFB630C3F, 0x338B6B58, + 0xB2945F75, 0x4FA23A0E, 0x836EB8C0, 0xB3B18FD, 0x86114337, + 0x24668ACB, 0x99BB82F0, 0x924C8A47, 0xBA959701, 0x81155ABF, + 0x8C612D71, 0x36074CA7, 0xD1668C41, 0xE35F58C7, 0x7FC2802D, + 0x8E6A7CF3, 0x65B07D07, 0x815F6A6B, 0x791BF0DD, 0x6E47D719, + 0xC24394C7, 0xE84A6EB, 0xF194AFEE, 0x464A2F52, 0x677579FD, + 0xEBA775AE, 0x1F6EEFF, 0x9A795237, 0x78D9D45F, 0x9D0B344D, + 0xBBD34AB7, 0x2F85B12A, 0x16C5C2AD, 0x3990985D, 0x88DF3351, + 0x82811AA5, 0x6D351F41, 0x4066A69D, 0x86B660BF, 0x6EDB4768, + 0xDDD78CF0, 0xB5D74F6E, 0xE89E220C, 0x91439687, 0x947CC9C9, + 0x3857E2BD, 0x302F8AE4, 0x1DABE7F8, 0x4832D6C9, 0x37D58FCB, + 0x4EA8A711, 0xCD7BAC98, 0x19DBF8BC, 0xD8DE8DC2, 0xEAFF7E7B, + 0xB7629C93, 0x792C6E19, 0xF7009192, 0xFF88439D, 0x2E196A66, + 0xEC71B78C, 0xEAF4BB3A, 0x7C16225E, 0x668F337, 0xCBEE1608, + 0x6D5B5552, 0x345DC590, 0x681209CC, 0x7B24A819, 0xD08A1416, + 0x99888FE3, 0x9FC7288A, 0x24BD8502, 0xEA1D9678, 0x20EECA0, + 0x59BEA057, 0x5ADE91EB, 0xDEA8E49D, 0xFA200E6F, 0x9149C81D, + 0xF2281E93, 0x8A5B0451, 0x67312D58, 0xE3B849F1, 0xD2217960, + 0x7CDF59F3, 0x33C775C0, 0x9EBA8799, 0x7DF9506, 0xB4E96110, + 0xB8FCF3E3, 0xDEA059B2, 0x8229B6EA, 0x316486F6, 0x43919185, + 0x6C0D90F3, 0x1C6F3DF8, 0x38DB92A9, 0x5CD41244, 0x2C9F0A7B, + 0xDF4A315F, 0xF7CE9C66, 0x4C800860, 0x318D53E0, 0xF105C20D, + 0xD753E1F2, 0x750810BA, 0xA17ECCA5, 0x2010140, 0x4D884763, + 0xC2BB0DA7, 0xB2D5BA74, 0x141CECD4, 0x887FDFC3, 0xC64B53, + 0x2D2A85F6, 0x15532B45, 0x5D5CBCE1, 0xBEB9A16A, 0xA214611B, + 0x9FC5AC5F, 0x11AE5DD7, 0xA0B9A5A9, 0xFC648AF4, 0x740009AC, + 0xED0E0321, 0xB8E6A61, 0x8910C544, 0xC74F26C8, 0x9525CCF3, + 0xB41AEB59, 0xE61984CE, 0x598B2197, 0xA412E59D, 0xE1976DD4, + 0xB29BBE16, 0x88FD9FB0, 0xB04006F3, 0xB45E309, 0xD5CC15F1, + 0xD9DAF630, 0xDC809335, 0x803ED52, 0xB537F5A5, 0xA994F6EB, + 0xF5288568, 0xF66FD264, 0x2EA2B3A6, 0x647619F3, 0xFFB38C7A, + 0x1BC03B9, 0xB6BC3061, 0xBF30596E, 0xBE2AD27B, 0x8AC04220, + 0x641979A3, 0x9ECCBB89, 0xA144FBC1, 0x4E8FAE26, 0x8C5A9D90, + 0x299ED467, 0xD7C9C7E3, 0x1D4865ED, 0x76F31C3D, 0xCEE81CDF, + 0xB479195E, 0x6FFB3AE1, 0xDC8A398, 0x300F7364, 0xC7940AFA, + 0x3B85BE3E, 0xD98CC40D, 0xA24A3D89, 0x3A674204, 0x22888A38, + 0x2E77F2D, 0xA2841C9C, 0xCF0689C3, 0x9FE98922, 0x89335017, + 0x2D6B69A7, 0xFEDB63F9, 0x899AF4EF, 0x9F9F9B40, 0xA4BE97E8, + 0xA51DAF7A, 0x16AC50D3, 0xA8D7ED6, 0xED193443, 0x7615EF1B, + 0xB0DF6A4E, 0x64FFE794, 0xE3DB2C9A, 0x7435B022, 0x556E825C, + 0x23802AF9, 0xC25098A4, 0xE75A18BB, 0x70B2A7B9, 0x7FB81BF, + 0x63EF910, 0x6C669591, 0x6574DD2B, 0xCF6E379D, 0xD2B3AFAC, + 0x1E6A1101, 0x1DE22385, 0x2338191F, 0xC69704B6, 0xCBABC599, + 0x54EB4809, 0x7839BE6D, 0xD50017DD, 0x39B1A0E1, 0x288D52D3, + 0x2D52668C, 0x20D22A68, 0x4E1207D1, 0x3FCC0EFE, 0x47F3FE64, + 0x25177A90, 0xB4BFDD4D, 0xDA8DBDCE, 0x6F7275A8, 0x6BEAA655, + 0xAA1810FC, 0xE4DB593A, 0x8A4D4BC0, 0x2C402E93, 0xF1C0F7F9, + 0x6F0CC577, 0x70412414, 0x752F9DC1, 0xD82E38EA, 0xAC455F7B, + 0x4DCD4EDB, 0x92BC2696, 0xFB03F135, 0x4FCA1F8C, 0xBD5E75F6, + 0x502F41B0, 0x3616D3F1, 0x2E5B8E31, 0x2026EB19, 0x57E783D7, + 0x467BBE00, 0x4703ABA3, 0x1F776B9C, 0xE2570A84, 0xFEC7DB48, + 0x1BD5012, 0xFD0A2D5D, 0x7FCC29F2, 0x291304B6, 0x99D5D8ED, + 0xC7551C8, 0xFD12F38F, 0xBADE8892, 0xDF749997, 0xA5DAE2F, + 0x2B9FA269, 0x5C13CFED, 0x15E9A399, 0x54437F4E, 0xA72DB2AB, + 0x56186AA1, 0xFE4DB55C, 0xA34D7836, 0x2A879760, 0xC63FA94, + 0xAC18B207, 0x5FC78B3, 0x7F10621E, 0xA769E6B2, 0xEC9F4A11, + 0xCE3F982C, 0x62BA2EF5, 0xA5F239CD, 0x73D63FED, 0xE36E9F5E, + 0x8AC1DA0E, 0x3F3DB3EB, 0x738326EA, 0x35C366B1, 0xCD476E86, + 0x82F6B208, 0xF11A9FC1, 0x426AC396, 0x7E4D1B93, 0x75E4EDB7, + 0xAF3C44A7, 0x51A5EF5C, 0xFAD2463D, 0x8A5639CA, 0xC995AC78, + 0xCC4BE4F6, 0x3AFE7F8D, 0x66993D04, 0x4386FF37, 0xCBC1C6C2, + 0x55A8F5EC, 0xE81A9A75, 0x30A67E1B, 0x4A4A7D0C, 0x20F7F993, + 0x1891805, 0x738976AD, 0xD426E7D6, 0x3C5CEEBF, 0x4499187F, + 0xABF17C97, 0x447C317F, 0x68D8419C, 0x7AAB6456, 0x421BCF29, + 0xF6740F9C, 0x8916BB8D, 0x3D72AAB, 0x9AD54DD7, 0x7549C6EE, + 0x7317342B, 0xA18546D4, 0x1056BDA7, 0x54BBCCCE, 0x8CE63E46, + 0x5D146234, 0x33BE6C63, 0xB250C4E5, 0x89D72335, 0x87C36BA, + 0xB65530CC, 0x2DFAC48C, 0x1663D16F, 0x59B80AA, 0x950274EA, + 0x92532D4A, 0x3CEF802D, 0x492FBDA5, 0xA63A2574, 0xEF8005C2, + 0x94A18651, 0xAF627ABA, 0x6829B238, 0xA698F646, 0xD2598516, + 0x10144D36, 0xD9B1D1B9, 0xAB2ACF05, 0x5395B699, 0xA7851C75, + 0x1806C6F3, 0xAE970306, 0x3284B145, 0x98F4FE8F, 0xECDD35CC, + 0xDDC1EE0E, 0xC4848865, 0x925826BD, 0x4078BE39, 0x68A8561A, + 0x323045DC, 0xA933B37F, 0xBA2AEE2E, 0x4F24F65D, 0x349EE246, + 0xF97B9D0E, 0x46DC5759, 0x4529F425, 0x80D17B42, 0x8E16F709, + 0x1B42206A, 0x4934A526, 0x391BB6DE, 0xB52EF45C, 0x26C30290, + 0xCBA23CAA, 0xA501A8C3, 0xD922C4F8, 0xE8824E53, 0x6F4255DC, + 0x5960B544, 0x58BC69D6, 0xCA936323, 0xFDDF053C, 0xC2E002D6, + 0x7D750755, 0x8A3F9CD1, 0x35F8F6F8, 0xFB7BD154, 0x65CFF94F, + 0x390A58DD, 0xD97C4093, 0x501CA2A3, 0x8EA5DEBC, 0xCA93461F, + 0xE02D984C, 0x126F8517, 0x39FDD887, 0x46241AE9, 0x777E854D, + 0xE2B36349, 0x58E3FA9F, 0x971DEF1E, 0x8E156228, 0xC0E14E9, + 0xA9A01BE6, 0xB318C990, 0x971680D6, 0xA1F359CE, 0x487E23F4, + 0x7DE465B0, 0x4E4C905E, 0x2A652959, 0x116FF167, 0x5C74AAB9, + 0x467BBE00, 0x4703ABA3, 0x1F776B9C, 0xE2570A84, 0xFEC7DB48, + 0x1BD5012, 0xFD0A2D5D, 0x7FCC29F2, 0x291304B6, 0x99D5D8ED, + 0xC7551C8, 0xFD12F38F, 0xBADE8892, 0xDF749997, 0xA5DAE2F, + 0x2B9FA269, 0x5C13CFED, 0x15E9A399, 0x54437F4E, 0xA72DB2AB, + 0x56186AA1, 0xFE4DB55C, 0xA34D7836, 0x2A879760, 0xC63FA94, + 0xAC18B207, 0x5FC78B3, 0x7F10621E, 0xA769E6B2, 0xEC9F4A11, + 0xCE3F982C, 0x62BA2EF5, 0xA5F239CD, 0x4FEFC920, 0x28DF4EB8, + 0x29EBF45A, 0x1E350CF6 + }; + +/* The source data is random across the q31_t range. Accessing it by word should + remain random. */ +const q15_t * filtering_q15_inputs = (q15_t *) filtering_q31_inputs; +const q7_t * filtering_q7_inputs = (q7_t *) filtering_q31_inputs; + +const float32_t filtering_f32_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS] = +{ + 43.0264275639 , -17.0525215570 , -94.8488973910 , -8.1924989580 , 7.2830326091 , 66.8368719314 , 33.9778190671 , 117.8652289772 , + -129.6077797465, -14.6420815368 , 18.0239223278 , 20.6760530292 , 55.0375037651 , 1.8674609862 , -85.6534302408 , -33.5750364909 , + 29.2110949614 , 110.4727049460 , -94.1914619387 , -1.4084169343 , 83.5181653041 , 47.3073514127 , -13.3420621181 , 30.3389699104 , + 12.1188124277 , 100.9730921941 , -114.0146362390, -77.5823200409 , 37.2019034618 , 40.0026301128 , -58.3387276630 , -34.9472398600 , + -5.1169678311 , -87.7660091118 , -150.5888601131, 56.0349370503 , 50.2168884079 , -74.2313236767 , 22.3648603560 , -6.8676387051 , + 74.8957303680 , -90.1292012823 , -55.1436241586 , -66.6732976100 , -6.7918147615 , 7.7612697081 , 35.7892605979 , -20.0470508830 , + 41.8369017546 , -143.7378056984, -41.9127158600 , -108.3531841158, -57.1917422289 , -124.2808828105, 38.9316388820 , -77.9212517405 , + 37.1990818377 , -28.9545952748 , -155.6371057564, 45.8088886393 , 36.2537018275 , -6.5727656016 , -104.2070491921, 45.5583813729 , + -19.7674717059 , -80.4802190947 , -1.4444563441 , -42.2142256438 , 36.6546339194 , -57.0866498590 , 44.4677067511 , 65.7285753407 , + -103.8158864647, 25.4348723711 , -153.5419639389, 39.3608409474 , 49.1658103436 , 79.5570602275 , 75.2944095996 , 58.9394700746 , + -53.1018534392 , 33.4172444014 , 35.6224682287 , -64.4353396418 , -125.8464291251, -47.6072111617 , -26.2177687594 , -12.0061322096 , + -17.7887967585 , -28.2926175090 , -62.0691715749 , 40.5098573604 , -191.1123732593, 119.6750713043 , 19.6182375803 , -26.7615252921 , + 2.2957847015 , -108.3436451287, -50.5906164995 , -5.6360985100 , -11.6772204201 , -84.2765293757 , -60.9317810068 , 82.0446350218 , + -70.2048296348 , 72.8738253222 , 60.2450218115 , 114.2741231228 , 46.8180775285 , 6.9915412654 , -8.9909197429 , -78.9165936808 , + 66.4731535459 , -68.4235455651 , -79.8254597080 , -10.6308477115 , -62.6161569330 , -55.7744410292 , -11.8408366528 , 98.1034940997 , + 35.8213741877 , -54.4694482732 , 86.9631830044 , -53.0343838122 , -47.4898642865 , -47.2010929590 , -31.3312639685 , -23.0908245172 , + 12.0258009869 , -5.1098204703 , -9.8420230737 , -107.3328761158, 44.6810431959 , -17.9083820345 , -60.9753512872 , -7.5915088994 , + 17.2250813329 , 57.9176125648 , 124.3004161362 , -63.1950908493 , 120.5788885640 , -44.1734238117 , -91.7408095116 , -43.5696066595 , + -49.9560710099 , -167.8513443296, -70.9437505499 , -46.4109705355 , -64.2264526456 , -13.9995803916 , -100.9548186356, 9.9101010575 , + -50.0615130815 , -55.7590145012 , -60.3195153388 , 61.7913378549 , -102.0850899209, 53.2360193126 , -25.8997883369 , 75.1445512333 , + -113.8148602310, 17.8027281119 , -19.5006822722 , -44.2169628471 , 107.5017084384 , -113.7909124666, -43.9735396033 , 7.6880981388 , + 46.7384653508 , 9.9047443751 , 81.8646964362 , 132.3812863877 , -95.6959050236 , -68.5015813484 , 65.8586404494 , 18.5039353889 , + -30.1786166621 , -90.3098515667 , -22.9356228552 , -20.5778272423 , -2.2127786675 , -35.4418447703 , -51.8722915974 , -107.9024439078, + -51.5940748232 , -51.7463262677 , 74.2795485984 , 94.2205022462 , 9.7016384049 , -47.3556083155 , -36.7822314478 , -151.6455525363, + -15.7183814485 , 78.2063383182 , 0.1516414969 , 37.9304181609 , 20.6185902740 , -22.2164106778 , 6.1160554677 , 2.4061326953 , + -111.6681824598, -60.0858917090 , 75.1698614693 , -76.5787410444 , 28.3391655715 , -2.4946186443 , -68.0378899682 , 104.0893199171 , + -51.8319647254 , 38.8521710524 , 75.9114239564 , 73.9206172905 , -103.2533029987, 6.9002718274 , -36.6346436319 , -25.1990926265 , + 1.5852145953 , -50.6438436795 , 21.5018844428 , -151.9305562846, -51.7326681814 , 21.4475994143 , 42.2564011921 , -74.0520586926 , + 49.7370635809 , -13.2957534126 , 36.6746826778 , -31.7005492589 , 148.4894964268 , 79.7890632353 , 16.8856024809 , 16.1690460177 , + 39.2665169484 , 117.2461167794 , -37.4827984831 , -47.8387803604 , -95.7025286193 , 34.3058214285 , -124.9536456028, 56.1640195764 , + 94.3636873606 , 35.3992852810 , -38.3920852159 , -100.5738062016, -29.7837022314 , 42.9133913996 , -34.2715618187 , -14.3589115627 , + -16.5935468750 , 20.4574192236 , -88.7897972666 , -38.6285080386 , 53.3203422726 , 98.5991486746 , 122.7305462474 , 67.7902817187 , + 5.1764117389 , 5.0632821624 , 21.9288789574 , -78.3140512638 , -21.2069682335 , 23.6342010925 , 34.4445769455 , 59.1346766615 , + 28.9978778000 , 39.8121180845 , -17.1650033520 , -56.9174900874 , 17.8157086148 , -112.8801457350, -122.4019040408, 140.8669393157 , + -65.4664329639 , 40.6952775518 , 32.7260891658 , -43.2565155866 , 19.3945751928 , -20.1815002000 , -67.6601711640 , -18.1921178207 , + -35.6802153684 , 49.9550290306 , 131.4925251016 , -31.2940938167 , -5.2848453344 , -109.5580577933, 20.2437599390 , -8.8782958734 , + 54.1836717264 , 7.2555852190 , -3.5698316137 , -51.9236786262 , 6.7861547980 , -104.4814551670, 45.8458629668 , 70.0890876844 , + 38.3572837740 , 61.8024165129 , 68.0176962024 , -12.8193934080 , -21.4661610917 , -0.9377108815 , -74.2100679061 , 71.0490808147 , + 91.9813889497 , -14.5797640164 , 3.5036749129 , -138.3605478356, -48.1501349794 , -16.0636922482 , -12.1334197606 , 15.0562207637 , + -34.0878176054 , 55.1075126157 , 97.3829871877 , 0.2053358099 , -94.8713267382 , 51.5460954054 , 21.2966946363 , 58.1331025047 , + -23.4599044132 , -19.3315856528 , -8.4497193577 , -1.9594679356 , -33.1906549336 , -144.6825417978, -57.1218958072 , 35.7353406097 , + 61.4666549819 , 14.6536253128 , 82.1632196866 , -44.6230161723 , -91.1022589278 , -18.5737673927 , -136.8975612334, 56.9606788003 , + 70.7059960183 , -68.2829345081 , -10.2629800455 , -53.6385325047 , -68.7928766204 , 88.2444688302 , 83.1412324801 , -102.9206928160, + -68.2329763159 , -69.7552955469 , 108.2132269009 , -28.2582329307 , 5.6685898328 , -36.0392956840 , 43.3269513128 , -8.6436416796 , + -16.5054886972 , 11.5008791788 , 39.6923606683 , -28.9039554061 , 13.5938214364 , -23.6296332202 , 49.1171161163 , 53.1636857935 , + -62.9672053166 , -54.2594757384 , 48.3838956696 , 8.0469071555 , -33.6472086213 , -120.5381752144, 55.0880453111 , 17.8990740563 , + 144.9402232336 , 101.7886229203 , -73.3666393712 , -16.4721379138 , -12.7447935685 , 101.8245160983 , -49.7026860415 , -15.1227790364 , + 65.7430288442 , -131.8695390036, 10.2750933946 , 90.9752774838 , -26.5859990591 , -95.6962772568 , 76.2174589344 , 24.8796848060 , + -38.8938223046 , 54.1687774852 , -37.3585968996 , -34.6848570502 , 33.0151011570 , -55.8345877671 , -3.9009101671 , -31.5024971691 , + -9.6863895491 , 91.8719195957 , -58.9993249744 , -25.6887030614 , -8.0829472205 , 4.6386491741 , -71.4019697167 , -21.3734669095 , + 86.2079144404 , 79.6823974266 , -0.0910915997 , 44.8067718095 , 58.7204020766 , 72.6856808976 , -50.3373732478 , -116.1175365534, + -15.0884909384 , 5.4593772059 , -63.6553527905 , 37.3460388205 , -32.2399421679 , 95.7569350513 , -7.3700141964 , -56.0370832967 , + -41.7377150439 , -42.0042856519 , 12.5134312941 , 93.7845584531 , -32.4801087157 , -33.3976050318 , -24.2252126001 , -46.3199064467 , + -20.3704610276 , 15.8571376404 , 88.9127217235 , -33.1132582267 , -1.0005675836 , -28.1780471904 , 150.9349379135 , 38.0600520828 , + 36.4338677563 , -3.3709201641 , 29.7709773016 , 16.5064119077 , 21.3147729463 , 110.6714300904 , 18.8406036507 , 14.8963298097 , + 50.9975960392 , 16.3991140350 , -194.0805845907, -41.6723945839 , -74.8991127408 , -6.4587655805 , -0.6883628218 , -49.8709647175 , + 194.2265120473 , 64.3043624521 , 16.0040882780 , 68.4032551772 , -43.4050313128 , 84.6826289824 , -28.1357565943 , 134.6895584120 , + -7.9746152680 , -95.6692886462 , -48.9444370342 , 79.4479343188 , -50.5345228122 , 52.4800633307 , -14.7735051703 , -20.1510237050 , + 22.5049816980 , 64.4191999102 , 24.8385648232 , 99.4265041360 , 62.0189508473 , -28.3892600378 , -109.8842008564, -79.0407483407 , + 18.3408112020 , 49.1650536089 , 31.5419844924 , -36.1160722679 , -132.9148081329, 10.4053531567 , -129.2463715470, -43.4602207151 , + -24.2420653292 , 91.5388317556 , 21.4762248190 , -44.3810909139 , 18.4098011282 , -45.8691164539 , -20.9831197962 , 16.2076792914 , + 66.0224147666 , -13.6794615513 , 101.2163279622 , -62.4462618603 , 22.2040981785 , -52.3208382802 , -24.7909079016 , 58.5150375093 , + 18.8569705105 , -55.6083430939 , 131.0273367422 , -34.5209015065 , 121.4357296573 , -77.2590299593 , -51.5929566898 , 5.0247131098 , + -23.8451707592 , -4.5912313547 , 31.1387246821 , 61.7019310824 , 49.1912429744 , -50.5836913031 , -74.8182600630 , -21.6209317022 , + 20.9409464654 , -72.7870824583 , -28.3530746820 , -45.0794425434 , -13.4910629905 , -62.0158772255 , -34.1421181246 , 44.2844972784 , + 8.4213193211 , 79.9349022793 , 60.0160502260 , 32.2272994080 , -72.2893887746 , 17.3063698247 , -134.6335742431, 64.6499736261 , + 7.1411921919 , -37.5517577873 , 6.2405670930 , 117.1920927305 , 128.7420689815 , -3.1556854963 , -13.4100422909 , -11.9336372907 , + -8.6022400553 , -102.0033506666, -78.4696575074 , 15.0765861403 , -111.5219718576, -13.4162786508 , 38.2437013694 , 61.1637732561 , + -34.4804160003 , 107.4438003830 , -79.4193067813 , -81.1842853968 , -26.2622970331 , 132.3205425408 , -119.1464268477, 67.3048866598 , + 103.3266736715 , -58.1865815617 , 27.6231908601 , -11.2004371750 , 26.0340617206 , 12.5696123916 , 0.6442714420 , -30.7393043544 , + 1.5314955897 , 49.9110088250 , -106.1358721920, 51.1608329944 , -32.8684239794 , -27.7215905745 , -11.6450303367 , -36.7731678028 , + 59.9383486599 , -4.6301990580 , 5.0361682939 , -10.5669407980 , 124.0908762205 , 35.8305364082 , -123.6216777114, -74.2569079167 , + -56.7651776816 , 16.0736385582 , 23.5030632215 , -110.6764295938, 44.3086821806 , 9.4452708243 , 5.3300080251 , 39.0483916714 , + 151.4550562868 , 62.8957092621 , -116.8103461233, 5.1129927759 , -33.2252515135 , -9.4522506046 , 22.7026048372 , -15.5264414569 , + 71.2087620034 , 19.1191568332 , 50.3019546809 , -5.6096922409 , 22.9344126462 , -7.7591876203 , 31.8949515564 , -58.4253952381 , + 66.4341297173 , -19.0583083044 , 96.7695087855 , 20.4934280047 , 4.9544603116 , -20.8288135920 , -173.2659655408, -62.4883621640 , + -48.5528422703 , 12.1437504278 , 60.2482234666 , -19.6072312919 , -34.6320214291 , 129.0089698963 , -50.9042160618 , 98.3952661477 , + -4.7051792479 , -13.1768910826 , 69.5138802139 , 58.5748201565 , -45.9385652563 , 151.7952104306 , 34.2541941013 , -58.0417838381 , + 28.1480473670 , 46.4006562684 , 97.7001828545 , 4.0855607626 , -32.6097018162 , 16.8913949959 , 105.7266202978 , -89.3978374651 , + -60.9338593128 , -41.2220734230 , 49.9393070783 , 95.0974764854 , 49.2498366456 , 58.6214364590 , 34.1113830569 , 45.6634098874 , + -22.5356086770 , -97.1978653617 , 86.5565049535 , 70.6118545777 , -30.6978082909 , 118.7238621666 , 14.5922386932 , 11.3449652072 , + 65.6007783405 , 82.6369678204 , -52.0390492248 , -47.0160551227 , -95.5142448634 , 99.7162626888 , -36.5523815090 , -42.8042935534 , + 68.3566199798 , -13.8451547552 , -71.1629911780 , 36.2989433752 , -32.4867163365 , 112.4079947071 , -75.6295117422 , 47.5276421639 , + 51.8078250755 , -26.8715188457 , -9.6291144797 , 40.1999849640 , -38.4634033246 , 40.9764960915 , -26.1715730268 , 36.5996396515 , + -26.9924731886 , 53.7879986570 , -83.1658398348 , 23.6381378489 , 43.8794937753 , -55.4133836419 , 90.0266130838 , 14.1036181982 , + -18.1225736715 , 85.1363181151 , -62.5970846379 , -18.5291947838 , -25.7341986703 , -49.7061342931 , -59.0442763971 , 50.8960636803 , + -87.6471123430 , -36.7217762531 , 22.5952364054 , 11.1107885650 , -0.5377327229 , 160.8145792630 , 73.3103441505 , 10.1656872354 , + -50.4554350397 , -57.3478171016 , -15.4201715357 , -26.9135446491 , -4.9891264771 , -37.0226770057 , -80.9919535641 , 50.4418660876 , + -25.8517575250 , -69.9538258421 , -17.5730160671 , 15.9405836751 , 113.9545230349 , -46.1040379057 , -94.2458635014 , -69.0338522452 , + 43.5813790265 , 107.1836101171 , -55.1012654323 , -77.1529555887 , -33.1530320656 , -94.5582659641 , -53.6837586872 , 27.0680381378 , + 93.9385415207 , -61.0955216188 , 18.0530957225 , 7.9150142320 , -12.1218191587 , 34.0173961457 , 40.0084937565 , 9.8119275580 , + 44.2065861274 , -1.8718514394 , 67.4740024215 , 46.7391150131 , 207.2404815875 , 45.1635364462 , 43.3580102761 , -44.0244218674 , + 83.2387206007 , -8.6441851856 , 12.3993902588 , -22.5091685270 , -19.8332981376 , 97.9196509289 , -76.6720306234 , 28.9740705859 , + 121.9415248016 , 9.6656982611 , -51.0996453694 , 37.3704374740 , 74.7589840907 , -113.4066752631, 120.0029566342 , -105.3786221360, + 81.8152755619 , -13.4979932982 , -21.4680758393 , -85.1088235539 , -65.3610798409 , -35.0444139470 , -48.0220794487 , -41.6210317362 , + 33.1212995259 , -82.1480936443 , -10.5479715135 , 76.4601917004 , 42.1983651157 , 92.6104239912 , -42.3536237955 , -24.5644182272 , + 30.4446637772 , -90.2899420489 , 63.6723540422 , 103.0895811428 , 64.1706769263 , -10.7069812309 , 21.8927240409 , 6.3571071738 , + 57.1457649358 , -52.9866276448 , 66.0981829072 , -29.5372056881 , -79.2252039810 , -136.2440652798, -57.0106422562 , 86.8203548141 , + 66.4244149837 , 53.3230426111 , -66.1283059222 , -131.0402660353, 8.0548411081 , 122.9088988100 , 1.2626894208 , -60.5059112373 , + -68.8707203082 , -6.4747987200 , 85.8411327244 , 99.9624156733 , 90.4197864338 , -35.9630441182 , -22.9158275507 , -17.3660128776 , + 16.7845345761 , 34.7219749782 , -39.3513765878 , 1.0460702756 , -60.9494500182 , 20.0900333387 , -85.9636743832 , 88.4400782168 , + 15.0729628728 , 61.5499846243 , 11.8579871757 , 107.8617581581 , -42.9393027864 , -62.8422307621 , -19.0589600542 , 4.0750325807 , + -36.0651825425 , 55.7638724501 , -10.4691736080 , -55.5672537178 , -61.2061519915 , -21.1885348576 , -131.2535612498, 24.7463552676 , + 22.9426321237 , 14.3038202264 , -138.0926317438, -59.0892900856 , -162.5416439986, 7.1307658250 , -141.1236672256, -4.7173618068 , + -16.7741532807 , -68.2615451173 , -2.6608701102 , 84.1978109826 , -11.3446202072 , 59.9630033088 , -1.8994925010 , -37.9301641959 , + -119.4435600954, -11.4587491646 , 12.2423215240 , -7.3169898616 , -67.0373621128 , 36.0198843055 , 53.9791315249 , -134.5885680695, + -83.8330811965 , -16.6714816463 , -8.8498552035 , -24.0513088196 , -22.9444328877 , -37.7961441531 , 25.1975736186 , -136.1611637464, + -5.0843464033 , -10.3939554694 , 20.7422826935 , 75.6854136623 , 46.4179626736 , -57.0052830175 , 7.3457235521 , -51.5504447254 , + -158.4375751701, -200.2426967181, -48.1234996261 , 1.6623945527 , 21.1746524375 , 99.4092980367 , -2.3206772903 , 45.7989166757 , + 2.0181548348 , -88.0556010969 , -59.1527212096 , 47.3607925077 , -10.4181140309 , 56.3558125650 , -8.9799125560 , -30.0376711812 , + -36.7132904688 , 35.7785050392 , -13.0763909369 , -2.1855594714 , 18.1550954005 , -28.6711803575 , -55.4495172398 , -2.8812973198 , + -59.9575059158 , 40.0588875786 , 57.4713686602 , -3.2835144853 , -36.7193552111 , -64.9415131516 , -166.9555466445, -23.5556853844 , + -54.9408569587 , -35.2310451959 , 21.3345143458 , 65.7590671151 , 51.2214538168 , 46.1271939944 , -42.2235267919 , 127.2329928299 , + 105.2391778600 , 17.6726845966 , -129.9021148044, 8.7065613044 , -94.0987112511 , -3.5375742950 , -23.1385452379 , 60.6219530633 , + 92.5445564235 , 48.5111974469 , -52.5699309159 , -60.0634811685 , 25.9034368684 , 140.0249495491 , 1.5918852392 , 38.0266038291 , + 17.5588710703 , 3.4294066089 , -27.6748782173 , 59.6182974489 , -35.2924781853 , -38.6198576115 , -13.6119803198 , 7.8375587489 , + 22.7250686519 , -28.3524510951 , -34.4269062817 , 22.6464817325 , -61.6528147860 , -5.9782002429 , 61.4730771294 , 43.5582379527 , + 55.6862408270 , 87.8745651631 , 46.3401042715 , -19.8780979663 , 74.1272633369 , 29.8590452377 , -12.8665765140 , 34.2931401219 , + 53.9279617551 , -16.9017895140 , -70.1527553166 , -79.6367897992 , 109.3728271017 , -129.2214826835, -53.4644539730 , -51.5654458993 , + 17.6062148433 , 3.5090251835 , 74.2615941204 , -109.3431097845, 40.1403465151 , 28.8714561280 , 94.0868659302 , -19.0047033845 , + -60.0967410050 , -19.0998457619 , -67.2027075128 , 72.0711434846 , -17.8737851232 , 123.7050551274 , 132.6331504104 , 25.5018761009 , + -36.7817189239 , -29.1580893235 , -6.5848563828 , 90.2868948516 , -35.7017258498 , -68.5675432955 , -52.4888589786 , 47.1377730021 , + -7.4546621940 , -52.0657517138 , -49.0404829633 , -114.6910280126, -117.6819819437, -32.7856729408 , 31.8232065591 , 12.1192973039 , + 35.2678513420 , -1.0336778293 , 30.7021249679 , 127.0442906046 , -84.8457819393 , 28.9862843096 , -47.3524701726 , -126.1094998460, + -2.9700276582 , -2.4956545870 , -53.8624121141 , -85.2114117637 , 76.9057985618 , 137.1205201755 , -19.0830817212 , 14.3407526579 , + -56.5921994449 , -25.6084873186 , -44.9470801106 , -133.3139496090, 0.3487447576 , 33.4499716730 , 34.7126257844 , -9.3307383323 , + 27.2996276947 , 10.8765676134 , -91.1032360444 , -90.9584216222 , 1.6981490570 , 96.8557438791 , 56.7726390913 , -44.3246449237 , + 52.3260643361 , 21.5551140465 , 27.4535327381 , 2.0072717479 , 7.4823125629 , 77.1185863870 , 16.1372262663 , -10.7206012957 , + 66.8830091413 , 49.3523828287 , 54.0855375598 , 30.8570349345 , -10.9255375390 , 62.3910624674 , 30.9238561381 , 0.3352881853 , + 72.1022806197 , -28.8319885008 , 23.3335288806 , 46.8999035980 , -67.0984424822 , -164.7917209112, 42.5767681360 , -92.4668227688 , + 43.8491734282 , -17.1126540408 , 37.4819594334 , 69.0774409673 , -39.3530526854 , -14.0693747124 , -60.2520781215 , -80.3860105519 , + 32.6689956840 , 15.3393042576 , -18.5529761307 , 97.3942151573 , -4.4462855745 , 13.7614349817 , 158.3358780719 , -44.7258299667 , + -17.7741912819 , 116.5136962268 , -33.6261057820 , 22.8344441288 , -155.1423976144, 5.7070117893 , -22.7906543902 , -45.0633909283 , + -13.9329987929 , -66.0848932507 , 1.1383038109 , 123.8386958483 , 67.6662401589 , 45.9152963554 , -27.4397697462 , 97.9596747354 , + -6.3544655181 , 29.0832146722 , 96.3468162499 , 32.4535976137 , -91.0650399301 , 2.7293262791 , 70.7853483111 , -92.3655274571 , + 69.0359217256 , 83.1530567979 , 35.8375091111 , 7.3393552348 , -95.1770165365 , 76.4905790891 , 55.6253140577 , -29.5315327050 , + -16.5935468750 , 20.4574192236 , -88.7897972666 , -38.6285080386 , 53.3203422726 , 98.5991486746 , 122.7305462474 , 67.7902817187 , + 5.1764117389 , 5.0632821624 , 21.9288789574 , -78.3140512638 , -21.2069682335 , 23.6342010925 , 34.4445769455 , 59.1346766615 , + 28.9978778000 , 39.8121180845 , -17.1650033520 , -56.9174900874 , 17.8157086148 , -112.8801457350, -122.4019040408, 140.8669393157 , + -65.4664329639 , 40.6952775518 , 32.7260891658 , -43.2565155866 , 19.3945751928 , -20.1815002000 , -67.6601711640 , -18.1921178207 , + -35.6802153684 , -19.6571455162 +}; + +const float64_t filtering_f64_inputs[FILTERING_MAX_BLOCKSIZE * FILTERING_MAX_M + FILTERING_MAX_NUMTAPS] = +{ + 43.0264275639 , -17.0525215570 , -94.8488973910 , -8.1924989580 , 7.2830326091 , 66.8368719314 , 33.9778190671 , 117.8652289772 , + -129.6077797465, -14.6420815368 , 18.0239223278 , 20.6760530292 , 55.0375037651 , 1.8674609862 , -85.6534302408 , -33.5750364909 , + 29.2110949614 , 110.4727049460 , -94.1914619387 , -1.4084169343 , 83.5181653041 , 47.3073514127 , -13.3420621181 , 30.3389699104 , + 12.1188124277 , 100.9730921941 , -114.0146362390, -77.5823200409 , 37.2019034618 , 40.0026301128 , -58.3387276630 , -34.9472398600 , + -5.1169678311 , -87.7660091118 , -150.5888601131, 56.0349370503 , 50.2168884079 , -74.2313236767 , 22.3648603560 , -6.8676387051 , + 74.8957303680 , -90.1292012823 , -55.1436241586 , -66.6732976100 , -6.7918147615 , 7.7612697081 , 35.7892605979 , -20.0470508830 , + 41.8369017546 , -143.7378056984, -41.9127158600 , -108.3531841158, -57.1917422289 , -124.2808828105, 38.9316388820 , -77.9212517405 , + 37.1990818377 , -28.9545952748 , -155.6371057564, 45.8088886393 , 36.2537018275 , -6.5727656016 , -104.2070491921, 45.5583813729 , + -19.7674717059 , -80.4802190947 , -1.4444563441 , -42.2142256438 , 36.6546339194 , -57.0866498590 , 44.4677067511 , 65.7285753407 , + -103.8158864647, 25.4348723711 , -153.5419639389, 39.3608409474 , 49.1658103436 , 79.5570602275 , 75.2944095996 , 58.9394700746 , + -53.1018534392 , 33.4172444014 , 35.6224682287 , -64.4353396418 , -125.8464291251, -47.6072111617 , -26.2177687594 , -12.0061322096 , + -17.7887967585 , -28.2926175090 , -62.0691715749 , 40.5098573604 , -191.1123732593, 119.6750713043 , 19.6182375803 , -26.7615252921 , + 2.2957847015 , -108.3436451287, -50.5906164995 , -5.6360985100 , -11.6772204201 , -84.2765293757 , -60.9317810068 , 82.0446350218 , + -70.2048296348 , 72.8738253222 , 60.2450218115 , 114.2741231228 , 46.8180775285 , 6.9915412654 , -8.9909197429 , -78.9165936808 , + 66.4731535459 , -68.4235455651 , -79.8254597080 , -10.6308477115 , -62.6161569330 , -55.7744410292 , -11.8408366528 , 98.1034940997 , + 35.8213741877 , -54.4694482732 , 86.9631830044 , -53.0343838122 , -47.4898642865 , -47.2010929590 , -31.3312639685 , -23.0908245172 , + 12.0258009869 , -5.1098204703 , -9.8420230737 , -107.3328761158, 44.6810431959 , -17.9083820345 , -60.9753512872 , -7.5915088994 , + 17.2250813329 , 57.9176125648 , 124.3004161362 , -63.1950908493 , 120.5788885640 , -44.1734238117 , -91.7408095116 , -43.5696066595 , + -49.9560710099 , -167.8513443296, -70.9437505499 , -46.4109705355 , -64.2264526456 , -13.9995803916 , -100.9548186356, 9.9101010575 , + -50.0615130815 , -55.7590145012 , -60.3195153388 , 61.7913378549 , -102.0850899209, 53.2360193126 , -25.8997883369 , 75.1445512333 , + -113.8148602310, 17.8027281119 , -19.5006822722 , -44.2169628471 , 107.5017084384 , -113.7909124666, -43.9735396033 , 7.6880981388 , + 46.7384653508 , 9.9047443751 , 81.8646964362 , 132.3812863877 , -95.6959050236 , -68.5015813484 , 65.8586404494 , 18.5039353889 , + -30.1786166621 , -90.3098515667 , -22.9356228552 , -20.5778272423 , -2.2127786675 , -35.4418447703 , -51.8722915974 , -107.9024439078, + -51.5940748232 , -51.7463262677 , 74.2795485984 , 94.2205022462 , 9.7016384049 , -47.3556083155 , -36.7822314478 , -151.6455525363, + -15.7183814485 , 78.2063383182 , 0.1516414969 , 37.9304181609 , 20.6185902740 , -22.2164106778 , 6.1160554677 , 2.4061326953 , + -111.6681824598, -60.0858917090 , 75.1698614693 , -76.5787410444 , 28.3391655715 , -2.4946186443 , -68.0378899682 , 104.0893199171 , + -51.8319647254 , 38.8521710524 , 75.9114239564 , 73.9206172905 , -103.2533029987, 6.9002718274 , -36.6346436319 , -25.1990926265 , + 1.5852145953 , -50.6438436795 , 21.5018844428 , -151.9305562846, -51.7326681814 , 21.4475994143 , 42.2564011921 , -74.0520586926 , + 49.7370635809 , -13.2957534126 , 36.6746826778 , -31.7005492589 , 148.4894964268 , 79.7890632353 , 16.8856024809 , 16.1690460177 , + 39.2665169484 , 117.2461167794 , -37.4827984831 , -47.8387803604 , -95.7025286193 , 34.3058214285 , -124.9536456028, 56.1640195764 , + 94.3636873606 , 35.3992852810 , -38.3920852159 , -100.5738062016, -29.7837022314 , 42.9133913996 , -34.2715618187 , -14.3589115627 , + -16.5935468750 , 20.4574192236 , -88.7897972666 , -38.6285080386 , 53.3203422726 , 98.5991486746 , 122.7305462474 , 67.7902817187 , + 5.1764117389 , 5.0632821624 , 21.9288789574 , -78.3140512638 , -21.2069682335 , 23.6342010925 , 34.4445769455 , 59.1346766615 , + 28.9978778000 , 39.8121180845 , -17.1650033520 , -56.9174900874 , 17.8157086148 , -112.8801457350, -122.4019040408, 140.8669393157 , + -65.4664329639 , 40.6952775518 , 32.7260891658 , -43.2565155866 , 19.3945751928 , -20.1815002000 , -67.6601711640 , -18.1921178207 , + -35.6802153684 , 49.9550290306 , 131.4925251016 , -31.2940938167 , -5.2848453344 , -109.5580577933, 20.2437599390 , -8.8782958734 , + 54.1836717264 , 7.2555852190 , -3.5698316137 , -51.9236786262 , 6.7861547980 , -104.4814551670, 45.8458629668 , 70.0890876844 , + 38.3572837740 , 61.8024165129 , 68.0176962024 , -12.8193934080 , -21.4661610917 , -0.9377108815 , -74.2100679061 , 71.0490808147 , + 91.9813889497 , -14.5797640164 , 3.5036749129 , -138.3605478356, -48.1501349794 , -16.0636922482 , -12.1334197606 , 15.0562207637 , + -34.0878176054 , 55.1075126157 , 97.3829871877 , 0.2053358099 , -94.8713267382 , 51.5460954054 , 21.2966946363 , 58.1331025047 , + -23.4599044132 , -19.3315856528 , -8.4497193577 , -1.9594679356 , -33.1906549336 , -144.6825417978, -57.1218958072 , 35.7353406097 , + 61.4666549819 , 14.6536253128 , 82.1632196866 , -44.6230161723 , -91.1022589278 , -18.5737673927 , -136.8975612334, 56.9606788003 , + 70.7059960183 , -68.2829345081 , -10.2629800455 , -53.6385325047 , -68.7928766204 , 88.2444688302 , 83.1412324801 , -102.9206928160, + -68.2329763159 , -69.7552955469 , 108.2132269009 , -28.2582329307 , 5.6685898328 , -36.0392956840 , 43.3269513128 , -8.6436416796 , + -16.5054886972 , 11.5008791788 , 39.6923606683 , -28.9039554061 , 13.5938214364 , -23.6296332202 , 49.1171161163 , 53.1636857935 , + -62.9672053166 , -54.2594757384 , 48.3838956696 , 8.0469071555 , -33.6472086213 , -120.5381752144, 55.0880453111 , 17.8990740563 , + 144.9402232336 , 101.7886229203 , -73.3666393712 , -16.4721379138 , -12.7447935685 , 101.8245160983 , -49.7026860415 , -15.1227790364 , + 65.7430288442 , -131.8695390036, 10.2750933946 , 90.9752774838 , -26.5859990591 , -95.6962772568 , 76.2174589344 , 24.8796848060 , + -38.8938223046 , 54.1687774852 , -37.3585968996 , -34.6848570502 , 33.0151011570 , -55.8345877671 , -3.9009101671 , -31.5024971691 , + -9.6863895491 , 91.8719195957 , -58.9993249744 , -25.6887030614 , -8.0829472205 , 4.6386491741 , -71.4019697167 , -21.3734669095 , + 86.2079144404 , 79.6823974266 , -0.0910915997 , 44.8067718095 , 58.7204020766 , 72.6856808976 , -50.3373732478 , -116.1175365534, + -15.0884909384 , 5.4593772059 , -63.6553527905 , 37.3460388205 , -32.2399421679 , 95.7569350513 , -7.3700141964 , -56.0370832967 , + -41.7377150439 , -42.0042856519 , 12.5134312941 , 93.7845584531 , -32.4801087157 , -33.3976050318 , -24.2252126001 , -46.3199064467 , + -20.3704610276 , 15.8571376404 , 88.9127217235 , -33.1132582267 , -1.0005675836 , -28.1780471904 , 150.9349379135 , 38.0600520828 , + 36.4338677563 , -3.3709201641 , 29.7709773016 , 16.5064119077 , 21.3147729463 , 110.6714300904 , 18.8406036507 , 14.8963298097 , + 50.9975960392 , 16.3991140350 , -194.0805845907, -41.6723945839 , -74.8991127408 , -6.4587655805 , -0.6883628218 , -49.8709647175 , + 194.2265120473 , 64.3043624521 , 16.0040882780 , 68.4032551772 , -43.4050313128 , 84.6826289824 , -28.1357565943 , 134.6895584120 , + -7.9746152680 , -95.6692886462 , -48.9444370342 , 79.4479343188 , -50.5345228122 , 52.4800633307 , -14.7735051703 , -20.1510237050 , + 22.5049816980 , 64.4191999102 , 24.8385648232 , 99.4265041360 , 62.0189508473 , -28.3892600378 , -109.8842008564, -79.0407483407 , + 18.3408112020 , 49.1650536089 , 31.5419844924 , -36.1160722679 , -132.9148081329, 10.4053531567 , -129.2463715470, -43.4602207151 , + -24.2420653292 , 91.5388317556 , 21.4762248190 , -44.3810909139 , 18.4098011282 , -45.8691164539 , -20.9831197962 , 16.2076792914 , + 66.0224147666 , -13.6794615513 , 101.2163279622 , -62.4462618603 , 22.2040981785 , -52.3208382802 , -24.7909079016 , 58.5150375093 , + 18.8569705105 , -55.6083430939 , 131.0273367422 , -34.5209015065 , 121.4357296573 , -77.2590299593 , -51.5929566898 , 5.0247131098 , + -23.8451707592 , -4.5912313547 , 31.1387246821 , 61.7019310824 , 49.1912429744 , -50.5836913031 , -74.8182600630 , -21.6209317022 , + 20.9409464654 , -72.7870824583 , -28.3530746820 , -45.0794425434 , -13.4910629905 , -62.0158772255 , -34.1421181246 , 44.2844972784 , + 8.4213193211 , 79.9349022793 , 60.0160502260 , 32.2272994080 , -72.2893887746 , 17.3063698247 , -134.6335742431, 64.6499736261 , + 7.1411921919 , -37.5517577873 , 6.2405670930 , 117.1920927305 , 128.7420689815 , -3.1556854963 , -13.4100422909 , -11.9336372907 , + -8.6022400553 , -102.0033506666, -78.4696575074 , 15.0765861403 , -111.5219718576, -13.4162786508 , 38.2437013694 , 61.1637732561 , + -34.4804160003 , 107.4438003830 , -79.4193067813 , -81.1842853968 , -26.2622970331 , 132.3205425408 , -119.1464268477, 67.3048866598 , + 103.3266736715 , -58.1865815617 , 27.6231908601 , -11.2004371750 , 26.0340617206 , 12.5696123916 , 0.6442714420 , -30.7393043544 , + 1.5314955897 , 49.9110088250 , -106.1358721920, 51.1608329944 , -32.8684239794 , -27.7215905745 , -11.6450303367 , -36.7731678028 , + 59.9383486599 , -4.6301990580 , 5.0361682939 , -10.5669407980 , 124.0908762205 , 35.8305364082 , -123.6216777114, -74.2569079167 , + -56.7651776816 , 16.0736385582 , 23.5030632215 , -110.6764295938, 44.3086821806 , 9.4452708243 , 5.3300080251 , 39.0483916714 , + 151.4550562868 , 62.8957092621 , -116.8103461233, 5.1129927759 , -33.2252515135 , -9.4522506046 , 22.7026048372 , -15.5264414569 , + 71.2087620034 , 19.1191568332 , 50.3019546809 , -5.6096922409 , 22.9344126462 , -7.7591876203 , 31.8949515564 , -58.4253952381 , + 66.4341297173 , -19.0583083044 , 96.7695087855 , 20.4934280047 , 4.9544603116 , -20.8288135920 , -173.2659655408, -62.4883621640 , + -48.5528422703 , 12.1437504278 , 60.2482234666 , -19.6072312919 , -34.6320214291 , 129.0089698963 , -50.9042160618 , 98.3952661477 , + -4.7051792479 , -13.1768910826 , 69.5138802139 , 58.5748201565 , -45.9385652563 , 151.7952104306 , 34.2541941013 , -58.0417838381 , + 28.1480473670 , 46.4006562684 , 97.7001828545 , 4.0855607626 , -32.6097018162 , 16.8913949959 , 105.7266202978 , -89.3978374651 , + -60.9338593128 , -41.2220734230 , 49.9393070783 , 95.0974764854 , 49.2498366456 , 58.6214364590 , 34.1113830569 , 45.6634098874 , + -22.5356086770 , -97.1978653617 , 86.5565049535 , 70.6118545777 , -30.6978082909 , 118.7238621666 , 14.5922386932 , 11.3449652072 , + 65.6007783405 , 82.6369678204 , -52.0390492248 , -47.0160551227 , -95.5142448634 , 99.7162626888 , -36.5523815090 , -42.8042935534 , + 68.3566199798 , -13.8451547552 , -71.1629911780 , 36.2989433752 , -32.4867163365 , 112.4079947071 , -75.6295117422 , 47.5276421639 , + 51.8078250755 , -26.8715188457 , -9.6291144797 , 40.1999849640 , -38.4634033246 , 40.9764960915 , -26.1715730268 , 36.5996396515 , + -26.9924731886 , 53.7879986570 , -83.1658398348 , 23.6381378489 , 43.8794937753 , -55.4133836419 , 90.0266130838 , 14.1036181982 , + -18.1225736715 , 85.1363181151 , -62.5970846379 , -18.5291947838 , -25.7341986703 , -49.7061342931 , -59.0442763971 , 50.8960636803 , + -87.6471123430 , -36.7217762531 , 22.5952364054 , 11.1107885650 , -0.5377327229 , 160.8145792630 , 73.3103441505 , 10.1656872354 , + -50.4554350397 , -57.3478171016 , -15.4201715357 , -26.9135446491 , -4.9891264771 , -37.0226770057 , -80.9919535641 , 50.4418660876 , + -25.8517575250 , -69.9538258421 , -17.5730160671 , 15.9405836751 , 113.9545230349 , -46.1040379057 , -94.2458635014 , -69.0338522452 , + 43.5813790265 , 107.1836101171 , -55.1012654323 , -77.1529555887 , -33.1530320656 , -94.5582659641 , -53.6837586872 , 27.0680381378 , + 93.9385415207 , -61.0955216188 , 18.0530957225 , 7.9150142320 , -12.1218191587 , 34.0173961457 , 40.0084937565 , 9.8119275580 , + 44.2065861274 , -1.8718514394 , 67.4740024215 , 46.7391150131 , 207.2404815875 , 45.1635364462 , 43.3580102761 , -44.0244218674 , + 83.2387206007 , -8.6441851856 , 12.3993902588 , -22.5091685270 , -19.8332981376 , 97.9196509289 , -76.6720306234 , 28.9740705859 , + 121.9415248016 , 9.6656982611 , -51.0996453694 , 37.3704374740 , 74.7589840907 , -113.4066752631, 120.0029566342 , -105.3786221360, + 81.8152755619 , -13.4979932982 , -21.4680758393 , -85.1088235539 , -65.3610798409 , -35.0444139470 , -48.0220794487 , -41.6210317362 , + 33.1212995259 , -82.1480936443 , -10.5479715135 , 76.4601917004 , 42.1983651157 , 92.6104239912 , -42.3536237955 , -24.5644182272 , + 30.4446637772 , -90.2899420489 , 63.6723540422 , 103.0895811428 , 64.1706769263 , -10.7069812309 , 21.8927240409 , 6.3571071738 , + 57.1457649358 , -52.9866276448 , 66.0981829072 , -29.5372056881 , -79.2252039810 , -136.2440652798, -57.0106422562 , 86.8203548141 , + 66.4244149837 , 53.3230426111 , -66.1283059222 , -131.0402660353, 8.0548411081 , 122.9088988100 , 1.2626894208 , -60.5059112373 , + -68.8707203082 , -6.4747987200 , 85.8411327244 , 99.9624156733 , 90.4197864338 , -35.9630441182 , -22.9158275507 , -17.3660128776 , + 16.7845345761 , 34.7219749782 , -39.3513765878 , 1.0460702756 , -60.9494500182 , 20.0900333387 , -85.9636743832 , 88.4400782168 , + 15.0729628728 , 61.5499846243 , 11.8579871757 , 107.8617581581 , -42.9393027864 , -62.8422307621 , -19.0589600542 , 4.0750325807 , + -36.0651825425 , 55.7638724501 , -10.4691736080 , -55.5672537178 , -61.2061519915 , -21.1885348576 , -131.2535612498, 24.7463552676 , + 22.9426321237 , 14.3038202264 , -138.0926317438, -59.0892900856 , -162.5416439986, 7.1307658250 , -141.1236672256, -4.7173618068 , + -16.7741532807 , -68.2615451173 , -2.6608701102 , 84.1978109826 , -11.3446202072 , 59.9630033088 , -1.8994925010 , -37.9301641959 , + -119.4435600954, -11.4587491646 , 12.2423215240 , -7.3169898616 , -67.0373621128 , 36.0198843055 , 53.9791315249 , -134.5885680695, + -83.8330811965 , -16.6714816463 , -8.8498552035 , -24.0513088196 , -22.9444328877 , -37.7961441531 , 25.1975736186 , -136.1611637464, + -5.0843464033 , -10.3939554694 , 20.7422826935 , 75.6854136623 , 46.4179626736 , -57.0052830175 , 7.3457235521 , -51.5504447254 , + -158.4375751701, -200.2426967181, -48.1234996261 , 1.6623945527 , 21.1746524375 , 99.4092980367 , -2.3206772903 , 45.7989166757 , + 2.0181548348 , -88.0556010969 , -59.1527212096 , 47.3607925077 , -10.4181140309 , 56.3558125650 , -8.9799125560 , -30.0376711812 , + -36.7132904688 , 35.7785050392 , -13.0763909369 , -2.1855594714 , 18.1550954005 , -28.6711803575 , -55.4495172398 , -2.8812973198 , + -59.9575059158 , 40.0588875786 , 57.4713686602 , -3.2835144853 , -36.7193552111 , -64.9415131516 , -166.9555466445, -23.5556853844 , + -54.9408569587 , -35.2310451959 , 21.3345143458 , 65.7590671151 , 51.2214538168 , 46.1271939944 , -42.2235267919 , 127.2329928299 , + 105.2391778600 , 17.6726845966 , -129.9021148044, 8.7065613044 , -94.0987112511 , -3.5375742950 , -23.1385452379 , 60.6219530633 , + 92.5445564235 , 48.5111974469 , -52.5699309159 , -60.0634811685 , 25.9034368684 , 140.0249495491 , 1.5918852392 , 38.0266038291 , + 17.5588710703 , 3.4294066089 , -27.6748782173 , 59.6182974489 , -35.2924781853 , -38.6198576115 , -13.6119803198 , 7.8375587489 , + 22.7250686519 , -28.3524510951 , -34.4269062817 , 22.6464817325 , -61.6528147860 , -5.9782002429 , 61.4730771294 , 43.5582379527 , + 55.6862408270 , 87.8745651631 , 46.3401042715 , -19.8780979663 , 74.1272633369 , 29.8590452377 , -12.8665765140 , 34.2931401219 , + 53.9279617551 , -16.9017895140 , -70.1527553166 , -79.6367897992 , 109.3728271017 , -129.2214826835, -53.4644539730 , -51.5654458993 , + 17.6062148433 , 3.5090251835 , 74.2615941204 , -109.3431097845, 40.1403465151 , 28.8714561280 , 94.0868659302 , -19.0047033845 , + -60.0967410050 , -19.0998457619 , -67.2027075128 , 72.0711434846 , -17.8737851232 , 123.7050551274 , 132.6331504104 , 25.5018761009 , + -36.7817189239 , -29.1580893235 , -6.5848563828 , 90.2868948516 , -35.7017258498 , -68.5675432955 , -52.4888589786 , 47.1377730021 , + -7.4546621940 , -52.0657517138 , -49.0404829633 , -114.6910280126, -117.6819819437, -32.7856729408 , 31.8232065591 , 12.1192973039 , + 35.2678513420 , -1.0336778293 , 30.7021249679 , 127.0442906046 , -84.8457819393 , 28.9862843096 , -47.3524701726 , -126.1094998460, + -2.9700276582 , -2.4956545870 , -53.8624121141 , -85.2114117637 , 76.9057985618 , 137.1205201755 , -19.0830817212 , 14.3407526579 , + -56.5921994449 , -25.6084873186 , -44.9470801106 , -133.3139496090, 0.3487447576 , 33.4499716730 , 34.7126257844 , -9.3307383323 , + 27.2996276947 , 10.8765676134 , -91.1032360444 , -90.9584216222 , 1.6981490570 , 96.8557438791 , 56.7726390913 , -44.3246449237 , + 52.3260643361 , 21.5551140465 , 27.4535327381 , 2.0072717479 , 7.4823125629 , 77.1185863870 , 16.1372262663 , -10.7206012957 , + 66.8830091413 , 49.3523828287 , 54.0855375598 , 30.8570349345 , -10.9255375390 , 62.3910624674 , 30.9238561381 , 0.3352881853 , + 72.1022806197 , -28.8319885008 , 23.3335288806 , 46.8999035980 , -67.0984424822 , -164.7917209112, 42.5767681360 , -92.4668227688 , + 43.8491734282 , -17.1126540408 , 37.4819594334 , 69.0774409673 , -39.3530526854 , -14.0693747124 , -60.2520781215 , -80.3860105519 , + 32.6689956840 , 15.3393042576 , -18.5529761307 , 97.3942151573 , -4.4462855745 , 13.7614349817 , 158.3358780719 , -44.7258299667 , + -17.7741912819 , 116.5136962268 , -33.6261057820 , 22.8344441288 , -155.1423976144, 5.7070117893 , -22.7906543902 , -45.0633909283 , + -13.9329987929 , -66.0848932507 , 1.1383038109 , 123.8386958483 , 67.6662401589 , 45.9152963554 , -27.4397697462 , 97.9596747354 , + -6.3544655181 , 29.0832146722 , 96.3468162499 , 32.4535976137 , -91.0650399301 , 2.7293262791 , 70.7853483111 , -92.3655274571 , + 69.0359217256 , 83.1530567979 , 35.8375091111 , 7.3393552348 , -95.1770165365 , 76.4905790891 , 55.6253140577 , -29.5315327050 , + -16.5935468750 , 20.4574192236 , -88.7897972666 , -38.6285080386 , 53.3203422726 , 98.5991486746 , 122.7305462474 , 67.7902817187 , + 5.1764117389 , 5.0632821624 , 21.9288789574 , -78.3140512638 , -21.2069682335 , 23.6342010925 , 34.4445769455 , 59.1346766615 , + 28.9978778000 , 39.8121180845 , -17.1650033520 , -56.9174900874 , 17.8157086148 , -112.8801457350, -122.4019040408, 140.8669393157 , + -65.4664329639 , 40.6952775518 , 32.7260891658 , -43.2565155866 , 19.3945751928 , -20.1815002000 , -67.6601711640 , -18.1921178207 , + -35.6802153684 , -19.6571455162 +}; + +/*--------------------------------------------------------------------------------*/ +/* Blocksizes */ +/*--------------------------------------------------------------------------------*/ +ARR_DESC_DEFINE(uint32_t, + filtering_blocksizes, + 5, + CURLY( + 1, 7, 14, 32, FILTERING_MAX_BLOCKSIZE)); + +ARR_DESC_DEFINE(uint32_t, + lms_blocksizes, + 3, + CURLY( + 128, 256, LMS_MAX_BLOCKSIZE)); + +ARR_DESC_DEFINE(uint16_t, + filtering_numtaps, + 5, + CURLY( + 4, 6, 14, 32, FILTERING_MAX_NUMTAPS)); + +ARR_DESC_DEFINE(uint16_t, + filtering_numtaps2, + 5, + CURLY( + 6, 12, 18, 24, 30)); + +ARR_DESC_DEFINE(uint16_t, + filtering_numstages, + 3, + CURLY( + 1, 7, FILTERING_MAX_NUMSTAGES)); + +ARR_DESC_DEFINE(uint8_t, + filtering_postshifts, + 3, + CURLY( + 0, 1, FILTERING_MAX_POSTSHIFT)); + +ARR_DESC_DEFINE(uint8_t, + filtering_Ls, + 3, + CURLY( + 1, 2, FILTERING_MAX_L)); + +ARR_DESC_DEFINE(uint8_t, + filtering_Ms, + 6, + CURLY( + 1, 2, 4, 7, 11, FILTERING_MAX_M)); + + +/*--------------------------------------------------------------------------------*/ +/* Coefficient Lists */ +/*--------------------------------------------------------------------------------*/ + +// There must be at least max( FILTERING_MAX_NUMTAPS + 2 , FILTERING_MAX_NUMSTAGES * 6 + 2) coefficients +const float32_t filtering_coeffs_f32[FILTERING_MAX_NUMSTAGES * 6 + 2] = +{ + -13.0572f, 0.0f , -97.4724f, 8.4111f , -7.2193f , -53.7577f, 22.2630f , + -1.0509f , -25.9198f, 26.5207f , -12.6697f, -78.7453f, -0.6540f , 0.3119f , + 13.4595f , -6.7225f , -4.1313f , -38.5974f, 3.2700f , -51.6191f, -22.4314f, + 0.2481f , 32.9779f , -37.6421f, 5.4469f , -7.0023f , 24.3657f , 9.9140f , + 0.2870f , -13.0499f, 29.3333f , -53.1396f, -2.7555f , 0.5377f , 35.3491f , + -3.7134f , 0.8548f , 4.7469f , -10.5865f, -2.7285f , -1.5912f , -13.3502f, + 6.8532f , -8.2304f , -8.1193f , 3.8257f , -2.1703f , 13.5727f , 14.2736f , + -0.9855f , -8.9334f , -13.8883f, 11.8430f , -2.2024f , 0.9795f , 15.6191f , + 5.2121f , 10.8102f , -9.4171f , 6.0411f , -0.9131f , 10.6992f , -3.2634f , + 7.5849f , -4.9305f , -6.0549f , -7.9409f , 1.5827f , 13.3177f , 8.6727f , + -13.2268f , 11.1239f , 0.2481f , 32.9779f , -37.6421f, 5.4469f , -13.8883f, + 11.8430f , -2.2024f , 0.9795f , 15.6191f , 0.2481f , 32.9779f , -37.6421f, + 3.2700f , -51.6191f +}; +const float64_t filtering_coeffs_f64[FILTERING_MAX_NUMSTAGES * 6 + 2] = +{ + -13.0572f, 0.0f , -97.4724f, 8.4111f , -7.2193f , -53.7577f, 22.2630f , + -1.0509f , -25.9198f, 26.5207f , -12.6697f, -78.7453f, -0.6540f , 0.3119f , + 13.4595f , -6.7225f , -4.1313f , -38.5974f, 3.2700f , -51.6191f, -22.4314f, + 0.2481f , 32.9779f , -37.6421f, 5.4469f , -7.0023f , 24.3657f , 9.9140f , + 0.2870f , -13.0499f, 29.3333f , -53.1396f, -2.7555f , 0.5377f , 35.3491f , + -3.7134f , 0.8548f , 4.7469f , -10.5865f, -2.7285f , -1.5912f , -13.3502f, + 6.8532f , -8.2304f , -8.1193f , 3.8257f , -2.1703f , 13.5727f , 14.2736f , + -0.9855f , -8.9334f , -13.8883f, 11.8430f , -2.2024f , 0.9795f , 15.6191f , + 5.2121f , 10.8102f , -9.4171f , 6.0411f , -0.9131f , 10.6992f , -3.2634f , + 7.5849f , -4.9305f , -6.0549f , -7.9409f , 1.5827f , 13.3177f , 8.6727f , + -13.2268f , 11.1239f , 0.2481f , 32.9779f , -37.6421f, 5.4469f , -13.8883f, + 11.8430f , -2.2024f , 0.9795f , 15.6191f , 0.2481f , 32.9779f , -37.6421f, + 3.2700f , -51.6191f +}; + +const float32_t filtering_coeffs_b_f32[FILTERING_MAX_NUMSTAGES * 6 + 2] = +{ + -0.0572f, 0.0f , -0.4724f, 0.4111f , -0.9999f, -0.7577f, 0.2630f , + -0.0509f, -1.0000f, 0.5207f , -0.6697f, -0.7453f, -0.6540f, 0.3119f , + 0.4595f , -0.7225f, -0.1313f, -0.5974f, 0.2700f , -0.6191f, -0.4314f, + 0.2481f , 0.9779f , -0.6421f, 0.4469f , -0.0023f, 0.3657f , 0.9140f , + 0.2870f , -0.0499f, 0.3333f , -0.1396f, -0.7555f, 0.5377f , 0.3491f , + 0.2369f , -0.5310f, -0.5904f, 0.6263f , 0.0205f , 0.1088f , -0.2926f, + -0.4187f, -0.5094f, 0.4479f , -0.3594f, -0.3102f, 0.6748f , 0.7620f , + 0.0033f , -0.9195f, 0.3192f , -0.1705f, 0.5524f , -0.5025f, 0.4898f , + -0.0119f, -0.3982f, -0.7818f, -0.9186f, -0.0944f, 0.7228f , 0.7014f , + 0.4850f , -0.6814f, 0.4914f , -0.6286f, 0.5130f , -0.8585f, 0.3000f , + 0.6068f , 0.4978f , -0.7225f, -0.1313f, -0.5974f, 0.2700f , -0.6191f, + 0.2481f , 0.9779f , -0.6421f, 0.4469f , -0.0023f, 0.3657f , 0.9140f , + 0.2369f , -0.5310f +}; + +const float64_t filtering_coeffs_b_f64[FILTERING_MAX_NUMSTAGES * 6 + 2] = +{ + -0.0572f, 0.0f , -0.4724f, 0.4111f , -0.9999f, -0.7577f, 0.2630f , + -0.0509f, -1.0000f, 0.5207f , -0.6697f, -0.7453f, -0.6540f, 0.3119f , + 0.4595f , -0.7225f, -0.1313f, -0.5974f, 0.2700f , -0.6191f, -0.4314f, + 0.2481f , 0.9779f , -0.6421f, 0.4469f , -0.0023f, 0.3657f , 0.9140f , + 0.2870f , -0.0499f, 0.3333f , -0.1396f, -0.7555f, 0.5377f , 0.3491f , + 0.2369f , -0.5310f, -0.5904f, 0.6263f , 0.0205f , 0.1088f , -0.2926f, + -0.4187f, -0.5094f, 0.4479f , -0.3594f, -0.3102f, 0.6748f , 0.7620f , + 0.0033f , -0.9195f, 0.3192f , -0.1705f, 0.5524f , -0.5025f, 0.4898f , + -0.0119f, -0.3982f, -0.7818f, -0.9186f, -0.0944f, 0.7228f , 0.7014f , + 0.4850f , -0.6814f, 0.4914f , -0.6286f, 0.5130f , -0.8585f, 0.3000f , + 0.6068f , 0.4978f , -0.7225f, -0.1313f, -0.5974f, 0.2700f , -0.6191f, + 0.2481f , 0.9779f , -0.6421f, 0.4469f , -0.0023f, 0.3657f , 0.9140f , + 0.2369f , -0.5310f +}; + +const float32_t *filtering_coeffs_c_f32 = filtering_coeffs_b_f32 + 1; + +const q31_t filtering_coeffs_q31[FILTERING_MAX_NUMSTAGES * 6 + 2] = +{ + 0xEEDA759C, 0x00000000, 0x80000000, 0x0B0BA027, 0xF6850544, 0xB967E3EC, + 0x1D3C4F64, 0xFFFFFFFF, 0xDDF65B14, 0x22D3A62D, 0xEF5CBB89, 0x98979EE0, + 0xFF242597, 0x0068D9E9, 0x11ACC4F3, 0xF72C0F21, 0xFA9326BC, 0xCD506BD5, + 0x044B50CD, 0xBC36D4BC, 0xE28B1589, 0x0053690B, 0x2B4E6639, 0xCE919690, + 0x0727234D, 0xF6CDFB14, 0x1FFF2FCF, 0x0D04DC35, 0x00607E4D, 0xEEDCF04A, + 0x268530EF, 0xBA37B050, 0x7FFFFFFF, 0xEF5CBB89, 0x00000000, 0x2B4E6639, + 0xFF242597, 0x0068D9E9, 0x11ACC4F3, 0xF72C0F21, 0xFA9326BC, 0xCD506BD5, + 0x1D3C4F64, 0xFFFFFFFF, 0xDDF65B14, 0x22D3A62D, 0xEF5CBB89, 0x98979EE0, + 0x044B50CD, 0xBC36D4BC, 0xE28B1589, 0x0053690B, 0x2B4E6639, 0xCE919690, + 0x0727234D, 0xF6CDFB14, 0x1FFF2FCF, 0x0D04DC35, 0x00607E4D, 0xEEDCF04A, + 0xE28B1589, 0x0053690B, 0x044B50CD, 0xBC36D4BC, 0xE28B1589, 0xB967E3EC, + 0x044B50CD, 0xBC36D4BC, 0xE28B1589, 0x0053690B, 0x2B4E6639, 0xCE919690, + 0x1FFF2FCF, 0x0D04DC35, 0x00607E4D, 0xEEDCF04A, 0xFFFFFFFF, 0xDDF65B14, + 0xFF242597, 0x0068D9E9, 0x11ACC4F3, 0xF72C0F21, 0xFA9326BC, 0xCD506BD5, + 0x2B4E6639, 0xCE919690 +}; + +const q31_t *filtering_coeffs_b_q31 = filtering_coeffs_q31 + 1; +const q31_t *filtering_coeffs_c_q31 = filtering_coeffs_q31 + 2; + +//fourth coefficient MUST be zero for arm_biquad_cascade_df1_fast_q15 to work +//every 6th coefficient after that must also be zero +const q15_t filtering_coeffs_q15[FILTERING_MAX_NUMSTAGES * 6 + 4] = +{ + 0xBA37, 0xEEDA, 0x8000, 0x0000, 0x0B0B, 0xF685, 0xB967, + 0x1D3C, 0xFFFF, 0x0000, 0x22D3, 0xEF5C, 0x9897, + 0xFF24, 0x0068, 0x0000, 0xF72C, 0xFA93, 0xCD50, + 0x044B, 0xBC36, 0x0000, 0x0053, 0x2B4E, 0xCE91, + 0x0727, 0xF6CD, 0x0000, 0x0D04, 0x0060, 0xEEDC, + 0x2685, 0xBA37, 0x0000, 0xDDF6, 0x0000, 0x2B4E, + 0xFF24, 0x0068, 0x0000, 0xF72C, 0xFA93, 0xCD50, + 0x1D3C, 0xFFFF, 0x0000, 0x22D3, 0xEF5C, 0x9897, + 0x044B, 0xBC36, 0x0000, 0x0053, 0x2B4E, 0xCE91, + 0x0727, 0xF6CD, 0x0000, 0x0D04, 0x0060, 0xEEDC, + 0xE28B, 0x0053, 0x0000, 0xBC36, 0xE28B, 0xB967, + 0x044B, 0xBC36, 0x0000, 0x0053, 0x2B4E, 0xCE91, + 0x044B, 0xBC36, 0x0000, 0x0053, 0x2B4E, 0xCE91, + 0x0727, 0xF6CD, 0x0000, 0x0D04, 0x0060, 0xEEDC, + 0xE28B, 0x11AC, 0x0000, +}; + +const q15_t *filtering_coeffs_b_q15 = filtering_coeffs_q15 + 2; +const q15_t *filtering_coeffs_c_q15 = filtering_coeffs_q15 + 4; + +const q7_t filtering_coeffs_q7[FILTERING_MAX_NUMSTAGES * 6 + 8] = +{ + 0xEE, 0x00, 0x80, 0x0B, 0xF6, 0xB9, + 0x1D, 0xFF, 0xDD, 0x22, 0xEF, 0x98, + 0xFF, 0x00, 0x11, 0xF7, 0xFA, 0xCD, + 0x04, 0xBC, 0xE2, 0x00, 0x2B, 0xCE, + 0x07, 0xF6, 0x1F, 0x0D, 0x00, 0xEE, + 0x26, 0xBA, 0x7F, 0x00, 0x80, 0x2B, + 0xFF, 0x00, 0x11, 0xF7, 0xFA, 0xCD, + 0x1D, 0xFF, 0xDD, 0x22, 0xEF, 0x98, + 0x04, 0xBC, 0xE2, 0x00, 0x2B, 0xCE, + 0x07, 0xF6, 0x1F, 0x0D, 0x00, 0xEE, + 0xE2, 0x00, 0x04, 0xBC, 0xE2, 0xB9, + 0x04, 0xBC, 0xE2, 0x00, 0x2B, 0xCE, + 0x07, 0xF6, 0x1F, 0x0D, 0x00, 0xEE, + 0x26, 0xBA, 0x7F, 0x00, 0x80, 0x2B, + 0x07, 0xF6, 0x1F, 0x0D, 0x00, 0xEE, + 0xFA, 0xCD +}; + +const q7_t *filtering_coeffs_b_q7 = filtering_coeffs_q7 + 4; +const q7_t *filtering_coeffs_c_q7 = filtering_coeffs_q7 + 8; + +/*--------------------------------------------------------------------------------*/ +/* Tap Delay Lists */ +/*--------------------------------------------------------------------------------*/ +//const int32_t filtering_tap_delay[FILTERING_MAX_NUMTAPS] = { +// 0xEE, 0x00, 0x10, 0x0B, 0xF6, 0xD9, +// 0x1D, 0xFF, 0xDD, 0x1A, 0xEF, 0xE8, +// 0xFF, 0x00, 0x11, 0xF7, 0xFA, 0xDD, +// 0x04, 0xEC, 0xE2, 0x00, 0x2B, 0xFE, +// 0x07, 0xF6, 0x1F, 0x0D, 0x00, 0xEE, +// 0x20, 0xDF, 0x21 +//}; + +const int32_t filtering_tap_delay[FILTERING_MAX_NUMTAPS] = { + 0x00, 0x01, 0x10, 0x0B, 0x03, 0x05, + 0x1D, 0x21, 0x11, 0x1A, 0x1F, 0x07, + 0x20, 0x01, 0x10, 0x0B, 0x03, 0x05, + 0x1D, 0x21, 0x11, 0x1A, 0x1F, 0x07, + 0x00, 0x01, 0x10, 0x0B, 0x03, 0x05, + 0x1D, 0x21, 0x11 +}; + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/filtering_test_group.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/filtering_test_group.c new file mode 100644 index 0000000..fb59448 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/filtering_test_group.c @@ -0,0 +1,17 @@ +#include "jtest.h" +#include "filtering_tests.h" + +JTEST_DEFINE_GROUP(filtering_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_GROUP_CALL(biquad_tests); + JTEST_GROUP_CALL(conv_tests); + JTEST_GROUP_CALL(correlate_tests); + JTEST_GROUP_CALL(fir_tests); + JTEST_GROUP_CALL(iir_tests); + JTEST_GROUP_CALL(lms_tests); + + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/fir_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/fir_tests.c new file mode 100644 index 0000000..40e52b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/fir_tests.c @@ -0,0 +1,402 @@ +#include "jtest.h" +#include "filtering_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "filtering_templates.h" +#include "type_abbrev.h" + +#define FIR_DEFINE_TEST(suffix, config_suffix, output_type) \ + JTEST_DEFINE_TEST(arm_fir##config_suffix##_##suffix##_test, \ + arm_fir##config_suffix##_##suffix) \ + { \ + arm_fir_instance_##suffix fir_inst_fut = { 0 }; \ + arm_fir_instance_##suffix fir_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numtaps_idx, uint16_t, numTaps, filtering_numtaps \ + , \ + /* Initialize the FIR Instances */ \ + arm_fir_init_##suffix( \ + &fir_inst_fut, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Taps: %d\n", \ + (int)blockSize, \ + (int)numTaps); \ + \ + JTEST_COUNT_CYCLES( \ + arm_fir##config_suffix##_##suffix( \ + &fir_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + blockSize)); \ + \ + arm_fir_init_##suffix( \ + &fir_inst_ref, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + ref_fir##config_suffix##_##suffix( \ + &fir_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize, \ + output_type))); \ + \ + return JTEST_TEST_PASSED; \ + } + +#define FIR_INTERPOLATE_DEFINE_TEST(suffix, output_type) \ + JTEST_DEFINE_TEST(arm_fir_interpolate_##suffix##_test, \ + arm_fir_interpolate_##suffix) \ + { \ + arm_fir_interpolate_instance_##suffix fir_inst_fut = { 0 }; \ + arm_fir_interpolate_instance_##suffix fir_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numtaps_idx, uint16_t, numTaps, filtering_numtaps2 \ + , \ + TEMPLATE_DO_ARR_DESC( \ + L_idx, uint8_t, L, filtering_Ls \ + , \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Taps: %d\n" \ + "Upsample factor: %d\n", \ + (int)blockSize, \ + (int)numTaps, \ + (int)L); \ + \ + /* Initialize the FIR Instances */ \ + arm_fir_interpolate_init_##suffix( \ + &fir_inst_fut, L, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + JTEST_COUNT_CYCLES( \ + arm_fir_interpolate_##suffix( \ + &fir_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + blockSize)); \ + \ + arm_fir_interpolate_init_##suffix( \ + &fir_inst_ref, L, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + ref_fir_interpolate_##suffix( \ + &fir_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize * (uint32_t)L, \ + output_type)))); \ + \ + return JTEST_TEST_PASSED; \ + } + +#define FIR_DECIMATE_DEFINE_TEST(suffix, config_suffix, output_type) \ + JTEST_DEFINE_TEST(arm_fir_decimate##config_suffix##_##suffix##_test, \ + arm_fir_decimate##config_suffix##_##suffix) \ + { \ + arm_fir_decimate_instance_##suffix fir_inst_fut = { 0 }; \ + arm_fir_decimate_instance_##suffix fir_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numtaps_idx, uint16_t, numTaps, filtering_numtaps \ + , \ + TEMPLATE_DO_ARR_DESC( \ + M_idx, uint8_t, M, filtering_Ms \ + , \ + if (blockSize % M == 0) \ + { \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Taps: %d\n" \ + "Decimation Factor: %d\n", \ + (int)blockSize, \ + (int)numTaps, \ + (int)M); \ + \ + /* Initialize the FIR Instances */ \ + arm_fir_decimate_init_##suffix( \ + &fir_inst_fut, numTaps, M, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + JTEST_COUNT_CYCLES( \ + arm_fir_decimate##config_suffix##_##suffix( \ + &fir_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + blockSize)); \ + \ + arm_fir_decimate_init_##suffix( \ + &fir_inst_ref, numTaps, M, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + ref_fir_decimate##config_suffix##_##suffix( \ + &fir_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize / M, \ + output_type); \ + }))); \ + \ + return JTEST_TEST_PASSED; \ + } + +#define FIR_LATTICE_DEFINE_TEST(suffix, output_type) \ + JTEST_DEFINE_TEST(arm_fir_lattice_##suffix##_test, \ + arm_fir_lattice_##suffix) \ + { \ + arm_fir_lattice_instance_##suffix fir_inst_fut = { 0 }; \ + arm_fir_lattice_instance_##suffix fir_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numstages_idx, uint16_t, numStages, filtering_numstages \ + , \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Stages: %d\n", \ + (int)blockSize, \ + (int)numStages); \ + \ + /* Initialize the FIR Instances */ \ + arm_fir_lattice_init_##suffix( \ + &fir_inst_fut, numStages, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState); \ + \ + JTEST_COUNT_CYCLES( \ + arm_fir_lattice_##suffix( \ + &fir_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + blockSize)); \ + \ + arm_fir_lattice_init_##suffix( \ + &fir_inst_ref, numStages, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState); \ + \ + ref_fir_lattice_##suffix( \ + &fir_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize, \ + output_type))); \ + \ + return JTEST_TEST_PASSED; \ + } + + +#define FIR_SPARSE_DEFINE_TEST(suffix, output_type) \ + JTEST_DEFINE_TEST(arm_fir_sparse_##suffix##_test, \ + arm_fir_sparse_##suffix) \ + { \ + arm_fir_sparse_instance_##suffix fir_inst_fut = { 0 }; \ + arm_fir_sparse_instance_##suffix fir_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numtaps_idx, uint16_t, numTaps, filtering_numtaps \ + , \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Taps: %d\n" \ + "Tap Delay: %d\n", \ + (int)blockSize, \ + (int)numTaps, \ + (int)FILTERING_MAX_TAP_DELAY); \ + \ + /* Initialize the FIR Instances */ \ + arm_fir_sparse_init_##suffix( \ + &fir_inst_fut, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, \ + (int32_t*)filtering_tap_delay, \ + FILTERING_MAX_TAP_DELAY, blockSize); \ + \ + JTEST_COUNT_CYCLES( \ + arm_fir_sparse_##suffix( \ + &fir_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + (void *) filtering_scratch, \ + blockSize)); \ + \ + arm_fir_sparse_init_##suffix( \ + &fir_inst_ref, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, \ + (int32_t*)filtering_tap_delay, \ + FILTERING_MAX_TAP_DELAY, blockSize); \ + \ + ref_fir_sparse_##suffix( \ + &fir_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + (void *) filtering_scratch, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize, \ + output_type))); \ + \ + return JTEST_TEST_PASSED; \ + } + +#define FIR_SPARSE2_DEFINE_TEST(suffix, output_type) \ + JTEST_DEFINE_TEST(arm_fir_sparse_##suffix##_test, \ + arm_fir_sparse_##suffix) \ + { \ + arm_fir_sparse_instance_##suffix fir_inst_fut = { 0 }; \ + arm_fir_sparse_instance_##suffix fir_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numtaps_idx, uint16_t, numTaps, filtering_numtaps \ + , \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Taps: %d\n" \ + "Tap Delay: %d\n", \ + (int)blockSize, \ + (int)numTaps, \ + (int)FILTERING_MAX_TAP_DELAY); \ + \ + /* Initialize the FIR Instances */ \ + arm_fir_sparse_init_##suffix( \ + &fir_inst_fut, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, \ + (int32_t*)filtering_tap_delay, \ + FILTERING_MAX_TAP_DELAY, blockSize); \ + \ + JTEST_COUNT_CYCLES( \ + arm_fir_sparse_##suffix( \ + &fir_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + (void *) filtering_scratch, \ + (void *) filtering_scratch2, \ + blockSize)); \ + \ + arm_fir_sparse_init_##suffix( \ + &fir_inst_ref, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, \ + (int32_t*)filtering_tap_delay, \ + FILTERING_MAX_TAP_DELAY, blockSize); \ + \ + ref_fir_sparse_##suffix( \ + &fir_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + (void *) filtering_scratch, \ + (void *) filtering_scratch2, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize, \ + output_type))); \ + \ + return JTEST_TEST_PASSED; \ + } + +FIR_DEFINE_TEST(f32,,float32_t); +FIR_DEFINE_TEST(q31,,q31_t); +FIR_DEFINE_TEST(q15,,q15_t); +FIR_DEFINE_TEST(q31,_fast,q31_t); +FIR_DEFINE_TEST(q15,_fast,q15_t); +FIR_DEFINE_TEST(q7,,q7_t); + +FIR_LATTICE_DEFINE_TEST(f32,float32_t); +FIR_LATTICE_DEFINE_TEST(q31,q31_t); +FIR_LATTICE_DEFINE_TEST(q15,q15_t); + +FIR_INTERPOLATE_DEFINE_TEST(f32,float32_t); +FIR_INTERPOLATE_DEFINE_TEST(q31,q31_t); +FIR_INTERPOLATE_DEFINE_TEST(q15,q15_t); + +FIR_DECIMATE_DEFINE_TEST(f32,,float32_t); +FIR_DECIMATE_DEFINE_TEST(q31,,q31_t); +FIR_DECIMATE_DEFINE_TEST(q15,,q15_t); +FIR_DECIMATE_DEFINE_TEST(q31,_fast,q31_t); +FIR_DECIMATE_DEFINE_TEST(q15,_fast,q15_t); + +FIR_SPARSE_DEFINE_TEST(f32,float32_t); +FIR_SPARSE_DEFINE_TEST(q31,q31_t); +FIR_SPARSE2_DEFINE_TEST(q15,q15_t); +FIR_SPARSE2_DEFINE_TEST(q7,q7_t); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(fir_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_fir_f32_test); + JTEST_TEST_CALL(arm_fir_q31_test); + JTEST_TEST_CALL(arm_fir_q15_test); + JTEST_TEST_CALL(arm_fir_q7_test); + JTEST_TEST_CALL(arm_fir_fast_q31_test); + JTEST_TEST_CALL(arm_fir_fast_q15_test); + + JTEST_TEST_CALL(arm_fir_lattice_f32_test); + JTEST_TEST_CALL(arm_fir_lattice_q31_test); + JTEST_TEST_CALL(arm_fir_lattice_q15_test); + + JTEST_TEST_CALL(arm_fir_interpolate_f32_test); + JTEST_TEST_CALL(arm_fir_interpolate_q31_test); + JTEST_TEST_CALL(arm_fir_interpolate_q15_test); + + JTEST_TEST_CALL(arm_fir_decimate_f32_test); + JTEST_TEST_CALL(arm_fir_decimate_q31_test); + JTEST_TEST_CALL(arm_fir_decimate_q15_test); + JTEST_TEST_CALL(arm_fir_decimate_fast_q31_test); + JTEST_TEST_CALL(arm_fir_decimate_fast_q15_test); + + JTEST_TEST_CALL(arm_fir_sparse_f32_test); + JTEST_TEST_CALL(arm_fir_sparse_q31_test); + JTEST_TEST_CALL(arm_fir_sparse_q15_test); + JTEST_TEST_CALL(arm_fir_sparse_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/iir_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/iir_tests.c new file mode 100644 index 0000000..8d31c3f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/iir_tests.c @@ -0,0 +1,76 @@ +#include "jtest.h" +#include "filtering_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "filtering_templates.h" +#include "type_abbrev.h" + +#define IIR_DEFINE_TEST(suffix, output_type) \ + JTEST_DEFINE_TEST(arm_iir_lattice_##suffix##_test, \ + arm_iir_lattice_##suffix) \ + { \ + arm_iir_lattice_instance_##suffix iir_inst_fut = { 0 }; \ + arm_iir_lattice_instance_##suffix iir_inst_ref = { 0 }; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, filtering_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numstages_idx, uint16_t, numStages, filtering_numstages \ + , \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Stages: %d\n", \ + (int)blockSize, \ + (int)numStages); \ + \ + /* Initialize the IIR Instances */ \ + arm_iir_lattice_init_##suffix( \ + &iir_inst_fut, numStages, (output_type*)filtering_coeffs_b_##suffix, \ + (output_type*)filtering_coeffs_c_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + JTEST_COUNT_CYCLES( \ + arm_iir_lattice_##suffix( \ + &iir_inst_fut, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_fut, \ + blockSize)); \ + \ + arm_iir_lattice_init_##suffix( \ + &iir_inst_ref, numStages, (output_type*)filtering_coeffs_b_##suffix, \ + (output_type*)filtering_coeffs_c_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + ref_iir_lattice_##suffix( \ + &iir_inst_ref, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_output_ref, \ + blockSize); \ + \ + FILTERING_SNR_COMPARE_INTERFACE( \ + blockSize, \ + output_type))); \ + \ + return JTEST_TEST_PASSED; \ + } + +IIR_DEFINE_TEST(f32, float32_t); +IIR_DEFINE_TEST(q31, q31_t); +IIR_DEFINE_TEST(q15, q15_t); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(iir_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_iir_lattice_f32_test); + JTEST_TEST_CALL(arm_iir_lattice_q31_test); + JTEST_TEST_CALL(arm_iir_lattice_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/lms_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/lms_tests.c new file mode 100644 index 0000000..06e96b6 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/filtering_tests/lms_tests.c @@ -0,0 +1,219 @@ +#include "jtest.h" +#include "filtering_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "filtering_templates.h" +#include "type_abbrev.h" + +static const float32_t mu_f32 = 0.00854f;//1.0f; +static const float32_t mu2_f32 = 1.0f; +static const q31_t mu_q31 = 0x7fffffff; +static const q15_t mu_q15 = 0x7fff; + +#define LMS_DEFINE_TEST(suffix, config_suffix, output_type, mu) \ + JTEST_DEFINE_TEST(arm_lms##config_suffix##_##suffix##_test, \ + arm_lms##config_suffix##_##suffix) \ + { \ + arm_lms##config_suffix##_instance_##suffix lms_inst_fut = { 0 }; \ + arm_lms##config_suffix##_instance_##suffix lms_inst_ref = { 0 }; \ + arm_fir_instance_##suffix fir_inst = { 0 }; \ + uint32_t i; \ + \ + TEMPLATE_DO_ARR_DESC( \ + blocksize_idx, uint32_t, blockSize, lms_blocksizes \ + , \ + TEMPLATE_DO_ARR_DESC( \ + numtaps_idx, uint16_t, numTaps, filtering_numtaps \ + , \ + /* Initialize the FIR Instances */ \ + arm_fir_init_##suffix( \ + &fir_inst, numTaps, \ + (output_type*)filtering_coeffs_##suffix, \ + (void *) filtering_pState, blockSize); \ + \ + ref_fir_##suffix( \ + &fir_inst, \ + (void *) filtering_##suffix##_inputs, \ + (void *) filtering_input_lms, \ + blockSize); \ + \ + for(i=0;i> 6; \ + } \ + \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Number of Taps: %d\n" \ + "Post Shift: %d\n", \ + (int)blockSize, \ + (int)numTaps, \ + (int)postShift); \ + \ + /* Initialize the LMS Instances */ \ + arm_lms##config_suffix##_init_##suffix( \ + &lms_inst_fut, numTaps, \ + (output_type*)filtering_coeffs_lms, \ + (void *) filtering_pState, mu_##suffix, blockSize, postShift); \ + \ + JTEST_COUNT_CYCLES( \ + arm_lms##config_suffix##_##suffix( \ + &lms_inst_fut, \ + (void *) filtering_output_f32_fut, \ + (void *) filtering_input_lms, \ + (void *) filtering_output_fut, \ + (void *) ((output_type*)filtering_output_fut+blockSize), \ + blockSize)); \ + \ + for(i=0;i= 6010050) && !defined (__MICROLIB) +__asm(" .global __ARM_use_no_argv\n"); +#endif + + +void debug_init(void) +{ + uint32_t * SHCSR_ptr = (uint32_t *) 0xE000ED24; /* System Handler Control and State Register */ + *SHCSR_ptr |= 0x70000; /* Enable UsageFault, BusFault, and MemManage fault*/ +} + +int main(void) +{ +#if !defined(FILEIO) + debug_init(); +#endif + + JTEST_INIT(); /* Initialize test framework. */ + + JTEST_GROUP_CALL(all_tests); /* Run all tests. */ + + JTEST_ACT_EXIT_FW(); /* Exit test framework. */ +#if !defined(FILEIO) + while (1); /* Never return. */ +#endif +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/math_helper.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/math_helper.c new file mode 100644 index 0000000..4b73d49 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/math_helper.c @@ -0,0 +1,509 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010 ARM Limited. All rights reserved. +* +* $Date: 29. November 2010 +* $Revision: V1.0.3 +* +* Project: CMSIS DSP Library +* +* Title: math_helper.c +* +* Description: Definition of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Version 1.0.3 2010/11/29 +* Re-organized the CMSIS folders and updated documentation. +* +* Version 1.0.2 2010/11/11 +* Documentation updated. +* +* Version 1.0.1 2010/10/05 +* Production release and review comments incorporated. +* +* Version 1.0.0 2010/09/20 +* Production release and review comments incorporated. +* +* Version 0.0.7 2010/06/10 +* Misra-C changes done +* -------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +* Include standard header files +* -------------------------------------------------------------------- */ +#include + +/* ---------------------------------------------------------------------- +* Include project header files +* -------------------------------------------------------------------- */ +#include "math_helper.h" + +/** + * @brief Caluclation of SNR + * @param float* Pointer to the reference buffer + * @param float* Pointer to the test buffer + * @param uint32_t total number of samples + * @return float SNR + * The function Caluclates signal to noise ratio for the reference output + * and test output + */ + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) +{ + float EnergySignal = 0.0, EnergyError = 0.0; + uint32_t i; + float SNR; + int temp; + int *test; + + for (i = 0; i < buffSize; i++) + { + /* Checking for a NAN value in pRef array */ + test = (int *)(&pRef[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(100000.0); + } + + /* Checking for a NAN value in pTest array */ + test = (int *)(&pTest[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(100000.0); + } + EnergySignal += pRef[i] * pRef[i]; + EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); + } + + /* Checking for a NAN value in EnergyError */ + test = (int *)(&EnergyError); + temp = *test; + + if (temp == 0x7FC00000) + { + return(100000.0); + } + + + SNR = 10 * log10f (EnergySignal / EnergyError); + + /* Checking for a NAN value in SNR */ + test = (int *)(&SNR); + temp = *test; + + if (temp == 0x7FC00000) + { + return(100000.0); + } + + return (SNR); + +} + + + +double arm_snr_f64(double *pRef, double *pTest, uint32_t buffSize) +{ + double EnergySignal = 0.0, EnergyError = 0.0; + uint32_t i; + double SNR; + int temp; + int *test; + + for (i = 0; i < buffSize; i++) + { + /* Checking for a NAN value in pRef array */ + test = (int *)(&pRef[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(100000.0); + } + + /* Checking for a NAN value in pTest array */ + test = (int *)(&pTest[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(100000.0); + } + EnergySignal += pRef[i] * pRef[i]; + EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); + } + + /* Checking for a NAN value in EnergyError */ + test = (int *)(&EnergyError); + temp = *test; + + if (temp == 0x7FC00000) + { + return(100000.0); + } + + + SNR = 10 * log10 (EnergySignal / EnergyError); + + /* Checking for a NAN value in SNR */ + test = (int *)(&SNR); + temp = *test; + + if (temp == 0x7FC00000) + { + return(10000.0); + } + + return (SNR); + +} + +/** + * @brief Provide guard bits for Input buffer + * @param q15_t* Pointer to input buffer + * @param uint32_t blockSize + * @param uint32_t guard_bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Converts float to fixed in q12.20 format + * @param uint32_t number of samples in the buffer + * @return none + * The function converts floating point values to fixed point(q12.20) values + */ + +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1048576.0f corresponds to pow(2, 20) */ + pOut[i] = (q31_t) (pIn[i] * 1048576.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 1.0) + { + pOut[i] = 0x000FFFFF; + } + } +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param q15_t* Pointer to Ref buffer + * @param q15_t* Pointer to Test buffer + * @param uint32_t number of samples in the buffer + * @return none + */ + +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param q31_t* Pointer to Ref buffer + * @param q31_t* Pointer to Test buffer + * @param uint32_t number of samples in the buffer + * @return none + */ + +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Provide guard bits for Input buffer + * @param q31_t* Pointer to input buffer + * @param uint32_t blockSize + * @param uint32_t guard_bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q31 (q31_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Provide guard bits for Input buffer + * @param q31_t* Pointer to input buffer + * @param uint32_t blockSize + * @param uint32_t guard_bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q7 (q7_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + + + +/** + * @brief Caluclates number of guard bits + * @param uint32_t number of additions + * @return none + * The function Caluclates the number of guard bits + * depending on the numtaps + */ + +uint32_t arm_calc_guard_bits (uint32_t num_adds) +{ + uint32_t i = 1, j = 0; + + if (num_adds == 1) + { + return (0); + } + + while (i < num_adds) + { + i = i * 2; + j++; + } + + return (j); +} + +/** + * @brief Converts Q15 to floating-point + * @param uint32_t number of samples in the buffer + * @return none + */ + +void arm_apply_guard_bits (float32_t * pIn, + uint32_t numSamples, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); + } +} + +/** + * @brief Calculates pow(2, numShifts) + * @param uint32_t number of shifts + * @return pow(2, numShifts) + */ +uint32_t arm_calc_2pow(uint32_t numShifts) +{ + + uint32_t i, val = 1; + + for (i = 0; i < numShifts; i++) + { + val = val * 2; + } + + return(val); +} + + + +/** + * @brief Converts float to fixed q14 + * @param uint32_t number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q14 (float *pIn, q15_t * pOut, + uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 16384.0f corresponds to pow(2, 14) */ + pOut[i] = (q15_t) (pIn[i] * 16384.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFF; + } + + } + +} + + +/** + * @brief Converts float to fixed q30 format + * @param uint32_t number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q30 (float *pIn, q31_t * pOut, + uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Converts float to fixed q30 format + * @param uint32_t number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q29 (float *pIn, q31_t * pOut, + uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 536870912.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 4.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + + +/** + * @brief Converts float to fixed q28 format + * @param uint32_t number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q28 (float *pIn, q31_t * pOut, + uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 268435456.0f corresponds to pow(2, 28) */ + pOut[i] = (q31_t) (pIn[i] * 268435456.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 8.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Clip the float values to +/- 1 + * @param pIn input buffer + * @param numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_clip_f32 (float *pIn, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + if (pIn[i] > 1.0f) + { + pIn[i] = 1.0; + } + else if ( pIn[i] < -1.0f) + { + pIn[i] = -1.0; + } + + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_add_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_add_tests.c new file mode 100644 index 0000000..c536899 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_add_tests.c @@ -0,0 +1,31 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MAT_ADD_TEST(suffix) \ + MATRIX_DEFINE_TEST_TEMPLATE_ELT2( \ + mat_add, \ + suffix, \ + MATRIX_TEST_CONFIG_ADDITIVE_OUTPUT, \ + MATRIX_TEST_VALID_ADDITIVE_DIMENSIONS, \ + MATRIX_COMPARE_INTERFACE) + +JTEST_ARM_MAT_ADD_TEST(f32); +JTEST_ARM_MAT_ADD_TEST(q31); +JTEST_ARM_MAT_ADD_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_add_tests) +{ + JTEST_TEST_CALL(arm_mat_add_f32_test); + JTEST_TEST_CALL(arm_mat_add_q31_test); + JTEST_TEST_CALL(arm_mat_add_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_cmplx_mult_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_cmplx_mult_tests.c new file mode 100644 index 0000000..50cd57e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_cmplx_mult_tests.c @@ -0,0 +1,59 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MAT_CMPLX_MULT_TEST(suffix, comparison_interface) \ + MATRIX_DEFINE_TEST_TEMPLATE_ELT2( \ + mat_cmplx_mult, \ + suffix, \ + MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT, \ + MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS, \ + comparison_interface) + +JTEST_ARM_MAT_CMPLX_MULT_TEST(f32, MATRIX_SNR_COMPARE_INTERFACE); +JTEST_ARM_MAT_CMPLX_MULT_TEST(q31, MATRIX_COMPARE_INTERFACE); + +/*--------------------------------------------------------------------------------*/ +/* Q15 Uses a Different interface than the others. */ +/*--------------------------------------------------------------------------------*/ + +#define ARM_mat_cmplx_mult_q15_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, \ + (void *) &matrix_output_fut, \ + (q15_t *) matrix_output_scratch) + +JTEST_DEFINE_TEST(arm_mat_cmplx_mult_q15_test, arm_mat_cmplx_mult_q15) +{ + MATRIX_TEST_TEMPLATE_ELT2( + matrix_q15_a_inputs, + matrix_q15_b_inputs, + arm_matrix_instance_q15 * , + arm_matrix_instance_q15, + TYPE_FROM_ABBREV(q15), + arm_mat_cmplx_mult_q15, + ARM_mat_cmplx_mult_q15_INPUT_INTERFACE, + ref_mat_cmplx_mult_q15, + REF_mat_cmplx_mult_INPUT_INTERFACE, + MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT, + MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS, + MATRIX_COMPARE_INTERFACE); +} + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_cmplx_mult_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mat_cmplx_mult_f32_test); + JTEST_TEST_CALL(arm_mat_cmplx_mult_q31_test); + JTEST_TEST_CALL(arm_mat_cmplx_mult_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_init_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_init_tests.c new file mode 100644 index 0000000..7d879ee --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_init_tests.c @@ -0,0 +1,58 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MAT_INIT_TEST(suffix) \ + JTEST_DEFINE_TEST(arm_mat_init_##suffix##_test, \ + arm_mat_init_##suffix) \ + { \ + const uint16_t rows = 4; \ + const uint16_t cols = 2; \ + arm_matrix_instance_##suffix matrix = {0}; \ + /* TYPE_FROM_ABBREV(suffix) data[rows*cols] = {0}; */ \ + TYPE_FROM_ABBREV(suffix) data[4*2] = {0}; \ + \ + arm_mat_init_##suffix(&matrix, \ + rows, \ + cols, \ + data); \ + \ + JTEST_DUMP_STRF("Matrix Dimensions: %dx%d\n", \ + (int)matrix.numRows, \ + (int)matrix.numCols); \ + \ + if ((matrix.numRows == rows) && \ + (matrix.numCols == cols) && \ + (matrix.pData == data)) \ + { \ + return JTEST_TEST_PASSED; \ + } \ + else \ + { \ + return JTEST_TEST_FAILED; \ + } \ + \ + } + +JTEST_ARM_MAT_INIT_TEST(f32); +JTEST_ARM_MAT_INIT_TEST(q31); +JTEST_ARM_MAT_INIT_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_init_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mat_init_f32_test); + JTEST_TEST_CALL(arm_mat_init_q31_test); + JTEST_TEST_CALL(arm_mat_init_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_inverse_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_inverse_tests.c new file mode 100644 index 0000000..372ac1d --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_inverse_tests.c @@ -0,0 +1,92 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +JTEST_DEFINE_TEST(arm_mat_inverse_f32_test, arm_mat_inverse_f32) +{ + TEMPLATE_DO_ARR_DESC( + mat_idx, arm_matrix_instance_f32 *, mat_ptr, matrix_f32_invertible_inputs + , + JTEST_DUMP_STRF("Matrix Dimensions: %dx%d\n", + (int)mat_ptr->numRows, + (int)mat_ptr->numCols); + + if (MATRIX_TEST_VALID_SQUARE_DIMENSIONS(arm_matrix_instance_f32 *, mat_ptr)) + { + MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT(arm_matrix_instance_f32 *, mat_ptr); + + /* arm_mat_inverse_f32() modifies its source input. Use the scratch + * buffer to store a copy of the intended input. */ + { + float32_t * original_pdata_ptr = mat_ptr->pData; + + memcpy(matrix_output_scratch, + mat_ptr->pData, + mat_ptr->numRows * mat_ptr->numCols * sizeof(float32_t)); + mat_ptr->pData = (void*) &matrix_output_scratch; + + JTEST_COUNT_CYCLES(arm_mat_inverse_f32(mat_ptr, &matrix_output_fut)); + mat_ptr->pData = original_pdata_ptr; + } + + ref_mat_inverse_f32(mat_ptr, &matrix_output_ref); + + MATRIX_SNR_COMPARE_INTERFACE(arm_matrix_instance_f32, + float32_t); + }); + + return JTEST_TEST_PASSED; +} + +JTEST_DEFINE_TEST(arm_mat_inverse_f64_test, arm_mat_inverse_f64) +{ + TEMPLATE_DO_ARR_DESC( + mat_idx, arm_matrix_instance_f64 *, mat_ptr, matrix_f64_invertible_inputs + , + JTEST_DUMP_STRF("Matrix Dimensions: %dx%d\n", + (int)mat_ptr->numRows, + (int)mat_ptr->numCols); + + if (MATRIX_TEST_VALID_SQUARE_DIMENSIONS(arm_matrix_instance_f64 *, mat_ptr)) + { + MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT(arm_matrix_instance_f64 *, mat_ptr); + + /* arm_mat_inverse_f64() modifies its source input. Use the scratch + * buffer to store a copy of the intended input. */ + { + float64_t * original_pdata_ptr = mat_ptr->pData; + + memcpy(matrix_output_scratch, + mat_ptr->pData, + mat_ptr->numRows * mat_ptr->numCols * sizeof(float64_t)); + mat_ptr->pData = (void*) &matrix_output_scratch; + + JTEST_COUNT_CYCLES(arm_mat_inverse_f64(mat_ptr, &matrix_output_fut64)); + mat_ptr->pData = original_pdata_ptr; + } + + ref_mat_inverse_f64(mat_ptr, &matrix_output_ref64); + + MATRIX_DBL_SNR_COMPARE_INTERFACE(arm_matrix_instance_f64); + }); + + return JTEST_TEST_PASSED; +} + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_inverse_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mat_inverse_f32_test); + JTEST_TEST_CALL(arm_mat_inverse_f64_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_mult_fast_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_mult_fast_tests.c new file mode 100644 index 0000000..313aa04 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_mult_fast_tests.c @@ -0,0 +1,57 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MAT_MULT_FAST_TEST(suffix) \ + MATRIX_DEFINE_TEST_TEMPLATE_ELT2( \ + mat_mult_fast, \ + suffix, \ + MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT, \ + MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS, \ + MATRIX_SNR_COMPARE_INTERFACE) + +JTEST_ARM_MAT_MULT_FAST_TEST(q31); + +/*--------------------------------------------------------------------------------*/ +/* Q15 Uses a Different interface than the others. */ +/*--------------------------------------------------------------------------------*/ + +#define ARM_mat_mult_fast_q15_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, \ + (void *) &matrix_output_fut, \ + (q15_t *) matrix_output_scratch) + +JTEST_DEFINE_TEST(arm_mat_mult_fast_q15_test, arm_mat_mult_fast_q15) +{ + MATRIX_TEST_TEMPLATE_ELT2( + matrix_q15_a_inputs, + matrix_q15_b_inputs, + arm_matrix_instance_q15 * , + arm_matrix_instance_q15, + TYPE_FROM_ABBREV(q15), + arm_mat_mult_fast_q15, + ARM_mat_mult_fast_q15_INPUT_INTERFACE, + ref_mat_mult_fast_q15, + REF_mat_mult_fast_INPUT_INTERFACE, + MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT, + MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS, + MATRIX_SNR_COMPARE_INTERFACE); +} + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_mult_fast_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mat_mult_fast_q31_test); + JTEST_TEST_CALL(arm_mat_mult_fast_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_mult_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_mult_tests.c new file mode 100644 index 0000000..c74bdc8 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_mult_tests.c @@ -0,0 +1,59 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MAT_MULT_TEST(suffix) \ + MATRIX_DEFINE_TEST_TEMPLATE_ELT2( \ + mat_mult, \ + suffix, \ + MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT, \ + MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS, \ + MATRIX_COMPARE_INTERFACE) + +JTEST_ARM_MAT_MULT_TEST(f32); +JTEST_ARM_MAT_MULT_TEST(q31); + +/*--------------------------------------------------------------------------------*/ +/* Q15 Uses a Different interface than the others. */ +/*--------------------------------------------------------------------------------*/ + +#define ARM_mat_mult_q15_INPUT_INTERFACE(input_a_ptr, input_b_ptr) \ + PAREN(input_a_ptr, input_b_ptr, \ + (void *) &matrix_output_fut, \ + (q15_t *) matrix_output_scratch) + +JTEST_DEFINE_TEST(arm_mat_mult_q15_test, arm_mat_mult_q15) +{ + MATRIX_TEST_TEMPLATE_ELT2( + matrix_q15_a_inputs, + matrix_q15_b_inputs, + arm_matrix_instance_q15 * , + arm_matrix_instance_q15, + TYPE_FROM_ABBREV(q15), + arm_mat_mult_q15, + ARM_mat_mult_q15_INPUT_INTERFACE, + ref_mat_mult_q15, + REF_mat_mult_INPUT_INTERFACE, + MATRIX_TEST_CONFIG_MULTIPLICATIVE_OUTPUT, + MATRIX_TEST_VALID_MULTIPLICATIVE_DIMENSIONS, + MATRIX_COMPARE_INTERFACE); +} + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_mult_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mat_mult_f32_test); + JTEST_TEST_CALL(arm_mat_mult_q31_test); + JTEST_TEST_CALL(arm_mat_mult_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_scale_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_scale_tests.c new file mode 100644 index 0000000..63fba94 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_scale_tests.c @@ -0,0 +1,90 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +/* This is for the two fixed point cases */ +#define JTEST_ARM_MAT_SCALE_TEST(suffix,type) \ + JTEST_DEFINE_TEST(arm_mat_scale_##suffix##_test, arm_mat_scale_##suffix) \ + { \ + uint32_t i,j; \ + \ + TEMPLATE_DO_ARR_DESC( \ + mat_idx, arm_matrix_instance_##suffix *, \ + mat_ptr, matrix_##suffix##_b_inputs \ + , \ + MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT( \ + arm_matrix_instance_##suffix *, mat_ptr); \ + \ + for(i=0;inumRows, \ + (int)mat_ptr->numCols); \ + \ + JTEST_COUNT_CYCLES( \ + arm_mat_scale_##suffix(mat_ptr, \ + matrix_##suffix##_scale_values[i], \ + matrix_shift_values[j], \ + (arm_matrix_instance_##suffix*) &matrix_output_fut)); \ + \ + ref_mat_scale_##suffix(mat_ptr, \ + matrix_##suffix##_scale_values[i], \ + matrix_shift_values[j], \ + (arm_matrix_instance_##suffix*) &matrix_output_ref); \ + \ + MATRIX_SNR_COMPARE_INTERFACE(arm_matrix_instance_##suffix, \ + type); \ + } \ + }); \ + \ + return JTEST_TEST_PASSED; \ + } + +JTEST_DEFINE_TEST(arm_mat_scale_f32_test, arm_mat_scale_f32) +{ + uint32_t i; + + TEMPLATE_DO_ARR_DESC( + mat_idx, arm_matrix_instance_f32 *, mat_ptr, matrix_f32_b_inputs + , + MATRIX_TEST_CONFIG_SAMESIZE_OUTPUT(arm_matrix_instance_f32 *, mat_ptr); + + for(i=0;inumRows, + (int)mat_ptr->numCols); + JTEST_COUNT_CYCLES(arm_mat_scale_f32(mat_ptr, matrix_f32_scale_values[i], &matrix_output_fut)); + + ref_mat_scale_f32(mat_ptr, matrix_f32_scale_values[i], &matrix_output_ref); + + MATRIX_SNR_COMPARE_INTERFACE(arm_matrix_instance_f32, + float32_t); + }); + + return JTEST_TEST_PASSED; +} + +JTEST_ARM_MAT_SCALE_TEST(q31,q31_t); +JTEST_ARM_MAT_SCALE_TEST(q15,q15_t); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_scale_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mat_scale_f32_test); + JTEST_TEST_CALL(arm_mat_scale_q31_test); + JTEST_TEST_CALL(arm_mat_scale_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_sub_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_sub_tests.c new file mode 100644 index 0000000..245c28e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_sub_tests.c @@ -0,0 +1,34 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MAT_SUB_TEST(suffix) \ + MATRIX_DEFINE_TEST_TEMPLATE_ELT2( \ + mat_sub, \ + suffix, \ + MATRIX_TEST_CONFIG_ADDITIVE_OUTPUT, \ + MATRIX_TEST_VALID_ADDITIVE_DIMENSIONS, \ + MATRIX_COMPARE_INTERFACE) + +JTEST_ARM_MAT_SUB_TEST(f32); +JTEST_ARM_MAT_SUB_TEST(q31); +JTEST_ARM_MAT_SUB_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_sub_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mat_sub_f32_test); + JTEST_TEST_CALL(arm_mat_sub_q31_test); + JTEST_TEST_CALL(arm_mat_sub_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_trans_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_trans_tests.c new file mode 100644 index 0000000..e49c80b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/mat_trans_tests.c @@ -0,0 +1,33 @@ +#include "jtest.h" +#include "matrix_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "matrix_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MAT_TRANS_TEST(suffix) \ + MATRIX_DEFINE_TEST_TEMPLATE_ELT1( \ + mat_trans, \ + suffix, \ + MATRIX_TEST_CONFIG_TRANSPOSE_OUTPUT, \ + MATRIX_TEST_VALID_DIMENSIONS_ALWAYS) + +JTEST_ARM_MAT_TRANS_TEST(f32); +JTEST_ARM_MAT_TRANS_TEST(q31); +JTEST_ARM_MAT_TRANS_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mat_trans_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mat_trans_f32_test); + JTEST_TEST_CALL(arm_mat_trans_q31_test); + JTEST_TEST_CALL(arm_mat_trans_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/matrix_test_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/matrix_test_common_data.c new file mode 100644 index 0000000..123c0d7 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/matrix_test_common_data.c @@ -0,0 +1,259 @@ +#include "arm_math.h" +#include "matrix_test_data.h" +#include "type_abbrev.h" + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + +MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_fut_data[2*MATRIX_TEST_MAX_ELTS] = {0}; +MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_ref_data[2*MATRIX_TEST_MAX_ELTS] = {0}; +MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_scratch[MATRIX_TEST_MAX_ELTS] = {0}; + +MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_f32_fut[MATRIX_TEST_MAX_ELTS]; +MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_output_f32_ref[MATRIX_TEST_MAX_ELTS]; + +arm_matrix_instance_f32 matrix_output_fut = { + 0, + 0, + (float32_t *) &matrix_output_fut_data +}; + +arm_matrix_instance_f32 matrix_output_ref = { + 0, + 0, + (float32_t *) &matrix_output_ref_data +}; + +arm_matrix_instance_f64 matrix_output_fut64 = { + 0, + 0, + (float64_t *) &matrix_output_fut_data +}; + +arm_matrix_instance_f64 matrix_output_ref64 = { + 0, + 0, + (float64_t *) &matrix_output_ref_data +}; + +/*--------------------------------------------------------------------------------*/ +/* Data Buckets */ +/*--------------------------------------------------------------------------------*/ + +/** + * Pool of random data to base matrix inputs from. + */ +float32_t matrix_f32_100_rand[100] = { +/* -45.0345569674258, first number negativ causes fault in 1x1 multiplay with 0. + AC6 DSP_Lib calculatas a -0.0 which is not a 0.0 in memcmp! + */ + 45.0345569674258, -11.0261163038747, -14.6841428777929, + 0.0345569674258, -11.0261163038747, -14.6841428777929, + -20.3679194392227, 27.5712678608402, -12.1390617339732, + -19.8753669720509, 42.3379642103244, -23.7788252219155, + -23.7517765301667, 40.2716109915281, -25.8308714086167, + 32.1194040197959, 24.4692807074156, -1.32083675968276, + 31.1580458282477, -2.90766514824093, -6.97926086704160, + 10.2843089382083, 30.1014622769739, 44.4787189721646, + -9.60878544118853, -48.4596562348445, -31.1044984967456, + -6.41414114190809, 3.28255887994549, -26.9511839788442, + -31.5183679875864, 21.1215780433683, -47.0779722437854, + -0.913590753192006, -40.3545474831611, -45.6976198342192, + 18.6775433365315, -5.32162505701938, -14.9272896423117, + 34.4308792695389, 40.4880968679893, -27.8253265982760, + 42.8854139478045, -1.07473615999811, -36.8026707393665, + -33.1009970537296, -31.6488844262730, -19.3650527983443, + 43.9001561999887, -30.5235710432951, 47.9748378356085, + -38.2582349144194, 23.0330862855453, -16.2280590178623, + 44.2050590775485, 14.9115474956452, -13.1515403509664, + 0.850865538112700, 37.5942811492984, -27.4078219027601, + -6.11300268738968, -20.3324126781673, -1.13910261964209, + 40.0053846417662, 45.6134540229802, 23.1722385658670, + 12.5618560729690, 1.07715641721097, 5.01563428984222, + -32.9291952852141, -38.8880776559401, -18.1221698074118, + 7.85250610234389, -13.0753218879785, 7.52085950784656, + 14.7745963136307, 28.0227435151377, 31.7627708322262, + 12.2475086001227, -27.2335702183447, -24.1935304087933, + -7.58332402861928, -26.2716420228479, -38.8797244706213, + -44.0220457052844, -4.90762935690551, -41.8874231134215, + 29.4831416883453, 8.70447045314168, -6.43013158961009, + -9.12801538874479, 0.785828466111815, -4.11511718200689, + 28.0252068321138, -26.5220086627594, 4.70088922863450, + 42.9385970968730, 14.4318130193692, -29.2257707266972, + 46.3088539286913 +}; + +float64_t matrix_f64_100_rand[100] = { +// -45.0345569674258, -11.0261163038747, -14.6841428777929, + 45.0345569674258, -11.0261163038747, -14.6841428777929, + 0.0345569674258, -11.0261163038747, -14.6841428777929, + -20.3679194392227, 27.5712678608402, -12.1390617339732, + -19.8753669720509, 42.3379642103244, -23.7788252219155, + -23.7517765301667, 40.2716109915281, -25.8308714086167, + 32.1194040197959, 24.4692807074156, -1.32083675968276, + 31.1580458282477, -2.90766514824093, -6.97926086704160, + 10.2843089382083, 30.1014622769739, 44.4787189721646, + -9.60878544118853, -48.4596562348445, -31.1044984967456, + -6.41414114190809, 3.28255887994549, -26.9511839788442, + -31.5183679875864, 21.1215780433683, -47.0779722437854, + -0.913590753192006, -40.3545474831611, -45.6976198342192, + 18.6775433365315, -5.32162505701938, -14.9272896423117, + 34.4308792695389, 40.4880968679893, -27.8253265982760, + 42.8854139478045, -1.07473615999811, -36.8026707393665, + -33.1009970537296, -31.6488844262730, -19.3650527983443, + 43.9001561999887, -30.5235710432951, 47.9748378356085, + -38.2582349144194, 23.0330862855453, -16.2280590178623, + 44.2050590775485, 14.9115474956452, -13.1515403509664, + 0.850865538112700, 37.5942811492984, -27.4078219027601, + -6.11300268738968, -20.3324126781673, -1.13910261964209, + 40.0053846417662, 45.6134540229802, 23.1722385658670, + 12.5618560729690, 1.07715641721097, 5.01563428984222, + -32.9291952852141, -38.8880776559401, -18.1221698074118, + 7.85250610234389, -13.0753218879785, 7.52085950784656, + 14.7745963136307, 28.0227435151377, 31.7627708322262, + 12.2475086001227, -27.2335702183447, -24.1935304087933, + -7.58332402861928, -26.2716420228479, -38.8797244706213, + -44.0220457052844, -4.90762935690551, -41.8874231134215, + 29.4831416883453, 8.70447045314168, -6.43013158961009, + -9.12801538874479, 0.785828466111815, -4.11511718200689, + 28.0252068321138, -26.5220086627594, 4.70088922863450, + 42.9385970968730, 14.4318130193692, -29.2257707266972, + 46.3088539286913 +}; + +MATRIX_TEST_BIGGEST_INPUT_TYPE matrix_zeros[MATRIX_TEST_MAX_ELTS] = {0}; + +const float32_t matrix_f32_scale_values[MATRIX_MAX_COEFFS_LEN] = +{ + 43.0264275639 , -17.0525215570 , -94.8488973910 , -8.1924989580 , + 7.2830326091 , 66.8368719314 , 33.9778190671 , 117.8652289772 , + -129.6077797465, -14.6420815368 , 18.0239223278 , 1.0000000000 , + 55.0375037651 , 1.8674609862 , 0.00000000000 , -33.5750364909 +}; + +const q31_t matrix_q31_scale_values[MATRIX_MAX_COEFFS_LEN] = +{ + 0x0201DC90, 0x211F0D7C, 0x80000000, 0xF573B824, + 0xE85ED05B, 0x311DFB52, 0x3529E750, 0x00000000, + 0x7FFFFFFF, 0x21FA525A, 0x0971FD45, 0x05547B68, + 0x270C6366, 0x06FDD5A6, 0xF7025315, 0xB1155A1E +}; + +const q15_t matrix_q15_scale_values[MATRIX_MAX_COEFFS_LEN] = +{ + 0x0201, 0x211F, 0x8000, 0xF573, + 0xE85E, 0x311D, 0x3529, 0x0000, + 0x7FFF, 0x21FA, 0x0971, 0x0554, + 0x270C, 0x06FD, 0xF702, 0xB115 +}; + +const int32_t matrix_shift_values[MATRIX_MAX_SHIFTS_LEN] = +{ + -16, -7, 0, 7, 16 +}; + +/*--------------------------------------------------------------------------------*/ +/* Matrix Definitions */ +/*--------------------------------------------------------------------------------*/ + +/** + * Define matrices by suffix (f32, q31, q15) for use in test cases. + * + * The rand1 and rand2 suffixes get their data from the same pool of random + * data, but their starting points differ by 1 element. + * + * Makes available: + * - matrix_`suffix`_1x1_rand1/2 + * - matrix_`suffix`_1x4_rand1/2 + * - matrix_`suffix`_2x4_rand1/2 + * - matrix_`suffix`_4x4_rand1/2 + */ +#define MATRIX_DEFINE_MATRICES(suffix) \ + arm_matrix_instance_##suffix matrix_##suffix##_1x1_rand1 = \ + {1, 1, (TYPE_FROM_ABBREV(suffix) *) matrix_f32_100_rand }; \ + arm_matrix_instance_##suffix matrix_##suffix##_1x1_rand2 = \ + {1, 1, (TYPE_FROM_ABBREV(suffix) *) (matrix_f32_100_rand+1)}; \ + arm_matrix_instance_##suffix matrix_##suffix##_1x1_zeros = \ + {1, 1, (TYPE_FROM_ABBREV(suffix) *) matrix_zeros}; \ + \ + arm_matrix_instance_##suffix matrix_##suffix##_1x4_rand1 = \ + {1, 4, (TYPE_FROM_ABBREV(suffix) *) matrix_f32_100_rand }; \ + arm_matrix_instance_##suffix matrix_##suffix##_1x4_rand2 = \ + {1, 4, (TYPE_FROM_ABBREV(suffix) *) (matrix_f32_100_rand+1)}; \ + arm_matrix_instance_##suffix matrix_##suffix##_1x4_zeros = \ + {1, 4, (TYPE_FROM_ABBREV(suffix) *) matrix_zeros}; \ + \ + arm_matrix_instance_##suffix matrix_##suffix##_2x4_rand1 = \ + {2, 4, (TYPE_FROM_ABBREV(suffix) *) matrix_f32_100_rand }; \ + arm_matrix_instance_##suffix matrix_##suffix##_2x4_rand2 = \ + {2, 4, (TYPE_FROM_ABBREV(suffix) *) (matrix_f32_100_rand+1)}; \ + arm_matrix_instance_##suffix matrix_##suffix##_2x4_zeros = \ + {2, 4, (TYPE_FROM_ABBREV(suffix) *) matrix_zeros}; \ + \ + arm_matrix_instance_##suffix matrix_##suffix##_4x4_rand1 = \ + {4, 4, (TYPE_FROM_ABBREV(suffix) *) matrix_f32_100_rand }; \ + arm_matrix_instance_##suffix matrix_##suffix##_4x4_rand2 = \ + {4, 4, (TYPE_FROM_ABBREV(suffix) *) (matrix_f32_100_rand+1)}; \ + arm_matrix_instance_##suffix matrix_##suffix##_4x4_zeros = \ + {4, 4, (TYPE_FROM_ABBREV(suffix) *) matrix_zeros} + +MATRIX_DEFINE_MATRICES(f64); +MATRIX_DEFINE_MATRICES(f32); +MATRIX_DEFINE_MATRICES(q31); +MATRIX_DEFINE_MATRICES(q15); + +/*--------------------------------------------------------------------------------*/ +/* Matrix-Input Arrays */ +/*--------------------------------------------------------------------------------*/ + +/* Define Input #ARR_DESC_t by suffix. + * + * Taking inputs in parallel from the 'a' and 'b' arrays yields the following + * test cases: + * - 1x1 multiplication by zero + * - 1x1 multiplication between random numbers + * - 1x1 * 1x4 valid dimension interaction + * - 1x1 * 2x4 invalid dimension interaction + * - 2x4 * 4x4 larger valid dimension interaction + * - 4x4 * 4x4 larger valid dimension interaction + */ +#define MATRIX_DEFINE_INPUTS(suffix) \ + ARR_DESC_DEFINE(arm_matrix_instance_##suffix *, \ + matrix_##suffix##_a_inputs, \ + 6, \ + CURLY( \ + &matrix_##suffix##_1x1_rand1, \ + &matrix_##suffix##_1x1_rand1, \ + &matrix_##suffix##_1x1_rand1, \ + &matrix_##suffix##_1x1_rand1, \ + &matrix_##suffix##_2x4_rand1, \ + &matrix_##suffix##_4x4_rand1 \ + )); \ + \ + ARR_DESC_DEFINE(arm_matrix_instance_##suffix *, \ + matrix_##suffix##_b_inputs, \ + 6, \ + CURLY( \ + &matrix_##suffix##_1x1_zeros, \ + &matrix_##suffix##_1x1_rand2, \ + &matrix_##suffix##_1x4_rand2, \ + &matrix_##suffix##_2x4_rand2, \ + &matrix_##suffix##_4x4_rand2, \ + &matrix_##suffix##_4x4_rand2 \ + )); \ + \ + ARR_DESC_DEFINE(arm_matrix_instance_##suffix *, \ + matrix_##suffix##_invertible_inputs, \ + 4, \ + CURLY( \ + &matrix_##suffix##_1x1_rand1, \ + &matrix_##suffix##_1x1_rand2, \ + &matrix_##suffix##_4x4_rand1, \ + &matrix_##suffix##_4x4_rand2 \ + )) \ + +MATRIX_DEFINE_INPUTS(f64); +MATRIX_DEFINE_INPUTS(f32); +MATRIX_DEFINE_INPUTS(q31); +MATRIX_DEFINE_INPUTS(q15); diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/matrix_test_group.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/matrix_test_group.c new file mode 100644 index 0000000..c87439d --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/matrix_tests/matrix_test_group.c @@ -0,0 +1,19 @@ +#include "jtest.h" +#include "matrix_tests.h" + +JTEST_DEFINE_GROUP(matrix_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_GROUP_CALL(mat_add_tests); + JTEST_GROUP_CALL(mat_cmplx_mult_tests); + JTEST_GROUP_CALL(mat_init_tests); + JTEST_GROUP_CALL(mat_inverse_tests); + JTEST_GROUP_CALL(mat_mult_tests); + JTEST_GROUP_CALL(mat_mult_fast_tests); + JTEST_GROUP_CALL(mat_sub_tests); + JTEST_GROUP_CALL(mat_trans_tests); + JTEST_GROUP_CALL(mat_scale_tests); + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/max_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/max_tests.c new file mode 100644 index 0000000..d60973b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/max_tests.c @@ -0,0 +1,36 @@ +#include "jtest.h" +#include "statistics_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "statistics_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MAX_TEST(suffix) \ + STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + max, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + STATISTICS_COMPARE_INTERFACE) + +JTEST_ARM_MAX_TEST(f32); +JTEST_ARM_MAX_TEST(q31); +JTEST_ARM_MAX_TEST(q15); +JTEST_ARM_MAX_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(max_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_max_f32_test); + JTEST_TEST_CALL(arm_max_q31_test); + JTEST_TEST_CALL(arm_max_q15_test); + JTEST_TEST_CALL(arm_max_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/mean_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/mean_tests.c new file mode 100644 index 0000000..291c10a --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/mean_tests.c @@ -0,0 +1,36 @@ +#include "jtest.h" +#include "statistics_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "statistics_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MEAN_TEST(suffix) \ + STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + mean, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + STATISTICS_COMPARE_INTERFACE) + +JTEST_ARM_MEAN_TEST(f32); +JTEST_ARM_MEAN_TEST(q31); +JTEST_ARM_MEAN_TEST(q15); +JTEST_ARM_MEAN_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(mean_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_mean_f32_test); + JTEST_TEST_CALL(arm_mean_q31_test); + JTEST_TEST_CALL(arm_mean_q15_test); + JTEST_TEST_CALL(arm_mean_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/min_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/min_tests.c new file mode 100644 index 0000000..9d831d0 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/min_tests.c @@ -0,0 +1,36 @@ +#include "jtest.h" +#include "statistics_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "statistics_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_MIN_TEST(suffix) \ + STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + min, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + STATISTICS_COMPARE_INTERFACE) + +JTEST_ARM_MIN_TEST(f32); +JTEST_ARM_MIN_TEST(q31); +JTEST_ARM_MIN_TEST(q15); +JTEST_ARM_MIN_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(min_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_min_f32_test); + JTEST_TEST_CALL(arm_min_q31_test); + JTEST_TEST_CALL(arm_min_q15_test); + JTEST_TEST_CALL(arm_min_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/power_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/power_tests.c new file mode 100644 index 0000000..12c30ea --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/power_tests.c @@ -0,0 +1,36 @@ +#include "jtest.h" +#include "statistics_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "statistics_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_POWER_TEST(suffix, output_type) \ + STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + power, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + STATISTICS_SNR_COMPARE_INTERFACE) + +JTEST_ARM_POWER_TEST(f32, float32_t); +JTEST_ARM_POWER_TEST(q31, q63_t); +JTEST_ARM_POWER_TEST(q15, q63_t); +JTEST_ARM_POWER_TEST(q7, q31_t); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(power_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_power_f32_test); + JTEST_TEST_CALL(arm_power_q31_test); + JTEST_TEST_CALL(arm_power_q15_test); + JTEST_TEST_CALL(arm_power_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/rms_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/rms_tests.c new file mode 100644 index 0000000..d9b1a24 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/rms_tests.c @@ -0,0 +1,34 @@ +#include "jtest.h" +#include "statistics_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "statistics_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_RMS_TEST(suffix) \ + STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + rms, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + STATISTICS_SNR_COMPARE_INTERFACE) + +JTEST_ARM_RMS_TEST(f32); +JTEST_ARM_RMS_TEST(q31); +JTEST_ARM_RMS_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(rms_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_rms_f32_test); + JTEST_TEST_CALL(arm_rms_q31_test); + JTEST_TEST_CALL(arm_rms_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/statistics_test_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/statistics_test_common_data.c new file mode 100644 index 0000000..ebf4580 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/statistics_test_common_data.c @@ -0,0 +1,94 @@ +#include "statistics_test_data.h" + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + + +ARR_DESC_DEFINE(STATISTICS_BIGGEST_INPUT_TYPE, + statistics_output_fut, + STATISTICS_MAX_INPUT_ELEMENTS, + CURLY(0)); + +ARR_DESC_DEFINE(STATISTICS_BIGGEST_INPUT_TYPE, + statistics_output_ref, + STATISTICS_MAX_INPUT_ELEMENTS, + CURLY(0)); + +uint32_t statistics_idx_fut = 0; +uint32_t statistics_idx_ref = 0; + +STATISTICS_BIGGEST_INPUT_TYPE +statistics_output_f32_ref[STATISTICS_MAX_INPUT_ELEMENTS]; + +STATISTICS_BIGGEST_INPUT_TYPE +statistics_output_f32_fut[STATISTICS_MAX_INPUT_ELEMENTS]; + +/*--------------------------------------------------------------------------------*/ +/* Block Sizes */ +/*--------------------------------------------------------------------------------*/ + +/* + To change test parameter values add/remove values inside CURLY and update + the preceeding parameter to reflect the number of values inside CURLY. +*/ + +ARR_DESC_DEFINE(uint32_t, + statistics_block_sizes, + 4, + CURLY(1, 2, 15, 32)); + +/*--------------------------------------------------------------------------------*/ +/* Test Data */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(float32_t, + statistics_f_32, + 32, + CURLY( + -0.0865129623056441 , -0.3331168756476194, + 0.0250664612949661 , 0.0575352840717098, + -0.2292942701362928 , 0.2381830931285998, + 0.2378328403304206 , -0.0075266553186635, + 0.0654584722817308 , 0.0349278285641849, + -0.0373417155362879 , 0.1451581096586606, + -0.1176633086028378 , 0.4366371636394202, + -0.0272791766173191 , 0.0227862627041619, + 0.2133536422718378 , 0.0118562921047211, + -0.0191296810967338 , -0.1664698927300045, + 0.0588821632785281 , -0.2672363715875608, + 0.1428649103637904 , 0.3247124128892542, + -0.1383551403404573 , 0.1715993345656525, + 0.2508002843205065 , -0.3187459152894954, + -0.2881928863802040 , 0.1142295247316356, + -0.0799771155430726 , 0.1379994750928690 + )); + + +ARR_DESC_DEFINE_SUBSET(statistics_f_31, + statistics_f_32, + 31); + +ARR_DESC_DEFINE_SUBSET(statistics_f_15, + statistics_f_32, + 15); + +ARR_DESC_DEFINE_SUBSET(statistics_f_2, + statistics_f_32, + 2); + +ARR_DESC_DEFINE(float32_t, + statistics_zeros, + 32, + CURLY(0)); + +/* Aggregate all float datasets */ +ARR_DESC_DEFINE(ARR_DESC_t *, + statistics_f_all, + 4, + CURLY( + &statistics_zeros, + &statistics_f_2, + &statistics_f_15, + &statistics_f_32 + )); diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/statistics_test_group.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/statistics_test_group.c new file mode 100644 index 0000000..6a610a6 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/statistics_test_group.c @@ -0,0 +1,14 @@ +#include "jtest.h" +#include "statistics_tests.h" + +JTEST_DEFINE_GROUP(statistics_tests) +{ + JTEST_GROUP_CALL(max_tests); + JTEST_GROUP_CALL(mean_tests); + JTEST_GROUP_CALL(min_tests); + JTEST_GROUP_CALL(power_tests); + JTEST_GROUP_CALL(rms_tests); + JTEST_GROUP_CALL(std_tests); + JTEST_GROUP_CALL(var_tests); + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/std_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/std_tests.c new file mode 100644 index 0000000..b80ed71 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/std_tests.c @@ -0,0 +1,34 @@ +#include "jtest.h" +#include "statistics_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "statistics_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_STD_TEST(suffix) \ + STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + std, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + STATISTICS_SNR_COMPARE_INTERFACE) + +JTEST_ARM_STD_TEST(f32); +JTEST_ARM_STD_TEST(q31); +JTEST_ARM_STD_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(std_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_std_f32_test); + JTEST_TEST_CALL(arm_std_q31_test); + JTEST_TEST_CALL(arm_std_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/var_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/var_tests.c new file mode 100644 index 0000000..3aa7c27 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/statistics_tests/var_tests.c @@ -0,0 +1,34 @@ +#include "jtest.h" +#include "statistics_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "statistics_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_VAR_TEST(suffix) \ + STATISTICS_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + var, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + STATISTICS_SNR_COMPARE_INTERFACE) + +JTEST_ARM_VAR_TEST(f32); +JTEST_ARM_VAR_TEST(q31); +JTEST_ARM_VAR_TEST(q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(var_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_var_f32_test); + JTEST_TEST_CALL(arm_var_q31_test); + JTEST_TEST_CALL(arm_var_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/copy_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/copy_tests.c new file mode 100644 index 0000000..3804f63 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/copy_tests.c @@ -0,0 +1,33 @@ +#include "jtest.h" +#include "support_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "support_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_COPY_TEST(suffix) \ + SUPPORT_DEFINE_TEST_TEMPLATE_BUF1_BLK( \ + copy, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + SUPPORT_COMPARE_INTERFACE) + +JTEST_ARM_COPY_TEST(f32); +JTEST_ARM_COPY_TEST(q31); +JTEST_ARM_COPY_TEST(q15); +JTEST_ARM_COPY_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(copy_tests) +{ + JTEST_TEST_CALL(arm_copy_f32_test); + JTEST_TEST_CALL(arm_copy_q31_test); + JTEST_TEST_CALL(arm_copy_q15_test); + JTEST_TEST_CALL(arm_copy_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/fill_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/fill_tests.c new file mode 100644 index 0000000..fc5892d --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/fill_tests.c @@ -0,0 +1,36 @@ +#include "jtest.h" +#include "support_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "support_templates.h" +#include "type_abbrev.h" + +#define JTEST_ARM_FILL_TEST(suffix) \ + SUPPORT_DEFINE_TEST_TEMPLATE_ELT1_BLK( \ + fill, \ + suffix, \ + TYPE_FROM_ABBREV(suffix), \ + TYPE_FROM_ABBREV(suffix), \ + SUPPORT_COMPARE_INTERFACE) + +JTEST_ARM_FILL_TEST(f32); +JTEST_ARM_FILL_TEST(q31); +JTEST_ARM_FILL_TEST(q15); +JTEST_ARM_FILL_TEST(q7); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(fill_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_fill_f32_test); + JTEST_TEST_CALL(arm_fill_q31_test); + JTEST_TEST_CALL(arm_fill_q15_test); + JTEST_TEST_CALL(arm_fill_q7_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/support_test_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/support_test_common_data.c new file mode 100644 index 0000000..f4b5911 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/support_test_common_data.c @@ -0,0 +1,85 @@ +#include "arm_math.h" +#include "support_test_data.h" + +#define MAX_INPUT_ELEMENTS 32 +#define BIGGEST_INPUT_TYPE float32_t + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(BIGGEST_INPUT_TYPE, + support_output_fut, + MAX_INPUT_ELEMENTS, + CURLY(0)); + +ARR_DESC_DEFINE(BIGGEST_INPUT_TYPE, + support_output_ref, + MAX_INPUT_ELEMENTS, + CURLY(0)); + +/*--------------------------------------------------------------------------------*/ +/* Block Sizes */ +/*--------------------------------------------------------------------------------*/ + +/* + To change test parameter values add/remove values inside CURLY and update + the preceeding parameter to reflect the number of values inside CURLY. +*/ + +ARR_DESC_DEFINE(uint32_t, + support_block_sizes, + 4, + CURLY( 2, 7, 15, 32)); + +/*--------------------------------------------------------------------------------*/ +/* Numbers */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(uint32_t, + support_elts, + 4, + CURLY( 0, 1, 0x80000000, 0x7fffffff)); + +/*--------------------------------------------------------------------------------*/ +/* Test Data */ +/*--------------------------------------------------------------------------------*/ + +ARR_DESC_DEFINE(float32_t, + support_f_32, + 32, + CURLY( + 0.24865986 , -0.13364227, -0.27233250 , -7.33488200, + 0.42190653 , 1.17435880 , -0.49824914 , 0.87883663, + 0.63066370 , 1.80275680 , -84.83916000, -2.06773800, + 7.63452500 , 1.01487610 , -0.65785825 , 1.78019030, + -0.34160388, 0.68546050 , -1.81721590 , -0.10340453, + -4.48600340, -1.69763480, -1.26022340 , -1.58457480, + 0.51993870 , 2.83526470 , -0.21502694 , -0.57690346, + -0.22945681, 0.79509383 , 0.07275216 , -2.16279080 + )); + +/* Alias the 32 element array with wrappers that end sooner. */ +ARR_DESC_DEFINE_SUBSET(support_f_15, + support_f_32, + 15); + +ARR_DESC_DEFINE_SUBSET(support_f_2, + support_f_32, + 2); + +ARR_DESC_DEFINE(float32_t, + support_zeros, + 32, + CURLY(0)); + +/* Aggregate all float datasets. */ +ARR_DESC_DEFINE(ARR_DESC_t *, + support_f_all, + 4, + CURLY( + &support_zeros, + &support_f_2, + &support_f_15, + &support_f_32 + )); diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/support_test_group.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/support_test_group.c new file mode 100644 index 0000000..7cc2732 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/support_test_group.c @@ -0,0 +1,10 @@ +#include "jtest.h" +#include "support_tests.h" + +JTEST_DEFINE_GROUP(support_tests) +{ + JTEST_GROUP_CALL(copy_tests); + JTEST_GROUP_CALL(fill_tests); + JTEST_GROUP_CALL(x_to_y_tests); + return; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/x_to_y_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/x_to_y_tests.c new file mode 100644 index 0000000..4667031 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/support_tests/x_to_y_tests.c @@ -0,0 +1,80 @@ +#include "jtest.h" +#include "support_test_data.h" +#include "arr_desc.h" +#include "arm_math.h" /* FUTs */ +#include "ref.h" /* Reference Functions */ +#include "test_templates.h" +#include "support_templates.h" +#include "type_abbrev.h" + +/* Aliases to play nicely with templates. */ +#define arm_f32_to_q31 arm_float_to_q31 +#define arm_f32_to_q15 arm_float_to_q15 +#define arm_f32_to_q7 arm_float_to_q7 +#define arm_q31_to_f32 arm_q31_to_float +#define arm_q15_to_f32 arm_q15_to_float +#define arm_q7_to_f32 arm_q7_to_float +#define ref_f32_to_q31 ref_float_to_q31 +#define ref_f32_to_q15 ref_float_to_q15 +#define ref_f32_to_q7 ref_float_to_q7 +#define ref_q31_to_f32 ref_q31_to_float +#define ref_q15_to_f32 ref_q15_to_float +#define ref_q7_to_f32 ref_q7_to_float + +#define JTEST_ARM_X_TO_Y_TEST(prefix, suffix) \ + JTEST_DEFINE_TEST(arm_##prefix##_to_##suffix##_test, \ + arm_##prefix##_to_##suffix) \ + { \ + TEST_TEMPLATE_BUF1_BLK( \ + support_f_all, \ + support_block_sizes, \ + TYPE_FROM_ABBREV(prefix), \ + TYPE_FROM_ABBREV(suffix), \ + arm_##prefix##_to_##suffix, \ + ARM_x_to_y_INPUT_INTERFACE, \ + ref_##prefix##_to_##suffix, \ + REF_x_to_y_INPUT_INTERFACE, \ + SUPPORT_COMPARE_INTERFACE); \ + } + +JTEST_ARM_X_TO_Y_TEST(f32, q31); +JTEST_ARM_X_TO_Y_TEST(f32, q15); +JTEST_ARM_X_TO_Y_TEST(f32, q7); + +JTEST_ARM_X_TO_Y_TEST(q31, f32); +JTEST_ARM_X_TO_Y_TEST(q31, q15); +JTEST_ARM_X_TO_Y_TEST(q31, q7); + +JTEST_ARM_X_TO_Y_TEST(q15, f32); +JTEST_ARM_X_TO_Y_TEST(q15, q31); +JTEST_ARM_X_TO_Y_TEST(q15, q7); + +JTEST_ARM_X_TO_Y_TEST(q7, f32); +JTEST_ARM_X_TO_Y_TEST(q7, q31); +JTEST_ARM_X_TO_Y_TEST(q7, q15); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group. */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(x_to_y_tests) +{ + /* + To skip a test, comment it out. + */ + JTEST_TEST_CALL(arm_f32_to_q31_test); + JTEST_TEST_CALL(arm_f32_to_q15_test); + JTEST_TEST_CALL(arm_f32_to_q7_test); + + JTEST_TEST_CALL(arm_q31_to_f32_test); + JTEST_TEST_CALL(arm_q31_to_q15_test); + JTEST_TEST_CALL(arm_q31_to_q7_test); + + JTEST_TEST_CALL(arm_q15_to_f32_test); + JTEST_TEST_CALL(arm_q15_to_q31_test); + JTEST_TEST_CALL(arm_q15_to_q7_test); + + JTEST_TEST_CALL(arm_q7_to_f32_test); + JTEST_TEST_CALL(arm_q7_to_q31_test); + JTEST_TEST_CALL(arm_q7_to_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/cfft_family_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/cfft_family_tests.c new file mode 100644 index 0000000..d3e775e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/cfft_family_tests.c @@ -0,0 +1,183 @@ +#include "jtest.h" +#include "ref.h" +#include "arr_desc.h" +#include "transform_templates.h" +#include "transform_test_data.h" +#include "type_abbrev.h" + +/*--------------------------------------------------------------------------------*/ +/* Macros and Defines */ +/*--------------------------------------------------------------------------------*/ + +#define CFFT_FN_NAME(fn_specifier, type_suffix) \ + arm_cfft_##fn_specifier##_##type_suffix \ + +#define CFFT_TEST_NAME(fn_specifier, type_suffix, config_suffix) \ + arm_cfft_##fn_specifier##_##type_suffix##_##config_suffix##_test \ + +/*--------------------------------------------------------------------------------*/ +/* Function Aliases */ +/*--------------------------------------------------------------------------------*/ + +/* These aliases allow expansions in the CFFT_FAMILY_DEFINE_TEST() template to + make sense */ +#define arm_cfft_mag_init_f32 arm_cfft_radix4_init_f32 +#define arm_cfft_mag_init_q31 arm_cfft_radix4_init_q31 +#define arm_cfft_mag_init_q15 arm_cfft_radix4_init_q15 +#define arm_cfft_mag_instance_f32 arm_cfft_radix4_instance_f32 +#define arm_cfft_mag_instance_q31 arm_cfft_radix4_instance_q31 +#define arm_cfft_mag_instance_q15 arm_cfft_radix4_instance_q15 +#define transform_mag_fftlens transform_radix4_fftlens + +/*--------------------------------------------------------------------------------*/ +/* Test Definition */ +/*--------------------------------------------------------------------------------*/ + +/** + * Defines a test for the family of CFFT transforms. + * + * The family of CFFT transforms includes: + * + * - arm_cfft_radix4_xxx + * - arm_cfft_radix2_xxx + * - arm_cfft_mag_xxx + * + * Where xxx can be f32, q31, or q15. + * + * @param fn_specifier Allowed values: radix4, radix2, mag. + * @param type_suffix Allowed values: f32, q31, q15. + * + * @param config_suffix Used to differentiate test names based configuration + * (in this case whether the ifft_flag is set or not.) + + * @param comparison_interface Macro name used to compare reference and fut + * outputs. + * + * @param output_tpe The type of variable contained in the output + * (e.g. float32_t, uint32_t, etc). + * + * @param ifft_flag Determines whether the arm_cfft_instance_xxx is configured + * for an inverse FFT. + */ +#define CFFT_FAMILY_DEFINE_TEST(fn_specifier, \ + type_suffix, \ + config_suffix, /* Delineate between test configs*/ \ + comparison_interface, \ + output_type, \ + ifft_flag) \ + JTEST_DEFINE_TEST(CFFT_TEST_NAME(fn_specifier, type_suffix, \ + config_suffix), \ + CFFT_FN_NAME(fn_specifier, type_suffix)) \ + { \ + arm_cfft_##fn_specifier##_instance_##type_suffix cfft_inst_fut; \ + arm_cfft_##fn_specifier##_instance_##type_suffix cfft_inst_ref; \ + \ + TEMPLATE_DO_ARR_DESC( \ + fftlen_idx, uint16_t, fftlen, transform_##fn_specifier##_fftlens \ + , \ + \ + /* Initialize the cfft instance */ \ + arm_cfft_##fn_specifier##_init_##type_suffix( \ + &cfft_inst_fut, fftlen, ifft_flag, (uint8_t)1); \ + arm_cfft_##fn_specifier##_init_##type_suffix( \ + &cfft_inst_ref, fftlen, ifft_flag, (uint8_t)1); \ + \ + TRANSFORM_PREPARE_INPLACE_INPUTS( \ + transform_fft_##type_suffix##_inputs, \ + fftlen * \ + sizeof(TYPE_FROM_ABBREV(type_suffix)) * \ + 2 /*complex_inputs*/); \ + \ + /* Display parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Inverse-transform flag: %d\n", \ + (int)fftlen, \ + (int)ifft_flag); \ + \ + /* Display cycle count and run test */ \ + JTEST_COUNT_CYCLES( \ + arm_cfft_##fn_specifier##_##type_suffix( \ + &cfft_inst_fut, \ + (void*) transform_fft_inplace_input_fut)); \ + \ + ref_cfft_##fn_specifier##_##type_suffix( \ + &cfft_inst_ref, \ + (void *) transform_fft_inplace_input_ref); \ + \ + /* Test correctness */ \ + comparison_interface( \ + fftlen, \ + output_type)); \ + \ + return JTEST_TEST_PASSED; \ + } + +/** + * Bulk wrapper for all tests instantiated using #CFFT_FAMILY_DEFINE_TEST(). + * + * This macro allows several test definitions to share the same config_suffix + * and ifft_flag settings. + */ +#define CFFT_FAMILY_DEFINE_ALL_TESTS(config_suffix, ifft_flag) \ + /* Radix2 tests*/ \ + CFFT_FAMILY_DEFINE_TEST(radix2, q31, config_suffix, \ + TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE, \ + TYPE_FROM_ABBREV(q31), \ + ifft_flag); \ + CFFT_FAMILY_DEFINE_TEST(radix2, q15, config_suffix, \ + TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE, \ + TYPE_FROM_ABBREV(q15), \ + ifft_flag); \ + /* Radix4 tests*/ \ + CFFT_FAMILY_DEFINE_TEST(radix4, q31, config_suffix, \ + TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE, \ + TYPE_FROM_ABBREV(q31), \ + ifft_flag); \ + CFFT_FAMILY_DEFINE_TEST(radix4, q15, config_suffix, \ + TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE, \ + TYPE_FROM_ABBREV(q15), \ + ifft_flag) + /* /\* Mag tests*\/ \ */ + /* CFFT_FAMILY_DEFINE_TEST(mag, f32, config_suffix, \ */ + /* TRANSFORM_SNR_COMPARE_INTERFACE, \ */ + /* TYPE_FROM_ABBREV(f32), \ */ + /* ifft_flag); \ */ + /* CFFT_FAMILY_DEFINE_TEST(mag, q31, config_suffix, \ */ + /* TRANSFORM_SNR_COMPARE_INTERFACE, \ */ + /* TYPE_FROM_ABBREV(q31), \ */ + /* ifft_flag); \ */ + /* CFFT_FAMILY_DEFINE_TEST(mag, q15, config_suffix, \ */ + /* TRANSFORM_SNR_COMPARE_INTERFACE, \ */ + /* TYPE_FROM_ABBREV(q15), \ */ + /* ifft_flag) */ + +CFFT_FAMILY_DEFINE_ALL_TESTS(forward, 0U); +CFFT_FAMILY_DEFINE_ALL_TESTS(inverse, 1U); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(cfft_family_tests) +{ + /* Forward FFT tests */ + JTEST_TEST_CALL(arm_cfft_radix2_q31_forward_test); + JTEST_TEST_CALL(arm_cfft_radix2_q15_forward_test); + JTEST_TEST_CALL(arm_cfft_radix4_q31_forward_test); + JTEST_TEST_CALL(arm_cfft_radix4_q15_forward_test); + + /* Inverse FFT Tests */ + JTEST_TEST_CALL(arm_cfft_radix2_q31_inverse_test); + JTEST_TEST_CALL(arm_cfft_radix2_q15_inverse_test); + JTEST_TEST_CALL(arm_cfft_radix4_q31_inverse_test); + JTEST_TEST_CALL(arm_cfft_radix4_q15_inverse_test); + + /* Magnitude tests removed from the DSP Library. Keeping them here in case + minds are changed. */ + /* JTEST_TEST_CALL(arm_cfft_mag_f32_forward_test); */ + /* JTEST_TEST_CALL(arm_cfft_mag_q31_forward_test); */ + /* JTEST_TEST_CALL(arm_cfft_mag_q15_forward_test); */ + /* JTEST_TEST_CALL(arm_cfft_mag_f32_inverse_test); */ + /* JTEST_TEST_CALL(arm_cfft_mag_q31_inverse_test); */ + /* JTEST_TEST_CALL(arm_cfft_mag_q15_inverse_test); */ +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/cfft_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/cfft_tests.c new file mode 100644 index 0000000..f26c6f6 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/cfft_tests.c @@ -0,0 +1,144 @@ +#include "jtest.h" +#include "ref.h" +#include "arr_desc.h" +#include "transform_templates.h" +#include "transform_test_data.h" + +#define CFFT_SNR_THRESHOLD 120 + +/* + CFFT function test template. Arguments are: inverse-transform flag, function + suffix (q7/q15/q31/f32) and the output type (q7_t, q15_t, q31_t, float32_t) +*/ +#define CFFT_TEST_BODY(ifft_flag, suffix, output_type) \ + do \ + { \ + /* Go through all arm_cfft_instances */ \ + TEMPLATE_DO_ARR_DESC( \ + cfft_inst_idx, const arm_cfft_instance_##suffix *, cfft_inst_ptr, \ + transform_cfft_##suffix##_structs \ + , \ + \ + TRANSFORM_PREPARE_INPLACE_INPUTS( \ + transform_fft_##suffix##_inputs, \ + cfft_inst_ptr->fftLen * \ + sizeof(output_type) * \ + 2 /*complex_inputs*/); \ + \ + /* Display parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Inverse-transform flag: %d\n", \ + (int)cfft_inst_ptr->fftLen, \ + (int)ifft_flag); \ + \ + /* Display cycle count and run test */ \ + JTEST_COUNT_CYCLES( \ + arm_cfft_##suffix(cfft_inst_ptr, \ + (void *) transform_fft_inplace_input_fut, \ + ifft_flag, /* IFFT Flag */ \ + 1)); /* Bitreverse flag */ \ + ref_cfft_##suffix(cfft_inst_ptr, \ + (void *) transform_fft_inplace_input_ref, \ + ifft_flag, /* IFFT Flag */ \ + 1); /* Bitreverse flag */ \ + \ + /* Test correctness */ \ + TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE( \ + cfft_inst_ptr->fftLen, \ + output_type)); \ + \ + return JTEST_TEST_PASSED; \ + } while (0) + + +/* + CFFT function with downshift test template. Arguments are: inverse-transform flag, + function suffix (q7/q15/q31/f32) and the output type (q7_t, q15_t, q31_t, float32_t) +*/ +#define CFFT_DOWNSHIFT_INPUT_TEST_BODY(ifft_flag, suffix, output_type) \ + do \ + { \ + /* Go through all arm_cfft_instances */ \ + TEMPLATE_DO_ARR_DESC( \ + cfft_inst_idx, const arm_cfft_instance_##suffix *, cfft_inst_ptr, \ + transform_cfft_##suffix##_structs \ + , \ + \ + TRANSFORM_PREPARE_INPLACE_INPUTS_DOWNSHIFT( \ + transform_fft_##suffix##_inputs, \ + cfft_inst_ptr->fftLen * \ + sizeof(output_type) * \ + 2 /*complex_inputs*/, output_type); \ + \ + /* Display parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Inverse-transform flag: %d\n", \ + (int)cfft_inst_ptr->fftLen, \ + (int)ifft_flag); \ + \ + /* Display cycle count and run test */ \ + JTEST_COUNT_CYCLES( \ + arm_cfft_##suffix(cfft_inst_ptr, \ + (void *) transform_fft_inplace_input_fut, \ + ifft_flag, /* IFFT Flag */ \ + 1)); /* Bitreverse flag */ \ + ref_cfft_##suffix(cfft_inst_ptr, \ + (void *) transform_fft_inplace_input_ref, \ + ifft_flag, /* IFFT Flag */ \ + 1); /* Bitreverse flag */ \ + \ + /* Test correctness */ \ + TRANSFORM_SNR_COMPARE_CMPLX_INTERFACE( \ + cfft_inst_ptr->fftLen, \ + output_type)); \ + \ + return JTEST_TEST_PASSED; \ + } while (0) + + +/* Test declarations */ +JTEST_DEFINE_TEST(cfft_f32_test, cfft_f32) +{ + CFFT_TEST_BODY((uint8_t) 0, f32, float32_t); +} + +JTEST_DEFINE_TEST(cfft_f32_ifft_test, cfft_f32) +{ + CFFT_TEST_BODY((uint8_t) 1, f32, float32_t); +} + +JTEST_DEFINE_TEST(cfft_q31_test, cfft_q31) +{ + CFFT_TEST_BODY((uint8_t) 0, q31, q31_t); +} + +JTEST_DEFINE_TEST(cfft_q31_ifft_test, cfft_q31) +{ + CFFT_TEST_BODY((uint8_t) 1, q31, q31_t); +} + +JTEST_DEFINE_TEST(cfft_q15_test, cfft_q15) +{ + CFFT_TEST_BODY((uint8_t) 0, q15, q15_t); +} + +JTEST_DEFINE_TEST(cfft_q15_ifft_test, cfft_q15) +{ + CFFT_TEST_BODY((uint8_t) 1, q15, q15_t); +} + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(cfft_tests) +{ + JTEST_TEST_CALL(cfft_f32_test); + JTEST_TEST_CALL(cfft_f32_ifft_test); + + JTEST_TEST_CALL(cfft_q31_test); + JTEST_TEST_CALL(cfft_q31_ifft_test); + + JTEST_TEST_CALL(cfft_q15_test); + JTEST_TEST_CALL(cfft_q15_ifft_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c new file mode 100644 index 0000000..aae5a42 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/dct4_tests.c @@ -0,0 +1,197 @@ +#include "jtest.h" +#include "ref.h" +#include "arm_math.h" +#include "arr_desc.h" +#include "transform_templates.h" +#include "transform_test_data.h" +#include "type_abbrev.h" +#include /* sqrtf() */ + +/*--------------------------------------------------------------------------------*/ +/* Aliases to aid macro expansion */ +/*--------------------------------------------------------------------------------*/ +#define ref_sqrt_f32(x) sqrtf(x) + +/*--------------------------------------------------------------------------------*/ +/* Test Definitions */ +/*--------------------------------------------------------------------------------*/ + +/* +DCT function test template. Arguments are: function configuration suffix +(q7/q15/q31/f32) and input type (q7_t/q15_t/q31_t/float32_t) +*/ +#define DCT4_DEFINE_TEST(suffix, input_type) \ + JTEST_DEFINE_TEST(arm_dct4_##suffix##_test, arm_dct4_##suffix) \ + { \ + CONCAT(arm_dct4_instance_,suffix) dct4_inst_fut = {0}; \ + CONCAT(arm_rfft_instance_,suffix) rfft_inst_fut = {0}; \ + CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_fut = {0}; \ + \ + CONCAT(arm_dct4_instance_,suffix) dct4_inst_ref = {0}; \ + CONCAT(arm_rfft_instance_,suffix) rfft_inst_ref = {0}; \ + CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_ref = {0}; \ + \ + /* Go through all dct lengths */ \ + TEMPLATE_DO_ARR_DESC( \ + fftlen_idx, uint16_t, fftlen, transform_dct_fftlens \ + , \ + \ + float32_t normalize_f32 = \ + ref_sqrt_f32((2.0f/(float32_t)fftlen)); \ + input_type normalize; \ + \ + /* Calculate normalized DCT4 value for input_type. */ \ + TEST_CONVERT_FLOAT_TO(&normalize_f32, &normalize, \ + 1, input_type); \ + \ + /* Initialize the DCT4, RFFT, and CFFT instances */ \ + arm_dct4_init_##suffix( \ + &dct4_inst_fut, &rfft_inst_fut, &cfft_inst_fut, \ + fftlen, \ + fftlen/2, \ + normalize); \ + \ + arm_dct4_init_##suffix( \ + &dct4_inst_ref, &rfft_inst_ref, &cfft_inst_ref, \ + fftlen, \ + fftlen/2, \ + normalize); \ + \ + memset( transform_fft_input_fut,0, \ + fftlen*sizeof(input_type)); \ + \ + TRANSFORM_PREPARE_INPLACE_INPUTS( \ + transform_fft_##suffix##_inputs, \ + fftlen * sizeof(input_type)); \ + \ + /* Display parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n", \ + (int)fftlen); \ + \ + /* Input provided as a scratch buffer. Inplace input is \ + * actual input. Display cycle count and run test*/ \ + JTEST_COUNT_CYCLES( \ + arm_dct4_##suffix( \ + &dct4_inst_fut, \ + (void *) transform_fft_input_fut, \ + (void *) transform_fft_inplace_input_fut)); \ + \ + memset( transform_fft_input_ref,0, \ + fftlen*sizeof(input_type)); \ + \ + /* Input provided as a scratch buffer. Inplace input is */ \ + /* actual input. */ \ + ref_dct4_##suffix( \ + &dct4_inst_ref, \ + (void *) transform_fft_input_ref, \ + (void *) transform_fft_inplace_input_ref); \ + \ + /* Test correctness */ \ + DCT_TRANSFORM_SNR_COMPARE_INTERFACE( \ + fftlen, \ + input_type)); \ + \ + return JTEST_TEST_PASSED; \ + } + +/* + DCT function test template for fixed point data. Arguments are: function + suffix (q7/q15/q31/f32), input type (q7_t/q15_t/q31_t/float32_t) and prefix + (dct_4) +*/ +#define DCT4_FIXED_POINT_DEFINE_TEST(suffix, input_type, prefix) \ + JTEST_DEFINE_TEST(arm_dct4_##suffix##_test, arm_dct4_##suffix) \ + { \ + CONCAT(arm_dct4_instance_,suffix) dct4_inst_fut = {0}; \ + CONCAT(arm_rfft_instance_,suffix) rfft_inst_fut = {0}; \ + CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_fut = {0}; \ + \ + CONCAT(arm_dct4_instance_,suffix) dct4_inst_ref = {0}; \ + CONCAT(arm_rfft_instance_,suffix) rfft_inst_ref = {0}; \ + CONCAT(arm_cfft_radix4_instance_,suffix) cfft_inst_ref = {0}; \ + \ + TEMPLATE_DO_ARR_DESC( \ + fftlen_idx, uint16_t, fftlen, transform_dct_fftlens \ + , \ + uint32_t i; \ + float32_t normalize_f32 = \ + ref_sqrt_f32((2.0f/(float32_t)fftlen)); \ + input_type normalize; \ + \ + /* Calculate normalized DCT4 value for input_type. */ \ + TEST_CONVERT_FLOAT_TO(&normalize_f32, &normalize, \ + 1, input_type); \ + \ + /* Initialize the DCT4, RFFT, and CFFT instances */ \ + arm_dct4_init_##suffix( \ + &dct4_inst_fut, &rfft_inst_fut, &cfft_inst_fut, \ + fftlen, \ + fftlen/2, \ + normalize); \ + \ + arm_dct4_init_##suffix( \ + &dct4_inst_ref, &rfft_inst_ref, &cfft_inst_ref, \ + fftlen, \ + fftlen/2, \ + normalize); \ + \ + /* Input samples need to be downscaled by 1 bit to \ + * avoid saturations in the Q31 DCT process, \ + * as the conversion from DCT2 to DCT4 involves \ + * one subtraction. \ + */ \ + for(i=0; i < fftlen; i++) \ + { \ + ((input_type*)transform_fft_inplace_input_fut)[i] = \ + prefix##transform_fft_##suffix##_inputs[i] >> 1; \ + ((input_type*)transform_fft_inplace_input_ref)[i] = \ + prefix##transform_fft_##suffix##_inputs[i] >> 1; \ + } \ + \ + memset( transform_fft_input_fut,0, \ + fftlen*sizeof(input_type)); \ + \ + /* Display test parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n", \ + (int)fftlen); \ + \ + /* Input provided as a scratch buffer. Inplace input is \ + * actual input. */ \ + JTEST_COUNT_CYCLES( \ + arm_dct4_##suffix( \ + &dct4_inst_fut, \ + (void *) transform_fft_input_fut, \ + (void *) transform_fft_inplace_input_fut)); \ + \ + memset( transform_fft_input_ref,0, \ + fftlen*sizeof(input_type)); \ + \ + /* Input provided as a scratch buffer. Inplace input is */ \ + /* actual input. */ \ + ref_dct4_##suffix( \ + &dct4_inst_ref, \ + (void *) transform_fft_input_ref, \ + (void *) transform_fft_inplace_input_ref); \ + \ + /* Test correctness */ \ + DCT_TRANSFORM_SNR_COMPARE_INTERFACE( \ + fftlen, \ + input_type)); \ + \ + return JTEST_TEST_PASSED; \ + } + +DCT4_DEFINE_TEST(f32, float32_t); +DCT4_FIXED_POINT_DEFINE_TEST(q31, q31_t,); +DCT4_FIXED_POINT_DEFINE_TEST(q15, q15_t, dct4_); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(dct4_tests) +{ + JTEST_TEST_CALL(arm_dct4_f32_test); + JTEST_TEST_CALL(arm_dct4_q31_test); + JTEST_TEST_CALL(arm_dct4_q15_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/rfft_fast_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/rfft_fast_tests.c new file mode 100644 index 0000000..d8a8e17 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/rfft_fast_tests.c @@ -0,0 +1,75 @@ +#include "jtest.h" +#include "ref.h" +#include "arr_desc.h" +#include "transform_templates.h" +#include "transform_test_data.h" +#include "type_abbrev.h" + +/* +FFT fast function test template. Arguments are: function configuration suffix +(q7/q15/q31/f32) and inverse-transform flag +*/ +#define RFFT_FAST_DEFINE_TEST(config_suffix, ifft_flag) \ + JTEST_DEFINE_TEST(arm_rfft_fast_f32_##config_suffix##_test, \ + arm_fft_f32) \ + { \ + arm_rfft_fast_instance_f32 rfft_inst_fut = {{0}, 0, 0}; \ + arm_rfft_fast_instance_f32 rfft_inst_ref = {{0}, 0, 0}; \ + \ + /* Go through all FFT lengths */ \ + TEMPLATE_DO_ARR_DESC( \ + fftlen_idx, uint16_t, fftlen, transform_rfft_fast_fftlens \ + , \ + \ + /* Initialize the RFFT and CFFT Instances */ \ + arm_rfft_fast_init_f32( \ + &rfft_inst_fut, fftlen); \ + \ + arm_rfft_fast_init_f32( \ + &rfft_inst_ref, fftlen); \ + \ + TRANSFORM_COPY_INPUTS( \ + transform_fft_f32_inputs, \ + fftlen * \ + sizeof(float32_t)); \ + \ + /* Display parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Inverse-transform flag: %d\n", \ + (int)fftlen, \ + (int)ifft_flag); \ + \ + /* Display cycle count and run test */ \ + JTEST_COUNT_CYCLES( \ + arm_rfft_fast_f32( \ + &rfft_inst_fut, \ + (void *) transform_fft_input_fut, \ + (void *) transform_fft_output_fut, \ + ifft_flag)); \ + \ + ref_rfft_fast_f32( \ + &rfft_inst_ref, \ + (void *) transform_fft_input_ref, \ + (void *) transform_fft_output_ref, \ + ifft_flag); \ + \ + /* Test correctness */ \ + TRANSFORM_SNR_COMPARE_INTERFACE( \ + fftlen, \ + float32_t)); \ + \ + return JTEST_TEST_PASSED; \ + } + +RFFT_FAST_DEFINE_TEST(forward, 0U); +RFFT_FAST_DEFINE_TEST(inverse, 1U); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(rfft_fast_tests) +{ + JTEST_TEST_CALL(arm_rfft_fast_f32_forward_test); + JTEST_TEST_CALL(arm_rfft_fast_f32_inverse_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/rfft_tests.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/rfft_tests.c new file mode 100644 index 0000000..6fbc8e6 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/rfft_tests.c @@ -0,0 +1,94 @@ +#include "jtest.h" +#include "ref.h" +#include "arr_desc.h" +#include "transform_templates.h" +#include "transform_test_data.h" +#include "type_abbrev.h" + +/* + FFT function test template. Arguments are: function suffix (q7/q15/q31/f32) + function configuration suffix (same as function suffix), inverse-transform flag, + input and output type (both q7_t/q15_t/q31_t/float32_t) +*/ +#define RFFT_DEFINE_TEST(suffix, config_suffix, \ + ifft_flag, input_type, output_type) \ + JTEST_DEFINE_TEST(arm_rfft_##suffix##_##config_suffix##_test, \ + arm_rfft_##suffix) \ + { \ + CONCAT(arm_rfft_instance_, suffix) rfft_inst_fut = {0}; \ + CONCAT(arm_rfft_instance_, suffix) rfft_inst_ref = {0}; \ + \ + /* Go through all arm_rfft lengths */ \ + TEMPLATE_DO_ARR_DESC( \ + fftlen_idx, uint16_t, fftlen, transform_rfft_fftlens \ + , \ + \ + /* Initialize the RFFT and CFFT Instances */ \ + arm_rfft_init_##suffix( \ + &rfft_inst_fut, \ + (uint32_t) fftlen, ifft_flag, 1U); \ + \ + arm_rfft_init_##suffix( \ + &rfft_inst_ref, \ + (uint32_t) fftlen, ifft_flag, 1U); \ + \ + if (ifft_flag) \ + { \ + TRANSFORM_PREPARE_INVERSE_INPUTS( \ + transform_fft_##suffix##_inputs, \ + fftlen, input_type, \ + fftlen * \ + sizeof(input_type)); \ + } \ + else \ + { \ + TRANSFORM_COPY_INPUTS( \ + transform_fft_##suffix##_inputs, \ + fftlen * \ + sizeof(input_type)); \ + } \ + \ + /* Display parameter values */ \ + JTEST_DUMP_STRF("Block Size: %d\n" \ + "Inverse-transform flag: %d\n", \ + (int)fftlen, \ + (int)ifft_flag); \ + \ + /* Display cycle count and run test */ \ + JTEST_COUNT_CYCLES( \ + arm_rfft_##suffix( \ + &rfft_inst_fut, \ + (void *) transform_fft_input_fut, \ + (void *) transform_fft_output_fut)); \ + \ + ref_rfft_##suffix( \ + &rfft_inst_ref, \ + (void *) transform_fft_input_ref, \ + (void *) transform_fft_output_ref); \ + \ + /* Test correctness */ \ + TRANSFORM_SNR_COMPARE_INTERFACE( \ + fftlen, \ + output_type)); \ + \ + return JTEST_TEST_PASSED; \ + } + +RFFT_DEFINE_TEST(q31, forward, 0U, TYPE_FROM_ABBREV(q31), TYPE_FROM_ABBREV(q31)); +RFFT_DEFINE_TEST(q15, forward, 0U, TYPE_FROM_ABBREV(q15), TYPE_FROM_ABBREV(q15)); +//RFFT_DEFINE_TEST(f32, inverse, 1U, TYPE_FROM_ABBREV(f32), TYPE_FROM_ABBREV(f32)); +RFFT_DEFINE_TEST(q31, inverse, 1U, TYPE_FROM_ABBREV(q31), TYPE_FROM_ABBREV(q31)); +RFFT_DEFINE_TEST(q15, inverse, 1U, TYPE_FROM_ABBREV(q15), TYPE_FROM_ABBREV(q15)); + +/*--------------------------------------------------------------------------------*/ +/* Collect all tests in a group */ +/*--------------------------------------------------------------------------------*/ + +JTEST_DEFINE_GROUP(rfft_tests) +{ + JTEST_TEST_CALL(arm_rfft_q31_forward_test); + JTEST_TEST_CALL(arm_rfft_q15_forward_test); + //JTEST_TEST_CALL(arm_rfft_f32_inverse_test); + JTEST_TEST_CALL(arm_rfft_q31_inverse_test); + JTEST_TEST_CALL(arm_rfft_q15_inverse_test); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/transform_test_group.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/transform_test_group.c new file mode 100644 index 0000000..f071068 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/transform_test_group.c @@ -0,0 +1,11 @@ +#include "jtest.h" +#include "transform_tests.h" + +JTEST_DEFINE_GROUP(transform_tests) +{ + JTEST_GROUP_CALL(cfft_tests); + JTEST_GROUP_CALL(cfft_family_tests); + JTEST_GROUP_CALL(rfft_tests); + JTEST_GROUP_CALL(rfft_fast_tests); + JTEST_GROUP_CALL(dct4_tests); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/transform_tests_common_data.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/transform_tests_common_data.c new file mode 100644 index 0000000..98987b3 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/Common/src/transform_tests/transform_tests_common_data.c @@ -0,0 +1,3311 @@ +#include "transform_test_data.h" +#include "arm_const_structs.h" + +/*--------------------------------------------------------------------------------*/ +/* Input/Output Buffers */ +/*--------------------------------------------------------------------------------*/ + +float32_t transform_fft_output_fut[TRANSFORM_MAX_FFT_LEN * 2] = {0}; +float32_t transform_fft_output_ref[TRANSFORM_MAX_FFT_LEN * 2] = {0}; +float32_t transform_fft_input_fut[TRANSFORM_MAX_FFT_LEN * 2] = {0}; +float32_t transform_fft_input_ref[TRANSFORM_MAX_FFT_LEN * 2] = {0}; +float32_t transform_fft_output_f32_fut[TRANSFORM_MAX_FFT_LEN * 2] = {0}; +float32_t transform_fft_output_f32_ref[TRANSFORM_MAX_FFT_LEN * 2] = {0}; + +/* Some of the transform function modify their inputs in-place, so that they + * become the outputs. */ +float32_t * transform_fft_inplace_input_fut = transform_fft_output_fut; +float32_t * transform_fft_inplace_input_ref = transform_fft_output_ref; + +q31_t transform_fft_q31_inputs[TRANSFORM_MAX_FFT_LEN * 2] = +{ + 0xC14A5524, 0xCCABDA17, 0xAD6F5B56, 0xFDAFCE3B, 0xA9B226EB, + 0x41F6F6A, 0xA5CE38BF, 0x3A978AFA, 0xBA44B82A, 0x855C0F8, + 0x3D060524, 0x93D5E570, 0x97D7791D, 0xFFE0C38C, 0x26749841, + 0xC0A6EE54, 0x218EC386, 0x39FF3726, 0x8DC1F7CA, 0x702F2CF5, + 0xC1142FF1, 0xEC1476AB, 0x15F640DD, 0xE62CCE49, 0x3805DE7E, + 0xF70871FE, 0xCF8BD360, 0x8D19A8A0, 0xD764F821, 0xA58558CF, + 0x8C0CE04D, 0x50A46C19, 0x66D2370D, 0x50FA359A, 0xB646AE24, + 0x6CE00F5C, 0xE6D48948, 0xB55BD831, 0x3B72950A, 0x9EB69530, + 0x73394127, 0x773FA6F4, 0x9805A980, 0x838DE587, 0x9CF597F4, + 0xA2AD1691, 0xFA81A473, 0x7CDC7D7F, 0x4A5190D0, 0xED895BB9, + 0x8FD60F35, 0x1A21D530, 0xA0EB6DDA, 0xBDE6A516, 0x2501A3E1, + 0x5ED893C8, 0xE1E175B1, 0xACBBB2F3, 0xED350907, 0xDB140D7E, + 0xEEAE272D, 0xBE229841, 0xC18BFB88, 0xA6BB9B80, 0xBCF090E4, + 0x24DB166C, 0xF9AB7E42, 0x62DF28D1, 0xC7004665, 0xE3F56FC6, + 0x419E0C75, 0x46BE9F38, 0x2432B9B2, 0x758D83E0, 0xDCE12926, + 0x3F57CB74, 0x1F4458E2, 0xF1DD639, 0x83A1FB49, 0x173AFC76, + 0x86EF7531, 0x48D32F34, 0x7D3E3063, 0x8F2FB549, 0x5C314C9, + 0x18CBEB6D, 0xA6F8B697, 0x447B9E9C, 0x2E32BA33, 0xD074D715, + 0x81ACD746, 0xE55A4E04, 0x4891860F, 0x1DA3EB4F, 0xE0E6A27F, + 0x20BFDEB4, 0xD0B3A25B, 0x40C10544, 0xC15656C, 0x15405EAE, + 0x9858E3E1, 0xA36A9C4E, 0x88BD21F9, 0xAACF7A68, 0x773665E5, + 0xCEDFDF66, 0x617A9610, 0x524FC968, 0xC2D086CD, 0x5F008079, + 0x24DCA447, 0x6A4F5599, 0xB706CD4A, 0x1DE70608, 0xA33A2EE5, + 0x137E488E, 0x98061B7B, 0x4079D69D, 0xA4A897D5, 0xC4CEC8F5, + 0xD75F7883, 0x22406802, 0xF1AD70BB, 0x9D4ADD79, 0xBCBC7CE4, + 0xB358C0D8, 0x85792E47, 0xA7ADAC05, 0x3D19EEAB, 0x331AC0AF, + 0x33035831, 0x13D93987, 0xFC542094, 0x845F317E, 0xDDC4BF8B, + 0x1379E50C, 0x5C20193F, 0xFDD58298, 0x9D482B82, 0x4A6BE062, + 0xDC8A757B, 0x272917C1, 0x90E1EFBC, 0x355AD882, 0xE6F8EA35, + 0x604555A1, 0x7DFFFBB, 0xF58AE216, 0x9A11B463, 0xD3541BAD, + 0xA1576756, 0x483BED8D, 0x1F05AFCC, 0xCEA63DFB, 0x55B84677, + 0xFB2E04F2, 0x787AF96C, 0x84A12CD3, 0x460A9BD, 0x9DB22DD8, + 0x1A8C7F28, 0x861E452E, 0x932D3F78, 0x7652D852, 0x73357BBA, + 0xEBBB0A58, 0x62536AFA, 0x3F6B65EF, 0x6DC57B58, 0x9EB798CE, + 0xE6B0A740, 0xDFF68B47, 0x3247FB8F, 0xFFF3D302, 0xA9FD3E40, + 0x475A43D1, 0x6FF9528A, 0x2018A09D, 0x47E0F9C9, 0x4CF5F6D3, + 0x2807CE34, 0xDD6FD8ED, 0x234045D1, 0x51CEB5F9, 0x25297896, + 0x6443A0FE, 0x8F4449A9, 0xD4C3E1C6, 0xF01D52F1, 0x4E09C820, + 0xF18F0810, 0xE1548689, 0xF9DE5A1F, 0x5286DC23, 0x48AC3A4B, + 0xEA0C1BE0, 0xA1B785DB, 0x7086465D, 0x1CC10929, 0x1E1D716E, + 0xED231D4C, 0x2049D108, 0xB8FF9971, 0x949CF8D4, 0x441F1E8B, + 0xC3D95372, 0x69C324B4, 0xA10BFDC9, 0xC781DE78, 0x82476137, + 0xE163DDF, 0x390DEEC2, 0xAF68CE5B, 0x8E680ABD, 0x8223A615, + 0x92593380, 0x7B1465FE, 0x865AE957, 0x930F53EB, 0xED772EF7, + 0x10E916B6, 0xE3BCFA68, 0x2ACB80BB, 0xE51C5590, 0x994714B5, + 0xF30984EE, 0x59BBE1B4, 0xB4867DBC, 0xB91C706C, 0xBC16C218, + 0xA8931CD0, 0x129A66AB, 0x13171F4D, 0x62882872, 0x4B167FD4, + 0xE6902F4C, 0xFA794932, 0xD4B152C, 0xB0856EA9, 0x39466D55, + 0x3669E451, 0x8F5B9E8C, 0x877A3C6A, 0x51B956B4, 0x367EAD2A, + 0x9D2C662A, 0x78FB6880, 0x4E6D40B6, 0x4070EFDC, 0x4DF9679C, + 0x20306EDB, 0xE381AAE7, 0xA55DA748, 0x9B8B617B, 0x3E036FAD, + 0x84E4C4A7, 0xD5A3F517, 0x669BA988, 0x98FDDE8C, 0x67BD85CE, + 0x34BBB46C, 0x76994800, 0x85B9D8B6, 0x6DFA2FEF, 0x205DB5C, + 0x9F843C4C, 0x72721B52, 0x73EF6B86, 0x5FB98B61, 0xC323DDAC, + 0x31D424B4, 0xF68C0D7E, 0x162FAF9D, 0x7B2A7A99, 0xF9392693, + 0xC42D12C0, 0x8692A73E, 0xD9A1EE80, 0xDD956856, 0x44E7BDAC, + 0x8D874532, 0x5F5C9DD0, 0x5D167858, 0x8559FEA2, 0x9D821476, + 0xD9654ED2, 0x594C0DC7, 0x1A87B506, 0x3F693200, 0x7A651AB5, + 0xA0CCBC8A, 0x9F9E662C, 0x78EF631, 0x2A09DA0, 0xB088C72F, + 0x92EE0D42, 0x360DCD5F, 0xF333FE48, 0x8D63CC06, 0x233A8ACB, + 0x706651ED, 0x7AA5C079, 0x262239D1, 0x3EBBEBB6, 0xA25A4F3D, + 0x32581A06, 0x6E6FD780, 0x5773F7C7, 0x75ED1DDC, 0x90DF2D15, + 0xBC79A9BC, 0xB7175917, 0x354E381C, 0x762AADD7, 0xF643DAC1, + 0xF3BBF49E, 0xD2FECE7E, 0x6C8140F4, 0xD7694875, 0x92D30822, + 0xC742A7CF, 0xB792ED98, 0x121CFE24, 0xA04E1EE7, 0x58CE268, + 0x215A080, 0x316CB323, 0xFAB14A31, 0xE1C13C03, 0xFD8EF4F1, + 0xF3F446D0, 0x6C6CEA0A, 0xBBFDF9FB, 0x67242969, 0xBE55A4EB, + 0x8FF5534, 0x52F0DF1C, 0x9710ADE3, 0xD40F4A21, 0x7984E8E7, + 0x419545EB, 0x993F7880, 0xAB246B20, 0x408AABC4, 0xCBF6EA49, + 0xC0894C55, 0x4CAA6398, 0xA47856E9, 0xAF2AE47D, 0x22F55D33, + 0xF0D37915, 0xD0634C72, 0xD983671, 0x2BCC5AF8, 0x9A77D48, + 0xC11B5CFA, 0xF107CD7E, 0x3A6B3593, 0xE1425F05, 0x6271812A, + 0x5B838310, 0xBD8418CA, 0x10A58792, 0x239F7137, 0xA13D5071, + 0x7F9930D4, 0xA462664F, 0x54180F8E, 0x291585BA, 0xE586B87A, + 0x144B2C12, 0x98E425C7, 0xBAA4B373, 0x18F0D03C, 0x99462AC0, + 0xD8B4D2EF, 0x72473895, 0xA6BF5435, 0xEDAD53B, 0xE0912FA6, + 0x5C33F331, 0x3D93CD7, 0x4D03D752, 0x20699929, 0xB89962F9, + 0x36E781E9, 0xF58B642C, 0x5FCA69E3, 0x5960A7F4, 0xAD5AAFD0, + 0xDF18324A, 0x3DB1E5AA, 0x76BA3876, 0x1BC29AF6, 0xBCC18841, + 0x73A60174, 0x625BFF58, 0x67C57724, 0x4458E53C, 0xE157B095, + 0x2B370837, 0x83DF6CE3, 0xDD08EEFA, 0x3F52A7C2, 0x191B4785, + 0x60843D82, 0xB0DE11F1, 0x105EA26C, 0x6E1C7AA2, 0x47AADD14, + 0xB6676D03, 0x3B8D4DF6, 0x737A694, 0x409521DC, 0x744206A, + 0xC722023F, 0x2BE4EAD5, 0x63E11D76, 0xCA4A09AB, 0x5CF2D2B9, + 0x31586916, 0xCDFD7D84, 0xB203F634, 0xAD7329D4, 0xC524582F, + 0x2E53E6C1, 0xBB0E019B, 0xB8538C6A, 0x6A2542D, 0x8A6A00E5, + 0x119725CC, 0x5406D347, 0x1B6FFAF1, 0xECCF71F1, 0x981117F2, + 0x7167CA76, 0x74F4B880, 0x77A55F47, 0x59EADB62, 0x4A331D95, + 0xBCBBA76F, 0xA45C4D50, 0xC718D5, 0x87CE05D1, 0x60D47AD5, + 0xA5CA9C40, 0xB0061766, 0xE69B39DF, 0xBD5F1320, 0x9930EAD3, + 0xA8B38325, 0x8DD090F, 0x6A6EEF37, 0x2DF16F66, 0xAB514C7E, + 0x31109C58, 0xFD48C7FC, 0x515341CA, 0x77AB8EA6, 0x41328DAF, + 0xBAF8D31E, 0xA4B31611, 0xED37F331, 0x7A832A22, 0xA22591C7, + 0x722D1F89, 0x3B19CF18, 0x261B8A4D, 0xC3F6F6DB, 0xCF8CED61, + 0x990FA250, 0xA02E72A9, 0x560DCEA2, 0xB08E67B4, 0x3674E663, + 0x97CC3852, 0xA7EB2EAC, 0xFFDE0AA8, 0xA64719A, 0x23269EDD, + 0x3C0B339E, 0x86284D40, 0x48D82ECB, 0xA4D4CCF8, 0x43631B91, + 0x4BF0C248, 0xB6497B9B, 0x6827BC58, 0xE30B7AF9, 0xA0CCBF26, + 0x6C3B7B71, 0xD744B3ED, 0xFA25D2F6, 0x4CDE642D, 0xD65B8142, + 0xA6F9207F, 0xE7A207BE, 0xDB506684, 0x44DA4780, 0x9175EA0C, + 0x156104AF, 0x4155E1B0, 0x6E3A6886, 0x9DBA1EA2, 0x5423D9C8, + 0xCC024E22, 0x758F852A, 0x1DD6395, 0x2D19CBAD, 0xE164F5A1, + 0xC2084602, 0x89C274AD, 0x13CB5562, 0xD7FE2D5B, 0xE07A4EE5, + 0x1672BA91, 0x4F624CCF, 0x2E5EA4A3, 0x28FEEFAF, 0xBDDA6EF4, + 0x32AFD40C, 0x99A5FB3B, 0xDD1D73A3, 0xA342CB3E, 0xA78445F5, + 0x53979C3B, 0x427D7943, 0x5221B58C, 0xA6CE9A5E, 0xFB50ECA4, + 0xBB86E36E, 0x60839F6D, 0xC5E1C2F3, 0xA1B7FB04, 0xFBB65E0C, + 0x78B80F5E, 0xFD8D972B, 0x3BF3BA90, 0x2D572D9, 0x2B5BC920, + 0xB6A0DE01, 0xD274D306, 0xC7C6C855, 0x9CAA669B, 0xB04AA641, + 0x4D6B1760, 0x3E17ED79, 0xD23241B0, 0xA4A6F957, 0xCBDE76AF, + 0x4E5F9493, 0x4C215DA5, 0x33A052B, 0x1A4D80C2, 0x40AEEBCA, + 0x390D106B, 0xE9E8E018, 0x5AF3D6CF, 0xE35E1D4, 0xC4FB1C6, + 0x14B6299B, 0x8D2E25F0, 0xCCBF932A, 0xC5AC18B6, 0x2227567D, + 0x86B5CE2F, 0x26344534, 0x22C515EC, 0x2442B70D, 0xEC3721C6, + 0x34EF687D, 0x9C06323A, 0xEAF3EA60, 0x60396F52, 0xEAE78AA1, + 0xC9D06CBC, 0x6F95F6C8, 0x584CC258, 0xBA9A27BB, 0x66DF8D47, + 0x9D4804EA, 0x57DD9E67, 0xF89C7895, 0xF5336111, 0x25C122C8, + 0x62742114, 0xCFBF6D26, 0xBF9F6482, 0xE6F02CD9, 0x11083202, + 0xC99E2618, 0x7EBC9351, 0x440112F1, 0xC9DFFBC1, 0x3BF4DC25, + 0xB1BA7FA0, 0x61AF9AED, 0x6B1F7D29, 0xAD865294, 0xE3E01129, + 0x7E9E77A5, 0x100435D7, 0x9FE3A71, 0x88597C81, 0x722849FA, + 0x31C5A0AF, 0xFBA178DC, 0x7F102D31, 0x5CA07864, 0x950E6F98, + 0x82C34882, 0x5D041F11, 0x8C613C57, 0xD398CFD1, 0x426F38AD, + 0x5599AB1D, 0xFAFA078D, 0xAB25B413, 0xD94B32CF, 0xB288FE38, + 0x2893BB46, 0x9A0B4168, 0xA91BCA94, 0x653A5E8D, 0x2174EBBE, + 0xDEFE6415, 0x30DA429C, 0xD0C5E40C, 0xB4719AA4, 0xD29CE7A6, + 0x905957CD, 0xCD287499, 0x83CA0AA7, 0xA8385832, 0x25A0CA02, + 0xC20D47A4, 0xB562F556, 0x4BC19E4C, 0xD9E215C7, 0x27E838B4, + 0xC58612F4, 0xA2827F6F, 0xC49DCDBA, 0x679B7362, 0x4E495845, + 0xCFD2F0D1, 0x395E76A0, 0x375A655E, 0x92E2058F, 0x73F9F0CA, + 0x61EFF3B3, 0x51FFD362, 0xE7410345, 0x7FDA8B3B, 0xA219E2E8, + 0x17ABE543, 0x26557412, 0x4B30084D, 0xA68E191D, 0xFE0D93DF, + 0x73EF127D, 0x4DECDDB1, 0x77FAF45F, 0xD6002898, 0x92DD0A40, + 0x157F6DDF, 0xC2A55F8E, 0x4359F924, 0xFB630C3F, 0x338B6B58, + 0xB2945F75, 0x4FA23A0E, 0x836EB8C0, 0xB3B18FD, 0x86114337, + 0x24668ACB, 0x99BB82F0, 0x924C8A47, 0xBA959701, 0x81155ABF, + 0x8C612D71, 0x36074CA7, 0xD1668C41, 0xE35F58C7, 0x7FC2802D, + 0x8E6A7CF3, 0x65B07D07, 0x815F6A6B, 0x791BF0DD, 0x6E47D719, + 0xC24394C7, 0xE84A6EB, 0xF194AFEE, 0x464A2F52, 0x677579FD, + 0xEBA775AE, 0x1F6EEFF, 0x9A795237, 0x78D9D45F, 0x9D0B344D, + 0xBBD34AB7, 0x2F85B12A, 0x16C5C2AD, 0x3990985D, 0x88DF3351, + 0x82811AA5, 0x6D351F41, 0x4066A69D, 0x86B660BF, 0x6EDB4768, + 0xDDD78CF0, 0xB5D74F6E, 0xE89E220C, 0x91439687, 0x947CC9C9, + 0x3857E2BD, 0x302F8AE4, 0x1DABE7F8, 0x4832D6C9, 0x37D58FCB, + 0x4EA8A711, 0xCD7BAC98, 0x19DBF8BC, 0xD8DE8DC2, 0xEAFF7E7B, + 0xB7629C93, 0x792C6E19, 0xF7009192, 0xFF88439D, 0x2E196A66, + 0xEC71B78C, 0xEAF4BB3A, 0x7C16225E, 0x668F337, 0xCBEE1608, + 0x6D5B5552, 0x345DC590, 0x681209CC, 0x7B24A819, 0xD08A1416, + 0x99888FE3, 0x9FC7288A, 0x24BD8502, 0xEA1D9678, 0x20EECA0, + 0x59BEA057, 0x5ADE91EB, 0xDEA8E49D, 0xFA200E6F, 0x9149C81D, + 0xF2281E93, 0x8A5B0451, 0x67312D58, 0xE3B849F1, 0xD2217960, + 0x7CDF59F3, 0x33C775C0, 0x9EBA8799, 0x7DF9506, 0xB4E96110, + 0xB8FCF3E3, 0xDEA059B2, 0x8229B6EA, 0x316486F6, 0x43919185, + 0x6C0D90F3, 0x1C6F3DF8, 0x38DB92A9, 0x5CD41244, 0x2C9F0A7B, + 0xDF4A315F, 0xF7CE9C66, 0x4C800860, 0x318D53E0, 0xF105C20D, + 0xD753E1F2, 0x750810BA, 0xA17ECCA5, 0x2010140, 0x4D884763, + 0xC2BB0DA7, 0xB2D5BA74, 0x141CECD4, 0x887FDFC3, 0xC64B53, + 0x2D2A85F6, 0x15532B45, 0x5D5CBCE1, 0xBEB9A16A, 0xA214611B, + 0x9FC5AC5F, 0x11AE5DD7, 0xA0B9A5A9, 0xFC648AF4, 0x740009AC, + 0xED0E0321, 0xB8E6A61, 0x8910C544, 0xC74F26C8, 0x9525CCF3, + 0xB41AEB59, 0xE61984CE, 0x598B2197, 0xA412E59D, 0xE1976DD4, + 0xB29BBE16, 0x88FD9FB0, 0xB04006F3, 0xB45E309, 0xD5CC15F1, + 0xD9DAF630, 0xDC809335, 0x803ED52, 0xB537F5A5, 0xA994F6EB, + 0xF5288568, 0xF66FD264, 0x2EA2B3A6, 0x647619F3, 0xFFB38C7A, + 0x1BC03B9, 0xB6BC3061, 0xBF30596E, 0xBE2AD27B, 0x8AC04220, + 0x641979A3, 0x9ECCBB89, 0xA144FBC1, 0x4E8FAE26, 0x8C5A9D90, + 0x299ED467, 0xD7C9C7E3, 0x1D4865ED, 0x76F31C3D, 0xCEE81CDF, + 0xB479195E, 0x6FFB3AE1, 0xDC8A398, 0x300F7364, 0xC7940AFA, + 0x3B85BE3E, 0xD98CC40D, 0xA24A3D89, 0x3A674204, 0x22888A38, + 0x2E77F2D, 0xA2841C9C, 0xCF0689C3, 0x9FE98922, 0x89335017, + 0x2D6B69A7, 0xFEDB63F9, 0x899AF4EF, 0x9F9F9B40, 0xA4BE97E8, + 0xA51DAF7A, 0x16AC50D3, 0xA8D7ED6, 0xED193443, 0x7615EF1B, + 0xB0DF6A4E, 0x64FFE794, 0xE3DB2C9A, 0x7435B022, 0x556E825C, + 0x23802AF9, 0xC25098A4, 0xE75A18BB, 0x70B2A7B9, 0x7FB81BF, + 0x63EF910, 0x6C669591, 0x6574DD2B, 0xCF6E379D, 0xD2B3AFAC, + 0x1E6A1101, 0x1DE22385, 0x2338191F, 0xC69704B6, 0xCBABC599, + 0x54EB4809, 0x7839BE6D, 0xD50017DD, 0x39B1A0E1, 0x288D52D3, + 0x2D52668C, 0x20D22A68, 0x4E1207D1, 0x3FCC0EFE, 0x47F3FE64, + 0x25177A90, 0xB4BFDD4D, 0xDA8DBDCE, 0x6F7275A8, 0x6BEAA655, + 0xAA1810FC, 0xE4DB593A, 0x8A4D4BC0, 0x2C402E93, 0xF1C0F7F9, + 0x6F0CC577, 0x70412414, 0x752F9DC1, 0xD82E38EA, 0xAC455F7B, + 0x4DCD4EDB, 0x92BC2696, 0xFB03F135, 0x4FCA1F8C, 0xBD5E75F6, + 0x502F41B0, 0x3616D3F1, 0x2E5B8E31, 0x2026EB19, 0x57E783D7, + 0x467BBE00, 0x4703ABA3, 0x1F776B9C, 0xE2570A84, 0xFEC7DB48, + 0x1BD5012, 0xFD0A2D5D, 0x7FCC29F2, 0x291304B6, 0x99D5D8ED, + 0xC7551C8, 0xFD12F38F, 0xBADE8892, 0xDF749997, 0xA5DAE2F, + 0x2B9FA269, 0x5C13CFED, 0x15E9A399, 0x54437F4E, 0xA72DB2AB, + 0x56186AA1, 0xFE4DB55C, 0xA34D7836, 0x2A879760, 0xC63FA94, + 0xAC18B207, 0x5FC78B3, 0x7F10621E, 0xA769E6B2, 0xEC9F4A11, + 0xCE3F982C, 0x62BA2EF5, 0xA5F239CD, 0x73D63FED, 0xE36E9F5E, + 0x8AC1DA0E, 0x3F3DB3EB, 0x738326EA, 0x35C366B1, 0xCD476E86, + 0x82F6B208, 0xF11A9FC1, 0x426AC396, 0x7E4D1B93, 0x75E4EDB7, + 0xAF3C44A7, 0x51A5EF5C, 0xFAD2463D, 0x8A5639CA, 0xC995AC78, + 0xCC4BE4F6, 0x3AFE7F8D, 0x66993D04, 0x4386FF37, 0xCBC1C6C2, + 0x55A8F5EC, 0xE81A9A75, 0x30A67E1B, 0x4A4A7D0C, 0x20F7F993, + 0x1891805, 0x738976AD, 0xD426E7D6, 0x3C5CEEBF, 0x4499187F, + 0xABF17C97, 0x447C317F, 0x68D8419C, 0x7AAB6456, 0x421BCF29, + 0xF6740F9C, 0x8916BB8D, 0x3D72AAB, 0x9AD54DD7, 0x7549C6EE, + 0x7317342B, 0xA18546D4, 0x1056BDA7, 0x54BBCCCE, 0x8CE63E46, + 0x5D146234, 0x33BE6C63, 0xB250C4E5, 0x89D72335, 0x87C36BA, + 0xB65530CC, 0x2DFAC48C, 0x1663D16F, 0x59B80AA, 0x950274EA, + 0x92532D4A, 0x3CEF802D, 0x492FBDA5, 0xA63A2574, 0xEF8005C2, + 0x94A18651, 0xAF627ABA, 0x6829B238, 0xA698F646, 0xD2598516, + 0x10144D36, 0xD9B1D1B9, 0xAB2ACF05, 0x5395B699, 0xA7851C75, + 0x1806C6F3, 0xAE970306, 0x3284B145, 0x98F4FE8F, 0xECDD35CC, + 0xDDC1EE0E, 0xC4848865, 0x925826BD, 0x4078BE39, 0x68A8561A, + 0x323045DC, 0xA933B37F, 0xBA2AEE2E, 0x4F24F65D, 0x349EE246, + 0xF97B9D0E, 0x46DC5759, 0x4529F425, 0x80D17B42, 0x8E16F709, + 0x1B42206A, 0x4934A526, 0x391BB6DE, 0xB52EF45C, 0x26C30290, + 0xCBA23CAA, 0xA501A8C3, 0xD922C4F8, 0xE8824E53, 0x6F4255DC, + 0x5960B544, 0x58BC69D6, 0xCA936323, 0xFDDF053C, 0xC2E002D6, + 0x7D750755, 0x8A3F9CD1, 0x35F8F6F8, 0xFB7BD154, 0x65CFF94F, + 0x390A58DD, 0xD97C4093, 0x501CA2A3, 0x8EA5DEBC, 0xCA93461F, + 0xE02D984C, 0x126F8517, 0x39FDD887, 0x46241AE9, 0x777E854D, + 0xE2B36349, 0x58E3FA9F, 0x971DEF1E, 0x8E156228, 0xC0E14E9, + 0xA9A01BE6, 0xB318C990, 0x971680D6, 0xA1F359CE, 0x487E23F4, + 0x7DE465B0, 0x4E4C905E, 0x2A652959, 0x116FF167, 0x5C74AAB9, + 0x4FEFC920, 0x28DF4EB8, 0x29EBF45A, 0x1E350CF6, 0x7134F224, + 0x22CCF1B6, 0x3890ACCD, 0x9BC304F0, 0x7A37B14E, 0xF3724F9C, + 0xDAC493BE, 0x504692EB, 0x82A56D75, 0x42BC73F0, 0xADA92177, + 0x2D9D9FD2, 0x41D874F, 0xEFCFD8FE, 0x8E83A5A2, 0xB84AF0DA, + 0x65F9B035, 0x6DF4EEE0, 0x7D403714, 0x1CCB8B3A, 0x25B30F14, + 0x5384B044, 0xD21FB429, 0x2C407A2, 0x88622917, 0x92D49C25, + 0x845AA406, 0x532D7675, 0xC0B7713D, 0x30E6933B, 0xD270DE3B, + 0x78771A87, 0x1949A28, 0xAEC00040, 0x10A092F4, 0xBD9D5066, + 0xDE166CB7, 0xE8ECE4D3, 0x867417C9, 0xCF0657E4, 0xD7D550F7, + 0xCD472B6D, 0x8CD0F002, 0xD7D47B7C, 0xA2E5475F, 0x2B66B40, + 0x397A7C9F, 0x6C4BC024, 0x9FDA402, 0xD981917E, 0xA3A6C8E, + 0xC9A42042, 0xCF0D1D5B, 0x1A96C11B, 0x9271030B, 0x4BD5D13C, + 0xCDA08C03, 0x1E4B3256, 0xDBB263E, 0x94B1E758, 0x5CF0232F, + 0xC76F252E, 0x27FF7F55, 0xA55DC287, 0x72886B75, 0x38AA73C2, + 0xA5759CFB, 0xF0A75C8C, 0x7059CBE3, 0x6519FBE2, 0x8C3B4162, + 0x5A19A4DE, 0x9D93E753, 0xA9EDF8B5, 0xD68126CD, 0xEA6A7399, + 0xA73005B4, 0x45BC5168, 0xABD166BA, 0x4D0CC0DF, 0xE1376FF9, + 0x393FB309, 0xE995744E, 0xD5EF71BE, 0x66C2BF35, 0x88D62A85, + 0x14121E08, 0x7006CE98, 0x7F0A7076, 0x7DB9C751, 0xDC7056CD, + 0xC1517CD, 0x65BCE88, 0x1B0F1E71, 0x54C2DA11, 0x101BFDD8, + 0x28096AAD, 0xC365859F, 0xACE13396, 0x7CB432BC, 0xB19EA011, + 0xAD9BC7D2, 0x3AF387B1, 0xCCE30470, 0x5335FC46, 0x40D13C16, + 0xD548B4CC, 0xC476A7BD, 0x66BC0663, 0xB7C6960F, 0x12D1E821, + 0x9A536C48, 0x42641630, 0x740C9A48, 0xF61664E8, 0x3B11E69A, + 0xBD79E1F1, 0x3F930B7D, 0xD98B085D, 0x2151962F, 0xD4D7F80E, + 0x88975123, 0x5302989, 0x12F5CA2B, 0x37C29573, 0xD1D2A3A6, + 0x46DA55DA, 0x2EC8C098, 0x802A42DF, 0xD07A11E5, 0xD5BF4B16, + 0x171BCB96, 0xB5843001, 0x57BDCAA7, 0xDDD36F33, 0x633D0AA0, + 0x313B7064, 0x68BD30CE, 0xC986B6C3, 0x2271824F, 0x9951E552, + 0x15939472, 0xDC668F83, 0x1D98A441, 0xA4A1676, 0x631C444B, + 0x6EB61C7C, 0x8EEE0B5E, 0x23F82C1F, 0x6C4B53C1, 0x41116D6, + 0xEBC1627A, 0xC8839049, 0x7F07A8F6, 0xD1F74661, 0x7D9892DD, + 0xF010EC90, 0x37C8A4F4, 0x6ABA986E, 0x68B1E4F6, 0x8066EE05, + 0x5E964158, 0x88D477A6, 0x776CF1E1, 0xB7AB3B60, 0x183D58C0, + 0xA7E13F2F, 0xDD435AD0, 0xF37DF46E, 0xD3F3F774, 0xB6B24A9A, + 0xC097D9F2, 0x54EE718C, 0x4469BDB, 0x4F20DAC, 0xB4002AD5, + 0x2E7AB56, 0xCDB4B18C, 0xF2ACE62D, 0x54BD40DE, 0x46DCCA2, + 0x5B7F32F9, 0xA8CB257D, 0xB138C149, 0x71474D19, 0x6F71C293, + 0xD88FBC7D, 0x9E0A7F86, 0x14B92605, 0x1CBACDC, 0x29159263, + 0xBB719E18, 0xD41B37EE, 0xA236E27E, 0xE916BAE3, 0xED34D9DA, + 0xFDDE09B6, 0x4FE72C56, 0x16927460, 0x8CFFF9A, 0xA9465741, + 0x2B1CD6E0, 0x6BA277FD, 0xE06F70EC, 0x7CB2715, 0xFEDC13C8, + 0x7049632E, 0xC6448831, 0xF72CA3A, 0x9B2BE231, 0xC16A8438, + 0x948EB7E, 0x64041803, 0x82A43295, 0x226D95CE, 0x84AFC1EE, + 0xB2EF3B82, 0xAC18A45C, 0x74DE3ADE, 0xD0E6FAD4, 0xE10C242E, + 0x797DF7BA, 0x812CD7B8, 0xED45B681, 0x8F6CCDE8, 0xC2376DFF, + 0xCABE35D6, 0xD450395B, 0x13493CE3, 0x870E1BF5, 0x7B0BF341, + 0xEBD572F2, 0xAE22B3F1, 0x7ED22DF8, 0xEFE826ED, 0xF147F4BD, + 0xA12DA6F2, 0xF3871967, 0xE4423B70, 0x298472D9, 0x45E03E3D, + 0x2BE705AC, 0x41E3AE6C, 0xA29DF92C, 0x54B33739, 0x8EA8F7A9, + 0xDEFF7BC9, 0x77D06961, 0x71981BA1, 0xBA5A5647, 0x4A8E0E2E, + 0x9F519F5D, 0x31BBA940, 0x3D3A0532, 0x7090F0AD, 0x8B47D658, + 0x8D198BAF, 0x9ED929B6, 0x323BB81, 0x97210404, 0x7B8790DA, + 0xD8438C25, 0xDFBB1C93, 0x2C3F415B, 0x14738C42, 0xB46C2C7A, + 0xA3627CAB, 0xFC540D08, 0xE8227979, 0x672B87FE, 0xB257C949, + 0x9C2B31FF, 0x97AAACA8, 0xC662B448, 0x5BFEFC7C, 0xC2FDEDDE, + 0xAD306CED, 0x639A2576, 0x9ECC1378, 0xA72D71B3, 0x94E11CDB, + 0x8BF14832, 0x945C1728, 0x49AE595B, 0x526DD500, 0x40A7D344, + 0x8EB1DA34, 0x731E17C5, 0xA7CF41A4, 0xCB068104, 0xC842B8E, + 0x7F5733E1, 0xAC9CB3B, 0x2E3F58C0, 0xFD8BC4F, 0xFFBCBBAA, + 0x620248F9, 0x27AC344D, 0xF2E5958B, 0x773EBC3A, 0xEA6078F7, + 0x6B32D1D7, 0xC00DF984, 0xE73C86AA, 0x712026DB, 0x2CE271FF, + 0x38578573, 0x816605D0, 0x673509A9, 0x8D693AC8, 0x2533C371, + 0x6783E269, 0xC5731F9, 0xF2A8041E, 0xBB3C008F, 0x2B290D9A, + 0x122A4BA4, 0x645A69B, 0xB86CC256, 0x9369B8C3, 0x90CF4CEB, + 0x573005D0, 0x4F7DB793, 0xD6AC972E, 0x178BFB66, 0xC430DCEE, + 0xD1A8138B, 0xBF6EC4C8, 0x693E6FAF, 0x54119B44, 0x9C904669, + 0x4D95F608, 0xDB59E550, 0xD85DDBBC, 0xD15818AE, 0x680778D8, + 0x3B67A234, 0xEBE9DAF3, 0xEB8E049B, 0xDD9E0EB8, 0x5D4FB1FB, + 0xCEA62C1C, 0x948AF719, 0xA7E58E36, 0x800EAD97, 0xCD895A65, + 0x72E63F92, 0xA9A82DD3, 0x8CC07793, 0xE70EBE82, 0x1F69534, + 0xAB727A31, 0x1582EF9, 0x7247F677, 0x5FFD7E2C, 0x950EA9DF, + 0xFF38A172, 0xDD75DB84, 0x3A416207, 0xD6A23DA7, 0x3BBE70D0, + 0x538C25CA, 0x2958DF9, 0xD7B9C83E, 0x61F35964, 0x1E05B36, + 0xDD57CDCF, 0x997335B, 0x3A65762A, 0xC5836CD0, 0x9EF2B7F1, + 0x5094196, 0x6949A654, 0xB7FD3E5D, 0x6070C271, 0x30364C38, + 0xDCAFFFA5, 0xCD4ED281, 0x9865FE7C, 0x75F665AD, 0x6ABADB10, + 0xAB43129, 0x26B7A5B8, 0xA321DDBD, 0x467AD732, 0x153A1AE, + 0xAD6B1842, 0xBE19B6BE, 0xC1E22C82, 0x73372EA5, 0xF9EF4AD7, + 0x24C81977, 0xD8451807, 0xCD10ADC8, 0x8FBD95E2, 0xE0789969, + 0xC77A80F2, 0xF1165BCE, 0x3488C653, 0x16F3E378, 0x8D71B29A, + 0x628EC98A, 0x40963234, 0xF918E028, 0x9A584D33, 0xC174E2FE, + 0x417C5145, 0x1C751175, 0xB21E0C12, 0x30218ECC, 0x9D7731BD, + 0xA07DBA0F, 0xE7504D39, 0x3E37F16B, 0xD3BAB050, 0x6F3DE64, + 0x1998A7BA, 0xA61A6D07, 0x424FBED7, 0xCD6B3236, 0x68E71248, + 0x58CC3DFB, 0x584FA4F5, 0xFFE8E2BD, 0x9F0E3D75, 0x788DD779, + 0x978ED891, 0x7E1BFFC8, 0xB812A1C9, 0x5CCC1A32, 0xF1A47219, + 0xD6BA6E71, 0xAFA86EB5, 0x28D128E2, 0x9EDD53B, 0x9AAB7E9C, + 0x493B76F2, 0x31C5C89, 0xCE5FC3B6, 0x974CC3F5, 0xCBBD90FB, + 0x61DE988E, 0x99B927CB, 0x972EFCCD, 0x2719AD6, 0xE06E4B29, + 0x48215B1, 0x37EDE8E4, 0xABF9F87F, 0x8BC1C626, 0x5B19EC05, + 0x212A2AE1, 0x28446975, 0x20D04126, 0xFC453267, 0x967D9524, + 0xDF1CDF8, 0xFB17DCA3, 0x11E68AC6, 0x3AD7D667, 0xD133EF43, + 0x5EC41DA3, 0x587AA639, 0x17ADAE3, 0x816DF77A, 0x37D0726A, + 0x49DC33D9, 0x6C9737E, 0xA6A2F950, 0xEC5F352C, 0x50D1E06D, + 0xC10009A6, 0x2F70F8BE, 0x382269B1, 0x4C29E7CB, 0xBD474FF3, + 0xD19A4F6, 0xC3CCE458, 0xE09B348, 0xD15A0DC5, 0x1C10D20E, + 0x4AFDED15, 0x3C109DC1, 0xD8C117F5, 0xB501DDF5, 0x39C92B5F, + 0xE76FCA13, 0x76DBAA1B, 0xB0730EBF, 0x67DD1FBC, 0xD8B87AB6, + 0xA826225B, 0xAB2F7089, 0x499FA36D, 0xF26455B, 0xDC79F8EF, + 0x987E765E, 0xA13E60C7, 0x500C7803, 0x492C871D, 0x970DE4EE, + 0xD1423DC1, 0xB66048A3, 0x804895AB, 0xC079A15F, 0x5E6FD682, + 0xE936476E, 0x8DECE38F, 0x76A011D, 0x53575B91, 0xB263D36A, + 0x8F2624C1, 0x26B34937, 0x75A7EC2F, 0xE33ED24, 0xBF1BE7C7, + 0x8D6BA785, 0x1D9FE802, 0xB8F4EC20, 0xD5C714B2, 0xC1326D06, + 0xFCA78B3F, 0xC0065015, 0xA4B9F286, 0x53F92A8B, 0xF4B02DBB, + 0xEC47E64C, 0xA29FFB12, 0xBA94FFB2, 0xB6980EB2, 0x7415C83F, + 0x93F91A24, 0x4C6F7615, 0x34431174, 0xC7D63B4, 0xB1599158, + 0xA3A01FCE, 0xBD477764, 0x6B16EC41, 0x772D8BF5, 0x90F0A785, + 0x8F72672C, 0x7AD22CDC, 0x70824998, 0x1BED16D5, 0x596E84FF, + 0x48B5B4F4, 0xB20D0B81, 0xF00F7AFF, 0x80F618DA, 0xD10AFE11, + 0xA8EA3109, 0x91BA5E43, 0x31345A01, 0xEB0EF0F8, 0xCC6E7FB5, + 0x3348AE52, 0xEBB124D9, 0x447E58B1, 0xF2A3D592, 0x7F3EE5D8, + 0xD3D7B836, 0x9C98DCD4, 0x27F0B7A0, 0xA9655FD9, 0xAB48E5F8, + 0x7F996D8E, 0xAC13B08B, 0x2530AC6D, 0xAA542552, 0xD4E6B42A, + 0x6432AA64, 0xEAC84F76, 0x41D5F959, 0xCDE91DDF, 0xA0AA485A, + 0x6453698, 0x277C18A4, 0x161A497, 0x66FECAE2, 0x1B64683, + 0x948DD228, 0x1F3C5950, 0xFFC271FB, 0x15C4DF12, 0x7C78252B, + 0x9D4EBB89, 0xE6FA1D49, 0x6B032100, 0xB65DD3CC, 0x106BC9B5, + 0xE0223D45, 0xF7779B03, 0x4B0EA0C2, 0x3CB5AAF2, 0x9A458E5F, + 0x524090ED, 0x3BB1F18F, 0xB4DD065E, 0xA8F13E4F, 0xC4949ABB, + 0xD8142D31, 0x99069DE6, 0x989D2A16, 0xC72D929, 0xA2AC5754, + 0x7E29B714, 0x6E25C15F, 0xE8777078, 0x467DDCEA, 0xF94B2ACB, + 0xDF429476, 0x69AE316, 0x363C664D, 0x85D6AA1E, 0xD727E39E, + 0x5AF440A3, 0x2F0BB16D, 0x461D52D, 0x610559B6, 0xC28066D9, + 0x3C13AE61, 0xA965B865, 0x2BCE3D4A, 0x361C4848, 0x46B94657, + 0xF2AE634D, 0xD7FD4B8B, 0x70C175D8, 0x33128DF, 0xB9718A3B, + 0x8EF80C0F, 0xAB12E738, 0x124B8055, 0x43448325, 0x9F05E427, + 0xA0A9F843, 0x57A9A3FA, 0x492EEA32, 0xE73D2B18, 0xF3113C2C, + 0x2BA9B42D, 0xFF0B320, 0x3A18CD71, 0x59804367, 0xC37F9B87, + 0xB8A990, 0xAFE9F267, 0x1892892B, 0x25B9C66D, 0x52D4056E, + 0xCC1508CA, 0xAD213DB2, 0x8B43F743, 0xAA9705AD, 0x9BC756A2, + 0x43F42526, 0x596FEE87, 0x2B8AFF32, 0x46DEDB48, 0xBF06317C, + 0x876D4CF2, 0x16951456, 0x2B051AFD, 0xFD093E9D, 0x2F113180, + 0x77BFC4C0, 0x29200C52, 0x182D384E, 0x54AE29E0, 0xF90961E8, + 0x6072B8F8, 0x3D346F4E, 0x9AA5DBA4, 0xE5E22EC6, 0x392170DA, + 0x40939B9B, 0x65B89151, 0xC54AB94, 0xAD7280BC, 0xA3D4395E, + 0x3B5754D2, 0x9E77A6A2, 0x9A737F56, 0x9B2D432D, 0x8FDDA7E7, + 0x5958516E, 0x7F52CD74, 0xC1761A50, 0x2B80C01F, 0x5AA99F54, + 0x36FAA395, 0x5DB4B3AD, 0x82024C73, 0x988CEFE0, 0xB44498C0, + 0xF9561A4, 0x280470E6, 0x6966F3A0, 0x47E374F4, 0xF00F4CFF, + 0xBC5C4DB2, 0xE287924F, 0x1ED57369, 0x484FE06D, 0xE92E6564, + 0x7429DAD2, 0x1473AF49, 0x9619E0CD, 0xE6EC2B63, 0xF7A983B5, + 0xEC43C28F, 0x4C98EBE7, 0xA61FDF89, 0xA867E5ED, 0x1088A7C, + 0xCF1CEAE8, 0x223AA207, 0x686F4F7B, 0xEBB013E1, 0xDDC01886, + 0x77478D4E, 0x2FFCEAEB, 0xFCA58846, 0x1208668E, 0x32F8252, + 0x65C9F3ED, 0xC7584B2F, 0xF3EB26B2, 0x90890270, 0x5D97ED04, + 0xF5B5B18A, 0xCF415DF9, 0x4CF4683F, 0xE2E3F29F, 0x850E4BEF, + 0xDBABF6E2, 0xBD183286, 0x2F36215C, 0xD8CA1DD3, 0x4309CC6F, + 0x9FA52446, 0xBD94348E, 0x8693D9B6, 0x61E880C2, 0xA1851D5E, + 0xAAB94F80, 0xF8919C00, 0x74D82ECA, 0x4466A1B6, 0xA0A98E8C, + 0x95B6D1D, 0xE5393A4C, 0x5A40CFFB, 0x67013370, 0x571B0FDA, + 0x9E7E805C, 0x15E32653, 0x2CFE7902, 0xA02E0906, 0xA8883783, + 0x7A68B719, 0x3402833A, 0x68BFD324, 0xE0B43DA3, 0xF9DB0F, + 0xC9510610, 0x690D30B, 0xE79AB417, 0xC917E4C0, 0x7B05CE55, + 0xE116EFDB, 0x69E3B158, 0xF91ED58D, 0x1832D16A, 0x91F4EA17, + 0x3D24C408, 0x76A2C6D0, 0x99B19825, 0x2BF52475, 0xAD49289D, + 0x66238CD7, 0xAC1571F5, 0xA2EABC02, 0x889337AE, 0x3219AFFB, + 0x104B8779, 0x810488A8, 0xAC35416A, 0x2C6DEF85, 0x2ED109F5, + 0xCC8C6732, 0x97CD8E90, 0x339F3E81, 0x91486206, 0x2708D41D, + 0x1F2B19A7, 0x51A60303, 0x5E90E440, 0xB63092C8, 0xF1031823, + 0x971A06, 0xB624F6A2, 0x58AC0181, 0xA983D599, 0xA776D877, + 0xB727FE1, 0x55AC01B1, 0x4298EA17, 0x4D6BB9AA, 0x31C55C65, + 0x6A266780, 0x4FD92256, 0x817DB37A, 0x46A14DF1, 0xEC7D9F14, + 0x98D1C1B7, 0x911DF80D, 0xBFBF24E1, 0x9B4DBC6A, 0xE1F71BA4, + 0x9EE5E44A, 0xD1868C4C, 0x6FB45D76, 0x11EC8672, 0x1CED7F0C, + 0x1524A040, 0xA49DE9D3, 0x99FF328A, 0xC392F619, 0x52A856CC, + 0xDB0B0AE6, 0x67F0162E, 0x2C20D410, 0x4E23C4D, 0x828032EA, + 0xC2E7DFFA, 0x908CF524, 0x919F61EE, 0xF001C6F, 0xA81DDF65, + 0x5EC56647, 0x28385ACF, 0xBDD764C0, 0x75C853AB, 0xDF0ADD73, + 0xEEA9C63D, 0x804949F5, 0x658ACD0A, 0xD12F3F50, 0x1FD4F7EE, + 0x7F023D80, 0xD2CB08B5, 0x477EA9A1, 0x872DB719, 0x7B8B6AE9, + 0x84F6AC4, 0x81634EB4, 0xD1A89CF, 0xB3F4F3B9, 0x3A6B024B, + 0xAA2CA2C5, 0x9C902C0C, 0xC40E4135, 0x3C6E612F, 0x11219414, + 0x1F184277, 0x11B6B30C, 0xDD8A6A5A, 0xA0D21C9D, 0x55377022, + 0xD0708FBD, 0x8D761020, 0x54FCFCFC, 0x477801BD, 0xD6919EB8, + 0x9AD29078, 0x36F8D9B8, 0xAE525B8C, 0xCA7ED140, 0x2D8F8B97, + 0xD1B79EAA, 0x2E26FB2A, 0xFB396E32, 0x399129A3, 0x28B55FA1, + 0x2ECB2CF0, 0xDF1CBF7C, 0xDE57A70D, 0x33410B33, 0x7C5759BF, + 0xF534264B, 0x16C8C221, 0x874A3A63, 0xD05808ED, 0x679674BC, + 0x24B060C9, 0x4B162B53, 0xC7D01208, 0xE753DE61, 0xFA9840E4, + 0xA4FEC439, 0x4143E13F, 0x327E9EE8, 0x319D901E, 0xC40FC209, + 0xB1E1FFFC, 0xE737D52B, 0xD074E058, 0xAD8892EE, 0x86B93396, + 0x49C13F4B, 0x60A5721C, 0xD4C4F599, 0x14B38EBB, 0x86BA655, + 0x95F4E0C, 0x4217E99A, 0xD0CA3861, 0xBDD3617B, 0xB0BDBF4D, + 0x99E3389A, 0x8200DCFA, 0xEC22C8AC, 0xBA8DDB32, 0x3F7DDFC8, + 0xC7DDC171, 0x211CF31, 0xCC31A0C7, 0x99A84F32, 0xC9FFD317, + 0x2267733A, 0xFBD05569, 0x306BC05F, 0x6E2685D5, 0x43FBF7D1, + 0x5A2DB2D3, 0xE6491D4B, 0xAD078066, 0x7CAF7AAD, 0x2B1FEBA5, + 0x3418A0EC, 0xC359E9B7, 0xB024E024, 0x58F22A6B, 0x18EEE710, + 0x4755B9C5, 0x528D3273, 0xC8F9255, 0x635E5F9D, 0xABDF5BAD, + 0x8410F054, 0xEA068528, 0x438345EB, 0x56EF340, 0xBD86A7DE, + 0x543A126A, 0x5F259D83, 0x67EDA87A, 0xFF24F98E, 0x684E6504, + 0xE4EB57B, 0xD2D3B758, 0x4474D10F, 0xA94594B7, 0x3E4BEB07, + 0x95C3F257, 0x478B6FA8, 0xBCC7EFD8, 0x1023D258, 0xB4ACD6C0, + 0x36129B10, 0x16D7D9A3, 0xEA63BE7E, 0x25EC12A1, 0x21B95589, + 0x3A673799, 0xB8E04594, 0xAE98693C, 0x9879B8F9, 0x601A3F62, + 0xCF9897C0, 0x87CD1798, 0x629788F1, 0xC1337B31, 0x59D84E67, + 0xF13FA484, 0x5E8C7B3F, 0x7DEDE9F6, 0x9779F496, 0x74C4EE89, + 0xB3D9AC8F, 0x44118EFC, 0xB4FE8E45, 0xC9934560, 0x93D739E8, + 0xCD013773, 0x102411F1, 0x9DB63EFB, 0x63165875, 0xB8B97E98, + 0x6B4223D0, 0x6F34352B, 0xDB038A46, 0xC187163E, 0x17FE20D8, + 0x82A1BC9F, 0xB6860AAF, 0x11D5F9E0, 0x5371E14E, 0x20BC8445, + 0x607589A0, 0x8DDCCF44, 0xCDCD53C2, 0xCBCB32D8, 0xC512E661, + 0x1EB4E6CE, 0x228E99A0, 0x28EE0177, 0x76ED3F3D, 0xA3DA3300, + 0x17C57F91, 0xA1855C6, 0x3531FA3, 0xA93A8241, 0xC45D540C, + 0x365D42EF, 0x2CA39696, 0xE460F7D1, 0xCA32CCB3, 0xA6D9D934, + 0xAD01079C, 0x9B07D89C, 0x226CE0A5, 0x60D67762, 0xD35A4B7B, + 0xFF0A698F, 0xDB73BF89, 0xF41FBA9A, 0xCACDF26D, 0xBF594213, + 0xCD4D3E90, 0xD12F3EB8, 0xE689D238, 0x8CD4C0CA, 0xEB3E841E, + 0xA513EF0F, 0x2DF4B65D, 0x90161625, 0x9C02AC36, 0x208F328D, + 0x12BF5D93, 0x7C8C355C, 0x3CDFCA22, 0x29381080, 0x3FF6CA14, + 0x9F269C74, 0x8A48070B, 0x3BDF51BD, 0x85932156, 0xA7B6F9FF, + 0x80554507, 0x43820D97, 0x59B7214A, 0xFC3ECC27, 0xED39DB19, + 0x2B9BDB43, 0xABD4E298, 0xC2C5953E, 0xD3DB0C09, 0x66EC81DA, + 0x7F41EDE1, 0x5146E8D7, 0x49171DF2, 0xB334BF9A, 0x3AADC9E6, + 0x56E12468, 0xA2D4B032, 0x662B1F49, 0x9C448B1F, 0xA219526C, + 0x56D66A27, 0x41609345, 0x8E685EFA, 0x392DA3A4, 0xDE58C26B, + 0x9C779FC9, 0xCA834F65, 0xA1E34DC4, 0xEC5BE6EA, 0x3737B7AB, + 0x2E9B7D0A, 0x929E96B9, 0xE38B0019, 0xC1E4115B, 0xD8141740, + 0x66977F67, 0x7D4CE4B3, 0x245AB554, 0x26F98B88, 0xEC78F24D, + 0xE1F34C1A, 0x5737AD34, 0xC1A19AC6, 0x3291E363, 0x4E824FF3, + 0xAC42BDF3, 0x7C2DACE8, 0x8D5C97F6, 0xD120875, 0xC4E5C39D, + 0xE22AE85D, 0x290FF39D, 0xD495E52A, 0x95414374, 0xD65757A6, + 0x1E7657F9, 0xF5073D56, 0xC2AA7589, 0xC166A0B3, 0xA0DF8CDE, + 0x4057EAE5, 0xBAC4DD2F, 0xB51F621F, 0xA96F90E3, 0x392B5D6F, + 0xC31E9CA1, 0xCCC02FD3, 0x5181074, 0x7BC15C18, 0xCA9232A4, + 0xD1D104E9, 0x5F0C5D3, 0x4947F6D2, 0x3C923E97, 0x6B486C35, + 0x9C8ADA96, 0x175C4D87, 0x39A1A0FE, 0x417F201B, 0xD080E114, + 0x4847B147, 0xFD634E49, 0xBC0BF4CA, 0xECABB1DF, 0x869B0263, + 0xCD797C28, 0xD2A4683, 0xD50F6A0B, 0x2CA40138, 0x8DA4EB55, + 0x5D198E5A, 0xA98DB40D, 0x96CA0E68, 0xA8D92294, 0xC4813E60, + 0x81CD6B09, 0xEBBEBF80, 0x6777688, 0xCDAF6EC5, 0xEB85653E, + 0x3BB780DD, 0x73718A21, 0x70E8A324, 0x654DE06A, 0x2CB2494A, + 0xFC1DA829, 0x64059A2F, 0x61CE9D0D, 0x5BC51CAB, 0xDF7DE6AE, + 0x1596B477, 0xB0F9EA86, 0x9D87D85B, 0x877620A7, 0x586F3AD6, + 0x96AE645E, 0x65E9D5D7, 0xDB69CEB, 0x2753EF35, 0xC226F633, + 0xBD373F9D, 0xF2A0E198, 0x4372EEC3, 0xA66F7010, 0xD30E1D18, + 0x152C0DFB, 0xEB86FC75, 0xC208FE7E, 0xB36625A4, 0xBBE2DE8, + 0xEC49F9C9, 0xCE724FFE, 0x2D509471, 0xCA6C24B6, 0x1BA93DDF, + 0xEABE9550, 0xB512D359, 0x83F76766, 0xC8267976, 0x7E50802B, + 0xE3EC2199, 0xD3269B8E, 0xC515B0CE, 0xB5752537, 0x70474BD, + 0x7F50EBE, 0xF9FC0B38, 0xD899D19C, 0x317AA41D, 0x6B706374, + 0x66479538, 0x560455A3, 0xD770DD85, 0x55BB61BD, 0x6DE6723A, + 0x3F89034B, 0x9C9650BC, 0xE569992C, 0x7B8F4D95, 0x3FB7C516, + 0x7C28C04B, 0xA12DE6B9, 0x8CFC5AFE, 0xA734A25A, 0xCF1483E8, + 0x1AB22339, 0xAA94F43F, 0x16319A1E, 0x2C9AA4D0, 0xE9D2618, + 0x790B699B, 0x3AD9C3A1, 0x55A778DA, 0x6517152F, 0x2139AB74, + 0x12F762CC, 0x4BE02E6F, 0xE69400F7, 0xDC48DCD0, 0x563DB028, + 0x32299125, 0x7C9145A9, 0xFB88067B, 0xF070F6FF, 0x3D9A42FF, + 0xC5D20DC, 0xF96F7EE1, 0xA9C209A3, 0x9A192F36, 0x3E158AD, + 0x1265DF79, 0x2E49E297, 0x99D3A002, 0xE6AFDDCB, 0x3B56751D, + 0xB248A31F, 0xE6BE0FFD, 0xBBAB635E, 0xB383C45C, 0xA9DC9F2D, + 0x735CE03F, 0x69992E32, 0xD1E6A77, 0xE38A7F46, 0xC1E59620, + 0xFAE7F99A, 0xBDFB440C, 0x9F53F99C, 0x224EA340, 0xAB5D1AF0, + 0x35F3126D, 0x99430549, 0x83E12C62, 0x6403957B, 0x7B119103, + 0xC8382BAB, 0x99A85991, 0x9BF370AF, 0xDFA83CAF, 0xDBEC2CC3, + 0x416D8EBA, 0x774E58FF, 0x29C222F, 0x3DE60561, 0xDF038931, + 0x8297C377, 0x9867C08, 0x58ADEAED, 0xD88F0856, 0x6E4C2A39, + 0x2599DF28, 0xD7A6D06A, 0x433B35BE, 0xDAD3175B, 0xC358D423, + 0x84BF4580, 0xE7D3BE65, 0x9EC8CDBA, 0xCE901946, 0xC4B4D088, + 0x98B1245D, 0xFBB0CC10, 0xE8CB9C76, 0xDE665AF2, 0x28E46D8B, + 0xF7012A56, 0xE29F8C07, 0x8BF87AFB, 0x2907C051, 0x820923CB, + 0xC3E95542, 0x6AB5559E, 0x314BD068, 0x1CEB5637, 0xD1D830D, + 0xC442D6C2, 0x5F6074F4, 0x37F08A2A, 0x21F782BE, 0xF378B1AE, + 0xB7FC74DA, 0x4ACB450F, 0x365F3092, 0xFB0C842C, 0x5DD80554, + 0x741C4F79, 0x290716E0, 0x76E56BA9, 0x10006310, 0x42A183C7, + 0x5F1FB962, 0x8DE2BA39, 0x6176B6D9, 0xFC059A44, 0x9907DE39, + 0x71A5EA7B, 0x42309616, 0x1DDE34DD, 0xF0DFA4BF, 0xF69B5E2F, + 0xD145268, 0x49A3E7B, 0x90508840, 0x861DE564, 0x904730CB, + 0xC844CD6F, 0xD5A2CEB6, 0xCE895F0D, 0x73EEE4D6, 0xEB4565CF, + 0x533ED4ED, 0xF4AAB655, 0x591BC278, 0xBD1D929D, 0x80AD7DA6, + 0x527B3C51, 0x40F627DD, 0xDA420FFD, 0xB9A6F685, 0x5F6D9BC2, + 0x4F67DE58, 0xFB5F87F0, 0x47540936, 0xB2083BC8, 0xAD48DD69, + 0x63F7CA5A, 0x28D5372D, 0x61DA54B0, 0x7DA88170, 0xA2DA7B83, + 0xE1D70E32, 0xA3ADEA46, 0x97026868, 0x60FA4303, 0xA4104416, + 0x3DB4A8CC, 0x72F0F53B, 0xFF270297, 0xD5600E97, 0xD7D25D62, + 0x46DBCAC5, 0xFD61775D, 0x93E100DB, 0xBFE0E0C0, 0x8CE51426, + 0x8216C272, 0xE7300A56, 0x5A61C30E, 0xA7667C78, 0xBD23D39B, + 0xDC425756, 0x7AE9A42B, 0x249E8C42, 0xABB91D5C, 0xBD1334D5, + 0x8BCE967D, 0x5CF89EEA, 0xDB125339, 0x225E3C4C, 0xC5DDA12, + 0xA92903F8, 0xF2F29634, 0xD2AB3419, 0x396DAE59, 0xA02C965E, + 0x450B8DEF, 0x1E4911B2, 0x4F94BA94, 0x6802E7C0, 0x779671B7, + 0xC0B06A93, 0x65BF0119, 0x3D672B7F, 0xE7E68CA, 0xF173FBF, + 0x503C50F4, 0x3D8CA779, 0xD9BC10B2, 0xE6B89F78, 0xFC04B6F2, + 0x74B0E1B4, 0x3BB8594A, 0x5866C0E6, 0x125FBE40, 0x21239465, + 0xC00E2791, 0xD7957B76, 0x331D18CA, 0x87D0C340, 0x8D7347DF, + 0x296D2AA1, 0x8EAA71DF, 0x1D477388, 0x4F666705, 0x211D2B0D, + 0xA41C0741, 0xD8F7CEEC, 0x4C6EDC5E, 0xFE5DC02A, 0xAA83AED3, + 0x9AE501A6, 0xFF82168C, 0xDC638114, 0x4C345BA0, 0xDD7E0F1D, + 0x4C072ABD, 0xFF606768, 0x3CE74279, 0x93DED13D, 0xAB7A9752, + 0xAF27666, 0x784EDE4F, 0x7F4BE8A7, 0x9A45141D, 0x69E507FF, + 0x78BAC3AC, 0xDB2A62AC, 0x52561515, 0xA9DFA9A8, 0xCC51778C, + 0x886CC6A, 0x5246AD23, 0x68A7480, 0xBC267A85, 0x1FF771F4, + 0x5199BC1E, 0xF8CCD05A, 0x7BD65764, 0xC61A33FA, 0xC9F24B8E, + 0xBC0B1D9F, 0xE43E103, 0xBE3D7AAF, 0x39154AD2, 0x941C2098, + 0x1C26174D, 0xC63D21F1, 0xFBC6D732, 0x8C43AE71, 0x1495C044, + 0x9483EE96, 0x909A94F0, 0xC1B02D9E, 0xDF9A2114, 0x2F4883E9, + 0x4806958A, 0x209A2722, 0xFE514205, 0xEB85D85F, 0xC25BED82, + 0xEB2CEABE, 0x8B2A2EDA, 0x68641725, 0x10570304, 0xE53EE68B, + 0xC43FB1C1, 0x8F763232, 0x41ECC1D0, 0xE3E44CBD, 0xA1A68EC0, + 0xDAFA770A, 0x6996A5A8, 0x38407C06, 0x4FAD77B4, 0xE30E2912, + 0x47EE2FD, 0x2CDA167F, 0x88F915F1, 0xF3DF6195, 0x530FBEDE, + 0x2CFC1C0C, 0x47B21171, 0xDEC1A586, 0x2031A43A, 0xDAAD77AD, + 0x8BE637E6, 0xA6AC1EBB, 0x6AB9F2A3, 0xBFB5ED6C, 0x15792C44, + 0xFD3AB89D, 0x27A7E24E, 0x3E76999F, 0x77EE2E6A, 0xE505F3B7, + 0x429839A6, 0x6BEE7B15, 0xF61F0084, 0xFC20752C, 0x4BF79989, + 0xC8B4F8E8, 0x46B33427, 0x9F4BA3E8, 0x41B9354D, 0xEED27E23, + 0xA7FC575F, 0x279180C5, 0x141C3A06, 0x2C2FCEF9, 0x4403AA1F, + 0xD4496B6C, 0x25C33091, 0x452C754, 0x80534A0, 0x80842F72, + 0x3DB756B1, 0xEFD010BD, 0x1DE7F9EA, 0x5F9B1769, 0x55D9839F, + 0xD5B11F46, 0x941D69AE, 0x8C4F3D35, 0xE710E268, 0x2DFBC983, + 0x5D417C19, 0x7C2561F9, 0x25415FCF, 0xF331B119, 0x235B632F, + 0x9B1463A9, 0x8249E513, 0xB6F14826, 0x1005E62C, 0x2B1B4F3E, + 0xEF793550, 0xA90F6AA2, 0x77BFECE6, 0xA6E1C13E, 0xBCB6E143, + 0x2496D0ED, 0xF4A8D5F0, 0x29C27A0C, 0x7D231D55, 0xB8526623, + 0xDDDCB82C, 0x2A18B465, 0xB5FD564D, 0xA9647CB5, 0x4300919B, + 0x9FB2B27A, 0xDB25B0D9, 0xBB5D5711, 0xAA747FC4, 0xAA831194, + 0x9603ED14, 0xAF921A0E, 0xFA1447D7, 0x8B766768, 0xE8F1C89E, + 0xB7985D4, 0x6C5C1AEE, 0x2EA66EF3, 0xD176E7D9, 0x228CD940, + 0xD90C84B4, 0x36253A66, 0xADD7AE4F, 0xF25D5CA5, 0xD34F702F, + 0xA535AA29, 0xFCF10FB, 0x3D075696, 0x63EF7EF3, 0x81554091, + 0xC7EEFC78, 0xE0DCDB21, 0x62EFF001, 0x9ACFD7CD, 0xAEBA43ED, + 0x371BA99B, 0x508B7A31, 0xFF447B05, 0xA239F5D2, 0xA5620A57, + 0xA16B995A, 0xC334401E, 0x535F51AB, 0xAEA26D82, 0x81D72269, + 0x3C0BA1D2, 0x80590850, 0x818A26AA, 0xC43E6B02, 0xF72DFB63, + 0xE7AE3F6A, 0xD31AB683, 0xB99D787A, 0x691FFB53, 0x37EA1E35, + 0xC2C9FFF8, 0x2A13F6D4, 0x4CC79564, 0x6DD5F2DE, 0xC53560B, + 0x5A562B6F, 0x3F2C49F1, 0x6953F4CC, 0x8BA12AF2, 0x98A08428, + 0xA1EF80B3, 0xA977E388, 0x1A3DD9D1, 0x687A3424, 0x2759B568, + 0xC626A765, 0x7887651E, 0xFC9005E1, 0xE84376A4, 0x387BCF66, + 0xF7AA4980, 0xBAEE372C, 0xE89CF460, 0xA275FC1A, 0xA5EF8668, + 0x899F85CE, 0x9CB086A3, 0xF16158AC, 0x4C49EBC0, 0xDCE10FAA, + 0x4B46ABDA, 0x56947FA1, 0xAD4E7245, 0x54C23373, 0x8B0B6C4D, + 0x82590F05, 0x5E292D4C, 0x277B63C5, 0x9D51D8CF, 0x86D379EF, + 0x52CBEF63, 0x7A62AF4C, 0xAC1FA33E, 0x25D454AE, 0x1CDA792D, + 0x17434813, 0x759F50A7, 0xEEB0D38A, 0xB30964A6, 0x941230A0, + 0xA464FA3C, 0x9F8685AF, 0xB9A018F4, 0x8080362, 0x2D565F63, + 0xAB60790A, 0x67252A3C, 0x1715B01D, 0x5384E7F3, 0x79299519, + 0xA9786ABE, 0x1107A1FC, 0xE0D9B037, 0x4DD34883, 0xA7D476E3, + 0x5B194AE9, 0x89E50FB1, 0xA9676565, 0xC77CF621, 0x93612BF2, + 0xE027B80, 0x359C7FBF, 0x39B166FB, 0x1F3B28DF, 0x2848DE70, + 0xFFE261DD, 0xB78D413C, 0xE011DD7B, 0x286F752B, 0x74A8D775, + 0x5E540B67, 0xFAF973F, 0xC0035501, 0xB0F16059, 0x1C981017, + 0xD4871112, 0x9745C0BC, 0x6D85B805, 0xA40253E8, 0x2B0D55CD, + 0x8FF7EDC4, 0x47EB4ECB, 0xC41A2F17, 0x41C9702F, 0x8549DEE0, + 0x865FD46C, 0x64A1F181, 0x24E64D11, 0x13337A33, 0xE8CB0924, + 0x8A2DC003, 0x113C04C7, 0x1CA62E13, 0xC360E708, 0x57DE03AB, + 0x4D8F2BB5, 0x2CE2E2A1, 0x2580C90D, 0xBF162A7C, 0xEB1490A8, + 0xBCABC2A7, 0xFBC4C25C, 0xBC83AB6A, 0x25C47DCB, 0x8FE447A9, + 0x2C0F77CF, 0x6D896845, 0x63CEF5AE, 0xB2FF0326, 0x14D71520, + 0xA1C15C8E, 0xE53550FB, 0x676B299D, 0xC20A5C14, 0xDB3EC54, + 0x359733CE, 0x8A619B1E, 0xCDB53E, 0xD285EED5, 0xA6E0181E, + 0xB81AA3EF, 0x41F8E1A2, 0xE3DEDC6D, 0x4F7CBE5B, 0x24006857, + 0xACB9B719, 0x4E725B2D, 0x8536AF54, 0x329509E7, 0x72E7C0A7, + 0xBA97CC78, 0xD822798F, 0x9DFC6780, 0x63E263CA, 0x7B2397A5, + 0xA42C0C0B, 0x1D5EC588, 0x292F1E7C, 0x2BF5A75, 0xFCD8786B, + 0x14EB1952, 0x84031982, 0xA0800A40, 0x629C9211, 0x3B17F481, + 0x50861D9D, 0x8371A304, 0xB3D21511, 0x720E2C6C, 0x5A07F87E, + 0x868F95BD, 0x8617E7B, 0xD7762105, 0x90707C5A, 0x777473F4, + 0x67737DC4, 0xC4154562, 0x1840CEB3, 0x373635EE, 0x4E6D4EBA, + 0x1736A5EC, 0x4D3E335B, 0x59FDB9A1, 0x9162B39A, 0x3F9E1502, + 0xF661B3DA, 0x77BE0255, 0x65EC8603, 0x21FCA0B, 0x55291C5C, + 0x69F57B1, 0x5DE1E0D6, 0xA6296E1D, 0x595A45F8, 0x90B166DF, + 0x61ABB34E, 0xC6D48B5B, 0xB05EF88F, 0x368B0C6E, 0x94C36250, + 0xB435D440, 0xEFB62847, 0x1473E647, 0x9A101218, 0xC7AA11BF, + 0x80C241E3, 0xAF648F26, 0xDF48753D, 0x7073509A, 0xAB52665F, + 0xD1ECCFC0, 0x7BE293F1, 0x396CA014, 0x84336AB9, 0xF9B7E448, + 0x9566C90E, 0x239F7C25, 0x91A452B3, 0x1E9A4F1C, 0xCCE286F6, + 0xF46520D6, 0x2943A671, 0xAAA30DCF, 0x28D190CE, 0x88E3D0C9, + 0x423944F0, 0x81E6712, 0x2714B6B2, 0xF927748, 0x59A5430F, + 0xCBA530A9, 0x91E12A0E, 0x92598CBE, 0xE61058F5, 0x2604B4B, + 0x4CB7C3A7, 0x43B5812F, 0xFD90660, 0xD73DF50D, 0xAD3AE409, + 0xF74D721B, 0xCC2A88D1, 0xCED79510, 0xE64714DD, 0x3BDF0A8A, + 0xC2C7B689, 0x25B387D8, 0x968DA1A2, 0x8EA5D185, 0xF05F03E1, + 0xFDDC5B50, 0x78AECEF, 0xE32FBBA2, 0xD512F0AD, 0x5410D1B5, + 0xDBFD9FFF, 0xC0F2DD4E, 0xF66F8DBA, 0xF5EBA3C8, 0x65F96FE3, + 0xF7C8962D, 0x8E48A78, 0x255BEDC7, 0xE8FD3698, 0xFD1C4903, + 0xFDE9830, 0xCDBCF434, 0x16540D39, 0x418EF731, 0xB2F80637, + 0xDFCC0C9D, 0xB53DC5BC, 0x5A68B10C, 0xC4DCB3DD, 0x8B3778F4, + 0x7788B194, 0xECBD4903, 0xFD390223, 0x79598BFB, 0xBDECB9D9, + 0x29576BE3, 0x220F82A5, 0xDBB262F6, 0x1876EF0, 0xE2D9C444, + 0x32D5ADEF, 0x5F8739ED, 0xAF427122, 0x171E7D7D, 0xA5468BB4, + 0x94451936, 0x51565032, 0x3CE3CD5, 0xF231F54, 0x98614C6E, + 0xCE18455D, 0x958D2BD2, 0xA5934FE0, 0x3543931E, 0x77D9C2FB, + 0x3D3ED736, 0x6762E077, 0xF1B052A, 0x88AF353B, 0xB2A38925, + 0x8C919686, 0x715EEAAC, 0x34BA46DD, 0xEB486F1C, 0xDF58D7CA, + 0x90B97BE6, 0x37335293, 0x499414CC, 0x7F725BAF, 0x5ABEBF8, + 0xE9344F69, 0x1C110FD, 0xA937AD4C, 0xA7CDD9C0, 0x750FD5FE, + 0x7A7B6D40, 0x41EA948A, 0xA10EE17C, 0x7689C967, 0x9F411C02, + 0x6C40C3FD, 0xA6FFC648, 0xC6D6F914, 0xA100AF92, 0x4CD97ED5, + 0x17D9CCBF, 0x915833F, 0x788D78C0, 0xC81903A3, 0x6DE5BAF0, + 0x3E4D6DCC, 0x98415810, 0xEC23B7AD, 0x822471B0, 0xD2CF5D5A, + 0xA1BACAD5, 0x40843135, 0x430135A, 0xA7655BAD, 0x7A2472BE, + 0xCC3D44CC, 0xD1BC9E10, 0x7C215C92, 0x717FA7DD, 0x7EF7D128, + 0x1BC85798, 0x7C6E19CA, 0xE3FAB7E4, 0xBC884D38, 0x3E220CA, + 0xE7AE4D8, 0xC8EDD021, 0xF3F05D3E, 0xDE302EB8, 0x40CEFF27, + 0x56C0550A, 0x96162C92, 0xC004EA48, 0xE0C29A65, 0x496AE22B, + 0xC7468E6F, 0x8E31BD1F, 0xA53763CF, 0x166CC258, 0x1A2B9CC4, + 0xDBBADE7B, 0xF8D21AC9, 0xB21CA593, 0xB92F0DEE, 0x9A4391F, + 0xCDB4D373, 0xB687B3F5, 0x877BF0A0, 0xFD7395DD, 0x1C56AA87, + 0xCA146BB9, 0x21A2314B, 0x8207A2AC, 0xAA874DC0, 0x4F404E64, + 0xB69FDE48, 0x324FD456, 0x45F19CF, 0xFC7E6D0E, 0xC8A01C04, + 0x76C63378, 0xC526F7B3, 0xFDCD2EEF, 0xFFB2F9B9, 0x2DDE75AF, + 0x5ADF2F86, 0xC9AC84D3, 0x70FF53A0, 0x3FB077C, 0xC2795B30, + 0xF5438170, 0x557D7080, 0xB784684E, 0xCD089E1D, 0x332B71B0, + 0x493C3C2A, 0x1D1DED89, 0x8240E170, 0xA7D17522, 0x48C542AD, + 0xCB357D8F, 0x21E37C1, 0x3B000B34, 0xAAAE4818, 0xCD1EB4B3, + 0x1736CA0E, 0xDDF8EA2B, 0x76E21C4C, 0x6EE99A3C, 0x27F71B20, + 0xF6AE929C, 0x3C9CAF6C, 0x5CA7DA97, 0x8EF033C5, 0x8C7EC36B, + 0x3CB1CFAD, 0x1C5ABBB7, 0xDEF7A78C, 0x9CBC4A73, 0xB3871393, + 0x8C61DF59, 0x54DF941C, 0xCDD23FE8, 0x758EAD7E, 0x49BE795B, + 0xC960C6B, 0xE9B76479, 0xC88843F7, 0x82DC3137, 0xEDEE1A1E, + 0xC6568A7D, 0x42F7F484, 0xA6115655, 0x494779B5, 0xD95FE16A, + 0xB2AB15F4, 0x64C185B3, 0x9A46066E, 0x8BAE077E, 0xBAAE323F, + 0x79A965C6, 0x764B71F0, 0x3654F6D3, 0x96B4B2AB, 0x15C2B523, + 0x720AF416, 0xE6D0F423, 0xFAE44868, 0x6E776BC2, 0x264D41A8, + 0x3FE4BEE, 0x1598B97B, 0x15A70419, 0xA13CD124, 0x751A09E2, + 0xF7F7C12B, 0x718AC211, 0x11D03CD1, 0x2F9247BE, 0x77C210E1, + 0xA2268AAB, 0x2E99F0DD, 0x949D5CC5, 0xA8A309F2, 0x749EC6BE, + 0x5BD5124A, 0x8BF599E9, 0x3919AD4F, 0xA40901C2, 0xA1D4CC03, + 0x6ADCA36F, 0x9D5CCB0F, 0x870E2A58, 0xCEBC6333, 0xB2FA28A4, + 0x579C76A, 0x444849D0, 0x33887308, 0xB3BE3C75, 0x93745501, + 0xC289F137, 0x89739C7, 0x97C73423, 0xD627FB64, 0x6EE36F05, + 0x1F4B4B98, 0xFBB7A8AC, 0x60941E62, 0xC3A8ABDC, 0x4AC5E7C9, + 0x88ACE940, 0x5AA2AE59, 0x9F10C0B7, 0x8F45920B, 0x5FDE21BE, + 0x1D47779A, 0x3ED27D8B, 0x69FF2BB1, 0xCB1409FB, 0xF27F4FFF, + 0xA19E3DDC, 0x206050FD, 0xAD98C2D5, 0x4DA4BC0C, 0x95D9B019, + 0x556ABBFA, 0xBC78B5A, 0xF0F224F8, 0xA9785F8F, 0xED1CE98C, + 0xD368072E, 0xE212ACE5, 0xBB7F76E0, 0xB02F237F, 0x6D85C5AF, + 0x31539988, 0x4312BA19, 0x1D5023A7, 0x7320504B, 0x70563ABD, + 0x2553791A, 0xE9768150, 0xC1B2AF4B, 0x3AF0FD24, 0x3818D0E8, + 0x7F356F58, 0x98A15B0D, 0xAFA943C4, 0xB2B38831, 0x2E411F37, + 0xE3D5AF87, 0x67BEEC5A, 0x825E60CC, 0x1C44D856, 0x1A59493A, + 0x13BAABCF, 0xAEAA4D44, 0x5CFF2A6E, 0xFB47865B, 0xE778E607, + 0x101500E8, 0x2C17E66A, 0xA0B30350, 0xFC649CDF, 0x8B9802D9, + 0xAB87D61A, 0x21F38439, 0xD3D11051, 0x1FDA9955, 0xCB9313B8, + 0x327D1A94, 0x35293099, 0xB803B298, 0x5B8E6883, 0xFA309C3, + 0xDFDA8B2, 0xDF89211F, 0x9918F18E, 0xF0C05CB1, 0x71D8A4B7, + 0xE681031D, 0x537012F6, 0x4DF822F2, 0x34B75C8C, 0x4429F85E, + 0x5D3C4C4D, 0xFB0FC6C7, 0x25F4ECDD, 0xB19D5EFD, 0xD70FD7CF, + 0xD95C45D5, 0xCDAC06B8, 0x9C3B963B, 0xAB2F2A9C, 0x4D3D4F7D, + 0x12692C03, 0xB1AEF97E, 0xF243EFA7, 0x78C4C8DF, 0x182D9C17, + 0x8D2AF450, 0x7596BD9B, 0xE8E7C9C2, 0x86F617F8, 0x1F37A708, + 0x3F648305, 0x27FF6DF6, 0x4D5FF17D, 0xA9541C2D, 0x9773013, + 0x78B2313C, 0x82C0B20F, 0xD36A4F02, 0x8DB2BC4F, 0x9296D8BF, + 0xA983CC7, 0x31AEE908, 0x48CD7E6F, 0x9CB1DD7F, 0xAB89D57, + 0x5156132E, 0x6345AA59, 0x8D2CB12D, 0x94D3AE56, 0xA4E91B27, + 0xEE58338, 0x8620EA15, 0x5454D04E, 0x1142ACF0, 0xCA059044, + 0x31811D8A, 0xD498290, 0xB65F1B67, 0x462745F3, 0xA899191C, + 0xB9C19F48, 0x824659FE, 0x9A257101, 0xC330F34B, 0x42109127, + 0x9DA8504B, 0x6C3A989F, 0x5F426E6C, 0x2B922D32, 0x373C66FD, + 0xAFE3418B, 0xE3788682, 0x83B46626, 0xD0106A4E, 0xFD10B903, + 0xB0F6531C, 0xC65419E0, 0x3963952B, 0xB8799DF9, 0x3EEB8C1D, + 0x5C4D3C08, 0x6DD028A6, 0xA55678A0, 0xB8247141, 0xC1267586, + 0xF6746B19, 0x46C38465, 0x483D24B, 0x99BF79DC, 0x78F778C3, + 0xAFF40193, 0x58872B07, 0x6DA7F4FA, 0x66B5CEA3, 0xDD2D8C79, + 0x2A8D289B, 0xB5789670, 0x66AEFCE3, 0x56FB52B3, 0x20FE3BE1, + 0xCCDFB492, 0xB0F263E8, 0xD0707433, 0x5E58F5DC, 0x4ABEBE63, + 0x8A45CD95, 0x97037830, 0xBDB1F1B5, 0xA1BE2990, 0x57B718FA, + 0xD50EC023, 0x810DD849, 0xE650D43F, 0x3895C77D, 0xE142C382, + 0x35551E5B, 0x3B94330, 0xE92D8A91, 0x50BC837D, 0x61499A8F, + 0x2639B468, 0xF8FF36E1, 0x74956FC6, 0xFF0F4192, 0x6BBA0C53, + 0x5B44FF85, 0xBBE4A1DF, 0x12D6CB14, 0x6C679A10, 0x3C0F554D, + 0xECBADA32, 0x8A99BA10, 0x738C03C4, 0xB8902AC3, 0x7008D470, + 0x49BC2ED9, 0xFBE19B5A, 0xA1E4879A, 0x36129694, 0x94987C3C, + 0xE54B84D8, 0x9CFAEF1E, 0x527127DC, 0xA8FCAE0, 0x8699252C, + 0xDAAD4629, 0xC41F3866, 0x2559C272, 0xB1C25848, 0x3F9B1702, + 0x7C448BF3, 0x8CCEDF5C, 0x3A37F712, 0xFB9E4F83, 0x5754E801, + 0xB38FD367, 0x780F4825, 0x959330C4, 0xF6276BE5, 0xAE3E2018, + 0x182DC907, 0x88E733F9, 0x6FF870A, 0x79EF2D01, 0x3EAC0D6D, + 0x20D4FF88, 0xAE6EB8C1, 0x80810451, 0xC228E035, 0xBD942803, + 0x3F3733F2, 0x9F8F16F6, 0xAAA65031, 0x55E839BC, 0x7EAD3461, + 0x5F5BEE8A, 0x8668BDBA, 0x399366DB, 0x2A54237E, 0x776789E, + 0x7B171AF5, 0x8C9FCB92, 0xD87465F2, 0xFA3CAAB5, 0xBA5B131E, + 0x1FD2D438, 0xDCAA9DA, 0xE1BF0AAA, 0x1EAEA8AE, 0xEB46A646, + 0x989D1EA2, 0x98E8B45F, 0x12A2415B, 0xD107D293, 0x5F54D087, + 0x95AF5C33, 0x2A12BA88, 0x6381D0FF, 0x688EA1E0, 0xACC60CA2, + 0xF19636C6, 0xD4D465E2, 0x2A50DC57, 0xFB595CCF, 0xF5C63674, + 0xB4965626, 0xB903D3D0, 0xD9581548, 0xBBD9E82E, 0xE22BCEF3, + 0x9FE759D, 0x6E8D8F4E, 0x655325D2, 0xE1986814, 0xEA2B93BF, + 0x88085C18, 0xF82BFCB0, 0x3FCF713F, 0xADE03EDC, 0x2D2DDCBC, + 0xEDE2694E, 0xF6DFB11D, 0x5CF35A5A, 0xD38C82D3, 0x52DE32CF, + 0xB88EA70E, 0xF7FB134F, 0xAEC78D1E, 0x58402C66, 0x54CD1763, + 0x78A7EB4, 0x88F49C30, 0xDC17F8C0, 0x9C49A368, 0x926E18EB, + 0x4DD461E1, 0xA6BD8F3C, 0x6D2E4C31, 0x657506D9, 0x445EF83F, + 0x77E28461, 0xF715400F, 0xBB76D1D, 0x9B670CD2, 0xCEB9EB90, + 0x7F297088, 0xD3929A52, 0x9B62909, 0x46474012, 0x3D74DFDF, + 0x46288EF0, 0xF0C51C07, 0xEC642B66, 0x3C76B83C, 0x1E72D08F, + 0x9F95DC1E, 0x106883C5, 0xB6A867BD, 0xA532C423, 0x95076036, + 0xA9DBEA73, 0xA3F8C65D, 0x799CF6BF, 0xA4508346, 0xB37CACB2, + 0xF6A07B5A, 0xA2C24137, 0x2E1D8DEF, 0xD28C26AD, 0xCE745089, + 0x3B7D9638, 0x7189CE82, 0xBC3F7850, 0x5660A9B8, 0x13895B5C, + 0xFA59A643, 0x9B0FF4AF, 0xFD2B4FD3, 0x4C0C4E52, 0x272631DE, + 0xA52FAE47, 0x65850A25, 0xD51ACF2B, 0xD206E6EB, 0x3CDC96EB, + 0xA6FF9E3A, 0xFC601E27, 0x658EF7F0, 0xB45FF508, 0x36A9A571, + 0xCE75E7E9, 0xC4BF9261, 0x3A261099, 0xF1B1CE3E, 0x3D28A165, + 0x3435D2FF, 0x70830AAE, 0x8DFE14F7, 0x3E27CDC1, 0x97BE4BA1, + 0x33F8D0E2, 0x9B2E7BCD, 0x1923B1C, 0xAA248E78, 0xFDA8AEB9, + 0x7825E511, 0xBF20B777, 0x218E4234, 0x7B5D1181, 0xA08988A0, + 0xD9009231, 0xEB15A567, 0x47E045A0, 0x3C515808, 0x35194ACB, + 0xA476304A, 0xEF738BD6, 0xD035FB8C, 0x3B2013F4, 0x4DE60F26, + 0x361431DC, 0x82ECB228, 0xAB22266, 0x4E056EEE, 0x6642D288, + 0x48D851E3, 0xE05D55D9, 0xDC2D6D4F, 0x158F7F48, 0x5D7F7D5A, + 0xC2835158, 0x793509C5, 0x479DF33C, 0xDEF0696A, 0x9FC2BECD, + 0xF4EFC675, 0xF8D1FF02, 0x493D3BD6, 0x7FA1C10F, 0x641B324D, + 0x996DBDDD, 0x24098529, 0x81CCFC35, 0x47F0BE17, 0x5E241815, + 0xF7F62788, 0x261CDAF5, 0x10CBC4B8, 0x5D6C6A7B, 0xD671AE81, + 0xB2C8DCD9, 0xD215CB7E, 0x3403AB1B, 0xA7C5999, 0x4675A50, + 0x369C560C, 0x32C619D9, 0x4FD2E12E, 0xB4A20359, 0x37E93502, + 0x5EC0CE10, 0xB374340, 0xB0DF0419, 0x5960ED4F, 0xF0A7770E, + 0x7F504F30, 0x54A92972, 0x3E9848B8, 0xCD980ABE, 0xDE69D570, + 0xA9FDFFBD, 0x9812C681, 0xDAFCCF4E, 0x2B636CB5, 0xB2B9FF2D, + 0xB9972800, 0x701231C6, 0x2E1108F8, 0x8C323A3E, 0x20A17A77, + 0xF2C6CC7, 0x44C5FD1C, 0x731622D4, 0x9BF0C91E, 0xB61CD1B1, + 0x61FA9CF2, 0x5E460518, 0xF75A1C06, 0x417CCEE2, 0xB45E0FB5, + 0x53DC30E8, 0x500CBD7F, 0xED61DAE3, 0xEFE91818, 0xB56814BA, + 0xD37D84C8, 0xD5DA9ED7, 0x5F40F92, 0xF1507FAD, 0x2CC74A65, + 0x32AA6279, 0x33731317, 0x30E09F03, 0xE1D9C403, 0xC21E638A, + 0xA7394D05, 0x3879F710, 0xDBB52C37, 0xB7780268, 0xE268E178, + 0x9F8072D3, 0x97CC035A, 0xEE65287D, 0xA197441A, 0x21C8AFA4, + 0xB81B50A9, 0xAF6ACC93, 0x7BB55B77, 0x564A0BD4, 0x17F7A6A9, + 0x36627846, 0xDCE746EA, 0xBB9762DE, 0x47B5B8F0, 0xEF5DA4AD, + 0x1922E420, 0x15F9299D, 0x243DAB0D, 0x953C67A3, 0xF3DA71D8, + 0x57122A3E, 0x423A78B, 0xC4A53000, 0xFBE92583, 0x968F3AE, + 0x61629123, 0x792FA07B, 0xBF45729D, 0x99DDD38E, 0xA14565FC, + 0x268E9E3F, 0x7EC9286, 0xCCA1D92A, 0xF06519DA, 0x22396664, + 0xD5DAC24D, 0x71BB4DD5, 0x7D329BB3, 0x401DAB69, 0x19D3E40A, + 0xB6F40F32, 0xE8D1CAF8, 0x5CD5F35D, 0x6F662316, 0xD38D1A6C, + 0xF86E720F, 0xE165D1B9, 0x1BC14E79, 0xC19FB43D, 0x891C013B, + 0x44AED4DC, 0xA7351AAC, 0x5F707A18, 0x3850148, 0x4A425E1, + 0xF7DD6EBD, 0xE0C3FD0E, 0x8266A425, 0x3BA17650, 0x48753ADB, + 0x679FA015, 0x88771712, 0x2174B185, 0x29F9A85A, 0x1560964A, + 0x198E4FCD, 0xD3410A86, 0x9186793D, 0xDAFC5C35, 0x971F4CC8, + 0x1F8F0E8B, 0x11A884F2, 0x66E6D2AC, 0xE85ECDB0, 0x86C76472, + 0xDF3B3320, 0xEEF446A6, 0x834CF19B, 0xECEA602A, 0x46C680AD, + 0x807BA92F, 0x4B3FC42B, 0xEC229845, 0x3FE389C1, 0x63E042D7, + 0x6C855119, 0x7B1ADF33, 0xE1B9CAE0, 0x62C20BAE, 0xEDF0E919, + 0xA50FC7EB, 0x2399262F, 0xD6F88130, 0xE2ADA5DB, 0x7D07BC3C, + 0x36A922F3, 0x7693B84E, 0x3015CD0C, 0x1D1047A7, 0x5D3A75A5, + 0xEE6F1CA9, 0x734BD19F, 0x3308DD73, 0xCEBBC9FA, 0xF79DD5A6, + 0xA41CF168, 0xED762FD8, 0x6642159, 0xA63C5CD6, 0xCB96A282, + 0xA29D9F5C, 0x45CC6CD4, 0x344611EF, 0xC345FE03, 0xC55ADDE0, + 0xB2B8374C, 0x14F730B1, 0x301D9266, 0xA2D98FD8, 0xBC107DF, + 0x59905EE3, 0xDB3560DF, 0x1D49F4F3, 0x785F8E0B, 0x8B116097, + 0x56154F60, 0xE312D829, 0xE0AFAE9B, 0xEAE3692E, 0x95915B8F, + 0x83BEEE75, 0x48C1C92, 0x8166D95E, 0x697FECA8, 0x135DEBF9, + 0xF83E6507, 0x11570809, 0x4862CBDE, 0x820E288D, 0x6CA59B2B, + 0x49DF6AD5, 0x86F41C43, 0xDD128A28, 0x601198A0, 0x3DDD49CB, + 0x95F3ACCE, 0x500CD9D6, 0xF54A50F2, 0x9936957B, 0x7C881875, + 0x743B055D, 0x44FD7934, 0xAF2253BB, 0xA2F4A27C, 0xBA8E1C2B, + 0xCCFA3259, 0x892FC73F, 0x283E74B4, 0x86119027, 0x87961F02, + 0x1D015187, 0xBA83B762, 0x61948B32, 0xAC741667, 0xFA9E0E39, + 0xD440D9CB, 0xED93F9F, 0x5FA97905, 0x2F5F82D8, 0x92EC7646, + 0xC60B3F9, 0xAA28822A, 0x7BA7CD3D, 0x3E41A20B, 0xDE4441A9, + 0xC75E539B, 0xD9D568C2, 0x2DCAE06, 0x7762550, 0x21C2D5EE, + 0x95CB6C94, 0xE31FC800, 0x3C03C172, 0xE166E564, 0x359C5102, + 0x7F717599, 0xBE301B47, 0xB207FA5C, 0x38B8B24B, 0xE6EFF05D, + 0x9F09D305, 0x31A27808, 0xC56D934F, 0xB440BD60, 0x52B1AAC4, + 0x78654045, 0x106A67B8, 0xF2A861E5, 0xC45D72B0, 0xA8FF8296, + 0x97F475A6, 0xDC222733, 0x7A835D7A, 0x45774E9A, 0x9E558C34, + 0x1124605D, 0x1689FED3, 0x70AB9928, 0xADBF8E55, 0x9C09EE27, + 0xF95A8C49, 0x75CD52D7, 0x4FC7275A, 0xA46C29F6, 0x747D788, + 0xA3347E5, 0x5B08AB02, 0x13CDC08C, 0xEDB65176, 0x6B36600A, + 0x26F5AD2A, 0x39949D1, 0xA1C8F6E5, 0xEBF0CEFF, 0xAB60A06B, + 0x10E522E8, 0x80E056D8, 0x1B301392, 0xDC3E0B07, 0xE10174EE, + 0x25DC4733, 0xB4E5A24A, 0x4B569CFE, 0xCCFE9F0D, 0x19BDC038, + 0xF8A0A718, 0x9944E8E0, 0x9591528, 0xBF27BDF1, 0x2C160255, + 0xF9E2F1B, 0xCE4FD96B, 0x703B2A77, 0xDB6EB2A7, 0xBFC2FA6A, + 0x11D00F81, 0x9540FD8D, 0x75849882, 0x183AC87C, 0x91DD1783, + 0xA3A0CC0D, 0x47F1CED1, 0x4DA4EE62, 0x819BA59E, 0xD5DA1DA5, + 0xDC218BF5, 0x899CC3A1, 0x1DECAD82, 0x77E193A5, 0x9F390C10, + 0xF5FCD674, 0x1E43657A, 0x6B61D25E, 0x99B9140E, 0xFEFB9CF9, + 0x6569445D, 0x14C9A2AF, 0x85A33FB1, 0xE4029ADE, 0x4FABD0FB, + 0xDE02379B, 0x65C8311F, 0x3CF60630, 0xC8B179FF, 0x9D83CE64, + 0xFF683C7E, 0x6D796948, 0x249B0AFA, 0xC5A65FDF, 0x252DA26D, + 0xFE92E52E, 0x90D081E5, 0xC5A8E180, 0xEBDB0943, 0xB0E7C78B, + 0xD5A89E4D, 0x684EE280, 0x8AAB613C, 0x6BD1547, 0xD12F7355, + 0x9C5D1363, 0x91E410A4, 0xDC841FBA, 0x703A9371, 0x79F8663, + 0x553650FC, 0x633CA726, 0x20107BD7, 0x2565F252, 0xCDD93830, + 0x3446CF7, 0x92B6B42A, 0xA070B2D1, 0x5E0384D1, 0x7CC5A19C, + 0x6890558F, 0x10D308AA, 0xDFF3016C, 0x1093AA3B, 0x8927683A, + 0x9259502B, 0x2B544B7C, 0x419B1B1A, 0x22D9E939, 0x568ECCEE, + 0x4F3CE09B, 0x8B990521, 0x8D6906A3, 0xC15DEDC4, 0x98384A4A, + 0x8F2F2652, 0xEDB9D614, 0x1D010AC3, 0xA2CDC134, 0xEEE9A9ED, + 0x241DB9A2, 0xE9DB9AE7, 0x7A788F9E, 0xBD0778B7, 0x27373539, + 0x7C6B4A4B, 0x3C7A6B37, 0xDE1C625, 0xC1256E67, 0xB8E69163, + 0xCC05D09B, 0x728A1427, 0xECAC2530, 0x1DD40BC8, 0xEFE42E56, + 0xB4266BE0, 0x9AD3F869, 0xDDFC2F60, 0xEF29B3F7, 0x7C15F90A, + 0x705C2992, 0x99AC7AEA, 0xCF1F09A0, 0xB41F14D9, 0xBF3C252C, + 0xF3483286, 0xD3AC398E, 0xB84BC93D, 0x6B780D11, 0xF682D379, + 0xB8A062C2, 0x9A003A9E, 0xF18F54FC, 0xDE81BB83, 0xE84C5234, + 0x37CB67FA, 0xDB685C6, 0xBF2BF28D, 0x8CDE583, 0x94CCD0BD, + 0x8BCAF516, 0x31BE93C2, 0x3ED4B623, 0xCD23346E, 0x8254E7A0, + 0x6091EF1F, 0x17A42562, 0xC9821677, 0x447B6623, 0x19D9356C, + 0x4A1C1953, 0xD1F3B7F9, 0x99F8388D, 0x62F22304, 0x5EDF1ECA, + 0xB6C9FC2F, 0x42968E22, 0x531BD76E, 0x25E6A95A, 0xA1669784, + 0x8B915BD2, 0xA5E21483, 0x5ABE3226, 0x605C0E15, 0xFDE713CC, + 0xFAC58D3B, 0x44FAF6E8, 0x41E2D699, 0x8EE11E34, 0xB03BE4F6, + 0x75054C0D, 0x1AF2D37, 0xF38E6829, 0xE7F2A519, 0xC9CF2CFF, + 0x996DDE8, 0x395AC493, 0x42AFF184, 0xB380B71C, 0x11AA0B90, + 0x66DC636, 0x56557CA8, 0xCB8CAA43, 0x9EBF806E, 0x63F66159, + 0xA011191D, 0x17B0AED3, 0xB9621251, 0x2B189E3, 0xD45A5D7, + 0x23009D12, 0x5DEB7918, 0xFDFB1FC8, 0x46808A73, 0x91D29330, + 0xF872C15D, 0x7BE90206, 0x257E9FCB, 0x2E52FF67, 0x1852DDF9, + 0x6A2C5C49, 0x6ACF891B, 0x29FFB0E2, 0x76E32CD2, 0x588799, + 0xD71D970E, 0x9B079EC8, 0xEBD25420, 0xDDB60276, 0x761B106F, + 0x871473C4, 0xBC697CE2, 0x5378E0E9, 0x8DAECE28, 0xE5B275FA, + 0x6E6E332, 0x853884E7, 0xD0FFF1A2, 0x722D372, 0xDD5A754D, + 0x87CDDA3C, 0xA9B629C0, 0xAB2E650D, 0x1709413D, 0xDAE63819, + 0xC60DE8CA, 0x9F344BD6, 0x8E651EF9, 0x3B6A8019, 0x95CC1296, + 0xB12DAEAB, 0x8D550156, 0xF14E85AA, 0xD2547469, 0x6336E320, + 0x223B05B9, 0xB88AD493, 0xEE14916F, 0xC78AF1FE, 0x65FC2787, + 0x778FA85F, 0xBA23A57E, 0x957EA954, 0xAE4F9577, 0x47C38D4F, + 0xDB7BCDC9, 0xBA13E42E, 0x46B01094, 0x1A15F5E4, 0x315AB789, + 0x9E44B54F, 0x8C690B2F, 0xDC4954CD, 0xF176F3FF, 0x9B154C06, + 0x112BD6D0, 0xCB120BBC, 0x11101771, 0x1F29A19D, 0xC3F8193A, + 0x805D6739, 0xE3B00ACB, 0x23DD9494, 0x4F88EBA5, 0xE6F32E0E, + 0x4B76F089, 0x43B66BEB, 0xF2420B12, 0x2CFC5E01, 0x1C68D3DC, + 0x30C1BD38, 0xF3A0FCCA, 0x2AF13CD5, 0x13E38185, 0x2DEE2A21, + 0xFC318E26, 0x1954D4B6, 0x3FB86424, 0x24D698F1, 0x4AB76D48, + 0xA9E87BD9, 0xCE1DD2F2, 0xF5904D9F, 0xF614DB18, 0xF83111D, + 0x1FB56EFD, 0x5CBD08D8, 0x2D8D4884, 0xE388C534, 0x413D5BB8, + 0xEB6D14D6, 0xAE54E361, 0xF73D926B, 0x43F27197, 0x7C50A2E5, + 0x10EDBD6C, 0xD151B569, 0x47C50C06, 0x8FD59E74, 0x551C6841, + 0x2EC2B6DC, 0x5CEAB3A9, 0x1E6A1609, 0x3FB07FED, 0xC0D5849A, + 0x6354A21B, 0xEBF18830, 0x2BB3EBBD, 0x9D4DF510, 0xBBBE1103, + 0x918D6DDF, 0x3FEE7A8B, 0x4FC47254, 0xE0E1EA65, 0xF3DDB31A, + 0xADF8DE67, 0xADA31FAF, 0x2BC0B8A2, 0x184B7432, 0xFDB2E733, + 0x236B014, 0x21062C, 0x8FAAD8D7, 0xA1DA7E44, 0x3EF7F42F, + 0xA67AAB82, 0x9238F0D8, 0x42F93C63, 0xEF0F4BA1, 0xE61DC644, + 0x994EF92C, 0x71A58613, 0x371665E5, 0x82E77BA1, 0x2FFA1DAE, + 0xFE19AAA0, 0x95C72A53, 0x6A21395F, 0xC03F853C, 0xBC7B73BC, + 0xED62A949, 0x4F7D3C52, 0xCACFB353, 0xA1629BE9, 0x16255784, + 0xAE465FC4, 0xE7FC2626, 0x5E9B0FC2, 0xD109084D, 0xE30E7B89, + 0x94CD7424, 0x6127AF6E, 0x7D08ED7, 0xFA0B9293, 0x450A112F, + 0xD0D79344, 0xA204F8B0, 0x5F825780, 0xD681148D, 0x71C6AE83, + 0x1DF62587, 0x99ABC8A6, 0xCFEE8131, 0xFCD11719, 0xD0D48B0E, + 0xCC4A710E, 0x7414791C, 0x22167734, 0xD17FE049, 0x5BF15C46, + 0x30B718E0, 0x6E85104E, 0x52F72575, 0xA17F09E1, 0xCDA7B24E, + 0xDAF7D03B, 0x3632D94B, 0xBAF4E9EE, 0x390CD998, 0x168C055E, + 0xBC2D8D0D, 0x35E9F642, 0x89757E1A, 0x2BB98011, 0xC19BCD15, + 0xEEB73587, 0x6A5194EB, 0xC2C1B4BA, 0x3C8F73FC, 0x8F075D29, + 0x42D39406, 0x6674167A, 0xC0904A73, 0x1158FE6B, 0x4CAD2FAD, + 0x9A7EC8A5, 0x651960A6, 0xD0329ECA, 0xF5130525, 0xCC7C40CD, + 0x259AA3D8, 0x9669412D, 0xB92D39A5, 0x29B217D2, 0x27A07E25, + 0x9AFFD359, 0x7E8F5AC9, 0xCF7C0F61, 0x5B4F8D7D, 0x31C4E97E, + 0xBDB9599C, 0xA85BD7E0, 0x87F0BAAB, 0x2852E628, 0x377BD41D, + 0x4B54844, 0xDABF47AE, 0xA1B7AF6B, 0xCCF57165, 0xA90C4348, + 0xDC1CE2FB, 0x42582D37, 0x2892F4E0, 0xB89AC8E9, 0xB2718E40, + 0x93BCCE08, 0x5606C693, 0x1952D10D, 0x96609D8F, 0xEE3BC3C7, + 0x2DFA50E8, 0x5582FD75, 0xBDC2618C, 0xA3D922EE, 0x8F766106, + 0x184ED901, 0xDAABDE09, 0x40CBD4E2, 0x4A9A2A70, 0x9814D393, + 0xE394A090, 0x9EA06A4F, 0x2EC8C8A2, 0xFD2EAFF0, 0x2F6C96B5, + 0xBB17EF37, 0xDA677FE2, 0x2357E330, 0xA8C9DDED, 0x735A7B2C, + 0x41C2B39C, 0x787E099A, 0xFBF8204F, 0xA56A4B69, 0x7DE2860, + 0x34299BB3, 0xD1CAE881, 0x5F452DDC, 0x700904E8, 0xC3B47017, + 0xF7040305, 0x5C42BE94, 0x88AAAE53, 0x9FCAAD72, 0x2774D420, + 0xDD685357, 0x80499592, 0xC5FB26E7, 0x90BA598F, 0x4A13D60A, + 0xC6D5F72, 0x97C35532, 0x6580493F, 0x9D31E266, 0xEF926A38, + 0xF68CF9C6, 0xF770C570, 0xCA18C06A, 0xFA2BB2, 0xFBA375DC, + 0xC2FE76ED, 0xB91611FA, 0x528A8EA5, 0x360A527, 0xF631D04B, + 0xF0C67ECF, 0x4E490A69, 0x19DB46F0, 0x497DFBF4, 0x58E490FC, + 0x24A51378, 0x186BDC14, 0x90E633A3, 0x6D6F8D95, 0x2FDE02DD, + 0x4B2714A6, 0x6FC87FE0, 0x21569667, 0xDCC31F06, 0xC9D9DFD0, + 0x830AA4A4, 0x78FBFE69, 0xDF17CD55, 0x3952AAA7, 0x9A4B5A7D, + 0xB1EBF3EF, 0x4F3BC1C9, 0xDFEEBF40, 0xAB130CC8, 0x1EB84425, + 0x4625E802, 0x20B990D6, 0x4E36869F, 0x5EEC0472, 0x29194460, + 0xCA425ECA, 0xEB0742C, 0x17D07C02, 0xF38BCA14, 0xBC9D555E, + 0xF15822E7, 0x89CF96E0, 0xAA848F9C, 0x90731AC9, 0x86EECBE3, + 0x308F3257, 0x5FF375DC, 0x1E62C041, 0xFDB6A3E7, 0xDFEBED8E, + 0x8FC77E76, 0x6973E542, 0x2AD1616C, 0x99B549C6, 0xD28CF364, + 0x88C87768, 0xECA2CFB, 0xA0D0B060, 0x42DFFD8, 0xAF80A6DE, + 0xFF323760, 0x1CB2DAAA, 0xD11DE4FC, 0xEEBF565A, 0x9C986CAC, + 0xC1C95B3F, 0x6868BF0, 0xF5604930, 0x316DD9EF, 0x1231D331, + 0x95E38E67, 0x7D30C191, 0x354804BA, 0x265EE5E, 0xC6728C70, + 0xD36F32D0, 0xBBEA0ECA, 0xD055ED76, 0x9135E317, 0x8A7B9770, + 0x4D1344B0, 0xE9F29AE3, 0x7BA303B9, 0x2C38AEC, 0x82ABCBA6, + 0x7729F177, 0x71793932, 0x6FE6E38D, 0x1F8416B, 0x147D8310, + 0x6A962FEC, 0xFE2F100E, 0x4FB1D511, 0x3D38AB33, 0x58ADC416, + 0x64B07504, 0x458CC4B4, 0x584BC93E, 0xDE49B6D1, 0x7347876, + 0x4A2C3EB6, 0xDF5DE09C, 0xBFD376DC, 0xC9F451C5, 0x5F793A0, + 0x892952A2, 0x15060767, 0xE1E3B589, 0x4D513C3F, 0xAF3D2CC7, + 0x289DAA2E, 0x8C711417, 0x62E5E006, 0x3BECED98, 0x99E73ACC, + 0xDE156054, 0x1283655B, 0x5123FC41, 0x3DE21841, 0xC032F050, + 0x94B5151F, 0xA5577757, 0xCC0C8DF, 0xBDB52821, 0xD530FAAD, + 0xD070D8FC, 0x46F5BB68, 0xB02DFF88, 0xD4923EA8, 0xC85A5622, + 0x93E834A3, 0x38E84468, 0x79408C75, 0xCCB635, 0xE76BADA2, + 0xC2296DA1, 0x711543BB, 0xF441F4A2, 0xBD18127C, 0x8385BFB9, + 0xD350D4D, 0x90FAF999, 0xABD1A695, 0xFCEE12C7, 0xF428912A, + 0xC9759F80, 0x6DB6491, 0xD1421D30, 0xBC398DC4, 0xB8E0A889, + 0xC854AA72, 0x82CAAF64, 0xBB6A65BC, 0x6DCB2D0B, 0xD215ADB, + 0xF45033DE, 0xC1300029, 0x665C61DF, 0x756D1875, 0xBD2CF722, + 0xC477E3C7, 0xDDD97C9B, 0x89AE48E4, 0x65000FDC, 0x1FD717CD, + 0xBEEA764A, 0x8FC2DCB7, 0xA162EFB3, 0xD4AC2490, 0xCDA9A72A, + 0xBFB4EE17, 0x66C73CBB, 0x6B7CB021, 0xCC5AF099, 0x5389E8B7, + 0x7668286B, 0x31A223BC, 0xA66475FF, 0x9C3DDA93, 0x2F3171FE, + 0xDB89A7DA, 0x1699616B, 0xA380F010, 0xB05D7388, 0xD774EA44, + 0x64D6091C, 0xF23298F8, 0x71C88081, 0xF90C4A04, 0x2FBEEA4F, + 0x2F9178BB, 0xF8723D8A, 0x1C07FCC8, 0x36D24E08, 0xE02A8B61, + 0xFD6312AE, 0xA7DDCE9B, 0xAE45AC52, 0xCA2EC55C, 0xEEC6BE42, + 0x244F3D79, 0x994FB339, 0x8316CC43, 0xE3CEC898, 0x8D37639, + 0x833D21BB, 0x4333A2F7, 0x95F3B0C0, 0x7258174C, 0xBFCF0EF7, + 0x9A7F4883, 0x71F2406B, 0x16B2BA04, 0xE1BCEA70, 0xE3C6798A, + 0x3FBF481C, 0xF5A8D117, 0xB37ED250, 0x49AB5E0D, 0x2793A7EB, + 0x45DF69A7, 0x4EE4B815, 0x98259530, 0xC223CA40, 0xDB7B208A, + 0x4AD3C0F7, 0xE7C33E50, 0x49FD7631, 0xA228021B, 0x2C27FCB2, + 0x5F77BCF4, 0x65D593D4, 0x7C700797, 0x6E67920A, 0xEABAF033, + 0xBFC8B68B, 0x8835B368, 0x90CACC99, 0x6B90E022, 0xF2466D89, + 0x432DED25, 0xEFC94B45, 0x3116C3E, 0x1BBFBC45, 0x8FBC3D21, + 0xFB2039AA, 0x50679156, 0x450F8837, 0x73C7F87D, 0xC27898A7, + 0x7F48E602, 0x5064FCB3, 0x1EB6F58F, 0xE647C845, 0xBC8E84EC, + 0x5C4B8FFC, 0x440A88B7, 0xA490480E, 0x371DC115, 0xE1F236FE, + 0x4D65A2C5, 0xA965B0B7, 0xD05512FB, 0xDFAB9656, 0x191C627C, + 0x56B7FAC3, 0xF304A2E4, 0xC7ED6DF0, 0xD09B8C49, 0x1A1E777B, + 0xE70746BA, 0xEB582E9C, 0xFA6014DD, 0xB3B67784, 0xD3F64D81, + 0x318872EA, 0x4D241611, 0x134DF119, 0x2EA55DFA, 0x71A8D182, + 0x15AFE856, 0xD5CD885A, 0x5EA2B899, 0xF87BC7FC, 0x25DE8D6, + 0x93837315, 0x341C3698, 0x58534F, 0xF10652DF, 0x18C92AA4, + 0x17E969AB, 0xC12D08D, 0x6B0D0FBD, 0x40ACD3E2, 0x8C3AD43C, + 0xFDE55C9D, 0x25A58094, 0xBBCAB168, 0x2F06ECA1, 0x9D23A101, + 0x6F850449, 0x769C743A, 0xB63FD349, 0x3B3C852F, 0x1EC89061, + 0xFE8C7369, 0xA19C0F73, 0xB682F1D3, 0x48DAE3D4, 0x7F9FD390, + 0xEF784A6E, 0xCB23F15, 0x7BEB1E0E, 0xCBE90203, 0x6979F11D, + 0x251C50A4, 0xDAD9C59F, 0x5E4E5BFD, 0xCCD4DF48, 0x72BD66E, + 0xE7FB1B35, 0x75B4B83B, 0x29E9282A, 0x2590317D, 0x7835F9A1, + 0x25D3602C, 0xCFEC2E4F, 0x9CA2B0E7, 0xA4714302, 0x8F3D53C4, + 0xDE00F109, 0xC26D6273, 0x3E8DC623, 0xE3A972E2, 0xF67DF096, + 0x781682A5, 0x6C16F144, 0x49DC8D17, 0xB2EB82EA, 0x3CB93D91, + 0x44D4D3C4, 0x556040F, 0x1406DD74, 0x55FA83ED, 0x91C35357, + 0xF5A1C63, 0xA64E34D0, 0x7DF58C80, 0x62E97E52, 0xFBA1A2FE, + 0x8CB29D60, 0xDC1AEDE5, 0xB260BBF, 0x1AD9C6A6, 0xC60E9788, + 0xAD9DFA42, 0x2E422C17, 0x51CB5E86, 0xEB840466, 0x2666D5D8, + 0x7A0F7C62, 0xDE052A31, 0x6F0330C4, 0x9142D4AD, 0xDC8578C9, + 0x978F3E76, 0xEE43CB4D, 0x14E7EFC7, 0xB50B064B, 0xD7FB2900, + 0x67C4F4A3, 0x4D1193D7, 0x5091FB73, 0x3EB9C846, 0x960BE069, + 0x88250E7E, 0x94503385, 0x1C1F244A, 0xCFD72CE3, 0x8CD5F105, + 0x2B34131F, 0x60D266E2, 0x16BA806A, 0x25C25A42, 0x5FF6C068, + 0xD23A191F, 0x7AB5C53D, 0x9EA37FBB, 0xD1AD4B07, 0x40BCB39C, + 0xF45C8526, 0x80FEF5BF, 0x197D6D43, 0xD56FD4D0, 0xF39E498B, + 0xFB4F6847, 0x84DF289A, 0x2246F5CF, 0xF979B823, 0x42DCD843, + 0x1AB1BB0C, 0xABEC5FCE, 0x6E7EBC1, 0xE013DB54, 0x73BC8A04, + 0x88D0F71E, 0x4D93B6D8, 0x57B0B7CF, 0x99371728, 0x86B129E9, + 0xF4EB3DD2, 0x6956AA9D, 0x4C84AA0, 0xFD22CA10, 0x36E6915F, + 0xC830D7EA, 0x1EE1666, 0x1036A43F, 0x3FC86E7C, 0xF10F9CD2, + 0xEFF5F21B, 0xBF9082E0, 0xDD0DD00C, 0x80524F27, 0xDD5A3222, + 0xEA53B93F, 0x7FDA09AC, 0x89840C97, 0xC3A9BDCF, 0x1EC26899, + 0xEBCAF99C, 0x2EBB3226, 0x936A3254, 0x2E1E1786, 0x57E4CB9C, + 0xE5CDBE5, 0xFBA2458C, 0x48F3D0EF, 0x74FD06AB, 0x96C30795, + 0x14FEF0E9, 0x2F5FBA0C, 0x3CCEA60E, 0x7BA0354A, 0xCD7329FF, + 0xD4169550, 0x5FAA5E66, 0xF0C25CA2, 0xEBCC8065, 0x3F147D8F, + 0x5ED3293E, 0x6457117D, 0xE4CF4B98, 0x11F1E74E, 0xC13F47EC, + 0xBC7E22DC, 0x22512D19, 0x9140ACBB, 0x490D52F, 0x3E2D54C2, + 0x9FCBBC1B, 0x89646A33, 0x9FE4B65F, 0x92CE9ECC, 0xFBD59FB9, + 0xCE95DAD1, 0xBBCDE794, 0x9C0FA1C6, 0xCFD90F8B, 0x494C1770, + 0x21AD2AAE, 0x58EC00A6, 0xB0848A25, 0xEC4FEB5E, 0xFF1517EC, + 0x52871C07, 0x105E05B0, 0x178B1913, 0x18023805, 0xB16BBC6B, + 0xF8522A7F, 0xB17DEC22, 0x3808ACAC, 0xBC5B9043, 0xBEC01BA4, + 0xBC6CDA0B, 0x17906D50, 0x8422829F, 0x51C9AFB9, 0x54F78CEF, + 0x72CEEA16, 0x76A74B94, 0x7EC063E2, 0x51C65B1D, 0xD97ED9B8, + 0xDE89F034, 0xB5AEEFA0, 0xB88D3E9D, 0x9D4C57AE, 0xC8CEA9C1, + 0x941A74D3, 0x8E2FC33, 0xEDCEB551, 0xB91FA3E4, 0x8BA2261F, + 0xE558E0F2, 0xA4E81979, 0xAAE31455, 0x70B62249, 0xD48D1A67, + 0x11767EB6, 0x823DFECA, 0xC815C538, 0x2AB67EE6, 0x22FA86BA, + 0xD7A1F96C, 0xBA96E382, 0xB75B3FB7, 0xCB705FAF, 0xD1B9D3E2, + 0xD4C8DC2F, 0xF954B0A5, 0xDABE493B, 0xCA3FBB37, 0xBBDC387C, + 0xA30C87D6, 0xB5B493D5, 0x584F5615, 0x90FB6370, 0x5544A92D, + 0x980F7FA2, 0xF1459235, 0x130B11BD, 0xC7A44998, 0xFEBCA776, + 0x7943BE84, 0x72C99B04, 0x353F6042, 0x66F5C2F2, 0x9C5B2CC5, + 0x9FF06E41, 0xAC9E5492, 0xFF9A1CC8, 0x4429DE05, 0x97845307, + 0xDBA36668, 0x40BEBB2F, 0x606DBA6A, 0xDE7A4225, 0x9AF7FB71, + 0xE97A0E6C, 0x99C2AA59, 0xE00C525B, 0x5D4F9521, 0x89C5D7BB, + 0x18481C9F, 0xA27A1F59, 0x2A6267A3, 0xC467981A, 0xE04CE94D, + 0xAAB2AC1D, 0x5FD1AC86, 0x8F33E395, 0xE1FBE285, 0x636C2961, + 0xD838584E, 0x2F845D90, 0xAD52A8ED, 0x8F8C841B, 0x829A3861, + 0xAA0FF413, 0xA079F240, 0xB15D507B, 0x93722B10, 0x833AF929, + 0x4FB5B879, 0xEDD3031D, 0xE22CE740, 0x9ADF835A, 0x13A0C7A3, + 0xD5791B98, 0x99D9409F, 0x9F776A0E, 0x8665EC9F, 0x7301EF7C, + 0x9B341035, 0x59EADE7F, 0x242C1ECA, 0x20FD13FD, 0xE22DAF76, + 0x3859E84D, 0x6ED83DA, 0x54ABF391, 0xC43F4740, 0x4661F86, + 0xC6442213, 0x7FEAF294, 0xC0CAC024, 0x38B9FA9C, 0xFFF33259, + 0x1AD86335, 0xB365445F, 0x54B58378, 0xFD7AE96A, 0xE019B245, + 0xCF51C4EC, 0x604D7EE, 0x7B40C023, 0xA5E168B0, 0xD7B8C643, + 0x91C028D3, 0xCB939A6B, 0x169B0123, 0x96FF8CFA, 0xFCB3E126, + 0xB95C01B1, 0x1758BFB6, 0x50F50968, 0xF774D536, 0xC5A8BFE7, + 0xE2496BE, 0x6FB8D434, 0x3F7FEDB9, 0x9BDEE991, 0x1CBD2009, + 0x2CE74DB4, 0x1CB51025, 0xE965ECE6, 0x89100034, 0xA089E8C0, + 0x5860A65B, 0x9C4D349E, 0x54898852, 0xD07C9738, 0xBC677E89, + 0x75B5D0C1, 0xCFD435AF, 0xED550357, 0xAED9301, 0xDCD1734A, + 0xEDCD21D7, 0x69F6A592, 0xEF8009F7, 0x44374358, 0x9405770D, + 0x668AC4FA, 0x50507E61, 0x2DB19DDC, 0xA9BDD137, 0xFB722699, + 0xBC067E88, 0x88740174, 0x717CCEDC, 0x9F7F1E11, 0x389F4CC, + 0xCF4D0018, 0x24588FF1, 0x25C9F951, 0xDA660468, 0x6C09D91C, + 0xC9F788E, 0xDD4DF43F, 0x8B04484A, 0xC7F67DDB, 0xD2939F8B, + 0x96BCFDE5, 0xF6DD10D8, 0x1124A3BC, 0x7C281FBB, 0x5FAFA71B, + 0x58A9C493, 0x4747793C, 0xD3B79E72, 0x357AA675, 0x8E94A74B, + 0x1994025, 0x95D10FB8, 0x5C64AE63, 0x9E37973F, 0xFCE67009, + 0x8480F94E, 0x34DA26F7, 0x126CFB46, 0x206AAA6B, 0xBA0A6200, + 0x8DF3F67F, 0x4936802F, 0x950F62F8, 0x17E64C44, 0xC70E523E, + 0x2F910727, 0xAF7C5BC, 0x9EA24508, 0x1E945729, 0x55E48FBD, + 0x897CB57, 0x8C134FEB, 0x54E68223, 0x91912044, 0x7A461BDB, + 0xCE91309, 0x72135AF, 0xBF94D484, 0xDD752690, 0x32248D12, + 0xEA092355, 0xC24CA220, 0xE8A95D65, 0xE4E2EAE6, 0x664763E9, + 0x71F1AA47, 0x832550FF, 0xFFA73B6B, 0x96F5DFF6, 0x60CB9B66, + 0x75F29F5C, 0xF863AC8F, 0xF16993FC, 0x3503801C, 0x3D1E8B2, + 0x583CDFF6, 0x62AD49F2, 0x8261843F, 0x826EA9B6, 0x5E2EF3, + 0x8D3848EC, 0x7391A581, 0xDFC466FB, 0xB38DCBD1, 0x4145C3C0, + 0x73F322D7, 0x2B55F284, 0x6B19FBA6, 0xD9446AD1, 0x36C330C5, + 0xB71E4B29, 0xF29F504E, 0xB4FA4CFB, 0x290B6941, 0xA2197E21, + 0xF2AAE27F, 0x1A1728B5, 0xAFF5632, 0x6AEE763B, 0x2962A376, + 0x965D67E7, 0x231A8B76, 0xBD3596FC, 0xD4AE3E8D, 0x58D4D740, + 0x4EA3B6DC, 0x5479A7F5, 0x110A4791, 0x9A772A63, 0x728C4794, + 0x6D6A0801, 0x3F89D9E1, 0x326D1BC4, 0x49B3798, 0x5E2B3CA8, + 0x742C385A, 0x89450FE0, 0x24236A74, 0x81AC9891, 0x7BEF3C66, + 0xACECD674, 0x29009073, 0x94D6BDBF, 0xF2C6CDF4, 0xDBC21EE3, + 0xC65C89A4, 0x35DC5337, 0xBA281430, 0x787521B0, 0xADF8317E, + 0xD5739B77, 0x8567F3A2, 0x374E0CAC, 0x5AFFF50F, 0x9654D41, + 0x4A86EDEF, 0xE16C9A62, 0x59D15E49, 0xA69769C8, 0xA9197100, + 0x1E04CB9F, 0xA926CCB8, 0x5047C429, 0xB7E369C, 0x812F5F0A, + 0xA53EA5BA, 0x9AE5C105, 0xD4C7CC5D, 0xC99E02F9, 0x5BCDFE96, + 0xCDBAA854, 0xCF209B89, 0xBE08E9B, 0x5C73AED2, 0xBD959602, + 0x63C309AB, 0xEE289A4, 0xEDA954C9, 0x5C54F616, 0x3BC34487, + 0x47A3C772, 0xAB0084A4, 0x2CFB8D44, 0xF5F8411D, 0x43F6361D, + 0x12B8467F, 0xCDC437A5, 0xAC96A375, 0x7962CD18, 0x5D728EF4, + 0x66B11DEF, 0x73C87A6, 0xA35AEF9A, 0xC84F12F7, 0xB1EDE9B4, + 0x2F6A1752, 0xCF8DA321, 0x2E37F4E0, 0x4985F516, 0x684E49AF, + 0x56287772, 0xF74F95EF, 0xD994FF05, 0xC1D23E99, 0x81214F78, + 0xA5DF2934, 0xC2B686DB, 0xABC54017, 0x6918D067, 0x737A798C, + 0x3904B21C, 0xD4CB6EFF, 0xC256E4F8, 0x38B0CD4D, 0xE2D27089, + 0x75A00DC2, 0xDC1D5E7B, 0xE2295307, 0x2F0A683C, 0xD00AF450, + 0xE45C3252, 0xD86804C8, 0xF9628DB9, 0xEA011DB9, 0x6A67523A, + 0x488B54B3, 0xA292CDEA, 0xB1D1D89A, 0x17415325, 0x3EAD3D80, + 0x5D092525, 0xB5880E29, 0x1104A8AF, 0xBC177790, 0xEC730159, + 0x11B0A1AD, 0xB809FD7C, 0xB23FE31, 0xCCBED7C8, 0x45B7F7BF, + 0x9491B0EB, 0x1B1A90F9, 0xE34F4317, 0xF060A5B3, 0xF795EF1, + 0x8254A941, 0xC6CC30E4, 0x770FC40C, 0x17EC9C1F, 0x20DA83EF, + 0xF9CCBFC9, 0x9D0675AD, 0xACEA7EB3, 0x56326F5C, 0x74D4DF3A, + 0xA8FF9A9, 0x8F55E3E2, 0x5B0D12F1, 0x12DDB28C, 0x95FADBED, + 0x81F48694, 0xABEE8392, 0x90E96B15, 0x2C44972E, 0x4E2D3A4F, + 0xE8D34D14, 0x83C03E59, 0xDC295E2E, 0xDDEA452F, 0xC2A2A33F, + 0x617210DE, 0x69542DB0, 0x1DD96D24, 0x3E3871D0, 0x9DDDAF6C, + 0xBD326CD5, 0xD87CE143, 0xF3C79B3A, 0x7F811CCD, 0xDE1B1502, + 0x8075EA04, 0x9D09F1DC, 0x8CCBD152, 0x669F35C, 0xC9414276, + 0xA2BFFE0E, 0xF8AAE650, 0x190C1AE7, 0x2DBB4A7D, 0x575B247D, + 0x3A599D3E, 0xB09B4DFC, 0xCE4904A0, 0x63C72670, 0x15A3BD05, + 0x799B50CD, 0x19A2718C, 0x4142750D, 0x9013BE74, 0x21288938, + 0x590BD2BB, 0xE4303149, 0x46B308C0, 0xD2BB7D56, 0x1BFB248, + 0x943B2E72, 0xCAB18644, 0xFCC921C4, 0x5308C4D9, 0x9098CEE2, + 0x435B219F, 0x69F1BBE5, 0x155216D4, 0x83F2A4A5, 0xE177744D, + 0x37DF6FDE, 0x9D9EA50A, 0xDFA8D408, 0x6C72E71E, 0xEA617E3E, + 0xDAD6C13B, 0xB83A850D, 0x45F6BEB5, 0x6AFB346D, 0x400B29FB, + 0xBC8E57DE, 0xC6C1081A, 0x4F6A9545, 0xF878303F, 0xB9E519DC, + 0xCCF25FBA, 0xCAE069A5, 0xB79B082E, 0xF70BB7E7, 0xE6A5535C, + 0xB769EA37, 0xE07CCBCE, 0xA9F04406, 0xBB7E5A7A, 0x10C986, + 0x5EB448A0, 0x3B154163, 0xCB832FD3, 0x50100140, 0x6963216B, + 0xEF480040, 0x75B83F45, 0x4A07D8C5, 0xEFDF39B2, 0xDB139034, + 0x5BE9C8C9, 0x1915F818, 0x852ACD9, 0x58BFF825, 0x64AF5C20, + 0x1F13AFAA, 0x8A5A1E9D, 0x57870533, 0x98A418CB, 0xCEBDAD9D, + 0xFA54CB95, 0x707D0BBA, 0x26EE1F10, 0x428CAAC6, 0x33AC77D0, + 0x6879957E, 0x522DCDE5, 0xE29E9579, 0x4AB0C59C, 0xB5FA1395, + 0x4C0BA116, 0x297A0F00, 0x440CD4CD, 0x63BCFEC0, 0xAC14638B, + 0x3C7DF738, 0xC213D3AE, 0x5CA0779D, 0xB49A3458, 0x678D95A9, + 0x281735D2, 0x1911DA83, 0x3A5EA479, 0x2C1090F6, 0x40C0D5E7, + 0x33AD6433, 0x49B076BB, 0xA1C1D333, 0x80474C82, 0xC62FE221, + 0x87F4E57A, 0x4C5C1506, 0xAD5E1E10, 0xE435A8C6, 0x96D7E0E8, + 0x53E54D01, 0x7EECEA8B, 0x699C41E0, 0x181C6479, 0xAE6E687E, + 0x2FD27BB7, 0xDF60DD39, 0xC38A3AC, 0x5AC51EC3, 0x8F1205E1, + 0xBD71109C, 0xCB2CCA62, 0x236D9D16, 0x45ACA6BD, 0xB33BDCE1, + 0xE1D9134F, 0x410F24FB, 0x3BF34DF6, 0xB799F963, 0x1B2D4C07, + 0x8D92C15, 0x9CA0073, 0x76772A47, 0xFBB63B16, 0x78F3C3B7, + 0xF118B4A6, 0x8E86A34A, 0x56693D7E, 0x381EA186, 0xCB9B430D, + 0xAD11DC36, 0x599B3370, 0x7A6B80C0, 0xF2A282DC, 0xF58F96FF, + 0x97AADB3A, 0x5AA06FD, 0x44A43553, 0xBE8097C6, 0x4CF5002D, + 0xBADE20DD, 0xFEC25B7, 0xC8B50C4E, 0xF0C899D4, 0x815F9958, + 0x77772B46, 0x7413F82A, 0x7203A939, 0xF4623F73, 0x35EE625C, + 0x2723BC68, 0x33790B09, 0xA58391E4, 0xA27C7C25, 0xBC032556, + 0x1D812AD4, 0x301BB65D, 0x22FAF223, 0xDCBB79DE, 0x78CE1CBF, + 0x570C796B, 0x17EF8909, 0x8E2C32E5, 0xB54FF82F, 0x7702F70, + 0x1C0A78C2, 0xCB3078DF, 0x7155531A, 0xEAC77450, 0xB9DC2EDF, + 0xA8B6A1A6, 0x57FC52F0, 0x6B5543E4, 0x40679BEA, 0xE46813E7, + 0x65525695, 0x6C9CD43C, 0x5E5BD786, 0x44212626, 0x847A8357, + 0x7E39813D, 0x9FE22F0E, 0x29EC985A, 0xC91CF47C, 0xB31A26AC, + 0xA4C8B43C, 0x8EAB7865, 0xF6F2F67E, 0x3F73A8DC, 0x4FAF5455, + 0xE1253CAD, 0x3001A083, 0x532DEAE4, 0x6A110DF6, 0x585D0FDE, + 0x19071CC0, 0x1A351A69, 0x2FEAD890, 0x33902499, 0xA218C193, + 0x2294A970, 0xB0544EA1, 0xC54B25F0, 0x6C89048C, 0xC8203390, + 0x237F30DA, 0xE8F10E5F, 0x6B57E331, 0x43744B6E, 0x2EEF4BB4, + 0xEBD13AA, 0xA9024B04, 0x22895C31, 0x321C459A, 0xFCEFD3EE, + 0x94772392, 0xA094B3F3, 0xC070FBB2, 0xF30ADCDF, 0x8D294C6E, + 0x89E4C299, 0x47DE058E, 0x841A807E, 0xDEA7608F, 0x3A45D7AE, + 0xFE08A063, 0xF2C65E08, 0x4C653ADB, 0x8E4BED1C, 0xC85C1323, + 0x63DF1750, 0x4EF4B72F, 0x209903A9, 0x3ECCC1C6, 0x4283795A, + 0x205AC943, 0x38B1ABE3, 0x1241AC5D, 0x7C645871, 0x747695BB, + 0x29206570, 0x31BACE6E, 0xFDEEDAC9, 0x4DEFF536, 0xCD6CFDC0, + 0xEB0FAB42, 0x7DFA5EB6, 0x8363D9BA, 0xCFCD2514, 0x69FEB823, + 0x10BDBDCD, 0xE4C27020, 0x56DCF966, 0x9C97BD95, 0xCDAB9269, + 0x8316F55E, 0xC62F7354, 0x5415281A, 0x31EBDCED, 0xCDF7A05D, + 0x5F674F71, 0xF70EE58B, 0x26037964, 0x584174B4, 0xFEA5520C, + 0xD01A8007, 0x7F2772E8, 0xC2FF1456, 0x7B2CA1FB, 0xE938BBD0, + 0xD96CCCF2, 0x9AE8088B, 0xF3A25E6B, 0x3780417E, 0xB9E2917D, + 0x95872990, 0x12D99C68, 0x2FC5DDB0, 0x55437D2B, 0xDB9C14B7, + 0x6BBE6AF9, 0xFBDC9201, 0xDCB32A70, 0x1CABF45D, 0xD8BCBF4F, + 0x271AE6A5, 0xD34B8953, 0x58BBFB3A, 0x537F049A, 0x55B51226, + 0xCD809DC9, 0x846DB4EB, 0xED476D72, 0xEFC8F8AF, 0x6AA3228D, + 0xA363F656, 0x2207127, 0xA1BBE245, 0x2AB58A00, 0x637810C9, + 0x91F61AD, 0x347D333B, 0x1E9598E3, 0x2E7BD8C6, 0x8DCE469F, + 0x73B82620, 0x9257D4E0, 0xD9580F88, 0xE8EF6D53, 0x2D9FAC45, + 0xB56E2C6, 0x9B369045, 0xB50702C6, 0x955D3700, 0x577CC21E, + 0xED02FCBA, 0x73320B99, 0xB55DE16B, 0x7F578129, 0x3F6FD052, + 0xF211A764, 0x9B7F9204, 0xC61EDC01, 0x1363AA4F, 0xEFAF1CF2, + 0xE5AF97EC, 0xEEAD4FB7, 0xF41B649, 0x373087FB, 0xE81355EB, + 0xE04FF410, 0xFD04F4F7, 0xFA269CEE, 0xBE8D7535, 0x5FC007DE, + 0xCF085F76, 0x94D7201F, 0xAF49F41D, 0x8D6E7F, 0x9D63B6ED, + 0x9A2A0877, 0xF06123D9, 0x6624C891, 0x508266E4, 0x6921EAA4, + 0xD6E69A49, 0xCDA0F920, 0xA5870B5E, 0x1A93A2CF, 0xE3A030C6, + 0x6EC03FE5, 0x37FDBDF6, 0xBEFD0BFF, 0x3D3CBD0E, 0x2DDBFD7D, + 0x8B58AE2B, 0xCAD61AF3, 0x624F4677, 0xC402CF5E, 0x431D2CC1, + 0x5C205AE5, 0xFC3B8ED4, 0x501C36DA, 0xBC9217E5, 0x6752573D, + 0x3BE702E, 0x8E06CF12, 0x81494C86, 0xB2DC2F63, 0x792EC845, + 0xC6BDEDB5, 0xB255BA4B, 0x6C66C28D, 0xD1A16904, 0x93ABFF21, + 0x94827FC4, 0x87825689, 0x314D1F33, 0xC0D8B98A, 0xC84AC57D, + 0xEBDB0F92, 0xBA4F473B, 0x61130498, 0xA534064B, 0x3DC04FBD, + 0xD0A701F2, 0xA671765D, 0x17464B7E, 0x4CCCB84, 0xC297BAED, + 0xAAF8C84A, 0x631313F, 0x8E0FD926, 0x1699F616, 0xD9808C9D, + 0x55BF5BC2, 0x27FD10B0, 0xAE975927, 0x92B3F52F, 0x9025C6B3, + 0x95E5E313, 0x4CB83334, 0xE4A1E7B8, 0x74F7D3D5, 0xDDDC42B9, + 0x5A89BEF1, 0xF66A6AE5, 0x33730C23, 0xEB7F079E, 0x742FEF19, + 0x2C68CAC5, 0x2410679F, 0x9D1632DA, 0x458F4AAD, 0x8889E6AE, + 0xA3B48216, 0xC9AF4AEC, 0xA506C8F6, 0xB6AF9E59, 0xC6340436, + 0xA6B294E, 0xF35CF92B, 0xEB3A4113, 0x98070AD1, 0x9E61E01E, + 0x58C2893A, 0xCC1F8C34, 0xCAD665A0, 0xD0414D39, 0x643BDCD8, + 0x8AF801AD, 0x9ADBB106, 0x2BD02351, 0x8F890436, 0x546747D0, + 0x6DC33C48, 0x95FA7FD6, 0x5F12C5A5, 0x5DF2761D, 0x9A9B2F8A, + 0x8C61276B, 0xACCC7F4, 0x37A5829D, 0xF1A0F1, 0xAAED57E0, + 0x180CD2A3, 0xDC393CA7, 0x504E7405, 0x89DE2F7, 0xA4D8C4EA, + 0xD8BECE01, 0xD664017C, 0xF57FA30, 0x6049928D, 0x9832E166, + 0x176AAC31, 0xA793F88A, 0xCFFA8B54, 0xA30DF1EF, 0x3B6C7611, + 0xDEFC961, 0x9BFB79F1, 0x1483D430, 0xC3A77C0C, 0x42AC1FA0, + 0xFA3605B6, 0x9A2EBDF0, 0x684D414E, 0xD9308E10, 0x64D68C19, + 0xA8A9B67B, 0xF5E7B9D4, 0xC7B70ACE, 0xA6EB6DB8, 0x8A22FBE2, + 0x3AFFDDA1, 0xFB61F7D5, 0xE057717B, 0x846D96CB, 0x20A4B400, + 0x574089BB, 0x9F3D2DBD, 0xEEDDDB4B, 0x5E64EA6B, 0x6781DC90, + 0xCFD86A6, 0xA92441CD, 0xAC5DCCD6, 0xE6BB5582, 0x32FA6B3F, + 0x3ABB8A64, 0xA49D2003, 0xA965E430, 0xEC4053BB, 0x95859D40, + 0x2672832, 0xCAC3E608, 0xF8C13A53, 0xB04EC2A3, 0x87F54941, + 0x62A3A924, 0xE0B48702, 0xE8700446, 0x95BD4B11, 0xCFCFDF9A, + 0x19F67E7D, 0x60853AC6, 0x468F963, 0x298066B9, 0xEE53E89A, + 0xFC63E607, 0x6FA101E5, 0x8B2F1F84, 0x24AE7C1C, 0x385008FF, + 0x96E75EB6, 0xF1175277, 0xE5B4A577, 0xB0C97AC, 0xC21CC45A, + 0x5C680DF8, 0xDEB046DC, 0x1487FC03, 0x1D90CE3C, 0x712563BF, + 0x65A26CD9, 0x4D094F62, 0xB5DFE29C, 0xF58B2A62, 0x9420A9DC, + 0xCEC7537F, 0xC46D1FCA, 0xAD5D7B10, 0x68777A24, 0x6C096D2, + 0xD787D72, 0xC7743F50, 0xB3D05F4D, 0x53E0A7E3, 0x9E627C6D, + 0x1AA0959F, 0xD1E00E47, 0x8874BA26, 0xCEAC0958, 0x10F67BBD, + 0x712C6597, 0x3478BD73, 0x4D6F116, 0xD30BC24B, 0xB98C565A, + 0xD7C5B116, 0xA8CDAC4F, 0x4144673, 0x848F37E3, 0xADD946EE, + 0x6F17EAE3, 0xEA0FA265, 0x41DB99E0, 0x6BCFDA5A, 0xB46ECED5, + 0xAF67610E, 0xC7E9DF2C, 0x5CC6F0C6, 0xAB2C2BA, 0x6BCC3881, + 0xE482C243, 0xD8053417, 0xFFDB6E41, 0xF13EEB84, 0xE8292661, + 0xEB9940A6, 0xF0B45F98, 0x1CA82AF4, 0xCCA7771D, 0xDD5F3CFE, + 0x58BD8E91, 0xDF9E3342, 0xA1003957, 0x4621AF52, 0xF926F465, + 0x209925AD, 0xB1C72F09, 0x3FAB8ED, 0xA15C0A17, 0xDBE73D2C, + 0xF917CE51, 0xED047661, 0x7361B752, 0x1AAA57A8, 0x31445667, + 0xFEC0FD81, 0xE3073574, 0x7D36F720, 0xF418181A, 0x1CB8758E, + 0x8E85AFBA, 0x407E9AD9, 0xF724E308, 0xD030D3ED, 0x4610418E, + 0xE799EA4D, 0xF8B68F92, 0xB84B9ACD, 0x4B8168C0, 0x9888977, + 0x216F3B3E, 0x5C49C1DB, 0x759E718D, 0x7C4309FF, 0xBF6DEE2C, + 0xE566F231, 0x774B0A7A, 0xBE55CCFF, 0x3081B8CD, 0x2284369E, + 0x2FDF7473, 0x3AF68AC7, 0x6047E9B8, 0x3743BA0E, 0x691D261, + 0xADC440E1, 0x24150207, 0xFBFE466C, 0xF767E860, 0x8157332E, + 0xFB54D774, 0x1AF34C22, 0x74E05695, 0x2101FD57, 0x2904274C, + 0xA1294E9A, 0xF43CA18F, 0x4FA79EB5, 0xAFD1C9EE, 0x6EB3953F, + 0xDDFCB3AA, 0xDB48F7BA, 0xE1742183, 0x8A78CEBD, 0x225CD669, + 0xD76B771A, 0x3520113, 0x428B2892, 0x3A5CE8DD, 0xAB4AC42C, + 0x2928BE8D, 0xC34E3031, 0x93F0CB9B, 0xB7A6FDB4, 0xEEB2B85E, + 0xC393597B, 0x9D8457EF, 0x91F0F0FA, 0xC54AEA3C, 0xC639521, + 0xB668AFE4, 0xE4CCE3CD, 0x86223A5D, 0x6A51A2EB, 0x4333C505, + 0x3233B8B7, 0x1D01F51E, 0xF0C691A6, 0x699EBC2C, 0x7FEE8DBC, + 0xCC50E42A, 0x7951DB68, 0x8CF01752, 0x33D33841, 0xB46E353A, + 0x700B65B, 0x59ACA844, 0x38631893, 0xC32D0F92, 0x6897EFDD, + 0x3F93BCDD, 0xD50E33C3, 0xD0075F1D, 0xB3CB6096, 0x875896CB, + 0x5DF6651, 0x8E2D197F, 0xCDF68F10, 0xC74018CE, 0x83E6C42A, + 0x994DEA76, 0xF932D8AF, 0x98775C2D, 0xF79CAAE5, 0xF2BEB839, + 0x7318C6DB, 0x3AFD6D85, 0x37F18BDF, 0x10194867, 0xA73B5205, + 0x3F06A1BD, 0xBC8026DF, 0x531CF753, 0xCAFAED74, 0x817C9E70, + 0x32338A3F, 0xA5177C74, 0x9A3C131F, 0x90F9AF0, 0xE9281B62, + 0xEDD87C1E, 0x16577CB0, 0x5E3F7AC3, 0x4E49E1EA, 0x495C1B67, + 0xC282F5FE, 0xF8993B1, 0x47563C68, 0x49FA0716, 0x26A55B80, + 0xDF870F8D, 0xFBB8DDA5, 0x130EA4E3, 0xB0B66F1A, 0xD7B92F0F, + 0x55FD4759, 0x6D11AC86, 0x8AB0B6F8, 0xD8C8C8B0, 0x758DA8A, + 0x9CD589F, 0xB808C0A0, 0xB2C7A3F3, 0xBA40DA44, 0x937532CF, + 0x279CFDB2, 0x545896EA, 0x387A8F38, 0xB2E5F9D0, 0x7566CA0D, + 0x51B45DC4, 0xA93B6EAE, 0x1C22D8D5, 0xEB96BD1D, 0xB8F40750, + 0xCB7DCF85, 0x188F6018, 0x95BA817E, 0xF7C19E4E, 0xAAF97DDA, + 0xE5BD967B, 0x1604352F, 0x3758C3BB, 0xE2FA13D1, 0xE3666F4E, + 0x218059EA, 0x2F4750EA, 0x2F065B46, 0x8FC4F43F, 0x2F45422F, + 0x45928A5E, 0x77055776, 0xBB8103E1, 0x160EFF29, 0xA704F79B, + 0x6655E735, 0x2C19DC79, 0xE407A7CD, 0x9F4AE1F0, 0xBED7DCE5, + 0xA870A304, 0xDC413709, 0x903181E, 0x7C1F6803, 0x44971A01, + 0xF7A81ED1, 0x5DDFB023, 0x2D90CFBB, 0x7F7A432A, 0x35F3F5B0, + 0x7D935FC5, 0x1D99E7BB, 0x8EFC82B0, 0xAB0DEF56, 0x70702FA1, + 0xCF0064DF, 0xDD9DEAA9, 0xF05F927B, 0xB483A6DD, 0x9B7388B8, + 0x2FD82389, 0xAC982F20, 0xC86AD76F, 0x15C6977C, 0xAB10A137, + 0x1433E4A0, 0x2762D44, 0x1CB5399B, 0x310A54D8, 0xD4B8623A, + 0x40FAB5F3, 0xC2D51618, 0xC1F4AF55, 0x17C18E1C, 0x4F37D33F, + 0x2DC9F168, 0xF5BB9754, 0x716FB1F4, 0x7CFB1CE8, 0x1333224D, + 0x344C13B3, 0x7798CB50, 0xB4278C76, 0xD7CC1B03, 0x168B21E5, + 0xF7D77AAB, 0x3B651846, 0x639EB0CD, 0x68EB3E8B, 0xEC82FE45, + 0x622A71DE, 0xAA05B6CB, 0x878B59B1, 0x3E7FB616, 0x1D650408, + 0xF21F8C64, 0x9BF7BF7A, 0xA0874898, 0xFE4E3C6E, 0xFA36122E, + 0x1BCDF4FB, 0xC371B365, 0x8F791BB3, 0x9833AD98, 0xE84887FC, + 0xF8988AB6, 0x180916E2, 0xB587E39C, 0xD5C884C6, 0x27B6BFEB, + 0xD8868D1E, 0x689DA503, 0x936B4EFC, 0xDE0DB3C, 0x7950FDCB, + 0xA61C81C5, 0x9F1C93B2, 0xC983179A, 0x6F847EB0, 0x6F7F899D, + 0xD270412, 0xCC255717, 0x763112A0, 0x8725C96D, 0x48BC2863, + 0x85F13BF0, 0x6D8E0251, 0xB7E66CC3, 0xA4F5829F, 0x8779F381, + 0x16A5E04F, 0x3DF42C14, 0x367F06A3, 0x3BF8666C, 0xC6649CFB, + 0x4DD9808F, 0xB4F9AFD, 0xC2642410, 0x9740E4F6, 0x8FB667BE, + 0x4D4B0D3E, 0xE9B236F7, 0x6E30550C, 0x79DA7B48, 0xE721889D, + 0x79D9B21A, 0xA06B8C2E, 0x997B1696, 0x4383FC27, 0x8B77D293, + 0x6FAE2A9F, 0xB45ED194, 0xF38E2C59, 0xEAA0D05C, 0xA3BC449A, + 0x6EB0BB4B, 0x6B242CFF, 0x7FCA0B8A, 0x47221D33, 0x4E18FE39, + 0xF4691580, 0x6D03D791, 0x3B937AC5, 0x9CB761C3, 0x42812232, + 0xFB987D6C, 0x86AD164E, 0x5D8CED49, 0x22D6D058, 0x42FADF98, + 0x9363A1B3, 0x83C6DB74, 0x7AF44F4E, 0x20086D60, 0x7A37665E, + 0xC4A29C82, 0x330F278B, 0x8750B539, 0xDD2E83D0, 0xB8E002B1, + 0xF2A9323F, 0x91B60885, 0xDE83F01D, 0xACA126, 0x2F0FADA2, + 0xC0E879A6, 0x7C715655, 0x16642BA2, 0x43B9C083, 0x95F6789D, + 0xE6576886, 0x46BEF133, 0x84199FC3, 0xC45BA082, 0x26489AC1, + 0xA4FE268A, 0x633A25B0, 0x4FCD341D, 0x8E7374B3, 0x7F8A3466, + 0xC82B53F7, 0x2E2114DC, 0x59213BE7, 0xE72A2395, 0xAC5F982B, + 0x8F63E9D8, 0xA68BA42E, 0xF0E30E92, 0x580FD13A, 0xB2FCB7EA, + 0xF3E4C077, 0x2C8588B, 0xC31F5E5, 0x104982D9, 0x2C2F03E3, + 0x8F1791C, 0xCE14310F, 0x1696133B, 0x1BC68D6D, 0xFC488B95, + 0xE0E7FC31, 0xBDF0152B, 0x24F78B82, 0x45BD4367, 0xC89AF4B9, + 0x9698650F, 0xFB2E131A, 0x82B7A451, 0x9F6990FE, 0xB6EDE6BB, + 0x68D5D90, 0x51FE559E, 0x9B54ECE, 0xC09D3AB2, 0xD9BA990B, + 0x4CF02BC, 0x70067D7, 0x3568DF20, 0xFF1D7AE4, 0xF1C67DE3, + 0x5ACC7F95, 0x89ED16EB, 0x6EDCDC94, 0xDF367991, 0xF1D48A79, + 0x21AA30FB, 0xADA2B5B3, 0xC40A5761, 0x5769556B, 0x5E1510A2, + 0x5741566A, 0x25B88D83, 0xFD22574E, 0x6E9B2CD2, 0xF5CE960B, + 0x67F938EF, 0x1A1E3672, 0xFBCE5BDB, 0x756BACAB, 0x2F177A71, + 0x31F3EFC6, 0xB8263FBA, 0x9A1F772A, 0x84DC1FB0, 0xC907ED89, + 0xAD3C6092, 0xC225B6C8, 0x37EE4F54, 0x4BDDACF2, 0xB5E944CB, + 0xDC26F39E, 0x3BCE02DC, 0xC01F2632, 0x89AFE3ED, 0x600757F7, + 0x4804A684, 0xC4F3FCB8, 0xEBCAA904, 0xE0069A2E, 0xA2FBD213, + 0xDB736C4, 0xA6930699, 0x71FB43C0, 0xF66C955C, 0xFBD39B5, + 0xC87D1801, 0xE9D2DD1A, 0x78DA23CE, 0xCADBA5C9, 0x77015761, + 0xF5581BDF, 0xDEB4DAA0, 0xAF7E41B0, 0x71347196, 0xF8A29A93, + 0x8DA3BAE6, 0x73396AAD, 0xD4DF7765, 0x326AFF23, 0x27888A0C, + 0xE48AC062, 0xB9F18047, 0xDE9830DA, 0x8EF78C4D, 0xFBC1896E, + 0x9BB566A6, 0xB640ED13, 0x8B0D9D1E, 0xD84B471D, 0x4040EFB4, + 0xF6DF7908, 0xCB8ACF04, 0x253494DD, 0xA85F6D88, 0x1326822, + 0x61EFDFB8, 0x1C78154F, 0xB13866B1, 0x3ABE5DBB, 0xBB5907BF, + 0xA1A57FDF, 0x410549C8, 0xA9A364F4, 0x2A371B73, 0x24AC7296, + 0xA01C035C, 0xE839029C, 0x6E12051E, 0xE6A549FD, 0x345F10FF, + 0x3BB57347, 0xBDBF3A6A, 0x2A41C3C8, 0x6E0232B0, 0xAE66D42E, + 0x3BE90433, 0xE185FBF2, 0x9BCA91FE, 0xF4FFB74E, 0x142B6971, + 0xA75CD7B, 0x9B900DDD, 0xEC56B79, 0x2FE0CD8D, 0x87BE8237, + 0xB38A7226, 0xB5D8B437, 0xAAADC41D, 0x8014E227, 0x38D84DD1, + 0xEDF5294F, 0x862F0F, 0xD69F77F6, 0x409C3B68, 0x2F12B0FC, + 0x32A670B9, 0x5746EE2, 0x96B4901A, 0x57208639, 0xA282A77D, + 0xE9D9F48E, 0x651ADDA6, 0xFF5E974C, 0x37C833C, 0x41F2BD58, + 0xDFE1D009, 0x32222DA6, 0x22201781, 0x64A06BAF, 0x8F188902, + 0xA9C2A07B, 0x617C7DF7, 0x842DA704, 0x40AFDB72, 0x49625110, + 0x72484F13, 0x7340AC89, 0x6C6A2F36, 0x828EF5F9, 0x20344923, + 0x21D3304F, 0xD6EEB7C3, 0x8F99732F, 0xEBA045D5, 0x5C0065D4, + 0xEEB5E899, 0x1B079C47, 0x6198EE3B, 0x946A805F, 0x7C19F966, + 0x75E8F043, 0xFD9880BE, 0x47BF619, 0x9C001ADB, 0x7438184B, + 0xA3787EF2, 0xA461EF4E, 0xEB515D0E, 0x64EFA69D, 0xD41F3145, + 0xD08A900B, 0x495968AC, 0x746639C9, 0x43E85DCB, 0x62E55B3, + 0x6B913D8E, 0x2685D73B, 0xE4F98C19, 0xB404BD4B, 0xFEA327C5, + 0x1E0CC908, 0x71BC53EA, 0x530AAECB, 0xBD2977B, 0xB661A52, + 0x86560EE2, 0x250E2591, 0xDA57D5B3, 0x347D3C22, 0x6CE15221, + 0x6E5288EB, 0xA79875F3, 0xCA89972F, 0x36E93777, 0x257262E1, + 0xD1D4E5A4, 0xF7ED5D52, 0xECE58036, 0x644ACA69, 0xCA36DFB8, + 0x60EAB44D, 0x46FB8AB3, 0x81E6C199, 0xD5AA5C63, 0x4A7CB01D, + 0xFCC109CD, 0xD999C46B, 0x3FA4C688, 0xC95C0FBE, 0xA1E9DD3, + 0xBE9EAEF6, 0x1A3014D7, 0x729A662, 0xDC8178FD, 0x7FCAA1EF, + 0xD4005420, 0x2A904DAD, 0xEE7E52DB, 0x886C0F23, 0x12D49E10, + 0x2B3F3B39, 0x3373A6C6, 0x5D0759F5, 0x8CF5EF25, 0xCE02371C, + 0x2FFEEFDE, 0x5D9CFD69, 0x2B5BB7D0, 0x5A378EA9, 0x5BED8331, + 0x9C1A37CA, 0x702799F, 0x4D37A8EB, 0x370CEDF8, 0x43B95BE0, + 0xA0C1E534, 0x204130B2, 0x8E4995AC, 0xCF1C3C28, 0x3E901F78, + 0xB0F43C57, 0xED4B7492, 0xABD3C5CD, 0xEA95ABC4, 0xE03B739A, + 0x58388E80, 0xFDF22044, 0xF4379C7E, 0x87CFA0C, 0xAE9CA79E, + 0x41DCB004, 0x8F69512D, 0x73ED4756, 0xE215297A, 0xD931A6AD, + 0x59866B3D, 0x61825B1D, 0x4F5099E1, 0x25AE168B, 0x1272D5C6, + 0xBE071035, 0x24314F71, 0x82F4B23F, 0x6C7F3385, 0x36CF0505, + 0xB71C0E3D, 0xE9F881D0, 0x27F0C290, 0xF4BE30D7, 0x88315CE8, + 0x9E04FD20, 0xDE197591, 0xCF0D2FF4, 0x67A4C473, 0x158447BF, + 0xA4B37C88, 0x27918292, 0x5FDE3DF0, 0xE8A93C3D, 0x886287E8, + 0x746E199B, 0x9A894103, 0x7A529374, 0xA195E2AF, 0xAA3EB0C6, + 0xF70788A9, 0xCE2B7F30, 0x9C4724AA, 0x902EB7A8, 0x2CBBB407, + 0x3799651F, 0x9016E9D0, 0xD1C0ABC8, 0xC7684FDD, 0xE4670051, + 0x25B69E83, 0x1CEC9BBF, 0xD066D2B4, 0x2AD4BF14, 0x7AFBD3CF, + 0xCB8E5EFA, 0x63B67572, 0x89F7E3F3, 0x8E8D39E6, 0x60617ECD, + 0x9EECEA31, 0x59E57FAB, 0x807AFCD6, 0xFD0397B8, 0x3C57D963, + 0x9A972CF5, 0xFC47B628, 0x9CCFAA8B, 0x405869C3, 0x3CC128C1, + 0xE154C33E, 0xBE53F87D, 0xD23C7947, 0x4CBEB3BB, 0x1F068FFA, + 0x8A7D350A, 0xB822F33E, 0xFB3BB431, 0x741D2D0F, 0x81FAFE09, + 0x80B8BA3C, 0x30B4BE94, 0x4B2A2909, 0x31740925, 0xE68C0BC9, + 0x8E7F31D4, 0x29DA2599, 0xB9D267C9, 0xEDE811D2, 0x8BC7CBC3, + 0x69DDA8B6, 0x879E1212, 0xF915F0F1, 0xBBCDB1AD, 0x3A01011A, + 0x7CD005C4, 0x475FC718, 0xF03F454B, 0x7457F264, 0xB22D9DFD, + 0x569DE931, 0xB585EFEB, 0x9A183445, 0x9CB353AC, 0xE3AA9817, + 0x32E0722, 0xF0C7595E, 0x316DBD6A, 0x96D0F65C, 0xA6F0ECCE, + 0xCB8A9494, 0x5B077241, 0xD36BBC7, 0x9C4CD0F9, 0x108F5B32, + 0xC43C599A, 0x7B10108A, 0xA4106EE9, 0x3860CF99, 0x87B782C, + 0xF667524C, 0x129929C, 0xEA85C1D5, 0x1A07973E, 0xB9524891, + 0xBC02BD1F, 0xF378D7F, 0xD0BED4D7, 0x5B782DE2, 0x738681A, + 0x4BA1192C, 0x46DF1224, 0x4529AED7, 0x9B1DB01D, 0x810AA334, + 0x661982C8, 0xD3B32F94, 0xF50AC9D6, 0xCE9107C4, 0x203078BF, + 0x6B0F3B2B, 0xCF63520C, 0xACA9E5BF, 0x7FBE448E, 0x51BD1E2F, + 0xDF958295, 0x114A9693, 0x60FCBB39, 0x6669B642, 0xC490D54, + 0xD19C8DBC, 0x14CC7B2A, 0x7106D506, 0xAFDADD98, 0xAF398DF4, + 0x88AC5400, 0x1912BF0A, 0x5389D050, 0x5AF6233, 0xF10842A3, + 0x94DD7008, 0x93812804, 0xD8111DFD, 0xB7C97490, 0x7748A45E, + 0xE70A47A0, 0xC29B718E, 0x55783AEC, 0xA2789E21, 0x97488EBC, + 0xD9222F6A, 0xBF74BDD2, 0x9A983E5C, 0x6CC067D5, 0xBCFDD3B2, + 0xD7A2A5FE, 0x4733F2F5, 0xC7AA3556, 0x1CDB485D, 0x31755CA0, + 0xB9F8E9A7, 0x1346410D, 0x7D885AD7, 0xA30030D8, 0x9813B41C, + 0x8A64EFD4, 0x273F4CED, 0xFEDDC3FD, 0xF34D9687, 0x6B67F2DC, + 0x13F72B5A, 0x96445DDB, 0xAC94658B, 0x8FBF54BC, 0xA7C13389, + 0x95814EA3, 0x7823E5BC, 0x544C27DB, 0xECE6439B, 0xD1141B27, + 0x7A95ACF4, 0x806E58E7, 0xD07B5422, 0xFD0353AE, 0xC1840431, + 0x1DD89E9, 0xA102016D, 0x3730505, 0x1F91E46A, 0x3279C793, + 0xA060010D, 0x9BF86C80, 0xD0C35484, 0x33E81EF7, 0x1C4D3EA7, + 0x6C2A9935, 0xD65E2FB1, 0xBB1CA42E, 0xEA3E3609, 0x7B478C84, + 0x70C1DF93, 0xA872CA92, 0x7C025178, 0xF3B19C7D, 0x6F2BD89B, + 0x1AD7BBDC, 0x39A48FCC, 0xAB5B72E1, 0x821761B9, 0xD2368C1, + 0x20ABB349, 0x29A3F960, 0xFDB18DF1, 0xC4118A52, 0x5E28E88A, + 0x549A3386, 0xD81024CE, 0x82DAD5E0, 0xB20BCD42, 0x9DEA0D36, + 0x49A4992D, 0xAFCB2026, 0xCE7536E8, 0x2C191A65, 0x24FEE0D6, + 0xA769AB6D, 0xF47E292E, 0xCB501191, 0x6DE13907, 0xF1343277, + 0xB32AA746, 0xB055DB9E, 0x87CB8583, 0xA546A4C3, 0xF06F809C, + 0x8FE7A8AA, 0xD0E4037F, 0xD81FCF88, 0xF85830C2, 0x3D6F4840, + 0x5A43700E, 0xCD300C58, 0x3B81C27C, 0x8AF86EA8, 0xF65935FC, + 0x46367D7, 0x7FB75E63, 0xBB28A406, 0x173F982, 0xCB92DD14, + 0xAAA0B1D1, 0x1BCA8892, 0x64D21, 0xFF081A44, 0x8706E93B, + 0xB7DEFAD9, 0x4A6DEF76, 0xDA1670DF, 0x94ABCEBA, 0x465DA4C6, + 0x2484496C, 0x97BB3321, 0xEFB09CB, 0x2988AA2E, 0x2722344E, + 0x5301B744, 0xC5E16C47, 0xF7E05D01, 0xCBE7C20F, 0x4882A6EA, + 0x7168CF40, 0xA98A2747, 0x35F8E15A, 0x5FAF49F9, 0xD2008D24, + 0xCC45A63, 0x858A3255, 0xE4C095B6, 0x7074F7A5, 0x699C98FD, + 0xF0BFE2EA, 0xBDA35C64, 0xE83B891D, 0x7CD09FEA, 0xE8735FDD, + 0xFEA27F06, 0x631D71D3, 0xA08136CD, 0x42395363, 0xDCBA6E41, + 0x1562897, 0x4B1061A9, 0xB4F9640B, 0x38D24E3E, 0x76DF4423, + 0x94B5ED97, 0xFE6AB3B6, 0x6B329B8B, 0x37AFD275, 0xC9ABA12A, + 0xEC9693B, 0xD49B5585, 0xE0C2BEF7, 0x315D40A8, 0x34FBE3A, + 0xEBE81550, 0x569F6FC8, 0x5A9C8404, 0x9DBA0090, 0xFE985DE8, + 0xFF4209AE, 0x89F9E7AF, 0xF841164C, 0x6B4B8F5D, 0x95CB1085, + 0x1990660C, 0x31263B36, 0xCF8F435C, 0xDEBCF88A, 0xD1EE25C2, + 0x53D80B69, 0x9EB8F01C, 0xD682EA3C, 0xEEE79205, 0xA7EFAC65, + 0xE9AA6899, 0x3C1E197E, 0xC8ABE1E9, 0x7BEFE9CA, 0xE792E7D4, + 0xA955D60F, 0x3FE8A02F, 0xC963FDC1, 0xB3D53E43, 0xE28FFC12, + 0x7D5BECCC, 0x18E9F223, 0xBC8B0465, 0x7ED8EEFE, 0xBB90FFEE, + 0x904A9F3A, 0xBC467FF, 0x8AD43A15, 0xF3FC404A, 0x2492D5F4, + 0xBB3F5025, 0xBED0B8BF, 0x467FE6C2, 0x36E55C77, 0x8E2CAC4F, + 0xD12D325F, 0x68A4D268, 0xB1AA0895, 0x755B98FC, 0x2314C4FF, + 0xC3667346, 0x8003B9E8, 0x1185476D, 0x227B69D8, 0x5BADD019, + 0xB06567BF, 0x2B837581, 0x9E11F7, 0x158E67AE, 0x339AA6FC, + 0x8FE50AD9, 0x65902A97, 0x42917220, 0xF9AD39C, 0x2DAAD225, + 0x9673B896, 0xFAE150D6, 0xBEDE3417, 0xD233D722, 0x7E67F33C, + 0x6E150E30, 0xC856792A, 0x28EF69BA, 0xE2AC7866, 0x928D0A4A, + 0x8032C4A9, 0x3D413533, 0xC1BA5CCA, 0xD2BDAC83, 0x94198A14, + 0x3A25972F, 0x253EC030, 0x42D7A1F5, 0x97C28C1C, 0xBE4D0710, + 0x92F31B62, 0x73CA2F55, 0x15FC5417, 0xEF76B1C6, 0x655A963D, + 0xBC17C3FD, 0xD5BED3BC, 0xAB0E4857, 0x38BAD61A, 0x8C17E47F, + 0xE3C27887, 0x45D2A34, 0x6D48333A, 0xF400B767, 0x6ACF41B0, + 0x88DA15A9, 0x3FA0EAB1, 0xAF7B3786, 0x87F182FF, 0x4112A079, + 0x53360864, 0xDB5CE625, 0x630678D7, 0x63E01F17, 0x7BF658F1, + 0xB5E4F1A3, 0xB30E4393, 0x27454C31, 0x8E7E0E2, 0x2151A5F, + 0x2892E2B2, 0x92B53840, 0x1EB3D483, 0xA4273A65, 0xF0CC632, + 0x99AC2694, 0xE0A19111, 0xC7FBA613, 0x46C8F873, 0x88A27741, + 0x7E9A5972, 0xC2E76F79, 0xA5CA8180, 0xA28FF0EE, 0x2A1F7DE1, + 0xCC130B22, 0x50ECFD8A, 0xF5BAA999, 0x5FA2EC9C, 0xC1B5C5C4, + 0x90EC0E5D, 0x9C26620A, 0xA97D2935, 0xE1C08B89, 0xCB574B80, + 0xB3DE8B61, 0x1AF89CA0, 0xFD4A77DC, 0xED9485E1, 0xAF804C92, + 0x6B8EB167, 0xDCC836B6, 0x85A7FFFD, 0xD4E9A94A, 0x77DDCC31, + 0x8897B5F9, 0xA4FA88D3, 0x8ECB3E82, 0xBC175E89, 0x963A073E, + 0x547520C7, 0xEEB81BFB, 0x1D8B1867, 0x78833A4, 0xE40A0CCB, + 0xF8D5452F, 0x954BDCF6, 0xAC228FFA, 0xE6B32DF3, 0x181ED541, + 0xACE26A73, 0xF1C1440D, 0xA1B93EDD, 0xE90FF70A, 0xF6741843, + 0x4DF581AC, 0xBE785B32, 0x751509B5, 0xC30AD864, 0xC18D8A72, + 0x3BF07FD4, 0x827B4CBA, 0x7DD39A4F, 0x2CFEFE25, 0xE071F371, + 0xC0C3F6CB, 0x1FD70F85, 0xFDABDA88, 0x8F308991, 0x4CD794F9, + 0x5D18B022, 0xC13D5FC2, 0xD84337F, 0xED868BB8, 0x9904CD2, + 0x7551499C, 0x124B262, 0x5139C2A5, 0xEF56F59B, 0xE8B87B40, + 0x2F030010, 0x42D2E271, 0x4E344F3F, 0xC87CDFE1, 0x44A615C7, + 0xC32DB543, 0xCFC889E4, 0x60078825, 0x786F5917, 0x2DF9E82, + 0xEE26DA93, 0x48D0C94, 0xE97D5456, 0xF487F2EB, 0x35A47D65, + 0x183DA0CA, 0x1A7E1218, 0x8D2674C5, 0xB38D0910, 0x5D9C871C, + 0x7B463ED1, 0xBBC90FFD, 0x31DED99F, 0x5171DCFA, 0xF9413D0B, + 0x632A00FD, 0x7B6DA34C, 0xA475C597, 0x8E157360, 0x5911736B, + 0xCA19D544, 0xF487D465, 0x6E749BB9, 0x888BFB52, 0x3FDAD497, + 0xDB5D401A, 0x7015A4EC, 0xC1F571, 0xB2D7671A, 0x8203032F, + 0x5A755E9, 0x24F25BF5, 0x4D2AC51B, 0xE5950FA7, 0x20196F5B, + 0x68E90D90, 0x5D24196C, 0x9CFCD1C0, 0x745C0318, 0xEEB977E8, + 0x14AA16D, 0x80662EE1, 0x7BD55DE3, 0x35EE2B08, 0xD3E8051F, + 0x3D0EA4B5, 0xD551399E, 0x8FF94435, 0xDD4E34ED, 0x9139E4A3, + 0xE6AF7E5E, 0xE1ED4EAF, 0x638D2846, 0x7084F7EB, 0xF9705E17, + 0x2E7A89DC, 0x45855252, 0xBA8E51C7, 0x8510425C, 0xA97AF6D, + 0xF0C27DA, 0x9E00CA15, 0x3BCC0651, 0xEEC38CA9, 0x19597B08, + 0x4C68AB5D, 0x16CA41DB, 0x35EFBEF9, 0x1E441529, 0x25131FA1, + 0xC3D8483C, 0xD8650832, 0x60D271E3, 0x47C92A47, 0x9EFBB554, + 0xBF5DBFBF, 0xFF421FA2, 0x3A38F28, 0xAE4EE06B, 0x819945D1, + 0xC43101, 0xA3EE9278, 0x5BAE3EE4, 0x57ACE55E, 0xC3D95551, + 0xC00717B0, 0x38EC1B28, 0x123597, 0x6314F3F7, 0xB3F99DAB, + 0x7226CE1E, 0xE8350DE6, 0xD7C582CA, 0xBB1D38D, 0x54E656FE, + 0x400B60BD, 0x48291A06, 0x97819179, 0x850BF937, 0x93888A87, + 0xF51E684F, 0x4B111E, 0xC6B37E02, 0x6C923547, 0xEF25AF3B, + 0x8C12CE8E, 0x89296F4F, 0x3BE2C3DA, 0x8A29A35B, 0xBBE2E80C, + 0x79D0188D, 0xBD4320BC, 0xAFF4F0A9, 0x7FAE6C37, 0xCCA1777E, + 0xB06D2AE1, 0x26B6398C, 0x5A3E5876, 0xE814DF4E, 0xC43E9677, + 0x4C962CE8, 0x6C274FF8, 0x8B5A1A03, 0x963E1401, 0xD8CE0DF7, + 0x659190E7, 0x3AD63330, 0x894BFEDB, 0xEB4CF73A, 0x3731BC86, + 0x30FE0433, 0x94F5FD2, 0x8417999C, 0x337E86B8, 0xAFE08EF6, + 0x5B5F05DC, 0x8001C95F, 0x8C8092DC, 0x5EBC7995, 0xDCBE88EE, + 0x9C602950, 0xE3376596, 0x5D80E318, 0xAF3AC8C3, 0x8C7EDCC6, + 0x3E795E7, 0xDA8987AB, 0x7B7B4E3C, 0x3239CD40, 0x1B527DED, + 0xC95DEF29, 0xE40D047D, 0xE53C10C5, 0x5BAF528B, 0xA47921F9, + 0x6DCB9B0A, 0x7EA11040, 0xBBEFCCD5, 0x502F33FA, 0xAB5EBE8F, + 0xD59C448, 0x8C34FF3D, 0x4A3255A2, 0x4CFFDCB1, 0x3880A182, + 0x3499DAAF, 0xA1319450, 0xC550CCE5, 0x51026E2C, 0x73C4F05D, + 0x21F5FAAC, 0xE1C31B7D, 0xA390E6E6, 0x7B1582ED, 0xB92B4C3B, + 0x41C1128E, 0xF728F655, 0x3BC8AE16, 0x8A2A4E57, 0x9A8A7DE, + 0x86065598, 0x4328A574, 0xDBDAFC7D, 0x2C5EE98, 0xEAB5CE80, + 0xF7E8F60C, 0x7B4C3C0E, 0xE4A2F720, 0x90330B1D, 0xB6783BF2, + 0x48A8C26B, 0x847F1AAC, 0x351DB247, 0x43E84AC5, 0xAF726AA3, + 0x5CB4C059, 0x2C5784DE, 0xBA1111FB, 0x9F427968, 0xE41D29D1, + 0x2CAA8CA7, 0x764C8B63, 0xBDAA6F10, 0x280277B6, 0xE4A908B6, + 0xA6A9783, 0xD0643B01, 0x44FE52AD, 0x60B04A5, 0x194C190E, + 0xF73DA669, 0x12EE11C8, 0x2C769D96, 0x694787A4, 0x9FB03623, + 0xAC6F837C, 0xFC1E5935, 0x16246787, 0x4F94B817, 0xA3A4281F, + 0x1535252D, 0x13F8F1CB, 0xAAF6A508, 0xB38E10E, 0x7A4B238, + 0xC6A47410, 0xC864256, 0xF3C25E27, 0x94CE51D4, 0xF4ECAEEA, + 0x32684D74, 0x1AC8765, 0xDE6F6313, 0xF8C09409, 0xFB21FD21, + 0x6DB586BA, 0x241894B5, 0x65806E1F, 0x4B9D0DE7, 0x32DDDD16, + 0x3B16F0B0, 0xB56CAAF0, 0xC533ED5C, 0xADE48431, 0xB5893123, + 0xE977699C, 0xB295808B, 0x7A252898, 0xE3748392, 0x687A8ACD, + 0xB792504E, 0xBF4E2D8A, 0xB5EC4376, 0x754D9C34, 0x17BE53CC, + 0xC817A127, 0x732346E2, 0x29593976, 0x41D6AF89, 0x9072FAEC, + 0xC2B22666, 0x16A150DF, 0x4D379A36, 0xE732017F, 0xA6D12516, + 0xEA3DB9B5, 0x6E4C766B, 0xCA0ADEF5, 0x75E98F68, 0xC31687C3, + 0x62F16F66, 0x6486B129, 0xE237231B, 0xC6653007, 0x2BE06DFC, + 0x2BC32DC4, 0x9E3DD054, 0x47AA701E, 0x7741E537, 0xA09F9CD8, + 0x9D40881, 0x4F02F58, 0x6A5F31BB, 0x32BBBD23, 0x4520EB05, + 0x1DBFDD00, 0x6CCEC7D, 0x48CFC70C, 0xB41FBC13, 0x5B377E90, + 0x3B87923D, 0xC09F6D28, 0xC1CF24FB, 0xDD6BE459, 0x8B8BDD37, + 0xF7B103C8, 0xC1611360, 0xA8B8FCC8, 0xC16D4E2, 0x6AD23606, + 0x951A051, 0x6FC3B984, 0x95876867, 0xA0E1A04C, 0x8267F62C, + 0xC4B69588, 0xF53421DF, 0xC348685B, 0x59769E2B, 0x21F0FF90, + 0x2B978BB4, 0x3FDA987B, 0x216F4FFF, 0x95C68589, 0x2286F5D8, + 0x81E2702D, 0x88E2D01F, 0xE6F6B356, 0x2EA0C31, 0xA5E11CAF, + 0xE17DC578, 0x2115A0EA, 0x8DC2B323, 0xEB86957, 0xF3C7BECB, + 0xBCD805EC, 0x1121C3F5, 0xE6DEF224, 0x8EA2EE24, 0x2703D7B7, + 0x24D73574, 0x4068552C, 0xA85F5B6A, 0x65B563E, 0x4050954C, + 0xC7043820, 0x91E4A088, 0x19084C84, 0x7250FB54, 0xC1EC72, + 0x9FDB2412, 0x3B78E4E9, 0x588C2D17, 0x345C3232, 0xBC7CCB29, + 0xCB5F1F0A, 0x24EDD656, 0x7A9F0605, 0xC2EDB0E5, 0x7F01D20D, + 0x8EB211A2, 0x74AC4C1A, 0x37EDEDDB, 0x55B9AFF2, 0x100C4193, + 0x43CDF2C3, 0x9C75E7C1, 0xC43ABEFF, 0xB9704827, 0xDD4E6376, + 0xEA5FA0D3, 0xC6E14A66, 0xCB163673, 0x9515389, 0x5D3D30C5, + 0xD1FF8777, 0xC1347921, 0x21A5BAC, 0xD6CB5F87, 0xC6CE680B, + 0x46D1E5FB, 0x9B98BC15, 0x8D1446D6, 0x184659E7, 0xAAC79D5A, + 0x773E019E, 0xA1B9F814, 0x933D3D0B, 0x11DB7615, 0xC206A22A, + 0xE4EF5BA1, 0xF0EFA194, 0xDE0E6C2B, 0xBE185B42, 0xC28FDE0C, + 0xE416DD8A, 0xC636753F, 0xAFD119E, 0xB0198B17, 0x94C4115C, + 0x76EDF82A, 0x66818700, 0x6F003485, 0x993DFB2B, 0xF5A1F91E, + 0xDAB0080C, 0x7DF290D2, 0x72F65E9B, 0xBC126473, 0xF6050B10, + 0xB7380CA, 0x3352530, 0x9A403054, 0xB12581C1, 0x6F8E0370, + 0xBB5C1ED1, 0xCE738AFF, 0xE9F605DB, 0xA976BFE4, 0x68C9D107, + 0xA2BD1833, 0x545ACCE2, 0x965FBAF, 0x12D998F, 0x2C16B1CD, + 0xB20788BF, 0x96AADE36, 0xDF821415, 0xF1EBD654, 0x33F3C413, + 0xF2F2A6BF, 0x2DFB0ABA, 0x96845EC5, 0xB24622DD, 0xA83EEE5F, + 0x49DF9AF8, 0xB8DCFB8A, 0x16F7643, 0x436EFD30, 0xD90C9F8, + 0x9C10CD4E, 0x600CB15B, 0xE686606A, 0x5EC0502C, 0x23B2DCE5, + 0xDD5DE18D, 0x235A755C, 0xCB58A693, 0xACBEAFDE, 0xCA201FB5, + 0x2AE90380, 0x4F7455EC, 0xCA923312, 0x1BD202DD, 0x2D92B9E3, + 0xA2670F18, 0x831728C, 0x77D33D8C, 0x12400BDA, 0x9508A626, + 0x9253042B, 0x63C70C8C, 0x5496452F, 0x9237D610, 0x10448F3A, + 0x9303C709, 0x660D7EC, 0xDF6750F0, 0xBC4F14F2, 0x8F59720C, + 0xEE5AB051, 0xD5EC1228, 0xCC3E04CE, 0xE9E4D3B9, 0x8676FA58, + 0xF523860E, 0xF87D9BED, 0x4A6D02C9, 0xC5AD6CF0, 0x65F09045, + 0x8C620984, 0xDC40B4CD, 0x4216C291, 0x7A44C04B, 0x1E2B5D31, + 0xA0E77B7D, 0x12076C51, 0x22262FA1, 0x483B54F1, 0x2A7EF465, + 0xD1395E25, 0xB564369F, 0xC94A47A4, 0xFD678BAA, 0xECEE926A, + 0xE41A06AE, 0xE8F293C1, 0x3EB052BE, 0xD0959EF1, 0x93FF1935, + 0x4D65E4F1, 0xE87FC1F9, 0x3BD4BB2B, 0xD5F24F5B, 0x54FF70D4, + 0x968C7B60, 0x44F9BDE4, 0xF4894BDF, 0x3CFDDF7B, 0xD5CC3F10, + 0xD7F952C2, 0xEA3DCB60, 0xEFDAC96A, 0xBBF8F5EB, 0x41526813, + 0x714E3D51, 0x5E15A386, 0x1286AF4F, 0x5E1E5A3E, 0x676C9938, + 0xA716071B, 0x14D79998, 0x5CB794ED, 0xD815EDED, 0xCB1CA55A, + 0x9D6D74FD, 0xBE032C25, 0xF3FE1425, 0xC0CB5217, 0x3931A93F, + 0x82DB8222, 0xD8FF587F, 0x5AD4E8AC, 0xBCF00442, 0x4298A961, + 0x9F8CC3C2, 0x60E2347F, 0x7E090E, 0x691B735, 0x3D4C4D83, + 0x5612B097, 0x7B8DA321, 0x2C28A057, 0xF8FE8901, 0xDA39D0DD, + 0x465CE561, 0xA78756, 0x3B771E01, 0xE638B09, 0x201853B5, + 0xF934D7D2, 0xBD515A83, 0xC1B5C34E, 0x89159FA9, 0x2DDE3EBE, + 0xE27771DB, 0xB5983F05, 0xA3FD869D, 0x8ABA53CB, 0x55C8606C, + 0xDAB769C3, 0x4C4C2EAC, 0x18EE2A56, 0x88452A07, 0x9767C386, + 0x5C0418D6, 0xF79CA785, 0xF291195D, 0x9B0C286F, 0x68460BED, + 0xBF0079E5, 0x9906D932, 0x2F9E5535, 0x2A3C4947, 0xF0E240C3, + 0xE835A264, 0x43F38C0, 0x82DAADD8, 0x313612B1, 0x560D56FB, + 0x61BD734A, 0x58FD6B36, 0x2C45C40B, 0x55F70159, 0xA21A817D, + 0xAAA6FCE, 0x85BFDFB9, 0x1C71DE25, 0x56CB4C2C, 0x50FD91E5, + 0xF2340E88, 0x72BD5702, 0xB4FFBD3A, 0x1B35B171, 0xE94A34BD, + 0xC4C77575, 0x95B10420, 0x2471BC3F, 0xCB429841, 0x6DC5347F, + 0xC93CF782, 0xF1D26B2C, 0xEB2A260F, 0x67C3AE9, 0x34A56A4, + 0xF1F3D01B, 0xD8295F22, 0x7F9E5D4A, 0xE4DB3DEA, 0xE1531DCB, + 0x2C5FF857, 0x73622A7C, 0xC2691F1, 0xBC622B61, 0xE6A08C89, + 0xBA1807D4, 0x43ADBE43, 0xD90D427C, 0xC7A5C24, 0x613ED316, + 0xEC810B10, 0x1049BF74, 0x9A14C123, 0xA7B24E7E, 0x73254165, + 0x2C54081E, 0x14FF25AA, 0x7A12F3B4, 0xB4DF7C56, 0x89BFE8FC, + 0x5D5A04A6, 0xBE007173, 0x829DF863, 0x63E5E57D, 0x58F64C28, + 0x31A38144, 0xE843289B, 0xB48DFAF1, 0x2B335C2A, 0xEC3C96CE, + 0x255543F6, 0x33F17311, 0x3C60C51A, 0xE5D0D660, 0x5E162559, + 0xA2D9416, 0x9DDE4967, 0x28156A65, 0x71650796, 0x74EE54D1, + 0x3E8C19F7, 0x797C1E42, 0x2C536DFD, 0x2F3EED4D, 0x3BFC7C95, + 0x8EAEF87D, 0x18F5B02A, 0xA3532651, 0x24508E13, 0x280B9049, + 0xE4FC61CB, 0x388BA30F, 0xEC180A43, 0xBFDE77A4, 0x98CDB399, + 0xF82B586D, 0x38525AE7, 0x9D857BE8, 0xDD939D18, 0xD5CA6EBA, + 0xB70DDBA, 0xDFF43867, 0xD06AB2D0, 0xD8C78BB, 0x78F6AE4F, + 0x4C9A58CC, 0x9F9AA50E, 0x7D6A3912, 0xD897C7E4, 0x82F5939D, + 0xA4A9FFF5, 0x2CB56FDE, 0x3E082D4B, 0xB829DC58, 0xE4515CEB, + 0xCE585A33, 0x27901244, 0x68860E95, 0xE156A451, 0x9E351FE0, + 0xC69BD757, 0x4B2C4A2B, 0xD5DE5A91, 0x3557B0DE, 0x99E910B0, + 0x975BE470, 0xDB4DE130, 0xE4C6DA1D, 0xC2BC058F, 0x37544906, + 0x12CC200E, 0x54569133, 0x6586FC03, 0xF183C0CF, 0x642583E, + 0xFBE882CD, 0x8A098C35, 0xE8300988, 0xFE835E55, 0xEA74FD24, + 0xF3127AB2, 0xEE8379F2, 0x3F136FD2, 0x472AA942, 0x3BC1A7D7, + 0x5B6A8A98, 0xF039CCF3, 0x5E55425B, 0x3F801B4, 0x44556FB4, + 0xCC966D37, 0x56E32B90, 0x2BCDA2E5, 0xC70F1125, 0x8C2A015C, + 0x3D37FCA7, 0x2118A4EF, 0xCE051A9C, 0xCB84DCB9, 0x8451C9E0, + 0x4BDB1900, 0x8FC71D5D, 0xF61FD749, 0xA696D2E0, 0x6EED502A, + 0xB345CE8B, 0x76FCDA8E, 0xBE4A45F8, 0x8375E9E7, 0x625FF29B, + 0xCEC61240, 0x3876B21D, 0xBA8C8F59, 0x8CD169C6, 0x9F82251F, + 0x2E6EC495, 0x99319E, 0xB0160B46, 0x8B77EDD8, 0x6217902B, + 0x76FA6AD0, 0xB541F2BC, 0x961EA91C, 0x6F554C1F, 0xBD92328D, + 0xA9C077FD, 0x90A5311C, 0xEFE9B1FB, 0x9C84AA8C, 0x812517C3, + 0xFE71D7F4, 0xC4F6A5BF, 0x8B75A262, 0xC726EB36, 0x5F803035, + 0xCECDE2B7, 0xF61152A8, 0x78557ED1, 0x50F3BB55, 0xDD830290, + 0xB125B524, 0xC8683B0D, 0xE5FD573B, 0x48B13066, 0x62AE556E, + 0x5A637C89, 0x498D69F, 0x3F3A5BE5, 0xB98B86D7, 0x20CF4AF4, + 0xA3E55E7D, 0xEE93FC6F, 0xCCA95763, 0x5B3C5706, 0x8342B013, + 0xA0C7BDB9, 0x83D686E4, 0x6934B64, 0x324D75C3, 0x9A100C81, + 0x72E7E9AE, 0xC729A8AC, 0x9E8489E0, 0xFE5BC233, 0x64709AE9, + 0x113437BC, 0x296DEBC0, 0xC4376603, 0x9F0CD7EE, 0x6412AB97, + 0x3EECEFCD, 0x62DCD50, 0x15DFF1, 0xEEFDCF8E, 0x119849C1, + 0xDAAC93FF, 0xD531AF57, 0x82A10F47, 0xD55B7A97, 0x2F3A268B, + 0x4F1CC181, 0xAE01C1AC, 0xF3CF6F61, 0xE8BDAED5, 0x7397FD99, + 0xDD36A03C, 0x9BAED7C3, 0x51404903, 0xB9867B61, 0x3880A4FD, + 0x42B90A49, 0xA94696C1, 0x546DEA1D, 0xEE73A3DE, 0x1A4BAC37, + 0xBC6AF7AE, 0x7DD5B57B, 0xD2F121F, 0xD2BCCA1E, 0xD5DC4753, + 0xA135C08C, 0x78E97831, 0x9B91C00B, 0xFFF2C044, 0x147B797F, + 0x299CFB60, 0x71083BB, 0xB39A6C4F, 0x4814E3E1, 0xBD246AB0, + 0xBCD61250, 0x2D0870, 0xC660435C, 0xCA11681E, 0xADA4C80E, + 0x790C8875, 0x8C4F0D08, 0x48D90C74, 0xE874E9AA, 0xA8013EE8, + 0xB2D23A7A, 0xAF73A16E, 0x2485512C, 0x698E0CB2, 0x2FF566C9, + 0xC1B0C3C6, 0x2BE17C0E, 0xC42C3907, 0xD8A2EA94, 0x8991D24C, + 0x19B939F1, 0xF936F8B3, 0xA72D7EF1, 0x97EED001, 0xBF9C5156, + 0x75F08A67, 0x9AFD5756, 0x5D9D359C, 0xF905B7EC, 0x2B1553E1, + 0x9E0FD4E1, 0x8DC4814C, 0x89F28E6D, 0x14174915, 0x1F3A4217, + 0xA8F367F9, 0x93EE87C5, 0xAD70C6D8, 0xF04D465C, 0xE403D72B, + 0xA686EC0F, 0xCD3A5728, 0xA1BD007, 0x9E21E401, 0xAE8517CF, + 0x6DDB79FC, 0x8CB2C475, 0x6F71544, 0xBEAC91CF, 0x4739DC4E, + 0x6CF4F788, 0x36BAD9AC, 0xF23568D4, 0x250BAB0A, 0x4633384F, + 0x54F6F251, 0x454F9605, 0xCB1A346, 0x632E207F, 0x3017539C, + 0x174A33ED, 0xBDCFD2DE, 0xC17F3D39, 0x17B8A9A2, 0xC267FB51, + 0x9322387D, 0x348760C, 0x3C14D7E0, 0xE4E4254E, 0xCA72AA41, + 0xB6102ED3, 0x6317A3F, 0xD3B6B9F7, 0xA8C71BB7, 0x6E452957, + 0x3F896E32, 0xE38A4A58, 0x9893F432, 0x110A21D4, 0xE835FEBE, + 0x90F51080, 0xD0AC5AF, 0x4FCB9903, 0xFE547785, 0x144B285D, + 0xD0ECC753, 0xAE503BA4, 0x57CEAABC, 0x95713FE6, 0x5B0F4F86, + 0xD94BD751, 0x4017F139, 0xF60F5E1D, 0xB9A63351, 0xF7F94F6A, + 0x7E556ECC, 0xBFDB8642, 0xB70D07D, 0x351BEA77, 0xD1F3CAD, + 0xA3D7EF4D, 0x1EAA28E3, 0x98A2EA79, 0xD8647392, 0x1B896804, + 0x35CA6A08, 0x305258F, 0xE58BD955, 0xABCB6278, 0x87CF1146, + 0x13145966, 0x45BB55CD, 0x818AA368, 0xA027F11F, 0x64C427A3, + 0xEC831B99, 0xF2BD53F9, 0x7FDA7301, 0x35BE80D4, 0x5256E6FB, + 0xC97D33AE, 0x30921709, 0xC2724BEC, 0x78F5436F, 0x4F5749CD, + 0x9007F551, 0x327C31C0, 0x89782D13, 0x119AD125, 0xB1071A01, + 0x63100C70, 0x83120035, 0xA8E2E403, 0x7E213FA3, 0xBF06AAC4, + 0xBA68C4D9, 0x4B568927, 0x1DDD40F, 0x10FC10E8, 0xBBD7230A, + 0x96475640, 0x8C8E6EC1, 0x44A1134A, 0xEF0F40F0, 0x51E2A5E0, + 0x61AE6D65, 0x9DE72FD6, 0xB1711336, 0x90BEB84, 0xD610EFC6, + 0x3D231F91, 0xB5885164, 0x2CB2112C, 0x36F50789, 0x3DEF2AB9, + 0x1D9DC1DA, 0xA37DB070, 0x2AA92EB, 0x2D57ED6E, 0xD6E2C2CD, + 0xB78FC54C, 0x767A565E, 0x1D1F5AAE, 0x89F256DB, 0x716A97D, + 0x1344431D, 0xFAF015FB, 0xFED59649, 0xC479882A, 0xEEFC3D1E, + 0x840AE162, 0xD963A347, 0x75462C25, 0xDA990E07, 0x9A57DE31, + 0x74A35F20, 0x91852CD6, 0x3F16DE14, 0x5FA6A255, 0x47D00F85, + 0x1B4836C9, 0xC73D0290, 0xE301026B, 0x592068D6, 0x7C32A301, + 0x3A3C04C4, 0xB5BD3BAF, 0xB8C3BF60, 0x76723A1B, 0xD05BC35E, + 0x7679021C, 0x6298096, 0x590BA59C, 0xBB30A2F6, 0xE5F6B06C, + 0x21BD2A9E, 0xAC68D7DA, 0xEDA2ED5A, 0xA10E60FA, 0xABDBF569, + 0x17F5868E, 0x82AA8505, 0x384BD8FC, 0x68DC2746, 0x8F029C0D, + 0x3755EB11, 0xAEF4BB79, 0x453B87BA, 0x9926977F, 0x1FA1B806, + 0xC905618, 0x9BFE8E92, 0xF6F68A5A, 0xAA955D92, 0x44F57A4A, + 0x2186E272, 0x62EB01DA, 0x85A2D502, 0xB087955D, 0x26FF2BA0, + 0x8D462C04, 0xE024573B, 0x609CDBD7, 0xA99B9D19, 0xFEEB3F60, + 0x12903A0D, 0x46480C6, 0xDD0BD1B9, 0x6C60C43, 0x5E11A4FE, + 0x935E9E58, 0x8A7F6D33, 0xA505132D, 0xBB2E3E12, 0xF48633F4, + 0xF3BA8CF7, 0xC25D4EDD, 0x788672B8, 0xB2812608, 0xACB3A62, + 0x2EEB679A, 0x443A71B9, 0xC42F4B12, 0xD28B3482, 0x5571FA8A, + 0x5C0B3D55, 0x8B8619C6, 0xF564F10C, 0xD9A7C914, 0xFBD1EF46, + 0xCEABC573, 0xEC609D28, 0x5839413B, 0x5019E901, 0x248FFF30, + 0x7BFFB801, 0x7FD46584, 0x43702812, 0x3A5A0880, 0x7E3E9EDA, + 0xCA4623E3, 0x2FB87A70, 0xFE70D956, 0xCE9EB3E6, 0x9A2CD2F1, + 0x92EFB0C8, 0xC7E23873, 0x53B63A86, 0xB9D93548, 0x3C022B2, + 0xCF4F22A6, 0x981E70BC, 0x4A05F3AB, 0xD763E93B, 0x6EAF767D, + 0x4162629D, 0xD82A25E7, 0x6CDD19A3, 0x13524F68, 0xE5F23FDC, + 0xB37F311F, 0x35FD43B6, 0x36626469, 0x1E409CF6, 0xE4C04F9D, + 0xC1B58001, 0xD131078F, 0x9DE279A, 0x80B62212, 0x526405DD, + 0xC17777C1, 0x7045FCDC, 0x53862AEC, 0x5D583056, 0xEB532222, + 0x5837EA32, 0x719C06A4, 0x43D4F131, 0x577C6DDB, 0x9E5815A7, + 0x8189DDD9, 0x170F154F, 0xEF813B20, 0x4DD83A53, 0xB09A28FD, + 0x8D0DBED5, 0x1836596D, 0xC5BB2696, 0xA69FC859, 0xD6FF5E0D, + 0xCCC65761, 0xC818C6F7, 0x7A25F980, 0xF949133, 0xC515C093, + 0xA8AD04B5, 0x6768AC1C, 0xB5BE2C4A, 0x4F04616F, 0xBD28E4E3, + 0x4CCA6347, 0x5F61C031 +}; + +/* The source data is random across the q31_t range. Accessing it by word should + remain random. */ +q15_t * transform_fft_q15_inputs = (q15_t *) transform_fft_q31_inputs; + +q15_t dct4_transform_fft_q15_inputs[TRANSFORM_MAX_FFT_LEN * 2] = +{ + 0x0000, 0x2d5c, 0x54d5, 0x714b, 0x7f0d, 0x7c51, 0x6972, 0x48e4, + 0x1edf, 0xf0da, 0xc4cb, 0xa06c, 0x8874, 0x8001, 0x882a, 0x9fe2, + 0xc413, 0xf00c, 0x1e16, 0x4839, 0x68fc, 0x7c1f, 0x7f25, 0x71ab, + 0x5570, 0x2e1e, 0x00cf, 0xd367, 0xabc7, 0x8f16, 0x810d, 0x837e, + 0x9619, 0xb672, 0xe057, 0x0e58, 0x3a7c, 0x5f0a, 0x7741, 0x7ffe, + 0x781e, 0x60a7, 0x3ca4, 0x10c2, 0xe2b4, 0xb873, 0x977b, 0x8415, + 0x80c3, 0x8df6, 0xa9f6, 0xd121, 0xfe61, 0x2bd6, 0x539c, 0x7087, + 0x7ed8, 0x7cb1, 0x6a5c, 0x4a38, 0x2072, 0xf277, 0xc63d, 0xa182, + 0x890b, 0x8005, 0x879b, 0x9ed2, 0xc2a6, 0xee70, 0x1c81, 0x46e0, + 0x680c, 0x7bb7, 0x7f53, 0x7268, 0x56a3, 0x2fa0, 0x026f, 0xd4ed, + 0xad02, 0x8fdc, 0x8145, 0x8321, 0x9531, 0xb51f, 0xdec5, 0x0cba, + 0x390a, 0x5df1, 0x76a8, 0x7ff7, 0x78ab, 0x61b5, 0x3e10, 0x125e, + 0xe449, 0xb9cd, 0x986d, 0x847f, 0x8099, 0x8d3c, 0xa8c4, 0xcf9f, + 0xfcc2, 0x2a4f, 0x5260, 0x6fbf, 0x7e9d, 0x7d0c, 0x6b40, 0x4b89, + 0x2203, 0xf414, 0xc7b1, 0xa29c, 0x89a7, 0x800e, 0x8710, 0x9dc5, + 0xc13a, 0xecd5, 0x1aec, 0x4585, 0x6718, 0x7b4a, 0x7f7b, 0x7320, + 0x57d3, 0x3121, 0x040e, 0xd675, 0xae40, 0x90a7, 0x8182, 0x82c8, + 0x944f, 0xb3d0, 0xdd35, 0x0b1d, 0x3795, 0x5cd5, 0x760a, 0x7fec, + 0x7933, 0x62bf, 0x3f7a, 0x13f8, 0xe5df, 0xbb2a, 0x9964, 0x84ef, + 0x8073, 0x8c86, 0xa796, 0xce20, 0xfb23, 0x28c6, 0x5120, 0x6ef2, + 0x7e5e, 0x7d63, 0x6c21, 0x4cd7, 0x2393, 0xf5b2, 0xc927, 0xa3ba, + 0x8a47, 0x801c, 0x868b, 0x9cbd, 0xbfd1, 0xeb3b, 0x1955, 0x4427, + 0x6620, 0x7ad7, 0x7f9d, 0x73d3, 0x5900, 0x329f, 0x05ad, 0xd7ff, + 0xaf81, 0x9176, 0x81c4, 0x8274, 0x9370, 0xb284, 0xdba6, 0x097f, + 0x361d, 0x5bb5, 0x7566, 0x7fda, 0x79b6, 0x63c6, 0x40e2, 0x1592, + 0xe777, 0xbc8a, 0x9a5e, 0x8564, 0x8053, 0x8bd5, 0xa66b, 0xcca2, + 0xf983, 0x273c, 0x4fdd, 0x6e21, 0x7e19, 0x7db3, 0x6cfd, 0x4e21, + 0x2521, 0xf750, 0xca9f, 0xa4dc, 0x8aed, 0x8030, 0x860a, 0x9bb9, + 0xbe6b, 0xe9a1, 0x17bd, 0x42c6, 0x6523, 0x7a60, 0x7fbb, 0x7481, + 0x5a29, 0x341c, 0x074c, 0xd98a, 0xb0c6, 0x924a, 0x820b, 0x8226, + 0x9297, 0xb13b, 0xda18, 0x07e0, 0x34a4, 0x5a92, 0x74bf, 0x7fc4, + 0x7a34, 0x64c8, 0x4247, 0x172b, 0xe90f, 0xbdec, 0x9b5d, 0x85dd, + 0x8038, 0x8b29, 0xa544, 0xcb27, 0xf7e5, 0x25af, 0x4e97, 0x6d4b, + 0x7dcf, 0x7dff, 0x6dd5, 0x4f69, 0x26ae, 0xf8ef, 0xcc1a, 0xa601, + 0x8b97, 0x8049, 0x858f, 0x9ab9, 0xbd08, 0xe809, 0x1625, 0x4162, + 0x6422, 0x79e4, 0x7fd3, 0x752b, 0x5b4e, 0x3596, 0x08eb, 0xdb17, + 0xb20e, 0x9322, 0x8258, 0x81dd, 0x91c1, 0xaff5, 0xd88c, 0x0641, + 0x3328, 0x596a, 0x7412, 0x7fa8, 0x7aad, 0x65c6, 0x43a9, 0x18c3, + 0xeaa8, 0xbf51, 0x9c5f, 0x865c, 0x8023, 0x8a82, 0xa421, 0xc9ad, + 0xf646, 0x2422, 0x4d4d, 0x6c70, 0x7d80, 0x7e46, 0x6ea8, 0x50ad, + 0x2839, 0xfa8e, 0xcd97, 0xa72b, 0x8c46, 0x8067, 0x8518, 0x99bd, + 0xbba7, 0xe671, 0x148b, 0x3ffb, 0x631e, 0x7963, 0x7fe6, 0x75d0, + 0x5c6f, 0x370f, 0x0a89, 0xdca6, 0xb359, 0x93ff, 0x82a9, 0x8199, + 0x90f0, 0xaeb2, 0xd702, 0x04a2, 0x31aa, 0x583f, 0x7360, 0x7f88, + 0x7b21, 0x66c0, 0x4508, 0x1a5a, 0xec42, 0xc0b9, 0x9d66, 0x86e0, + 0x8012, 0x89e0, 0xa302, 0xc836, 0xf4a8, 0x2292, 0x4c01, 0x6b91, + 0x7d2c, 0x7e87, 0x6f76, 0x51ee, 0x29c3, 0xfc2d, 0xcf16, 0xa858, + 0x8cfa, 0x808b, 0x84a7, 0x98c5, 0xba4a, 0xe4da, 0x12f1, 0x3e92, + 0x6215, 0x78dc, 0x7ff4, 0x7670, 0x5d8c, 0x3884, 0x0c27, 0xde36, + 0xb4a7, 0x94e0, 0x8300, 0x815a, 0x9024, 0xad73, 0xd579, 0x0303, + 0x302a, 0x5711, 0x72aa, 0x7f61, 0x7b90, 0x67b5, 0x4664, 0x1bf0, + 0xeddd, 0xc223, 0x9e71, 0x8769, 0x8007, 0x8942, 0xa1e6, 0xc6c2, + 0xf30b, 0x2102, 0x4ab1, 0x6aae, 0x7cd2, 0x7ec3, 0x7040, 0x532b, + 0x2b4b, 0xfdcc, 0xd097, 0xa988, 0x8db3, 0x80b4, 0x843a, 0x97d1, + 0xb8ef, 0xe345, 0x1155, 0x3d27, 0x6108, 0x7851, 0x7ffc, 0x770b, + 0x5ea6, 0x39f8, 0x0dc4, 0xdfc7, 0xb5f8, 0x95c5, 0x835c, 0x8120, + 0x8f5d, 0xac37, 0xd3f2, 0x0164, 0x2ea8, 0x55de, 0x71ef, 0x7f36, + 0x7bfa, 0x68a7, 0x47be, 0x1d85, 0xef79, 0xc390, 0x9f80, 0x87f6, + 0x8001, 0x88a9, 0xa0cf, 0xc54f, 0xf16e, 0x1f70, 0x495e, 0x69c6, + 0x7c74, 0x7efa, 0x7106, 0x5465, 0x2cd1, 0xff6c, 0xd219, 0xaabc, + 0x8e70, 0x80e2, 0x83d3, 0x96e2, 0xb796, 0xe1b1, 0x0fb9, 0x3bb8, + 0x5ff7, 0x77c1, 0x7fff, 0x77a1, 0x5fbc, 0x3b69, 0x0f61, 0xe15a, + 0xb74d, 0x96af, 0x83bd, 0x80ec, 0x8e9a, 0xaaff, 0xd26d, 0xffc5, + 0x2d24, 0x54a8, 0x712f, 0x7f05, 0x7c5f, 0x6994, 0x4914, 0x1f19, + 0xf115, 0xc500, 0xa093, 0x8889, 0x8001, 0x8816, 0x9fbb, 0xc3df, + 0xefd1, 0x1ddc, 0x4808, 0x68da, 0x7c10, 0x7f2c, 0x71c6, 0x559c, + 0x2e55, 0x010a, 0xd39e, 0xabf4, 0x8f32, 0x8115, 0x8371, 0x95f7, + 0xb641, 0xe01e, 0x0e1d, 0x3a48, 0x5ee2, 0x772c, 0x7ffd, 0x7832, + 0x60cd, 0x3cd8, 0x10fd, 0xe2ee, 0xb8a4, 0x979e, 0x8423, 0x80bd, + 0x8ddb, 0xa9ca, 0xd0ea, 0xfe26, 0x2b9f, 0x536f, 0x706b, 0x7ed0, + 0x7cbf, 0x6a7c, 0x4a68, 0x20ab, 0xf2b2, 0xc672, 0xa1aa, 0x8921, + 0x8006, 0x8787, 0x9eab, 0xc272, 0xee36, 0x1c48, 0x46af, 0x67ea, + 0x7ba8, 0x7f59, 0x7282, 0x56cf, 0x2fd7, 0x02aa, 0xd525, 0xad2f, + 0x8ff9, 0x814d, 0x8314, 0x9511, 0xb4ef, 0xde8c, 0x0c80, 0x38d5, + 0x5dc9, 0x7692, 0x7ff6, 0x78bf, 0x61db, 0x3e44, 0x1298, 0xe483, + 0xb9ff, 0x9890, 0x848f, 0x8093, 0x8d22, 0xa899, 0xcf68, 0xfc87, + 0x2a17, 0x5232, 0x6fa2, 0x7e95, 0x7d19, 0x6b61, 0x4bb8, 0x223c, + 0xf44f, 0xc7e6, 0xa2c5, 0x89bd, 0x8010, 0x86fd, 0x9d9f, 0xc107, + 0xec9b, 0x1ab2, 0x4553, 0x66f5, 0x7b3a, 0x7f80, 0x7339, 0x57fe, + 0x3157, 0x0449, 0xd6ad, 0xae6d, 0x90c4, 0x818b, 0x82bc, 0x942f, + 0xb3a0, 0xdcfc, 0x0ae2, 0x375f, 0x5cad, 0x75f3, 0x7fe9, 0x7946, + 0x62e5, 0x3fae, 0x1433, 0xe619, 0xbb5c, 0x9987, 0x84ff, 0x806f, + 0x8c6d, 0xa76b, 0xcde9, 0xfae7, 0x288e, 0x50f2, 0x6ed5, 0x7e54, + 0x7d6e, 0x6c41, 0x4d06, 0x23cc, 0xf5ed, 0xc95c, 0xa3e3, 0x8a5f, + 0x801f, 0x8678, 0x9c98, 0xbf9e, 0xeb00, 0x191b, 0x43f5, 0x65fc, + 0x7ac7, 0x7fa2, 0x73ec, 0x592a, 0x32d6, 0x05e8, 0xd837, 0xafaf, + 0x9194, 0x81ce, 0x8269, 0x9351, 0xb255, 0xdb6d, 0x0944, 0x35e8, + 0x5b8c, 0x754f, 0x7fd8, 0x79c8, 0x63eb, 0x4115, 0x15cc, 0xe7b1, + 0xbcbc, 0x9a82, 0x8575, 0x804f, 0x8bbd, 0xa641, 0xcc6c, 0xf948, + 0x2703, 0x4faf, 0x6e03, 0x7e0f, 0x7dbf, 0x6d1c, 0x4e50, 0x255a, + 0xf78b, 0xcad5, 0xa505, 0x8b05, 0x8033, 0x85f8, 0x9b94, 0xbe39, + 0xe967, 0x1783, 0x4293, 0x64ff, 0x7a4f, 0x7fbf, 0x749a, 0x5a52, + 0x3452, 0x0787, 0xd9c3, 0xb0f4, 0x9268, 0x8216, 0x821b, 0x9278, + 0xb10c, 0xd9e0, 0x07a5, 0x346e, 0x5a68, 0x74a6, 0x7fc0, 0x7a46, + 0x64ec, 0x4279, 0x1765, 0xe949, 0xbe1f, 0x9b81, 0x85ef, 0x8035, + 0x8b11, 0xa51b, 0xcaf1, 0xf7aa, 0x2577, 0x4e68, 0x6d2c, 0x7dc4, + 0x7e0a, 0x6df3, 0x4f97, 0x26e6, 0xf92a, 0xcc50, 0xa62c, 0x8bb0, + 0x804d, 0x857d, 0x9a95, 0xbcd6, 0xe7cf, 0x15ea, 0x412f, 0x63fe, + 0x79d2, 0x7fd6, 0x7543, 0x5b77, 0x35cc, 0x0925, 0xdb50, 0xb23d, + 0x9341, 0x8263, 0x81d3, 0x91a3, 0xafc7, 0xd854, 0x0606, 0x32f2, + 0x5940, 0x73f9, 0x7fa4, 0x7abe, 0x65ea, 0x43db, 0x18fd, 0xeae2, + 0xbf84, 0x9c85, 0x866f, 0x8020, 0x8a6b, 0xa3f8, 0xc978, 0xf60b, + 0x23e9, 0x4d1e, 0x6c51, 0x7d74, 0x7e4f, 0x6ec5, 0x50db, 0x2871, + 0xfac9, 0xcdcd, 0xa755, 0x8c60, 0x806c, 0x8508, 0x9999, 0xbb75, + 0xe637, 0x1451, 0x3fc8, 0x62f8, 0x7950, 0x7fe8, 0x75e7, 0x5c98, + 0x3744, 0x0ac4, 0xdcdf, 0xb388, 0x941e, 0x82b5, 0x8190, 0x90d3, + 0xae85, 0xd6ca, 0x0467, 0x3173, 0x5814, 0x7347, 0x7f82, 0x7b31, + 0x66e3, 0x453a, 0x1a94, 0xec7d, 0xc0ec, 0x9d8c, 0x86f3, 0x8011, + 0x89c9, 0xa2d9, 0xc801, 0xf46d, 0x2259, 0x4bd1, 0x6b71, 0x7d1f, + 0x7e90, 0x6f93, 0x521b, 0x29fb, 0xfc68, 0xcf4c, 0xa883, 0x8d14, + 0x8090, 0x8497, 0x98a2, 0xba18, 0xe4a1, 0x12b6, 0x3e5f, 0x61ef, + 0x78c9, 0x7ff5, 0x7686, 0x5db5, 0x38b9, 0x0c61, 0xde6f, 0xb4d7, + 0x9500, 0x830d, 0x8152, 0x9007, 0xad46, 0xd541, 0x02c8, 0x2ff3, + 0x56e5, 0x7290, 0x7f5c, 0x7ba0, 0x67d8, 0x4696, 0x1c2a, 0xee17, + 0xc257, 0x9e97, 0x877d, 0x8006, 0x892c, 0xa1be, 0xc68d, 0xf2d0, + 0x20c8, 0x4a81, 0x6a8d, 0x7cc5, 0x7ecc, 0x705d, 0x5358, 0x2b82, + 0xfe08, 0xd0ce, 0xa9b4, 0x8dce, 0x80ba, 0x842b, 0x97af, 0xb8bd, + 0xe30b, 0x111b, 0x3cf3, 0x60e1, 0x783d, 0x7ffd, 0x7721, 0x5ece, + 0x3a2d, 0x0dff, 0xe000, 0xb629, 0x95e6, 0x836a, 0x8119, 0x8f41, + 0xac0b, 0xd3bb, 0x0129, 0x2e71, 0x55b2, 0x71d4, 0x7f2f, 0x7c09, + 0x68c9, 0x47ef, 0x1dbf, 0xefb3, 0xc3c4, 0x9fa7, 0x880b, 0x8001, + 0x8894, 0xa0a7, 0xc51b, 0xf133, 0x1f36, 0x492d, 0x69a5, 0x7c66, + 0x7f02, 0x7121, 0x5492, 0x2d08, 0xffa7, 0xd251, 0xaae8, 0x8e8b, + 0x80e9, 0x83c5, 0x96c1, 0xb766, 0xe177, 0x0f7f, 0x3b84, 0x5fd0, + 0x77ac, 0x7fff, 0x77b6, 0x5fe3, 0x3b9d, 0x0f9b, 0xe193, 0xb77d, + 0x96d1, 0x83cc, 0x80e5, 0x8e7e, 0xaad3, 0xd236, 0xff8a, 0x2ced, + 0x547c, 0x7114, 0x7efe, 0x7c6d, 0x69b5, 0x4945, 0x1f52, 0xf150, + 0xc534, 0xa0ba, 0x889e, 0x8001, 0x8801, 0x9f94, 0xc3ab, 0xef97, + 0x1da3, 0x47d7, 0x68b8, 0x7c02, 0x7f33, 0x71e1, 0x55c8, 0x2e8c, + 0x0145, 0xd3d6, 0xac20, 0x8f4e, 0x811c, 0x8363, 0x95d6, 0xb611, + 0xdfe5, 0x0de2, 0x3a13, 0x5eba, 0x7716, 0x7ffd, 0x7847, 0x60f4, + 0x3d0c, 0x1137, 0xe327, 0xb8d5, 0x97c0, 0x8432, 0x80b7, 0x8dc1, + 0xa99f, 0xd0b3, 0xfdeb, 0x2b67, 0x5342, 0x704f, 0x7ec8, 0x7ccc, + 0x6a9d, 0x4a98, 0x20e4, 0xf2ed, 0xc6a6, 0xa1d2, 0x8937, 0x8007, + 0x8773, 0x9e85, 0xc23e, 0xedfb, 0x1c0e, 0x467e, 0x67c7, 0x7b98, + 0x7f5e, 0x729d, 0x56fa, 0x300e, 0x02e5, 0xd55c, 0xad5c, 0x9015, + 0x8156, 0x8307, 0x94f0, 0xb4c0, 0xde53, 0x0c45, 0x38a0, 0x5da1, + 0x767b, 0x7ff5, 0x78d2, 0x6201, 0x3e78, 0x12d3, 0xe4bd, 0xba30, + 0x98b3, 0x849e, 0x808e, 0x8d08, 0xa86e, 0xcf32, 0xfc4c, 0x29df, + 0x5205, 0x6f85, 0x7e8c, 0x7d25, 0x6b81, 0x4be8, 0x2275, 0xf48a, + 0xc81b, 0xa2ed, 0x89d4, 0x8011, 0x86ea, 0x9d7a, 0xc0d3, 0xec60, + 0x1a78, 0x4522, 0x66d2, 0x7b2a, 0x7f85, 0x7353, 0x5829, 0x318e, + 0x0484, 0xd6e5, 0xae9b, 0x90e1, 0x8194, 0x82b0, 0x940f, 0xb371, + 0xdcc3, 0x0aa7, 0x372a, 0x5c84, 0x75dc, 0x7fe7, 0x7959, 0x630a, + 0x3fe1, 0x146d, 0xe653, 0xbb8e, 0x99aa, 0x8510, 0x806a, 0x8c53, + 0xa741, 0xcdb3, 0xfaac, 0x2856, 0x50c4, 0x6eb7, 0x7e4b, 0x7d7a, + 0x6c60, 0x4d35, 0x2404, 0xf628, 0xc992, 0xa40c, 0x8a76, 0x8021, + 0x8666, 0x9c72, 0xbf6b, 0xeac6, 0x18e1, 0x43c2, 0x65d8, 0x7ab6, + 0x7fa6, 0x7405, 0x5955, 0x330c, 0x0623, 0xd86f, 0xafdd, 0x91b2, + 0x81d8, 0x825e, 0x9332, 0xb226, 0xdb34, 0x0909, 0x35b2, 0x5b63, + 0x7537, 0x7fd5, 0x79db, 0x6410, 0x4148, 0x1607, 0xe7eb, 0xbcee, + 0x9aa6, 0x8586, 0x804b, 0x8ba4, 0xa617, 0xcc36, 0xf90d, 0x26cb, + 0x4f80, 0x6de4, 0x7e05, 0x7dca, 0x6d3b, 0x4e7f, 0x2592, 0xf7c6, + 0xcb0b, 0xa52f, 0x8b1d, 0x8037, 0x85e6, 0x9b6f, 0xbe06, 0xe92d, + 0x1749, 0x4261, 0x64db, 0x7a3d, 0x7fc2, 0x74b2, 0x5a7c, 0x3488, + 0x07c2, 0xd9fb, 0xb123, 0x9287, 0x8220, 0x8211, 0x9259, 0xb0de, + 0xd9a7, 0x076a, 0x3438, 0x5a3e, 0x748e, 0x7fbd, 0x7a57, 0x6511, + 0x42ac, 0x179f, 0xe983, 0xbe51, 0x9ba6, 0x8601, 0x8032, 0x8af9, + 0xa4f1, 0xcabb, 0xf76f, 0x253e, 0x4e39, 0x6d0d, 0x7db9, 0x7e14, + 0x6e11, 0x4fc5, 0x271f, 0xf965, 0xcc86, 0xa656, 0x8bc9, 0x8051, + 0x856c, 0x9a70, 0xbca3, 0xe795, 0x15b0, 0x40fc, 0x63d9, 0x79c0, + 0x7fd9, 0x755a, 0x5ba0, 0x3602, 0x0960, 0xdb89, 0xb26c, 0x9360, + 0x826e, 0x81c9, 0x9185, 0xaf99, 0xd81c, 0x05cb, 0x32bb, 0x5916, + 0x73e0, 0x7fa0, 0x7acf, 0x660d, 0x440d, 0x1937, 0xeb1d, 0xbfb7, + 0x9caa, 0x8681, 0x801e, 0x8a53, 0xa3cf, 0xc942, 0xf5d0, 0x23b0, + 0x4cef, 0x6c31, 0x7d69, 0x7e59, 0x6ee3, 0x5108, 0x28a9, 0xfb04, + 0xce04, 0xa780, 0x8c79, 0x8071, 0x84f7, 0x9976, 0xbb43, 0xe5fd, + 0x1416, 0x3f95, 0x62d3, 0x793d, 0x7feb, 0x75fe, 0x5cc0, 0x3779, + 0x0aff, 0xdd18, 0xb3b8, 0x943e, 0x82c2, 0x8186, 0x90b6, 0xae57, + 0xd692, 0x042c, 0x313d, 0x57ea, 0x732d, 0x7f7d, 0x7b41, 0x6706, + 0x456b, 0x1ace, 0xecb7, 0xc120, 0x9db2, 0x8706, 0x800f, 0x89b2, + 0xa2b1, 0xc7cc, 0xf433, 0x2220, 0x4ba1, 0x6b51, 0x7d13, 0x7e99, + 0x6fb0, 0x5248, 0x2a32, 0xfca3, 0xcf83, 0xa8ae, 0x8d2e, 0x8096, + 0x8487, 0x987f, 0xb9e6, 0xe467, 0x127c, 0x3e2b, 0x61c9, 0x78b5, + 0x7ff7, 0x769c, 0x5ddd, 0x38ee, 0x0c9c, 0xdea8, 0xb507, 0x9521, + 0x831a, 0x8149, 0x8feb, 0xad19, 0xd50a, 0x028d, 0x2fbc, 0x56ba, + 0x7275, 0x7f56, 0x7baf, 0x67fa, 0x46c7, 0x1c64, 0xee52, 0xc28b, + 0x9ebe, 0x8791, 0x8005, 0x8916, 0xa196, 0xc658, 0xf295, 0x208f, + 0x4a51, 0x6a6c, 0x7cb8, 0x7ed4, 0x7079, 0x5385, 0x2bba, 0xfe43, + 0xd104, 0xa9df, 0x8de8, 0x80c0, 0x841c, 0x978d, 0xb88c, 0xe2d2, + 0x10e0, 0x3cbf, 0x60bb, 0x7828, 0x7ffe, 0x7736, 0x5ef5, 0x3a61, + 0x0e39, 0xe03a, 0xb659, 0x9608, 0x8377, 0x8111, 0x8f25, 0xabde, + 0xd383, 0x00ee, 0x2e3a, 0x5586, 0x71b9, 0x7f29, 0x7c17, 0x68eb, + 0x4820, 0x1df8, 0xefee, 0xc3f9, 0x9fce, 0x8820, 0x8001, 0x887f, + 0xa080, 0xc4e6, 0xf0f8, 0x1efd, 0x48fd, 0x6983, 0x7c58, 0x7f09, + 0x713d, 0x54be, 0x2d3f, 0xffe2, 0xd288, 0xab15, 0x8ea7, 0x80f0, + 0x83b6, 0x969f, 0xb735, 0xe13e, 0x0f44, 0x3b50, 0x5fa9, 0x7797, + 0x7fff, 0x77cb, 0x600a, 0x3bd2, 0x0fd6, 0xe1cd, 0xb7ae, 0x96f3, + 0x83da, 0x80de, 0x8e63, 0xaaa7, 0xd1ff, 0xff4f, 0x2cb6, 0x5450, + 0x70f8, 0x7ef7, 0x7c7b, 0x69d6, 0x4975, 0x1f8b, 0xf18a, 0xc569, + 0xa0e2, 0x88b4, 0x8002, 0x87ed, 0x9f6d, 0xc377, 0xef5c, 0x1d69, + 0x47a6, 0x6896, 0x7bf3, 0x7f39, 0x71fc, 0x55f4, 0x2ec3, 0x0181, + 0xd40d, 0xac4d, 0x8f6a, 0x8124, 0x8356, 0x95b5, 0xb5e1, 0xdfab, + 0x0da7, 0x39de, 0x5e93, 0x7700, 0x7ffc, 0x785b, 0x611b, 0x3d40, + 0x1172, 0xe361, 0xb906, 0x97e2, 0x8441, 0x80b1, 0x8da6, 0xa973, + 0xd07c, 0xfdb0, 0x2b30, 0x5315, 0x7032, 0x7ebf, 0x7cd9, 0x6abe, + 0x4ac8, 0x211d, 0xf327, 0xc6db, 0xa1fa, 0x894d, 0x8008, 0x875f, + 0x9e5f, 0xc20a, 0xedc1, 0x1bd4, 0x464c, 0x67a4, 0x7b89, 0x7f64, + 0x72b7, 0x5726, 0x3045, 0x0320, 0xd594, 0xad89, 0x9032, 0x815e, + 0x82fa, 0x94d0, 0xb490, 0xde1a, 0x0c0a, 0x386b, 0x5d79, 0x7665, + 0x7ff3, 0x78e6, 0x6227, 0x3eab, 0x130d, 0xe4f7, 0xba62, 0x98d6, + 0x84ae, 0x8088, 0x8cee, 0xa843, 0xcefb, 0xfc10, 0x29a8, 0x51d8, + 0x6f68, 0x7e83, 0x7d32, 0x6ba1, 0x4c18, 0x22ae, 0xf4c5, 0xc850, + 0xa316, 0x89eb, 0x8013, 0x86d7, 0x9d54, 0xc0a0, 0xec26, 0x1a3e, + 0x44f0, 0x66af, 0x7b19, 0x7f8a, 0x736d, 0x5854, 0x31c4, 0x04bf, + 0xd71d, 0xaec9, 0x90ff, 0x819d, 0x82a4, 0x93ef, 0xb342, 0xdc8a, + 0x0a6c, 0x36f5, 0x5c5b, 0x75c5, 0x7fe5, 0x796c, 0x6330, 0x4014, + 0x14a7, 0xe68d, 0xbbc0, 0x99ce, 0x8520, 0x8065, 0x8c3a, 0xa716, + 0xcd7c, 0xfa71, 0x281e, 0x5097, 0x6e99, 0x7e41, 0x7d86, 0x6c80, + 0x4d64, 0x243d, 0xf663, 0xc9c7, 0xa435, 0x8a8d, 0x8024, 0x8653, + 0x9c4d, 0xbf38, 0xea8c, 0x18a7, 0x4390, 0x65b4, 0x7aa5, 0x7fab, + 0x741e, 0x597f, 0x3342, 0x065e, 0xd8a8, 0xb00b, 0x91d0, 0x81e2, + 0x8252, 0x9313, 0xb1f7, 0xdafc, 0x08ce, 0x357c, 0x5b39, 0x751f, + 0x7fd2, 0x79ed, 0x6434, 0x417b, 0x1641, 0xe825, 0xbd20, 0x9aca, + 0x8597, 0x8047, 0x8b8b, 0xa5ed, 0xcc00, 0xf8d2, 0x2693, 0x4f52, + 0x6dc6, 0x7dfa, 0x7dd4, 0x6d5a, 0x4ead, 0x25cb, 0xf801, 0xcb41, + 0xa559, 0x8b35, 0x803a, 0x85d5, 0x9b4b, 0xbdd3, 0xe8f3, 0x170f, + 0x422e, 0x64b6, 0x7a2c, 0x7fc6, 0x74ca, 0x5aa6, 0x34be, 0x07fd, + 0xda34, 0xb151, 0x92a5, 0x822b, 0x8206, 0x923b, 0xb0af, 0xd96f, + 0x072f, 0x3402, 0x5a14, 0x7475, 0x7fb9, 0x7a69, 0x6535, 0x42de, + 0x17da, 0xe9bd, 0xbe84, 0x9bcb, 0x8613, 0x802f, 0x8ae1, 0xa4c8, + 0xca85, 0xf734, 0x2506, 0x4e0a, 0x6cee, 0x7dae, 0x7e1e, 0x6e2f, + 0x4ff3, 0x2757, 0xf9a0, 0xccbc, 0xa680, 0x8be1, 0x8055, 0x855b, + 0x9a4d, 0xbc71, 0xe75a, 0x1576, 0x40c9, 0x63b4, 0x79ad, 0x7fdc, + 0x7572, 0x5bca, 0x3637, 0x099b, 0xdbc1, 0xb29b, 0x9380, 0x827a, + 0x81bf, 0x9168, 0xaf6b, 0xd7e4, 0x0590, 0x3285, 0x58eb, 0x73c7, + 0x7f9b, 0x7adf, 0x6631, 0x443f, 0x1971, 0xeb57, 0xbfea, 0x9ccf, + 0x8694, 0x801b, 0x8a3c, 0xa3a6, 0xc90d, 0xf596, 0x2377, 0x4cc0, + 0x6c12, 0x7d5d, 0x7e62, 0x6f00, 0x5136, 0x28e1, 0xfb3f, 0xce3a, + 0xa7ab, 0x8c93, 0x8076, 0x84e7, 0x9952, 0xbb12, 0xe5c3, 0x13dc, + 0x3f62, 0x62ad, 0x792a, 0x7fed, 0x7615, 0x5ce9, 0x37ae, 0x0b39, + 0xdd50, 0xb3e7, 0x945e, 0x82ce, 0x817d, 0x9099, 0xae2a, 0xd65a, + 0x03f1, 0x3106, 0x57bf, 0x7313, 0x7f78, 0x7b51, 0x6729, 0x459d, + 0x1b08, 0xecf1, 0xc153, 0x9dd8, 0x871a, 0x800d, 0x899c, 0xa288, + 0xc797, 0xf3f8, 0x21e7, 0x4b72, 0x6b31, 0x7d06, 0x7ea2, 0x6fcd, + 0x5276, 0x2a6a, 0xfcde, 0xcfba, 0xa8d9, 0x8d48, 0x809c, 0x8478, + 0x985c, 0xb9b5, 0xe42d, 0x1241, 0x3df7, 0x61a2, 0x78a1, 0x7ff8, + 0x76b3, 0x5e05, 0x3923, 0x0cd7, 0xdee1, 0xb537, 0x9541, 0x8327, + 0x8141, 0x8fce, 0xacec, 0xd4d2, 0x0252, 0x2f86, 0x568e, 0x725b, + 0x7f50, 0x7bbe, 0x681d, 0x46f8, 0x1c9d, 0xee8d, 0xc2bf, 0x9ee4, + 0x87a5, 0x8004, 0x8900, 0xa16f, 0xc623, 0xf25a, 0x2056, 0x4a20, + 0x6a4c, 0x7cab, 0x7edb, 0x7095, 0x53b2, 0x2bf1, 0xfe7e, 0xd13c, + 0xaa0b, 0x8e03, 0x80c7, 0x840d, 0x976b, 0xb85b, 0xe298, 0x10a6, + 0x3c8b, 0x6094, 0x7814, 0x7ffe, 0x774c, 0x5f1d, 0x3a96, 0x0e74, + 0xe073, 0xb689, 0x9629, 0x8385, 0x810a, 0x8f09, 0xabb2, 0xd34c, + 0x00b2, 0x2e03, 0x555a, 0x719e, 0x7f22, 0x7c26, 0x690c, 0x4850, + 0x1e32, 0xf028, 0xc42d, 0x9ff5, 0x8835, 0x8001, 0x886a, 0xa059, + 0xc4b2, 0xf0be, 0x1ec4, 0x48cc, 0x6962, 0x7c4a, 0x7f10, 0x7158, + 0x54ea, 0x2d77, 0x001c, 0xd2bf, 0xab41, 0x8ec2, 0x80f7, 0x83a8, + 0x967d, 0xb705, 0xe105, 0x0f09, 0x3b1b, 0x5f81, 0x7782, 0x7fff, + 0x77e0, 0x6031, 0x3c06, 0x1011, 0xe206, 0xb7df, 0x9715, 0x83e8, + 0x80d7, 0x8e48, 0xaa7b, 0xd1c7, 0xff14, 0x2c7e, 0x5423, 0x70dc, + 0x7eef, 0x7c88, 0x69f8, 0x49a6, 0x1fc5, 0xf1c5, 0xc59d, 0xa10a, + 0x88c9, 0x8002, 0x87d8, 0x9f46, 0xc343, 0xef21, 0x1d30, 0x4775, + 0x6874, 0x7be4, 0x7f40, 0x7217, 0x561f, 0x2efa, 0x01bc, 0xd445, + 0xac7a, 0x8f86, 0x812c, 0x8348, 0x9594, 0xb5b1, 0xdf72, 0x0d6c, + 0x39aa, 0x5e6b, 0x76ea, 0x7ffb, 0x786f, 0x6141, 0x3d74, 0x11ac, + 0xe39b, 0xb938, 0x9805, 0x8451, 0x80ab, 0x8d8b, 0xa947, 0xd045, + 0xfd75, 0x2af8, 0x52e8, 0x7016, 0x7eb7, 0x7ce6, 0x6ade, 0x4af8, + 0x2156, 0xf362, 0xc710, 0xa222, 0x8963, 0x8009, 0x874b, 0x9e38, + 0xc1d6, 0xed86, 0x1b9b, 0x461b, 0x6782, 0x7b79, 0x7f6a, 0x72d1, + 0x5751, 0x307b, 0x035b, 0xd5cc, 0xadb6, 0x904f, 0x8167, 0x82ed, + 0x94b0, 0xb460, 0xdde1, 0x0bcf, 0x3836, 0x5d50, 0x764e, 0x7ff1, + 0x78f9, 0x624d, 0x3edf, 0x1347, 0xe530, 0xba93, 0x98f9, 0x84be, + 0x8083, 0x8cd4, 0xa818, 0xcec5, 0xfbd5, 0x2970, 0x51aa, 0x6f4b, + 0x7e7a, 0x7d3e, 0x6bc1, 0x4c47, 0x22e7, 0xf500, 0xc885, 0xa33e, + 0x8a02, 0x8015, 0x86c4, 0x9d2e, 0xc06d, 0xebeb, 0x1a04, 0x44be, + 0x668b, 0x7b09, 0x7f8f, 0x7386, 0x587f, 0x31fb, 0x04fa, 0xd755, + 0xaef6, 0x911c, 0x81a7, 0x8298, 0x93d0, 0xb312, 0xdc51, 0x0a31, + 0x36bf, 0x5c32, 0x75ad, 0x7fe2, 0x797e, 0x6355, 0x4047, 0x14e2, + 0xe6c7, 0xbbf2, 0x99f2, 0x8531, 0x8060, 0x8c21, 0xa6ec, 0xcd46, + 0xfa36, 0x27e6, 0x5069, 0x6e7b, 0x7e37, 0x7d91, 0x6c9f, 0x4d93, + 0x2476, 0xf69e, 0xc9fd, 0xa45f, 0x8aa5, 0x8027, 0x8641, 0x9c28, + 0xbf05, 0xea51, 0x186d, 0x435e, 0x6590, 0x7a94, 0x7faf, 0x7437, + 0x59a9, 0x3378, 0x0699, 0xd8e0, 0xb039, 0x91ee, 0x81ec, 0x8247, + 0x92f4, 0xb1c8, 0xdac3, 0x0893, 0x3547, 0x5b10, 0x7507, 0x7fce, + 0x79ff, 0x6459, 0x41ad, 0x167b, 0xe85f, 0xbd53, 0x9aee, 0x85a8, + 0x8043, 0x8b73, 0xa5c3, 0xcbca, 0xf897, 0x265a, 0x4f24, 0x6da7, + 0x7df0, 0x7ddf, 0x6d78, 0x4edc, 0x2603, 0xf83c, 0xcb77, 0xa583, + 0x8b4d, 0x803e, 0x85c3, 0x9b26, 0xbda1, 0xe8b8, 0x16d5, 0x41fb, + 0x6492, 0x7a1a, 0x7fc9, 0x74e2, 0x5ad0, 0x34f4, 0x0838, 0xda6c, + 0xb180, 0x92c4, 0x8236, 0x81fc, 0x921d, 0xb081, 0xd937, 0x06f4, + 0x33cc, 0x59ea, 0x745d, 0x7fb5, 0x7a7a, 0x6559, 0x4311, 0x1814, + 0xe9f8, 0xbeb7, 0x9bef, 0x8625, 0x802b, 0x8ac9, 0xa49e, 0xca50, + 0xf6f9, 0x24cd, 0x4ddc, 0x6ccf, 0x7da3, 0x7e28, 0x6e4d, 0x5022, + 0x278f, 0xf9db, 0xccf3, 0xa6aa, 0x8bfa, 0x805a, 0x854a, 0x9a29, + 0xbc3f, 0xe720, 0x153c, 0x4096, 0x638f, 0x799b, 0x7fdf, 0x7589, + 0x5bf3, 0x366d, 0x09d6, 0xdbfa, 0xb2ca, 0x939f, 0x8286, 0x81b5, + 0x914a, 0xaf3d, 0xd7ab, 0x0555, 0x324f, 0x58c1, 0x73ad, 0x7f96, + 0x7af0, 0x6655, 0x4471, 0x19ab, 0xeb91, 0xc01e, 0x9cf5, 0x86a7, + 0x8019, 0x8a25, 0xa37d, 0xc8d8, 0xf55b, 0x233e, 0x4c90, 0x6bf2, + 0x7d51, 0x7e6c, 0x6f1e, 0x5164, 0x2919, 0xfb7a, 0xce71, 0xa7d6, + 0x8cac, 0x807b, 0x84d7, 0x992f, 0xbae0, 0xe589, 0x13a1, 0x3f2e, + 0x6287, 0x7917, 0x7fef, 0x762b, 0x5d12, 0x37e4, 0x0b74, 0xdd89, + 0xb417, 0x947e, 0x82da, 0x8174, 0x907c, 0xadfc, 0xd622, 0x03b6, + 0x30d0, 0x5793, 0x72f9, 0x7f73, 0x7b61, 0x674c, 0x45cf, 0x1b42, + 0xed2c, 0xc187, 0x9dfe, 0x872d, 0x800b, 0x8985, 0xa260, 0xc762, + 0xf3bd, 0x21ae, 0x4b42, 0x6b10, 0x7cfa, 0x7eaa, 0x6fea, 0x52a3, + 0x2aa2, 0xfd1a, 0xcff1, 0xa905, 0x8d63, 0x80a1, 0x8468, 0x983a, + 0xb984, 0xe3f4, 0x1207, 0x3dc4, 0x617c, 0x788e, 0x7ff9, 0x76c9, + 0x5e2d, 0x3958, 0x0d12, 0xdf1a, 0xb567, 0x9562, 0x8334, 0x8139, + 0x8fb2, 0xacbf, 0xd49a, 0x0217, 0x2f4f, 0x5663, 0x7240, 0x7f49, + 0x7bcd, 0x683f, 0x4729, 0x1cd7, 0xeec7, 0xc2f3, 0x9f0b, 0x87b9, + 0x8003, 0x88eb, 0xa147, 0xc5ee, 0xf220, 0x201d, 0x49f0, 0x6a2b, + 0x7c9d, 0x7ee3, 0x70b1, 0x53de, 0x2c29, 0xfeb9, 0xd173, 0xaa37, + 0x8e1e, 0x80cd, 0x83ff, 0x9749, 0xb82a, 0xe25f, 0x106b, 0x3c56, + 0x606d, 0x7800, 0x7fff, 0x7761, 0x5f44, 0x3aca, 0x0eaf, 0xe0ac, + 0xb6ba, 0x964a, 0x8393, 0x8102, 0x8eed, 0xab85, 0xd314, 0x0077, + 0x2dcc, 0x552e, 0x7183, 0x7f1b, 0x7c34, 0x692e, 0x4881, 0x1e6b, + 0xf063, 0xc461, 0xa01c, 0x8849, 0x8001, 0x8855, 0xa031, 0xc47d, + 0xf083, 0x1e8a, 0x489c, 0x6940, 0x7c3c, 0x7f17, 0x7174, 0x5516, + 0x2dae, 0x0057, 0xd2f6, 0xab6d, 0x8ede, 0x80fe, 0x839a, 0x965c, + 0xb6d4, 0xe0cb, 0x0ecf, 0x3ae7, 0x5f5a, 0x776c, 0x7fff, 0x77f4, + 0x6058, 0x3c3a, 0x104b, 0xe240, 0xb810, 0x9736, 0x83f7, 0x80d1, + 0x8e2d, 0xaa4f, 0xd190, 0xfed9, 0x2c47, 0x53f7, 0x70c0, 0x7ee7, + 0x7c96, 0x6a19, 0x49d6, 0x1ffe, 0xf200, 0xc5d2, 0xa131, 0x88df, + 0x8003, 0x87c4, 0x9f20, 0xc30f, 0xeee7, 0x1cf6, 0x4744, 0x6852, + 0x7bd5, 0x7f46, 0x7232, 0x564b, 0x2f31, 0x01f7, 0xd47c, 0xaca7, + 0x8fa3, 0x8134, 0x833b, 0x9574, 0xb581, 0xdf39, 0x0d32, 0x3975, + 0x5e43, 0x76d5, 0x7ffa, 0x7883, 0x6167, 0x3da8, 0x11e7, 0xe3d4, + 0xb969, 0x9827, 0x8460, 0x80a5, 0x8d71, 0xa91c, 0xd00e, 0xfd3a, + 0x2ac0, 0x52bb, 0x6ff9, 0x7eaf, 0x7cf3, 0x6aff, 0x4b28, 0x2190, + 0xf39d, 0xc745, 0xa24a, 0x8979, 0x800b, 0x8738, 0x9e12, 0xc1a3, + 0xed4c, 0x1b61, 0x45e9, 0x675f, 0x7b6a, 0x7f70, 0x72eb, 0x577c, + 0x30b2, 0x0396, 0xd604, 0xade4, 0x906c, 0x8170, 0x82e1, 0x9490, + 0xb430, 0xdda8, 0x0b94, 0x3800, 0x5d28, 0x7638, 0x7ff0, 0x790c, + 0x6273, 0x3f12, 0x1382, 0xe56a, 0xbac5, 0x991c, 0x84ce, 0x807e, + 0x8cba, 0xa7ed, 0xce8e, 0xfb9a, 0x2938, 0x517d, 0x6f2e, 0x7e71, + 0x7d4a, 0x6be1, 0x4c77, 0x2320, 0xf53b, 0xc8bb, 0xa367, 0x8a19, + 0x8018, 0x86b1, 0x9d09, 0xc039, 0xebb1, 0x19ca, 0x448c, 0x6668, + 0x7af9, 0x7f94, 0x73a0, 0x58aa, 0x3231, 0x0535, 0xd78d, 0xaf24, + 0x913a, 0x81b0, 0x828c, 0x93b0, 0xb2e3, 0xdc19, 0x09f6, 0x368a, + 0x5c09, 0x7596, 0x7fe0, 0x7991, 0x637a, 0x407a, 0x151c, 0xe701, + 0xbc24, 0x9a15, 0x8541, 0x805c, 0x8c08, 0xa6c1, 0xcd10, 0xf9fb, + 0x27ae, 0x503b, 0x6e5e, 0x7e2d, 0x7d9d, 0x6cbe, 0x4dc2, 0x24ae, + 0xf6d9, 0xca33, 0xa488, 0x8abd, 0x802a, 0x862f, 0x9c03, 0xbed2, + 0xea17, 0x1833, 0x432c, 0x656c, 0x7a83, 0x7fb3, 0x744f, 0x59d3, + 0x33ae, 0x06d4, 0xd918, 0xb068, 0x920c, 0x81f6, 0x823c, 0x92d5, + 0xb199, 0xda8b, 0x0858, 0x3511, 0x5ae6, 0x74ef, 0x7fcb, 0x7a10, + 0x647e, 0x41e0, 0x16b5, 0xe899, 0xbd85, 0x9b13, 0x85ba, 0x8040, + 0x8b5a, 0xa599, 0xcb94, 0xf85c, 0x2622, 0x4ef5, 0x6d89, 0x7de5, + 0x7dea, 0x6d97, 0x4f0b, 0x263c, 0xf877, 0xcbad, 0xa5ac, 0x8b66, + 0x8041, 0x85b2, 0x9b02, 0xbd6e, 0xe87e, 0x169b, 0x41c9, 0x646d, + 0x7a08, 0x7fcd, 0x74fa, 0x5af9, 0x3529, 0x0873, 0xdaa5, 0xb1af, + 0x92e3, 0x8241, 0x81f1, 0x91fe, 0xb053, 0xd8fe, 0x06b9, 0x3396, + 0x59c0, 0x7444, 0x7fb1, 0x7a8b, 0x657d, 0x4343, 0x184e, 0xea32, + 0xbeea, 0x9c14, 0x8637, 0x8028, 0x8ab2, 0xa475, 0xca1a, 0xf6be, + 0x2494, 0x4dad, 0x6cb0, 0x7d97, 0x7e32, 0x6e6b, 0x5050, 0x27c7, + 0xfa16, 0xcd29, 0xa6d5, 0x8c13, 0x805e, 0x853a, 0x9a05, 0xbc0d, + 0xe6e7, 0x1501, 0x4063, 0x6369, 0x7988, 0x7fe1, 0x75a1, 0x5c1c, + 0x36a2, 0x0a11, 0xdc33, 0xb2f9, 0x93bf, 0x8291, 0x81ac, 0x912c, + 0xaf0f, 0xd773, 0x051a, 0x3218, 0x5896, 0x7394, 0x7f92, 0x7b00, + 0x6678, 0x44a3, 0x19e5, 0xebcc, 0xc051, 0x9d1a, 0x86b9, 0x8017, + 0x8a0e, 0xa354, 0xc8a2, 0xf520, 0x2306, 0x4c61, 0x6bd2, 0x7d45, + 0x7e75, 0x6f3b, 0x5191, 0x2951, 0xfbb5, 0xcea7, 0xa800, 0x8cc6, + 0x8080, 0x84c7, 0x990c, 0xbaae, 0xe550, 0x1367, 0x3efb, 0x6262, + 0x7904, 0x7ff0, 0x7642, 0x5d3a, 0x3819, 0x0baf, 0xddc2, 0xb446, + 0x949e, 0x82e7, 0x816c, 0x905f, 0xadcf, 0xd5ea, 0x037b, 0x3099, + 0x5768, 0x72df, 0x7f6d, 0x7b71, 0x676f, 0x4600, 0x1b7b, 0xed66, + 0xc1ba, 0x9e24, 0x8741, 0x800a, 0x896f, 0xa238, 0xc72d, 0xf382, + 0x2175, 0x4b12, 0x6af0, 0x7ced, 0x7eb3, 0x7006, 0x52d0, 0x2ada, + 0xfd55, 0xd027, 0xa930, 0x8d7d, 0x80a7, 0x8459, 0x9817, 0xb952, + 0xe3ba, 0x11cc, 0x3d90, 0x6156, 0x787a, 0x7ffa, 0x76df, 0x5e55, + 0x398d, 0x0d4d, 0xdf53, 0xb597, 0x9583, 0x8341, 0x8131, 0x8f96, + 0xac92, 0xd463, 0x01dc, 0x2f18, 0x5637, 0x7226, 0x7f43, 0x7bdc, + 0x6861, 0x475a, 0x1d11, 0xef02, 0xc327, 0x9f32, 0x87cd, 0x8003, + 0x88d5, 0xa11f, 0xc5ba, 0xf1e5, 0x1fe4, 0x49c0, 0x6a0a, 0x7c90, + 0x7eeb, 0x70cd, 0x540b, 0x2c60, 0xfef4, 0xd1aa, 0xaa63, 0x8e39, + 0x80d4, 0x83f0, 0x9727, 0xb7f9, 0xe225, 0x1030, 0x3c22, 0x6046, + 0x77eb, 0x7fff, 0x7776, 0x5f6c, 0x3aff, 0x0eea, 0xe0e6, 0xb6ea, + 0x966b, 0x83a1, 0x80fb, 0x8ed1, 0xab59, 0xd2dd, 0x003c, 0x2d95, + 0x5502, 0x7167, 0x7f14, 0x7c42, 0x6950, 0x48b2, 0x1ea4, 0xf09e, + 0xc495, 0xa043, 0x885e, 0x8001, 0x8840, 0xa00a, 0xc449, 0xf048, + 0x1e51, 0x486b, 0x691f, 0x7c2e, 0x7f1e, 0x718f, 0x5543, 0x2de5, + 0x0092, 0xd32e, 0xab9a, 0x8efa, 0x8105, 0x838c, 0x963b, 0xb6a4, + 0xe092, 0x0e94, 0x3ab2, 0x5f32, 0x7757, 0x7fff, 0x7809, 0x607f, + 0x3c6e, 0x1086, 0xe279, 0xb841, 0x9758, 0x8405, 0x80ca, 0x8e12, + 0xaa23, 0xd159, 0xfe9e, 0x2c0f, 0x53ca, 0x70a4, 0x7ee0, 0x7ca3, + 0x6a3a, 0x4a06, 0x2037, 0xf23b, 0xc607, 0xa159, 0x88f5, 0x8004, + 0x87b0, 0x9ef9, 0xc2db, 0xeeac, 0x1cbd, 0x4713, 0x682f, 0x7bc6, + 0x7f4c, 0x724c, 0x5677, 0x2f68, 0x0232, 0xd4b4, 0xacd4, 0x8fbf, + 0x813c, 0x832e, 0x9553, 0xb551, 0xdf00, 0x0cf7, 0x3940, 0x5e1b, + 0x76bf, 0x7ff9, 0x7897, 0x618e, 0x3ddb, 0x1221, 0xe40e, 0xb99a, + 0x984a, 0x846f, 0x809f, 0x8d57, 0xa8f1, 0xcfd7, 0xfcfe, 0x2a88, + 0x528e, 0x6fdd, 0x7ea6, 0x7cff, 0x6b1f, 0x4b58, 0x21c9, 0xf3d8, + 0xc77a, 0xa273, 0x8990, 0x800c, 0x8724, 0x9dec, 0xc16f, 0xed11, + 0x1b27, 0x45b8, 0x673c, 0x7b5a, 0x7f75, 0x7305, 0x57a7, 0x30e9, + 0x03d1, 0xd63c, 0xae11, 0x9089, 0x8179, 0x82d4, 0x9470, 0xb401, + 0xdd6f, 0x0b59, 0x37cb, 0x5cff, 0x7621, 0x7fee, 0x7920, 0x6299, + 0x3f46, 0x13bc, 0xe5a4, 0xbaf7, 0x993f, 0x84de, 0x8079, 0x8ca0, + 0xa7c2, 0xce58, 0xfb5f, 0x2900, 0x514f, 0x6f10, 0x7e67, 0x7d56, + 0x6c00, 0x4ca6, 0x2359, 0xf576, 0xc8f0, 0xa390, 0x8a30, 0x801a, + 0x869e, 0x9ce3, 0xc006, 0xeb77, 0x1991, 0x445a, 0x6644, 0x7ae8, + 0x7f99, 0x73b9, 0x58d4, 0x3268, 0x0570, 0xd7c5, 0xaf52, 0x9157, + 0x81ba, 0x8280, 0x9391, 0xb2b4, 0xdbe0, 0x09bb, 0x3654, 0x5be0, + 0x757f, 0x7fdd, 0x79a3, 0x63a0, 0x40ae, 0x1556, 0xe73b, 0xbc56, + 0x9a39, 0x8552, 0x8058, 0x8bef, 0xa697, 0xccda, 0xf9c0, 0x2775, + 0x500c, 0x6e40, 0x7e23, 0x7da8, 0x6cdd, 0x4df1, 0x24e7, 0xf714, + 0xca68, 0xa4b1, 0x8ad4, 0x802d, 0x861d, 0x9bdf, 0xbea0, 0xe9dd, + 0x17f9, 0x42f9, 0x6548, 0x7a72, 0x7fb7, 0x7468, 0x59fd, 0x33e4, + 0x070f, 0xd950, 0xb096, 0x922a, 0x8200, 0x8231, 0x92b6, 0xb16b, + 0xda52, 0x081d, 0x34db, 0x5abd, 0x74d7, 0x7fc8, 0x7a22, 0x64a2, + 0x4213, 0x16ef, 0xe8d3, 0xbdb8, 0x9b37, 0x85cb, 0x803c, 0x8b42, + 0xa56f, 0xcb5e, 0xf821, 0x25e9, 0x4ec7, 0x6d6a, 0x7dda, 0x7df4, + 0x6db5, 0x4f39, 0x2674, 0xf8b2, 0xcbe3, 0xa5d6, 0x8b7e, 0x8045, + 0x85a0, 0x9ade, 0xbd3c, 0xe844, 0x1660, 0x4196, 0x6448, 0x79f6, + 0x7fd0, 0x7512, 0x5b23, 0x355f, 0x08ae, 0xdadd, 0xb1dd, 0x9302, + 0x824c, 0x81e7, 0x91e0, 0xb024, 0xd8c6, 0x067e, 0x3360, 0x5996, + 0x742b, 0x7fad, 0x7a9c, 0x65a1, 0x4375, 0x1888, 0xea6c, 0xbf1d, + 0x9c39, 0x8649, 0x8026, 0x8a9a, 0xa44c, 0xc9e4, 0xf683, 0x245c, + 0x4d7e, 0x6c90, 0x7d8c, 0x7e3c, 0x6e89, 0x507e, 0x2800, 0xfa51, + 0xcd5f, 0xa6ff, 0x8c2c, 0x8063, 0x8529, 0x99e1, 0xbbdb, 0xe6ad, + 0x14c7, 0x4030, 0x6344, 0x7976, 0x7fe4, 0x75b8, 0x5c45, 0x36d8, + 0x0a4c, 0xdc6c, 0xb328, 0x93de, 0x829d, 0x81a2, 0x910f, 0xaee1, + 0xd73b, 0x04df, 0x31e2, 0x586b, 0x737b, 0x7f8d, 0x7b11, 0x669b, + 0x44d5, 0x1a1f, 0xec06, 0xc084, 0x9d40, 0x86cc, 0x8014, 0x89f7, + 0xa32c, 0xc86d, 0xf4e5, 0x22cd, 0x4c31, 0x6bb2, 0x7d38, 0x7e7e, + 0x6f58, 0x51bf, 0x2989, 0xfbf0, 0xcede, 0xa82b, 0x8ce0, 0x8085, + 0x84b7, 0x98e9, 0xba7c, 0xe516, 0x132d, 0x3ec7, 0x623c, 0x78f0, + 0x7ff2, 0x7659, 0x5d63, 0x384e, 0x0bea, 0xddfb, 0xb476, 0x94bf, + 0x82f3, 0x8163, 0x9042, 0xada2, 0xd5b2, 0x0340, 0x3062, 0x573d, + 0x72c5, 0x7f67, 0x7b80, 0x6792, 0x4632, 0x1bb5, 0xeda1, 0xc1ee, + 0x9e4a, 0x8754, 0x8009, 0x8959, 0xa210, 0xc6f8, 0xf347, 0x213c, + 0x4ae2, 0x6acf, 0x7ce0, 0x7ebb, 0x7023, 0x52fd, 0x2b11, 0xfd90, + 0xd05e, 0xa95b, 0x8d98, 0x80ad, 0x844a, 0x97f5, 0xb921, 0xe380, + 0x1191, 0x3d5c, 0x612f, 0x7866, 0x7ffb, 0x76f4, 0x5e7d, 0x39c2, + 0x0d87, 0xdf8c, 0xb5c7, 0x95a4, 0x834e, 0x8129, 0x8f79, 0xac65, + 0xd42b, 0x01a1, 0x2ee1, 0x560b, 0x720b, 0x7f3d, 0x7beb, 0x6884, + 0x478c, 0x1d4a, 0xef3c, 0xc35b, 0x9f58, 0x87e1, 0x8002, 0x88bf, + 0xa0f7, 0xc585, 0xf1aa, 0x1faa, 0x4990, 0x69e8, 0x7c82, 0x7ef3, + 0x70e9, 0x5438, 0x2c98, 0xff2f, 0xd1e1, 0xaa8f, 0x8e54, 0x80db, + 0x83e2, 0x9705, 0xb7c9, 0xe1ec, 0x0ff6, 0x3bee, 0x601f, 0x77d6, + 0x7fff, 0x778b, 0x5f93, 0x3b33, 0x0f24, 0xe11f, 0xb71b, 0x968d, + 0x83af, 0x80f3, 0x8eb6, 0xab2c, 0xd2a6, 0x0001, 0x2d5d, 0x54d6, + 0x714c, 0x7f0d, 0x7c50, 0x6971, 0x48e3, 0x1ede, 0xf0d9, 0xc4ca, + 0xa06b, 0x8873, 0x8001, 0x882b, 0x9fe3, 0xc415, 0xf00e, 0x1e17, + 0x483a, 0x68fd, 0x7c1f, 0x7f25, 0x71aa, 0x556f, 0x2e1c, 0x00ce, + 0xd365, 0xabc6, 0x8f16, 0x810d, 0x837f, 0x9619, 0xb673, 0xe059, + 0x0e59, 0x3a7e, 0x5f0b, 0x7742, 0x7ffe, 0x781d, 0x60a6, 0x3ca2, + 0x10c0, 0xe2b3, 0xb872, 0x977a, 0x8414, 0x80c4, 0x8df7, 0xa9f7, + 0xd122, 0xfe63, 0x2bd8, 0x539d, 0x7088, 0x7ed8, 0x7cb1, 0x6a5b, + 0x4a36, 0x2070, 0xf275, 0xc63b, 0xa181, 0x890a, 0x8005, 0x879b, + 0x9ed3, 0xc2a7, 0xee72, 0x1c83, 0x46e2, 0x680d, 0x7bb7, 0x7f52, + 0x7267, 0x56a2, 0x2f9f, 0x026d, 0xd4ec, 0xad01, 0x8fdb, 0x8145, + 0x8321, 0x9532, 0xb521, 0xdec7, 0x0cbc, 0x390b, 0x5df3, 0x76a8, + 0x7ff7, 0x78aa, 0x61b4, 0x3e0f, 0x125c, 0xe448, 0xb9cc, 0x986c, + 0x847f, 0x8099, 0x8d3c, 0xa8c5, 0xcfa1, 0xfcc3, 0x2a51, 0x5261, + 0x6fc0, 0x7e9e, 0x7d0c, 0x6b40, 0x4b87, 0x2202, 0xf413, 0xc7af, + 0xa29b, 0x89a6, 0x800e, 0x8711, 0x9dc6, 0xc13c, 0xecd7, 0x1aed, + 0x4586, 0x6719, 0x7b4a, 0x7f7a, 0x731f, 0x57d2, 0x311f, 0x040c, + 0xd674, 0xae3f, 0x90a6, 0x8182, 0x82c8, 0x9450, 0xb3d1, 0xdd36, + 0x0b1e, 0x3796, 0x5cd7, 0x760a, 0x7fec, 0x7933, 0x62be, 0x3f79, + 0x13f7, 0xe5de, 0xbb28, 0x9963, 0x84ee, 0x8074, 0x8c87, 0xa797, + 0xce21, 0xfb24, 0x28c8, 0x5121, 0x6ef3, 0x7e5e, 0x7d62, 0x6c20, + 0x4cd5, 0x2391, 0xf5b1, 0xc925, 0xa3b9, 0x8a47, 0x801c, 0x868b, + 0x9cbe, 0xbfd3, 0xeb3c, 0x1957, 0x4428, 0x6621, 0x7ad8, 0x7f9d, + 0x73d2, 0x58ff, 0x329e, 0x05ab, 0xd7fd, 0xaf80, 0x9175, 0x81c4, + 0x8275, 0x9371, 0xb285, 0xdba7, 0x0980, 0x361f, 0x5bb7, 0x7567, + 0x7fdb, 0x79b6, 0x63c5, 0x40e1, 0x1591, 0xe775, 0xbc88, 0x9a5d, + 0x8563, 0x8053, 0x8bd6, 0xa66d, 0xcca3, 0xf985, 0x273d, 0x4fde, + 0x6e22, 0x7e19, 0x7db3, 0x6cfc, 0x4e20, 0x2520, 0xf74f, 0xca9e, + 0xa4db, 0x8aec, 0x8030, 0x860b, 0x9bba, 0xbe6d, 0xe9a3, 0x17bf, + 0x42c7, 0x6524, 0x7a61, 0x7fbb, 0x7481, 0x5a27, 0x341b, 0x074a, + 0xd989, 0xb0c4, 0x9249, 0x820b, 0x8226, 0x9297, 0xb13c, 0xda1a, + 0x07e2, 0x34a5, 0x5a93, 0x74bf, 0x7fc4, 0x7a34, 0x64c7, 0x4245, + 0x172a, 0xe90d, 0xbdeb, 0x9b5c, 0x85dd, 0x8038, 0x8b2a, 0xa546, + 0xcb28, 0xf7e6, 0x25b1, 0x4e98, 0x6d4c, 0x7dcf, 0x7dff, 0x6dd4, + 0x4f67, 0x26ac, 0xf8ed, 0xcc19, 0xa600, 0x8b97, 0x8049, 0x858f, + 0x9aba, 0xbd09, 0xe80a, 0x1626, 0x4163, 0x6424, 0x79e4, 0x7fd3, + 0x752a, 0x5b4c, 0x3595, 0x08e9, 0xdb16, 0xb20c, 0x9321, 0x8257, + 0x81dd, 0x91c2, 0xaff6, 0xd88e, 0x0643, 0x3329, 0x596c, 0x7412, + 0x7fa9, 0x7aad, 0x65c5, 0x43a7, 0x18c2, 0xeaa6, 0xbf50, 0x9c5e, + 0x865c, 0x8023, 0x8a83, 0xa422, 0xc9af, 0xf648, 0x2423, 0x4d4f, + 0x6c71, 0x7d80, 0x7e46, 0x6ea7, 0x50ac, 0x2838, 0xfa8c, 0xcd95, + 0xa72a, 0x8c46, 0x8067, 0x8518, 0x99be, 0xbba9, 0xe673, 0x148d, + 0x3ffd, 0x631f, 0x7963, 0x7fe6, 0x75cf, 0x5c6e, 0x370d, 0x0a87, + 0xdca4, 0xb357, 0x93fe, 0x82a9, 0x8199, 0x90f1, 0xaeb4, 0xd703, + 0x04a4, 0x31ab, 0x5840, 0x7361, 0x7f88, 0x7b21, 0x66bf, 0x4507, + 0x1a59, 0xec41, 0xc0b7, 0x9d65, 0x86df, 0x8012, 0x89e0, 0xa303, + 0xc838, 0xf4aa, 0x2294, 0x4c02, 0x6b92, 0x7d2c, 0x7e87, 0x6f75, + 0x51ec, 0x29c1, 0xfc2c, 0xcf14, 0xa856, 0x8cfa, 0x808b, 0x84a7, + 0x98c6, 0xba4b, 0xe4dc, 0x12f2, 0x3e94, 0x6216, 0x78dd, 0x7ff4, + 0x766f, 0x5d8b, 0x3883, 0x0c25, 0xde34, 0xb4a6, 0x94df, 0x8300, + 0x815a, 0x9025, 0xad74, 0xd57b, 0x0305, 0x302c, 0x5712, 0x72ab, + 0x7f62, 0x7b90, 0x67b4, 0x4663, 0x1bef, 0xeddb, 0xc222, 0x9e70, + 0x8768, 0x8007, 0x8943, 0xa1e8, 0xc6c3, 0xf30c, 0x2103, 0x4ab2, + 0x6aaf, 0x7cd3, 0x7ec3, 0x703f, 0x532a, 0x2b49, 0xfdcb, 0xd095, + 0xa987, 0x8db2, 0x80b3, 0x843b, 0x97d2, 0xb8f0, 0xe347, 0x1157, + 0x3d28, 0x6109, 0x7852, 0x7ffc, 0x770a, 0x5ea5, 0x39f7, 0x0dc2, + 0xdfc6, 0xb5f7, 0x95c4, 0x835c, 0x8121, 0x8f5d, 0xac39, 0xd3f4, + 0x0165, 0x2eaa, 0x55df, 0x71f0, 0x7f36, 0x7bfa, 0x68a6, 0x47bd, + 0x1d84, 0xef77, 0xc38f, 0x9f7f, 0x87f6, 0x8001, 0x88aa, 0xa0d0, + 0xc551, 0xf16f, 0x1f71, 0x495f, 0x69c7, 0x7c74, 0x7efa, 0x7105, + 0x5464, 0x2ccf, 0xff6a, 0xd218, 0xaabb, 0x8e6f, 0x80e1, 0x83d3, + 0x96e3, 0xb798, 0xe1b2, 0x0fbb, 0x3bba, 0x5ff8, 0x77c1, 0x7fff, + 0x77a0, 0x5fbb, 0x3b68, 0x0f5f, 0xe158, 0xb74b, 0x96ae, 0x83bd, + 0x80ec, 0x8e9a, 0xab00, 0xd26f, 0xffc7, 0x2d26, 0x54aa, 0x7130, + 0x7f06, 0x7c5e, 0x6993, 0x4913, 0x1f17, 0xf113, 0xc4fe, 0xa092, + 0x8889, 0x8001, 0x8816, 0x9fbc, 0xc3e1, 0xefd3, 0x1dde, 0x4809, + 0x68db, 0x7c11, 0x7f2c, 0x71c5, 0x559b, 0x2e53, 0x0109, 0xd39d, + 0xabf3, 0x8f31, 0x8115, 0x8371, 0x95f8, 0xb643, 0xe01f, 0x0e1e, + 0x3a49, 0x5ee3, 0x772c, 0x7ffd, 0x7832, 0x60cc, 0x3cd6, 0x10fb, + 0xe2ec, 0xb8a3, 0x979d, 0x8423, 0x80bd, 0x8ddc, 0xa9cb, 0xd0eb, + 0xfe28, 0x2ba0, 0x5370, 0x706c, 0x7ed0, 0x7cbe, 0x6a7b, 0x4a67, + 0x20aa, 0xf2b0, 0xc670, 0xa1a9, 0x8920, 0x8006, 0x8787, 0x9eac, + 0xc273, 0xee37, 0x1c49, 0x46b0, 0x67eb, 0x7ba8, 0x7f58, 0x7281, + 0x56ce, 0x2fd6, 0x02a8, 0xd523, 0xad2e, 0x8ff8, 0x814d, 0x8314, + 0x9512, 0xb4f1, 0xde8e, 0x0c81, 0x38d6, 0x5dca, 0x7692, 0x7ff6, + 0x78be, 0x61da, 0x3e43, 0x1296, 0xe481, 0xb9fd, 0x988f, 0x848e, + 0x8093, 0x8d22, 0xa89a, 0xcf6a, 0xfc88, 0x2a19, 0x5234, 0x6fa3, + 0x7e95, 0x7d19, 0x6b60, 0x4bb7, 0x223b, 0xf44e, 0xc7e4, 0xa2c3, + 0x89bd, 0x8010, 0x86fe, 0x9da0, 0xc108, 0xec9c, 0x1ab4, 0x4555 +}; + +float32_t transform_fft_f32_inputs[TRANSFORM_MAX_FFT_LEN * 2] = +{ + 43.0264275639, -17.0525215570, -94.8488973910, -8.1924989580, 7.2830326091, 66.8368719314, 33.9778190671, 117.8652289772, + -129.6077797465, -14.6420815368, 18.0239223278, 20.6760530292, 55.0375037651, 1.8674609862, -85.6534302408, -33.5750364909, + 29.2110949614, 110.4727049460, -94.1914619387, -1.4084169343, 83.5181653041, 47.3073514127, -13.3420621181, 30.3389699104, + 12.1188124277, 100.9730921941, -114.0146362390, -77.5823200409, 37.2019034618, 40.0026301128, -58.3387276630, -34.9472398600, + -5.1169678311, -87.7660091118, -150.5888601131, 56.0349370503, 50.2168884079, -74.2313236767, 22.3648603560, -6.8676387051, + 74.8957303680, -90.1292012823, -55.1436241586, -66.6732976100, -6.7918147615, 7.7612697081, 35.7892605979, -20.0470508830, + 41.8369017546, -143.7378056984, -41.9127158600, -108.3531841158, -57.1917422289, -124.2808828105, 38.9316388820, -77.9212517405, + 37.1990818377, -28.9545952748, -155.6371057564, 45.8088886393, 36.2537018275, -6.5727656016, -104.2070491921, 45.5583813729, + -19.7674717059, -80.4802190947, -1.4444563441, -42.2142256438, 36.6546339194, -57.0866498590, 44.4677067511, 65.7285753407, + -103.8158864647, 25.4348723711, -153.5419639389, 39.3608409474, 49.1658103436, 79.5570602275, 75.2944095996, 58.9394700746, + -53.1018534392, 33.4172444014, 35.6224682287, -64.4353396418, -125.8464291251, -47.6072111617, -26.2177687594, -12.0061322096, + -17.7887967585, -28.2926175090, -62.0691715749, 40.5098573604, -191.1123732593, 119.6750713043, 19.6182375803, -26.7615252921, + 2.2957847015, -108.3436451287, -50.5906164995, -5.6360985100, -11.6772204201, -84.2765293757, -60.9317810068, 82.0446350218, + -70.2048296348, 72.8738253222, 60.2450218115, 114.2741231228, 46.8180775285, 6.9915412654, -8.9909197429, -78.9165936808, + 66.4731535459, -68.4235455651, -79.8254597080, -10.6308477115, -62.6161569330, -55.7744410292, -11.8408366528, 98.1034940997, + 35.8213741877, -54.4694482732, 86.9631830044, -53.0343838122, -47.4898642865, -47.2010929590, -31.3312639685, -23.0908245172, + 12.0258009869, -5.1098204703, -9.8420230737, -107.3328761158, 44.6810431959, -17.9083820345, -60.9753512872, -7.5915088994, + 17.2250813329, 57.9176125648, 124.3004161362, -63.1950908493, 120.5788885640, -44.1734238117, -91.7408095116, -43.5696066595, + -49.9560710099, -167.8513443296, -70.9437505499, -46.4109705355, -64.2264526456, -13.9995803916, -100.9548186356, 9.9101010575, + -50.0615130815, -55.7590145012, -60.3195153388, 61.7913378549, -102.0850899209, 53.2360193126, -25.8997883369, 75.1445512333, + -113.8148602310, 17.8027281119, -19.5006822722, -44.2169628471, 107.5017084384, -113.7909124666, -43.9735396033, 7.6880981388, + 46.7384653508, 9.9047443751, 81.8646964362, 132.3812863877, -95.6959050236, -68.5015813484, 65.8586404494, 18.5039353889, + -30.1786166621, -90.3098515667, -22.9356228552, -20.5778272423, -2.2127786675, -35.4418447703, -51.8722915974, -107.9024439078, + -51.5940748232, -51.7463262677, 74.2795485984, 94.2205022462, 9.7016384049, -47.3556083155, -36.7822314478, -151.6455525363, + -15.7183814485, 78.2063383182, 0.1516414969, 37.9304181609, 20.6185902740, -22.2164106778, 6.1160554677, 2.4061326953, + -111.6681824598, -60.0858917090, 75.1698614693, -76.5787410444, 28.3391655715, -2.4946186443, -68.0378899682, 104.0893199171, + -51.8319647254, 38.8521710524, 75.9114239564, 73.9206172905, -103.2533029987, 6.9002718274, -36.6346436319, -25.1990926265, + 1.5852145953, -50.6438436795, 21.5018844428, -151.9305562846, -51.7326681814, 21.4475994143, 42.2564011921, -74.0520586926, + 49.7370635809, -13.2957534126, 36.6746826778, -31.7005492589, 148.4894964268, 79.7890632353, 16.8856024809, 16.1690460177, + 39.2665169484, 117.2461167794, -37.4827984831, -47.8387803604, -95.7025286193, 34.3058214285, -124.9536456028, 56.1640195764, + 94.3636873606, 35.3992852810, -38.3920852159, -100.5738062016, -29.7837022314, 42.9133913996, -34.2715618187, -14.3589115627, + -16.5935468750, 20.4574192236, -88.7897972666, -38.6285080386, 53.3203422726, 98.5991486746, 122.7305462474, 67.7902817187, + 5.1764117389, 5.0632821624, 21.9288789574, -78.3140512638, -21.2069682335, 23.6342010925, 34.4445769455, 59.1346766615, + 28.9978778000, 39.8121180845, -17.1650033520, -56.9174900874, 17.8157086148, -112.8801457350, -122.4019040408, 140.8669393157, + -65.4664329639, 40.6952775518, 32.7260891658, -43.2565155866, 19.3945751928, -20.1815002000, -67.6601711640, -18.1921178207, + -35.6802153684, 49.9550290306, 131.4925251016, -31.2940938167, -5.2848453344, -109.5580577933, 20.2437599390, -8.8782958734, + 54.1836717264, 7.2555852190, -3.5698316137, -51.9236786262, 6.7861547980, -104.4814551670, 45.8458629668, 70.0890876844, + 38.3572837740, 61.8024165129, 68.0176962024, -12.8193934080, -21.4661610917, -0.9377108815, -74.2100679061, 71.0490808147, + 91.9813889497, -14.5797640164, 3.5036749129, -138.3605478356, -48.1501349794, -16.0636922482, -12.1334197606, 15.0562207637, + -34.0878176054, 55.1075126157, 97.3829871877, 0.2053358099, -94.8713267382, 51.5460954054, 21.2966946363, 58.1331025047, + -23.4599044132, -19.3315856528, -8.4497193577, -1.9594679356, -33.1906549336, -144.6825417978, -57.1218958072, 35.7353406097, + 61.4666549819, 14.6536253128, 82.1632196866, -44.6230161723, -91.1022589278, -18.5737673927, -136.8975612334, 56.9606788003, + 70.7059960183, -68.2829345081, -10.2629800455, -53.6385325047, -68.7928766204, 88.2444688302, 83.1412324801, -102.9206928160, + -68.2329763159, -69.7552955469, 108.2132269009, -28.2582329307, 5.6685898328, -36.0392956840, 43.3269513128, -8.6436416796, + -16.5054886972, 11.5008791788, 39.6923606683, -28.9039554061, 13.5938214364, -23.6296332202, 49.1171161163, 53.1636857935, + -62.9672053166, -54.2594757384, 48.3838956696, 8.0469071555, -33.6472086213, -120.5381752144, 55.0880453111, 17.8990740563, + 144.9402232336, 101.7886229203, -73.3666393712, -16.4721379138, -12.7447935685, 101.8245160983, -49.7026860415, -15.1227790364, + 65.7430288442, -131.8695390036, 10.2750933946, 90.9752774838, -26.5859990591, -95.6962772568, 76.2174589344, 24.8796848060, + -38.8938223046, 54.1687774852, -37.3585968996, -34.6848570502, 33.0151011570, -55.8345877671, -3.9009101671, -31.5024971691, + -9.6863895491, 91.8719195957, -58.9993249744, -25.6887030614, -8.0829472205, 4.6386491741, -71.4019697167, -21.3734669095, + 86.2079144404, 79.6823974266, -0.0910915997, 44.8067718095, 58.7204020766, 72.6856808976, -50.3373732478, -116.1175365534, + -15.0884909384, 5.4593772059, -63.6553527905, 37.3460388205, -32.2399421679, 95.7569350513, -7.3700141964, -56.0370832967, + -41.7377150439, -42.0042856519, 12.5134312941, 93.7845584531, -32.4801087157, -33.3976050318, -24.2252126001, -46.3199064467, + -20.3704610276, 15.8571376404, 88.9127217235, -33.1132582267, -1.0005675836, -28.1780471904, 150.9349379135, 38.0600520828, + 36.4338677563, -3.3709201641, 29.7709773016, 16.5064119077, 21.3147729463, 110.6714300904, 18.8406036507, 14.8963298097, + 50.9975960392, 16.3991140350, -194.0805845907, -41.6723945839, -74.8991127408, -6.4587655805, -0.6883628218, -49.8709647175, + 194.2265120473, 64.3043624521, 16.0040882780, 68.4032551772, -43.4050313128, 84.6826289824, -28.1357565943, 134.6895584120, + -7.9746152680, -95.6692886462, -48.9444370342, 79.4479343188, -50.5345228122, 52.4800633307, -14.7735051703, -20.1510237050, + 22.5049816980, 64.4191999102, 24.8385648232, 99.4265041360, 62.0189508473, -28.3892600378, -109.8842008564, -79.0407483407, + 18.3408112020, 49.1650536089, 31.5419844924, -36.1160722679, -132.9148081329, 10.4053531567, -129.2463715470, -43.4602207151, + -24.2420653292, 91.5388317556, 21.4762248190, -44.3810909139, 18.4098011282, -45.8691164539, -20.9831197962, 16.2076792914, + 66.0224147666, -13.6794615513, 101.2163279622, -62.4462618603, 22.2040981785, -52.3208382802, -24.7909079016, 58.5150375093, + 18.8569705105, -55.6083430939, 131.0273367422, -34.5209015065, 121.4357296573, -77.2590299593, -51.5929566898, 5.0247131098, + -23.8451707592, -4.5912313547, 31.1387246821, 61.7019310824, 49.1912429744, -50.5836913031, -74.8182600630, -21.6209317022, + 20.9409464654, -72.7870824583, -28.3530746820, -45.0794425434, -13.4910629905, -62.0158772255, -34.1421181246, 44.2844972784, + 8.4213193211, 79.9349022793, 60.0160502260, 32.2272994080, -72.2893887746, 17.3063698247, -134.6335742431, 64.6499736261, + 7.1411921919, -37.5517577873, 6.2405670930, 117.1920927305, 128.7420689815, -3.1556854963, -13.4100422909, -11.9336372907, + -8.6022400553, -102.0033506666, -78.4696575074, 15.0765861403, -111.5219718576, -13.4162786508, 38.2437013694, 61.1637732561, + -34.4804160003, 107.4438003830, -79.4193067813, -81.1842853968, -26.2622970331, 132.3205425408, -119.1464268477, 67.3048866598, + 103.3266736715, -58.1865815617, 27.6231908601, -11.2004371750, 26.0340617206, 12.5696123916, 0.6442714420, -30.7393043544, + 1.5314955897, 49.9110088250, -106.1358721920, 51.1608329944, -32.8684239794, -27.7215905745, -11.6450303367, -36.7731678028, + 59.9383486599, -4.6301990580, 5.0361682939, -10.5669407980, 124.0908762205, 35.8305364082, -123.6216777114, -74.2569079167, + -56.7651776816, 16.0736385582, 23.5030632215, -110.6764295938, 44.3086821806, 9.4452708243, 5.3300080251, 39.0483916714, + 151.4550562868, 62.8957092621, -116.8103461233, 5.1129927759, -33.2252515135, -9.4522506046, 22.7026048372, -15.5264414569, + 71.2087620034, 19.1191568332, 50.3019546809, -5.6096922409, 22.9344126462, -7.7591876203, 31.8949515564, -58.4253952381, + 66.4341297173, -19.0583083044, 96.7695087855, 20.4934280047, 4.9544603116, -20.8288135920, -173.2659655408, -62.4883621640, + -48.5528422703, 12.1437504278, 60.2482234666, -19.6072312919, -34.6320214291, 129.0089698963, -50.9042160618, 98.3952661477, + -4.7051792479, -13.1768910826, 69.5138802139, 58.5748201565, -45.9385652563, 151.7952104306, 34.2541941013, -58.0417838381, + 28.1480473670, 46.4006562684, 97.7001828545, 4.0855607626, -32.6097018162, 16.8913949959, 105.7266202978, -89.3978374651, + -60.9338593128, -41.2220734230, 49.9393070783, 95.0974764854, 49.2498366456, 58.6214364590, 34.1113830569, 45.6634098874, + -22.5356086770, -97.1978653617, 86.5565049535, 70.6118545777, -30.6978082909, 118.7238621666, 14.5922386932, 11.3449652072, + 65.6007783405, 82.6369678204, -52.0390492248, -47.0160551227, -95.5142448634, 99.7162626888, -36.5523815090, -42.8042935534, + 68.3566199798, -13.8451547552, -71.1629911780, 36.2989433752, -32.4867163365, 112.4079947071, -75.6295117422, 47.5276421639, + 51.8078250755, -26.8715188457, -9.6291144797, 40.1999849640, -38.4634033246, 40.9764960915, -26.1715730268, 36.5996396515, + -26.9924731886, 53.7879986570, -83.1658398348, 23.6381378489, 43.8794937753, -55.4133836419, 90.0266130838, 14.1036181982, + -18.1225736715, 85.1363181151, -62.5970846379, -18.5291947838, -25.7341986703, -49.7061342931, -59.0442763971, 50.8960636803, + -87.6471123430, -36.7217762531, 22.5952364054, 11.1107885650, -0.5377327229, 160.8145792630, 73.3103441505, 10.1656872354, + -50.4554350397, -57.3478171016, -15.4201715357, -26.9135446491, -4.9891264771, -37.0226770057, -80.9919535641, 50.4418660876, + -25.8517575250, -69.9538258421, -17.5730160671, 15.9405836751, 113.9545230349, -46.1040379057, -94.2458635014, -69.0338522452, + 43.5813790265, 107.1836101171, -55.1012654323, -77.1529555887, -33.1530320656, -94.5582659641, -53.6837586872, 27.0680381378, + 93.9385415207, -61.0955216188, 18.0530957225, 7.9150142320, -12.1218191587, 34.0173961457, 40.0084937565, 9.8119275580, + 44.2065861274, -1.8718514394, 67.4740024215, 46.7391150131, 207.2404815875, 45.1635364462, 43.3580102761, -44.0244218674, + 83.2387206007, -8.6441851856, 12.3993902588, -22.5091685270, -19.8332981376, 97.9196509289, -76.6720306234, 28.9740705859, + 121.9415248016, 9.6656982611, -51.0996453694, 37.3704374740, 74.7589840907, -113.4066752631, 120.0029566342, -105.3786221360, + 81.8152755619, -13.4979932982, -21.4680758393, -85.1088235539, -65.3610798409, -35.0444139470, -48.0220794487, -41.6210317362, + 33.1212995259, -82.1480936443, -10.5479715135, 76.4601917004, 42.1983651157, 92.6104239912, -42.3536237955, -24.5644182272, + 30.4446637772, -90.2899420489, 63.6723540422, 103.0895811428, 64.1706769263, -10.7069812309, 21.8927240409, 6.3571071738, + 57.1457649358, -52.9866276448, 66.0981829072, -29.5372056881, -79.2252039810, -136.2440652798, -57.0106422562, 86.8203548141, + 66.4244149837, 53.3230426111, -66.1283059222, -131.0402660353, 8.0548411081, 122.9088988100, 1.2626894208, -60.5059112373, + -68.8707203082, -6.4747987200, 85.8411327244, 99.9624156733, 90.4197864338, -35.9630441182, -22.9158275507, -17.3660128776, + 16.7845345761, 34.7219749782, -39.3513765878, 1.0460702756, -60.9494500182, 20.0900333387, -85.9636743832, 88.4400782168, + 15.0729628728, 61.5499846243, 11.8579871757, 107.8617581581, -42.9393027864, -62.8422307621, -19.0589600542, 4.0750325807, + -36.0651825425, 55.7638724501, -10.4691736080, -55.5672537178, -61.2061519915, -21.1885348576, -131.2535612498, 24.7463552676, + 22.9426321237, 14.3038202264, -138.0926317438, -59.0892900856, -162.5416439986, 7.1307658250, -141.1236672256, -4.7173618068, + -16.7741532807, -68.2615451173, -2.6608701102, 84.1978109826, -11.3446202072, 59.9630033088, -1.8994925010, -37.9301641959, + -119.4435600954, -11.4587491646, 12.2423215240, -7.3169898616, -67.0373621128, 36.0198843055, 53.9791315249, -134.5885680695, + -83.8330811965, -16.6714816463, -8.8498552035, -24.0513088196, -22.9444328877, -37.7961441531, 25.1975736186, -136.1611637464, + -5.0843464033, -10.3939554694, 20.7422826935, 75.6854136623, 46.4179626736, -57.0052830175, 7.3457235521, -51.5504447254, + -158.4375751701, -200.2426967181, -48.1234996261, 1.6623945527, 21.1746524375, 99.4092980367, -2.3206772903, 45.7989166757, + 2.0181548348, -88.0556010969, -59.1527212096, 47.3607925077, -10.4181140309, 56.3558125650, -8.9799125560, -30.0376711812, + -36.7132904688, 35.7785050392, -13.0763909369, -2.1855594714, 18.1550954005, -28.6711803575, -55.4495172398, -2.8812973198, + -59.9575059158, 40.0588875786, 57.4713686602, -3.2835144853, -36.7193552111, -64.9415131516, -166.9555466445, -23.5556853844, + -54.9408569587, -35.2310451959, 21.3345143458, 65.7590671151, 51.2214538168, 46.1271939944, -42.2235267919, 127.2329928299, + 105.2391778600, 17.6726845966, -129.9021148044, 8.7065613044, -94.0987112511, -3.5375742950, -23.1385452379, 60.6219530633, + 92.5445564235, 48.5111974469, -52.5699309159, -60.0634811685, 25.9034368684, 140.0249495491, 1.5918852392, 38.0266038291, + 17.5588710703, 3.4294066089, -27.6748782173, 59.6182974489, -35.2924781853, -38.6198576115, -13.6119803198, 7.8375587489, + 22.7250686519, -28.3524510951, -34.4269062817, 22.6464817325, -61.6528147860, -5.9782002429, 61.4730771294, 43.5582379527, + 55.6862408270, 87.8745651631, 46.3401042715, -19.8780979663, 74.1272633369, 29.8590452377, -12.8665765140, 34.2931401219, + 53.9279617551, -16.9017895140, -70.1527553166, -79.6367897992, 109.3728271017, -129.2214826835, -53.4644539730, -51.5654458993, + 17.6062148433, 3.5090251835, 74.2615941204, -109.3431097845, 40.1403465151, 28.8714561280, 94.0868659302, -19.0047033845, + -60.0967410050, -19.0998457619, -67.2027075128, 72.0711434846, -17.8737851232, 123.7050551274, 132.6331504104, 25.5018761009, + -36.7817189239, -29.1580893235, -6.5848563828, 90.2868948516, -35.7017258498, -68.5675432955, -52.4888589786, 47.1377730021, + -7.4546621940, -52.0657517138, -49.0404829633, -114.6910280126, -117.6819819437, -32.7856729408, 31.8232065591, 12.1192973039, + 35.2678513420, -1.0336778293, 30.7021249679, 127.0442906046, -84.8457819393, 28.9862843096, -47.3524701726, -126.1094998460, + -2.9700276582, -2.4956545870, -53.8624121141, -85.2114117637, 76.9057985618, 137.1205201755, -19.0830817212, 14.3407526579, + -56.5921994449, -25.6084873186, -44.9470801106, -133.3139496090, 0.3487447576, 33.4499716730, 34.7126257844, -9.3307383323, + 27.2996276947, 10.8765676134, -91.1032360444, -90.9584216222, 1.6981490570, 96.8557438791, 56.7726390913, -44.3246449237, + 52.3260643361, 21.5551140465, 27.4535327381, 2.0072717479, 7.4823125629, 77.1185863870, 16.1372262663, -10.7206012957, + 66.8830091413, 49.3523828287, 54.0855375598, 30.8570349345, -10.9255375390, 62.3910624674, 30.9238561381, 0.3352881853, + 72.1022806197, -28.8319885008, 23.3335288806, 46.8999035980, -67.0984424822, -164.7917209112, 42.5767681360, -92.4668227688, + 43.8491734282, -17.1126540408, 37.4819594334, 69.0774409673, -39.3530526854, -14.0693747124, -60.2520781215, -80.3860105519, + 32.6689956840, 15.3393042576, -18.5529761307, 97.3942151573, -4.4462855745, 13.7614349817, 158.3358780719, -44.7258299667, + -17.7741912819, 116.5136962268, -33.6261057820, 22.8344441288, -155.1423976144, 5.7070117893, -22.7906543902, -45.0633909283, + -13.9329987929, -66.0848932507, 1.1383038109, 123.8386958483, 67.6662401589, 45.9152963554, -27.4397697462, 97.9596747354, + -6.3544655181, 29.0832146722, 96.3468162499, 32.4535976137, -91.0650399301, 2.7293262791, 70.7853483111, -92.3655274571, + 69.0359217256, 83.1530567979, 35.8375091111, 7.3393552348, -95.1770165365, 76.4905790891, 55.6253140577, -29.5315327050, + -19.6571455162, -65.5631159968, -16.1022064890, 105.8715375468, -51.8381429466, 120.1887801783, -12.7792505862, 45.9625293061, + 5.2249771246, -44.2522411781, -49.9151046218, 58.9294840166, -39.5237729290, 7.7590557538, -36.9036719322, -13.3726971638, + 54.3809777660, 71.3070336679, -51.0631236639, -10.0694214486, 15.9743446435, -49.4179644909, 118.7626471706, -53.3128484840, + 13.5615377463, -109.8892656203, -42.4445411536, -66.3623671033, -14.8179688320, 76.6614429072, 11.1173310385, -44.0756061917, + -31.6081137549, -112.6622817309, 32.5091400724, 33.0802101919, -57.4339078738, 56.3466203876, -17.0577340891, -95.3692048341, + -67.3434566840, 13.8207460717, 48.9375767823, 7.9881518802, -33.7163627475, 38.5685408163, 12.1465400224, -107.6320581108, + 4.0618423016, -78.4521092994, -86.1605081811, 76.0528521785, -7.4505556232, -32.6671595550, 28.1668313458, -44.3982773094, + -17.6420279051, -31.0505367972, 21.8444018590, 29.2596019459, -15.0890859227, -13.1393295693, 2.8101074170, -17.7888538827, + 32.0378687652, -74.5375953900, 135.2497294704, -28.0677270675, 73.5721900551, -66.6873287357, -25.1872324027, 66.2043845748, + -94.9847220021, 51.0053667797, 125.6199200698, -97.2966230203, -100.0987757765, 38.7851883798, 20.5509402780, 91.2789361356, + -23.6347319001, 53.4814037964, -27.8226699628, -4.2998301656, -49.0060086613, 57.7107938724, 73.8228091191, 39.2104809606, + -27.3049570759, 78.3558930717, -39.1465109393, -59.6714099634, -71.7254332281, 44.0304489875, 62.4610534699, -47.5531388302, + 62.3692165629, 6.4426089142, 9.0422858718, 23.1735394482, -47.2878667545, 44.2020612249, 109.3032846597, 11.6805260558, + -30.4758154602, -82.4704834090, 38.6561095453, -55.4482370852, 8.5232602822, 133.2611664825, 100.1432731096, 22.9595423699, + -100.1659221126, 38.8223174175, 27.7691674207, 126.7418939874, -91.4494781699, 141.2081002115, 39.0632821221, 63.2623914663, + -30.0221078403, -33.5477169622, 29.1082028625, -3.3848571660, 61.5724672364, -34.9602677014, 110.9349405045, 102.6143795477, + -57.9940910047, -35.2709261901, 16.7143230992, -40.5324218543, 53.9355486697, -64.2634715959, -54.9387762268, -42.9168088882, + -57.5562950128, 37.9068250889, -12.1446003699, -60.1702164080, -20.6508515440, -98.5324628329, 101.4072369572, 129.5400369054, + -81.3566359702, 50.6071670655, -120.4768679404, -42.4978466545, -8.7364843153, 49.6150365421, 122.5389217747, -17.0756316445, + -62.3577228096, -45.0934187476, -32.0622747717, -30.5522096168, 28.4509994932, -38.2485520772, -50.1501458954, 33.6999850082, + -53.8053116265, 5.7733509059, -34.6589594313, 126.1617129527, 20.7567771895, 172.0372861812, 89.0892733767, 100.7503861649, + 7.3378103261, 98.5906415363, 32.0129761463, -41.8886119031, 41.2269067119, 68.3876187817, 138.4871996142, 11.3975797943, + 77.7316432733, -158.5764699010, -73.0154932162, 4.7811847147, -23.2377092445, -15.8949240362, -11.9056513173, -152.0900719578, + 18.2632385344, -54.1998869586, -181.7000796389, 48.1068217262, -32.5550981417, -28.0507229974, -31.8419308387, -25.6072993087, + 19.9544408703, 9.3745877673, -83.7112773954, 69.9469812476, 103.7806121094, 7.5661034347, 19.3961679774, -33.6734450687, + 145.2662801261, 84.6823084936, 3.8883005529, 16.9248666945, -16.9581909221, -89.4228081883, 16.2888634344, 11.1954888184, + 2.5472628157, 18.3389344143, -151.4283735338, -34.4147990116, -25.9480238152, -25.5347276158, -64.8106533195, 50.6575131879, + -7.3028646826, -32.2126924117, 18.1267061221, -16.2075818210, -45.6339941841, -33.6697120217, 49.2624187554, 77.8687058107, + 73.6069588809, -40.8028084671, 18.9768190808, -30.7579639537, 42.1813346527, -83.5367163130, -107.9332971302, 7.6029737222, + 26.9032374575, 49.3843590700, -46.3813865337, 9.1625140590, -66.2444573706, -81.6335790942, 38.1352819102, -26.9099106066, + -73.7453409821, 120.4931605467, 10.3564307049, -106.6178964489, 95.7043175624, 33.5246942332, 47.6828732088, 88.3229069791, + -15.5217019654, -19.5431169450, -3.8342503054, 57.2251891575, -48.5444916144, 71.5434047188, 12.4489765266, -11.7576981068, + -55.3127919285, 17.8351394582, -103.4011502717, -4.0445991564, 15.2952711643, 136.5345440142, -63.7492382166, 36.9305043452, + -1.5952862211, 16.2532277000, -8.2697982122, 59.2373828733, -114.7747262875, -10.3140845306, -30.5291082162, -109.5521180147, + 0.0880047356, -26.2704646488, -5.8324862328, 51.9555476050, 179.0193630333, 35.7565163112, -25.6830342083, -38.6240101524, + 7.1156497155, -38.9184661158, -44.0206559654, -61.9671745846, 49.0909411685, 30.5438751442, 61.5412933030, -24.2114612829, + 5.7471838440, -18.0880708776, 71.7203646740, 86.4088528992, -58.7737324960, -57.5055785792, -95.3936802143, 116.1138906258, + 60.1792035622, 56.3771096083, 49.7396983038, 38.3766351111, 69.8500772704, -49.1498577356, 70.3558567877, 8.6780858427, + 34.1723731409, 15.4734742852, 109.0630331552, -121.1548202826, -48.3994829024, 30.5337026074, 24.7828521521, 42.0584760304, + 75.1343090013, 129.5812051166, 48.4270407054, 26.4055953415, 14.0152471956, -95.9222273011, 90.6485095604, -14.3202487407, + -67.2852187582, -166.6666517028, 40.3833373200, -36.1005828038, 95.8066175560, -35.7716615894, -49.1292761932, -129.7066955214, + 103.7802140124, 1.3540192035, -11.7154031368, -33.6798122030, 38.8567068892, -13.4661723261, 27.7129532179, 11.5232210014, + 23.1346883982, -31.8376649712, 43.7429902892, -6.7521035668, 9.2376550661, 49.7442294743, -11.0442544230, 86.0728321584, + 83.9184836462, -16.1275908347, -18.4328902788, 29.0599791766, -119.8140170048, 6.1015865800, 8.3430418870, -26.4676140800, + -54.4170405827, 65.9500246661, -68.2589172652, -67.8087618276, -32.2785464329, 15.5784741177, -40.7911512889, -30.4549351749, + 65.3973162901, -88.7812378733, -100.7984347025, 33.8660362781, -29.6824618124, 43.1980425632, 28.3570049344, -53.0517620662, + 77.8517167497, -197.3149986900, 39.9412966213, 64.7267960844, 9.0985185643, -48.2516330353, -25.2702193655, 43.5324967389, + 25.2174278973, -143.4955124244, 97.6996202090, -6.8156183641, -24.7105412789, -82.1407130477, -84.2647074618, -31.8474816146, + -18.8364319750, -39.5505715225, -54.5495977905, 17.7158231401, -3.7065472234, 57.0344653317, -88.5539921734, 19.3061972587, + -71.7736386745, -41.9757523004, 44.0839025453, 93.6350283513, 23.9985071911, -82.1811236502, -109.4369907962, 63.5407415232, + 8.4092298502, 28.4295805746, 18.6411321700, -5.3460515491, -67.8392754185, 38.2413165851, -48.3890309482, -84.8999016731, + -96.8897430524, -108.9709380233, 12.6763008215, 0.6495692893, 42.5729352890, -45.4201114101, 178.6503517211, 32.3364256219, + -0.5018953239, 85.4524577539, 31.3821199920, -77.2752461536, -22.5276539124, -73.5513316548, 39.4443099153, -85.5453904099, + -92.8231923388, -40.3971881753, -58.4187011919, 43.8859268482, 8.6368900854, 36.7106300359, 46.0279473438, 98.0046308108, + 141.8908992398, 99.5148913015, -117.8125705364, -39.1830583755, -7.7274169732, -48.2601982254, 62.7987036515, -214.3028855312, + -63.1561162569, -16.8220689219, 25.8725009221, 122.4301600524, -14.0054049372, 34.6312211243, -80.1152116439, 19.5089176613, + -55.4531957952, 50.2925094566, -34.9023849044, 96.5932330242, -23.3903984041, 18.8379347047, -142.5109851060, -26.3638740038, + -45.2635268905, 10.4556800933, -67.2064627051, -82.5693793971, -61.2994401437, -60.8623342608, -49.5256808732, -67.5095279686, + 109.7221898389, 30.3565964773, -3.9295411009, -13.3243471006, 31.5325109517, -42.7881917663, -62.3012601651, 12.8902122674, + -72.4707062966, -1.1385459373, 31.9714183017, 25.4392014670, 5.2034169158, 7.4078411122, 3.9210252522, 5.6054243531, + -13.9283618935, 62.6605467523, 106.2229553720, -108.0346097164, 45.8846468124, 63.6694544818, -10.1426865266, -101.2125032732, + 84.7788854892, -74.9877442652, -90.4102888654, 82.3491489235, 13.4299871406, 8.6923780794, 21.7402751068, 1.3078400943, + -5.3323741070, -40.3811284623, -2.8868770078, 160.0268532699, -25.4997503943, -89.7351898498, 47.6695601274, 134.7207474765, + -28.8772848263, 43.7271906311, 7.3228230169, -96.1850462320, 35.8869106751, -11.4777855539, -25.7781856921, 48.9895273966, + 13.8032764481, 14.5942766183, 5.8336013315, 87.6897796695, -13.6765032835, 3.3883927453, -158.3668079137, 42.2382326860, + 21.2461344076, 15.6945936663, 9.6604677279, -9.5678778930, 123.3597739656, 22.1167117074, -74.9824011460, -95.9807585582, + 63.4915942695, 94.2011376357, 9.1392063086, 11.0696792396, -61.7781744244, 32.4342673236, 47.9943613167, -144.1319767603, + -72.7895423040, -51.0997685900, -1.7995707656, -94.9206104086, 72.7211674226, 58.6708314320, -20.8389738301, -21.1038399946, + -16.3313082354, -9.9622712842, 25.1381713884, -43.3630408732, 95.4208180249, 4.9957713162, 139.7419301257, -78.8102530942, + 18.4468841849, -36.6529768792, 32.8656605850, -13.9061010905, 25.3836067009, 29.3018838146, -3.3243716283, 19.1868542168, + -24.3576227747, 35.5704128749, 9.7305659636, -28.0698496733, 80.9991737110, 44.1711909705, 67.2428623477, -51.3139105230, + -84.1430177559, 48.3068887430, 9.0115749848, 14.7342922983, 69.3129475126, 15.3916339055, 19.1526114590, -36.2384578425, + 36.3072041758, -2.7831098993, -79.5517384898, 2.4496975564, 14.7441805304, 168.3353222077, 6.4042017907, -94.1108499663, + -96.4470728057, 93.2974672034, -25.8910707915, -109.8714867373, 19.6739537972, -25.7283734173, -63.5666504767, -13.2751224909, + -6.8369303742, -44.9757631953, 59.5220216584, -36.6656623877, 100.4234528842, 39.7179675926, 100.4793677526, -86.2364278236, + -92.0288292261, -103.2337376347, 44.2981800782, 19.1367051770, 13.8984402872, 58.8220815831, -77.2361735490, -114.4879467592, + 89.1682762205, 51.2266997372, 81.3502982945, -21.5959593928, -11.6326571964, 8.8353642779, -12.3913359429, -23.1216638844, + 0.3575351650, -18.2903762351, 45.8302612836, 80.6428162262, 59.7892572555, 60.1876610526, -145.2533267974, 106.2800108239, + -18.1569484863, 78.3937893751, -85.6984739674, 25.2366777542, 61.5343531109, 140.8219730338, 47.9603484021, -66.9887369929, + -30.6392044667, 52.9963805955, 62.4415105078, -90.2869564132, -24.2283129464, -99.9584280390, -43.1587468514, 34.3760232029, + 89.0356907077, 22.0053768451, -53.9159785951, -25.1650972100, 8.0202661814, -53.6342885367, -7.1736148465, 109.3934027137, + 33.3102237776, -81.7593644113, -31.4758286552, 37.4778685110, -22.7494345710, 2.0108643659, 46.8251888594, 55.2739450714, + 25.5904497373, 80.2180417943, 60.0712983927, 5.1023725171, -55.3981506793, 92.0411889173, -151.8431761496, -17.8889138320, + 13.8369339480, -98.9537744078, -69.4129195296, -9.4399479020, -4.5486917569, 3.8311487140, 17.2656994939, -25.4507802631, + -42.3325354568, -16.6440745458, -133.8308014681, -25.5109360172, -23.1019754685, -113.2804091682, -14.3636580071, 87.9235056149, + 72.6206212879, -58.7137643393, 167.9006741193, 39.5232107063, -6.3630485808, 71.6621087431, -114.1539708322, 101.7815598753, + 27.2475470378, -54.1505303371, 30.1111783717, -11.9959488516, 19.4405070791, -108.4745463396, 71.0642431926, -19.8129431719, + -15.2954756654, 14.3561030921, -16.5356371988, 52.7783287094, 28.8939941206, -17.2842243626, -133.2248386977, -83.3404111930, + -7.0104157691, 22.1756809435, 3.2730114916, -32.2394014930, 20.3115837303, -17.1488805354, -42.1049764681, 64.9096377499, + 7.1989366097, -54.9327048635, 27.4112784568, 12.8647289850, -47.9584681630, 28.1940916618, -77.7181004478, -39.0254847210, + 14.6762624107, 32.0630508538, 73.0143676987, -22.1015540909, 41.9874345585, -2.8858853990, -88.0645760668, -90.5936909394, + -17.7732180284, 118.5661779332, -66.7797486036, 50.5937256974, -21.9300412969, 32.8513839567, 9.2389232325, 7.6133233529, + 11.4306872743, 86.1899246751, -14.8265560191, 14.3516516628, -81.0949021047, -14.0165322751, 6.4193008532, 91.1325356747, + 136.3161040384, -79.8056934391, 48.3720074062, 184.1908593323, -1.2350224948, 104.8017124353, -70.7660168596, 59.8117635799, + 38.9768188797, -92.6445519451, 38.4757633507, -43.8909508451, -68.7430495433, -33.5503051820, -45.7745564558, 23.1582292853, + -53.0556301244, -84.2076950671, -11.0754062672, 59.8325332450, 115.3577555552, 6.0322991520, -27.2020584628, -11.6601684536, + -19.6192551137, 63.6069935939, -90.5530529832, -65.9660360514, -17.4108821433, -32.2870508580, -18.8912458596, -13.0325547618, + 15.6951179243, 52.5832125410, -5.3522907337, -17.8679842370, -29.6421416058, 54.8215269985, -33.6000150970, -17.9637151319, + 38.7672649613, 15.9768537914, -36.5384968894, -25.8899064866, 143.3564174538, -16.7027387067, 112.4635318759, 60.9380860218, + -12.5989262156, 65.1545135722, 68.4448023234, -26.7853957961, 93.3277464713, 103.6052678753, -67.2083365675, 17.5708362440, + 54.8826954360, 18.1508430942, -39.3842844795, 37.1447880280, 57.6547054454, 9.2814912808, 108.2432242472, 32.8556189396, + 94.3226005359, 5.8586602054, -110.9028458371, -51.1302011664, -16.0219070131, -7.0598649579, -176.6996383318, -49.6407750992, + -66.9977026952, -89.9496950726, -53.1942620674, 34.9304683629, 30.7056949448, -64.8309845749, 73.0371656315, -13.2113288868, + -58.9585474923, -49.8700242642, -6.1582020634, -145.9633036671, 46.6807699026, -9.8057958623, 45.5962806826, 17.8413742472, + -45.1844288752, 51.6533061953, -18.3891326987, 86.2944939973, -88.4475541046, 109.7385814010, 80.2606871510, -6.8687112951, + -40.4305300274, -68.8038418728, 98.8182955892, 45.0578128678, -17.9270836619, -58.9964717416, 11.5983932225, 9.3557201268, + 40.2977049475, 138.6920714505, -107.0950700047, -8.5417944988, 76.5742734827, 99.7719961192, 33.2465872494, -130.9955599444, + -29.2255022084, 35.8580665719, 35.2949239487, 47.8913285775, -23.4340430256, -20.2468230117, -129.2315852983, -43.7204390811, + 18.6427890127, -14.5256762331, -114.5390628737, 83.3822028084, -3.5819486705, -30.4441161689, -112.7352247162, -109.1237973030, + -1.2881432609, 102.3673365896, -56.6529958750, -17.8832422128, -83.7875095740, 27.3286576586, 28.2690336934, 11.4666255287, + 52.7806502871, -32.3964403795, -11.7703336362, -26.4802375579, 1.4830249909, -46.7745447418, -179.0106845682, -46.4060214919, + 13.0495006806, -15.7093018033, -23.0652411102, -46.8891647861, -11.2767379154, 54.4284213870, 61.0257369233, 25.9537772478, + 32.1447676269, -55.7565993845, 16.1980837538, 39.7108201653, 57.5494093425, 25.4753658982, -82.6747317912, 32.8120846114, + 94.3963947400, 115.4928024657, -103.8033683890, 0.5505661357, 17.6017067223, 0.3340989298, 11.4554380855, 60.7715773549, + 47.6023333479, 8.7147095957, -12.4689201501, -38.3317139365, -70.8372336044, 19.8454635262, -32.5311981944, 16.6656528545, + -99.4051451760, 52.1836216170, -36.3751695538, -168.5804600081, -12.4503257083, 20.3254098853, -115.3933821008, 99.5221568068, + -65.3861194417, 28.8829913431, 180.5755173101, -52.4724526473, -17.6810674060, -36.4748431538, -0.5256538571, -55.6217233478, + -21.4129350702, -62.6552175024, 43.7806633668, 68.9822663027, -103.7310445758, 24.8680657731, -23.1804371879, -19.6865562980, + 86.1256756588, 43.1915528025, 64.5202069909, 11.9433963783, 59.3956955884, -136.0065807072, 54.2444425795, -28.2438980841, + 27.6881277816, 3.3966585075, -23.2714416081, 56.2708787997, -104.6936674005, -56.2472159428, -66.3373352615, -79.0727896373, + -19.4338276833, -81.4066241391, -7.2994007916, 104.0111560011, 19.2521825910, 39.6171092266, 8.3114594881, -18.6024599138, + -55.8404695603, 28.7502170881, -35.9621183078, -83.4040376758, 100.9786890719, 43.7353110787, 58.0923223162, 158.0571243490, + -89.5270222788, 35.7263973066, -85.7794526924, -44.9442606374, 52.4649663641, -16.2400821703, -137.0501146883, 33.4104950855, + -66.4055049018, 20.4444710408, -58.9392047771, 93.1083108145, 30.4506487034, 110.0306666973, 9.2409143811, -24.4812544449, + 74.6860947628, 40.3769192483, -16.9497053699, 14.5576684325, 52.3350907389, -25.2007169663, -125.4063020221, 62.8691359335, + 12.3811488011, -49.4397264264, -45.2008829472, -45.9893935646, -51.0423101211, -13.5776298651, -117.3962715914, 20.9725891298, + -31.2377986416, -66.8022452921, -52.2545297076, 36.1808304465, 105.2804289847, -29.7408485717, 35.4936891096, -44.1058624503, + -7.4267543746, 45.9626674865, 43.2586644116, -84.9652227215, 52.2598894211, -27.7731305158, 79.4055411705, 134.9211049595, + -77.7683897577, 38.9772600887, -42.4478182670, 35.7767677279, 120.4883485663, 40.9080290988, -52.2908368677, 10.8332681424, + 103.8755744034, -69.4025590672, 63.1667239359, 51.1565115511, 30.4688205979, -7.2886782047, -18.0942283768, 31.5953801065, + -34.9573251248, -43.3238802424, -20.2265574149, -41.4045853426, -156.8022185924, -20.3378496469, 5.4144969666, -49.4467840461, + -27.8246258947, -36.1553394393, -40.4493178373, 13.5989840626, 69.9757376469, -60.0443280971, 3.4638171519, -141.4361514658, + 93.4118114115, -7.3645097888, 2.0470465032, -54.6478723026, 7.3294655198, -6.8416716006, 9.0045502006, 19.8489919128, + -6.4702933570, 16.4343253942, -10.3891055517, 100.4561542312, 29.1536913142, 53.8464057947, -16.7143417688, -153.3024265390, + 45.0496791201, -0.9943534787, -20.6269990550, -50.6212419282, -24.6576988474, 59.6066172704, 10.2122652005, -40.4195486296, + -29.2714128060, 62.6802622802, -47.4202386064, -34.8309723516, 79.5197299960, -20.0749434197, 169.8665850989, 98.4267485076, + 31.7347164541, 37.2604966566, 6.7605021281, -50.6903490963, 6.6127852698, 151.3469256096, -70.3184827662, 164.9601379841, + 92.6205263551, 69.9026079183, -31.0866155998, -34.9956145613, -9.6578985782, -32.6789267529, 80.3319506579, 91.7685176440, + 5.8995239218, -82.0636944263, 29.2086774264, 14.7724289401, 66.8988379781, -24.7460191895, -114.7525174298, -32.9732857706, + -51.4321208184, -66.2382282862, 21.2981329623, 9.1062826547, 125.8754077125, 51.0615189986, -96.7297998983, 64.9965050494, + -71.5111010300, -180.4535252581, -56.1041777677, -3.3591726481, -74.8271358166, -28.4281456554, -70.1818488305, 35.6835607015, + -13.9275123287, -83.1043490068, 22.2289783248, -95.1448030958, -40.5966123003, 11.8470675380, 106.6983680147, 52.7565554571, + -50.5809140712, 62.1951780988, 92.8998044629, -110.2770489118, -5.7088922157, 13.3095896843, -34.0434382314, 41.5967680846, + 7.1406890165, 49.0800572858, -4.8661130870, 50.1732411845, 21.8791360144, -20.6230498949, 33.2629053316, 34.8156585726, + 7.7974775850, 85.5360926916, -19.6603301120, -13.8088176043, 77.2247366741, 81.7615386790, 29.5025756045, -202.4477185665, + -31.0440373761, 119.6975128752, 46.8351618237, -36.0825651455, 52.3228058699, -61.7212902449, -37.0009190140, -111.1411485112, + 119.3548750790, 7.5570310830, 6.2657871086, 49.2259611245, 49.9691348215, -30.7394519018, -60.1418076104, -59.4870457446, + -111.9152565690, 124.6406880479, -47.4604425483, 13.0533325061, -76.5307924698, -60.2632649204, -28.0947702114, 5.4878397959, + -83.0541772262, -3.3172056420, 20.2732863285, 29.4076349749, 47.3392948241, 55.3208777615, -32.1444489144, -23.6019236678, + 61.9602080076, 41.6812616408, 30.8111928268, 21.8108462337, -24.6948175247, 16.1446229981, -15.8735793778, -24.1870889577, + 27.1864566801, -50.6435004599, -145.1098728714, -75.7531085939, -4.9397756888, 74.0940849050, -53.5740454881, 28.4600455809, + -64.1804054310, -56.5695284341, 45.7257738714, 27.3208227413, -87.4969438966, 96.9999840115, 26.5098283187, 75.3671956291, + -39.9875814398, -71.8080566179, -64.7909433975, 112.6208244120, -57.5455840916, -9.0666084922, 36.9334781097, 69.7260235716, + -47.6511701810, 48.9455812098, -19.7303239899, 34.4780933174, -24.8188130996, 1.7918733164, -51.1027083896, -8.0414842387, + -69.6904961677, 91.4021012418, 143.3158713687, 127.8431865361, -76.2463415340, 77.1863865583, -104.8165933906, -82.0491770730, + -4.2452881018, -29.8857354449, 39.4203383204, -78.4428804183, -67.3737881273, 45.7774162557, 43.1510666403, -38.1227007212, + 48.0367915577, -2.2796749550, -147.5309258951, 59.4609063787, -94.5201743634, -90.2713711080, 83.9499629394, -44.4267785769, + 66.2311395310, -19.8654393787, -40.9657871591, -7.6100345494, -153.4687135715, -24.0528389453, -43.0977703429, -32.4544558717, + 27.4626014725, 61.8263048101, 8.4949142219, -120.4489043103, 9.2738852281, 65.3309688121, 44.8133466197, -37.4373241359, + -83.9640842471, 23.4059670119, -93.9143209007, -55.4183425033, -93.7449781980, 74.3227981579, -11.7471950643, 84.3803942002, + -31.4489037424, -1.8363204298, -55.3456417353, -95.1228021775, -55.4637768242, -17.5611590555, 8.6597790424, 19.5417857682, + -17.2507716259, -5.7889755948, 70.5139270183, -26.9177828140, 39.6037632634, 4.0845034879, -59.7156630403, -55.4689095772, + -58.7669735168, 62.5057414231, 50.1807875376, -49.3189045747, 15.4287355682, -8.0824504769, -47.6198199719, 15.7657690255, + 24.1207871994, 27.9173027164, -12.5261250855, -19.0257872712, -82.0154379577, 76.9194034147, -14.6695769647, 1.4844193915, + -7.9956835409, -55.6156194033, 39.9952855598, 51.1083969228, 48.8829532142, 62.7988625371, 51.9432398511, 2.8722062155, + 156.1476408615, 37.5905889544, 54.7112433550, 80.2943943272, -6.5627640190, 88.6335213431, 112.2792767414, 21.0878200837, + 5.8741152139, -19.6667337723, 33.7905147067, -34.2798965801, -26.4594706418, -15.0765526773, 91.5802201722, 85.4145356413, + -36.4818922051, -147.9028534383, -42.1412753623, -27.3632859684, 44.0453194249, -19.1027467398, 14.3157309983, 4.1768734004, + -68.3022440228, 34.2186781120, -10.1854692365, -173.8586421151, 56.7091031998, 2.6538298634, -93.3821299316, 45.9499799668, + -11.8122305624, 26.1216815300, -61.0880687199, 73.1945783047, 28.9339417573, 42.3531539412, -71.3262502743, 85.4828937399, + -66.7918044637, 5.4192940999, -81.2977956585, 88.4998783552, -8.8973642437, 18.0257683389, 0.2933847454, -87.7509230128, + 1.4360726567, 57.2432970677, 103.3736004675, -33.8595106764, 36.4856625370, 87.6767927437, 45.9257522623, -91.4882358338, + -43.9564432991, 36.8048295224, -155.8735354347, 78.5839166200, 21.7365316114, 2.8251251119, -0.5016069183, 50.9050618615, + 14.1865751800, 53.6974572195, -47.3239324031, -62.3187399635, -109.6783459490, 10.6742758459, 3.0633856847, 170.8292829026, + 22.7107314592, -115.6997421721, 179.4541315127, 36.6353212025, -46.8173506792, 104.9377352185, -62.3839485230, 84.2161407106, + 136.1327139029, -1.7544748630, -86.9030562131, 15.4259753671, 2.5663369046, -116.9292434949, 64.2129157660, 78.7964806182, + 49.6087028507, -23.1282134104, -37.4278940992, -67.9769820701, -32.7546299170, 103.2337703853, 59.7504223629, 147.3485484359, + -3.2598723366, 116.2635358555, -4.3105783057, 99.2160004729, 18.7288916095, 78.2186271384, -32.7460615054, 26.6048168237, + 54.4099899967, -126.6518025639, 17.8377885986, -98.5074167624, 83.5842655157, 63.5608049079, 124.1282700584, 25.0506382513, + 9.0974612270, 10.2387616470, 31.1629214422, -24.4182834051, -15.9351308181, -32.8438279677, 8.8571103031, 3.0977533207, + -23.0359569441, -85.1033133185, 1.2922811622, -69.5278720344, 25.7444385081, -92.0141253702, 35.4374183520, 6.7043276497, + -0.7451513477, 6.4338102885, -75.9673321161, -91.6026967981, 34.9987265356, -83.2890589702, -47.9531745920, 142.7844807861, + 114.2435566703, -26.6531368807, -16.5029393959, 14.8125488050, 16.9592532170, 12.9147547847, 59.7887418020, -39.2528866593, + -15.3658342458, -74.4590980998, 74.3475628113, -48.1780064666, -11.0564355396, 70.9519213138, 110.0516331927, 36.4575879060, + 91.1281495181, -103.0201029342, -58.9865587379, -87.3023951029, -25.5889474724, -80.1022425592, 7.1308546919, 42.2966419390, + 28.1034227718, -110.4992975497, 52.3250451635, -22.1535855498, 12.7339036777, 34.0415435152, -39.0750294825, -30.4963132547, + -53.1808531221, 17.7255575164, -10.9535616620, -95.2135221101, 100.4987819707, -68.9493118541, -82.6099501128, -18.0285171027, + -21.9761772415, -27.5932967659, 91.8124465044, 5.8338598129, -7.0338759021, -45.7406241732, 12.9215890948, -0.0753638964, + 44.7159304680, 26.4654167590, -40.1423667648, -8.7426397748, 31.4700501616, -38.5847107897, -17.3446717482, 33.6461097548, + -107.3520493912, 117.4675224001, 40.6606607876, 7.9719714143, 27.8264722603, 38.7179679154, 1.7705195429, 25.5111272928, + -100.4419129176, 12.0673509113, 83.8410184425, 29.5781971450, 8.1040630143, 4.6727315335, 64.7847825199, 82.6216823615, + -15.1627242063, -22.6182310171, 13.1330997407, 49.5724583221, -46.1716475780, 47.7331801575, 49.7204543255, -85.3529225637, + 44.2195291098, 14.5616345667, 25.1355891397, 40.3146174825, 28.9423346884, -75.1582368771, 57.1913980615, -65.6984554165, + -40.7664709143, 66.4827050221, -37.4060644320, 22.4137979914, -40.0020443101, -50.0281409167, 4.8184431368, 62.4290842324, + -40.0926566688, 44.5774651507, -21.1028032780, 15.1185206565, -16.5265077365, 50.9848497205, -1.0692090929, -10.2392281457, + -73.6134935055, -58.7604124292, -78.9611342584, -22.1438277580, 38.5664728303, 39.8041438227, -43.2409994985, -37.9352795857, + -10.0448204868, -23.8371815139, 3.2897249640, -80.2885168342, 37.9525301994, -75.0706497208, 83.5246116221, -72.9921720117, + -8.2686558506, 3.9598212380, -88.0878393938, 14.7857207938, 37.3105932736, -25.5786314639, -14.2401437401, -131.8844485523, + -83.2051874645, -48.7402478144, -47.1392081390, -140.1935235859, -110.9171286805, 5.6067034386, -61.3508997640, -153.0780126325, + 20.9763880517, 36.9388874884, -0.5023108098, 109.2764166186, -64.7679763308, 27.5264562598, 12.7297402644, 135.9094145156, + 28.8725261600, 107.1985003559, -17.0333242428, 14.6472316711, 79.6550390697, 76.3253602754, -42.1106361443, 101.2937610145, + 29.1345513275, -81.3710305821, -51.6367882642, -75.6657420025, 67.6127817208, -143.1235134075, 63.4083371887, 20.2771663953, + -39.6962975349, 35.4904122251, -21.1761177463, 36.6827629732, 30.2533761253, -100.8244394079, 42.0562320416, -117.0985134680, + 86.9313959966, -68.5862263897, 39.2349791859, -62.0712807646, -4.7999897806, 157.2184386950, 40.1651596554, -130.2861272594, + -21.2745075974, 96.2019047346, 130.4626031799, 47.8121736864, 67.8619386636, -88.5169139565, -15.5429762844, 46.7375894206, + -19.9234556464, 74.2075824091, -146.2816301611, -27.5190709903, -105.4977126735, 82.7567139636, -63.4005073458, -97.8585647602, + 70.7163936702, 40.3196085322, -92.6325452663, -65.4906649632, 14.2362768591, -40.1848110012, -27.7039695490, -100.7942890248, + 31.7082105399, -25.9115041943, -37.2685165720, 12.4301141470, -86.2349812607, 85.4288388492, 61.4326022560, -52.6450593109, + -78.4043996861, 32.7052974812, 1.1786814775, 65.3401420354, 8.4364632653, 148.3052078011, -83.0828330696, 106.6354843068, + -4.3121195655, -44.5526178638, -2.9317305696, 109.9935497492, -18.4045116767, 23.1613955078, 15.6972686340, 128.8746575438, + 29.0629973213, -10.2922631539, -26.9225268881, 78.3939184322, -13.9891592847, -14.3955545921, 56.2259353432, -106.9719383698, + -69.4541718556, 83.7959262767, 118.0020136833, -76.6757480506, 53.0531323252, 20.3374814219, -45.9339005486, 46.3861511953, + -82.7185926581, -51.9983813997, -11.1149096121, -15.7796335925, -14.9611867369, -55.5963996752, 3.4778394189, -63.4371998633, + 28.8327087658, 12.5198672129, 87.7380213704, 18.4911159408, 56.8889056171, -21.9589217680, -93.4663445471, 55.1183878788, + 0.6449948853, 28.6533319776, -14.8059318368, 113.5439226734, 54.8995357737, 109.0924325068, 38.7922835723, -0.1180981319, + 157.7915336564, 81.6839158496, 11.8100964756, -22.1691332044, 9.1777753259, -58.6991331163, 121.9143128888, 123.2714985637, + 28.7886850251, -73.5910923730, -128.7124920003, 55.3579340152, -103.0285920820, -68.0360814429, -41.1894325447, 61.1418052767, + 9.1032579737, -114.7074592848, -35.4778656303, -56.5732437789, 87.7236911508, -34.1313499403, 62.2620712971, -52.3364100999, + -108.5676552169, -88.3757117464, -19.3248782556, -10.6333977657, 11.1531439202, 117.9042736262, -59.5405468137, -29.0685166095, + 84.9970950178, -27.4738785887, -49.4301782076, -23.7375836298, 123.1572277910, -30.7874739051, 20.0070113012, 92.6375682898, + -151.2677413660, -64.5993124352, -6.1931938222, 56.2980662344, -51.0667271974, 3.2590148897, 94.2279629570, -81.3680192851, + -58.2441470779, 136.3043204550, -65.1682000377, -11.6204578273, 82.5051730406, -20.7566312389, 12.9732577973, -3.6631681566, + 5.8870959981, -15.0765851320, 82.0878455090, -35.8669226696, 12.3547961199, -187.4160833910, 134.7486191161, 68.4591403436, + -10.0461433931, 59.1539319574, 43.7723616252, 79.1999168985, -24.1914155320, 38.0293798436, 4.5268241580, 32.8861446301, + 26.8134396608, -32.8357678171, 75.5315658240, -98.3994598766, 27.4380255469, -18.2567928813, -53.8692115445, 43.6445077874, + 41.8403964980, 145.5446940894, -45.1527793517, 36.2478163862, -23.4791069949, 12.4999105154, -39.0947731515, -94.0528129824, + 58.3030733328, -45.3491781120, 73.6529605858, 59.5823230864, -47.4741019188, 16.0307838051, 76.0140317071, 35.1546855136, + -5.8237741703, 8.3668861475, 125.3567506875, 55.2422644949, 22.2611352600, -33.7548647520, 22.9568910221, -35.1162490171, + 34.5901055588, -28.0490543019, -15.6322113695, 23.3610785957, 95.0831229094, -54.6273674257, 89.1750392621, 40.0225575612, + -14.4413587278, 97.6869759465, 14.7675464371, -37.4004765161, 119.4568961628, -26.1920161265, -58.0012410134, -28.7350340564, + -4.7796929865, -19.7344028715, -8.6437248253, 103.9809164360, 11.0043740394, -32.6092633210, -80.6443486297, 49.9986715363, + 105.5490975322, 104.0899701063, 59.5660092301, -17.9484147791, -55.4356343687, 5.6176664765, 147.8940936440, 42.5217478147, + -33.7007685862, 76.2702328206, 17.7168869112, 29.8692838033, 47.9156001099, 78.0087519225, -10.9663921228, 108.3826416455, + -12.7724638181, -84.5882451872, 19.6390498449, 50.9452521435, -10.4676220676, -59.5812635820, -165.2174342507, 52.9034909048, + 4.5103428162, 28.6714188830, 151.2376493891, -15.6519597742, 54.5244070834, 40.6356686042, -51.3633558110, 39.9915724858, + 1.7184423265, -4.3510464817, 6.8579282212, -37.7467707598, 37.4199831388, -44.1415061320, 7.9715921178, 80.9137854559, + -93.3883447881, -70.4226479003, -5.9804507221, -12.7588185792, -12.7748179660, -44.8489354744, -27.7084595447, -9.4696608732, + 57.0454576802, -137.5411295173, 34.0807152122, -82.8428997163, 36.3720183240, 117.5741160380, 91.0621096220, 16.9215804561, + 82.5046757105, -16.3941226525, 21.6412310432, 9.9347818503, 94.4637136289, 40.3883996184, -79.0927933462, -74.1126629254, + -1.8463008698, -11.7303452181, 51.4819690412, -40.9029132628, 79.5478142926, 37.3467151745, 119.3061300476, 81.7656373311, + 40.9995493552, -18.8267671804, -109.2814037436, 110.5826225324, 3.9090047179, -12.7311846356, 50.2434808607, -78.9987938122, + -48.9383950748, -23.2509396875, -67.8816298850, 46.0043667633, -79.5062435328, 3.7149881510, 28.8345576966, -2.4062068420, + 111.7203117517, 0.4410205414, -38.3832527193, -61.3416288539, -102.7939248826, 67.9533675166, 58.2475592529, 10.6035422626, + 37.5730234873, 49.4994673002, -82.1647604961, 65.7885201078, 92.2097983704, -37.3226143066, 135.8561958349, -49.4816302910, + 10.8193370693, -8.1591216625, -124.7982308726, -14.8282684728, 90.0927717376, 33.5256881620, -59.8703916309, 21.7176330197, + 2.1782551834, 114.1382737688, -88.1597739240, 6.5361543045, 97.9695862766, -39.4694065867, 11.5962132886, 33.7697466356, + 58.9764174727, -4.3190513332, 45.4357110166, -39.8718237733, 101.6682995218, 16.6389670713, 0.3598261204, -29.7440968058, + -31.6482054502, -43.8553776977, 67.0772865832, -54.5098535835, 30.0974211944, 45.0867818944, 8.8681839790, -27.6698123459, + 32.5238939056, 115.1771763945, 1.0297629680, -0.1277281381, 53.5989816709, -15.6940765735, 214.0039494923, -3.9607957468, + -28.2459062295, -78.4309884274, -45.1615660948, -56.8373512425, -14.9182469466, -46.6359981712, 10.2436473643, 49.6796044695, + -68.2156643693, -73.6736376702, -25.8482309017, 79.6432993680, 39.8430177404, -48.6865340771, -4.9554892261, -10.8103852199, + -163.6398049355, 34.8129987597, 43.1988001177, 4.6425367549, 71.5136740040, 5.7449295065, -129.5178610564, 23.2851316100, + -28.9856348679, 72.2878496468, 65.5641757637, -22.6995529120, 90.6678161988, 31.9503079809, -38.7957396135, -29.8167763909, + -127.0682245355, -114.5912946274, 95.8998971324, 14.6842186073, 38.6817470857, 53.4220170000, 30.9640386035, -8.7681524726, + 93.2374647164, 167.2548470938, -110.0113841742, 60.7832491969, -10.6378768861, -12.9541979766, 50.4311478762, 14.8581364205, + 36.2771855577, 16.0289680028, -27.1211553672, -27.6119525599, -64.3782858077, -30.6836783175, -11.3104575592, 46.6583470371, + 43.2576688462, 106.2483647125, 35.4221002374, 38.7051612461, 55.2640723227, -64.1159659536, 57.0032601941, -44.6269768244, + 53.7789820032, -157.3514759280, 9.5791816275, 6.2806945793, 18.6705185038, 153.1320561669, -5.5671006976, -3.2946321773, + -13.2024369589, -21.6449448269, -22.1412657716, 70.9673800953, -7.9864874901, 41.7239378937, 71.5984356144, 87.1584519164, + 71.0575050315, -38.5112900717, 41.0828370864, -97.7913314993, 24.9443056744, 71.6995496139, -116.3501231153, 67.3823850840, + 94.1851944844, -41.7993332022, 55.6783133892, 47.5180232694, -25.4261377746, -16.5909249978, -16.5035403522, -31.2504616568, + 38.1070466320, 0.3163573698, 36.1965564905, 54.8579811585, -54.0608838266, -112.2426667925, 184.8017345857, 49.4559933628, + 97.2753525540, -127.3976019425, 56.7945066844, 105.9924251837, -9.7156760373, 44.4969751065, -37.0888563276, -26.7522105798, + -40.8300149353, 52.5243354843, -19.8943377495, 51.1416695022, -70.0108248826, 15.6121585850, 32.5217684217, -90.1820508578, + 39.2513383879, -47.3412998909, -31.3055181623, -56.8173595829, -50.8924569276, -7.5435701646, 64.3413557990, 9.7281927789, + 48.9305305599, 56.5372975126, 26.7417330296, 89.0738343693, -48.5280725684, -31.0853481463, -9.6358615936, 51.4311918344, + -33.9718242925, -15.7470007951, 51.2850467492, -51.4187903682, 33.5815172911, -71.5483298410, -74.6635317137, -82.6284293355, + -19.3084129904, -58.4258965628, -7.7220084872, -50.0589600666, -35.4767663181, 113.1079148915, -10.8113655056, 6.6819361958, + -58.5734954218, -83.7627866065, 26.5302830531, -99.8288161852, 70.6577997609, 105.1602805436, -26.9709761883, 16.7715250364, + 100.4598899749, -12.8354110399, 31.2835111044, -28.1999286002, -71.8821977449, -43.8649368179, -24.4752744590, -13.8122643365, + -13.2937561135, 86.7641539982, -45.7159093571, -13.0092431337, 71.1728457692, -47.6143967182, -18.9549445122, -52.6530519413, + -36.3758751689, 95.3593012050, -13.8106918472, -47.9731072201, -42.5698690212, -33.2874699499, 74.6397905712, 13.2248699532, + 10.5705384630, 53.1572412508, 11.5799356215, 40.3743911825, -30.1315085582, -32.5536377528, -63.4740422506, -8.1108698232, + -39.7653559069, -61.9123876789, 30.2050339534, -13.4902607567, -49.0742542298, 88.5722862352, -22.0924973356, -43.2051228512, + 23.1418263846, -52.0531638851, 61.7042537346, 62.2206170738, 89.7321026525, 16.2048654039, -69.2890753423, 14.8548152449, + -44.7911045647, -2.5487807022, -25.2382987671, -73.1162478241, -6.5637044361, -62.4609072239, 50.2645328426, -127.1218373352, + 35.9901816641, -13.2427957988, -19.1139418128, 11.5763910792, 42.0967727508, 93.8373969941, 48.7578089767, 116.6192984420, + 29.2111912926, 58.1960409947, 45.8425638147, 72.1773323399, 83.8891643331, 17.1974768083, -78.1227071776, -76.1533486330, + -37.0312632710, 25.0291081414, -104.8734413579, 19.7434765416, -23.3082565679, -21.2852819234, -25.2235835223, -93.6817252275, + 2.7146982161, -17.4896953310, 71.2109780985, -59.2294931409, -84.0666862918, -65.3056520242, 120.9838686800, 74.4971556879, + -9.5684703908, 64.8377948685, -66.6770366247, 38.8265471508, -79.6623440265, -39.6171150046, 68.0022918215, 64.9078337860, + 19.6121887994, 7.2244101173, -23.1854400590, 30.4614578804, 46.9242283532, -1.0747268647, 49.2189640668, 44.6411673048, + 86.9687811173, 22.6744479392, -48.5360769344, -66.6164589196, 43.6822611836, 0.0803667092, 22.1251605426, 84.5472356977, + 23.3682917569, -119.0004161504, -77.5731290127, -8.1237991059, -9.8574787289, 8.0923731288, 11.6312746189, 48.8042209908, + -91.5385965138, -51.9417178439, -93.4017678039, -7.6902800177, 42.8038592146, 208.1745748115, -40.2269989314, 35.9946432857, + 14.8799963031, 72.5512530025, -33.4277806899, -3.2314305870, -66.9052809329, 99.7368956670, 19.5081727184, -29.1990516772, + 114.5317858084, -154.9703729745, -14.9584650353, 5.6179621219, 28.6224091068, 33.0426197666, 147.4892869040, -67.9739211942, + -71.7894315626, -107.3389637620, -95.5814122043, -16.2209528572, -32.6673756107, -24.6641235582, -96.2759765479, 42.9819639376, + -45.0775031344, 26.9177278735, 87.2353637167, 58.4214280318, -37.6862314706, -27.9660896146, -16.9115875649, -16.1061688951, + -28.9055343700, 58.1888376313, -38.1213943166, -4.7623621285, 33.9409953615, -85.9445074362, 3.1450686264, -88.4878703313, + -50.0848195592, -22.4167501243, 21.0397901669, 11.4240588629, -16.0956576256, 2.8322646297, -77.6952409905, 38.2576382396, + -53.6616605614, -26.4231916298, -26.3358464547, 81.4694985453, -50.3033670023, -8.2053965822, 19.9636273501, -10.4302918812, + 9.6629338686, 26.0903202845, -37.8068628176, 9.2638853986, -9.6752622225, -55.1704616516, -182.0875653530, -116.3887933434, + 8.5457908424, -29.0590636102, -52.1712423322, -84.2194156867, -17.3343644788, -69.9177944994, 98.4410912043, -5.8653773568, + 14.8287039959, -37.2315894188, -15.8744801467, 55.8855979582, 82.6374695897, -10.3491623457, -13.1871637112, -59.8321884846, + -13.6406794918, -90.9144246870, -39.5280425915, -21.9758399218, -21.0648164072, -37.2225695620, 179.7142651659, -1.6184261744, + -48.1631682332, 83.2309613815, 48.6367549372, -30.7160958486, -133.8419652482, 74.7583916606, 97.1026557281, 49.5481525536, + 33.9337592438, -48.6489706540, -74.5656495945, 11.2027589435, 2.2601440520, -26.1480067313, 14.1051697860, 104.3412840234, + -25.6567602627, 57.3314373931, 6.3330980799, -55.2666198655, -25.4971449454, 12.5333375030, 29.8117352747, -92.8414244156, + -143.2454500203, -7.5931354464, 1.8606525257, -9.6143470754, -56.0408726209, -26.0595448033, 37.1855765550, -21.2097936957, + 40.1996970371, -41.3351177032, 34.1834444638, -186.6269086563, -18.3614205839, -37.9357021641, 135.6670379673, 127.6586855975, + 23.6471207301, 73.4502163408, -73.9251876551, 47.5332209105, 50.1140713450, -5.8704801353, 12.9804536200, 46.7639885850, + -36.7458561449, -33.4506904080, 36.4941161678, 3.4199906571, -41.0407898239, -9.8181030415, 4.7245112428, 96.3687030689, + -28.2365241736, -17.4276379002, -65.7706653413, -96.5485126192, 46.4790636261, 32.1379379931, -70.2471563731, 52.3768573029, + 44.4162811009, -74.8951342613, 5.7318009676, -42.1108472837, -131.1371125092, 121.7221178589, 40.1216742680, 6.4128170610, + -32.2753329082, 36.3368525229, -30.2548033001, 72.6541502245, -33.4706909702, 15.8356670629, -50.4602392965, -4.4743341580, + 46.2418862356, 79.9973168669, -111.2430552953, -41.8285332332, 25.3359175319, 83.0841533978, -16.9581589718, -51.9200860092, + 77.9429675613, -100.4955466280, -16.9528387572, -63.4657485782, -14.2913689634, 20.8998480157, -98.7512394038, 175.0497111959, + 47.0357236193, 137.1821799965, 75.4859204931, 102.0896754000, -74.4319389528, 55.8710604661, 138.7844756707, -23.0214452064, + -44.0374225169, -39.5194006283, 17.6585042519, -83.7726310797, -40.9221184784, 66.2446785328, 61.9460848477, -26.5717761182, + 128.9173728445, -90.0154125585, 30.7220887905, 19.6211869212, 91.6137623259, 31.9401330791, -12.2054969481, -173.4012681649, + -37.8843684762, 2.3280971615, 58.8027265021, 39.6103768351, 45.9231885572, -21.2457868614, -56.1950724310, 93.8767608958, + -20.5075317720, 81.2860077414, -82.0982682957, -17.2313104276, -36.3367685204, 146.3298759474, 83.5645188769, -95.7871128855, + -41.4691805243, -4.4610514276, 76.4605569574, -18.7164073238, 60.5960801248, -55.1266248358, -49.3982202577, 163.4790300050, + 138.0264616472, -15.2636421738, 36.7895684788, 83.0702148363, -93.3437893057, 32.5989066039, -49.2049731278, 117.1479217209, + -35.4644848480, -44.5015630679, 31.3859706395, 5.8693717755, 17.3746859058, 9.9311131323, 6.1022018377, -121.9841205723, + 48.0645606148, -103.1127755426, 20.0433058006, -134.2922130039, 28.5016581997, 101.8535712259, 76.4518488086, -9.2802004844, + 78.1358057662, 3.3099138954, 69.8587685844, 110.6444273503, -59.6931547724, -51.7268303246, 64.0193271761, -15.1660919639, + 78.7207187414, -51.4776928138, 30.8703273062, 67.4488362333, -95.4561768870, -100.0161430296, 198.1825455394, 131.1359211305, + 3.8645077188, -19.1178912788, 30.3260202103, -19.7430200798, 12.7734912557, 74.1885333495, -67.8364659684, -80.8926661663, + 12.2720397333, -22.8440467871, -42.1377912025, 22.2591508655, -94.9559790816, 116.4053256024, 52.9759527067, 108.1630429012, + -82.6415576638, 107.0506710689, -32.4925050747, -134.7178668343, 125.0907581204, -33.0460380391, -37.8115604172, 13.4036941541, + 27.9798939995, -59.6965877877, 54.1339455110, 32.0538788400, 24.4020907468, -74.2815166253, 8.4464964158, -20.3601523468, + 28.5216426135, 54.3051140070, 91.5671757124, 44.5687804478, -50.8430812549, -15.1985800847, 72.6230011188, -63.3817304557, + 31.1651064018, 50.5057736622, -111.8897385947, -2.9491865484, 80.1135762676, -14.0696654619, 52.3521392147, 88.3353740728, + 87.0542702718, 44.9528879964, 24.2675410208, -47.3556425676, 23.6195853690, 61.7358141399, -39.8446197794, -28.6054825449, + -36.0836012134, -73.9089369029, 95.5989535672, 7.9458092374, 21.8693430561, -10.5751898940, -16.1045252653, 44.4127909167, + 18.0851707496, -46.7345019239, -92.6347568314, -15.6603448228, 39.6519674060, 29.9629332247, -24.9622443586, -47.2975561701, + -17.7780218654, 71.7346558516, 1.8999680118, -98.4624329314, 98.2614298645, 15.6787428700, 45.4912030123, 28.2495734475, + 65.7419427030, -99.5295634165, 27.2786047010, 77.8875001753, 16.3977450032, 10.2037888065, 60.8912178592, 82.1708628016, + 48.2506800969, -26.2756011209, -57.2019501999, -91.8180165526, -47.2336309942, -42.1121454516, 68.7279348832, 92.7832491188, + 17.6280339107, 6.7251426316, 25.0819097881, -59.7146158445, -65.8513175770, -41.0602910259, 4.5838916831, 38.8846775235, + 19.3473841098, -105.1434354654, -13.7765844991, 24.1616037866, 93.0893862826, -107.6082978084, -58.7977319447, 58.0759414185, + -89.7901093790, 16.1918835625, -37.2172665357, 123.6960140670, 114.2205895053, 8.7980887529, 22.1354877733, 52.2713979482, + 22.2246402930, 36.6257130653, 74.2884386832, 39.9288008601, 113.0416245079, 26.8047584467, 58.7266876251, -6.4680422666, + -26.7509331673, -38.6312732122, -145.0208923168, -35.9684264419, -117.5381191845, 29.8488196638, -51.1247043830, 112.6915937071, + 31.5277658506, -24.1454178026, 24.0572867542, -15.3632719912, -44.2556311042, 58.2449714174, -76.1363396817, 46.3749067777, + 3.4852275006, -104.6231553696, 30.1977700745, 7.0441446610, -10.0102536523, 120.6615291011, 188.0249410917, 44.3295887206, + -39.4106227621, -42.4924838463, -28.9316859978, 103.0113316106, 51.7061135184, -18.2169052015, 21.6066648209, 50.1453569033, + 12.7421867528, -8.1356008640, 75.2454422748, 64.8694058804, -161.7997182567, -17.1915039219, -41.2383269408, 0.8946812357, + 55.0533498639, 46.8242610223, -5.3780848566, -46.8156157192, 64.2205137708, -25.1479872711, -54.8298550608, 73.6823422266, + 41.9888520352, -83.9419623261, -41.0305214865, -47.4087035362, 33.2268582543, -38.7414663450, -104.9255474057, 38.2157988361, + -22.3790617016, -31.5426215850, 14.8891733573, -64.9019662116, -44.3044057867, -92.3281371013, 63.6669819235, -18.2425819417, + -49.5109487403, -64.0201431562, -70.3061633619, -147.3930233046, 128.8254864954, 7.6978217230, -56.3987238261, 95.5962971177, + 24.9319849141, -1.8305826630, 63.7414243665, -49.9852779582, -25.7389331291, 25.2700519583, 170.5603890165, 9.5266276922, + 13.5399442827, 0.7663023156, 144.5140143737, 75.6602313295, 44.5345480965, 35.8927901197, 59.9952333199, 64.3016125781, + 59.7518716703, 15.8739554628, 57.5686758914, 58.5866845774, 43.8356058096, 7.1335337346, 27.6439212874, -30.0398764928, + 6.2065364457, -79.6476847939, -80.1779260414, -52.2408711631, 9.9023027662, 10.3789070887, -46.6717275791, 57.2822267955, + 73.5763019279, -71.4639042142, -52.0323289026, -80.3692311543, 8.8431925427, -40.3750957204, 12.8573997402, -112.0129690473, + -67.5403575455, -4.9929337525, 131.9313839610, -108.2934624601, 17.2672219445, 48.9942839871, -90.7089806183, 114.9850344553, + 31.5988734490, 59.7636253519, -33.9764105756, 20.7915341567, 94.3558278877, 4.9570378129, 75.5601876581, 33.8799007373, + -90.7302419365, 1.0494275291, -33.5814817284, -50.4328011162, -52.6438122254, 10.3630633870, -90.7790260582, -60.4947106306, + 56.5127910083, 32.1019449106, -8.8885657127, 22.6481300860, -74.6992587301, -137.1086103933, -35.3402671515, 52.0032440119, + 14.9769109018, -23.0406615521, -41.8971596726, -77.3413472134, -46.9910623823, -107.4957490524, -86.8794002198, 52.2329975546, + 72.9424340427, -74.3244971184, 85.7023745145, 60.8778950641, -31.5903542844, -78.0533202133, -73.1733800101, 53.2034137779, + 83.0498994257, 30.2580271740, -56.1035163750, 16.6579677161, 0.2073439761, -5.7906867906, -66.8711603748, 74.0261467640, + -62.2989478643, 107.8399681550, 160.1626153730, -27.1263316346, -79.7784413411, -10.8403444789, -37.3887634955, 5.9808867714, + -10.1978150670, -53.9468869673, -38.2970373675, 16.3168988370, -1.0483342304, -63.6173233903, 87.0866029730, 26.3862156999, + -21.4053546455, -7.8216446996, 90.5994689064, 44.6928873902, -146.7075228500, -62.8122471300, -121.7119840134, -32.8992273432, + -11.9106565965, -104.6076313473, 127.3823687195, 2.4852952522, 8.9975686284, 45.5738431227, 16.8209391951, 26.7216521497, + -54.8776022226, -68.4194899925, 20.3925320149, 4.3453071650, 49.9988757708, -8.6636385971, 0.1191776713, -64.1528259747, + 16.0849193094, -24.1120788064, 40.7655203071, -23.7853262362, 91.6933164270, -54.3376676772, 69.7309190298, 113.1324293560, + 16.9278536871, 123.2439408123, 5.9934209089, -45.6409119369, 17.1842607385, 83.6522464227, -174.5484916836, -4.9414325022, + 52.8768375216, 15.6132102239, 41.1192572000, -81.3594721245, 28.8255333085, -2.0603766865, 6.4061712949, 82.1547586637, + -36.3679383103, -1.0390408940, -13.8483417281, 37.2231178393, -2.5777964710, -157.8382079085, -60.7910508762, 48.7258486830, + 33.1256641954, -54.6346845809, 88.2192196002, 39.9956402036, 3.2010617529, 88.1693658284, 11.7277451767, 32.7636165636, + -68.1591305748, 43.2699890762, 107.2828531104, -36.8225650893, 1.4407313695, 53.5742622795, 103.7597203839, -96.8481119045, + -70.2987605549, -55.2783713624, -6.9864094662, -40.3280834509, 16.8072891922, 24.3756993403, -84.6501745052, -45.3961429485, + -53.9237387431, 29.1708008262, 1.0498758638, 34.2610169651, -9.7905112911, -35.2443111357, 99.4574100554, -82.7243314274, + -12.3112078341, -13.4935295204, -65.0441169373, -1.5707942158, -8.0237289199, 49.5507868185, -13.4811149250, -3.9030733772, + -75.6220602476, -74.1596322041, -5.7789561939, 73.6177769297, -98.9485291892, 117.7192585235, -79.3791252579, 11.3447373614, + -24.5743979438, 33.7169431880, 39.8633765496, -149.5617929692, 141.9104918620, -55.0577810810, 37.2052313138, 6.4852281207, + -51.9122252169, -31.2592720321, -69.3547398856, -78.1122747852, 66.6338044220, 8.6865150501, -67.8354186666, -202.1226264943, + -31.1645341579, 18.2037364021, -64.8577486822, 32.5502423750, 26.0251882844, 5.0986012605, -47.2026094332, -13.9009556603, + 59.4152148554, 101.0702523560, -35.6013874662, 22.1677959258, -26.0857605492, 14.4754773923, -0.6780897798, -25.6530120006, + -25.4546641639, 35.7707567857, 24.5314489446, 20.0344481593, -18.3207572649, -9.7912924757, -11.9552594910, 106.8966283008, + 80.2653334386, -3.6056009570, 77.5441202535, 37.7136483336, -2.3165569778, -15.1111584239, -21.3047579337, 63.3629898072, + 15.4217847395, -48.6546027271, 33.3996963722, -87.5423526700, -18.8955709453, -85.0736444599, -55.2290313813, 37.6993014695, + -1.9420172920, 143.1251237972, -55.5771775185, -41.0289639463, -82.6515627688, 48.5420105013, 10.2288031648, -56.3379070490, + 20.0143954586, -84.8968512309, 127.0283241701, -79.6996444881, -52.6134879057, 22.0561680431, 60.7355377150, 15.4017379435, + -103.3924328801, 54.8459420743, -75.9157921311, -18.5478645340, -120.2337715192, 19.3119533190, 14.2354651926, 49.2411155276, + 178.0946722971, -75.1044338856, -17.7857687140, -44.5847020456, -90.1973261616, 21.4416495288, 51.9825060227, -66.7420817203, + 7.5764658958, -70.5144035274, -58.0645913437, -108.7601823595, 11.3207059592, -71.0204300166, -71.9141786835, -41.1119761277, + -63.1487461134, -7.1948924612, 37.4257273157, -0.3096640281, 22.3859391424, 37.4791977942, 4.7298794262, -33.2974745191, + 31.2867641674, -32.5753321154, 66.5419169580, -60.5202504180, 17.4192217276, -50.5317834280, 95.8748766870, -31.5464032969, + 44.7045552306, 64.5521928874, -23.1461700992, 118.1095509083, 35.1065388893, -27.9857316442, 8.2912382315, 39.7446781812, + 3.3485245256, 56.6810611812, -22.8994983441, 80.3970810489, 22.3086957726, 128.6454657339, 22.4798757743, 49.8362059423, + 22.4019441476, 27.1059712406, 11.4540686475, -10.0764491110, 28.4803668412, 94.7776130875, -36.8737987939, -88.8666428850, + 141.5495956917, -46.9343244046, -58.9586661150, 23.3890221338, 72.3692845286, -27.6356117882, -41.8318324842, 70.9559999727, + -8.0897813375, -78.2950183802, 87.8658917396, -70.5715383399, 22.1972033651, 47.8069266963, 131.7707915958, -23.8938128672, + -33.2047798206, -40.7583820499, 27.0405050078, 19.6445061622, -19.3891108700, -136.1942182249, 8.5255159178, -42.8234719503, + -70.4814202849, -41.0662321022, -9.3910777305, 136.7254609331, -6.7391967243, -68.4796734994, -27.6933664361, 118.5680907562, + 7.1623426945, 6.8386734240, 75.2481710418, 33.2280590090, 50.6011222647, -2.6551190091, -54.6429379954, -15.6441827245, + 34.8192824650, 41.1519964665, -95.5213521044, -7.1466152035, -23.1705143065, 21.8243235569, -26.6493944983, 44.3948925119, + -0.2695887637, -115.9753822388, 10.0551835964, 41.6343978371, 17.7354401036, 3.3862359071, -107.5692389700, 110.8538665943, + -77.0898864044, -18.5513096154, 87.7377015326, -89.7201205553, -21.4828890020, 12.6716787713, 71.2019960218, 37.7530110511, + -111.0886809644, 28.0083327042, 11.6412229475, -14.9061811373, 78.9633564364, -17.2424064978, 78.6411356878, 31.5888916445, + -52.2057754767, -51.8187552856, 12.8069170133, -44.4192811197, -29.6758641711, -39.2862559158, 90.7444415817, 9.9897923810, + -33.0089291278, -79.7506824464, 51.5840713006, -15.3414477161, 55.8773639416, 10.4014931469, -12.0825624913, 30.2487218486, + 13.4626458507, -41.6078761320, -99.0036616160, 97.2413199943, 16.2571104823, -106.6994082721, -42.5507290539, -30.6273488892, + -65.9180047092, -61.6996048814, 57.0455325157, 103.2653865169, 116.3758447306, -74.5041275207, -0.1164162789, -14.3978018054, + 38.0218224919, 127.8971402721, 5.4463615012, 78.8192543895, -25.6140607422, -9.2485898035, -48.8769533605, 34.5460968716, + -75.8820751325, 93.8969485430, -38.5976860109, 7.9177115766, -80.5122708885, 21.2658351542, 67.4252739338, 2.3783155124, + 83.9115322121, -75.0252790111, 37.9405478207, 14.4346316538, -109.9157163206, 108.9078208323, 15.7162891141, -82.1261022291, + -76.1782289525, 74.4747265412, -46.6029184986, -41.2456137340, -80.3895294383, -8.4118305522, -0.1933892651, -145.1576077775, + -15.4312649597, 39.2200199533, -13.6364330998, -25.8182203562, 48.1591475229, 125.4840761759, 15.9990051973, 76.3197750584, + -191.2988456723, 38.9117045838, -115.8653769258, 81.9245653626, -10.1602378212, 54.8635932256, -62.0258658391, 83.1033610875, + -4.8490223558, -54.6097329099, -10.9477363598, 33.0862207616, 52.7148056029, 35.4875411655, 49.1104822038, 55.9764111036, + 19.3458408685, 89.0606670761, -85.0457542002, -78.1726308870, 93.6580344148, -26.7125037520, 15.0835782513, 45.3860435621, + 12.4384130680, 70.5409358400, 9.8929034782, -23.4934005067, 40.6776169075, -65.7911681154, -167.1217168499, -19.4434798044, + 12.5047333259, -106.4886582913, -22.0096224479, -51.4306080664, 70.4101816964, 0.0684774882, -76.2887185579, 75.2064469835, + -63.0584107912, 78.4585282303, -20.2508456707, -55.6679838569, 27.4321350947, 84.1834097135, -10.3659243385, -48.4070302399, + 92.8062051508, -25.5124355326, -84.0473681678, 71.0714983360, 25.6083325312, -45.0808082818, -155.1967735998, 10.6420814804, + 151.0278845436, -44.2955308501, 29.5425559978, -113.6663161729, -36.5169042517, -72.3071551232, -26.8471044056, 15.6848246843, + -34.5750914935, -198.1775254215, 25.4131251136, -21.2604011481, -1.0414028296, -46.7191360308, 2.7446655943, 54.9295292750, + 92.4228624473, 54.8526054625, -58.0708705172, -17.5872514429, -107.1263606314, 3.8705217560, 8.9778481619, -6.0018700075, + 93.9938778953, 20.8072064757, 24.1862680085, -36.6869801034, 80.8573435056, 5.0571862502, 4.9644714449, 47.8862765669, + 35.1164783949, -43.2306708209, -70.4784884015, -22.9691864018, -13.9209248410, -47.9058355842, 69.2014224885, 36.4205028832, + -41.7969907806, 19.3910242176, 46.8411651043, -101.1964790621, 1.7651827600, 2.7058301870, -23.9427647032, -29.9388425668, + -85.3458953742, -28.9877302845, -56.3025916174, -20.8442568667, 52.2658233674, 16.2060641337, 4.4319659648, 114.0813888914, + -28.7002125175, 49.5308227691, -30.0766397744, -61.6828255791, -49.3247835301, -26.4413883089, 5.0971297500, -28.0554103014, + 42.0857897882, -47.9552784036, -42.7903198462, 87.8376670399, -140.5238322306, 101.5731331285, 52.2212327660, -22.4010751415, + 14.4300378085, -51.6886150508, 6.6829221172, 115.9640673493, 0.8066647921, 79.2442610587, -18.0322597688, -93.1043520771, + -72.1150120989, 87.2886742511, -25.4133998112, -7.4831361426, 33.0287073819, -23.1984191566, -23.8078728472, 59.7504642008, + -0.6923320155, -12.4892802407, 38.4436035475, 100.2867176437, -99.6305730687, -108.5810851604, 9.7451186318, -43.0333845061, + -101.8397764566, -50.5229450341, -23.5177624889, -64.5537003712, 174.8259413987, 80.6820828046, 156.0492701171, -28.0432391315, + 54.5458337882, -9.7039186394, 0.3967891057, 37.2171179706, 53.0918819026, 95.5734474731, -0.1572821866, 35.9295265728, + 52.6110638216, 65.4681244336, -58.8893064188, 33.3094740223, 23.7248112965, -86.1001662411, -124.2990486005, -53.0143407367, + 60.7137702328, 16.7099000008, -16.8984625777, 92.9154007512, 19.0020902188, -60.8943449371, 19.8803437206, -45.4933609435, + -37.9759751454, 38.9546342412, 112.6564725638, -20.6282048911, -82.6461566213, 33.1634895891, -14.6466202774, 70.8258934983, + 22.7763755890, -23.8551537513, 38.0027621248, 13.1891619540, -0.2512849813, -22.0294650280, -3.6017925014, -80.9408522816, + 2.1581228675, 35.0316749727, 1.4313916959, 7.6662501879, 95.6789578890, -25.3147779279, -11.1001968711, 133.3263412000, + 57.3919237887, -114.5247973399, 97.7159374781, -25.1589170064, -28.2795559691, -78.0626694271, -25.2625001068, 59.6669532190, + -24.8854138846, 15.9627092698, 52.0951356726, -49.4931272094, 32.2981549802, -45.2155042278, -117.7954359551, 71.9214384433, + -12.0100960200, -85.8922139632, 44.5277402755, 45.7283733108, 153.5133743833, -12.2908386291, -16.7857892861, -34.6184196532, + -56.8327470259, -5.4780874150, -38.8725168650, 4.6060525978, 20.3207039309, -3.0993047411, 10.1132085358, -37.8257661018, + -5.5665784625, -69.5263241776, -38.3990002707, 55.5634953442, 34.1515898646, 25.6046582443, 49.9096070185, 23.8082590350, + -59.5259871997, 53.0128767406, -14.6534382681, 25.3901141454, -20.2689398092, 112.6721308068, -44.3928586231, -46.9200544069, + -102.6597110918, -35.1087345365, -16.4476118027, -56.5493022087, -19.8752899545, 112.5790185345, 13.1594262867, -98.3712667207, + 84.7454129819, -32.0001239970, 33.2615003229, -70.2186017880, 129.5580075545, 14.3022334321, 53.5329352657, 165.1115533783, + 42.9337492453, 3.3467665656, 5.6916538476, 30.9878624742, 43.0083773411, 83.1082949362, -68.6733601131, 129.7158774740, + 0.9829430504, -73.5779156249, -0.2190628113, -66.4832285128, -18.1621332482, 59.5591274811, -47.9030207223, -33.0134331016, + 8.2663047608, 13.5843595697, -124.6750162116, -119.5553229429, 6.7914845141, 17.7380901732, -133.7630184698, 33.7185572623, + -31.1975924142, -55.1798482215, -72.6025491416, -65.3245960982, -8.7224630378, 27.6488501343, -79.6246723592, -12.1515699989, + 84.6626846949, -53.8044373764, -47.3237819756, 58.7153917563, 23.8284036126, 18.5922606945, -41.5094930442, 7.4798082503, + -117.3348631592, 28.0374584580, 17.7205965437, 37.6075060837, 10.5295050958, -10.2113391455, -25.4289536763, 80.7158011723, + 134.2497737713, 107.8649950212, -8.7918461736, -99.0628159937, -28.4975407702, -2.4658161692, -1.0354059017, 3.5152634039, + 34.3665501560, -87.6859371958, 33.3653060530, -45.7175591636, -65.4175088722, -39.9650581770, -57.8964432706, -74.5229831900, + 38.4192570282, -93.0015200930, 102.6189889638, -15.2156059788, 8.6020521359, -40.6649198594, 19.2140495475, 68.7122869639, + 43.8544891050, 31.8559705108, -56.5147934081, -76.4182242061, -20.7528009745, 122.9729619714, 19.3412487106, 119.2231188878, + -61.6916564137, 19.7466881922, 1.9628648319, -30.1476626231, 26.0368611826, -25.8750640673, 126.2461067518, -38.3759348959, + -21.1488548859, 9.5896772329, 60.6570721102, -27.1555851824, -82.6629073502, 104.2859535395, -17.1669088713, -104.6106452933, + -45.0398334945, 43.2080892320, -87.3425077484, 0.2033770682, -25.6876572199, 79.3659499889, 29.0973624285, -23.8554325099, + 25.8594825320, -65.7761031112, -3.5831773610, -7.5912426740, 98.1472561219, 13.1498139916, -13.6564623410, 56.9471294530, + 3.7663518315, -75.6123083481, 44.5806865445, -17.4609911479, -55.6387091480, 44.2177387420, 34.3752520512, 91.9930112408, + -102.4716789145, -40.4480770016, -14.7542706842, 80.9321121716, -67.9012532377, 74.2022584642, -39.2995936367, 95.8528505885, + 107.5716319470, 8.1259867727, 114.9534060173, 96.1080490303, -30.6405288182, 27.3131447051, -22.5066083621, -7.9447818944, + 25.6505787602, -67.1523588791, 65.7872616460, -3.3285011027, -1.1041085569, 74.8921702514, -25.1084011697, -9.7589516985, + 126.3993857146, -70.7299876677, -22.4069284847, 15.4150555050, 6.0494312782, 14.7172132463, -36.2348351724, -63.4858079910, + 8.2207526905, -101.4967633400, 12.1832438786, 49.7125534112, -99.3127122046, 49.9528617888, -7.3125598688, -22.6006580462, + -31.8424104370, 18.8121241410, -89.2005207726, -89.5613310067, 37.7746014303, -33.8940703850, 98.1050260145, 132.6754622940, + 91.4832076657, 48.9724771421, -52.3241324047, 73.9850811745, -139.5294058433, -14.1985477071, 10.6320943394, 32.9842589505, + -117.2355637537, -149.0942826923, 118.8257377105, 78.6561766800, 1.8467003036, 76.7457523519, 35.0575934280, 35.0405067972, + 46.3433191288, 51.5391456892, 43.1210412216, 21.6828221089, -24.7058117089, -83.9863281328, 7.1502359525, -66.4432335170, + -11.8942947461, 27.6420249691, 101.5285396899, -168.7093966612, 38.1892453170, 55.9668521894, 64.4854368465, -32.3167099392, + -37.5824582463, -25.5064561372, 107.2513163415, 9.6344685960, -44.9269370404, 10.4288908869, 46.7640176210, 33.7300219820, + 19.9212664361, 70.0213390428, -62.5237740415, -81.5465118244, -44.0793815204, 92.2566857417, -51.2000490212, 6.0091571611, + 30.8037109068, -44.7595662927, -69.6108606342, 64.6862483343, 33.1742048387, 55.9059849044, 66.4985799238, -48.2816133661, + -22.7185185172, -114.1511261421, 147.5147842854, 9.9781895463, 8.0732325157, -35.8047978931, 75.9079000901, -6.3144641143, + 13.1307658403, 17.7593379387, -68.0746602967, 81.4962779846, -21.2130737883, 4.1881456029, -53.3976620104, 73.0143978370, + -131.1048524173, -34.4396004841, -48.7367342675, 97.0896245872, -153.8743591626, 146.4347629539, -23.2984615872, 62.8412359714, + 12.5390587557, -3.5600971161, -6.8863206565, -43.5270424219, 32.9707655033, -103.0889331877, -64.0535042805, 106.9215904598, + -46.9078727795, -18.2192480137, -8.6225312780, -75.0230233110, 33.5402016456, 63.6373276750, -35.3286634556, -9.7322691960, + -104.9070709198, -44.8063768563, -10.2396474262, -141.5682333490, -41.9856066191, -64.5568181205, -105.7644577258, -34.3266130311, + 18.7442551407, -6.1736131415, -25.1300038952, 45.1470563965, 74.1676313724, -21.5064254542, 70.6267797692, 54.4904113618, + -35.0016926163, -36.8626539144, -36.1085281705, 126.4456731006, -53.4352000664, -42.3833008015, 80.0205785607, -5.8395042605, + -3.7163929006, 99.0418697430, 67.5450923850, -71.2740732169, -57.7639750215, 28.3495782004, -14.9114371149, 68.2395578146, + 19.9391412722, 0.3981730821, -67.6429500835, 99.3355729015, 16.5267218873, -63.2226829304, -18.9357631878, -2.8614372915, + 181.1332468568, 34.7347222636, -16.1060495743, -2.8148621786, -45.8170675798, 43.3943251920, 28.6117124005, -33.2361768688, + -38.5248849741, 49.6677439095, -220.2210251040, 39.4305879349, 66.5483442468, -53.8217192052, 67.6757901350, 33.4240885070, + 85.1809128375, 14.6803329701, -35.7116442076, -45.9462851452, 142.0722968061, 7.3538820438, -74.1993826074, -47.7693348567, + -3.3338017336, 41.8589920225, -27.7802513358, 81.0798842587, -35.2219569758, -22.2714108513, 20.5772883573, 68.4758687172, + 51.7089964364, 25.7997568352, -75.1742154071, 50.1290455164, 14.2169709710, 115.3455403147, 3.0734091132, -24.0080167664, + -30.0430862767, -85.1846499745, 19.4251899965, 66.7660313085, 10.4964191964, 191.8810766140, 44.1684279713, 75.7858859863, + 19.2241630741, -16.1074277656, 30.9051369625, -103.4147225746, -9.9194221597, -13.0669809072, -14.3302540445, 49.1519159556, + -27.2523237365, 127.6868804216, -85.5747904513, -40.1209192492, 178.0522707351, -73.6864713410, -36.6342055327, -99.8126854419, + -41.0696248653, 42.1245867015, -4.3161823048, -13.2747008746, 119.6002869940, -17.1335931288, 62.5993425061, 28.9992320778, + -4.5368180858, 1.2779053761, 27.7084888678, 34.8899603537, -30.6048794059, -93.8465401416, 3.3778313360, 13.8864217937, + -62.3784185879, 27.6165516418, 6.1885364328, -45.2772604479, -56.8928574665, -7.8629078173, 47.5072063672, -47.7279779449, + 116.3659358841, -108.7063603401, 6.8435296791, -4.2310899521, -48.8520623760, -42.6788172675, 28.7598264712, -45.5725981159, + 5.3364646966, -8.8259790870, 53.5478850699, -93.0251963014, 37.5833785601, -5.7207089841, -36.3899380994, 21.9593949993, + 27.8919793663, 50.0242670536, 38.7060750441, 13.4383538753, 24.3284938604, -66.6706972814, -75.0556788531, 46.8080800007, + -76.7685518979, -110.1823907916, 117.3556114385, -11.8794346783, -100.5931552045, -81.1814329321, -11.1946927034, 65.9117165560, + -35.0871947675, 68.9890931402, -10.8170265109, -76.6397320929, 40.0628004769, -13.8876229441, -47.6413458333, -82.9301597006, + 35.3601089866, -27.9439892787, 93.1557477015, -43.0973522277, -28.5635146727, -12.8419650369, -19.2552737753, -104.4730738934, + 51.2133027222, -80.4713372457, 82.8904666296, -32.8693411980, -55.1514350588, -32.3215790447, 15.3586714150, 56.6281953096, + -4.1845768663, -21.6039139687, 37.2300232632, 41.1966104813, -18.1197213904, -43.3281929812, -39.4358705806, -68.0037577582, + 102.7052778200, 1.1074295163, 148.3224324741, -139.1640107475, -33.1782275394, -49.4813361135, 33.6935341991, 57.7540768190, + -50.1484966873, 25.5452659987, -58.4535765464, -124.3028152080, 46.5749355946, 88.3984919306, 18.6343901041, 27.7237147347, + 7.4621558601, -45.2696342528, 6.2181991419, -124.4793150492, -34.3600196858, -17.2893599431, 10.3880081085, -34.6584762030, + 80.4621681009, 42.6698890316, 41.0028635312, 40.4584805162, 12.2993857558, -2.3438124814, -49.4434262439, 67.7382058590, + -172.5728037457, 78.5681808033, 93.0200717559, -34.3893038739, 25.4332764674, -0.3084790746, -47.0942986345, 67.8054627172, + 122.2738316110, -84.4716788862, -15.1596922578, 73.4104827953, -26.5231401219, 53.5433793756, 121.1802722337, -24.9087077008, + 65.6955157778, -100.0325133938, -5.4645525511, 38.8338919462, 38.6764256003, 7.4857563167, -84.0517801108, -38.0837770598, + -35.8795970303, 42.8800471728, 166.4026567891, -45.2596493921, 88.1539836076, -84.1569136898, -44.8705239205, -112.3135915515, + 76.9816499152, 53.5768624176, -106.3408650991, -17.9979586956, 81.7718580719, 144.1648782825, 45.2239065385, -50.2094826104, + -14.6605194110, 57.1970152560, -23.4826391767, -27.1562674435, 110.9001894435, 20.1915788307, 12.1467090660, 16.7983072789, + -34.1257273005, 129.1575417206, 71.4391384766, 32.9596044485, -41.1052127849, -48.0458686558, 0.8731114023, -34.4439480200, + 29.9076993320, 68.5240097999, 78.8047480081, 10.3252970915, 0.3515809390, 73.8823954039, 44.2008862678, 72.6737200450, + -13.3069689810, -25.8971947295, 16.9120909673, 53.2843809510, 49.1074875555, -68.1235965933, 13.6903318056, -14.7046510890, + 1.6746416299, -108.5007545621, -83.0295464360, -3.7524687555, -14.4088682542, -138.1935697707, -19.3679003715, 38.9142288940, + 15.4764570005, -2.9192486908, 43.9598275111, -34.5312517096, 35.8385011650, 4.4981476232, -1.4454488029, 71.1184852411, + 41.7476890934, 37.3368072067, 57.4916368307, -32.2735282446, -27.5080391474, 95.6899861001, 3.3351685514, -111.9822940053, + -12.5463248694, 39.8668835259, -14.9822708781, 66.9305141224, -197.7731587893, 27.4387742251, -25.6710982597, 13.5207634746, + 50.2848552534, -30.0418256053, -14.1615451430, 68.0658302876, -62.0642327357, 4.6615575342, -26.7572433532, 11.5079596851, + -57.9473530742, -26.1405191819, 70.4111692091, -95.7407842078, 11.2517762488, 100.2275069926, 85.3653529140, -24.6494053691, + 123.2413542720, 21.3040690490, -192.3747625981, 215.7057282840, -29.9835524152, -44.6302014167, -66.7559203920, 25.3479943282, + 126.6443711753, -36.7355336011, 29.0095532019, -73.2298015066, -5.8223869363, 11.9451128557, -17.3486371102, 50.0400958000, + 74.7145985867, -5.6976135921, -73.1829497279, -41.0455578170, -3.6001825808, 87.1662509692, -39.1602156793, -41.5727119025, + -18.2071856447, -3.5383471563, 28.3732842092, -39.9931298054, -100.6902365532, 130.2869328357, 3.2473773399, 16.8387727072, + 62.0055283576, 97.3165730637, -40.8530624130, -12.0491532592, 88.5164060609, 71.9344891420, -69.7440181255, -51.2866033193, + -18.4687017548, 55.7346964760, 4.4872782938, -6.8942183136, 8.4263132246, 18.9149616636, 58.8710265459, -17.7415034047, + 5.2927869482, -20.1947447871, -36.6005304743, -67.2193634013, -72.8315856033, 139.7216799221, -2.1966369437, 83.5189402317, + 56.0625496338, 57.0100118287, -9.0542670182, 58.3126231383, -27.9316577822, -125.8146267036, 77.1179593561, 99.1690581411, + 7.9703321651, 77.3501770612, 32.2815633360, -22.9643212257, -19.8653554993, 55.4837678464, 10.8929872542, -1.2452363726, + 83.8477026208, -88.9116003335, -44.6537617432, 11.0099195187, -33.7736999447, 44.2766753802, -27.9436876110, 16.3088473703, + 45.6564921145, 18.9199921114, 77.9125802822, 11.2795611793, 42.8571148149, 32.4846418196, -2.4014655924, 38.0598657284, + 86.5222537258, -3.1333316838, 11.9141807475, -2.4712869557, 47.8938116812, 35.4899843246, 42.7527497689, -31.3225362175, + -6.6842304948, -133.5691427053, -58.7043550030, 73.3503470631, -21.8739658759, 70.3809855428, 54.6113598087, 9.7384709498, + -141.2343505501, 27.9788413890, -11.7574685128, 43.1029141674, -52.0045609619, -83.4803133516, -57.2548505744, 52.8114424452, + -30.3458066567, 39.2081027670, -49.8609769923, 68.8871987820, 45.2005862545, 21.6377482234, -9.7576398020, 6.4878505019, + 32.1853134925, -25.1448500950, -67.2234044003, 103.2446765175, 80.2584971166, -68.8710032588, -4.2141933840, 23.7223935599, + -35.1939439880, 63.5237841071, -34.7833780059, 74.4175406287, 83.0373073374, -28.9674699605, -55.2233708526, 64.2239365944, + 6.0025041292, -22.2149197781, 29.1954442931, -35.5058495139, -76.9452133862, 34.6912996871, -51.1833830895, -49.5201882461, + -7.6144484864, 116.8549382108, -51.5005710672, -20.6783396225, -97.1232859994, -6.8466290384, 59.0410141864, -58.4613374526, + 74.8248237895, 75.2714612487, 23.1797286361, -2.7866665487, 56.4240759131, 60.2417537402, -73.0762506733, -136.8520754748, + 27.3836498800, -29.4294016791, 58.2863141991, -15.7937240880, 12.9792729458, -28.5369095369, -179.3559659693, -99.4879434608, + -61.2402838269, -24.4763496292, -22.6643525306, 24.4590321501, 98.4299041736, -4.5624798871, -59.3191765161, 139.6951240672, + 27.1672202072, -70.9192843433, -18.1408458038, -71.0174628677, -94.0725395768, 36.1985844031, -3.4636448040, -39.1453082944, + 40.5244522827, -70.0489070024, -63.9181488122, -4.7099187837, -33.0844286599, 31.8161456785, 10.7843286816, 10.6387816259, + -76.2043252282, 57.0254136124, 151.4166547223, -50.6728456416, -82.4408455004, -55.4932097322, 15.9101565878, 15.2777050730, + 25.0235583008, 44.4425994137, 36.1343164402, -24.3058262644, 17.6630395266, -62.6364549232, -40.1045046999, -3.8451609954, + -107.1141779059, -50.7347331775, 90.5704587068, -59.5674315899, -23.9371281478, -59.3738147851, -29.5056040676, 26.2990433281, + -33.2953407976, -92.2663237623, -25.5442696217, -81.4532880743, 42.7268859073, 75.7986045911, -31.6772573595, 86.8684653590, + -61.5786934151, 32.6176822340, -23.2321244436, 64.9301578846, -6.9691761031, -51.6553861957, -35.7877314260, -41.7444743167, + 108.3757802905, -29.4164640263, -18.4714648512, -82.4131988957, -52.9499171074, -35.7687451877, -80.5212521683, 40.1558185933, + 80.9139882507, 0.4170638335, -52.4487435334, -69.0227900586, 55.0806458770, 120.0318572894, -11.5435935376, -19.2791170530, + -3.0257623065, 99.3958103659, -19.4539047939, -54.6600691116, 0.3603986276, 9.7863628822, -6.2358897021, -17.1143829423, + 7.9650683489, -27.0465697723, -45.9436029022, -36.3352947671, 138.6511673472, 47.8115852675, -10.9612291181, 3.6500932948, + -19.3477824988, 28.7386285394, 36.0065971791, -43.0822654618, -43.9342369010, -32.1210042559, -70.4441432492, -94.9421856551, + -120.0449164046, -65.9803176675, -55.4329926958, -19.2914305328, -89.4078846739, -30.1962221428, 61.2293835442, 93.7229961578, + -8.3020564344, -6.8386266801, 21.4975406760, -15.0903918291, 94.1044891682, -57.6380884034, 16.2327931770, 1.7957525957, + 74.7073719610, 26.8908104028, 76.5155513347, -9.6822139478, -8.0655893270, -48.1277441855, 9.8408952157, -58.8121626519, + -80.9751650730, -48.3302191201, -27.8207839032, -46.1625778067, -33.5567739103, -109.4477338693, -168.5366005131, 156.7874587017, + 8.5940307118, -21.7826451231, 12.4113841726, 86.7850811554, -77.1019195511, 32.3109085681, 86.8849726762, -41.2571797820, + 19.6006773321, 31.2507123002, 41.8106047980, 101.5445768198, 51.5335715773, -185.1354355374, -11.0825031251, -20.9631685642, + 111.1640505949, 162.0618916128, 3.4498453592, 44.3198102843, 0.3505982148, 21.3783009799, 24.6853218910, -20.3399016930, + 59.5923416012, 79.4334110932, -78.7723219668, -47.0670061218, -128.3114982420, 92.4340029556, 69.1584534808, 114.9437583487, + -64.6124706594, -10.2486262273, -1.6622261589, 50.9747480555, -8.1203432808, 32.4414442459, 84.9091411511, -17.9846748341, + -14.7172591486, -27.4203006303, 167.1594042893, -25.3372000386, -27.9888042652, -3.6956600039, 117.9111608126, -25.4132038904, + -42.2923300579, -95.1602974120, 19.2625367900, -15.8766055664, -8.8117613783, 1.1964763941, -111.4791843369, 81.5745053342, + 8.7527287102, 34.5972180603, 83.9461794412, 50.2350993915, -19.7720255327, 53.8516694944, -104.4119088056, 30.4513918056, + -62.7649123620, -29.9513577664, 7.5719075796, 61.4944149393, 70.5737863978, -40.0358428522, -17.3629194898, -10.7304848224, + -60.1358805635, 46.5402792333, -77.1330673251, -86.7606311649, 22.2000151841, -33.7006112473, -139.9917432329, 138.1567785372, + 18.7396823616, 28.7669927272, 28.4680008506, 7.6199316893, 121.9175024680, 32.1111318802, -58.2808504609, -30.6563801124, + 44.2365370915, -83.4728239003, 64.0531120026, 128.0019381122, -40.3205961091, -62.8035436979, -15.6689887241, -6.6975189783, + -46.1591606362, -42.4253060115, -71.6473279718, -75.5337463898, 87.5058573621, -66.6145644703, 87.4635891068, 123.2852237793, + -0.9887550633, -9.6307226422, -67.4478350330, -86.5892204275, -79.0537798176, -107.7863332665, -8.8330234138, 38.9605563706, + 15.3133829507, -54.4231514572, 26.7406100788, 48.7962706395, 27.1443310148, -2.7894277223, 7.1469114703, -57.1657209995, + -90.4215183139, 76.7797176290, -19.2239853483, -26.6041739391, 139.0298606143, -36.8837362822, -57.7952841108, -135.9897057237, + 4.3453829113, -5.1660378716, -58.7046205842, 58.4176557979, -120.5866252228, 34.2409281832, 105.6219016158, -28.5323871865, + 11.0598518159, -26.3069115094, 87.6681723683, 70.9393661419, 54.7982850455, 4.0477327154, -89.5568838538, -32.8993562613, + -45.6708773935, -52.9428269719, 14.4126898406, 39.2142079784, -92.9447367684, -23.6977408094, 8.2507547267, 77.1071852874, + 24.1675316234, -159.7349628761, -13.9551749672, -67.9761692092, -30.0410317845, -24.6060572570, 52.6662467162, 53.1957816963, + 16.7992222346, 51.7621999618, -9.2959681635, -22.0395789118, 63.9887836127, -15.4794522124, -59.9041019732, 0.5489176194, + 78.6395685166, 134.5366929272, -6.8712023878, -25.4182816023, -94.3014920612, -120.7349462621, 15.0267811895, 64.1156824538, + 72.0730568718, 36.1969392849, 37.8409183719, 23.2904067106, -65.2310984397, -174.2644489990, -19.2228520790, 27.4717232382, + -59.1645079992, -37.9473607579, 49.8799507321, -79.0510884528, -28.3803465367, 20.3721781567, -0.4261835910, -35.8489167205, + 105.4583901558, 59.5722685004, -61.0197468314, 31.9348090719, -71.9443219028, 58.1935525762, 24.2368907755, 11.3281193558, + 73.7442066031, -58.2463274873, 62.2364089748, -22.1662416753, 80.8054311590, 1.1123457543, 65.0742762981, 34.9247990206, + 104.0897515469, -17.1726872127, -55.1967923359, -17.3070263921, -113.2466807440, -34.0273063199, 6.0065175641, -73.2050951521, + -46.9298900117, 42.5522795079, 89.6038769626, -13.3758161339, 20.0379230047, 44.3053936382, 38.7871513797, -96.5643124661, + -164.2750976118, -37.6742328774, -20.7444978754, -57.5075374112, -82.3747950875, -148.0525559565, 23.1385046849, 6.3810748790, + 26.2079771260, -76.0359611120, 49.8590173195, -55.6975098542, 63.1577456002, 131.5982420723, 46.7778921481, -60.9806982634, + 71.7495044841, 4.3127212188, -17.6552774593, -32.8038637189, -77.8751385740, -38.0621029989, -10.6340276560, 16.6596173712, + -67.3032141305, -8.7994716202, 50.9412272541, 49.9717453353, -43.5703597564, -49.6853674924, -95.7205166501, 40.8765465419, + 14.2287448407, -27.0614166095, 38.0714114583, -35.8412172130, -78.5197707657, -25.6825367235, -0.3120778923, -13.1591053910, + -13.3423425539, -88.8689993653, -141.9490353220, 15.3348435554, -1.2351271212, -12.5689032236, 63.2692606259, 92.6940600989, + 30.9761753348, -14.6354581107, 50.0664499041, 22.2230304376, -128.4011635209, 26.1869851104, 8.3304256738, -46.1344839419, + 68.3461812478, 143.4759863425, 163.6742650341, 55.1856555010, -60.1365810845, 74.3895957960, 40.2227984754, -11.7394255168, + 55.5453683738, 15.9202002202, -113.1213822368, -85.7280046039, -39.7263088573, -2.5339105246, 41.0492866970, 45.3079876954, + -99.6701239491, -29.6980232319, 18.5340063985, 51.1922973890, -79.7372970167, -13.2393250851, 14.7419728226, -4.8211133780, + -35.5172595564, 99.3966537203, 20.0590181900, -12.1081446475, -61.9594867060, -72.2256752476, -13.2936631274, 128.5345002108, + -71.9401693778, 31.6533870911, 50.8594991278, 25.1808453324, -33.5538293275, -42.3935228996, -20.8053274690, 16.2131527996, + 118.9172555234, 89.5930952748, -65.8274795934, 47.3384633282, 122.5406901256, -66.7549348343, -54.9185037426, -68.6601805746, + 34.4675543582, 104.9323617738, -57.0880010038, -43.1248502597, -2.0601370211, 44.1682882967, -89.1023577428, -35.5506312941, + -10.5170036504, 9.6779403375, 78.9291026934, -31.5855420521, 92.7949646880, 31.3559964123, 12.3617000392, 69.2326522660, + 3.9119449943, -36.5330788106, -44.5936841393, 45.7052258609, 10.6224387668, -24.1159570162, -21.0651270325, -84.0415379963, + -130.5857682422, 13.6064059568, -33.6699927959, -26.0082360265, 29.6219265142, -47.8318612795, 19.0742065634, -52.3410098996, + 32.2488186667, 8.7112925773, 68.7336792115, 23.7944448682, 99.9050365463, 8.6093548114, 59.7174217811, 23.0796589837, + -113.0722961466, 3.5971633707, -6.7890993972, 30.6764504710, -41.1295367209, -24.9164165484, 99.2386401122, 113.8333026527, + -38.9562599796, -55.4108562109, -94.4601804558, -31.7511549793, 200.3462283262, 12.7517487160, -42.3353937717, -51.1991446233, + 78.8520856510, 20.4131030912, 21.8102532347, -51.7944815361, -21.2191019005, 33.8300001131, 135.8377663961, -31.0221091170, + 65.7730407411, 82.5117419278, 27.7816244812, -10.6724454248, 26.6179164033, 64.9214169340, 44.6475686302, -29.0683019634, + 2.0965746914, -10.0085359932, -29.9021362947, -38.5046703557, -23.5486473509, -44.4560504617, 7.4417079380, 47.2393973843, + 37.7344798725, -13.6323296763, -28.2713540400, -12.2494841889, -113.6616109440, -4.4061813255, -84.4155850685, 18.2000114801, + -37.4375420019, -15.0025190330, 33.1826857536, -7.7672966949, -41.8570537108, -61.9447815201, -20.5430470077, 42.1225812423, + -4.9372231166, 80.1718433860, -21.7502429381, -107.1994683407, 39.0450370860, -13.9605768571, 57.8271065756, 100.7288025395, + 106.0257089013, -94.5099462535, -52.2425831475, 3.4251117300, 37.1163293092, 20.3088713026, 27.9957748777, 55.5881357120, + -49.9425573612, -74.3122437274, -45.4384442770, 28.0519415044, -57.3995353506, -34.0343398092, 39.4842857378, -29.4934441942, + -42.2931922612, 75.5085698437, -9.1579964746, -88.0001960638, 32.2921191297, 130.2295801645, -77.3690707106, -26.5699179687, + -98.7746128367, 15.1111986863, 84.2856839075, -91.3321816766, 75.0539365102, -22.9577135979, -58.2687890669, -16.4158023440, + -143.1190919220, 45.6864012367, -148.7549620241, -87.1075640764, -26.5968533502, -69.7944158144, -34.2978456494, 35.0769663698, + 4.1465107386, 69.0864439105, 22.4789950234, -48.0182401768, -14.5783104039, -61.0550243844, -4.2380948973, -194.8804104528, + 123.0819765947, 48.2017401505, 78.9508457466, -99.9736614294, 32.8340209984, -1.0245301508, -17.0041736706, 35.4641249127, + -33.3575407148, 192.9072183682, -42.9604868802, -51.0374996711, 77.1464797096, 66.0548981845, -61.4282764621, -114.3126571027, + 21.1118181552, 85.5335633765, 27.8488718530, -62.6421354515, -57.3557048619, 41.6670106942, 16.8928119140, -40.2432649132, + 0.6390713008, -10.1237727904, 52.7534146685, 2.9801643945, -11.3804175086, 119.2039503951, 46.6809821778, 84.8768259311, + 29.9865105951, 57.8288066379, 107.2625212828, 28.1456885969, -120.3755566725, -17.3802551503, -40.0564653651, 56.8407045846, + 1.6793816918, -109.5072716396, -52.8897837730, 85.9453300669, -20.0298903469, 52.5871200627, 13.0362762617, 92.2325099999, + -6.5198193020, -83.9036654607, 58.5211535567, 81.1131330707, 57.7324249784, 126.0368845782, -79.8586002513, -127.7584493863, + 64.8736188900, -10.6521288269, -0.9851623286, -92.3945133485, 7.5244215841, 40.5886593287, 18.6445609457, 19.1117310556, + 26.5640714899, 22.8091685027, 94.3470412324, 61.6764800801, 10.8760679684, -7.9240673383, 12.5919458396, 85.0254983280, + -15.7186492832, 30.3331627482, -136.2555384486, 14.2342767573, -52.2232864172, -49.0105238845, 16.4028777072, 13.1934114315, + 67.2005286948, -11.5431941527, -126.8761059118, 28.4325197274, -5.2730565073, -154.2913406142, 83.8362133106, -13.0557850235, + -24.0425722731, -9.3049739156, -91.4408491189, 38.7967852392, -54.4364475655, -50.1728478153, -91.7628978624, -92.4046791871, + 72.6594194204, 36.9149973552, -89.5520370642, -73.4541912166, -83.1026853287, 55.8083893384, -11.3360468605, 8.0892870502, + 21.3963536134, -27.2804196146, -86.1680209134, 11.1581691823, -68.2490961721, 63.5960852067, -40.1782672381, -50.7929323122, + 2.4820154810, 35.6921504427, -75.6795637705, 8.6054661804, -31.1168448045, 109.0955889455, -76.2488069978, 5.0199927782, + 37.8749455521, 5.6982241556, 27.3294929004, -120.2473221866, 7.8826650171, 111.0369524326, -43.8497436507, -66.7312430666, + 97.7440071817, 49.1570048378, -117.8025876335, 168.0477524482, -55.9600221068, 11.1068434425, 14.0513599858, -47.4087780504, + 100.4504374216, 6.1074714956, 53.7678384486, 24.4635321166, -6.0835375669, -64.3592936645, -25.7780083698, -83.3530662624, + -124.9544432106, 37.5615380015, -19.2986773913, -110.0015552689, 121.7589202263, 4.3256928319, -101.6571157133, 85.6785418597, + 16.0474362836, -31.9024530060, -52.6323741801, -3.4440544641, 77.7351607744, -10.1741553840, 48.3997106271, 1.5020725442, + -0.2257709330, 68.9623795901, 9.4286729097, -27.6379770488, -3.9912724152, 44.9954087833, -18.7057514605, -14.7638693232, + -1.7397189655, 68.2217569488, 63.3439223434, 38.9512814941, -25.6642624084, 54.1881119719, -92.4999870174, -11.5788876807, + 69.0279357511, 55.8205676574, -101.8852049100, 30.7429453237, -58.7382928803, 89.3969596003, -44.8903243228, 2.0422419096, + 41.1330103123, -88.6692130110, 25.4298182542, 0.8899898304, -53.5428328048, -11.5755725623, -28.6132997670, -13.0337245663, + 52.8092078154, 0.0517964686, -138.4959804685, 31.6788581756, -16.6154597478, 156.3340569922, 93.3010192905, 32.6407669098, + 112.1297440517, -35.7144834638, 6.5534121327, 128.2382195529, 56.9609192462, -52.8328776011, -65.7950928061, -13.3541979410, + 34.2814367341, 26.0764152312, 52.6477198183, -121.6672795964, 53.8959085384, -64.8464505733, -6.6989481273, -164.9991018529, + -12.9977296783, 92.2198340788, -58.9488062177, -17.3136354080, -15.0065268104, 82.2346850297, -52.0081326057, -31.8754548129, + -36.3987954967, 53.0154983421, 27.4015508471, 32.8268124997, 113.6916804444, 27.8095494681, -55.1665416696, -16.4156645469, + -42.1439424759, 38.5634363918, -64.9312441199, 8.3884871895, 32.9516167667, -0.9395063314, 58.4852381959, 101.7397916741, + -104.2729685077, -14.9331020781, 64.4379817410, -5.6149495442, -69.4590669042, 128.5957740501, 61.9917796337, 0.5819416032, + -69.7790071374, -1.0381159167, 20.1469541660, 13.3351412916, -104.5227876095, 77.5294242919, 38.0641940199, -56.7585742367, + -9.1765854459, 40.3713276531, 72.6358559436, -14.4449566608, 40.7675499413, -93.5568526062, 55.8238199978, -57.5895140577, + -82.1737195067, 14.7561780278, -155.1331660454, -3.4741158421, -90.9790829737, -67.6576031648, 58.4505812875, -127.2647404391, + -52.6551154593, 21.5600272148, 77.4232312163, -100.1093952602, 50.2042564606, 11.9885332900, 34.2641380301, -51.6644779651, + -14.4960161445, 67.8496081597, 25.8195812544, -38.8690931971, -116.1556251224, -68.6610388123, 64.4060064748, -4.5039590319, + 45.4866635009, 60.6472857766, 121.0539185194, 4.8340889914, -37.3668396220, -52.4747123096, 7.6362446201, -39.8862759852, + 8.0139163506, -19.7768070929, 55.9705429761, -77.6639159836, -9.0747973730, 87.1299271010, -56.0307413158, 22.0261066362, + -21.4877846313, 73.7508019333, 90.2727567859, -31.8064851485, 35.5698971534, -123.1337229178, -115.6888113061, 40.8859379019, + -45.9826093754, -55.6481101801, -131.3553753176, 30.0527360996, 21.6632646479, 98.0105924807, -39.4117175619, -101.5958309784, + 2.4560883180, 47.0714688572, -30.5516644873, -123.2193558202, -81.2276105808, -35.2333787774, 131.7553150138, 74.1337100485, + -111.0162621392, -50.1520236082, -176.7180780270, 43.6099370000, -99.0730647751, 100.6783161314, 1.5420581129, 2.5889162904, + 97.2407277690, 5.5204254866, 72.0939017458, -100.0077732933, 30.1572971400, 19.1994437619, -83.8095901131, -67.5983524523, + 75.2270686194, 80.9252084407, 42.4611462166, -75.6376932185, -7.5820680566, -47.2137370820, 13.3547714942, -49.2227272764, + -101.2311839023, -89.9953284490, -59.5627585772, 3.5045401284, 87.8927289585, -45.7826497344, 10.7894222301, -34.2218214372, + 19.0101005894, -79.7412295513, -40.7129535835, 34.9745871635, 98.5275860299, -16.5088968676, 66.3460699225, -133.5365249144, + -41.4407293928, -15.3419046733, 88.7195803357, 5.1871004832, -98.0467809656, -14.1239743026, -1.3510821103, -38.6189020004, + 114.8822422747, 65.5094003215, 88.0532368083, -59.2540330178, 92.9429540023, 21.9133947331, -50.7728654894, -36.7011682133, + -16.9217654808, -110.7749962658, 16.6126865137, 116.3641432033, 51.7192473353, 9.8619033750, 57.3047648863, -21.0275512361, + 66.8618463429, 68.4016463402, 13.1978892272, 36.9294559769, 79.3415169994, -74.4235076906, -105.9928928366, 3.5485737877, + 35.3701917014, 11.0155135724, -42.5279468110, 57.9138782373, 32.4492657117, -2.5260836533, 8.2835364235, -45.2229140182, + 29.4655763679, 20.5830184405, -92.7731928028, -88.2155574314, -13.0181590718, -67.4752432987, 12.2964799268, -134.7795554776, + 132.5177768161, 86.4796490878, -170.6768976365, -53.7059277336, 23.6295211743, 100.0865623366, 134.6726479190, -17.6813528616, + -67.3925719582, -12.1986138778, -58.6920640259, -46.1769630250, 14.0012237071, 105.2386807000, 47.5923010830, -13.0446195549, + 21.4905427079, 89.4924853541, -1.6294776664, 7.0507819885, 88.9962812504, -14.3836298512, -14.5755536250, -158.3719830729, + -71.0421641105, 9.1510759791, 3.8541666430, 46.8853635172, -115.4505016964, 112.1915084832, 60.0579773251, -19.3568210670, + 134.6457467896, -127.7704101409, 96.1687814173, 139.4223376055, -16.4889074247, 8.7407981479, -31.8653460842, -86.1989364296, + 6.3138143769, 29.9691806857, 10.0215115097, 21.7539979367, -10.0119096873, -32.7662562735, -46.7114278488, -32.0468371287, + -104.9863919627, 164.6868132811, 14.2837511902, 103.8122395985, -38.3195610630, -66.2071289114, -42.7348265210, 8.1247796770, + -44.7642634909, -99.5977533202, -62.5669299697, -154.4713244845, -54.2004565831, -21.0505396466, -7.2304668445, -63.1457522254, + 121.1292664630, -41.2451342849, -100.3661302819, -79.7893865863, 2.9782522632, 28.1233518579, -45.4712133921, 102.1080223649, + 64.1668281113, -103.7410276784, 106.7427715753, 79.6231477604, 20.5960195618, 42.6351844699, -8.0432553021, -20.9274320455, + 44.7322739383, -58.6239231825, 21.5430765926, -32.7159508398, 56.5825012360, -99.4275633192, -102.9101109727, -83.9315736318, + 25.8630456141, -52.7504372152, 29.5673565938, 48.9111232224, 41.5578130085, -14.3606917295, -2.2040972437, 94.4661907548, + 132.7457583187, 55.3945646514, -16.7731026022, -46.5710214158, -29.3542289267, -14.2923094674, 23.0425873685, -15.5814746488, + 22.3570974017, -42.0180359242, -20.3430155274, -68.6338886669, -64.8088612108, -24.2988048174, -23.5299375491, 98.0364255786, + 3.9778504115, 65.6849914578, -1.5168129555, -4.8287346639, 142.1453945317, 78.2378704371, -57.3720730586, -19.4585389336, + 76.2735042603, -43.9459949675, 6.9426433355, -43.1451402122, -18.0751403348, -34.1054109171, 55.1204864738, 115.4516445351, + 6.5333541873, 62.4906581904, 29.9692177776, -33.2287635647, -18.9268908378, -63.0926292852, -111.6323734820, -10.8864814281, + 14.4649132510, -25.6871888082, -33.4308400890, 23.9756688469, 52.4567038054, 12.8701945894, -20.5116135858, -17.4241576687, + -11.8606594870, 16.8816614097, -18.7270784248, -6.2425768906, 48.5175154819, 1.7426978337, -99.3023967479, 38.5650914417, + -61.0127172140, 42.7784858845, -7.2257854969, 2.2847466905, -99.0066793854, 60.4060120207, 48.8064141188, -72.4258965295, + -50.7390478551, 95.1299230407, 56.4763356354, 35.4471698843, 60.4632441624, -95.6600449901, 55.9445226564, -28.1942324306, + 26.9826142327, -71.4404566440, 15.9270065277, -86.7110877229, -80.6677402549, 0.5529947734, -39.4989884635, 35.7914768080, + -22.6398243670, -33.2598314085, -25.7467291233, 16.6863716736, 80.3468995127, -22.5068845945, 23.6096621616, -99.4288845571, + 29.0662266127, 3.1265642936, 133.4725188269, 10.5889496669, 78.4289320034, 46.4143031925, 97.1026760967, -60.1768585008, + 75.4045199491, 14.1399143092, -87.6608741602, 96.8571208381, 36.1952990642, 119.9462706822, 51.7941617293, -10.8814477399, + 66.0010885597, 68.6769630212, 70.6032262575, -78.6614013388, -52.6711668148, 29.9772317807, -67.0938602216, -42.3207515671, + -0.0486165038, -15.4758823937, 56.6129710458, -54.2575866392, 111.9253009797, -47.5236184222, -95.6434531533, 24.9411667600, + 35.5636297407, -11.3487509511, 99.6377899302, 16.0125061627, -35.8881400079, 111.1220549938, -2.9395719970, -41.6388550114, + -33.4638181727, 109.8808145106, 28.1021441950, 118.2701610217, 51.8151816796, -19.5803207598, -89.9262515893, -26.6044307189, + 40.7320823989, -19.2602062235, 62.2560193625, 85.9346547334, 49.7871555519, -20.0313162309, -8.1831982988, 69.5820284092, + 49.2993116756, 34.9185452172, 74.7523126024, 145.1939754190, 7.4232669832, -4.5344572697, 34.0472547752, 41.4294110612, + -123.0758971920, -43.7705297332, 121.2820069260, 0.5435048718, 77.7764299214, 59.6928983371, -27.6522675298, -7.1273383508, + 26.7210269180, 4.4630452796, -81.8607570684, -26.3402136551, -95.7197230242, -7.3219091557, -82.4289458596, 77.4381232638, + 65.4006110025, 36.5844708644, 66.3796224839, -11.0118557858, 61.4481921771, 8.0694380153, 59.4652425227, -24.3765004167, + 4.9649042432, -28.5624154309, -78.5623599502, 17.8514494843, -20.9756518143, -10.1916814040, 11.5732283207, 57.9552418906, + -45.7612949110, -20.9482951666, 36.8160063004, -45.0567155877, 63.7098701462, 6.5938197429, 46.9692949757, -83.3299455774, + -88.7653437148, 118.8655843800, 93.1921951705, -18.1354337452, -40.1074391033, 44.0852297241, -41.1588703642, -105.1428083912, + -7.1420535313, 66.5491789931, 28.7643638361, -71.3690563573, 50.9039393300, 93.8257368698, 22.3478174946, -109.6001863096, + 64.0649017243, -29.4574274496, -44.5473845748, -132.8280128599, -52.8587533053, 80.0084510351, 21.4678106815, 48.4383573310, + 56.6158184924, -72.0365616804, 12.9911383411, 162.8295288963, 55.8780535954, 73.1821757559, -100.6826313435, 23.4262138290, + -0.5753332881, -21.5175209047, -138.1106268547, -80.7925993001, -28.1663114958, 0.9831816192, 30.7923417673, -51.9827613979, + -10.8794388756, 54.1022652480, 11.1686073161, -44.0592484786, 21.6987012718, -42.2412255611, -3.4936004646, -51.6421714543, + 15.8711886614, -40.0043968804, -6.1590232957, -65.9457642489, 59.0569838977, 7.4295907490, -12.6833895574, -72.2928299923, + -199.7835511043, -71.1580901042, -12.8895530614, 13.8448156167, 27.4808788351, -46.2542221592, -3.5153348434, -176.2019445127, + -48.6783165219, 70.2296726615, 111.7340160335, -60.7655899218, -138.1081385724, -35.3974788626, -65.7355628000, 57.9555341829, + 13.4670930872, -79.3318328665, 36.5016341422, 27.5574278118, -35.4004898428, -79.3903940148, 243.2421421265, -8.0268453199, + 44.0174931524, 68.8734465340, -80.7502038529, 1.3409036386, -86.0777878831, 37.1475406267, 18.1068167023, -56.9153447361, + -19.5224115764, -78.8474074897, -20.0747255852, 4.5850719720, -191.0686482737, 23.5318026769, -32.6675253287, 27.3087304829, + 31.4351407465, 19.6192337929, -11.8866458644, -48.4661089981, -3.1226120347, 20.0138411382, 29.8813799560, 67.9558437137, + 38.7174108080, -13.3022284820, 27.1121047281, -26.2954327750, 120.9542179193, 11.0555865630, -34.5895364072, 73.4542523467, + -26.6956937208, -108.0235037857, -35.7355716826, -69.8443555160, 33.3578766421, 26.3683815560, 97.2883332520, 133.5510498515, + 35.5415284008, -16.0495119378, -19.5483270675, 93.9985201088, 27.7795159179, -13.1059263368, 34.2311271533, 47.1466381795, + -36.4147469783, 10.4833119779, -5.2292656110, -25.0113244760, -14.0549947152, 199.8348526048, -43.2547698686, 98.4817969474, + 37.0586206693, 33.2121561269, -24.7170470026, -37.1349105091, -30.9578044903, -7.4114930133, -34.4807046142, -27.7773696385, + 29.2740921831, -61.0686554741, -32.4612619459, 6.7160769792, 3.1089599122, 12.2545595923, 62.6999428463, 30.5969686709, + 11.1423411573, -57.6502489731, 60.2408835918, -67.7203861906, -44.4518971003, -5.1109945114, 5.6528645074, -43.3456968092, + 117.8609487802, -24.2034537544, -78.4496201847, 44.5294780988, 85.1475013837, 15.5247701555, 89.7512668950, 54.3013774517, + -186.8510627600, -51.0482727175, -9.0267702018, 48.0681416363, -32.9759681266, -42.4456615266, 36.2738833817, 14.1610476535, + -99.8207994579, -11.5142692827, 50.1825860327, 0.3917737329, 63.3500370315, 111.2878444719, 91.6392406660, 17.6584451589, + -50.7899615175, 12.4221556654, -86.5413087906, 48.0563389410, 29.1384649619, 83.5027000186, 7.5729436929, 22.2136423571, + -60.2741473997, -170.4857658702, 17.0186844162, 136.3581532664, 31.5065683845, -96.2326886411, 72.4014182257, 26.1414887396, + -57.2844089463, -43.9781986370, -95.6611720182, -133.8830434822, 33.4938269182, -23.9156927559, 35.5520154186, -93.2468099373, + -6.2162527113, 4.5642492223, -57.5722591446, 71.8064120226, 45.1768685505, -9.5130102236, 110.5798720279, -41.5641619544, + 0.1835509076, -49.9128593949, 98.0154257393, -46.9365276597, -66.0935141873, 73.1727792846, 41.3353795661, -27.9960128980, + -44.2412816343, 46.9707404231, 12.3575979804, -122.9770710291, -11.9552135499, 31.4591712664, -14.1931325058, -6.8614191170, + -16.9763787814, 36.1520894392, 75.7352320923, -99.5121191729, 17.8024156510, 72.7923924404, 38.2259409765, 1.9325379601, + -11.1978607868, 98.2703853998, -38.0288299607, -41.7008273041, 80.4517499854, -116.8258848759, 30.7289872645, -101.9012423077, + 93.9831977796, 101.4530665010, 9.2763209169, 116.4425755502, 2.9739225298, 45.5019124654, -64.2956140887, 105.7408745662, + -11.3657606620, 6.3069096678, 122.8709609828, -6.3248578668, -60.1760116205, -35.9544630869, -68.0834090495, -34.8224305999, + -31.5069839788, 21.2614258718, -23.5546199906, -128.0293305211, -182.3893947839, -120.7110714918, -65.8822590864, -63.8215221762, + 56.7670203795, -61.2037205962, 3.8122259155, 1.0275735300, -64.6391642695, 75.8652993596, 115.4068637021, 46.8849792653, + -39.5505124775, 33.1187321149, 25.3372286880, -18.5375942960, 30.3953994229, 21.8836680766, 13.9924166006, -109.7038947262, + -24.2899011732, -52.7497505668, 35.3698361783, 34.1056231420, -13.8686663216, -1.7062295227, -97.5362177027, 74.6544677369, + -78.3935767846, 35.6517853160, 51.3830818724, -93.7778131463, 81.6700292143, 126.8070312922, -28.4470816468, -71.2638167545, + -55.2884800428, 9.0861240716, -128.9083303383, -16.3800803508, 34.5467745617, 28.9315662137, 84.3386694814, -1.7523953786, + 69.7727914393, 44.6546611575, 90.9897326057, 121.8059195607, 28.9429876729, -14.8591127934, 29.2818722570, -84.6318423838, + 11.3290830564, 40.7084140001, -50.5878424847, 68.2992258419, -24.7150040711, 41.8365599450, 104.0111319954, 70.6981835472, + 56.4709262168, -20.5343182666, -16.1886023808, 101.3482649415, 108.5356887852, 24.5240870510, -146.5152615985, -24.0194234128, + 18.0331846295, -5.1522407439, 4.9573388243, -34.7877468646, 39.3333900199, 31.8580232326, 111.7915751739, 15.3919610203, + 17.5179415363, -22.2065299595, 31.9496951848, -18.7368015481, -78.3621490938, 45.9954796476, 77.7231064126, 21.7258618723, + 23.3527631711, -136.8686653828, -22.5773174812, 33.6615614603, 4.8540113479, 3.9088571058, -54.7099788715, 85.8089519875, + -86.1460475251, -0.1247811474, -146.1793416666, 124.6659345147, -60.7858975441, 10.3154193265, -29.5514280889, 9.4667237048, + -7.9550953683, 37.5451209024, -27.1735194003, 46.8842847809, 41.9179936640, -23.3158010522, 157.3009890625, 113.2843306932, + -104.1727731788, 123.3854503767, -5.2055501860, 27.9879059133, -13.4163698144, 52.2833141248, -129.0969704337, 46.8881212895, + 131.1080768010, -19.0213767099, 155.5021671973, 20.3698150937, 37.2314029160, 40.8492644144, -35.6880906860, -31.7697839101, + -24.3255617048, -26.5610341544, 11.6187963194, -51.4990517524, 39.7825587179, -54.6696763219, -3.8497258220, -70.2342476864, + 4.9081928390, -71.4654689380, 30.7344594349, 32.7496322701, -90.9126087838, -38.3652430128, 92.4042844207, 47.8082836295, + 145.6802813070, -18.7426859824, 17.6059584845, 36.4864322344, -18.7252161480, 0.9615718128, -100.1282552629, -42.4349083923, + -14.3562238984, -46.8134065357, 39.6360915881, 22.7361846189, -3.2257803075, 37.2350125538, 115.6400099866, -12.7275184486, + -96.1855573652, -10.0276483356, 57.6455407419, 77.4560348751, -22.1178137498, -35.6022362191, -68.4831367839, 2.8390215747, + -52.0573070842, -93.4720169324, -28.9154032611, -76.6074307649, -9.9420438435, -6.1893105222, 29.9369590932, 74.7852614650, + -1.6201087045, -17.3703711090, -98.9790496449, 26.7869734481, 17.1602014711, -15.6928367417, -7.8035969135, 89.7887008279, + -70.6197502665, -8.2854282454, 59.3778733341, 73.2639493915, 25.8370203675, 59.1628124401, -24.8471900591, -25.8194366580, + -6.0751044137, -57.7489484697, 88.6706386657, -84.8771863224, -89.4840617668, 10.9763517990, -54.8378810910, 41.3410088555, + 66.6125927808, -14.1311991812, 29.3005546497, 96.5047091289, -3.3614374997, -25.8108903749, 206.5074424684, -61.4084159691, + -62.4923495769, -13.1959183651, -59.3730978039, -12.7173171637, 16.2427076425, 43.4296534191, -21.7657996669, -28.1531280594, + -69.0302418588, -86.4107750374, 17.1949881709, -41.3078350297, -57.6504646238, -5.0909583836, -8.1631298822, 1.3096980446, + -2.2508953688, 35.1942051704, -3.9027768036, -91.2713667132, 63.6694073039, 41.4248931898, 9.8384382954, -96.0978983961, + 66.1755919288, -36.7372549691, 10.2307178666, 80.7031291631, -38.2719834734, 39.2035878064, -43.1259903655, 93.4819414373, + 89.7247077937, 78.9891448344, 95.0983537363, 36.5774514331, 8.9972120390, -8.5755002664, -102.1337133375, 76.9830915294, + -46.7790015335, 51.0714648600, 29.5170917782, 23.9334813635, 5.2749838346, -15.9842728433, -1.3574532545, -70.2729088611, + -15.8039920242, 15.5313565190, -18.1312003682, -8.0084433716, -27.8087982433, 51.7334750530, 19.3370491919, 29.2520159480, + -68.6735151718, 8.0558008798, -40.2210320066, -40.9920576136, 7.8678303082, -72.3041306508, -10.2175986624, -35.1356797035, + 201.1586117629, 56.4352966867, 46.7221688254, -11.9012413099, -18.9833303926, -86.5023414408, -23.4675063576, -55.5806400666, + 153.4955981228, -10.1092363214, 88.4029573110, -65.9117133686, -5.4919562765, 24.5837979674, -33.5408574701, -4.0004157187, + 56.9848893304, -105.2177018084, 3.4948685307, -19.8452050090, -7.2453079498, 102.6389582052, -8.3246123264, -73.0861922381, + 0.9626940760, -28.3612950785, -11.1533678981, 44.2899763978, -62.6677448146, 22.3906970985, -13.3484872677, 67.0703918899, + 42.4772156970, -18.5244182335, 37.4759091463, 31.3496965213, -61.4436264287, 52.0955155439, 59.1486887940, 170.4906735140, + 46.0617455116, 40.1470772024, -107.3976903570, -105.4116725861, 56.8825181023, 58.5916397550, -58.1729962485, -60.5270235223, + -39.2885519005, 9.5965348817, -25.4354894441, -14.0981625889, -52.7234757042, -83.9105208881, 72.1797338834, -134.9219073856, + 9.6103094318, 9.6768962656, 26.7360474274, 41.7881752284, -15.3952839007, -0.1363655901, -47.0864221556, -8.2427253205, + -57.7373834528, -55.9508702650, -78.5284244100, 0.1655492302, 62.9160705153, 64.1068291282, -2.9136214436, -105.7842253662, + -45.8767944713, -51.7074257000, -98.8568902926, 64.1232083599, 71.1116077196, -30.6630666091, -58.6840707262, -15.9383894413, + -78.6620829271, 60.7529890099, 154.2357488637, 41.3625348402, 120.2872442705, -51.3125389772, 16.7881412988, -70.4938171347, + -79.4147805796, 23.5182282020, -81.0963234264, -59.2244948022, 28.9135530940, 92.5951342446, -96.6396527065, -26.4777264554, + 121.3094449527, -34.5951012470, -127.8255512216, -92.7699064191, -58.4398020189, -117.7542292595, 31.0434596629, 21.5299289765, + -99.9447239591, -16.0626333679, 6.0199864189, 82.4757175357, 22.5970205481, 73.5485760950, 35.7980568403, 72.6857884103, + 28.8479981590, -67.5538339177, 43.4071338656, -25.1893024527, 4.6130159403, -65.2605921685, -91.8752363625, 22.5520067301, + -109.9093500045, 33.9399454761, -13.9115156368, -3.1879928935, 1.3920042271, 43.3324348308, -33.3718525809, -15.9282931008, + 0.7677944075, 78.1072718708, -1.1063828562, -10.5413152425, 37.1290958861, 13.6823396336, -3.4014039018, 89.5388534365, + 37.7089705536, 64.0323076524, 44.7808982777, -13.5604762388, 7.5118173888, 115.2300447558, -9.1561273300, -41.5332100116, + -17.0088418256, 71.2713927804, 68.0422816650, 54.9551164038, 106.8830646917, -6.8316822423, -66.7609967606, -23.3894825625, + -67.4182747661, -28.3219951260, -15.9451114055, -29.7266619746, 16.7419712545, -20.5565859019, -165.5656221846, 116.3242135199, + 64.2626611081, -8.1360214710, -94.2273608282, -62.9983557391, 64.1759043922, 36.5449254036, -51.5697599431, -5.0466305585, + -73.2700815931, 48.7300029897, -35.5929303432, -90.4816448914, 16.8187764590, -27.9347950060, 80.7045416696, -83.6514663068, + -58.4556594913, 3.2348973759, 52.8657910284, 85.7278577109, 37.4138218732, 82.0512145755, 76.4606241856, -109.2162517858, + 96.6683439683, 90.7633843052, -53.1586977972, 34.4033331064, 44.2090456506, 80.1151111552, 2.7514790758, -64.2623287852, + 126.1409018754, -30.2423240636, -156.0079941574, -2.8027393737, 64.2513542782, 69.8534581189, -73.4708875363, 20.2217494242, + 0.5864357659, -104.6195300646, -42.8322649072, 26.3037603855, -40.7129474708, -33.9844594811, -26.3521525879, 109.6645932255, + -106.9356716414, 49.2118962107, 11.7512591870, 68.8969247665, 113.4583578600, -83.3347276867, -36.2485402256, 85.9855241461, + 104.0814868325, 33.5770186573, -1.9661285608, -132.5696804701, 27.6753215958, 21.1243350017, -28.0882593661, 35.2778527631, + 18.9175154387, 83.6190957901, -71.4962755318, 138.3285404575, 97.9134306607, -56.8042150595, -143.3089544841, -2.7340225658, + 17.5776154385, -148.2352087417, 124.9211804787, 59.4231271286, 10.5947124378, 68.5288310273, -67.2703544731, -23.7935515786, + 38.8787769309, 34.5294359419, -73.4536038751, 2.7126504728, 49.6972438051, 62.7223593643, 49.8175933904, -110.1534126143, + -14.6702420578, -84.0773525862, -92.6188033620, -5.5698102323, -47.9128909478, 46.7196485027, -53.6444016449, 98.5014752828, + -94.7519348776, 14.1323076055, -89.2719075396, 47.0296071172, 41.3919626390, -39.1489616034, -135.6499693540, -10.9475781700, + 92.7496269052, 37.4205820588, -51.7237524182, 49.9460461012, 87.5396720347, 32.8710569742, -32.8731769330, -83.4249720632, + 34.5762125072, 13.6808877416, -26.3766683600, -67.8728489559, -29.6073750328, -47.8030427727, -149.0587954245, -119.5774481626, + 35.2806694964, -24.3695409777, 48.7160766560, 8.8288204812, -89.3855803242, 3.1835611015, 51.9474587643, -41.8502161006, + -34.1035165420, 94.0854499359, -84.2224914514, 59.1627371631, -103.1905795588, -18.6082417651, 36.3103092592, 63.1937125568, + -111.1986222065, -32.0863426915, -56.7330383564, 32.5073363806, -7.1087996309, -68.2226145792, -157.6532604957, 45.2078386315, + -2.8603211008, 33.3371110420, 37.7846637198, -18.6405663742, -91.0982111740, 23.2221097945, -24.3522827840, 78.9413600618, + 62.8360928143, -19.9242767252, 56.5032728402, -5.5496240010, 8.6994906960, 83.5527376759, -21.2346885874, 64.0836232315, + 22.9623722574, -87.9578765280, 1.3523030640, 176.4067098705, 67.9036978634, 7.2537723049, -122.2309062335, -63.8632909466, + -38.4903796734, -16.2974411834, 2.3970826418, 64.3700072918, -67.9197915888, -116.4026668750, 67.5231031500, 34.6374455493, + 4.1311157296, -2.9105015532, 70.8086558293, 39.2725441796, 33.8256743917, -3.5843642097, 116.7643833804, 20.1092238787, + -25.9766854190, -51.9950492522, 3.5926636209, -58.7583611171, 3.2768807331, -83.5901878329, 68.7090363388, 31.4832422043, + 72.9380572718, -165.9742811160, 33.9362033271, -10.9519428632, 13.0808211304, 15.6672709051, 31.7224492437, -24.1934977704, + -111.0830116867, 11.6282084172, -66.2259706857, -1.9963673172, 30.0622960183, 53.3456859503, -37.0919419160, 67.5944964290, + 18.5935153812, 48.9664966150, 67.3157768914, -160.7111991618, -25.1223842933, -47.4479071245, -16.7582679230, -13.6039270052, + 1.7293472100, -24.1741877419, -76.9727398203, -56.3783736939, -66.9556303947, -54.3511473684, 30.2542211582, -66.8893229449, + -73.2990092912, 239.3981985262, -64.2850340511, 89.9092075497, -15.3525489059, 53.3827372899, -14.3319916122, -115.0721596412, + -50.4530123160, 44.0976786926, 52.2019557554, 72.6630207131, 27.5803572747, 33.4737730840, -170.7640086205, 152.9204474548, + -44.5872734278, -41.0667502536, 26.6175854758, -13.0179143239, 40.8518134705, 23.2781614140, 22.8861340709, 165.4158655103, + 45.0461105030, -17.0077443894, -2.3871329828, -86.8854944700, -38.5465304439, 51.8040803063, -92.8924802068, -113.2325293603, + 51.3604041632, -18.3429725256, -42.5989033884, -38.9445115750, -85.8273183104, -56.4224331649, 17.4997720376, 89.3766578841, + 23.9239370283, 82.3838988229, 47.4013397563, -28.0666334287, 77.6218433875, -52.2133433307, 89.2938264737, 43.2058195424, + 49.4518987655, -5.6570623864, 19.8577713391, -33.2615393471, 73.6654400011, 27.5602339563, -47.1471825605, -34.0693505588, + 111.0944675938, 57.0173259682, -63.4190502251, 46.5969999331, 49.3458328432, -41.3853156260, 39.2494112424, 40.7148228670, + -20.3911372187, 31.8352000294, -0.9980198147, 22.2804091174, 54.0978218332, -82.3683192993, 85.9892355872, -58.3154306688, + -104.2068911293, 91.0603181519, 32.9518095573, 20.8407188930, 34.7499759595, 81.9688480501, -63.1013763435, 0.0064684915, + -24.5056101811, 69.9306176471, -27.5369930597, -39.0144381716, -14.4923929902, -54.3182594365, -130.3292318388, -48.8158919788, + 53.2734036714, -104.1048090944, -70.0965204183, 3.6382745923, 83.6579656965, 23.1622465812, 126.4691310854, 102.9799547579, + 70.8617976147, -8.1455978101, -28.4590640876, 108.1156467676, -1.9738076313, -75.4909376542, 57.5780163484, 45.3155422582, + -38.1742907476, -52.1803902400, -59.7016262432, -23.3823853194, -45.5457749841, -10.5523915014, -110.6271933849, -32.0113288878, + -86.9215548382, 87.4068451718, 70.9885834348, 25.1206930472, 30.7108505789, 115.6076847444, -40.5697084903, -56.6781054555, + -31.4854227803, -31.9552555012, 25.7938108182, 25.4540472201, 76.7058033375, 2.3905659773, -5.9779298940, -152.8056710400, + -51.7485397077, 28.1462240336, 33.9693389366, -71.9881317816, -105.0496130632, 64.2276458511, 96.2519735406, 48.6822690044, + -19.6594071488, 24.8884631741, -33.0716823639, -69.5612618256, -25.2898319495, 98.8036926982, -24.3703282453, 53.1789051370, + 86.5743876344, 18.0109802577, 68.3663740236, 112.3369755598, -45.4492280850, -151.6437874688, -38.2167192413, 24.2163999975, + -66.3294468430, -150.1009914497, -29.4992082835, -92.1308610284, -1.2762556067, 23.1500238372, 69.3063510487, -69.0471660018, + 42.5150200276, 120.6653379806, -152.6729845687, 48.9591377076, 2.7191539126, 0.2888762146, -3.0784673164, 32.5853754582, + -81.3351116851, 25.2072127071, -36.3659441163, -28.6250561447, 95.3073017008, -75.7486406052, 65.1012680265, -64.6031857772, + 56.1240652498, -10.8517181129, -3.7575141784, 42.9554134355, 32.9784965739, -25.0327158003, -147.2361479829, -122.4898965848, + -64.6526214445, 57.1527521244, 25.3983254376, -74.5887309421, 105.2278400890, 118.4451948788, -10.9195498541, -45.2849091353, + 79.1200975888, -60.8806018590, -12.2957628012, -10.2289743666, 77.2465842566, -19.1618580885, -50.3947630673, 130.5843172047, + 20.1829697245, -24.4247513916, 71.3800655588, -30.9467657000, 1.5373397590, 53.9054414421, -87.7905799212, 58.1774557931, + -154.0660955458, 119.2331706772, 7.0800339615, -83.0564977313, -99.0630549412, 64.4241699198, 27.5103964537, 36.9348345670, + -10.4954521840, -23.2759360131, -167.1583158447, -50.1929188975, -17.1065117999, -86.3978192131, 8.3733101608, -19.6093068970, + 37.0486109491, 45.4922144870, 176.0647013511, -14.1950922727, 16.7968812286, -84.3138225875, -53.2207464331, -14.8171496969, + 65.2824157581, 93.3387940939, -46.2740703075, 92.8129768305, -57.1890439907, 27.2969064938, -67.1547095718, 132.0520323271, + -80.7686358272, 31.4140691769, -52.8148627904, -54.8739580131, -149.8514804755, 56.0153122854, -71.3742949563, 36.6095599948, + 42.3294500451, 1.2055515804, -109.4906983981, -71.9482696076, -21.4390953534, 98.8949510272, 74.3069855376, -35.1569830360, + -34.9626381657, 64.2761847423, 64.7596378221, -28.4775450749, 20.1459803277, -26.5247867780, -32.4734659348, -27.8310906478, + 50.7956581065, 36.0746451268, 22.7531905225, -13.9681530928, 49.5451440618, -13.8510794385, 19.4999565108, 56.8774616945, + -11.9205397259, -71.7174333027, 138.8034243907, -37.8252215401, -38.5743154556, -22.5072374207, 12.6209402643, 69.3207345010, + 70.3534390616, 71.5844311614, 4.0715727994, 25.4390606947, -51.0777668722, 138.3617611366, -34.2478029347, -58.8492260984, + -108.6623124843, 58.3034938571, -36.9304647333, 116.5902412201, -24.4020501110, -74.7544840602, 67.7889120207, -9.1455389450, + -46.4456521441, 83.2551857934, -113.9346066504, 46.2851467498, -17.4102217179, 41.6989724702, -23.8829078702, 76.1395799790, + -27.1608730178, -133.8787483532, -59.9242635982, 120.5266415560, 124.9797395465, 35.5722660007, -20.2412573812, 20.5492611902, + -111.8745990845, 41.7389321101, 44.5758622786, 54.2189628306, -44.4745944890, -75.9761098966, 104.0472151578, 113.7219003284, + 33.0330354214, -6.0923562541, -14.8744671800, 62.5024055272, 3.7922184446, 1.1256712478, -30.2126827228, -83.4988699637, + -103.7060854897, -65.4982917403, 30.8897494352, 66.1124672663, 65.0983461952, -52.5486436649, -4.5556524541, -26.5924272500, + -94.1546367179, -0.3559369287, -45.0649519841, -68.1274094478, -7.0521865275, -5.6612786174, -12.5790011432, 51.2524661231, + -3.6515125298, 92.9598974936, -21.0468658542, -40.8243392179, -7.4342227950, 11.1119231703, 37.3371820746, 21.3179018153, + 50.2932980480, -24.1611515405, -41.7851721122, -24.8691439055, -28.3180388219, 121.1894536511, 15.7968116384, 17.9498027226, + -55.3386005430, -80.6689826830, 31.9394747713, -28.1978017432, -1.5538441529, -4.0360096323, 73.9611531119, 17.7253526010, + -24.8578563772, 18.4583438017, 75.2580204243, -13.6139802015, 24.6918362443, -63.0552815767, -4.0312608443, -14.8879121339, + -2.8237511683, -81.5024576341, -4.2344562157, 107.1587476255, -131.2910041645, -25.6467586377, 0.4733397655, 62.8634326464, + 63.1852609425, 16.5913941858, -96.6896044528, 81.2969911064, 18.2956425408, -81.6677471269, -39.2708721333, -34.3080597347, + 22.5610412882, 57.2574226391, 77.9308780964, -39.9342842346, 58.5581960994, -5.7939281526, 104.9927182940, -99.3837066580, + 25.9917768621, -32.1605915683, -30.4589523848, 64.8295771021, -28.2183758982, -37.9771330859, -178.0772548046, 84.2925125233, + 45.4981954662, 49.2815212900, -45.1224250038, -5.9322404186, -6.1309915876, 76.9070873365, -11.5475730308, 18.2569564924, + -124.4953563688, 53.8646820493, -40.0231506068, -74.3908746450, -63.2011642999, -18.9826189881, 69.7917580387, -34.8403308318, + -36.4625632706, 17.1934091336, -20.8063613141, -1.9067935434, 5.2259139474, 60.8368210348, 81.3087550974, -42.6679999668, + -95.5963552311, -115.2609753741, 11.1809831183, -48.3640194531, 75.1073797772, 30.8228127170, -15.0904157375, 11.0538529673, + 107.4505154927, -66.3486660110, -32.0311111189, 38.4346222125, 8.9422998706, -57.6098106212, 15.9132097612, -132.1845158340, + 36.1916704283, -10.5055186124, -87.5658217149, 107.8931306399, 96.0334082800, 53.7264664477, -72.0623965686, -1.9038197721, + 26.1152808779, 119.6235796272, 48.3325601149, 117.6457486801, 28.0275495741, -11.7030018715, 52.9236279862, 100.1176831736, + -83.2423151898, 7.5280868233, -15.3686195277, -5.3432329923, -27.9181052724, -64.4492860287, 129.7502751613, -82.3246020383, + 37.3256155504, 34.7298938660, -57.0561320806, -44.9581455455, 93.3481469867, -54.3803550243, 26.4501204966, 18.8116878139, + -74.4902220818, 15.4659232518, -49.1948332727, 34.0006040345, 56.7177639954, -28.8367897421, 83.8692564278, 35.6745892475, + -45.7509262432, 30.3970223242, 106.1786129556, -35.7843870107, 7.1339227808, 13.0894885560, 56.4666438735, -23.8687514544, + -111.5694112759, -58.7858061292, -61.2783887765, 44.1738302093, 54.7407844064, 14.3538652267, 108.5956394164, -22.3846808158, + 2.5449431771, 70.3512724427, 29.5403015688, -0.7212818796, 143.3497258886, -17.2553350633, -99.7681623907, 42.6913312311, + 35.7338157369, -54.6728371746, -38.0299088541, 10.1471440532, -124.7095236710, -190.8743243033, 139.7543496645, -42.2528776639, + 39.0975372290, 27.8686903911, 22.7337255980, 42.7990612235, -41.6771094483, -23.0843729437, 49.7020046877, 11.0018909876, + -16.5079644797, -158.2821637063, 42.1950179525, -30.4282660128, 67.9797563487, -53.8121334664, 52.8306609341, -5.2861803454, + 59.3808475761, 158.1836295178, -26.8953096767, 78.8646320997, -113.9365510474, -37.1949934282, 53.6970193167, -9.6523467804, + 7.7358952669, -74.6220593088, 107.4394203873, 17.2364088475, -36.5357935724, -23.9301386540, 17.8174243490, 14.1204969615, + -8.2599377000, 4.2743586584, -46.4363395746, -63.5670279031, 9.6872641411, 21.0630349930, 108.9834586896, -124.7597975398, + 29.4251821664, 23.8313097730, -40.8359610210, 91.9520219869, 95.7936525792, -109.5783337883, -60.1100153384, -19.9591228893, +}; + +/*--------------------------------------------------------------------------------*/ +/* FFT Lengths */ +/*--------------------------------------------------------------------------------*/ + +/* + To change test parameter values add/remove values inside CURLY and update + the preceeding parameter to reflect the number of values inside CURLY. +*/ + +ARR_DESC_DEFINE(uint16_t, + transform_radix2_fftlens, + 7, + CURLY( + 16, 32, 64, 128, 256, + 512, 1024/*, 2048 , 4096 */)); + +ARR_DESC_DEFINE(uint16_t, + transform_radix4_fftlens, + 4, + CURLY( + 16, 64, 256, 1024/* , 4096 */)); + +ARR_DESC_DEFINE(uint16_t, + transform_rfft_fftlens, + 6, + CURLY( + 32, 64, 128, 256, + 512, 1024/*, 2048 , 4096, 8192*/)); + +ARR_DESC_DEFINE(uint16_t, + transform_dct_fftlens, + 3, + CURLY( + 128, 512, 2048/*, 8192*/)); + +ARR_DESC_DEFINE(uint16_t, + transform_rfft_fast_fftlens, + 7, + CURLY( + 32, 64, 128, 256, + 512, 1024, 2048)); + +/*--------------------------------------------------------------------------------*/ +/* CFFT_F32 Structs */ +/*--------------------------------------------------------------------------------*/ + +/* Uses radix2 lengths */ +ARR_DESC_DEFINE(const arm_cfft_instance_f32 *, + transform_cfft_f32_structs, + 5, + CURLY( + &arm_cfft_sR_f32_len16, + &arm_cfft_sR_f32_len32, + &arm_cfft_sR_f32_len64, + &arm_cfft_sR_f32_len128, + &arm_cfft_sR_f32_len256/*, + &arm_cfft_sR_f32_len512, */ + /* &arm_cfft_sR_f32_len1024, */ + /* &arm_cfft_sR_f32_len2048, */ + /* &arm_cfft_sR_f32_len4096 */ + )); + +/*--------------------------------------------------------------------------------*/ +/* CFFT_Q31 Structs */ +/*--------------------------------------------------------------------------------*/ + +/* Uses radix2 lengths */ +ARR_DESC_DEFINE(const arm_cfft_instance_q31 *, + transform_cfft_q31_structs, + 5, + CURLY( + &arm_cfft_sR_q31_len16, + &arm_cfft_sR_q31_len32, + &arm_cfft_sR_q31_len64, + &arm_cfft_sR_q31_len128, + &arm_cfft_sR_q31_len256/*, + &arm_cfft_sR_q31_len512, */ + /* &arm_cfft_sR_q31_len1024, */ + /* &arm_cfft_sR_q31_len2048, */ + /* &arm_cfft_sR_q31_len4096 */ + )); + +/*--------------------------------------------------------------------------------*/ +/* CFFT_q15 Structs */ +/*--------------------------------------------------------------------------------*/ + +/* Uses radix2 lengths */ +ARR_DESC_DEFINE(const arm_cfft_instance_q15 *, + transform_cfft_q15_structs, + 5, + CURLY( + &arm_cfft_sR_q15_len16, + &arm_cfft_sR_q15_len32, + &arm_cfft_sR_q15_len64, + &arm_cfft_sR_q15_len128, + &arm_cfft_sR_q15_len256/*, + &arm_cfft_sR_q15_len512, */ + /* &arm_cfft_sR_q15_len1024, */ + /* &arm_cfft_sR_q15_len2048, */ + /* &arm_cfft_sR_q15_len4096 */ + )); diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MBLl_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MBLl_config.txt new file mode 100644 index 0000000..00ed7ca --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MBLl_config.txt @@ -0,0 +1,11 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLl_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLl_config.txt new file mode 100644 index 0000000..c6863de --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLl_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=0 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLld_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLld_config.txt new file mode 100644 index 0000000..8c29693 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLld_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=1 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLldfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLldfsp_config.txt new file mode 100644 index 0000000..d9eb125 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLldfsp_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=1 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLlfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLlfsp_config.txt new file mode 100644 index 0000000..bb967fe --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/ARMv8MMLlfsp_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=0 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM0l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM0l_config.txt new file mode 100644 index 0000000..9f2cb42 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM0l_config.txt @@ -0,0 +1,8 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm0ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm0ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm0ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm0ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM3l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM3l_config.txt new file mode 100644 index 0000000..0a9b07f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM3l_config.txt @@ -0,0 +1,8 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm3ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm3ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm3ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm3ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM4l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM4l_config.txt new file mode 100644 index 0000000..674c929 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM4l_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm4ct.vfp-present=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm4ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm4ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm4ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm4ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM4lf_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM4lf_config.txt new file mode 100644 index 0000000..92c17ff --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM4lf_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm4ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm4ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm4ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm4ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm4ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7l_config.txt new file mode 100644 index 0000000..2bc5193 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7l_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7lfdp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7lfdp_config.txt new file mode 100644 index 0000000..e7f7596 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7lfdp_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7lfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7lfsp_config.txt new file mode 100644 index 0000000..e7f7596 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP/cortexM7lfsp_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.c new file mode 100644 index 0000000..719a5ca --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2013-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + * + * ----------------------------------------------------------------------------- + * + * $Revision: V5.1.0 + * + * Project: CMSIS-RTOS RTX + * Title: RTX Configuration + * + * ----------------------------------------------------------------------------- + */ + +#include "cmsis_compiler.h" +#include "rtx_os.h" + +// OS Idle Thread +__WEAK __NO_RETURN void osRtxIdleThread (void *argument) { + (void)argument; + + for (;;) {} +} + +// OS Error Callback function +__WEAK uint32_t osRtxErrorNotify (uint32_t code, void *object_id) { + (void)object_id; + + switch (code) { + case osRtxErrorStackUnderflow: + // Stack underflow detected for thread (thread_id=object_id) + break; + case osRtxErrorISRQueueOverflow: + // ISR Queue overflow detected when inserting object (object_id) + break; + case osRtxErrorTimerQueueOverflow: + // User Timer Callback Queue overflow detected for timer (timer_id=object_id) + break; + case osRtxErrorClibSpace: + // Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUM + break; + case osRtxErrorClibMutex: + // Standard C/C++ library mutex initialization failed + break; + default: + break; + } + for (;;) {} +return 0U; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.h new file mode 100644 index 0000000..f9bb303 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/RTX_Config.h @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2013-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + * + * ----------------------------------------------------------------------------- + * + * $Revision: V5.5.0 + * + * Project: CMSIS-RTOS RTX + * Title: RTX Configuration definitions + * + * ----------------------------------------------------------------------------- + */ + +#ifndef RTX_CONFIG_H_ +#define RTX_CONFIG_H_ + +#ifdef _RTE_ +#include "RTE_Components.h" +#ifdef RTE_RTX_CONFIG_H +#include RTE_RTX_CONFIG_H +#endif +#endif + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- + +// System Configuration +// ======================= + +// Global Dynamic Memory size [bytes] <0-1073741824:8> +// Defines the combined global dynamic memory size. +// Default: 4096 +#ifndef OS_DYNAMIC_MEM_SIZE +#define OS_DYNAMIC_MEM_SIZE 4096 +#endif + +// Kernel Tick Frequency [Hz] <1-1000000> +// Defines base time unit for delays and timeouts. +// Default: 1000 (1ms tick) +#ifndef OS_TICK_FREQ +#define OS_TICK_FREQ 1000 +#endif + +// Round-Robin Thread switching +// Enables Round-Robin Thread switching. +#ifndef OS_ROBIN_ENABLE +#define OS_ROBIN_ENABLE 1 +#endif + +// Round-Robin Timeout <1-1000> +// Defines how many ticks a thread will execute before a thread switch. +// Default: 5 +#ifndef OS_ROBIN_TIMEOUT +#define OS_ROBIN_TIMEOUT 5 +#endif + +// + +// ISR FIFO Queue +// <4=> 4 entries <8=> 8 entries <12=> 12 entries <16=> 16 entries +// <24=> 24 entries <32=> 32 entries <48=> 48 entries <64=> 64 entries +// <96=> 96 entries <128=> 128 entries <196=> 196 entries <256=> 256 entries +// RTOS Functions called from ISR store requests to this buffer. +// Default: 16 entries +#ifndef OS_ISR_FIFO_QUEUE +#define OS_ISR_FIFO_QUEUE 16 +#endif + +// Object Memory usage counters +// Enables object memory usage counters (requires RTX source variant). +#ifndef OS_OBJ_MEM_USAGE +#define OS_OBJ_MEM_USAGE 0 +#endif + +// + +// Thread Configuration +// ======================= + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_THREAD_OBJ_MEM +#define OS_THREAD_OBJ_MEM 0 +#endif + +// Number of user Threads <1-1000> +// Defines maximum number of user threads that can be active at the same time. +// Applies to user threads with system provided memory for control blocks. +#ifndef OS_THREAD_NUM +#define OS_THREAD_NUM 1 +#endif + +// Number of user Threads with default Stack size <0-1000> +// Defines maximum number of user threads with default stack size. +// Applies to user threads with zero stack size specified. +#ifndef OS_THREAD_DEF_STACK_NUM +#define OS_THREAD_DEF_STACK_NUM 0 +#endif + +// Total Stack size [bytes] for user Threads with user-provided Stack size <0-1073741824:8> +// Defines the combined stack size for user threads with user-provided stack size. +// Applies to user threads with user-provided stack size and system provided memory for stack. +// Default: 0 +#ifndef OS_THREAD_USER_STACK_SIZE +#define OS_THREAD_USER_STACK_SIZE 0 +#endif + +// + +// Default Thread Stack size [bytes] <96-1073741824:8> +// Defines stack size for threads with zero stack size specified. +// Default: 256 +#ifndef OS_STACK_SIZE +#define OS_STACK_SIZE 512 +#endif + +// Idle Thread Stack size [bytes] <72-1073741824:8> +// Defines stack size for Idle thread. +// Default: 256 +#ifndef OS_IDLE_THREAD_STACK_SIZE +#define OS_IDLE_THREAD_STACK_SIZE 512 +#endif + +// Idle Thread TrustZone Module Identifier +// Defines TrustZone Thread Context Management Identifier. +// Applies only to cores with TrustZone technology. +// Default: 0 (not used) +#ifndef OS_IDLE_THREAD_TZ_MOD_ID +#define OS_IDLE_THREAD_TZ_MOD_ID 0 +#endif + +// Stack overrun checking +// Enables stack overrun check at thread switch. +// Enabling this option increases slightly the execution time of a thread switch. +#ifndef OS_STACK_CHECK +#define OS_STACK_CHECK 1 +#endif + +// Stack usage watermark +// Initializes thread stack with watermark pattern for analyzing stack usage. +// Enabling this option increases significantly the execution time of thread creation. +#ifndef OS_STACK_WATERMARK +#define OS_STACK_WATERMARK 0 +#endif + +// Processor mode for Thread execution +// <0=> Unprivileged mode +// <1=> Privileged mode +// Default: Privileged mode +#ifndef OS_PRIVILEGE_MODE +#define OS_PRIVILEGE_MODE 1 +#endif + +// + +// Timer Configuration +// ====================== + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_TIMER_OBJ_MEM +#define OS_TIMER_OBJ_MEM 0 +#endif + +// Number of Timer objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_TIMER_NUM +#define OS_TIMER_NUM 1 +#endif + +// + +// Timer Thread Priority +// <8=> Low +// <16=> Below Normal <24=> Normal <32=> Above Normal +// <40=> High +// <48=> Realtime +// Defines priority for timer thread +// Default: High +#ifndef OS_TIMER_THREAD_PRIO +#define OS_TIMER_THREAD_PRIO 40 +#endif + +// Timer Thread Stack size [bytes] <0-1073741824:8> +// Defines stack size for Timer thread. +// May be set to 0 when timers are not used. +// Default: 256 +#ifndef OS_TIMER_THREAD_STACK_SIZE +#define OS_TIMER_THREAD_STACK_SIZE 256 +#endif + +// Timer Thread TrustZone Module Identifier +// Defines TrustZone Thread Context Management Identifier. +// Applies only to cores with TrustZone technology. +// Default: 0 (not used) +#ifndef OS_TIMER_THREAD_TZ_MOD_ID +#define OS_TIMER_THREAD_TZ_MOD_ID 0 +#endif + +// Timer Callback Queue entries <0-256> +// Number of concurrent active timer callback functions. +// May be set to 0 when timers are not used. +// Default: 4 +#ifndef OS_TIMER_CB_QUEUE +#define OS_TIMER_CB_QUEUE 4 +#endif + +// + +// Event Flags Configuration +// ============================ + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_EVFLAGS_OBJ_MEM +#define OS_EVFLAGS_OBJ_MEM 0 +#endif + +// Number of Event Flags objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_EVFLAGS_NUM +#define OS_EVFLAGS_NUM 1 +#endif + +// + +// + +// Mutex Configuration +// ====================== + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_MUTEX_OBJ_MEM +#define OS_MUTEX_OBJ_MEM 0 +#endif + +// Number of Mutex objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_MUTEX_NUM +#define OS_MUTEX_NUM 1 +#endif + +// + +// + +// Semaphore Configuration +// ========================== + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_SEMAPHORE_OBJ_MEM +#define OS_SEMAPHORE_OBJ_MEM 0 +#endif + +// Number of Semaphore objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_SEMAPHORE_NUM +#define OS_SEMAPHORE_NUM 1 +#endif + +// + +// + +// Memory Pool Configuration +// ============================ + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_MEMPOOL_OBJ_MEM +#define OS_MEMPOOL_OBJ_MEM 0 +#endif + +// Number of Memory Pool objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_MEMPOOL_NUM +#define OS_MEMPOOL_NUM 1 +#endif + +// Data Storage Memory size [bytes] <0-1073741824:8> +// Defines the combined data storage memory size. +// Applies to objects with system provided memory for data storage. +// Default: 0 +#ifndef OS_MEMPOOL_DATA_SIZE +#define OS_MEMPOOL_DATA_SIZE 0 +#endif + +// + +// + +// Message Queue Configuration +// ============================== + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_MSGQUEUE_OBJ_MEM +#define OS_MSGQUEUE_OBJ_MEM 0 +#endif + +// Number of Message Queue objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_MSGQUEUE_NUM +#define OS_MSGQUEUE_NUM 1 +#endif + +// Data Storage Memory size [bytes] <0-1073741824:8> +// Defines the combined data storage memory size. +// Applies to objects with system provided memory for data storage. +// Default: 0 +#ifndef OS_MSGQUEUE_DATA_SIZE +#define OS_MSGQUEUE_DATA_SIZE 0 +#endif + +// + +// + +// Event Recorder Configuration +// =============================== + +// Global Initialization +// Initialize Event Recorder during 'osKernelInitialize'. +#ifndef OS_EVR_INIT +#define OS_EVR_INIT 0 +#endif + +// Start recording +// Start event recording after initialization. +#ifndef OS_EVR_START +#define OS_EVR_START 1 +#endif + +// Global Event Filter Setup +// Initial recording level applied to all components. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_LEVEL +#define OS_EVR_LEVEL 0x00U +#endif + +// RTOS Event Filter Setup +// Recording levels for RTX components. +// Only applicable if events for the respective component are generated. + +// Memory Management +// Recording level for Memory Management events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_MEMORY_LEVEL +#define OS_EVR_MEMORY_LEVEL 0x01U +#endif + +// Kernel +// Recording level for Kernel events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_KERNEL_LEVEL +#define OS_EVR_KERNEL_LEVEL 0x01U +#endif + +// Thread +// Recording level for Thread events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_THREAD_LEVEL +#define OS_EVR_THREAD_LEVEL 0x05U +#endif + +// Generic Wait +// Recording level for Generic Wait events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_WAIT_LEVEL +#define OS_EVR_WAIT_LEVEL 0x01U +#endif + +// Thread Flags +// Recording level for Thread Flags events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_THFLAGS_LEVEL +#define OS_EVR_THFLAGS_LEVEL 0x01U +#endif + +// Event Flags +// Recording level for Event Flags events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_EVFLAGS_LEVEL +#define OS_EVR_EVFLAGS_LEVEL 0x01U +#endif + +// Timer +// Recording level for Timer events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_TIMER_LEVEL +#define OS_EVR_TIMER_LEVEL 0x01U +#endif + +// Mutex +// Recording level for Mutex events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_MUTEX_LEVEL +#define OS_EVR_MUTEX_LEVEL 0x01U +#endif + +// Semaphore +// Recording level for Semaphore events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_SEMAPHORE_LEVEL +#define OS_EVR_SEMAPHORE_LEVEL 0x01U +#endif + +// Memory Pool +// Recording level for Memory Pool events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_MEMPOOL_LEVEL +#define OS_EVR_MEMPOOL_LEVEL 0x01U +#endif + +// Message Queue +// Recording level for Message Queue events. +// Error events +// API function call events +// Operation events +// Detailed operation events +// +#ifndef OS_EVR_MSGQUEUE_LEVEL +#define OS_EVR_MSGQUEUE_LEVEL 0x01U +#endif + +// + +// + +// RTOS Event Generation +// Enables event generation for RTX components (requires RTX source variant). + +// Memory Management +// Enables Memory Management event generation. +#ifndef OS_EVR_MEMORY +#define OS_EVR_MEMORY 1 +#endif + +// Kernel +// Enables Kernel event generation. +#ifndef OS_EVR_KERNEL +#define OS_EVR_KERNEL 1 +#endif + +// Thread +// Enables Thread event generation. +#ifndef OS_EVR_THREAD +#define OS_EVR_THREAD 1 +#endif + +// Generic Wait +// Enables Generic Wait event generation. +#ifndef OS_EVR_WAIT +#define OS_EVR_WAIT 1 +#endif + +// Thread Flags +// Enables Thread Flags event generation. +#ifndef OS_EVR_THFLAGS +#define OS_EVR_THFLAGS 1 +#endif + +// Event Flags +// Enables Event Flags event generation. +#ifndef OS_EVR_EVFLAGS +#define OS_EVR_EVFLAGS 1 +#endif + +// Timer +// Enables Timer event generation. +#ifndef OS_EVR_TIMER +#define OS_EVR_TIMER 1 +#endif + +// Mutex +// Enables Mutex event generation. +#ifndef OS_EVR_MUTEX +#define OS_EVR_MUTEX 1 +#endif + +// Semaphore +// Enables Semaphore event generation. +#ifndef OS_EVR_SEMAPHORE +#define OS_EVR_SEMAPHORE 1 +#endif + +// Memory Pool +// Enables Memory Pool event generation. +#ifndef OS_EVR_MEMPOOL +#define OS_EVR_MEMPOOL 1 +#endif + +// Message Queue +// Enables Message Queue event generation. +#ifndef OS_EVR_MSGQUEUE +#define OS_EVR_MSGQUEUE 1 +#endif + +// + +// + +// Number of Threads which use standard C/C++ library libspace +// (when thread specific memory allocation is not used). +#if (OS_THREAD_OBJ_MEM == 0) +#define OS_THREAD_LIBSPACE_NUM 4 +#else +#define OS_THREAD_LIBSPACE_NUM OS_THREAD_NUM +#endif + +//------------- <<< end of configuration section >>> --------------------------- + +#endif // RTX_CONFIG_H_ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/handlers.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/handlers.c new file mode 100644 index 0000000..ee65ce4 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/CMSIS/handlers.c @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2013-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + * + * ----------------------------------------------------------------------------- + * + * Project: CMSIS-RTOS RTX + * Title: Exception handlers (C functions) + * + * ----------------------------------------------------------------------------- + */ +#include "RTE_Components.h" +#include CMSIS_device_header + + +//Fault Status Register (IFSR/DFSR) definitions +#define FSR_ALIGNMENT_FAULT 0x01 //DFSR only. Fault on first lookup +#define FSR_INSTRUCTION_CACHE_MAINTENANCE 0x04 //DFSR only - async/external +#define FSR_SYNC_EXT_TTB_WALK_FIRST 0x0c //sync/external +#define FSR_SYNC_EXT_TTB_WALK_SECOND 0x0e //sync/external +#define FSR_SYNC_PARITY_TTB_WALK_FIRST 0x1c //sync/external +#define FSR_SYNC_PARITY_TTB_WALK_SECOND 0x1e //sync/external +#define FSR_TRANSLATION_FAULT_FIRST 0x05 //MMU Fault - internal +#define FSR_TRANSLATION_FAULT_SECOND 0x07 //MMU Fault - internal +#define FSR_ACCESS_FLAG_FAULT_FIRST 0x03 //MMU Fault - internal +#define FSR_ACCESS_FLAG_FAULT_SECOND 0x06 //MMU Fault - internal +#define FSR_DOMAIN_FAULT_FIRST 0x09 //MMU Fault - internal +#define FSR_DOMAIN_FAULT_SECOND 0x0b //MMU Fault - internal +#define FSR_PERMISSION_FAULT_FIRST 0x0f //MMU Fault - internal +#define FSR_PERMISSION_FAULT_SECOND 0x0d //MMU Fault - internal +#define FSR_DEBUG_EVENT 0x02 //internal +#define FSR_SYNC_EXT_ABORT 0x08 //sync/external +#define FSR_TLB_CONFLICT_ABORT 0x10 //sync/external +#define FSR_LOCKDOWN 0x14 //internal +#define FSR_COPROCESSOR_ABORT 0x1a //internal +#define FSR_SYNC_PARITY_ERROR 0x19 //sync/external +#define FSR_ASYNC_EXTERNAL_ABORT 0x16 //DFSR only - async/external +#define FSR_ASYNC_PARITY_ERROR 0x18 //DFSR only - async/external + +void CDAbtHandler(uint32_t DFSR, uint32_t DFAR, uint32_t LR) { + uint32_t FS = (DFSR & (1 << 10)) >> 6 | (DFSR & 0x0f); //Store Fault Status + + switch(FS) { + //Synchronous parity errors - retry + case FSR_SYNC_PARITY_ERROR: + case FSR_SYNC_PARITY_TTB_WALK_FIRST: + case FSR_SYNC_PARITY_TTB_WALK_SECOND: + return; + + //Your code here. Value in DFAR is invalid for some fault statuses. + case FSR_ALIGNMENT_FAULT: + case FSR_INSTRUCTION_CACHE_MAINTENANCE: + case FSR_SYNC_EXT_TTB_WALK_FIRST: + case FSR_SYNC_EXT_TTB_WALK_SECOND: + case FSR_TRANSLATION_FAULT_FIRST: + case FSR_TRANSLATION_FAULT_SECOND: + case FSR_ACCESS_FLAG_FAULT_FIRST: + case FSR_ACCESS_FLAG_FAULT_SECOND: + case FSR_DOMAIN_FAULT_FIRST: + case FSR_DOMAIN_FAULT_SECOND: + case FSR_PERMISSION_FAULT_FIRST: + case FSR_PERMISSION_FAULT_SECOND: + case FSR_DEBUG_EVENT: + case FSR_SYNC_EXT_ABORT: + case FSR_TLB_CONFLICT_ABORT: + case FSR_LOCKDOWN: + case FSR_COPROCESSOR_ABORT: + case FSR_ASYNC_EXTERNAL_ABORT: //DFAR invalid + case FSR_ASYNC_PARITY_ERROR: //DFAR invalid + default: + while(1); + } +} + +void CPAbtHandler(uint32_t IFSR, uint32_t IFAR, uint32_t LR) { + uint32_t FS = (IFSR & (1 << 10)) >> 6 | (IFSR & 0x0f); //Store Fault Status + + switch(FS) { + //Synchronous parity errors - retry + case FSR_SYNC_PARITY_ERROR: + case FSR_SYNC_PARITY_TTB_WALK_FIRST: + case FSR_SYNC_PARITY_TTB_WALK_SECOND: + return; + + //Your code here. Value in IFAR is invalid for some fault statuses. + case FSR_SYNC_EXT_TTB_WALK_FIRST: + case FSR_SYNC_EXT_TTB_WALK_SECOND: + case FSR_TRANSLATION_FAULT_FIRST: + case FSR_TRANSLATION_FAULT_SECOND: + case FSR_ACCESS_FLAG_FAULT_FIRST: + case FSR_ACCESS_FLAG_FAULT_SECOND: + case FSR_DOMAIN_FAULT_FIRST: + case FSR_DOMAIN_FAULT_SECOND: + case FSR_PERMISSION_FAULT_FIRST: + case FSR_PERMISSION_FAULT_SECOND: + case FSR_DEBUG_EVENT: //IFAR invalid + case FSR_SYNC_EXT_ABORT: + case FSR_TLB_CONFLICT_ABORT: + case FSR_LOCKDOWN: + case FSR_COPROCESSOR_ABORT: + default: + while(1); + } +} + + +//returns amount to decrement lr by +//this will be 0 when we have emulated the instruction and want to execute the next instruction +//this will be 2 when we have performed some maintenance and want to retry the instruction in Thumb (state == 2) +//this will be 4 when we have performed some maintenance and want to retry the instruction in ARM (state == 4) +uint32_t CUndefHandler(uint32_t opcode, uint32_t state, uint32_t LR) { + const int THUMB = 2; + const int ARM = 4; + //Lazy VFP/NEON initialisation and switching + + // (ARM ARM section A7.5) VFP data processing instruction? + // (ARM ARM section A7.6) VFP/NEON register load/store instruction? + // (ARM ARM section A7.8) VFP/NEON register data transfer instruction? + // (ARM ARM section A7.9) VFP/NEON 64-bit register data transfer instruction? + if ((state == ARM && ((opcode & 0x0C000000) >> 26 == 0x03)) || + (state == THUMB && ((opcode & 0xEC000000) >> 26 == 0x3B))) { + if (((opcode & 0x00000E00) >> 9) == 5) { + __FPU_Enable(); + return state; + } + } + + // (ARM ARM section A7.4) NEON data processing instruction? + if ((state == ARM && ((opcode & 0xFE000000) >> 24 == 0xF2)) || + (state == THUMB && ((opcode & 0xEF000000) >> 24 == 0xEF)) || + // (ARM ARM section A7.7) NEON load/store instruction? + (state == ARM && ((opcode >> 24) == 0xF4)) || + (state == THUMB && ((opcode >> 24) == 0xF9))) { + __FPU_Enable(); + return state; + } + + //Add code here for other Undef cases + while(1); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/mem_ARMCA5.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/mem_ARMCA5.h new file mode 100644 index 0000000..96fc081 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/mem_ARMCA5.h @@ -0,0 +1,94 @@ +/**************************************************************************//** + * @file mem_ARMCA5.h + * @brief Memory base and size definitions (used in scatter file) + * @version V1.00 + * @date 10. January 2018 + * + * @note + * + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 __MEM_ARMCA5_H +#define __MEM_ARMCA5_H + +/*---------------------------------------------------------------------------- + User Stack & Heap size definition + *----------------------------------------------------------------------------*/ +/* +//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +*/ + +/*--------------------- ROM Configuration ------------------------------------ +// +// ROM Configuration +// ROM Base Address <0x0-0xFFFFFFFF:8> +// ROM Size (in Bytes) <0x0-0xFFFFFFFF:8> +// + *----------------------------------------------------------------------------*/ +#define __ROM_BASE 0x80000000 +#define __ROM_SIZE 0x00200000 + +/*--------------------- RAM Configuration ----------------------------------- +// RAM Configuration +// RAM Base Address <0x0-0xFFFFFFFF:8> +// RAM Total Size (in Bytes) <0x0-0xFFFFFFFF:8> +// RW_DATA Size (in Bytes) <0x0-0xFFFFFFFF:8> +// ZI_DATA Size (in Bytes) <0x0-0xFFFFFFFF:8> +// Stack / Heap Configuration +// Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +// Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +// Exceptional Modes +// UND Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +// ABT Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +// SVC Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +// IRQ Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +// FIQ Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +// +// +// + *----------------------------------------------------------------------------*/ +#define __RAM_BASE 0x80200000 +#define __RAM_SIZE 0x00200000 + +#define __RW_DATA_SIZE 0x00100000 +#define __ZI_DATA_SIZE 0x000F0000 + +#define __STACK_SIZE 0x00001000 +#define __HEAP_SIZE 0x00008000 + +#define __UND_STACK_SIZE 0x00000100 +#define __ABT_STACK_SIZE 0x00000100 +#define __SVC_STACK_SIZE 0x00000100 +#define __IRQ_STACK_SIZE 0x00000100 +#define __FIQ_STACK_SIZE 0x00000100 + +/*----------------------------------------------------------------------------*/ + +/*--------------------- TTB Configuration ------------------------------------ +// +// TTB Configuration +// TTB Base Address <0x0-0xFFFFFFFF:8> +// TTB Size (in Bytes) <0x0-0xFFFFFFFF:8> +// + *----------------------------------------------------------------------------*/ +#define __TTB_BASE 0x80500000 +#define __TTB_SIZE 0x00004000 + +#endif /* __MEM_ARMCA5_H */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/mmu_ARMCA5.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/mmu_ARMCA5.c new file mode 100644 index 0000000..91f1432 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/mmu_ARMCA5.c @@ -0,0 +1,235 @@ +/**************************************************************************//** + * @file mmu_ARMCA5.c + * @brief MMU Configuration for ARM Cortex-A5 Device Series + * @version V1.1.0 + * @date 23. November 2018 + * + * @note + * + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +/* Memory map description from: DUI0447G_v2m_p1_trm.pdf 4.2.2 ARM Cortex-A Series memory map + + Memory Type +0xffffffff |--------------------------| ------------ + | FLAG SYNC | Device Memory +0xfffff000 |--------------------------| ------------ + | Fault | Fault +0xfff00000 |--------------------------| ------------ + | | Normal + | | + | Daughterboard | + | memory | + | | +0x80505000 |--------------------------| ------------ + |TTB (L2 Sync Flags ) 4k | Normal +0x80504C00 |--------------------------| ------------ + |TTB (L2 Peripherals-B) 16k| Normal +0x80504800 |--------------------------| ------------ + |TTB (L2 Peripherals-A) 16k| Normal +0x80504400 |--------------------------| ------------ + |TTB (L2 Priv Periphs) 4k | Normal +0x80504000 |--------------------------| ------------ + | TTB (L1 Descriptors) | Normal +0x80500000 |--------------------------| ------------ + | Heap | Normal + |--------------------------| ------------ + | Stack | Normal +0x80400000 |--------------------------| ------------ + | ZI Data | Normal +0x80300000 |--------------------------| ------------ + | RW Data | Normal +0x80200000 |--------------------------| ------------ + | RO Data | Normal + |--------------------------| ------------ + | RO Code | USH Normal +0x80000000 |--------------------------| ------------ + | Daughterboard | Fault + | HSB AXI buses | +0x40000000 |--------------------------| ------------ + | Daughterboard | Fault + | test chips peripherals | +0x2c002000 |--------------------------| ------------ + | Private Address | Device Memory +0x2c000000 |--------------------------| ------------ + | Daughterboard | Fault + | test chips peripherals | +0x20000000 |--------------------------| ------------ + | Peripherals | Device Memory RW/RO + | | & Fault +0x00000000 |--------------------------| +*/ + +// L1 Cache info and restrictions about architecture of the caches (CCSIR register): +// Write-Through support *not* available +// Write-Back support available. +// Read allocation support available. +// Write allocation support available. + +//Note: You should use the Shareable attribute carefully. +//For cores without coherency logic (such as SCU) marking a region as shareable forces the processor to not cache that region regardless of the inner cache settings. +//Cortex-A versions of RTX use LDREX/STREX instructions relying on Local monitors. Local monitors will be used only when the region gets cached, regions that are not cached will use the Global Monitor. +//Some Cortex-A implementations do not include Global Monitors, so wrongly setting the attribute Shareable may cause STREX to fail. + +//Recall: When the Shareable attribute is applied to a memory region that is not Write-Back, Normal memory, data held in this region is treated as Non-cacheable. +//When SMP bit = 0, Inner WB/WA Cacheable Shareable attributes are treated as Non-cacheable. +//When SMP bit = 1, Inner WB/WA Cacheable Shareable attributes are treated as Cacheable. + + +//Following MMU configuration is expected +//SCTLR.AFE == 1 (Simplified access permissions model - AP[2:1] define access permissions, AP[0] is an access flag) +//SCTLR.TRE == 0 (TEX remap disabled, so memory type and attributes are described directly by bits in the descriptor) +//Domain 0 is always the Client domain +//Descriptors should place all memory in domain 0 + +#include "ARMCA5.h" + + +// L2 table pointers +//---------------------------------------- +#define PRIVATE_TABLE_L2_BASE_4k (0x80504000) //Map 4k Private Address space +#define SYNC_FLAGS_TABLE_L2_BASE_4k (0x80504C00) //Map 4k Flag synchronization +#define PERIPHERAL_A_TABLE_L2_BASE_64k (0x80504400) //Map 64k Peripheral #1 0x1C000000 - 0x1C00FFFFF +#define PERIPHERAL_B_TABLE_L2_BASE_64k (0x80504800) //Map 64k Peripheral #2 0x1C100000 - 0x1C1FFFFFF + +//--------------------- PERIPHERALS ------------------- +#define PERIPHERAL_A_FAULT (0x00000000 + 0x1c000000) //0x1C000000-0x1C00FFFF (1M) +#define PERIPHERAL_B_FAULT (0x00100000 + 0x1c000000) //0x1C100000-0x1C10FFFF (1M) + +//--------------------- SYNC FLAGS -------------------- +#define FLAG_SYNC 0xFFFFF000 +#define F_SYNC_BASE 0xFFF00000 //1M aligned + +//Import symbols from linker +extern uint32_t Image$$VECTORS$$Base; +extern uint32_t Image$$RW_DATA$$Base; +extern uint32_t Image$$ZI_DATA$$Base; +extern uint32_t Image$$TTB$$ZI$$Base; + +static uint32_t Sect_Normal; //outer & inner wb/wa, non-shareable, executable, rw, domain 0, base addr 0 +static uint32_t Sect_Normal_Cod; //outer & inner wb/wa, non-shareable, executable, ro, domain 0, base addr 0 +static uint32_t Sect_Normal_RO; //as Sect_Normal_Cod, but not executable +static uint32_t Sect_Normal_RW; //as Sect_Normal_Cod, but writeable and not executable +static uint32_t Sect_Device_RO; //device, non-shareable, non-executable, ro, domain 0, base addr 0 +static uint32_t Sect_Device_RW; //as Sect_Device_RO, but writeable + +/* Define global descriptors */ +static uint32_t Page_L1_4k = 0x0; //generic +static uint32_t Page_L1_64k = 0x0; //generic +static uint32_t Page_4k_Device_RW; //Shared device, not executable, rw, domain 0 +static uint32_t Page_64k_Device_RW; //Shared device, not executable, rw, domain 0 + +void MMU_CreateTranslationTable(void) +{ + mmu_region_attributes_Type region; + + //Create 4GB of faulting entries + MMU_TTSection (&Image$$TTB$$ZI$$Base, 0, 4096, DESCRIPTOR_FAULT); + + /* + * Generate descriptors. Refer to core_ca.h to get information about attributes + * + */ + //Create descriptors for Vectors, RO, RW, ZI sections + section_normal(Sect_Normal, region); + section_normal_cod(Sect_Normal_Cod, region); + section_normal_ro(Sect_Normal_RO, region); + section_normal_rw(Sect_Normal_RW, region); + //Create descriptors for peripherals + section_device_ro(Sect_Device_RO, region); + section_device_rw(Sect_Device_RW, region); + //Create descriptors for 64k pages + page64k_device_rw(Page_L1_64k, Page_64k_Device_RW, region); + //Create descriptors for 4k pages + page4k_device_rw(Page_L1_4k, Page_4k_Device_RW, region); + + + /* + * Define MMU flat-map regions and attributes + * + */ + + //Define Image + MMU_TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$VECTORS$$Base, 2, Sect_Normal_Cod); + MMU_TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$RW_DATA$$Base, 1, Sect_Normal_RW); + MMU_TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$ZI_DATA$$Base, 1, Sect_Normal_RW); + + //all DRAM executable, rw, cacheable - applications may choose to divide memory into ro executable + MMU_TTSection (&Image$$TTB$$ZI$$Base, (uint32_t)&Image$$TTB$$ZI$$Base, 2043, Sect_Normal); + + //--------------------- PERIPHERALS ------------------- + MMU_TTSection (&Image$$TTB$$ZI$$Base, VE_A5_MP_FLASH_BASE0 , 64, Sect_Device_RO); + MMU_TTSection (&Image$$TTB$$ZI$$Base, VE_A5_MP_FLASH_BASE1 , 64, Sect_Device_RO); + MMU_TTSection (&Image$$TTB$$ZI$$Base, VE_A5_MP_SRAM_BASE , 64, Sect_Device_RW); + MMU_TTSection (&Image$$TTB$$ZI$$Base, VE_A5_MP_VRAM_BASE , 32, Sect_Device_RW); + MMU_TTSection (&Image$$TTB$$ZI$$Base, VE_A5_MP_ETHERNET_BASE , 16, Sect_Device_RW); + MMU_TTSection (&Image$$TTB$$ZI$$Base, VE_A5_MP_USB_BASE , 16, Sect_Device_RW); + + // Create (16 * 64k)=1MB faulting entries to cover peripheral range 0x1C000000-0x1C00FFFF + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, PERIPHERAL_A_FAULT , 16, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, DESCRIPTOR_FAULT); + // Define peripheral range 0x1C000000-0x1C00FFFF + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_DAP_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_SYSTEM_REG_BASE, 1, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_SERIAL_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_AACI_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_MMCI_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_KMI0_BASE , 2, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_UART_BASE , 4, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_WDT_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_A_TABLE_L2_BASE_64k, Page_64k_Device_RW); + + // Create (16 * 64k)=1MB faulting entries to cover peripheral range 0x1C100000-0x1C10FFFF + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, PERIPHERAL_B_FAULT , 16, Page_L1_64k, (uint32_t *)PERIPHERAL_B_TABLE_L2_BASE_64k, DESCRIPTOR_FAULT); + // Define peripheral range 0x1C100000-0x1C10FFFF + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_TIMER_BASE , 2, Page_L1_64k, (uint32_t *)PERIPHERAL_B_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_DVI_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_B_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_RTC_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_B_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_UART4_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_B_TABLE_L2_BASE_64k, Page_64k_Device_RW); + MMU_TTPage64k(&Image$$TTB$$ZI$$Base, VE_A5_MP_CLCD_BASE , 1, Page_L1_64k, (uint32_t *)PERIPHERAL_B_TABLE_L2_BASE_64k, Page_64k_Device_RW); + + // Create (256 * 4k)=1MB faulting entries to cover private address space. Needs to be marked as Device memory + MMU_TTPage4k (&Image$$TTB$$ZI$$Base, __get_CBAR() ,256, Page_L1_4k, (uint32_t *)PRIVATE_TABLE_L2_BASE_4k, DESCRIPTOR_FAULT); + // Define private address space entry. + MMU_TTPage4k (&Image$$TTB$$ZI$$Base, __get_CBAR() , 3, Page_L1_4k, (uint32_t *)PRIVATE_TABLE_L2_BASE_4k, Page_4k_Device_RW); + // Define L2CC entry. Uncomment if PL310 is present + // MMU_TTPage4k (&Image$$TTB$$ZI$$Base, VE_A5_MP_PL310_BASE , 1, Page_L1_4k, (uint32_t *)PRIVATE_TABLE_L2_BASE_4k, Page_4k_Device_RW); + + // Create (256 * 4k)=1MB faulting entries to synchronization space (Useful if some non-cacheable DMA agent is present in the SoC) + MMU_TTPage4k (&Image$$TTB$$ZI$$Base, F_SYNC_BASE , 256, Page_L1_4k, (uint32_t *)SYNC_FLAGS_TABLE_L2_BASE_4k, DESCRIPTOR_FAULT); + // Define synchronization space entry. + MMU_TTPage4k (&Image$$TTB$$ZI$$Base, FLAG_SYNC , 1, Page_L1_4k, (uint32_t *)SYNC_FLAGS_TABLE_L2_BASE_4k, Page_4k_Device_RW); + + /* Set location of level 1 page table + ; 31:14 - Translation table base addr (31:14-TTBCR.N, TTBCR.N is 0 out of reset) + ; 13:7 - 0x0 + ; 6 - IRGN[0] 0x1 (Inner WB WA) + ; 5 - NOS 0x0 (Non-shared) + ; 4:3 - RGN 0x01 (Outer WB WA) + ; 2 - IMP 0x0 (Implementation Defined) + ; 1 - S 0x0 (Non-shared) + ; 0 - IRGN[1] 0x0 (Inner WB WA) */ + __set_TTBR0(((uint32_t)&Image$$TTB$$ZI$$Base) | 0x48); + __ISB(); + + /* Set up domain access control register + ; We set domain 0 to Client and all other domains to No Access. + ; All translation table entries specify domain 0 */ + __set_DACR(1); + __ISB(); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/startup_ARMCA5.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/startup_ARMCA5.c new file mode 100644 index 0000000..19c343b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/startup_ARMCA5.c @@ -0,0 +1,138 @@ +/****************************************************************************** + * @file startup_ARMCA5.c + * @brief CMSIS Device System Source File for Arm Cortex-A5 Device Series + * @version V1.00 + * @date 10. January 2018 + * + * @note + * + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include + +/*---------------------------------------------------------------------------- + Definitions + *----------------------------------------------------------------------------*/ +#define USR_MODE 0x10 // User mode +#define FIQ_MODE 0x11 // Fast Interrupt Request mode +#define IRQ_MODE 0x12 // Interrupt Request mode +#define SVC_MODE 0x13 // Supervisor mode +#define ABT_MODE 0x17 // Abort mode +#define UND_MODE 0x1B // Undefined Instruction mode +#define SYS_MODE 0x1F // System mode + +/*---------------------------------------------------------------------------- + Internal References + *----------------------------------------------------------------------------*/ +void Vectors (void) __attribute__ ((naked, section("RESET"))); +void Reset_Handler (void) __attribute__ ((naked)); + +/*---------------------------------------------------------------------------- + Exception / Interrupt Handler + *----------------------------------------------------------------------------*/ +void Undef_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); +void SVC_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); +void PAbt_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); +void DAbt_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); +void IRQ_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); +void FIQ_Handler (void) __attribute__ ((weak, alias("Default_Handler"))); + +/*---------------------------------------------------------------------------- + Exception / Interrupt Vector Table + *----------------------------------------------------------------------------*/ +void Vectors(void) { + __ASM volatile( + "LDR PC, =Reset_Handler \n" + "LDR PC, =Undef_Handler \n" + "LDR PC, =SVC_Handler \n" + "LDR PC, =PAbt_Handler \n" + "LDR PC, =DAbt_Handler \n" + "NOP \n" + "LDR PC, =IRQ_Handler \n" + "LDR PC, =FIQ_Handler \n" + ); +} + +/*---------------------------------------------------------------------------- + Reset Handler called on controller reset + *----------------------------------------------------------------------------*/ +void Reset_Handler(void) { + __ASM volatile( + + // Mask interrupts + "CPSID if \n" + + // Put any cores other than 0 to sleep + "MRC p15, 0, R0, c0, c0, 5 \n" // Read MPIDR + "ANDS R0, R0, #3 \n" + "goToSleep: \n" + "WFINE \n" + "BNE goToSleep \n" + + // Reset SCTLR Settings + "MRC p15, 0, R0, c1, c0, 0 \n" // Read CP15 System Control register + "BIC R0, R0, #(0x1 << 12) \n" // Clear I bit 12 to disable I Cache + "BIC R0, R0, #(0x1 << 2) \n" // Clear C bit 2 to disable D Cache + "BIC R0, R0, #0x1 \n" // Clear M bit 0 to disable MMU + "BIC R0, R0, #(0x1 << 11) \n" // Clear Z bit 11 to disable branch prediction + "BIC R0, R0, #(0x1 << 13) \n" // Clear V bit 13 to disable hivecs + "MCR p15, 0, R0, c1, c0, 0 \n" // Write value back to CP15 System Control register + "ISB \n" + + // Configure ACTLR + "MRC p15, 0, r0, c1, c0, 1 \n" // Read CP15 Auxiliary Control Register + "ORR r0, r0, #(1 << 1) \n" // Enable L2 prefetch hint (UNK/WI since r4p1) + "MCR p15, 0, r0, c1, c0, 1 \n" // Write CP15 Auxiliary Control Register + + // Set Vector Base Address Register (VBAR) to point to this application's vector table + "LDR R0, =Vectors \n" + "MCR p15, 0, R0, c12, c0, 0 \n" + + // Setup Stack for each exceptional mode + "CPS #0x11 \n" + "LDR SP, =Image$$FIQ_STACK$$ZI$$Limit \n" + "CPS #0x12 \n" + "LDR SP, =Image$$IRQ_STACK$$ZI$$Limit \n" + "CPS #0x13 \n" + "LDR SP, =Image$$SVC_STACK$$ZI$$Limit \n" + "CPS #0x17 \n" + "LDR SP, =Image$$ABT_STACK$$ZI$$Limit \n" + "CPS #0x1B \n" + "LDR SP, =Image$$UND_STACK$$ZI$$Limit \n" + "CPS #0x1F \n" + "LDR SP, =Image$$ARM_LIB_STACK$$ZI$$Limit \n" + + // Call SystemInit + "BL SystemInit \n" + + // Unmask interrupts + "CPSIE if \n" + + // Call __main + "BL __main \n" + ); +} + +/*---------------------------------------------------------------------------- + Default Handler for Exceptions / Interrupts + *----------------------------------------------------------------------------*/ +void Default_Handler(void) { + while(1); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/system_ARMCA5.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/system_ARMCA5.c new file mode 100644 index 0000000..cca3026 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/system_ARMCA5.c @@ -0,0 +1,93 @@ +/****************************************************************************** + * @file system_ARMCA5.c + * @brief CMSIS Device System Source File for Arm Cortex-A5 Device Series + * @version V1.0.1 + * @date 13. February 2019 + * + * @note + * + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "RTE_Components.h" +#include CMSIS_device_header +#include "irq_ctrl.h" + +#define SYSTEM_CLOCK 12000000U + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System Initialization + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ +/* do not use global variables because this function is called before + reaching pre-main. RW section may be overwritten afterwards. */ + + // Invalidate entire Unified TLB + __set_TLBIALL(0); + + // Invalidate entire branch predictor array + __set_BPIALL(0); + __DSB(); + __ISB(); + + // Invalidate instruction cache and flush branch target cache + __set_ICIALLU(0); + __DSB(); + __ISB(); + + // Invalidate data cache + L1C_InvalidateDCacheAll(); + +#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) + // Enable FPU + __FPU_Enable(); +#endif + + // Create Translation Table + MMU_CreateTranslationTable(); + + // Enable MMU + MMU_Enable(); + + // Enable Caches + L1C_EnableCaches(); + L1C_EnableBTAC(); + +#if (__L2C_PRESENT == 1) + // Enable GIC + L2C_Enable(); +#endif + + // IRQ Initialize + IRQ_Initialize(); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/system_ARMCA5.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/system_ARMCA5.h new file mode 100644 index 0000000..4b61321 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/Device/ARMCA5/system_ARMCA5.h @@ -0,0 +1,65 @@ +/****************************************************************************** + * @file system_ARMCA5.h + * @brief CMSIS Device System Header File for Arm Cortex-A5 Device Series + * @version V1.00 + * @date 10. January 2018 + * + * @note + * + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 __SYSTEM_ARMCA5_H +#define __SYSTEM_ARMCA5_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +/** + \brief Setup the microcontroller system. + + Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit (void); + + +/** + \brief Update SystemCoreClock variable. + + Updates the SystemCoreClock with current core Clock retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate (void); + +/** + \brief Create Translation Table. + + Creates Memory Management Unit Translation Table. + */ +extern void MMU_CreateTranslationTable(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __SYSTEM_ARMCA5_H */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/RTE_Components.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/RTE_Components.h new file mode 100644 index 0000000..ca6dcf3 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/RTE/RTE_Components.h @@ -0,0 +1,20 @@ +/* + * Auto generated Run-Time-Environment Component Configuration File + * *** Do not modify ! *** + * + * Project: DspLibTest_FVP_A5 + * RTE configuration: DspLibTest_FVP_A5.rteconfig +*/ +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + +/* + * Define the Device Header File: +*/ +#define CMSIS_device_header "ARMCA5.h" + +#define RTE_CMSIS_RTOS2 /* CMSIS-RTOS2 */ + #define RTE_CMSIS_RTOS2_RTX5 /* CMSIS-RTOS2 Keil RTX5 */ + #define RTE_CMSIS_RTOS2_RTX5_SOURCE /* CMSIS-RTOS2 Keil RTX5 Source */ + +#endif /* RTE_COMPONENTS_H */ diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/main.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/main.c new file mode 100644 index 0000000..a6b31da --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_FVP_A5/main.c @@ -0,0 +1,34 @@ +/* -------------------------------------------------------------------------- + * Copyright (c) 2013-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + * + *---------------------------------------------------------------------------*/ + +#include + +#include "jtest.h" +#include "all_tests.h" +#include "arm_math.h" + + +int main (void) { + + JTEST_INIT(); /* Initialize test framework. */ + JTEST_GROUP_CALL(all_tests); /* Run all tests. */ + JTEST_ACT_EXIT_FW(); /* Exit test framework. */ + + while(1); /* Never return */ +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_MPS2/HowTo.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_MPS2/HowTo.txt new file mode 100644 index 0000000..865ac15 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_MPS2/HowTo.txt @@ -0,0 +1,29 @@ + +Used board: + MPS2+. + +Used BIOS: + mbb_v121.ebf ; use this for ULINKpro + mbb_v220.ebf ; CMSIS-DAP + +Used Images: + AN382\an382_v3.txt ; Cortex-M0 + AN385\an385_v3.txt ; Cortex-M3 + AN386\an386_v3.txt ; Cortex-M4 + AN500\an500_v1.txt ; Cortex-M7 + AN505\an505_v2.txt ; Cortex-M33 (IoT Kit) + AN519\an519_v1.txt ; Cortex-M23 (IoT Kit) + +Used Debugger: + IoT Kit: + ULINKpro, JTAG, 25MHz, HW Reset + other: + ULINKpro, JTAG, 25MHz, Autodetect + +Memory Settings: + IoT Kit: + ROM: 0x10000000 + RAM: 0x38000000 + other: + ROM: 0x00000000 + RAM: 0x20000000 \ No newline at end of file diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MBLl_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MBLl_config.txt new file mode 100644 index 0000000..00ed7ca --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MBLl_config.txt @@ -0,0 +1,11 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLl_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLl_config.txt new file mode 100644 index 0000000..c6863de --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLl_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=0 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLld_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLld_config.txt new file mode 100644 index 0000000..8c29693 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLld_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=1 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLldfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLldfsp_config.txt new file mode 100644 index 0000000..d9eb125 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLldfsp_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=1 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLlfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLlfsp_config.txt new file mode 100644 index 0000000..bb967fe --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/ARMv8MMLlfsp_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=0 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM0l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM0l_config.txt new file mode 100644 index 0000000..9f2cb42 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM0l_config.txt @@ -0,0 +1,8 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm0ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm0ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm0ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm0ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM3l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM3l_config.txt new file mode 100644 index 0000000..0a9b07f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM3l_config.txt @@ -0,0 +1,8 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm3ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm3ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm3ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm3ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM4l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM4l_config.txt new file mode 100644 index 0000000..674c929 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM4l_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm4ct.vfp-present=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm4ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm4ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm4ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm4ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM4lf_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM4lf_config.txt new file mode 100644 index 0000000..92c17ff --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM4lf_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm4ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm4ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm4ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm4ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm4ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7l_config.txt new file mode 100644 index 0000000..2bc5193 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7l_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7lfdp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7lfdp_config.txt new file mode 100644 index 0000000..e7f7596 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7lfdp_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7lfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7lfsp_config.txt new file mode 100644 index 0000000..e7f7596 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_FVP/cortexM7lfsp_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MBLl_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MBLl_config.txt new file mode 100644 index 0000000..00ed7ca --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MBLl_config.txt @@ -0,0 +1,11 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLl_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLl_config.txt new file mode 100644 index 0000000..c6863de --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLl_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=0 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLld_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLld_config.txt new file mode 100644 index 0000000..8c29693 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLld_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=1 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLldfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLldfsp_config.txt new file mode 100644 index 0000000..d9eb125 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLldfsp_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=1 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLlfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLlfsp_config.txt new file mode 100644 index 0000000..bb967fe --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/ARMv8MMLlfsp_config.txt @@ -0,0 +1,13 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +cpu0.FPU=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +cpu0.DSP=0 # (bool , init-time) default = '1' : Set whether the model has the DSP extension +cpu0.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +cpu0.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +cpu0.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +cpu0.SECEXT=0 # (bool , init-time) default = '1' : Whether the ARMv8-M Security Extensions are included +idau.NUM_IDAU_REGION=0x0 # (int , init-time) default = '0xA' : +fvp_mps2.DISABLE_GATING=1 # (bool , init-time) default = '0' : Disable Memory gating logic +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM0l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM0l_config.txt new file mode 100644 index 0000000..9f2cb42 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM0l_config.txt @@ -0,0 +1,8 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm0ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm0ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm0ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm0ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM3l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM3l_config.txt new file mode 100644 index 0000000..0a9b07f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM3l_config.txt @@ -0,0 +1,8 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm3ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm3ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm3ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm3ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM4l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM4l_config.txt new file mode 100644 index 0000000..674c929 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM4l_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm4ct.vfp-present=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm4ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm4ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm4ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm4ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM4lf_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM4lf_config.txt new file mode 100644 index 0000000..92c17ff --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM4lf_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm4ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm4ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm4ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm4ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm4ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7l_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7l_config.txt new file mode 100644 index 0000000..2bc5193 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7l_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=0 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7lfdp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7lfdp_config.txt new file mode 100644 index 0000000..e7f7596 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7lfdp_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7lfsp_config.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7lfsp_config.txt new file mode 100644 index 0000000..e7f7596 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/DspLibTest_SV_MPS2/cortexM7lfsp_config.txt @@ -0,0 +1,9 @@ +# Parameters: +# instance.parameter=value #(type, mode) default = 'def value' : description : [min..max] +#---------------------------------------------------------------------------------------------- +armcortexm7ct.vfp-present=1 # (bool , init-time) default = '1' : Set whether the model has VFP support +armcortexm7ct.semihosting-enable=0 # (bool , init-time) default = '1' : Enable semihosting SVC traps. Applications that do not use semihosting must set this parameter to false. +armcortexm7ct.min_sync_level=0x3 # (int , run-time ) default = '0x0' : force minimum syncLevel (0=off=default,1=syncState,2=postInsnIO,3=postInsnAll) : [0x0..0x3] +armcortexm7ct.cpi_mul=0x1 # (int , run-time ) default = '0x1' : multiplier for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +armcortexm7ct.cpi_div=0x1 # (int , run-time ) default = '0x1' : divider for calculating CPI (Cycles Per Instruction) : [0x1..0x7FFFFFFF] +#---------------------------------------------------------------------------------------------- diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo.txt new file mode 100644 index 0000000..b4f61db --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo.txt @@ -0,0 +1,137 @@ +HowTo DSP_Lib_TestSuite 18.02.2019 +======================================= + +This file describes the folder structure, content, prerequisites and instructions to validate the +build of the CMSIS-DSP library. This is done by processing input data sets using the DSP Library +functions executing on a target simulator or hardware. The output data sets are then compared +with the reference data set produced by unoptimized DSP functions and a Signal to Noise Ratio (SNR) +is computed. If the SNR is below a defined threshold the test is considered "passed". + + +Folder structure +---------------- + .\DSP_Lib_TestSuite Batch files for building the reference libraries and running the tests. + .\DSP_Lib_TestSuite\Common + .\DSP_Lib_TestSuite\Common\inc DSP_Lib test include files + .\DSP_Lib_TestSuite\Common\JTest JTEST Test Framework + INI files for uVision + .\DSP_Lib_TestSuite\Common\platform ARM/GCC device startup/system files + .\DSP_Lib_TestSuite\Common\src DSP_Lib test source files + .\DSP_Lib_TestSuite\DspLibTest_FVP ARM/GCC DSP_Lib test projects for Fixed Virtual Platforms + .\DSP_Lib_TestSuite\DspLibTest_MPS2 ARM/GCC DSP_Lib test projects for MPS2 + .\DSP_Lib_TestSuite\DspLibTest_Simulator ARM/GCC DSP_Lib test projects for uVision simulator + .\DSP_Lib_TestSuite\RefLibs ARM/GCC DSP_Lib reference libraries (and projects) + + + +Prerequisites +-------------- + - Python (running on Windows). Tested with ActivePython 2.7.8.10. + - Keil MDK-ARM (tested with MDK-ARM 5.22: http://www2.keil.com/mdk5) + - ULINKpro debug adapter (http://www2.keil.com/mdk5/ulink) + - MPS2 (Cortex-M Prototyping System:https://www.arm.com/products/tools/development-boards/versatile-express/cortex-m-prototyping-system.php) + - CMSIS 5.0.0 (https://github.com/ARM-software/CMSIS_5/releases/tag/5.0.0) + + +Setup +------ + - remove 'read-only' tag from folder .\CMSIS\DSP\Lib + (required for rebuild of the DSP_Lib libraries) + + - open a Windows command window in folder .\CMSIS\DSP\DSP_Lib_TestSuite. + + + +How to run the tests +--------------------- + +a) build the DSP_Lib libraries: + - batch file: buildDspLibs.bat + Note: only require if the DSP_Lib source code got updated or the desired configuration is missing + buildDspLibs.bat overwrites the prebuild libraries in .\CMSIS\DSP\Lib. + Log files of the build process are generated in folder .\CMSIS\DSP\DSP_Lib/[ARM|GCC] + - run: buildDspLibs.bat in a Windows command window in folder .\CMSIS\DSP\DSP_Lib_TestSuite + buildDspLibs ARM -> builds the ARMCC libraries + buildDspLibs GCC -> builds the GCC libraries + +b) build the reference libraries: + - batch file: buildRefLibs.bat + + Log files of the build process are generated in folder .\CMSIS\DSP\DSP_Lib_TestSuite\RefLibs/[ARM|GCC] + - run: buildRefLibs.bat in a Windows command window in folder .\CMSIS\DSP\DSP_Lib_TestSuite + buildRefLibs ARM -> builds the ARMCC reference libraries + buildRefLibs GCC -> builds the GCC reference libraries + +c) running an individual test using uVision (MDK-ARM): + - batch file: runTest.bat + - run: runTest.bat in a Windows command window in folder .\CMSIS\DSP\DSP_Lib_TestSuite + runTest -> prints usage information + e.g. runTest ARM cortexM4lf Simulator -> runs the test for toolchain ARM, Cortex-M4 littel endian with FPU, uVision Simulator. + + Tests running on MPS2 requires additional steps to setup. See section 'MPS2'. + +d) parsing the test output log file + - script: parseLog.py + - run: parseLog.py python script in a Windows command window in folder .\CMSIS\DSP\DSP_Lib_TestSuite + command line options should match the invocation of the runTest executed before. + e.g: runTest ARM cortexM4lf Simulator -> python parseLog.py ARM cortexM4lf Simulator + + - check the test log + depending on your test parameters change into the required folder + .\DSP_Lib_TestSuite\DspLibTest_[FVP|MPS2|Simulator]\[ARM|GCC]\Logs + the folder will contain the following files (e.g. for a 'runTest') : + DspLibTest_Simulator.log raw result of the last test run. + DspLibTest_Simulator_cortexM4lf.log raw result of a cortexM4lf test run + DspLibTest_Simulator_cortexM4lf_build.log build result of cortexM4lf test + DspLibTest_Simulator_cortexM4lf_parsed.log parsed log of raw result of a cortexM4lf test run + DspLibTest_Simulator_cortexM4lf_time.log log how long the test took (some tests e.g. M0 take really a long time!). + 'runTest' produces files of the format: DspLibTest__... + + +Differences between the tests for FVP, MPS2, Simulator +------------------------------------------------------ + - all tests are identical except for: + 'Simulator' uses uVision with uVision simulator and generates also code coverage information + can be used for little/big endian tests + ! do not use 'Simulator' for M7 with FPU -> no uVision simulation available. + ! do not use 'Simulator' for ARMv8-M devices -> no uVision simulation available. + 'MPS2' uses uVision with ULINKpro debugger and MPS2. No code coverage information is generated. + can be used for little endian only (because of the lack of MPS2 FPGA images). + 'FVP' uses uVision with Models debugger. No code coverage information is generated. + can be used for little/big endian tests. + ! config files must be prepared. + ! uVision target for big endianess are not yet prepared. + + +Setup 'MPS2' +------------- + - load the appropriate FPGA image to the MPS2 board matching the CPU of the test builds prior to running the test + - check if ULINKpro can connect with the configured debug connection (JTAG or SWD) as this must + match the protocol implemented in the FPGA image. + + +How to select tests for "run all tests" +---------------------------------------- + - edit .\CMSIS\DSP\DSP_Lib_TestSuite\Common\src\all_tests.c + comment out all unwanted test groups. + e.g. // JTEST_GROUP_CALL(complex_math_tests); + + - edit .\CMSIS\DSP\DSP_Lib_TestSuite\Common\src\/_group.c + comment out all unwanted sub test groups. + e.g. file .\DSP_Lib_TestSuite\Common\src\basic_math_tests\basic_math_test_group.c -> // JTEST_GROUP_CALL(abs_tests); + + - edit .\CMSIS\DSP\DSP_Lib_TestSuite\Common\src\/_tests.c + comment out all unwanted tests. + e.g. file .\DSP_Lib_TestSuite\Common\src\basic_math_tests\abs_tests.c -> // JTEST_TEST_CALL(arm_abs_f32_test); + + +Notes +----- + - How to use ARM Clang (ARM Compiler 6): + in uVision 'Options for Target' tab you can select which compiler to use + by default uVision uses ARMCC V5 for Cortex-M devices and ARMCLANG V6 only for ARMv8M. + Only ARMv8M cores have been tested using ARMCLANG + + - test data used for the tests is used as provided by DSP Concepts. + + - some tests run for a very long time before they finish. This is expected + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo_SV.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo_SV.txt new file mode 100644 index 0000000..41a295c --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/HowTo_SV.txt @@ -0,0 +1,117 @@ +HowTo DSP_Lib_TestSuite (Source Variant) 18.02.2019 +====================================================== + +This file describes the folder structure, content, prerequisites and instructions to validate the +build of the CMSIS-DSP library. This is done by processing input data sets using the DSP Library +functions executing on a target simulator or hardware. The output data sets are then compared +with the reference data set produced by unoptimized DSP functions and a Signal to Noise Ratio (SNR) +is computed. If the SNR is below a defined threshold the test is considered "passed". + + +Folder structure +---------------- + .\DSP_Lib_TestSuite Batch files for building the reference libraries and running the tests. + .\DSP_Lib_TestSuite\Common + .\DSP_Lib_TestSuite\Common\inc DSP_Lib test include files + .\DSP_Lib_TestSuite\Common\JTest JTEST Test Framework + INI files for uVision + .\DSP_Lib_TestSuite\Common\platform ARM/GCC device startup/system files + .\DSP_Lib_TestSuite\Common\src DSP_Lib test source files + .\DSP_Lib_TestSuite\DspLibTest_FVP ARM/GCC DSP_Lib test projects for Fixed Virtual Platforms + .\DSP_Lib_TestSuite\DspLibTest_MPS2 ARM/GCC DSP_Lib test projects for MPS2 + .\DSP_Lib_TestSuite\DspLibTest_Simulator ARM/GCC DSP_Lib test projects for uVision simulator + .\DSP_Lib_TestSuite\RefLibs ARM/GCC DSP_Lib reference libraries (and projects) + + + +Prerequisites +-------------- + - Python (running on Windows). Tested with ActivePython 2.7.8.10. + - Keil MDK-ARM (tested with MDK-ARM 5.22: http://www2.keil.com/mdk5) + - ULINKpro debug adapter (http://www2.keil.com/mdk5/ulink) + - MPS2 (Cortex-M Prototyping System:https://www.arm.com/products/tools/development-boards/versatile-express/cortex-m-prototyping-system.php) + - CMSIS 5.0.0 (https://github.com/ARM-software/CMSIS_5/releases/tag/5.0.0) + + +Setup +------ + - open a Windows command window in folder .\CMSIS\DSP\DSP_Lib_TestSuite. + + + +How to run the tests +--------------------- + +a) running an individual test using uVision (MDK-ARM): + - batch file: runTest_SV.bat + - run: runTest_SV.bat in a Windows command window in folder .\CMSIS\DSP\DSP_Lib_TestSuite + runTest_SV -> prints usage information + e.g. runTest_SV ARM cortexM4lf Simulator -> runs the test for toolchain ARM, Cortex-M4 littel endian with FPU, uVision Simulator. + + Tests running on MPS2 requires additional steps to setup. See section 'MPS2'. + +d) parsing the test output log file + - script: parseLog_SV.py + - run: parseLog_SV.py python script in a Windows command window in folder .\CMSIS\DSP\DSP_Lib_TestSuite + command line options should match the invocation of the runTest executed before. + e.g: runTest ARM cortexM4lf Simulator -> python parseLog.py ARM cortexM4lf Simulator + + - check the test log + depending on your test parameters change into the required folder + .\DSP_Lib_TestSuite\DspLibTest_[FVP|MPS2|Simulator]\[ARM|GCC]\Logs + the folder will contain the following files (e.g. for a 'runTest') : + DspLibTest_Simulator.log raw result of the last test run. + DspLibTest_Simulator_cortexM4lf.log raw result of a cortexM4lf test run + DspLibTest_Simulator_cortexM4lf_build.log build result of cortexM4lf test + DspLibTest_Simulator_cortexM4lf_parsed.log parsed log of raw result of a cortexM4lf test run + DspLibTest_Simulator_cortexM4lf_time.log log how long the test took (some tests e.g. M0 take really a long time!). + 'runTest' produces files of the format: DspLibTest__... + + +Differences between the tests for FVP, MPS2, Simulator +------------------------------------------------------ + - all tests are identical except for: + 'Simulator' uses uVision with uVision simulator and generates also code coverage information + can be used for little/big endian tests + ! do not use 'Simulator' for M7 with FPU -> no uVision simulation available. + ! do not use 'Simulator' for ARMv8-M devices -> no uVision simulation available. + 'MPS2' uses uVision with ULINKpro debugger and MPS2. No code coverage information is generated. + can be used for little endian only (because of the lack of MPS2 FPGA images). + 'FVP' uses uVision with Models debugger. No code coverage information is generated. + can be used for little/big endian tests. + ! config files must be prepared. + ! uVision target for big endianess are not yet prepared. + + +Setup 'MPS2' +------------- + - load the appropriate FPGA image to the MPS2 board matching the CPU of the test builds prior to running the test + - check if ULINKpro can connect with the configured debug connection (JTAG or SWD) as this must + match the protocol implemented in the FPGA image. + + +How to select tests for "run all tests" +---------------------------------------- + - edit .\CMSIS\DSP\DSP_Lib_TestSuite\Common\src\all_tests.c + comment out all unwanted test groups. + e.g. // JTEST_GROUP_CALL(complex_math_tests); + + - edit .\CMSIS\DSP\DSP_Lib_TestSuite\Common\src\/_group.c + comment out all unwanted sub test groups. + e.g. file .\DSP_Lib_TestSuite\Common\src\basic_math_tests\basic_math_test_group.c -> // JTEST_GROUP_CALL(abs_tests); + + - edit .\CMSIS\DSP\DSP_Lib_TestSuite\Common\src\/_tests.c + comment out all unwanted tests. + e.g. file .\DSP_Lib_TestSuite\Common\src\basic_math_tests\abs_tests.c -> // JTEST_TEST_CALL(arm_abs_f32_test); + + +Notes +----- + - How to use ARM Clang (ARM Compiler 6): + in uVision 'Options for Target' tab you can select which compiler to use + by default uVision uses ARMCC V5 for Cortex-M devices and ARMCLANG V6 only for ARMv8M. + Only ARMv8M cores have been tested using ARMCLANG + + - test data used for the tests is used as provided by DSP Concepts. + + - some tests run for a very long time before they finish. This is expected + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/CMakeLists.txt b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/CMakeLists.txt new file mode 100644 index 0000000..fd42f1e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/CMakeLists.txt @@ -0,0 +1,78 @@ +cmake_minimum_required (VERSION 3.6) + +project(DspRefLibs) + +# Needed to find the config modules +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../..) + + + + +set(REFSRC src/BasicMathFunctions/abs.c + src/BasicMathFunctions/add.c + src/BasicMathFunctions/dot_prod.c + src/BasicMathFunctions/mult.c + src/BasicMathFunctions/negate.c + src/BasicMathFunctions/offset.c + src/BasicMathFunctions/scale.c + src/BasicMathFunctions/shift.c + src/BasicMathFunctions/sub.c + src/ComplexMathFunctions/cmplx_conj.c + src/ComplexMathFunctions/cmplx_dot_prod.c + src/ComplexMathFunctions/cmplx_mag.c + src/ComplexMathFunctions/cmplx_mag_squared.c + src/ComplexMathFunctions/cmplx_mult_cmplx.c + src/ComplexMathFunctions/cmplx_mult_real.c + src/ControllerFunctions/pid.c + src/ControllerFunctions/sin_cos.c + src/FastMathFunctions/cos.c + src/FastMathFunctions/sin.c + src/FastMathFunctions/sqrt.c + src/FilteringFunctions/biquad.c + src/FilteringFunctions/conv.c + src/FilteringFunctions/correlate.c + src/FilteringFunctions/fir.c + src/FilteringFunctions/fir_decimate.c + src/FilteringFunctions/fir_interpolate.c + src/FilteringFunctions/fir_lattice.c + src/FilteringFunctions/fir_sparse.c + src/FilteringFunctions/iir_lattice.c + src/FilteringFunctions/lms.c + src/HelperFunctions/mat_helper.c + src/HelperFunctions/ref_helper.c + src/Intrinsics/intrinsics.c + src/MatrixFunctions/mat_add.c + src/MatrixFunctions/mat_cmplx_mult.c + src/MatrixFunctions/mat_inverse.c + src/MatrixFunctions/mat_mult.c + src/MatrixFunctions/mat_scale.c + src/MatrixFunctions/mat_sub.c + src/MatrixFunctions/mat_trans.c + src/StatisticsFunctions/max.c + src/StatisticsFunctions/mean.c + src/StatisticsFunctions/min.c + src/StatisticsFunctions/power.c + src/StatisticsFunctions/rms.c + src/StatisticsFunctions/std.c + src/StatisticsFunctions/var.c + src/SupportFunctions/copy.c + src/SupportFunctions/fill.c + src/SupportFunctions/fixed_to_fixed.c + src/SupportFunctions/fixed_to_float.c + src/SupportFunctions/float_to_fixed.c + src/TransformFunctions/bitreversal.c + src/TransformFunctions/cfft.c + src/TransformFunctions/dct4.c + src/TransformFunctions/rfft.c + ) + +add_library(DspRefLibs STATIC ${REFSRC}) + +include(config) +configdsp(DspRefLibs ../../Source) + +### Includes +target_include_directories(DspRefLibs PUBLIC "inc") +target_include_directories(DspRefLibs PUBLIC "../../Include") + + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/inc/ref.h b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/inc/ref.h new file mode 100644 index 0000000..04f9b3b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/inc/ref.h @@ -0,0 +1,1401 @@ + +#ifndef _REF_H +#define _REF_H + +#include +#include +#include "arm_math.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifndef PI +#define PI 3.14159265358979f +#endif + + /** + * @brief 8-bit fractional data type in 1.7 format. + */ +// typedef int8_t q7_t; + + /** + * @brief 16-bit fractional data type in 1.15 format. + */ +// typedef int16_t q15_t; + + /** + * @brief 32-bit fractional data type in 1.31 format. + */ +// typedef int32_t q31_t; + + /** + * @brief 64-bit fractional data type in 1.63 format. + */ +// typedef int64_t q63_t; + + /** + * @brief 32-bit floating-point type definition. + */ +// typedef float float32_t; + + /** + * @brief 64-bit floating-point type definition. + */ +// typedef double float64_t; + + + /** + * @brief Error status returned by some functions in the library. + */ + + typedef enum + { + REF_Q7 = 0, + REF_Q15, + REF_Q31, + REF_F32, + } dataType; + + +#ifndef FLT_MAX +#define FLT_MAX 3.40282347e+38F +#endif + +#define DBL_MAX 1.79769313486231571e+308 + +#ifndef FLT_MIN +#define FLT_MIN 1.175494351e-38F +#endif +#define DBL_MIN 2.22507385850720138e-308 + +#define SCHAR_MIN (-128) + /* mimimum value for an object of type signed char */ +#define SCHAR_MAX 127 + /* maximum value for an object of type signed char */ +#define UCHAR_MAX 255 + /* maximum value for an object of type unsigned char */ +#define SHRT_MIN (-0x8000) + /* minimum value for an object of type short int */ +#define SHRT_MAX 0x7fff + /* maximum value for an object of type short int */ +#define USHRT_MAX 65535 + /* maximum value for an object of type unsigned short int */ +#define INT_MIN (~0x7fffffff) /* -2147483648 and 0x80000000 are unsigned */ + /* minimum value for an object of type int */ +#define INT_MAX 0x7fffffff + /* maximum value for an object of type int */ +#define UINT_MAX 0xffffffffU + /* maximum value for an object of type unsigned int */ +#define LONG_MIN (~0x7fffffffL) + /* minimum value for an object of type long int */ +#define LONG_MAX 0x7fffffffL + /* maximum value for an object of type long int */ +#define ULONG_MAX 0xffffffffUL + /* maximum value for an object of type unsigned long int */ + + /* + * Ref Lib Global Variables + */ +extern float32_t scratchArray[]; +extern arm_cfft_instance_f32 ref_cfft_sR_f32_len8192; + + /* + * Ref Lib Functions + */ + + /* + * Helper Functions + */ +q31_t ref_sat_n(q31_t num, uint32_t bits); + +q31_t ref_sat_q31(q63_t num); + +q15_t ref_sat_q15(q31_t num); + +q7_t ref_sat_q7(q15_t num); + +float32_t ref_pow(float32_t a, uint32_t b); + +extern float32_t tempMatrixArray[]; + +float32_t ref_detrm(float32_t *pSrc, float32_t *temp, uint32_t size); + +void ref_cofact(float32_t *pSrc, float32_t *pDst, float32_t *temp, uint32_t size); + +float64_t ref_detrm64(float64_t *pSrc, float64_t *temp, uint32_t size); + +void ref_cofact64(float64_t *pSrc, float64_t *pDst, float64_t *temp, uint32_t size); + + /* + * Basic Math Functions + */ +void ref_abs_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_abs_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_abs_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_abs_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +void ref_add_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + +void ref_add_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + +void ref_add_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + +void ref_add_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + +void ref_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t blockSize, + float32_t * result); + +void ref_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t blockSize, + q63_t * result); + +void ref_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t blockSize, + q63_t * result); + +void ref_dot_prod_q7( + q7_t * pSrcA, + q7_t * pSrcB, + uint32_t blockSize, + q31_t * result); + +void ref_mult_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + +void ref_mult_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + +void ref_mult_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + +void ref_mult_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + +void ref_negate_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_negate_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_negate_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_negate_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +void ref_offset_f32( + float32_t * pSrc, + float32_t offset, + float32_t * pDst, + uint32_t blockSize); + +void ref_offset_q31( + q31_t * pSrc, + q31_t offset, + q31_t * pDst, + uint32_t blockSize); + +void ref_offset_q15( + q15_t * pSrc, + q15_t offset, + q15_t * pDst, + uint32_t blockSize); + +void ref_offset_q7( + q7_t * pSrc, + q7_t offset, + q7_t * pDst, + uint32_t blockSize); + +void ref_scale_f32( + float32_t * pSrc, + float32_t scale, + float32_t * pDst, + uint32_t blockSize); + +void ref_scale_q31( + q31_t * pSrc, + q31_t scaleFract, + int8_t shift, + q31_t * pDst, + uint32_t blockSize); + +void ref_scale_q15( + q15_t * pSrc, + q15_t scaleFract, + int8_t shift, + q15_t * pDst, + uint32_t blockSize); + +void ref_scale_q7( + q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize); + +void ref_shift_q31( + q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize); + +void ref_shift_q15( + q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize); + +void ref_shift_q7( + q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize); + +void ref_sub_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + +void ref_sub_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + +void ref_sub_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + +void ref_sub_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + /* + * Complex Math Functions + */ +void ref_cmplx_conj_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + +void ref_cmplx_conj_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + +void ref_cmplx_conj_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + +void ref_cmplx_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t numSamples, + float32_t * realResult, + float32_t * imagResult); + +void ref_cmplx_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult); + +void ref_cmplx_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult); + +void ref_cmplx_mag_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mag_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mag_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mag_squared_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mag_squared_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mag_squared_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mult_cmplx_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mult_cmplx_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mult_cmplx_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples); + +void ref_cmplx_mult_real_f32( + float32_t * pSrcCmplx, + float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples); + +void ref_cmplx_mult_real_q31( + q31_t * pSrcCmplx, + q31_t * pSrcReal, + q31_t * pCmplxDst, + uint32_t numSamples); + +void ref_cmplx_mult_real_q15( + q15_t * pSrcCmplx, + q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples); + + /* + * Controller Functions + */ +void ref_sin_cos_f32( + float32_t theta, + float32_t * pSinVal, + float32_t * pCosVal); + +void ref_sin_cos_q31( + q31_t theta, + q31_t * pSinVal, + q31_t * pCosVal); + +float32_t ref_pid_f32( + arm_pid_instance_f32 * S, + float32_t in); + +q31_t ref_pid_q31( + arm_pid_instance_q31 * S, + q31_t in); + +q15_t ref_pid_q15( + arm_pid_instance_q15 * S, + q15_t in); + + /* + * Fast Math Functions + */ +#define ref_sin_f32(a) sinf(a) + +q31_t ref_sin_q31(q31_t x); + +q15_t ref_sin_q15(q15_t x); + +#define ref_cos_f32(a) cosf(a) + +q31_t ref_cos_q31(q31_t x); + +q15_t ref_cos_q15(q15_t x); + +arm_status ref_sqrt_q31(q31_t in, q31_t * pOut); + +arm_status ref_sqrt_q15(q15_t in, q15_t * pOut); + + /* + * Filtering Functions + */ +void ref_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_biquad_cascade_stereo_df2T_f32( + const arm_biquad_cascade_stereo_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 * S, + float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + +void ref_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_conv_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + +arm_status ref_conv_partial_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + +void ref_conv_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + +void ref_conv_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + +arm_status ref_conv_partial_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + +arm_status ref_conv_partial_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + +void ref_conv_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + +#define ref_conv_opt_q15(pSrcA, srcALen, pSrcB, srcBLen, pDst, \ + pScratch1, pScratch2) \ + ref_conv_q15(pSrcA, srcALen, pSrcB, srcBLen, pDst) + +void ref_conv_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + +void ref_conv_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + +arm_status ref_conv_partial_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + +#define ref_conv_partial_opt_q15(pSrcA, srcALen, pSrcB, srcBLen, pDst, \ + firstIndex, numPoints, \ + pScratch1, pScratch2) \ + ref_conv_partial_q15(pSrcA, srcALen, pSrcB, srcBLen, pDst, \ + firstIndex, numPoints) + +arm_status ref_conv_partial_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + +arm_status ref_conv_partial_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + +void ref_conv_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + +#define ref_conv_opt_q7(pSrcA, srcALen, pSrcB, srcBLen, pDst, \ + pScratch1, pScratch2) \ + ref_conv_q7(pSrcA, srcALen, pSrcB, srcBLen, pDst) + +arm_status ref_conv_partial_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + +#define ref_conv_partial_opt_q7(pSrcA, srcALen, pSrcB, srcBLen, pDst, \ + firstIndex, numPoints, \ + pScratch1, pScratch2) \ + ref_conv_partial_q7(pSrcA, srcALen, pSrcB, srcBLen, pDst, \ + firstIndex, numPoints) + +void ref_correlate_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + +void ref_correlate_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + +void ref_correlate_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + +void ref_correlate_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + +#define ref_correlate_opt_q15(pSrcA, srcALen, pSrcB, srcBLen, pDst, \ + pScratch1) \ + ref_correlate_q15(pSrcA, srcALen, pSrcB, srcBLen, pDst) + +void ref_correlate_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + +void ref_correlate_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + +void ref_correlate_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + +#define ref_correlate_opt_q7(pSrcA, srcALen, pSrcB, srcBLen, pDst, \ + pScratch1, pScratch2) \ + ref_correlate_q7(pSrcA, srcALen, pSrcB, srcBLen, pDst) + +void ref_fir_f32( + const arm_fir_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_fir_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_fir_fast_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_fir_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_fir_fast_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_fir_q7( + const arm_fir_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +void ref_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_fir_decimate_fast_q31( + const arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize); + +void ref_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize); + +void ref_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + +void ref_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + q7_t *pSrc, + q7_t *pDst, + q7_t *pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + +void ref_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_lms_f32( + const arm_lms_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + +void ref_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + +void ref_lms_q31( + const arm_lms_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + +void ref_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + +void ref_lms_q15( + const arm_lms_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + +void ref_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + +void ref_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /* + * Matrix Functions + */ +arm_status ref_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + +arm_status ref_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + +arm_status ref_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + +arm_status ref_mat_inverse_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + +arm_status ref_mat_inverse_f64( + const arm_matrix_instance_f64 * pSrc, + arm_matrix_instance_f64 * pDst); + +arm_status ref_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + +arm_status ref_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + +/* Alias for testing purposes*/ +#define ref_mat_mult_fast_q31 ref_mat_mult_q31 + +arm_status ref_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + +/* Alias for testing purposes*/ +#define ref_mat_mult_fast_q15 ref_mat_mult_q15 + +arm_status ref_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst); + +arm_status ref_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scale, + int32_t shift, + arm_matrix_instance_q31 * pDst); + +arm_status ref_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scale, + int32_t shift, + arm_matrix_instance_q15 * pDst); + +arm_status ref_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + +arm_status ref_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + +arm_status ref_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + +arm_status ref_mat_trans_f64( + const arm_matrix_instance_f64 * pSrc, + arm_matrix_instance_f64 * pDst); + +arm_status ref_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + +arm_status ref_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst); + +arm_status ref_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst); + +arm_status ref_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + +arm_status ref_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + +arm_status ref_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /* + * Statistics Functions + */ +void ref_max_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + +void ref_max_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + +void ref_max_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + +void ref_max_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + +void ref_mean_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + +void ref_mean_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + +void ref_mean_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + +void ref_mean_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + +void ref_min_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + +void ref_min_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + +void ref_min_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + +void ref_min_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + +void ref_power_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + +void ref_power_q31( + q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + +void ref_power_q15( + q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + +void ref_power_q7( + q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + +void ref_rms_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + +void ref_rms_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + +void ref_rms_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + +void ref_std_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + +void ref_std_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + +void ref_std_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + +void ref_var_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + +void ref_var_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + +void ref_var_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + /* + * Support Functions + */ +void ref_copy_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_copy_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_copy_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_copy_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +void ref_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize); + +void ref_fill_q31( + q31_t value, + q31_t * pDst, + uint32_t blockSize); + +void ref_fill_q15( + q15_t value, + q15_t * pDst, + uint32_t blockSize); + +void ref_fill_q7( + q7_t value, + q7_t * pDst, + uint32_t blockSize); + +void ref_q31_to_q15( + q31_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_q31_to_q7( + q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +void ref_q15_to_q31( + q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_q15_to_q7( + q15_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +void ref_q7_to_q31( + q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_q7_to_q15( + q7_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_q63_to_float( + q63_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_q31_to_float( + q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_q15_to_float( + q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_q7_to_float( + q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +void ref_float_to_q31( + float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +void ref_float_to_q15( + float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +void ref_float_to_q7( + float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /* + * Transform Functions + */ +void ref_cfft_f32( + const arm_cfft_instance_f32 * S, + float32_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +void ref_cfft_q31( + const arm_cfft_instance_q31 * S, + q31_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +void ref_cfft_q15( + const arm_cfft_instance_q15 * S, + q15_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +void ref_cfft_radix2_f32( + const arm_cfft_radix2_instance_f32 * S, + float32_t * pSrc); + +void ref_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 * S, + q31_t * pSrc); + +void ref_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 * S, + q15_t * pSrc); + +void ref_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + +void ref_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + +void ref_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + +void ref_rfft_f32( + arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + +void ref_rfft_fast_f32( + arm_rfft_fast_instance_f32 * S, + float32_t * p, float32_t * pOut, + uint8_t ifftFlag); + +void ref_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + +void ref_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + +void ref_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer); + +void ref_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer); + +void ref_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer); + + /* + * Intrinsics + */ +q31_t ref__QADD8(q31_t x, q31_t y); +q31_t ref__QSUB8(q31_t x, q31_t y); +q31_t ref__QADD16(q31_t x, q31_t y); +q31_t ref__SHADD16(q31_t x, q31_t y); +q31_t ref__QSUB16(q31_t x, q31_t y); +q31_t ref__SHSUB16(q31_t x, q31_t y); +q31_t ref__QASX(q31_t x, q31_t y); +q31_t ref__SHASX(q31_t x, q31_t y); +q31_t ref__QSAX(q31_t x, q31_t y); +q31_t ref__SHSAX(q31_t x, q31_t y); +q31_t ref__SMUSDX(q31_t x, q31_t y); +q31_t ref__SMUADX(q31_t x, q31_t y); +q31_t ref__QADD(q31_t x, q31_t y); +q31_t ref__QSUB(q31_t x, q31_t y); +q31_t ref__SMLAD(q31_t x, q31_t y, q31_t sum); +q31_t ref__SMLADX(q31_t x, q31_t y, q31_t sum); +q31_t ref__SMLSDX(q31_t x, q31_t y, q31_t sum); +q63_t ref__SMLALD(q31_t x, q31_t y, q63_t sum); +q63_t ref__SMLALDX(q31_t x, q31_t y, q63_t sum); +q31_t ref__SMUAD(q31_t x, q31_t y); +q31_t ref__SMUSD(q31_t x, q31_t y); +q31_t ref__SXTB16(q31_t x); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/BasicMathFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/BasicMathFunctions.c new file mode 100644 index 0000000..2bb5d8b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/BasicMathFunctions.c @@ -0,0 +1,11 @@ + +#include "abs.c" +#include "add.c" +#include "dot_prod.c" +#include "mult.c" +#include "negate.c" +#include "offset.c" +#include "scale.c" +#include "shift.c" +#include "sub.c" + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/abs.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/abs.c new file mode 100644 index 0000000..baca23f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/abs.c @@ -0,0 +1,53 @@ +#include "ref.h" + +void ref_abs_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + for(i=0;i> 14; //16.48 + } + *result = sum; +} + +void ref_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t blockSize, + q63_t * result) +{ + uint32_t i; + q63_t sum = 0.0f; + + for(i=0;i> 32; + temp = temp << 1; + pDst[i] = ref_sat_q31(temp); + } +} + +void ref_mult_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + q31_t temp; + + for(i=0;i> 15; //this comment is for JD, this is specifically 15 and not 16 like the q31 case might imply. This is because CMSIS DSP lib does it this way. No other reason. + pDst[i] = ref_sat_q15(temp); + } +} + +void ref_mult_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + q15_t temp; + + for(i=0;i> 7; + pDst[i] = ref_sat_q7(temp); + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/negate.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/negate.c new file mode 100644 index 0000000..192da1b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/negate.c @@ -0,0 +1,53 @@ +#include "ref.h" + +void ref_negate_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + for(i=0;i> 32; + if (sign) + pDst[i] = temp >> -kShift; + else + pDst[i] = ref_sat_q31( (q63_t)temp << kShift ); + } +} + +void ref_scale_q15( + q15_t * pSrc, + q15_t scaleFract, + int8_t shift, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + int8_t kShift = 15 - shift; /* Shift to apply after scaling */ + + for(i=0;i> kShift); + } +} + +void ref_scale_q7( + q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + int8_t kShift = 7 - shift; /* Shift to apply after scaling */ + + for(i=0;i> kShift); + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/shift.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/shift.c new file mode 100644 index 0000000..3bc53ad --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/shift.c @@ -0,0 +1,73 @@ +#include "ref.h" + +void ref_shift_q31( + q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + if (shiftBits < 0) + { + for(i=0;i> -shiftBits; + } + } +} + +void ref_shift_q15( + q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + if (shiftBits < 0) + { + for(i=0;i> -shiftBits; + } + } +} + +void ref_shift_q7( + q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + if (shiftBits < 0) + { + for(i=0;i> -shiftBits; + } + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/sub.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/sub.c new file mode 100644 index 0000000..da89e95 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/BasicMathFunctions/sub.c @@ -0,0 +1,57 @@ +#include "ref.h" + +void ref_sub_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + for(i=0;i> 14) - (((q63_t)pSrcA[i+1] * pSrcB[i+1]) >> 14); + sumi += (((q63_t)pSrcA[i] * pSrcB[i+1]) >> 14) + (((q63_t)pSrcA[i+1] * pSrcB[i] ) >> 14); + } + + *realResult = sumr; + *imagResult = sumi; +} + +void ref_cmplx_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult) +{ + q63_t sumr, sumi; + uint32_t i; + + sumr = 0; + sumi = 0; + + for(i=0;i> 6); + *imagResult = (q31_t)(sumi >> 6); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mag.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mag.c new file mode 100644 index 0000000..b5ac28d --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mag.c @@ -0,0 +1,49 @@ +#include "ref.h" + +void ref_cmplx_mag_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples) +{ + uint32_t i; + + for(i=0;i> 33); + acc1 = (q31_t)(((q63_t)pSrc[i+1] * pSrc[i+1]) >> 33); + out = acc0 + acc1; + *pDst++ = (q31_t)(sqrtf((float)out / 2147483648.0f) * 2147483648.0f); + } +} + +void ref_cmplx_mag_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples) +{ + uint32_t i; + q31_t acc0,acc1; + q15_t out; + + for(i=0;i> 17); + *pDst++ = (q15_t)(sqrtf((float)out / 32768.0f) * 32768.0f); + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mag_squared.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mag_squared.c new file mode 100644 index 0000000..aec7bd5 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mag_squared.c @@ -0,0 +1,46 @@ +#include "ref.h" + +void ref_cmplx_mag_squared_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples) +{ + uint32_t i; + + for(i=0;i> 33); + acc1 = (q31_t)(((q63_t)pSrc[i+1] * pSrc[i+1]) >> 33); + *pDst++ = acc0 + acc1; + } +} + +void ref_cmplx_mag_squared_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples) +{ + uint32_t i; + q31_t acc0,acc1; + + for(i=0;i> 17); + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mult_cmplx.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mult_cmplx.c new file mode 100644 index 0000000..c7a5409 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mult_cmplx.c @@ -0,0 +1,56 @@ +#include "ref.h" + +void ref_cmplx_mult_cmplx_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples) +{ + uint32_t i; + + for(i=0;i> 33; + mul2 = ((q63_t)pSrcA[i+1] * pSrcB[i+1]) >> 33; + mul3 = ((q63_t)pSrcA[i] * pSrcB[i+1]) >> 33; + mul4 = ((q63_t)pSrcA[i+1] * pSrcB[i]) >> 33; + pDst[i] = mul1 - mul2; + pDst[i+1] = mul3 + mul4; + } +} + +void ref_cmplx_mult_cmplx_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples) +{ + uint32_t i; + q31_t mul1, mul2, mul3, mul4; + + for(i=0;i> 17; + mul2 = ((q31_t)pSrcA[i+1] * pSrcB[i+1]) >> 17; + mul3 = ((q31_t)pSrcA[i] * pSrcB[i+1]) >> 17; + mul4 = ((q31_t)pSrcA[i+1] * pSrcB[i]) >> 17; + pDst[i] = mul1 - mul2; + pDst[i+1] = mul3 + mul4; + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mult_real.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mult_real.c new file mode 100644 index 0000000..dc4928e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_mult_real.c @@ -0,0 +1,52 @@ +#include "ref.h" + +void ref_cmplx_mult_real_f32( + float32_t * pSrcCmplx, + float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples) +{ + uint32_t i; + + for(i=0;i> 32; + tempI = ((q63_t) pSrcCmplx[2*i+1] * pSrcReal[i]) >> 32; + pCmplxDst[2*i+0] = ref_sat_n(tempR, 31) << 1; + pCmplxDst[2*i+1] = ref_sat_n(tempI, 31) << 1; + } +} + +void ref_cmplx_mult_real_q15( + q15_t * pSrcCmplx, + q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples) +{ + uint32_t i; + q31_t tempR, tempI; + + for(i=0;i> 15; + tempI = ((q31_t) pSrcCmplx[2*i+1] * pSrcReal[i]) >> 15; + pCmplxDst[2*i+0] = ref_sat_q15(tempR); + pCmplxDst[2*i+1] = ref_sat_q15(tempI); + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/ControllerFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/ControllerFunctions.c new file mode 100644 index 0000000..b26e912 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/ControllerFunctions.c @@ -0,0 +1,4 @@ + +#include "pid.c" +#include "sin_cos.c" + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/pid.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/pid.c new file mode 100644 index 0000000..51aa633 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/pid.c @@ -0,0 +1,97 @@ +#include "ref.h" + +float32_t ref_pid_f32( + arm_pid_instance_f32 * S, + float32_t in) +{ + float32_t out; + + /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ + out = S->state[2] + S->A0 * in + S->A1 * S->state[0] + S->A2 * S->state[1]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); +} + +q31_t ref_pid_q31( + arm_pid_instance_q31 * S, + q31_t in) +{ + q63_t acc; + q31_t out; + + /* acc = A0 * x[n] */ + acc = (q63_t) S->A0 * in; + + /* acc += A1 * x[n-1] */ + acc += (q63_t) S->A1 * S->state[0]; + + /* acc += A2 * x[n-2] */ + acc += (q63_t) S->A2 * S->state[1]; + + /* convert output to 1.31 format to add y[n-1] */ + out = (q31_t) (acc >> 31U); + + /* out += y[n-1] */ + out += S->state[2]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); +} + +q15_t ref_pid_q15( + arm_pid_instance_q15 * S, + q15_t in) +{ + q63_t acc; + q15_t out; + q15_t A1, A2; + +#if defined (ARM_MATH_DSP) + +#ifndef ARM_MATH_BIG_ENDIAN + A2 = S->A1 >> 16; + A1 = (q15_t)S->A1; +#else + A1 = S->A1 >> 16; + A2 = (q15_t)S->A1; +#endif + +#else + + A1 = S->A1; + A2 = S->A2; + +#endif + + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0) * in; + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc += (q31_t) A1 * S->state[0]; + acc += (q31_t) A2 * S->state[1]; + + /* acc += y[n-1] */ + acc += (q31_t) S->state[2] << 15; + + /* saturate the output */ + out = ref_sat_q15(acc >> 15); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/sin_cos.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/sin_cos.c new file mode 100644 index 0000000..22c91a0 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ControllerFunctions/sin_cos.c @@ -0,0 +1,21 @@ +#include "ref.h" + +void ref_sin_cos_f32( + float32_t theta, + float32_t * pSinVal, + float32_t * pCosVal) +{ + //theta is given in degrees + *pSinVal = sinf(theta * 6.28318530717959f / 360.0f); + *pCosVal = cosf(theta * 6.28318530717959f / 360.0f); +} + +void ref_sin_cos_q31( + q31_t theta, + q31_t * pSinVal, + q31_t * pCosVal) +{ + //theta is given in the range [-1,1) to represent [-pi,pi) + *pSinVal = (q31_t)(sinf((float32_t)theta * 3.14159265358979f / 2147483648.0f) * 2147483648.0f); + *pCosVal = (q31_t)(cosf((float32_t)theta * 3.14159265358979f / 2147483648.0f) * 2147483648.0f); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/FastMathFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/FastMathFunctions.c new file mode 100644 index 0000000..2ea0f98 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/FastMathFunctions.c @@ -0,0 +1,5 @@ + +#include "cos.c" +#include "sin.c" +#include "sqrt.c" + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/cos.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/cos.c new file mode 100644 index 0000000..ab6c98e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/cos.c @@ -0,0 +1,11 @@ +#include "ref.h" + +q31_t ref_cos_q31(q31_t x) +{ + return (q31_t)(cosf((float32_t)x * 6.28318530717959f / 2147483648.0f) * 2147483648.0f); +} + +q15_t ref_cos_q15(q15_t x) +{ + return (q15_t)(cosf((float32_t)x * 6.28318530717959f / 32768.0f) * 32768.0f); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/sin.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/sin.c new file mode 100644 index 0000000..3f303a5 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/sin.c @@ -0,0 +1,11 @@ +#include "ref.h" + +q31_t ref_sin_q31(q31_t x) +{ + return (q31_t)(sinf((float32_t)x * 6.28318530717959f / 2147483648.0f) * 2147483648.0f); +} + +q15_t ref_sin_q15(q15_t x) +{ + return (q15_t)(sinf((float32_t)x * 6.28318530717959f / 32768.0f) * 32768.0f); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/sqrt.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/sqrt.c new file mode 100644 index 0000000..9dc34af --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FastMathFunctions/sqrt.c @@ -0,0 +1,15 @@ +#include "ref.h" + +arm_status ref_sqrt_q31(q31_t in, q31_t * pOut) +{ + *pOut = (q31_t)(sqrtf((float32_t)in / 2147483648.0f) * 2147483648.0f); + + return ARM_MATH_SUCCESS; +} + +arm_status ref_sqrt_q15(q15_t in, q15_t * pOut) +{ + *pOut = (q15_t)(sqrtf((float32_t)in / 32768.0f) * 32768.0f); + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/FilteringFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/FilteringFunctions.c new file mode 100644 index 0000000..a1eeaaa --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/FilteringFunctions.c @@ -0,0 +1,12 @@ + +#include "biquad.c" +#include "conv.c" +#include "correlate.c" +#include "fir.c" +#include "fir_decimate.c" +#include "fir_interpolate.c" +#include "fir_lattice.c" +#include "fir_sparse.c" +#include "iir_lattice.c" +#include "lms.c" + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/biquad.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/biquad.c new file mode 100644 index 0000000..78634cd --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/biquad.c @@ -0,0 +1,713 @@ +#include "ref.h" + +void ref_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pIn = pSrc; /* source pointer */ + float32_t *pOut = pDst; /* destination pointer */ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ + float32_t acc; /* accumulator */ + float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float32_t Xn; /* temporary input */ + float32_t d1, d2; /* state variables */ + uint32_t sample, stage = S->numStages; /* loop counters */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /*Reading the state values */ + d1 = pState[0]; + d2 = pState[1]; + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* y[n] = b0 * x[n] + d1 */ + acc = (b0 * Xn) + d1; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc; + + /* Every time after the output is computed state should be updated. */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + d1 = (b1 * Xn + a1 * acc) + d2; + + /* d2 = b2 * x[n] + a2 * y[n] */ + d2 = (b2 * Xn) + (a2 * acc); + + /* decrement the loop counter */ + sample--; + } + + /* Store the updated state variables back into the state array */ + *pState++ = d1; + *pState++ = d2; + + /* The current stage input is given as the output to the next stage */ + pIn = pDst; + + /*Reset the output working pointer */ + pOut = pDst; + + /* decrement the loop counter */ + stage--; + + } while (stage > 0U); +} + + +void ref_biquad_cascade_stereo_df2T_f32( + const arm_biquad_cascade_stereo_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pIn = pSrc; /* source pointer */ + float32_t *pOut = pDst; /* destination pointer */ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ + float32_t acc1a, acc1b; /* accumulator */ + float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float32_t Xn1a, Xn1b; /* temporary input */ + float32_t d1a, d2a, d1b, d2b; /* state variables */ + uint32_t sample, stage = S->numStages; /* loop counters */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /*Reading the state values */ + d1a = pState[0]; + d2a = pState[1]; + d1b = pState[2]; + d2b = pState[3]; + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn1a = *pIn++; //Channel a + Xn1b = *pIn++; //Channel b + + /* y[n] = b0 * x[n] + d1 */ + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc1a; + *pOut++ = acc1b; + + /* Every time after the output is computed state should be updated. */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + /* d2 = b2 * x[n] + a2 * y[n] */ + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + + /* decrement the loop counter */ + sample--; + } + + /* Store the updated state variables back into the state array */ + *pState++ = d1a; + *pState++ = d2a; + *pState++ = d1b; + *pState++ = d2b; + + /* The current stage input is given as the output to the next stage */ + pIn = pDst; + + /*Reset the output working pointer */ + pOut = pDst; + + /* decrement the loop counter */ + stage--; + + } while (stage > 0U); + +} + +void ref_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 * S, + float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize) +{ + float64_t *pIn = pSrc; /* source pointer */ + float64_t *pOut = pDst; /* destination pointer */ + float64_t *pState = S->pState; /* State pointer */ + float64_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ + float64_t acc; /* accumulator */ + float64_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float64_t Xn; /* temporary input */ + float64_t d1, d2; /* state variables */ + uint32_t sample, stage = S->numStages; /* loop counters */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /*Reading the state values */ + d1 = pState[0]; + d2 = pState[1]; + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* y[n] = b0 * x[n] + d1 */ + acc = (b0 * Xn) + d1; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc; + + /* Every time after the output is computed state should be updated. */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + d1 = (b1 * Xn + a1 * acc) + d2; + + /* d2 = b2 * x[n] + a2 * y[n] */ + d2 = (b2 * Xn) + (a2 * acc); + + /* decrement the loop counter */ + sample--; + } + + /* Store the updated state variables back into the state array */ + *pState++ = d1; + *pState++ = d2; + + /* The current stage input is given as the output to the next stage */ + pIn = pDst; + + /*Reset the output working pointer */ + pOut = pDst; + + /* decrement the loop counter */ + stage--; + + } while (stage > 0U); +} + +void ref_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pIn = pSrc; /* source pointer */ + float32_t *pOut = pDst; /* destination pointer */ + float32_t *pState = S->pState; /* pState pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ + float32_t acc; /* Simulates the accumulator */ + float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float32_t Xn1, Xn2, Yn1, Yn2; /* Filter pState variables */ + float32_t Xn; /* temporary input */ + uint32_t sample, stage = S->numStages; /* loop counters */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the pState values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + + /* The variables acc holds the output value that is computed: + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn1) + (a2 * Yn2); + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = acc; + + /* decrement the loop counter */ + sample--; + } + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent numStages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset the output pointer */ + pOut = pDst; + + /* decrement the loop counter */ + stage--; + + } while (stage > 0U); +} + +void ref_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pIn = pSrc; /* input pointer initialization */ + q31_t *pOut = pDst; /* output pointer initialization */ + q63_t *pState = S->pState; /* state pointer initialization */ + const q31_t *pCoeffs = S->pCoeffs; /* coeff pointer initialization */ + q63_t acc; /* accumulator */ + q31_t Xn1, Xn2; /* Input Filter state variables */ + q63_t Yn1, Yn2; /* Output Filter state variables */ + q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q31_t Xn; /* temporary input */ + int32_t shift = (int32_t) S->postShift + 1; /* Shift to be applied to the output */ + uint32_t sample, stage = S->numStages; /* loop counters */ + q31_t acc_l, acc_h; /* temporary output */ + uint32_t uShift = ((uint32_t) S->postShift + 1U); + uint32_t lShift = 32U - uShift; /* Shift to be applied to the output */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the state values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = (q63_t)Xn*b0 + (q63_t)Xn1*b1 + (q63_t)Xn2*b2; + /* acc += a1 * y[n-1] */ + acc += mult32x64(Yn1, a1); + /* acc += a2 * y[n-2] */ + acc += mult32x64(Yn2, a2); + + /* Every time after the output is computed state should be updated. */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + + /* The result is converted to 1.63, Yn1 variable is reused */ + Yn1 = acc << shift; + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store the output in the destination buffer in 1.31 format. */ + *pOut++ = acc_h; + + /* decrement the loop counter */ + sample--; + } + + /* The first stage output is given as input to the second stage. */ + pIn = pDst; + + /* Reset to destination buffer working pointer */ + pOut = pDst; + + /* Store the updated state variables back into the pState array */ + *pState++ = (q63_t) Xn1; + *pState++ = (q63_t) Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + } while (--stage); +} + +void ref_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q63_t acc; /* accumulator */ + uint32_t uShift = ((uint32_t) S->postShift + 1U); + uint32_t lShift = 32U - uShift; /* Shift to be applied to the output */ + q31_t *pIn = pSrc; /* input pointer initialization */ + q31_t *pOut = pDst; /* output pointer initialization */ + q31_t *pState = S->pState; /* pState pointer initialization */ + const q31_t *pCoeffs = S->pCoeffs; /* coeff pointer initialization */ + q31_t Xn1, Xn2, Yn1, Yn2; /* Filter state variables */ + q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q31_t Xn; /* temporary input */ + uint32_t sample, stage = S->numStages; /* loop counters */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the state values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + + /* The variables acc holds the output value that is computed: + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + /* acc = b0 * x[n] */ + acc = (q63_t) b0 *Xn; + + /* acc += b1 * x[n-1] */ + acc += (q63_t) b1 *Xn1; + /* acc += b[2] * x[n-2] */ + acc += (q63_t) b2 *Xn2; + /* acc += a1 * y[n-1] */ + acc += (q63_t) a1 *Yn1; + /* acc += a2 * y[n-2] */ + acc += (q63_t) a2 *Yn2; + + /* The result is converted to 1.31 */ + acc = acc >> lShift; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = (q31_t) acc; + + /* Store the output in the destination buffer. */ + *pOut++ = (q31_t) acc; + + /* decrement the loop counter */ + sample--; + } + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent stages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset to destination pointer */ + pOut = pDst; + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + } while (--stage); +} + + +void ref_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t acc = 0; /* accumulator */ + q31_t Xn1, Xn2, Yn1, Yn2; /* Filter state variables */ + q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q31_t *pIn = pSrc; /* input pointer initialization */ + q31_t *pOut = pDst; /* output pointer initialization */ + q31_t *pState = S->pState; /* pState pointer initialization */ + const q31_t *pCoeffs = S->pCoeffs; /* coeff pointer initialization */ + q31_t Xn; /* temporary input */ + int32_t shift = (int32_t) S->postShift + 1; /* Shift to be applied to the output */ + uint32_t sample, stage = S->numStages; /* loop counters */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the state values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + mult_32x32_keep32_R(acc, b0, Xn); + multAcc_32x32_keep32_R(acc, b1, Xn1); + multAcc_32x32_keep32_R(acc, b2, Xn2); + multAcc_32x32_keep32_R(acc, a1, Yn1); + multAcc_32x32_keep32_R(acc, a2, Yn2); + + /* The result is converted to 1.31 */ + acc <<= shift; + + /* Every time after the output is computed state should be updated. */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = acc; + + /* Store the output in the destination buffer. */ + *pOut++ = acc; + + /* decrement the loop counter */ + sample--; + } + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent stages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset to destination pointer */ + pOut = pDst; + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + } while (--stage); +} + +void ref_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pIn = pSrc; /* Source pointer */ + q15_t *pOut = pDst; /* Destination pointer */ + q15_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q15_t Xn1, Xn2, Yn1, Yn2; /* Filter state variables */ + q15_t Xn; /* temporary input */ + q31_t acc; /* Accumulator */ + int32_t shift = (15 - (int32_t) S->postShift); /* Post shift */ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + uint32_t sample, stage = (uint32_t) S->numStages; /* Stage loop counter */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + pCoeffs++; // skip the 0 coefficient + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the state values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = (q31_t)b0*Xn + (q31_t)b1*Xn1 + (q31_t)b2*Xn2 + (q31_t)a1*Yn1 + (q31_t)a2*Yn2; + + /* The result is converted to 1.15 */ + acc = ref_sat_q15(acc >> shift); + + /* Every time after the output is computed state should be updated. */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = (q15_t) acc; + + /* Store the output in the destination buffer. */ + *pOut++ = (q15_t) acc; + + /* decrement the loop counter */ + sample--; + } + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent stages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset to destination pointer */ + pOut = pDst; + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + } while (--stage); +} + +void ref_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pIn = pSrc; /* Source pointer */ + q15_t *pOut = pDst; /* Destination pointer */ + q15_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q15_t Xn1, Xn2, Yn1, Yn2; /* Filter state variables */ + q15_t Xn; /* temporary input */ + q63_t acc; /* Accumulator */ + int32_t shift = (15 - (int32_t) S->postShift); /* Post shift */ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + uint32_t sample, stage = (uint32_t) S->numStages; /* Stage loop counter */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + pCoeffs++; // skip the 0 coefficient + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the state values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = (q31_t)b0*Xn + (q31_t)b1*Xn1 + (q31_t)b2*Xn2 + (q31_t)a1*Yn1 + (q31_t)a2*Yn2; + + /* The result is converted to 1.15 */ + acc = ref_sat_q15(acc >> shift); + + /* Every time after the output is computed state should be updated. */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = (q15_t) acc; + + /* Store the output in the destination buffer. */ + *pOut++ = (q15_t) acc; + + /* decrement the loop counter */ + sample--; + } + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent stages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset to destination pointer */ + pOut = pDst; + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + } while (--stage); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/conv.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/conv.c new file mode 100644 index 0000000..dc1b103 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/conv.c @@ -0,0 +1,350 @@ +#include "ref.h" + +void ref_conv_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst) +{ + float32_t sum; /* Accumulator */ + uint32_t i, j; /* loop counters */ + + /* Loop to calculate convolution for output length number of times */ + for (i = 0; i < srcALen + srcBLen - 1; i++) + { + /* Initialize sum with zero to carry out MAC operations */ + sum = 0.0f; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += pSrcB[i - j] * pSrcA[j]; + } + } + /* Store the output in the destination buffer */ + pDst[i] = sum; + } +} + +arm_status ref_conv_partial_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst, + uint32_t firstIndex, + uint32_t numPoints) +{ + ref_conv_f32(pSrcA,srcALen,pSrcB,srcBLen,pDst); + + return ARM_MATH_SUCCESS; +} + +void ref_conv_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst) +{ + q63_t sum; /* Accumulator */ + uint32_t i, j; /* loop counter */ + + /* Loop to calculate output of convolution for output length number of times */ + for (i = 0; i < srcALen + srcBLen - 1; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += (q63_t) pSrcA[j] * (pSrcB[i - j]); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q31_t)(sum >> 31U); + } +} + +void ref_conv_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst) +{ + q31_t sum; /* Accumulator */ + uint32_t i, j; /* loop counter */ + + /* Loop to calculate output of convolution for output length number of times */ + for (i = 0; i < srcALen + srcBLen - 1; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum = (q31_t) ((((q63_t)sum << 32) + + ((q63_t)pSrcA[j] * pSrcB[i - j])) >> 32); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q31_t)(sum << 1U); + } +} + +arm_status ref_conv_partial_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints) +{ + ref_conv_q31(pSrcA,srcALen,pSrcB,srcBLen,pDst); + + return ARM_MATH_SUCCESS; +} + +arm_status ref_conv_partial_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints) +{ + ref_conv_fast_q31(pSrcA,srcALen,pSrcB,srcBLen,pDst); + + return ARM_MATH_SUCCESS; +} + +void ref_conv_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst) +{ + q63_t sum; /* Accumulator */ + uint32_t i, j; /* loop counter */ + + /* Loop to calculate output of convolution for output length number of times */ + for (i = 0; i < srcALen + srcBLen - 1; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += (q31_t)pSrcA[j] * pSrcB[i - j]; + } + } + + /* Store the output in the destination buffer */ + pDst[i] = ref_sat_q15(sum >> 15U); + } +} + +arm_status ref_conv_partial_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2) +{ + q31_t sum; /* Accumulator */ + uint32_t i, j; /* loop counter */ + + /* Loop to calculate output of convolution for output length number of times */ + for (i = 0; i < srcALen + srcBLen - 1; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += (q31_t)pSrcA[j] * pSrcB[i - j]; + } + } + + /* Store the output in the destination buffer */ + pDst[i] = ref_sat_q15(sum >> 15U); + } + + return ARM_MATH_SUCCESS; +} + +void ref_conv_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst) +{ + q31_t sum; /* Accumulator */ + uint32_t i, j; /* loop counter */ + + /* Loop to calculate output of convolution for output length number of times */ + for (i = 0; i < srcALen + srcBLen - 1; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += (q31_t)pSrcA[j] * pSrcB[i - j]; + } + } + + /* Store the output in the destination buffer */ + pDst[i] = sum >> 15U; + } +} + +void ref_conv_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2) +{ + q31_t sum; /* Accumulator */ + uint32_t i, j; /* loop counter */ + + /* Loop to calculate output of convolution for output length number of times */ + for (i = 0; i < srcALen + srcBLen - 1; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += (q31_t)pSrcA[j] * pSrcB[i - j]; + } + } + + /* Store the output in the destination buffer */ + pDst[i] = ref_sat_q15(sum >> 15U); + } +} + +arm_status ref_conv_partial_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints) +{ + ref_conv_q15(pSrcA,srcALen,pSrcB,srcBLen,pDst); + + return ARM_MATH_SUCCESS; +} + +arm_status ref_conv_partial_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints) +{ + ref_conv_fast_q15(pSrcA,srcALen,pSrcB,srcBLen,pDst); + + return ARM_MATH_SUCCESS; +} + + +void ref_conv_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst) +{ + q31_t sum; /* Accumulator */ + uint32_t i, j; /* loop counter */ + + /* Loop to calculate output of convolution for output length number of times */ + for (i = 0; i < srcALen + srcBLen - 1; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += (q15_t)pSrcA[j] * pSrcB[i - j]; + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q7_t)ref_sat_q7(sum >> 7); + } +} + +arm_status ref_conv_partial_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints) +{ + ref_conv_q7(pSrcA,srcALen,pSrcB,srcBLen,pDst); + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/correlate.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/correlate.c new file mode 100644 index 0000000..ff1d95b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/correlate.c @@ -0,0 +1,513 @@ +#include "ref.h" + +void ref_correlate_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst) +{ + float32_t *pIn1 = pSrcA; /* inputA pointer */ + float32_t *pIn2 = pSrcB + (srcBLen - 1U); /* inputB pointer */ + float32_t sum; /* Accumulator */ + uint32_t i = 0U, j; /* loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* The algorithm implementation is based on the lengths of the inputs. + * srcB is always made to slide across srcA. + * So srcBLen is always considered as shorter or equal to srcALen + * But CORR(x, y) is reverse of CORR(y, x) + * So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer + * and a variable, inv is set to 1 + * If lengths are not equal then zero pad has to be done to make the two + * inputs of same length. But to improve the performance, we include zeroes + * in the output instead of zero padding either of the the inputs + * If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the + * starting of the output buffer + * If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the + * ending of the output buffer + * Once the zero padding is done the remaining of the output is calcualted + * using convolution but with the shorter signal time shifted. + */ + + /* Calculate the length of the remaining sequence */ + tot = srcALen + srcBLen - 2U; + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + /* Initialise the pointer after zero padding */ + pDst += srcALen - srcBLen; + } + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + srcALen - 1U; + + /* Initialisation of the pointer after zero padding */ + pDst += tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + } + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0.0f; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if ((i - j < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += pIn1[j] * pIn2[-((int32_t)i - j)]; + } + } + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = sum; + else + *pDst++ = sum; + } +} + +void ref_correlate_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst) +{ + q31_t *pIn1 = pSrcA; /* inputA pointer */ + q31_t *pIn2 = pSrcB + (srcBLen - 1U); /* inputB pointer */ + q63_t sum; /* Accumulators */ + uint32_t i = 0U, j; /* loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + + } + + /* Loop to calculate correlation for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to correlation equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if ((((i - j) < srcBLen) && (j < srcALen))) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q63_t) pIn1[j] * pIn2[-((int32_t) i - j)]); + } + } + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q31_t)(sum >> 31U); + else + *pDst++ = (q31_t)(sum >> 31U); + } +} + +void ref_correlate_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst) +{ + q31_t *pIn1 = pSrcA; /* inputA pointer */ + q31_t *pIn2 = pSrcB + (srcBLen - 1U); /* inputB pointer */ + q63_t sum; /* Accumulators */ + uint32_t i = 0U, j; /* loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + + } + + /* Loop to calculate correlation for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to correlation equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if ((((i - j) < srcBLen) && (j < srcALen))) + { + /* z[i] += x[i-j] * y[j] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) pIn1[j] * pIn2[-((int32_t) i - j)])) >> 32); + } + } + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q31_t)(sum << 1U); + else + *pDst++ = (q31_t)(sum << 1U); + } +} + +void ref_correlate_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst) +{ + q15_t *pIn1 = pSrcA; /* inputA pointer */ + q15_t *pIn2 = pSrcB + (srcBLen - 1U); /* inputB pointer */ + q63_t sum; /* Accumulators */ + uint32_t i = 0U, j; /* loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + + } + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if ((((i - j) < srcBLen) && (j < srcALen))) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q31_t) pIn1[j] * pIn2[-((int32_t) i - j)]); + } + } + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q15_t) ref_sat_q15(sum >> 15U); + else + *pDst++ = (q15_t) ref_sat_q15(sum >> 15U); + } +} + +void ref_correlate_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst) +{ + q15_t *pIn1 = pSrcA; /* inputA pointer */ + q15_t *pIn2 = pSrcB + (srcBLen - 1U); /* inputB pointer */ + q63_t sum; /* Accumulators */ + uint32_t i = 0U, j; /* loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + + } + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if ((((i - j) < srcBLen) && (j < srcALen))) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q31_t) pIn1[j] * pIn2[-((int32_t) i - j)]); + } + } + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q15_t)(sum >> 15U); + else + *pDst++ = (q15_t)(sum >> 15U); + } +} + +void ref_correlate_fast_opt_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch) +{ + q15_t *pIn1 = pSrcA; /* inputA pointer */ + q15_t *pIn2 = pSrcB + (srcBLen - 1U); /* inputB pointer */ + q31_t sum; /* Accumulators */ + uint32_t i = 0U, j; /* loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + + } + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if ((((i - j) < srcBLen) && (j < srcALen))) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q31_t) pIn1[j] * pIn2[-((int32_t) i - j)]); + } + } + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q15_t) ref_sat_q15(sum >> 15U); + else + *pDst++ = (q15_t) ref_sat_q15(sum >> 15U); + } +} + +void ref_correlate_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst) +{ + q7_t *pIn1 = pSrcA; /* inputA pointer */ + q7_t *pIn2 = pSrcB + (srcBLen - 1U); /* inputB pointer */ + q31_t sum; /* Accumulator */ + uint32_t i = 0U, j; /* loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + + } + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if ((((i - j) < srcBLen) && (j < srcALen))) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q15_t) pIn1[j] * pIn2[-((int32_t) i - j)]); + } + } + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q7_t) __SSAT((sum >> 7U), 8U); + else + *pDst++ = (q7_t) __SSAT((sum >> 7U), 8U); + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir.c new file mode 100644 index 0000000..9867f4c --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir.c @@ -0,0 +1,325 @@ +#include "ref.h" + +void ref_fir_f32( + const arm_fir_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i; /* Loop counters */ + float32_t acc; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + while (blockSize > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc = 0.0f; + + for(i=0;ipState; + + /* Copy data */ + for(i=0;ipState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i; /* Loop counter */ + q63_t acc; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + while (blockSize > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc = 0.0f; + + for(i=0;i> 31); + + /* Advance state pointer by 1 for the next sample */ + pState++; + + blockSize--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the starting of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + /* Copy data */ + for(i=0;ipState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i; /* Loop counter */ + q31_t acc; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + while (blockSize > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc = 0.0f; + + for(i=0;i> 32); + } + + /* The result is store in the destination buffer. */ + *pDst++ = (q31_t)(acc << 1); + + /* Advance state pointer by 1 for the next sample */ + pState++; + + blockSize--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the starting of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + /* Copy data */ + for(i=0;ipState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i; /* Loop counter */ + q63_t acc; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + while (blockSize > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc = 0.0f; + + for(i=0;i> 15); + + /* Advance state pointer by 1 for the next sample */ + pState++; + + blockSize--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the starting of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + /* Copy data */ + for(i=0;ipState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i; /* Loop counter */ + q31_t acc; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + while (blockSize > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc = 0.0f; + + for(i=0;i> 15); + + /* Advance state pointer by 1 for the next sample */ + pState++; + + blockSize--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the starting of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + /* Copy data */ + for(i=0;ipState; /* State pointer */ + const q7_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q7_t *pStateCurnt; /* Points to the current sample of the state */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i; /* Loop counter */ + q31_t acc; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + while (blockSize > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc = 0.0f; + + for(i=0;i> 7); + + /* Advance state pointer by 1 for the next sample */ + pState++; + + blockSize--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the starting of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + /* Copy data */ + for(i=0;ipState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t sum0; /* Accumulator */ + float32_t x0, c0; /* Temporary variables to hold state and coefficient values */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, blkCnt; /* Loop counters */ + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + numTaps - 1U; + + /* Total number of output samples to be computed */ + blkCnt = blockSize / S->M; + + while (blkCnt > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCurnt++ = *pSrc++; + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0.0f; + + for(i=0;iM; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = sum0; + + /* Decrement the loop counter */ + blkCnt--; + } + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + /* Copy numTaps number of values */ + i = numTaps - 1U; + + /* copy data */ + while (i > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + i--; + } +} + +void ref_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ + q63_t sum0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of taps */ + uint32_t i, blkCnt; /* Loop counters */ + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + numTaps - 1U; + + /* Total number of output samples to be computed */ + blkCnt = blockSize / S->M; + + while (blkCnt > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCurnt++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0; + + for(i=0;iM; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t) (sum0 >> 31); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + i = numTaps - 1U; + + /* copy data */ + while (i > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + i--; + } +} + +void ref_fir_decimate_fast_q31( + const arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ + q31_t sum0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of taps */ + uint32_t i, blkCnt; /* Loop counters */ + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + numTaps - 1U; + + /* Total number of output samples to be computed */ + blkCnt = blockSize / S->M; + + while (blkCnt > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCurnt++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0; + + for(i=0;i> 32); + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t) (sum0 << 1); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + i = numTaps - 1U; + + /* copy data */ + while (i > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + i--; + } +} + +void ref_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ + q63_t sum0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of taps */ + uint32_t i, blkCnt; /* Loop counters */ + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + numTaps - 1U; + + /* Total number of output samples to be computed */ + blkCnt = blockSize / S->M; + + while (blkCnt > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCurnt++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0; + + for(i=0;iM; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = ref_sat_q15(sum0 >> 15); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + i = numTaps - 1U; + + /* copy data */ + while (i > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + i--; + } +} + +void ref_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q15_t x0, c0; /* Temporary variables to hold state and coefficient values */ + q31_t sum0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of taps */ + uint32_t i, blkCnt; /* Loop counters */ + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + numTaps - 1U; + + /* Total number of output samples to be computed */ + blkCnt = blockSize / S->M; + + while (blkCnt > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCurnt++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0; + + for(i=0;iM; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = ref_sat_q15(sum0 >> 15); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + i = numTaps - 1U; + + /* copy data */ + while (i > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + i--; + } +} + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_interpolate.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_interpolate.c new file mode 100644 index 0000000..4341621 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_interpolate.c @@ -0,0 +1,291 @@ +#include "ref.h" + +void ref_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *ptr1; /* Temporary pointer for state buffer */ + const float32_t *ptr2; /* Temporary pointer for coefficient buffer */ + float32_t sum; /* Accumulator */ + uint32_t i, blkCnt; /* Loop counters */ + uint16_t phaseLen = S->phaseLength, tapCnt; /* Length of each polyphase filter component */ + + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + phaseLen - 1; + + /* Total number of intput samples */ + blkCnt = blockSize; + + /* Loop over the blockSize. */ + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Loop over the Interpolation factor. */ + i = S->L; + + while (i > 0U) + { + /* Set accumulator to zero */ + sum = 0.0f; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + i - 1; + + /* Loop over the polyPhase length */ + tapCnt = phaseLen; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum += *ptr1++ * *ptr2; + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = sum; + + /* Decrement the loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last phaseLen - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + tapCnt = phaseLen - 1U; + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } + +} + +void ref_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t *ptr1; /* Temporary pointer for state buffer */ + const q31_t *ptr2; /* Temporary pointer for coefficient buffer */ + q63_t sum; /* Accumulator */ + q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ + uint32_t i, blkCnt; /* Loop counters */ + uint16_t phaseLen = S->phaseLength, tapCnt; /* Length of each polyphase filter component */ + + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + (q31_t)phaseLen - 1; + + /* Total number of intput samples */ + blkCnt = blockSize; + + /* Loop over the blockSize. */ + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Loop over the Interpolation factor. */ + i = S->L; + + while (i > 0U) + { + /* Set accumulator to zero */ + sum = 0; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + i - 1; + + tapCnt = phaseLen; + + while (tapCnt > 0U) + { + /* Read the coefficient */ + c0 = *(ptr2); + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Read the input sample */ + x0 = *ptr1++; + + /* Perform the multiply-accumulate */ + sum += (q63_t) x0 *c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t)(sum >> 31); + + /* Decrement the loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last phaseLen - 1 samples to the satrt of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + tapCnt = phaseLen - 1U; + + /* copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } + +} + +void ref_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q15_t *ptr1; /* Temporary pointer for state buffer */ + const q15_t *ptr2; /* Temporary pointer for coefficient buffer */ + q63_t sum; /* Accumulator */ + q15_t x0, c0; /* Temporary variables to hold state and coefficient values */ + uint32_t i, blkCnt, tapCnt; /* Loop counters */ + uint16_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ + + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + phaseLen - 1; + + /* Total number of intput samples */ + blkCnt = blockSize; + + /* Loop over the blockSize. */ + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Loop over the Interpolation factor. */ + i = S->L; + + while (i > 0U) + { + /* Set accumulator to zero */ + sum = 0; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + i - 1; + + /* Loop over the polyPhase length */ + tapCnt = (uint32_t)phaseLen; + + while (tapCnt > 0U) + { + /* Read the coefficient */ + c0 = *ptr2; + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Read the input sample */ + x0 = *ptr1++; + + /* Perform the multiply-accumulate */ + sum += (q31_t) x0 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Store the result after converting to 1.15 format in the destination buffer */ + *pDst++ = ref_sat_q15(sum >> 15); + + /* Decrement the loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last phaseLen - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + i = (uint32_t) phaseLen - 1U; + + while (i > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + i--; + } + +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_lattice.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_lattice.c new file mode 100644 index 0000000..d04d560 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_lattice.c @@ -0,0 +1,241 @@ +#include "ref.h" + +void ref_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *px; /* temporary state pointer */ + const float32_t *pk; /* temporary coefficient pointer */ + float32_t fcurr, fnext, gcurr, gnext; /* temporary variables */ + uint32_t numStages = S->numStages; /* Length of the filter */ + uint32_t blkCnt, stageCnt; /* temporary variables for counts */ + + pState = &S->pState[0]; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* f0(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* Initialize state pointer */ + px = pState; + + /* read g0(n-1) from state buffer */ + gcurr = *px; + + /* for sample 1 processing */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext = fcurr + ((*pk) * gcurr); + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext = (fcurr * (*pk++)) + gcurr; + + /* save f0(n) in state buffer */ + *px++ = fcurr; + + /* f1(n) is saved in fcurr + for next stage processing */ + fcurr = fnext; + + stageCnt = (numStages - 1U); + + /* stage loop */ + while (stageCnt > 0U) + { + /* read g2(n) from state buffer */ + gcurr = *px; + + /* save g1(n) in state buffer */ + *px++ = gnext; + + /* Sample processing for K2, K3.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext = fcurr + ((*pk) * gcurr); + /* g2(n) = f1(n) * K2 + g1(n-1) */ + gnext = (fcurr * (*pk++)) + gcurr; + + /* f1(n) is saved in fcurr1 + for next stage processing */ + fcurr = fnext; + + stageCnt--; + } + + /* y(n) = fN(n) */ + *pDst++ = fcurr; + + blkCnt--; + } +} + +void ref_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *px; /* temporary state pointer */ + const q31_t *pk; /* temporary coefficient pointer */ + q31_t fcurr, fnext, gcurr, gnext; /* temporary variables */ + uint32_t numStages = S->numStages; /* Length of the filter */ + uint32_t blkCnt, stageCnt; /* temporary variables for counts */ + + pState = &S->pState[0]; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* f0(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* Initialize state pointer */ + px = pState; + + /* read g0(n-1) from state buffer */ + gcurr = *px; + + /* for sample 1 processing */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext = (q31_t) (((q63_t) gcurr * (*pk)) >> 31) + fcurr; + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext = (q31_t) (((q63_t) fcurr * (*pk++)) >> 31) + gcurr; + /* save g1(n) in state buffer */ + *px++ = fcurr; + + /* f1(n) is saved in fcurr1 + for next stage processing */ + fcurr = fnext; + + stageCnt = (numStages - 1U); + + /* stage loop */ + while (stageCnt > 0U) + { + /* read g2(n) from state buffer */ + gcurr = *px; + + /* save g1(n) in state buffer */ + *px++ = gnext; + + /* Sample processing for K2, K3.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext = (q31_t) (((q63_t) gcurr * (*pk)) >> 31) + fcurr; + /* g2(n) = f1(n) * K2 + g1(n-1) */ + gnext = (q31_t) (((q63_t) fcurr * (*pk++)) >> 31) + gcurr; + + /* f1(n) is saved in fcurr1 + for next stage processing */ + fcurr = fnext; + + stageCnt--; + + } + + /* y(n) = fN(n) */ + *pDst++ = fcurr; + + blkCnt--; + + } +} + +void ref_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *px; /* temporary state pointer */ + const q15_t *pk; /* temporary coefficient pointer */ + q31_t fcurnt, fnext, gcurnt, gnext; /* temporary variables */ + uint32_t numStages = S->numStages; /* Length of the filter */ + uint32_t blkCnt, stageCnt; /* temporary variables for counts */ + + pState = &S->pState[0]; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* f0(n) = x(n) */ + fcurnt = *pSrc++; + + /* Initialize coeff pointer */ + pk = (pCoeffs); + + /* Initialize state pointer */ + px = pState; + + /* read g0(n-1) from state buffer */ + gcurnt = *px; + + /* for sample 1 processing */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext = ((gcurnt * (*pk)) >> 15U) + fcurnt; + fnext = ref_sat_q15(fnext); + + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext = ((fcurnt * (*pk++)) >> 15U) + gcurnt; + gnext = ref_sat_q15(gnext); + + /* save f0(n) in state buffer */ + *px++ = (q15_t) fcurnt; + + /* f1(n) is saved in fcurnt + for next stage processing */ + fcurnt = fnext; + + stageCnt = (numStages - 1U); + + /* stage loop */ + while (stageCnt > 0U) + { + /* read g1(n-1) from state buffer */ + gcurnt = *px; + + /* save g0(n-1) in state buffer */ + *px++ = (q15_t) gnext; + + /* Sample processing for K2, K3.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext = ((gcurnt * (*pk)) >> 15U) + fcurnt; + fnext = ref_sat_q15(fnext); + + /* g2(n) = f1(n) * K2 + g1(n-1) */ + gnext = ((fcurnt * (*pk++)) >> 15U) + gcurnt; + gnext = ref_sat_q15(gnext); + + + /* f1(n) is saved in fcurnt + for next stage processing */ + fcurnt = fnext; + + stageCnt--; + + } + + /* y(n) = fN(n) */ + *pDst++ = ref_sat_q15(fcurnt); + + + blkCnt--; + + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_sparse.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_sparse.c new file mode 100644 index 0000000..73f074c --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/fir_sparse.c @@ -0,0 +1,485 @@ +#include "ref.h" + +void ref_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *px; /* Scratch buffer pointer */ + float32_t *py = pState; /* Temporary pointers for state buffer */ + float32_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ + float32_t *pOut; /* Destination pointer */ + int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ + uint32_t delaySize = S->maxDelay + blockSize; /* state length */ + uint16_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + int32_t readIndex; /* Read index of the state buffer */ + uint32_t tapCnt, blkCnt; /* loop counters */ + float32_t coeff = *pCoeffs++; /* Read the first coefficient value */ + + + /* BlockSize of Input samples are copied into the state buffer */ + /* StateIndex points to the starting position to write in the state buffer */ + arm_circularWrite_f32((int32_t *) py, delaySize, &S->stateIndex, 1, + (int32_t *) pSrc, 1, blockSize); + + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, + blockSize); + + /* Working pointer for the scratch buffer */ + px = pb; + + /* Working pointer for destination buffer */ + pOut = pDst; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Perform Multiplications and store in destination buffer */ + *pOut++ = *px++ * coeff; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Loop over the number of taps. */ + tapCnt = (uint32_t) numTaps - 1U; + + while (tapCnt > 0U) + { + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, + blockSize); + + /* Working pointer for the scratch buffer */ + px = pb; + + /* Working pointer for destination buffer */ + pOut = pDst; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pOut++ += *px++ * coeff; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Decrement the tap loop counter */ + tapCnt--; + } +} + +void ref_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *px; /* Scratch buffer pointer */ + q31_t *py = pState; /* Temporary pointers for state buffer */ + q31_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ + q31_t *pOut; /* Destination pointer */ + q63_t out; /* Temporary output variable */ + int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ + uint32_t delaySize = S->maxDelay + blockSize; /* state length */ + uint16_t numTaps = S->numTaps; /* Filter order */ + int32_t readIndex; /* Read index of the state buffer */ + uint32_t tapCnt, blkCnt; /* loop counters */ + q31_t coeff = *pCoeffs++; /* Read the first coefficient value */ + q31_t in; + + + /* BlockSize of Input samples are copied into the state buffer */ + /* StateIndex points to the starting position to write in the state buffer */ + arm_circularWrite_f32((int32_t *) py, delaySize, &S->stateIndex, 1, + (int32_t *) pSrc, 1, blockSize); + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, + blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pOut = pDst; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Perform Multiplications and store in the destination buffer */ + *pOut++ = (q31_t) (((q63_t) * px++ * coeff) >> 32); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Loop over the number of taps. */ + tapCnt = (uint32_t) numTaps - 1U; + + while (tapCnt > 0U) + { + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, + blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pOut = pDst; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + out = *pOut; + out += ((q63_t) * px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Decrement the tap loop counter */ + tapCnt--; + } + + /* Working output pointer is updated */ + pOut = pDst; + + /* Output is converted into 1.31 format. */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + in = *pOut << 1; + *pOut++ = in; + + /* Decrement the loop counter */ + blkCnt--; + } +} + +void ref_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pIn = pSrc; /* Working pointer for input */ + q15_t *pOut = pDst; /* Working pointer for output */ + q15_t *px; /* Temporary pointers for scratch buffer */ + q15_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ + q15_t *py = pState; /* Temporary pointers for state buffer */ + int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ + uint32_t delaySize = S->maxDelay + blockSize; /* state length */ + uint16_t numTaps = S->numTaps; /* Filter order */ + int32_t readIndex; /* Read index of the state buffer */ + uint32_t tapCnt, blkCnt; /* loop counters */ + q15_t coeff = *pCoeffs++; /* Read the first coefficient value */ + q31_t *pScr2 = pScratchOut; /* Working pointer for pScratchOut */ + + /* BlockSize of Input samples are copied into the state buffer */ + /* StateIndex points to the starting position to write in the state buffer */ + arm_circularWrite_q15(py, delaySize, &S->stateIndex, 1, pIn, 1, blockSize); + + /* Loop over the number of taps. */ + tapCnt = numTaps; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q15(py, delaySize, &readIndex, 1, + pb, pb, blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Perform multiplication and store in the scratch buffer */ + *pScratchOut++ = ((q31_t) * px++ * coeff); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Loop over the number of taps. */ + tapCnt = (uint32_t) numTaps - 1U; + + while (tapCnt > 0U) + { + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q15(py, delaySize, &readIndex, 1, + pb, pb, blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pScratchOut++ += (q31_t) * px++ * coeff; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Decrement the tap loop counter */ + tapCnt--; + } + + /* All the output values are in pScratchOut buffer. + Convert them into 1.15 format, saturate and store in the destination buffer. */ + /* Loop over the blockSize. */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + *pOut++ = (q15_t) __SSAT(*pScr2++ >> 15, 16); + blkCnt--; + } +} + +void ref_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + q7_t *pSrc, + q7_t *pDst, + q7_t *pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize) +{ + q7_t *pState = S->pState; /* State pointer */ + const q7_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q7_t *px; /* Scratch buffer pointer */ + q7_t *py = pState; /* Temporary pointers for state buffer */ + q7_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ + q7_t *pOut = pDst; /* Destination pointer */ + int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ + uint32_t delaySize = S->maxDelay + blockSize; /* state length */ + uint16_t numTaps = S->numTaps; /* Filter order */ + int32_t readIndex; /* Read index of the state buffer */ + uint32_t tapCnt, blkCnt; /* loop counters */ + q7_t coeff = *pCoeffs++; /* Read the coefficient value */ + q31_t *pScr2 = pScratchOut; /* Working pointer for scratch buffer of output values */ + q31_t in; + + /* BlockSize of Input samples are copied into the state buffer */ + /* StateIndex points to the starting position to write in the state buffer */ + arm_circularWrite_q7(py, (int32_t) delaySize, &S->stateIndex, 1, pSrc, 1, + blockSize); + + /* Loop over the number of taps. */ + tapCnt = numTaps; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb, + (int32_t) blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + /* Loop over the blockSize */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Perform multiplication and store in the scratch buffer */ + *pScratchOut++ = ((q31_t) * px++ * coeff); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Loop over the number of taps. */ + tapCnt = (uint32_t) numTaps - 1U; + + while (tapCnt > 0U) + { + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb, + (int32_t) blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + /* Loop over the blockSize */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + in = *pScratchOut + ((q31_t) * px++ * coeff); + *pScratchOut++ = in; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Decrement the tap loop counter */ + tapCnt--; + } + + /* All the output values are in pScratchOut buffer. + Convert them into 1.15 format, saturate and store in the destination buffer. */ + /* Loop over the blockSize. */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + *pOut++ = (q7_t) __SSAT(*pScr2++ >> 7, 8); + + /* Decrement the blockSize loop counter */ + blkCnt--; + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/iir_lattice.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/iir_lattice.c new file mode 100644 index 0000000..ab37d5f --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/iir_lattice.c @@ -0,0 +1,271 @@ +#include "ref.h" + +void ref_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t fcurr, fnext = 0, gcurr, gnext; /* Temporary variables for lattice stages */ + float32_t acc; /* Accumlator */ + uint32_t blkCnt, tapCnt; /* temporary variables for counts */ + float32_t *px1, *px2, *pk, *pv; /* temporary pointers for state and coef */ + uint32_t numStages = S->numStages; /* number of stages */ + float32_t *pState; /* State pointer */ + float32_t *pStateCurnt; /* State current pointer */ + + blkCnt = blockSize; + pState = &S->pState[0]; + + /* Sample processing */ + while (blkCnt > 0U) + { + /* Read Sample from input buffer */ + /* fN(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize state read pointer */ + px1 = pState; + /* Initialize state write pointer */ + px2 = pState; + /* Set accumulator to zero */ + acc = 0.0f; + /* Initialize Ladder coeff pointer */ + pv = &S->pvCoeffs[0]; + /* Initialize Reflection coeff pointer */ + pk = &S->pkCoeffs[0]; + + /* Process sample for numStages */ + tapCnt = numStages; + + while (tapCnt > 0U) + { + gcurr = *px1++; + /* Process sample for last taps */ + fnext = fcurr - (*pk) * gcurr; + gnext = fnext * (*pk++) + gcurr; + + /* Output samples for last taps */ + acc += gnext * (*pv++); + *px2++ = gnext; + fcurr = fnext; + + /* Decrementing loop counter */ + tapCnt--; + } + + /* y(n) += g0(n) * v0 */ + acc += fnext * (*pv); + + *px2++ = fnext; + + /* write out into pDst */ + *pDst++ = acc; + + /* Advance the state pointer by 1 to process the next group of samples */ + pState = pState + 1U; + blkCnt--; + } + + /* Processing is complete. Now copy last S->numStages samples to start of the buffer + for the preperation of next frame process */ + + /* Points to the start of the state buffer */ + pStateCurnt = &S->pState[0]; + pState = &S->pState[blockSize]; + + tapCnt = numStages; + + /* Copy the data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } +} + +void ref_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t fcurr, fnext = 0, gcurr = 0, gnext; /* Temporary variables for lattice stages */ + q63_t acc; /* Accumlator */ + uint32_t blkCnt, tapCnt; /* Temporary variables for counts */ + q31_t *px1, *px2, *pk, *pv; /* Temporary pointers for state and coef */ + uint32_t numStages = S->numStages; /* number of stages */ + q31_t *pState; /* State pointer */ + q31_t *pStateCurnt; /* State current pointer */ + + blkCnt = blockSize; + pState = &S->pState[0]; + + /* Sample processing */ + while (blkCnt > 0U) + { + /* Read Sample from input buffer */ + /* fN(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize state read pointer */ + px1 = pState; + /* Initialize state write pointer */ + px2 = pState; + /* Set accumulator to zero */ + acc = 0; + /* Initialize Ladder coeff pointer */ + pv = &S->pvCoeffs[0]; + /* Initialize Reflection coeff pointer */ + pk = &S->pkCoeffs[0]; + + tapCnt = numStages; + + while (tapCnt > 0U) + { + gcurr = *px1++; + /* Process sample */ + /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ + fnext = + ref_sat_q31(((q63_t) fcurr - + ((q31_t) (((q63_t) gcurr * (*pk)) >> 31)))); + /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ + gnext = + ref_sat_q31(((q63_t) gcurr + + ((q31_t) (((q63_t) fnext * (*pk++)) >> 31)))); + /* Output samples */ + /* y(n) += gN(n) * vN */ + acc += ((q63_t) gnext * *pv++); + /* write gN-1(n-1) into state for next sample processing */ + *px2++ = gnext; + /* Update f values for next coefficient processing */ + fcurr = fnext; + + tapCnt--; + } + + /* y(n) += g0(n) * v0 */ + acc += (q63_t) fnext *(*pv++); + + *px2++ = fnext; + + /* write out into pDst */ + *pDst++ = (q31_t) (acc >> 31U); + + /* Advance the state pointer by 1 to process the next group of samples */ + pState = pState + 1U; + blkCnt--; + } + + /* Processing is complete. Now copy last S->numStages samples to start of the buffer + for the preperation of next frame process */ + + /* Points to the start of the state buffer */ + pStateCurnt = &S->pState[0]; + pState = &S->pState[blockSize]; + + tapCnt = numStages; + + /* Copy the remaining q31_t data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } +} + +void ref_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q31_t fcurr, fnext = 0, gcurr = 0, gnext; /* Temporary variables for lattice stages */ + uint32_t stgCnt; /* Temporary variables for counts */ + q63_t acc; /* Accumlator */ + uint32_t blkCnt, tapCnt; /* Temporary variables for counts */ + q15_t *px1, *px2, *pk, *pv; /* temporary pointers for state and coef */ + uint32_t numStages = S->numStages; /* number of stages */ + q15_t *pState; /* State pointer */ + q15_t *pStateCurnt; /* State current pointer */ + q15_t out; /* Temporary variable for output */ + + blkCnt = blockSize; + pState = &S->pState[0]; + + /* Sample processing */ + while (blkCnt > 0U) + { + /* Read Sample from input buffer */ + /* fN(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize state read pointer */ + px1 = pState; + /* Initialize state write pointer */ + px2 = pState; + /* Set accumulator to zero */ + acc = 0; + /* Initialize Ladder coeff pointer */ + pv = &S->pvCoeffs[0]; + /* Initialize Reflection coeff pointer */ + pk = &S->pkCoeffs[0]; + + tapCnt = numStages; + + while (tapCnt > 0U) + { + gcurr = *px1++; + /* Process sample */ + /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ + fnext = fcurr - ((gcurr * (*pk)) >> 15); + fnext = ref_sat_q15(fnext); + /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ + gnext = ((fnext * (*pk++)) >> 15) + gcurr; + gnext = ref_sat_q15(gnext); + /* Output samples */ + /* y(n) += gN(n) * vN */ + acc += (q31_t) ((gnext * (*pv++))); + /* write gN(n) into state for next sample processing */ + *px2++ = (q15_t) gnext; + /* Update f values for next coefficient processing */ + fcurr = fnext; + + tapCnt--; + } + + /* y(n) += g0(n) * v0 */ + acc += (q31_t) ((fnext * (*pv++))); + + out = ref_sat_q15(acc >> 15); + *px2++ = (q15_t) fnext; + + /* write out into pDst */ + *pDst++ = out; + + /* Advance the state pointer by 1 to process the next group of samples */ + pState = pState + 1U; + blkCnt--; + } + + /* Processing is complete. Now copy last S->numStages samples to start of the buffer + for the preperation of next frame process */ + /* Points to the start of the state buffer */ + pStateCurnt = &S->pState[0]; + pState = &S->pState[blockSize]; + + stgCnt = numStages; + + /* copy data */ + while (stgCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + stgCnt--; + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/lms.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/lms.c new file mode 100644 index 0000000..fee99f9 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/FilteringFunctions/lms.c @@ -0,0 +1,695 @@ +#include "ref.h" + +void ref_lms_f32( + const arm_lms_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, blkCnt; /* Loop counters */ + float32_t sum, e, d; /* accumulator, error, reference data sample */ + float32_t w = 0.0f; /* weight factor */ + + e = 0.0f; + d = 0.0f; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[numTaps - 1U]); + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + sum = 0.0f; + + for(i=0;ipState[i] = pState[i]; + } +} + +void ref_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, blkCnt; /* Loop counters */ + float32_t energy; /* Energy of the input */ + float32_t sum, e, d; /* accumulator, error, reference data sample */ + float32_t w, x0, in; /* weight factor, temporary variable to hold input sample and state */ + + /* Initializations of error, difference, Coefficient update */ + e = 0.0f; + d = 0.0f; + w = 0.0f; + + energy = S->energy; + x0 = S->x0; + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[numTaps - 1U]); + + for(blkCnt = blockSize; blkCnt > 0U; blkCnt--) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc; + + /* Read the sample from input buffer */ + in = *pSrc++; + + /* Update the energy calculation */ + energy -= x0 * x0; + energy += in * in; + + /* Set the accumulator to zero */ + sum = 0.0f; + + for(i=0;ienergy = energy; + S->x0 = x0; + + /* Processing is complete. Now copy the last numTaps - 1 samples to the + * start of the state buffer. This prepares the state buffer for the + * next function call. */ + for(i=0;ipState[i] = pState[i]; + } +} + +void ref_lms_q31( + const arm_lms_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t mu = S->mu; /* Adaptive factor */ + q31_t *px; /* Temporary pointer for state */ + q31_t *pb; /* Temporary pointer for coefficient buffer */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + q63_t acc; /* Accumulator */ + q31_t e = 0; /* error of data sample */ + q31_t alpha; /* Intermediate constant for taps update */ + q31_t coef; /* Temporary variable for coef */ + q31_t acc_l, acc_h; /* temporary input */ + uint32_t uShift = (uint32_t)S->postShift + 1; + uint32_t lShift = 32U - uShift; /* Shift to be applied to the output */ + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + for(blkCnt = blockSize; blkCnt > 0U; blkCnt--) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize pCoeffs pointer */ + pb = pCoeffs; + + /* Set the accumulator to zero */ + acc = 0; + + /* Loop over numTaps number of values */ + tapCnt = numTaps; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (q63_t)(*px++) * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Converting the result to 1.31 format */ + /* Store the result from accumulator into the destination buffer. */ + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + acc = (uint32_t)acc_l >> lShift | acc_h << uShift; + + *pOut++ = (q31_t)acc; + + /* Compute and store error */ + e = *pRef++ - (q31_t)acc; + + *pErr++ = (q31_t)e; + + /* Weighting factor for the LMS version */ + alpha = (q31_t)(((q63_t)e * mu) >> 31); + + /* Initialize pState pointer */ + /* Advance state pointer by 1 for the next sample */ + px = pState++; + + /* Initialize pCoeffs pointer */ + pb = pCoeffs; + + /* Loop over numTaps number of values */ + tapCnt = numTaps; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + coef = (q31_t)(((q63_t) alpha * (*px++)) >> 32); + *pb = ref_sat_q31((q63_t)*pb + (coef << 1)); + pb++; + + /* Decrement the loop counter */ + tapCnt--; + } + } + + /* Processing is complete. Now copy the last numTaps - 1 samples to the + start of the state buffer. This prepares the state buffer for the + next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* Copy (numTaps - 1U) samples */ + tapCnt = numTaps - 1; + + /* Copy the data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } +} + +void ref_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + q31_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + q63_t energy; /* Energy of the input */ + q63_t acc; /* Accumulator */ + q31_t e = 0, d = 0; /* error, reference data sample */ + q31_t w = 0, in; /* weight factor and state */ + q31_t x0; /* temporary variable to hold input sample */ + q63_t errorXmu; /* Temporary variables to store error and mu product and reciprocal of energy */ + q31_t coef; /* Temporary variable for coef */ + q31_t acc_l, acc_h; /* temporary input */ + uint32_t uShift = ((uint32_t) S->postShift + 1U); + uint32_t lShift = 32U - uShift; /* Shift to be applied to the output */ + + energy = S->energy; + x0 = S->x0; + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + for(blkCnt = blockSize; blkCnt > 0U; blkCnt--) + { + + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize pCoeffs pointer */ + pb = pCoeffs; + + /* Read the sample from input buffer */ + in = *pSrc++; + + /* Update the energy calculation */ + energy = (q31_t)((((q63_t)energy << 32) - (((q63_t)x0 * x0) << 1)) >> 32) & 0xffffffff; + energy = (q31_t)(((((q63_t)in * in) << 1) + ((q63_t)energy << 32)) >> 32) & 0xffffffff; + + /* Set the accumulator to zero */ + acc = 0; + + /* Loop over numTaps number of values */ + tapCnt = numTaps; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Converting the result to 1.31 format */ + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + acc = (uint32_t)acc_l >> lShift | acc_h << uShift; + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = (q31_t)acc; + + /* Compute and store error */ + d = *pRef++; + e = d - (q31_t)acc; + *pErr++ = e; + + /* Calculation of product of (e * mu) */ + errorXmu = (q63_t)e * mu; + + /* Weighting factor for the normalized version */ + w = ref_sat_q31(errorXmu / (energy + DELTA_Q31)); + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + + /* Loop over numTaps number of values */ + tapCnt = numTaps; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + /* coef is in 2.30 format */ + coef = (q31_t)(((q63_t)w * (*px++)) >> 32); + /* get coef in 1.31 format by left shifting */ + *pb = ref_sat_q31((q63_t)*pb + (coef << 1U)); + /* update coefficient buffer to next coefficient */ + pb++; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Read the sample from state buffer */ + x0 = *pState; + + /* Advance state pointer by 1 for the next sample */ + pState++; + } + + /* Save energy and x0 values for the next frame */ + S->energy = (q31_t)energy; + S->x0 = x0; + + /* Processing is complete. Now copy the last numTaps - 1 samples to the + start of the state buffer. This prepares the state buffer for the + next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* Loop for (numTaps - 1U) samples copy */ + tapCnt = numTaps - 1; + + /* Copy the remaining q31_t data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } +} + +void ref_lms_q15( + const arm_lms_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q15_t mu = S->mu; /* Adaptive factor */ + q15_t *px; /* Temporary pointer for state */ + q15_t *pb; /* Temporary pointer for coefficient buffer */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + q63_t acc; /* Accumulator */ + q15_t e = 0; /* error of data sample */ + q15_t alpha; /* Intermediate constant for taps update */ + q31_t coef; /* Teporary variable for coefficient */ + q31_t acc_l, acc_h; + int32_t lShift = 15 - (int32_t)S->postShift; /* Post shift */ + int32_t uShift = 32 - lShift; + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + for(blkCnt = blockSize; blkCnt > 0U; blkCnt--) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize pCoeffs pointer */ + pb = pCoeffs; + + /* Set the accumulator to zero */ + acc = 0; + + /* Loop over numTaps number of values */ + tapCnt = numTaps; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (q63_t)((q31_t)(*px++) * (*pb++)); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc = (uint32_t)acc_l >> lShift | acc_h << uShift; + + /* Converting the result to 1.15 format and saturate the output */ + acc = ref_sat_q15(acc); + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = (q15_t)acc; + + /* Compute and store error */ + e = *pRef++ - (q15_t)acc; + + *pErr++ = (q15_t)e; + + /* Compute alpha i.e. intermediate constant for taps update */ + alpha = (q15_t)(((q31_t)e * mu) >> 15); + + /* Initialize pState pointer */ + /* Advance state pointer by 1 for the next sample */ + px = pState++; + + /* Initialize pCoeffs pointer */ + pb = pCoeffs; + + /* Loop over numTaps number of values */ + tapCnt = numTaps; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + coef = (q31_t) * pb + (((q31_t) alpha * (*px++)) >> 15); + *pb++ = (q15_t) ref_sat_q15(coef); + + /* Decrement the loop counter */ + tapCnt--; + } + } + + /* Processing is complete. Now copy the last numTaps - 1 samples to the + start of the state buffer. This prepares the state buffer for the + next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* Copy (numTaps - 1U) samples */ + tapCnt = numTaps - 1; + + /* Copy the data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } +} + +void ref_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q15_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + q15_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + q31_t energy; /* Energy of the input */ + q63_t acc; /* Accumulator */ + q15_t e = 0, d = 0; /* error, reference data sample */ + q15_t w = 0, in; /* weight factor and state */ + q15_t x0; /* temporary variable to hold input sample */ + q15_t errorXmu, oneByEnergy; /* Temporary variables to store error and mu product and reciprocal of energy */ + //q31_t errorXmu; /* Temporary variables to store error and mu product and reciprocal of energy */ + q15_t postShift; /* Post shift to be applied to weight after reciprocal calculation */ + q31_t coef; /* Teporary variable for coefficient */ + q31_t acc_l, acc_h; + int32_t lShift = 15 - (int32_t)S->postShift; /* Post shift */ + int32_t uShift = 32 - lShift; + + energy = S->energy; + x0 = S->x0; + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + for(blkCnt = blockSize; blkCnt > 0U; blkCnt--) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize pCoeffs pointer */ + pb = pCoeffs; + + /* Read the sample from input buffer */ + in = *pSrc++; + + /* Update the energy calculation */ + energy -= (((q31_t)x0 * x0) >> 15) & 0xffff; + energy += (((q31_t)in * in) >> 15) & 0xffff; + + /* Set the accumulator to zero */ + acc = 0; + + /* Loop over numTaps number of values */ + tapCnt = numTaps; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (q31_t)*px++ * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Converting the result to 1.15 format and saturate the output */ + acc = ref_sat_q15(acc); + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = (q15_t) acc; + + /* Compute and store error */ + d = *pRef++; + e = d - (q15_t) acc; + *pErr++ = e; + +#if 0 + /* Calculation of e * mu value */ + errorXmu = (q31_t) e * mu; + + /* Calculation of (e * mu) /energy value */ + acc = errorXmu / (energy + DELTA_Q15); +#endif + + /* Calculation of 1/energy */ + postShift = arm_recip_q15((q15_t) energy + DELTA_Q15, + &oneByEnergy, S->recipTable); + + /* Calculation of e * mu value */ + errorXmu = (q15_t) (((q31_t) e * mu) >> 15); + + /* Calculation of (e * mu) * (1/energy) value */ + acc = (((q31_t) errorXmu * oneByEnergy) >> (15 - postShift)); + + /* Weighting factor for the normalized version */ + w = ref_sat_q15((q31_t)acc); + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + + /* Loop over numTaps number of values */ + tapCnt = numTaps; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + coef = *pb + (((q31_t)w * (*px++)) >> 15); + *pb++ = ref_sat_q15(coef); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Read the sample from state buffer */ + x0 = *pState; + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1U; + } + + /* Save energy and x0 values for the next frame */ + S->energy = (q15_t)energy; + S->x0 = x0; + + /* Processing is complete. Now copy the last numTaps - 1 samples to the + satrt of the state buffer. This prepares the state buffer for the + next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* copy (numTaps - 1U) data */ + tapCnt = numTaps - 1; + + /* copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/HelperFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/HelperFunctions.c new file mode 100644 index 0000000..557e969 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/HelperFunctions.c @@ -0,0 +1,4 @@ + +#include "mat_helper.c" +#include "ref_helper.c" + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/mat_helper.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/mat_helper.c new file mode 100644 index 0000000..0174ccf --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/mat_helper.c @@ -0,0 +1,193 @@ +#include "ref.h" + +float32_t ref_detrm(float32_t *pSrc, float32_t *temp, uint32_t size) +{ + float32_t s = 1, det = 0; + int i, j, m, n, c; + + if ( size == 1 ) + { + return ( pSrc[ 0 ] ); + } + else + { + det = 0; + + for ( c = 0;c < size;c++ ) + { + m = 0; + n = 0; + + for ( i = 0;i < size;i++ ) + { + for ( j = 0;j < size;j++ ) + { + temp[ i*size + j ] = 0; + + if ( i != 0 && j != c ) + { + temp[ m*(size-1) + n ] = pSrc[ i*size + j ]; + + if ( n < ( size - 2 ) ) + { + n++; + } + else + { + n = 0; + m++; + } + } + } + } + + det += s * ( pSrc[ c ] * ref_detrm( temp, temp + size*size, size - 1 ) ); + s = -s; + } + } + + return ( det ); +} + + +void ref_cofact(float32_t *pSrc, float32_t *pDst, float32_t *temp, uint32_t size) +{ + int p, q, m, n, i, j; + + if (size == 1) + { + pDst[0] = 1; + return; + } + + for ( q = 0;q < size;q++ ) + { + for ( p = 0;p < size;p++ ) + { + m = 0; + n = 0; + + for ( i = 0;i < size;i++ ) + { + for ( j = 0;j < size;j++ ) + { + temp[ i*size + j ] = 0; + + if ( i != q && j != p ) + { + temp[ m*(size-1) + n ] = pSrc[ i*size + j ]; + + if ( n < ( size - 2 ) ) + { + n++; + } + else + { + n = 0; + m++; + } + } + } + } + + pDst[ q*size + p ] = ref_pow( -1, q + p ) * ref_detrm( temp, temp + (size-1)*(size-1), size - 1 ); + } + } +} + + + +float64_t ref_detrm64(float64_t *pSrc, float64_t *temp, uint32_t size) +{ + float64_t s = 1, det = 0; + int i, j, m, n, c; + + if ( size == 1 ) + { + return ( pSrc[ 0 ] ); + } + else + { + det = 0; + + for ( c = 0;c < size;c++ ) + { + m = 0; + n = 0; + + for ( i = 0;i < size;i++ ) + { + for ( j = 0;j < size;j++ ) + { + temp[ i*size + j ] = 0; + + if ( i != 0 && j != c ) + { + temp[ m*(size-1) + n ] = pSrc[ i*size + j ]; + + if ( n < ( size - 2 ) ) + { + n++; + } + else + { + n = 0; + m++; + } + } + } + } + + det += s * ( pSrc[ c ] * ref_detrm64( temp, temp + size*size, size - 1 ) ); + s = -s; + } + } + + return ( det ); +} + + +void ref_cofact64(float64_t *pSrc, float64_t *pDst, float64_t *temp, uint32_t size) +{ + int p, q, m, n, i, j; + + if (size == 1) + { + pDst[0] = 1; + return; + } + + for ( q = 0;q < size;q++ ) + { + for ( p = 0;p < size;p++ ) + { + m = 0; + n = 0; + + for ( i = 0;i < size;i++ ) + { + for ( j = 0;j < size;j++ ) + { + temp[ i*size + j ] = 0; + + if ( i != q && j != p ) + { + temp[ m*(size-1) + n ] = pSrc[ i*size + j ]; + + if ( n < ( size - 2 ) ) + { + n++; + } + else + { + n = 0; + m++; + } + } + } + } + + pDst[ q*size + p ] = ref_pow( -1, q + p ) * ref_detrm64( temp, temp + (size-1)*(size-1), size - 1 ); + } + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/ref_helper.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/ref_helper.c new file mode 100644 index 0000000..57ecf1b --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/HelperFunctions/ref_helper.c @@ -0,0 +1,103 @@ +#include "ref.h" + +float32_t scratchArray[8192*2]; + +arm_cfft_instance_f32 ref_cfft_sR_f32_len8192 = { 8192, 0, 0, 0 }; + +q31_t ref_sat_n(q31_t num, uint32_t bits) +{ + int32_t posMax, negMin; + uint32_t i; + + posMax = 1; + for (i = 0; i < (bits - 1); i++) + { + posMax = posMax * 2; + } + + if (num > 0) + { + posMax = (posMax - 1); + + if (num > posMax) + { + num = posMax; + } + } + else + { + negMin = -posMax; + + if (num < negMin) + { + num = negMin; + } + } + return (num); +} + +q31_t ref_sat_q31(q63_t num) +{ + if (num > (q63_t)INT_MAX) + { + return INT_MAX; + } + else if (num < (q63_t)0xffffffff80000000ll) + { + return INT_MIN; + } + else + { + return (q31_t)num; + } +} + +q15_t ref_sat_q15(q31_t num) +{ + if (num > (q31_t)SHRT_MAX) + { + return SHRT_MAX; + } + else if (num < (q31_t)0xffff8000) + { + return SHRT_MIN; + } + else + { + return (q15_t)num; + } +} + +q7_t ref_sat_q7(q15_t num) +{ + if (num > (q15_t)SCHAR_MAX) + { + return SCHAR_MAX; + } + else if (num < (q15_t)0xff80) + { + return SCHAR_MIN; + } + else + { + return (q7_t)num; + } +} + +float32_t ref_pow(float32_t a, uint32_t b) +{ + uint32_t i; + float32_t r = a; + + for(i=1;i> 24) + ((y << 16) >> 24))), 8); + t = ref_sat_n(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); + u = ref_sat_n(((q31_t) ((x >> 24) + (y >> 24))), 8); + + sum = + (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | + (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); + + return sum; + +} + +q31_t ref__QSUB8(q31_t x, q31_t y) +{ + q31_t sum; + q31_t r, s, t, u; + + r = (q7_t) x; + s = (q7_t) y; + + r = ref_sat_n((r - s), 8); + s = ref_sat_n(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; + t = ref_sat_n(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; + u = ref_sat_n(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; + + sum = (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF); + + return sum; +} + +q31_t ref__QADD16(q31_t x, q31_t y) +{ + q31_t sum; + q31_t r, s; + + r = (q15_t) x; + s = (q15_t) y; + + r = ref_sat_q15(r + s); + s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) + (y >> 16)))) << 16; + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + +} + +q31_t ref__SHADD16(q31_t x, q31_t y) +{ + q31_t sum; + q31_t r, s; + + r = (q15_t) x; + s = (q15_t) y; + + r = (r + s) >> 1; + s = ((q31_t) (((x >> 16) + (y >> 16)) >> 1) << 16); + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + +} + +q31_t ref__QSUB16(q31_t x, q31_t y) +{ + q31_t sum; + q31_t r, s; + + r = (q15_t) x; + s = (q15_t) y; + + r = ref_sat_q15(r - s); + s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) - (y >> 16)))) << 16; + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; +} + +q31_t ref__SHSUB16(q31_t x, q31_t y) +{ + q31_t diff; + q31_t r, s; + + r = (q15_t) x; + s = (q15_t) y; + + r = ((r >> 1) - (s >> 1)); + s = (((x >> 17) - (y >> 17)) << 16); + + diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return diff; +} + +q31_t ref__QASX(q31_t x, q31_t y) +{ + q31_t sum = 0; + q31_t xL, xH, yL, yH; + + // extract bottom halfword and sign extend + xL = (q15_t)(x & 0xffff); + // extract bottom halfword and sign extend + yL = (q15_t)(y & 0xffff); + // extract top halfword and sign extend + xH = (q15_t)(x >> 16); + // extract top halfword and sign extend + yH = (q15_t)(y >> 16); + + sum = (((q31_t)ref_sat_q15(xH + yL )) << 16) | + (((q31_t)ref_sat_q15(xL - yH )) & 0xffff); + + return sum; +} + +q31_t ref__SHASX(q31_t x, q31_t y) +{ + q31_t sum; + q31_t r, s; + + r = (q15_t) x; + s = (q15_t) y; + + r = (r - (y >> 16)) / 2; + s = (((x >> 16) + s) << 15); + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; +} + +q31_t ref__QSAX(q31_t x, q31_t y) +{ + q31_t sum = 0; + q31_t xL, xH, yL, yH; + + // extract bottom halfword and sign extend + xL = (q15_t)(x & 0xffff); + // extract bottom halfword and sign extend + yL = (q15_t)(y & 0xffff); + // extract top halfword and sign extend + xH = (q15_t)(x >> 16); + // extract top halfword and sign extend + yH = (q15_t)(y >> 16); + + sum = (((q31_t)ref_sat_q15(xH - yL )) << 16) | + (((q31_t)ref_sat_q15(xL + yH )) & 0xffff); + + return sum; +} + +q31_t ref__SHSAX(q31_t x, q31_t y) +{ + q31_t sum; + q31_t r, s; + + r = (q15_t) x; + s = (q15_t) y; + + r = (r + (y >> 16)) / 2; + s = (((x >> 16) - s) << 15); + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; +} + +q31_t ref__SMUSDX(q31_t x, q31_t y) +{ + return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) - ((q15_t) (x >> 16) * (q15_t) y))); +} + +q31_t ref__SMUADX(q31_t x, q31_t y) +{ + return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) + ((q15_t) (x >> 16) * (q15_t) y))); +} + +q31_t ref__QADD(q31_t x, q31_t y) +{ + return ref_sat_q31((q63_t) x + y); +} + +q31_t ref__QSUB(q31_t x, q31_t y) +{ + return ref_sat_q31((q63_t) x - y); +} + +q31_t ref__SMLAD(q31_t x, q31_t y, q31_t sum) +{ + return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); +} + +q31_t ref__SMLADX(q31_t x, q31_t y, q31_t sum) +{ + return (sum + ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16))); +} + +q31_t ref__SMLSDX(q31_t x, q31_t y, q31_t sum) +{ + return (sum - ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16))); +} + +q63_t ref__SMLALD(q31_t x, q31_t y, q63_t sum) +{ + return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); +} + +q63_t ref__SMLALDX(q31_t x, q31_t y, q63_t sum) +{ + return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); +} + +q31_t ref__SMUAD(q31_t x, q31_t y) +{ + return (((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16))); +} + +q31_t ref__SMUSD(q31_t x, q31_t y) +{ + return (-((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16))); +} + +q31_t ref__SXTB16(q31_t x) +{ + return ((((x << 24) >> 24) & 0x0000FFFF) | (((x << 8) >> 8) & 0xFFFF0000)); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/MatrixFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/MatrixFunctions.c new file mode 100644 index 0000000..b285455 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/MatrixFunctions.c @@ -0,0 +1,9 @@ + +#include "mat_add.c" +#include "mat_cmplx_mult.c" +#include "mat_inverse.c" +#include "mat_mult.c" +#include "mat_scale.c" +#include "mat_sub.c" +#include "mat_trans.c" + diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_add.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_add.c new file mode 100644 index 0000000..a6e0067 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_add.c @@ -0,0 +1,58 @@ +#include "ref.h" + +arm_status ref_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + + for(i=0;ipData[i] = pSrcA->pData[i] + pSrcB->pData[i]; + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + + for(i=0;ipData[i] = ref_sat_q31( (q63_t)pSrcA->pData[i] + pSrcB->pData[i]); + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + + for(i=0;ipData[i] = ref_sat_q15( (q31_t)pSrcA->pData[i] + pSrcB->pData[i]); + } + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_cmplx_mult.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_cmplx_mult.c new file mode 100644 index 0000000..9364619 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_cmplx_mult.c @@ -0,0 +1,118 @@ +#include "ref.h" + +arm_status ref_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + uint32_t r,c,i,outR,outC,innerSize; + float32_t sumR,sumI; + float32_t a0,b0,c0,d0; + + outR = pSrcA->numRows; + outC = pSrcB->numCols; + innerSize = pSrcA->numCols; + + for(r=0;rpData[2*(r*innerSize + i) + 0]; + b0 = pSrcA->pData[2*(r*innerSize + i) + 1]; + c0 = pSrcB->pData[2*(i*outC + c) + 0]; + d0 = pSrcB->pData[2*(i*outC + c) + 1]; + + sumR += a0 * c0 - b0 * d0; + sumI += b0 * c0 + a0 * d0; + } + + pDst->pData[2*(r*outC + c) + 0] = sumR; + pDst->pData[2*(r*outC + c) + 1] = sumI; + } + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + uint32_t r,c,i,outR,outC,innerSize; + q63_t sumR,sumI; + q31_t a0,b0,c0,d0; + + outR = pSrcA->numRows; + outC = pSrcB->numCols; + innerSize = pSrcA->numCols; + + for(r=0;rpData[2*(r*innerSize + i) + 0]; + b0 = pSrcA->pData[2*(r*innerSize + i) + 1]; + c0 = pSrcB->pData[2*(i*outC + c) + 0]; + d0 = pSrcB->pData[2*(i*outC + c) + 1]; + + sumR += (q63_t)a0 * c0 - (q63_t)b0 * d0; + sumI += (q63_t)b0 * c0 + (q63_t)a0 * d0; + } + + pDst->pData[2*(r*outC + c) + 0] = ref_sat_q31(sumR >> 31); + pDst->pData[2*(r*outC + c) + 1] = ref_sat_q31(sumI >> 31); + } + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst) +{ + uint32_t r,c,i,outR,outC,innerSize; + q63_t sumR,sumI; + q15_t a0,b0,c0,d0; + + outR = pSrcA->numRows; + outC = pSrcB->numCols; + innerSize = pSrcA->numCols; + + for(r=0;rpData[2*(r*innerSize + i) + 0]; + b0 = pSrcA->pData[2*(r*innerSize + i) + 1]; + c0 = pSrcB->pData[2*(i*outC + c) + 0]; + d0 = pSrcB->pData[2*(i*outC + c) + 1]; + + sumR += (q31_t)a0 * c0 - (q31_t)b0 * d0; + sumI += (q31_t)b0 * c0 + (q31_t)a0 * d0; + } + + pDst->pData[2*(r*outC + c) + 0] = ref_sat_q15(sumR >> 15); + pDst->pData[2*(r*outC + c) + 1] = ref_sat_q15(sumI >> 15); + } + } + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_inverse.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_inverse.c new file mode 100644 index 0000000..74d3ccc --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_inverse.c @@ -0,0 +1,57 @@ +#include "ref.h" + +arm_status ref_mat_inverse_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst) +{ + float32_t det; + uint32_t i, size; + arm_matrix_instance_f32 tmp; + + tmp.numCols = pSrc->numCols; + tmp.numRows = pSrc->numRows; + tmp.pData = scratchArray; + + det = ref_detrm(pSrc->pData,scratchArray,pSrc->numCols); + + size = pSrc->numCols * pSrc->numCols; + + ref_cofact(pSrc->pData,scratchArray,scratchArray + size,pSrc->numCols); + + ref_mat_trans_f32(&tmp,pDst); + + for(i=0;ipData[i] /= det; + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_inverse_f64( + const arm_matrix_instance_f64 * pSrc, + arm_matrix_instance_f64 * pDst) +{ + float64_t det; + uint32_t i, size; + arm_matrix_instance_f64 tmp; + + tmp.numCols = pSrc->numCols; + tmp.numRows = pSrc->numRows; + tmp.pData = (float64_t*)scratchArray; + + det = ref_detrm64(pSrc->pData,(float64_t*)scratchArray,pSrc->numCols); + + size = pSrc->numCols * pSrc->numCols; + + ref_cofact64(pSrc->pData,(float64_t*)scratchArray,(float64_t*)scratchArray + size,pSrc->numCols); + + ref_mat_trans_f64(&tmp,pDst); + + for(i=0;ipData[i] /= det; + } + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_mult.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_mult.c new file mode 100644 index 0000000..e9ef432 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_mult.c @@ -0,0 +1,91 @@ +#include "ref.h" + +arm_status ref_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + uint32_t r,c,i,outR,outC,innerSize; + float32_t sum; + + outR = pSrcA->numRows; + outC = pSrcB->numCols; + innerSize = pSrcA->numCols; + + for(r=0;rpData[r*innerSize + i] * pSrcB->pData[i*outC + c]; + } + + pDst->pData[r*outC + c] = sum; + } + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + uint32_t r,c,i,outR,outC,innerSize; + q63_t sum; + + outR = pSrcA->numRows; + outC = pSrcB->numCols; + innerSize = pSrcA->numCols; + + for(r=0;rpData[r*innerSize + i]) * pSrcB->pData[i*outC + c]; + } + + pDst->pData[r*outC + c] = ref_sat_q31(sum >> 31); + } + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst) +{ + uint32_t r,c,i,outR,outC,innerSize; + q63_t sum; + + outR = pSrcA->numRows; + outC = pSrcB->numCols; + innerSize = pSrcA->numCols; + + for(r=0;rpData[r*innerSize + i]) * pSrcB->pData[i*outC + c]; + } + + pDst->pData[r*outC + c] = ref_sat_q15(sum >> 15); + } + } + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_scale.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_scale.c new file mode 100644 index 0000000..d426ad6 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_scale.c @@ -0,0 +1,64 @@ +#include "ref.h" + +arm_status ref_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; + + for(i=0;ipData[i] = pSrc->pData[i] * scale; + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scale, + int32_t shift, + arm_matrix_instance_q31 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + int32_t totShift = shift + 1; + q31_t tmp; + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; + + for(i=0;ipData[i] * scale) >> 32; + pDst->pData[i] = ref_sat_q31((q63_t)tmp << totShift ); + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scale, + int32_t shift, + arm_matrix_instance_q15 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + int32_t totShift = 15 - shift; + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; + + for(i=0;ipData[i] = ref_sat_q15( ((q31_t)pSrc->pData[i] * scale) >> totShift); + } + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_sub.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_sub.c new file mode 100644 index 0000000..bbd23f0 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_sub.c @@ -0,0 +1,58 @@ +#include "ref.h" + +arm_status ref_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + + for(i=0;ipData[i] = pSrcA->pData[i] - pSrcB->pData[i]; + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + + for(i=0;ipData[i] = ref_sat_q31( (q63_t)pSrcA->pData[i] - pSrcB->pData[i]); + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst) +{ + uint32_t i; + uint32_t numSamples; /* total number of elements in the matrix */ + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + + for(i=0;ipData[i] = ref_sat_q15( (q31_t)pSrcA->pData[i] - pSrcB->pData[i]); + } + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_trans.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_trans.c new file mode 100644 index 0000000..8cb9a8d --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/MatrixFunctions/mat_trans.c @@ -0,0 +1,77 @@ +#include "ref.h" + +arm_status ref_mat_trans_f64( + const arm_matrix_instance_f64 * pSrc, + arm_matrix_instance_f64 * pDst) +{ + uint64_t r,c; + uint64_t numR = pSrc->numRows; + uint64_t numC = pSrc->numCols; + + for(r=0;rpData[c*numR + r] = pSrc->pData[r*numC + c]; + } + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst) +{ + uint32_t r,c; + uint32_t numR = pSrc->numRows; + uint32_t numC = pSrc->numCols; + + for(r=0;rpData[c*numR + r] = pSrc->pData[r*numC + c]; + } + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst) +{ + uint32_t r,c; + uint32_t numR = pSrc->numRows; + uint32_t numC = pSrc->numCols; + + for(r=0;rpData[c*numR + r] = pSrc->pData[r*numC + c]; + } + } + + return ARM_MATH_SUCCESS; +} + +arm_status ref_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst) +{ + uint32_t r,c; + uint32_t numR = pSrc->numRows; + uint32_t numC = pSrc->numCols; + + for(r=0;rpData[c*numR + r] = pSrc->pData[r*numC + c]; + } + } + + return ARM_MATH_SUCCESS; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/StatisticsFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/StatisticsFunctions.c new file mode 100644 index 0000000..6791b3e --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/StatisticsFunctions.c @@ -0,0 +1,8 @@ + +#include "max.c" +#include "mean.c" +#include "min.c" +#include "power.c" +#include "rms.c" +#include "std.c" +#include "var.c" diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/max.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/max.c new file mode 100644 index 0000000..02b4127 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/max.c @@ -0,0 +1,85 @@ +#include "ref.h" + +void ref_max_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + float32_t max=-FLT_MAX; + + for(i=0;i pSrc[i]) + { + min = pSrc[i]; + ind = i; + } + } + *pResult = min; + *pIndex = ind; +} + +void ref_min_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q31_t min=INT_MAX; + + for(i=0;i pSrc[i]) + { + min = pSrc[i]; + ind = i; + } + } + *pResult = min; + *pIndex = ind; +} + +void ref_min_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q15_t min=SHRT_MAX; + + for(i=0;i pSrc[i]) + { + min = pSrc[i]; + ind = i; + } + } + *pResult = min; + *pIndex = ind; +} + +void ref_min_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q7_t min=SCHAR_MAX; + + for(i=0;i pSrc[i]) + { + min = pSrc[i]; + ind = i; + } + } + *pResult = min; + *pIndex = ind; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/power.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/power.c new file mode 100644 index 0000000..8202e04 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/power.c @@ -0,0 +1,61 @@ +#include "ref.h" + +void ref_power_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t i; + float32_t sumsq=0; + + for(i=0;i> 14; + } + *pResult = sumsq; +} + +void ref_power_q15( + q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult) +{ + uint32_t i; + q63_t sumsq=0; + + for(i=0;i> 31; + tmp2 = ref_sat_q31(tmp1); + + /* GCC M0 problem: __aeabi_f2iz(QNAN) returns not 0 */ + help_float = (sqrtf((float)tmp2 / 2147483648.0f) * 2147483648.0f); + /* Checking for a NAN value in help_float */ + if (((*((int *)(&help_float))) & 0x7FC00000) == 0x7FC00000) { + help_float = 0; + } + *pResult = (q31_t)(help_float); + +// *pResult = (q31_t)(sqrtf((float)tmp2 / 2147483648.0f) * 2147483648.0f); +} + +void ref_rms_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t i; + q63_t sumsq=0; + q31_t tmp1; + q15_t tmp2; + + for(i=0;i> 15; + tmp2 = ref_sat_q15(tmp1); + *pResult = (q15_t)(sqrtf((float)tmp2 / 32768.0f) * 32768.0f); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/std.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/std.c new file mode 100644 index 0000000..c0c1ba3 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/std.c @@ -0,0 +1,74 @@ +#include "ref.h" + +void ref_std_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t i; + float32_t sum=0, sumsq=0; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i> 8; + sum += in; + sumsq += (q63_t)in * in; + } + sumsq /= (q63_t)(blockSize - 1); + sum = sum * sum / (q63_t)(blockSize * (blockSize - 1)); + *pResult = (q31_t)(sqrtf((float)( (sumsq - sum) >> 15) / 2147483648.0f ) * 2147483648.0f); +} + +void ref_std_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t i; + q31_t sum=0; + q63_t sumsq=0; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i> 15) / 32768.0f ) * 32768.0f); +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/var.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/var.c new file mode 100644 index 0000000..f5da3a6 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/var.c @@ -0,0 +1,70 @@ +#include "ref.h" + +void ref_var_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t i; + float32_t sum=0, sumsq=0; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i> 8; + sum += in; + sumsq += (q63_t)in * in; + } + *pResult = (sumsq - sum * sum / (q31_t)blockSize) / ((q31_t)blockSize - 1) >> 15; +} + +void ref_var_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t i; + q31_t sum=0; + q63_t sumsq=0; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i> 15; +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/SupportFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/SupportFunctions.c new file mode 100644 index 0000000..9abab56 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/SupportFunctions.c @@ -0,0 +1,6 @@ + +#include "copy.c" +#include "fill.c" +#include "fixed_to_fixed.c" +#include "fixed_to_float.c" +#include "float_to_fixed.c" diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/copy.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/copy.c new file mode 100644 index 0000000..08089f5 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/SupportFunctions/copy.c @@ -0,0 +1,53 @@ +#include "ref.h" + +void ref_copy_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + for(i=0;i> 16; + } +} + +void ref_q31_to_q7( + q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + for(i=0;i> 24; + } +} + +void ref_q15_to_q31( + q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + for(i=0;i> 8; + } +} + +void ref_q7_to_q31( + q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + + for(i=0;i 0.0f ? 0.5f : -0.5f; //round + pDst[i] = ref_sat_q31((q63_t)in); //cast and saturate + } +} + +void ref_float_to_q15( + float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + float32_t in; + + for(i=0;i 0.0f ? 0.5f : -0.5f; + pDst[i] = ref_sat_q15((q31_t)in); + } +} + +void ref_float_to_q7( + float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t i; + float32_t in; + + for(i=0;i 0.0f ? 0.5f : -0.5f; + pDst[i] = ref_sat_q7((q15_t)in); + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/TransformFunctions.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/TransformFunctions.c new file mode 100644 index 0000000..d100918 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/TransformFunctions.c @@ -0,0 +1,4 @@ + +#include "cfft.c" +#include "dct4.c" +#include "rfft.c" diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c new file mode 100644 index 0000000..b5a4068 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/bitreversal.c @@ -0,0 +1,30 @@ +#include "ref.h" + + +;/* +;* @brief In-place bit reversal function. +;* @param[in, out] *pSrc points to the in-place buffer of unknown 32-bit data type. +;* @param[in] bitRevLen bit reversal table length +;* @param[in] *pBitRevTab points to bit reversal table. +;* @return none. +;*/ +void ref_arm_bitreversal_32(uint32_t *pSrc, uint32_t bitRevLen, uint32_t *pBitRevTab) +{ + uint32_t a,b,i,tmp; + + for(i=0; ifftLen; + int32_t dir = (ifftFlag) ? -1 : 1; + + // decrement pointer since the original version used fortran style indexing. + data--; + + n = N << 1; + j = 1; + for (i = 1; i < n; i += 2) { + if (j > i) { + tempr = data[j]; data[j] = data[i]; data[i] = tempr; + tempr = data[j+1]; data[j+1] = data[i+1]; data[i+1] = tempr; + } + m = n >> 1; + while (m >= 2 && j > m) { + j -= m; + m >>= 1; + } + j += m; + } + mmax = 2; + while (n > mmax) { + istep = 2*mmax; + theta = -6.283185307179586f/(dir*mmax); + wtemp = sinf(0.5f*theta); + wpr = -2.0f*wtemp*wtemp; + wpi = sinf(theta); + wr = 1.0f; + wi = 0.0f; + for (m = 1; m < mmax; m += 2) { + for (i = m; i <= n; i += istep) { + j =i + mmax; + tempr = wr*data[j] - wi*data[j+1]; + tempi = wr*data[j+1] + wi*data[j]; + data[j] = data[i] - tempr; + data[j+1] = data[i+1] - tempi; + data[i] += tempr; + data[i+1] += tempi; + } + wr = (wtemp = wr)*wpr - wi*wpi + wr; + wi = wi*wpr + wtemp*wpi + wi; + } + mmax = istep; + } + + // Inverse transform is scaled by 1/N + if (ifftFlag) + { + data++; + for(i = 0; i<2*N; i++) + { + data[i] /= N; + } + } +} + +void ref_cfft_q31( + const arm_cfft_instance_q31 * S, + q31_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + uint32_t i; + float32_t *fSrc = (float32_t*)p1; + + for(i=0;ifftLen*2;i++) + { + //read the q31 data, cast to float, scale down for float + fSrc[i] = (float32_t)p1[i] / 2147483648.0f; + } + + switch(S->fftLen) + { + case 16: + ref_cfft_f32(&arm_cfft_sR_f32_len16, fSrc, ifftFlag, bitReverseFlag); + break; + + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, fSrc, ifftFlag, bitReverseFlag); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, fSrc, ifftFlag, bitReverseFlag); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, fSrc, ifftFlag, bitReverseFlag); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, fSrc, ifftFlag, bitReverseFlag); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, fSrc, ifftFlag, bitReverseFlag); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, fSrc, ifftFlag, bitReverseFlag); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, fSrc, ifftFlag, bitReverseFlag); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, fSrc, ifftFlag, bitReverseFlag); + break; + } + + if (ifftFlag) + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q31, cast to q31 + p1[i] = (q31_t)( fSrc[i] * 2147483648.0f ); + } + } + else + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q31, cast to q31 + p1[i] = (q31_t)( fSrc[i] * 2147483648.0f / (float32_t)S->fftLen); + } + } +} + +void ref_cfft_q15( + const arm_cfft_instance_q15 * S, + q15_t * pSrc, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + uint32_t i; + float32_t *fSrc = (float32_t*)pSrc; + + for(i=0;ifftLen*2;i++) + { + //read the q15 data, cast to float, scale down for float, place in temporary buffer + scratchArray[i] = (float32_t)pSrc[i] / 32768.0f; + } + + for(i=0;ifftLen*2;i++) + { + //copy from temp buffer to final buffer + fSrc[i] = scratchArray[i]; + } + + switch(S->fftLen) + { + case 16: + ref_cfft_f32(&arm_cfft_sR_f32_len16, fSrc, ifftFlag, bitReverseFlag); + break; + + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, fSrc, ifftFlag, bitReverseFlag); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, fSrc, ifftFlag, bitReverseFlag); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, fSrc, ifftFlag, bitReverseFlag); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, fSrc, ifftFlag, bitReverseFlag); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, fSrc, ifftFlag, bitReverseFlag); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, fSrc, ifftFlag, bitReverseFlag); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, fSrc, ifftFlag, bitReverseFlag); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, fSrc, ifftFlag, bitReverseFlag); + break; + } + + if (ifftFlag) + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q15, cast to q15 + pSrc[i] = (q15_t)( fSrc[i] * 32768.0f ); + } + } + else + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q15, cast to q15 + pSrc[i] = (q15_t)( fSrc[i] * 32768.0f / (float32_t)S->fftLen); + } + } +} + +void ref_cfft_radix2_f32( + const arm_cfft_radix2_instance_f32 * S, + float32_t * pSrc) +{ + switch(S->fftLen) + { + case 16: + ref_cfft_f32(&arm_cfft_sR_f32_len16, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + } +} + +void ref_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 * S, + q31_t * pSrc) +{ + uint32_t i; + float32_t *fSrc = (float32_t*)pSrc; + + for(i=0;ifftLen*2;i++) + { + //read the q31 data, cast to float, scale down for float + fSrc[i] = (float32_t)pSrc[i] / 2147483648.0f; + } + + switch(S->fftLen) + { + case 16: + ref_cfft_f32(&arm_cfft_sR_f32_len16, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + } + + if (S->ifftFlag) + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q31, cast to q31 + pSrc[i] = (q31_t)( fSrc[i] * 2147483648.0f ); + } + } + else + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q31, cast to q31 + pSrc[i] = (q31_t)( fSrc[i] * 2147483648.0f / (float32_t)S->fftLen); + } + } +} + +void ref_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 * S, + q15_t * pSrc) +{ + uint32_t i; + float32_t *fSrc = (float32_t*)pSrc; + + for(i=0;ifftLen*2;i++) + { + //read the q15 data, cast to float, scale down for float, place in temporary buffer + scratchArray[i] = (float32_t)pSrc[i] / 32768.0f; + } + + for(i=0;ifftLen*2;i++) + { + //copy from temp buffer to final buffer + fSrc[i] = scratchArray[i]; + } + + switch(S->fftLen) + { + case 16: + ref_cfft_f32(&arm_cfft_sR_f32_len16, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + } + + if (S->ifftFlag) + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q15, cast to q15 + pSrc[i] = (q15_t)( fSrc[i] * 32768.0f ); + } + } + else + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q15, cast to q15 + pSrc[i] = (q15_t)( fSrc[i] * 32768.0f / (float32_t)S->fftLen); + } + } +} + +void ref_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc) +{ + switch(S->fftLen) + { + case 16: + ref_cfft_f32(&arm_cfft_sR_f32_len16, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, pSrc, S->ifftFlag, S->bitReverseFlag); + break; + } +} + +void ref_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc) +{ + uint32_t i; + float32_t *fSrc = (float32_t*)pSrc; + + for(i=0;ifftLen*2;i++) + { + //read the q31 data, cast to float, scale down for float + fSrc[i] = (float32_t)pSrc[i] / 2147483648.0f; + } + + switch(S->fftLen) + { + case 16: + ref_cfft_f32(&arm_cfft_sR_f32_len16, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + } + + if (S->ifftFlag) + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q31, cast to q31 + pSrc[i] = (q31_t)( fSrc[i] * 2147483648.0f ); + } + } + else + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q31, cast to q31 + pSrc[i] = (q31_t)( fSrc[i] * 2147483648.0f / (float32_t)S->fftLen); + } + } +} + +void ref_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc) +{ + uint32_t i; + float32_t *fSrc = (float32_t*)pSrc; + + for(i=0;ifftLen*2;i++) + { + //read the q15 data, cast to float, scale down for float, place in temporary buffer + scratchArray[i] = (float32_t)pSrc[i] / 32768.0f; + } + + for(i=0;ifftLen*2;i++) + { + //copy from temp buffer to final buffer + fSrc[i] = scratchArray[i]; + } + + switch(S->fftLen) + { + case 16: + ref_cfft_f32(&arm_cfft_sR_f32_len16, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, fSrc, S->ifftFlag, S->bitReverseFlag); + break; + } + + if (S->ifftFlag) + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q15, cast to q15 + pSrc[i] = (q15_t)( fSrc[i] * 32768.0f ); + } + } + else + { + for(i=0;ifftLen*2;i++) + { + //read the float data, scale up for q15, cast to q15 + pSrc[i] = (q15_t)( fSrc[i] * 32768.0f / (float32_t)S->fftLen); + } + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/dct4.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/dct4.c new file mode 100644 index 0000000..9c1f207 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/dct4.c @@ -0,0 +1,89 @@ +#include "ref.h" + +void ref_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer) +{ + uint32_t n,k; + float32_t sum; + float32_t pi_by_N = 3.14159265358979f / (float32_t)S->N; + float32_t tmp; + float32_t normalize = sqrtf(2.0f / (float32_t)S->N); + + for(k=0;kN;k++) + { + sum=0.0f; + tmp = ((float32_t)k + 0.5f)*pi_by_N; + for(n=0;nN;n++) + { + sum += pInlineBuffer[n] * cosf(tmp * ((float32_t)n + 0.5f)); + } + scratchArray[k] = normalize * sum; + } + + for(k=0;kN;k++) + { + pInlineBuffer[k] = scratchArray[k]; + } +} + +void ref_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer) +{ + arm_dct4_instance_f32 SS; + float32_t *fSrc = (float32_t*)pInlineBuffer; + uint32_t i; + + SS.N = S->N; + + for(i=0;iN;i++) + { + //read the q31 data, cast to float, scale down for float + fSrc[i] = (float32_t)pInlineBuffer[i] / 2147483648.0f; + } + + ref_dct4_f32(&SS,(float32_t*)0,fSrc); + + for(i=0;iN;i++) + { + fSrc[i] = fSrc[i] * 2147483648.0f / (float32_t)S->N ; + fSrc[i] += (fSrc[i] > 0) ? 0.5f : -0.5f; + pInlineBuffer[i] = (q31_t)fSrc[i]; + } +} + +void ref_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer) +{ + arm_dct4_instance_f32 SS; + float32_t *fSrc = (float32_t*)pInlineBuffer; + uint32_t i; + + SS.N = S->N; + + for(i=0;iN;i++) + { + //read the q15 data, cast to float, scale down for float, place in temporary buffer + scratchArray[i] = (float32_t)pInlineBuffer[i] / 32768.0f; + } + + for(i=0;iN;i++) + { + //copy from temp buffer to final buffer + fSrc[i] = scratchArray[i]; + } + + ref_dct4_f32(&SS,(float32_t*)0,fSrc); + + for(i=0;iN;i++) + { + fSrc[i] = fSrc[i] * 32768.0f / (float32_t)S->N; + fSrc[i] += (fSrc[i] > 0) ? 0.5f : -0.5f; + pInlineBuffer[i] = (q15_t)fSrc[i]; + } +} diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/rfft.c b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/rfft.c new file mode 100644 index 0000000..79738f0 --- /dev/null +++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/TransformFunctions/rfft.c @@ -0,0 +1,302 @@ +#include "ref.h" +#include "arm_const_structs.h" + +void ref_rfft_f32( + arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst) +{ + uint32_t i; + + if (S->ifftFlagR) + { + for(i=0;ifftLenReal*2;i++) + { + pDst[i] = pSrc[i]; + } + } + else + { + for(i=0;ifftLenReal;i++) + { + pDst[2*i+0] = pSrc[i]; + pDst[2*i+1] = 0.0f; + } + } + + switch(S->fftLenReal) + { + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, pDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, pDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, pDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 8192: + ref_cfft_f32(&ref_cfft_sR_f32_len8192, pDst, S->ifftFlagR, S->bitReverseFlagR); + break; + } + + if (S->ifftFlagR) + { + //throw away the imaginary part which should be all zeros + for(i=0;ifftLenReal;i++) + { + pDst[i] = pDst[2*i]; + } + } +} + +void ref_rfft_fast_f32( + arm_rfft_fast_instance_f32 * S, + float32_t * p, float32_t * pOut, + uint8_t ifftFlag) +{ + uint32_t i,j; + + if (ifftFlag) + { + for(i=0;ifftLenRFFT;i++) + { + pOut[i] = p[i]; + } + //unpack first sample's complex part into middle sample's real part + pOut[S->fftLenRFFT] = pOut[1]; + pOut[S->fftLenRFFT+1] = 0; + pOut[1] = 0; + j=4; + for(i = S->fftLenRFFT / 2 + 1;i < S->fftLenRFFT;i++) + { + pOut[2*i+0] = p[2*i+0 - j]; + pOut[2*i+1] = -p[2*i+1 - j]; + j+=4; + } + } + else + { + for(i=0;ifftLenRFFT;i++) + { + pOut[2*i+0] = p[i]; + pOut[2*i+1] = 0.0f; + } + } + + switch(S->fftLenRFFT) + { + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, pOut, ifftFlag, 1); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, pOut, ifftFlag, 1); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, pOut, ifftFlag, 1); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, pOut, ifftFlag, 1); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, pOut, ifftFlag, 1); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, pOut, ifftFlag, 1); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, pOut, ifftFlag, 1); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, pOut, ifftFlag, 1); + break; + } + + if (ifftFlag) + { + //throw away the imaginary part which should be all zeros + for(i=0;ifftLenRFFT;i++) + { + pOut[i] = pOut[2*i]; + } + } + else + { + //pack last sample's real part into first sample's complex part + pOut[1] = pOut[S->fftLenRFFT]; + } +} + +void ref_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst) +{ + uint32_t i; + float32_t *fDst = (float32_t*)pDst; + + if (S->ifftFlagR) + { + for(i=0;ifftLenReal*2;i++) + { + fDst[i] = (float32_t)pSrc[i] / 2147483648.0f; + } + } + else + { + for(i=0;ifftLenReal;i++) + { + fDst[2*i+0] = (float32_t)pSrc[i] / 2147483648.0f; + fDst[2*i+1] = 0.0f; + } + } + + switch(S->fftLenReal) + { + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 8192: + ref_cfft_f32(&ref_cfft_sR_f32_len8192, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + } + + if (S->ifftFlagR) + { + //throw away the imaginary part which should be all zeros + for(i=0;ifftLenReal;i++) + { + //read the float data, scale up for q31, cast to q31 + pDst[i] = (q31_t)( fDst[2*i] * 2147483648.0f); + } + } + else + { + for(i=0;ifftLenReal;i++) + { + //read the float data, scale up for q31, cast to q31 + pDst[i] = (q31_t)( fDst[i] * 2147483648.0f / (float32_t)S->fftLenReal); + } + } +} + +void ref_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst) +{ + uint32_t i; + float32_t *fDst = (float32_t*)pDst; + + + if (S->ifftFlagR) + { + for(i=0;ifftLenReal*2;i++) + { + fDst[i] = (float32_t)pSrc[i] / 32768.0f; + } + } + else + { + for(i=0;ifftLenReal;i++) + { + //read the q15 data, cast to float, scale down for float + fDst[2*i+0] = (float32_t)pSrc[i] / 32768.0f; + fDst[2*i+1] = 0.0f; + } + } + + switch(S->fftLenReal) + { + case 32: + ref_cfft_f32(&arm_cfft_sR_f32_len32, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 64: + ref_cfft_f32(&arm_cfft_sR_f32_len64, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 128: + ref_cfft_f32(&arm_cfft_sR_f32_len128, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 256: + ref_cfft_f32(&arm_cfft_sR_f32_len256, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 512: + ref_cfft_f32(&arm_cfft_sR_f32_len512, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 1024: + ref_cfft_f32(&arm_cfft_sR_f32_len1024, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 2048: + ref_cfft_f32(&arm_cfft_sR_f32_len2048, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 4096: + ref_cfft_f32(&arm_cfft_sR_f32_len4096, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + + case 8192: + ref_cfft_f32(&ref_cfft_sR_f32_len8192, fDst, S->ifftFlagR, S->bitReverseFlagR); + break; + } + + if (S->ifftFlagR) + { + //throw away the imaginary part which should be all zeros + for(i=0;ifftLenReal;i++) + { + pDst[i] = (q15_t)( fDst[2*i] * 32768.0f); + } + } + else + { + for(i=0;ifftLenReal;i++) + { + pDst[i] = (q15_t)( fDst[i] * 32768.0f / (float32_t)S->fftLenReal); + } + } +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/Abstract.txt new file mode 100644 index 0000000..7ac021f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_class_marks_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/arm_class_marks_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/arm_class_marks_example_f32.c new file mode 100644 index 0000000..e6842de --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_class_marks_example/arm_class_marks_example_f32.c @@ -0,0 +1,211 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_class_marks_example_f32.c +* +* Description: Example code to calculate Minimum, Maximum +* Mean, std and variance of marks obtained in a class +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup ClassMarks Class Marks Example + * + * \par Description: + * \par + * Demonstrates the use the Maximum, Minimum, Mean, Standard Deviation, Variance + * and Matrix functions to calculate statistical values of marks obtained in a class. + * + * \note This example also demonstrates the usage of static initialization. + * + * \par Variables Description: + * \par + * \li \c testMarks_f32 points to the marks scored by 20 students in 4 subjects + * \li \c max_marks Maximum of all marks + * \li \c min_marks Minimum of all marks + * \li \c mean Mean of all marks + * \li \c var Variance of the marks + * \li \c std Standard deviation of the marks + * \li \c numStudents Total number of students in the class + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_mat_init_f32() + * - arm_mat_mult_f32() + * - arm_max_f32() + * - arm_min_f32() + * - arm_mean_f32() + * - arm_std_f32() + * - arm_var_f32() + * + * Refer + * \link arm_class_marks_example_f32.c \endlink + * + */ + + +/** \example arm_class_marks_example_f32.c + */ +#include "arm_math.h" + +#define USE_STATIC_INIT + + /* ---------------------------------------------------------------------- +** Global defines +** ------------------------------------------------------------------- */ + +#define TEST_LENGTH_SAMPLES (20*4) + +/* ---------------------------------------------------------------------- +** List of Marks scored by 20 students for 4 subjects +** ------------------------------------------------------------------- */ +const float32_t testMarks_f32[TEST_LENGTH_SAMPLES] = +{ + 42.000000, 37.000000, 81.000000, 28.000000, + 83.000000, 72.000000, 36.000000, 38.000000, + 32.000000, 51.000000, 63.000000, 64.000000, + 97.000000, 82.000000, 95.000000, 90.000000, + 66.000000, 51.000000, 54.000000, 42.000000, + 67.000000, 56.000000, 45.000000, 57.000000, + 67.000000, 69.000000, 35.000000, 52.000000, + 29.000000, 81.000000, 58.000000, 47.000000, + 38.000000, 76.000000, 100.000000, 29.000000, + 33.000000, 47.000000, 29.000000, 50.000000, + 34.000000, 41.000000, 61.000000, 46.000000, + 52.000000, 50.000000, 48.000000, 36.000000, + 47.000000, 55.000000, 44.000000, 40.000000, + 100.000000, 94.000000, 84.000000, 37.000000, + 32.000000, 71.000000, 47.000000, 77.000000, + 31.000000, 50.000000, 49.000000, 35.000000, + 63.000000, 67.000000, 40.000000, 31.000000, + 29.000000, 68.000000, 61.000000, 38.000000, + 31.000000, 28.000000, 28.000000, 76.000000, + 55.000000, 33.000000, 29.000000, 39.000000 +}; + + +/* ---------------------------------------------------------------------- +* Number of subjects X 1 +* ------------------------------------------------------------------- */ +const float32_t testUnity_f32[4] = +{ + 1.000, 1.000, 1.000, 1.000 +}; + + +/* ---------------------------------------------------------------------- +** f32 Output buffer +** ------------------------------------------------------------------- */ +static float32_t testOutput[TEST_LENGTH_SAMPLES]; + + +/* ------------------------------------------------------------------ +* Global defines +*------------------------------------------------------------------- */ +#define NUMSTUDENTS 20 +#define NUMSUBJECTS 4 + +/* ------------------------------------------------------------------ +* Global variables +*------------------------------------------------------------------- */ + + uint32_t numStudents = 20; + uint32_t numSubjects = 4; +float32_t max_marks, min_marks, mean, std, var; + uint32_t student_num; + +/* ---------------------------------------------------------------------------------- +* Main f32 test function. It returns maximum marks secured and student number +* ------------------------------------------------------------------------------- */ + +int32_t main() +{ + +#ifndef USE_STATIC_INIT + + arm_matrix_instance_f32 srcA; + arm_matrix_instance_f32 srcB; + arm_matrix_instance_f32 dstC; + + /* Input and output matrices initializations */ + arm_mat_init_f32(&srcA, numStudents, numSubjects, (float32_t *)testMarks_f32); + arm_mat_init_f32(&srcB, numSubjects, 1, (float32_t *)testUnity_f32); + arm_mat_init_f32(&dstC, numStudents, 1, testOutput); + +#else + + /* Static Initializations of Input and output matrix sizes and array */ + arm_matrix_instance_f32 srcA = {NUMSTUDENTS, NUMSUBJECTS, (float32_t *)testMarks_f32}; + arm_matrix_instance_f32 srcB = {NUMSUBJECTS, 1, (float32_t *)testUnity_f32}; + arm_matrix_instance_f32 dstC = {NUMSTUDENTS, 1, testOutput}; + +#endif + + + /* ---------------------------------------------------------------------- + *Call the Matrix multiplication process function + * ------------------------------------------------------------------- */ + arm_mat_mult_f32(&srcA, &srcB, &dstC); + + /* ---------------------------------------------------------------------- + ** Call the Max function to calculate max marks among numStudents + ** ------------------------------------------------------------------- */ + arm_max_f32(testOutput, numStudents, &max_marks, &student_num); + + /* ---------------------------------------------------------------------- + ** Call the Min function to calculate min marks among numStudents + ** ------------------------------------------------------------------- */ + arm_min_f32(testOutput, numStudents, &min_marks, &student_num); + + /* ---------------------------------------------------------------------- + ** Call the Mean function to calculate mean + ** ------------------------------------------------------------------- */ + arm_mean_f32(testOutput, numStudents, &mean); + + /* ---------------------------------------------------------------------- + ** Call the std function to calculate standard deviation + ** ------------------------------------------------------------------- */ + arm_std_f32(testOutput, numStudents, &std); + + /* ---------------------------------------------------------------------- + ** Call the var function to calculate variance + ** ------------------------------------------------------------------- */ + arm_var_f32(testOutput, numStudents, &var); + + while (1); /* main function does not return */ +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/Abstract.txt new file mode 100644 index 0000000..7ef79e2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_convolution_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/arm_convolution_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/arm_convolution_example_f32.c new file mode 100644 index 0000000..e4665fe --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/arm_convolution_example_f32.c @@ -0,0 +1,247 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_convolution_example_f32.c +* +* Description: Example code demonstrating Convolution of two input signals using fft. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup ConvolutionExample Convolution Example + * + * \par Description: + * \par + * Demonstrates the convolution theorem with the use of the Complex FFT, Complex-by-Complex + * Multiplication, and Support Functions. + * + * \par Algorithm: + * \par + * The convolution theorem states that convolution in the time domain corresponds to + * multiplication in the frequency domain. Therefore, the Fourier transform of the convoution of + * two signals is equal to the product of their individual Fourier transforms. + * The Fourier transform of a signal can be evaluated efficiently using the Fast Fourier Transform (FFT). + * \par + * Two input signals, a[n] and b[n], with lengths \c n1 and \c n2 respectively, + * are zero padded so that their lengths become \c N, which is greater than or equal to (n1+n2-1) + * and is a power of 4 as FFT implementation is radix-4. + * The convolution of a[n] and b[n] is obtained by taking the FFT of the input + * signals, multiplying the Fourier transforms of the two signals, and taking the inverse FFT of + * the multiplied result. + * \par + * This is denoted by the following equations: + *
 A[k] = FFT(a[n],N)
+ * B[k] = FFT(b[n],N)
+ * conv(a[n], b[n]) = IFFT(A[k] * B[k], N)
+ * where A[k] and B[k] are the N-point FFTs of the signals a[n] + * and b[n] respectively. + * The length of the convolved signal is (n1+n2-1). + * + * \par Block Diagram: + * \par + * \image html Convolution.gif + * + * \par Variables Description: + * \par + * \li \c testInputA_f32 points to the first input sequence + * \li \c srcALen length of the first input sequence + * \li \c testInputB_f32 points to the second input sequence + * \li \c srcBLen length of the second input sequence + * \li \c outLen length of convolution output sequence, (srcALen + srcBLen - 1) + * \li \c AxB points to the output array where the product of individual FFTs of inputs is stored. + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_fill_f32() + * - arm_copy_f32() + * - arm_cfft_radix4_init_f32() + * - arm_cfft_radix4_f32() + * - arm_cmplx_mult_cmplx_f32() + * + * Refer + * \link arm_convolution_example_f32.c \endlink + * + */ + + +/** \example arm_convolution_example_f32.c + */ + +#include "arm_math.h" +#include "math_helper.h" + +/* ---------------------------------------------------------------------- +* Defines each of the tests performed +* ------------------------------------------------------------------- */ +#define MAX_BLOCKSIZE 128 +#define DELTA (0.000001f) +#define SNR_THRESHOLD 90 + +/* ---------------------------------------------------------------------- +* Declare I/O buffers +* ------------------------------------------------------------------- */ +float32_t Ak[MAX_BLOCKSIZE]; /* Input A */ +float32_t Bk[MAX_BLOCKSIZE]; /* Input B */ +float32_t AxB[MAX_BLOCKSIZE * 2]; /* Output */ + +/* ---------------------------------------------------------------------- +* Test input data for Floating point Convolution example for 32-blockSize +* Generated by the MATLAB randn() function +* ------------------------------------------------------------------- */ +float32_t testInputA_f32[64] = +{ + -0.808920, 1.357369, 1.180861, -0.504544, 1.762637, -0.703285, + 1.696966, 0.620571, -0.151093, -0.100235, -0.872382, -0.403579, + -0.860749, -0.382648, -1.052338, 0.128113, -0.646269, 1.093377, + -2.209198, 0.471706, 0.408901, 1.266242, 0.598252, 1.176827, + -0.203421, 0.213596, -0.851964, -0.466958, 0.021841, -0.698938, + -0.604107, 0.461778, -0.318219, 0.942520, 0.577585, 0.417619, + 0.614665, 0.563679, -1.295073, -0.764437, 0.952194, -0.859222, + -0.618554, -2.268542, -1.210592, 1.655853, -2.627219, -0.994249, + -1.374704, 0.343799, 0.025619, 1.227481, -0.708031, 0.069355, + -1.845228, -1.570886, 1.010668, -1.802084, 1.630088, 1.286090, + -0.161050, -0.940794, 0.367961, 0.291907 + +}; + +float32_t testInputB_f32[64] = +{ + 0.933724, 0.046881, 1.316470, 0.438345, 0.332682, 2.094885, + 0.512081, 0.035546, 0.050894, -2.320371, 0.168711, -1.830493, + -0.444834, -1.003242, -0.531494, -1.365600, -0.155420, -0.757692, + -0.431880, -0.380021, 0.096243, -0.695835, 0.558850, -1.648962, + 0.020369, -0.363630, 0.887146, 0.845503, -0.252864, -0.330397, + 1.269131, -1.109295, -1.027876, 0.135940, 0.116721, -0.293399, + -1.349799, 0.166078, -0.802201, 0.369367, -0.964568, -2.266011, + 0.465178, 0.651222, -0.325426, 0.320245, -0.784178, -0.579456, + 0.093374, 0.604778, -0.048225, 0.376297, -0.394412, 0.578182, + -1.218141, -1.387326, 0.692462, -0.631297, 0.153137, -0.638952, + 0.635474, -0.970468, 1.334057, -0.111370 +}; + +const float testRefOutput_f32[127] = +{ + -0.818943, 1.229484, -0.533664, 1.016604, 0.341875, -1.963656, + 5.171476, 3.478033, 7.616361, 6.648384, 0.479069, 1.792012, + -1.295591, -7.447818, 0.315830, -10.657445, -2.483469, -6.524236, + -7.380591, -3.739005, -8.388957, 0.184147, -1.554888, 3.786508, + -1.684421, 5.400610, -1.578126, 7.403361, 8.315999, 2.080267, + 11.077776, 2.749673, 7.138962, 2.748762, 0.660363, 0.981552, + 1.442275, 0.552721, -2.576892, 4.703989, 0.989156, 8.759344, + -0.564825, -3.994680, 0.954710, -5.014144, 6.592329, 1.599488, + -13.979146, -0.391891, -4.453369, -2.311242, -2.948764, 1.761415, + -0.138322, 10.433007, -2.309103, 4.297153, 8.535523, 3.209462, + 8.695819, 5.569919, 2.514304, 5.582029, 2.060199, 0.642280, + 7.024616, 1.686615, -6.481756, 1.343084, -3.526451, 1.099073, + -2.965764, -0.173723, -4.111484, 6.528384, -6.965658, 1.726291, + 1.535172, 11.023435, 2.338401, -4.690188, 1.298210, 3.943885, + 8.407885, 5.168365, 0.684131, 1.559181, 1.859998, 2.852417, + 8.574070, -6.369078, 6.023458, 11.837963, -6.027632, 4.469678, + -6.799093, -2.674048, 6.250367, -6.809971, -3.459360, 9.112410, + -2.711621, -1.336678, 1.564249, -1.564297, -1.296760, 8.904013, + -3.230109, 6.878013, -7.819823, 3.369909, -1.657410, -2.007358, + -4.112825, 1.370685, -3.420525, -6.276605, 3.244873, -3.352638, + 1.545372, 0.902211, 0.197489, -1.408732, 0.523390, 0.348440, 0 +}; + + +/* ---------------------------------------------------------------------- +* Declare Global variables +* ------------------------------------------------------------------- */ +uint32_t srcALen = 64; /* Length of Input A */ +uint32_t srcBLen = 64; /* Length of Input B */ +uint32_t outLen; /* Length of convolution output */ +float32_t snr; /* output SNR */ + +int32_t main(void) +{ + arm_status status; /* Status of the example */ + arm_cfft_radix4_instance_f32 cfft_instance; /* CFFT Structure instance */ + + /* CFFT Structure instance pointer */ + arm_cfft_radix4_instance_f32 *cfft_instance_ptr = + (arm_cfft_radix4_instance_f32*) &cfft_instance; + + /* output length of convolution */ + outLen = srcALen + srcBLen - 1; + + /* Initialise the fft input buffers with all zeros */ + arm_fill_f32(0.0, Ak, MAX_BLOCKSIZE); + arm_fill_f32(0.0, Bk, MAX_BLOCKSIZE); + + /* Copy the input values to the fft input buffers */ + arm_copy_f32(testInputA_f32, Ak, MAX_BLOCKSIZE/2); + arm_copy_f32(testInputB_f32, Bk, MAX_BLOCKSIZE/2); + + /* Initialize the CFFT function to compute 64 point fft */ + status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 0, 1); + + /* Transform input a[n] from time domain to frequency domain A[k] */ + arm_cfft_radix4_f32(cfft_instance_ptr, Ak); + /* Transform input b[n] from time domain to frequency domain B[k] */ + arm_cfft_radix4_f32(cfft_instance_ptr, Bk); + + /* Complex Multiplication of the two input buffers in frequency domain */ + arm_cmplx_mult_cmplx_f32(Ak, Bk, AxB, MAX_BLOCKSIZE/2); + + /* Initialize the CIFFT function to compute 64 point ifft */ + status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 1, 1); + + /* Transform the multiplication output from frequency domain to time domain, + that gives the convolved output */ + arm_cfft_radix4_f32(cfft_instance_ptr, AxB); + + /* SNR Calculation */ + snr = arm_snr_f32((float32_t *)testRefOutput_f32, AxB, srcALen + srcBLen - 1); + + /* Compare the SNR with threshold to test whether the + computed output is matched with the reference output values. */ + if ( snr > SNR_THRESHOLD) + { + status = ARM_MATH_SUCCESS; + } + + if ( status != ARM_MATH_SUCCESS) + { + while (1); + } + + while (1); /* main function does not return */ +} + + /** \endlink */ diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/math_helper.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/math_helper.c new file mode 100644 index 0000000..f615e6f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/math_helper.c @@ -0,0 +1,466 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 b +* +* Project: CMSIS DSP Library +* +* Title: math_helper.c +* +* Description: Definition of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +* Include standard header files +* -------------------------------------------------------------------- */ +#include + +/* ---------------------------------------------------------------------- +* Include project header files +* -------------------------------------------------------------------- */ +#include "math_helper.h" + +/** + * @brief Caluclation of SNR + * @param[in] pRef Pointer to the reference buffer + * @param[in] pTest Pointer to the test buffer + * @param[in] buffSize total number of samples + * @return SNR + * The function Caluclates signal to noise ratio for the reference output + * and test output + */ + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) +{ + float EnergySignal = 0.0, EnergyError = 0.0; + uint32_t i; + float SNR; + int temp; + int *test; + + for (i = 0; i < buffSize; i++) + { + /* Checking for a NAN value in pRef array */ + test = (int *)(&pRef[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + /* Checking for a NAN value in pTest array */ + test = (int *)(&pTest[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + EnergySignal += pRef[i] * pRef[i]; + EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); + } + + /* Checking for a NAN value in EnergyError */ + test = (int *)(&EnergyError); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + + SNR = 10 * log10 (EnergySignal / EnergyError); + + return (SNR); + +} + + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Converts float to fixed in q12.20 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to outputbuffer + * @param[in] numSamples number of samples in the input buffer + * @return none + * The function converts floating point values to fixed point(q12.20) values + */ + +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1048576.0f corresponds to pow(2, 20) */ + pOut[i] = (q31_t) (pIn[i] * 1048576.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 1.0) + { + pOut[i] = 0x000FFFFF; + } + } +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q31 (q31_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q7 (q7_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + + + +/** + * @brief Caluclates number of guard bits + * @param[in] num_adds number of additions + * @return guard bits + * The function Caluclates the number of guard bits + * depending on the numtaps + */ + +uint32_t arm_calc_guard_bits (uint32_t num_adds) +{ + uint32_t i = 1, j = 0; + + if (num_adds == 1) + { + return (0); + } + + while (i < num_adds) + { + i = i * 2; + j++; + } + + return (j); +} + +/** + * @brief Apply guard bits to buffer + * @param[in,out] pIn pointer to input buffer + * @param[in] numSamples number of samples in the input buffer + * @param[in] guard_bits guard bits + * @return none + */ + +void arm_apply_guard_bits (float32_t *pIn, + uint32_t numSamples, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); + } +} + +/** + * @brief Calculates pow(2, numShifts) + * @param[in] numShifts number of shifts + * @return pow(2, numShifts) + */ +uint32_t arm_calc_2pow(uint32_t numShifts) +{ + + uint32_t i, val = 1; + + for (i = 0; i < numShifts; i++) + { + val = val * 2; + } + + return(val); +} + + + +/** + * @brief Converts float to fixed q14 + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q14 (float *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 16384.0f corresponds to pow(2, 14) */ + pOut[i] = (q15_t) (pIn[i] * 16384.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFF; + } + + } + +} + + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q30 (float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q29 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 536870912.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 4.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + + +/** + * @brief Converts float to fixed q28 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q28 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 268435456.0f corresponds to pow(2, 28) */ + pOut[i] = (q31_t) (pIn[i] * 268435456.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 8.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Clip the float values to +/- 1 + * @param[in,out] pIn input buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_clip_f32 (float *pIn, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + if (pIn[i] > 1.0f) + { + pIn[i] = 1.0; + } + else if ( pIn[i] < -1.0f) + { + pIn[i] = -1.0; + } + + } +} + + + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/math_helper.h b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/math_helper.h new file mode 100644 index 0000000..5a18734 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_convolution_example/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2013 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* +* Title: math_helper.h +* +* Description: Prototypes of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + + +#include "arm_math.h" + +#ifndef MATH_HELPER_H +#define MATH_HELPER_H + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); +void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); +void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_clip_f32(float *pIn, uint32_t numSamples); +uint32_t arm_calc_guard_bits(uint32_t num_adds); +void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); +uint32_t arm_calc_2pow(uint32_t guard_bits); +#endif + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/Abstract.txt new file mode 100644 index 0000000..f889251 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_dotproduct_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/arm_dotproduct_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/arm_dotproduct_example_f32.c new file mode 100644 index 0000000..5a05071 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_dotproduct_example/arm_dotproduct_example_f32.c @@ -0,0 +1,178 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_dotproduct_example_f32.c +* +* Description: Example code computing dot product of two vectors. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup DotproductExample Dot Product Example + * + * \par Description: + * \par + * Demonstrates the use of the Multiply and Add functions to perform the dot product. + * The dot product of two vectors is obtained by multiplying corresponding elements + * and summing the products. + + * \par Algorithm: + * \par + * The two input vectors \c A and \c B with length \c n, are multiplied element-by-element + * and then added to obtain dot product. + * \par + * This is denoted by the following equation: + *
  dotProduct = A[0] * B[0] + A[1] * B[1] + ... + A[n-1] * B[n-1]
+ * + * \par Block Diagram: + * \par + * \image html dotProduct.gif + * + * \par Variables Description: + * \par + * \li \c srcA_buf_f32 points to first input vector + * \li \c srcB_buf_f32 points to second input vector + * \li \c testOutput stores dot product of the two input vectors. + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_mult_f32() + * - arm_add_f32() + * + * Refer + * \link arm_dotproduct_example_f32.c \endlink + * + */ + + +/** \example arm_dotproduct_example_f32.c + */ + +#include +#include "arm_math.h" + +/* ---------------------------------------------------------------------- +* Defines each of the tests performed +* ------------------------------------------------------------------- */ +#define MAX_BLOCKSIZE 32 +#define DELTA (0.000001f) + +/* ---------------------------------------------------------------------- +* Test input data for Floating point Dot Product example for 32-blockSize +* Generated by the MATLAB randn() function +* ------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- +** Test input data of srcA for blockSize 32 +** ------------------------------------------------------------------- */ +float32_t srcA_buf_f32[MAX_BLOCKSIZE] = +{ + -0.4325648115282207, -1.6655843782380970, 0.1253323064748307, + 0.2876764203585489, -1.1464713506814637, 1.1909154656429988, + 1.1891642016521031, -0.0376332765933176, 0.3272923614086541, + 0.1746391428209245, -0.1867085776814394, 0.7257905482933027, + -0.5883165430141887, 2.1831858181971011, -0.1363958830865957, + 0.1139313135208096, 1.0667682113591888, 0.0592814605236053, + -0.0956484054836690, -0.8323494636500225, 0.2944108163926404, + -1.3361818579378040, 0.7143245518189522, 1.6235620644462707, + -0.6917757017022868, 0.8579966728282626, 1.2540014216025324, + -1.5937295764474768, -1.4409644319010200, 0.5711476236581780, + -0.3998855777153632, 0.6899973754643451 +}; + +/* ---------------------------------------------------------------------- +** Test input data of srcB for blockSize 32 +** ------------------------------------------------------------------- */ +float32_t srcB_buf_f32[MAX_BLOCKSIZE] = +{ + 1.7491401329284098, 0.1325982188803279, 0.3252281811989881, + -0.7938091410349637, 0.3149236145048914, -0.5272704888029532, + 0.9322666565031119, 1.1646643544607362, -2.0456694357357357, + -0.6443728590041911, 1.7410657940825480, 0.4867684246821860, + 1.0488288293660140, 1.4885752747099299, 1.2705014969484090, + -1.8561241921210170, 2.1343209047321410, 1.4358467535865909, + -0.9173023332875400, -1.1060770780029008, 0.8105708062681296, + 0.6985430696369063, -0.4015827425012831, 1.2687512030669628, + -0.7836083053674872, 0.2132664971465569, 0.7878984786088954, + 0.8966819356782295, -0.1869172943544062, 1.0131816724341454, + 0.2484350696132857, 0.0596083377937976 +}; + +/* Reference dot product output */ +float32_t refDotProdOut = 5.9273644806352142; + +/* ---------------------------------------------------------------------- +* Declare Global variables +* ------------------------------------------------------------------- */ +float32_t multOutput[MAX_BLOCKSIZE]; /* Intermediate output */ +float32_t testOutput; /* Final ouput */ + +arm_status status; /* Status of the example */ + +int32_t main(void) +{ + uint32_t i; /* Loop counter */ + float32_t diff; /* Difference between reference and test outputs */ + + /* Multiplication of two input buffers */ + arm_mult_f32(srcA_buf_f32, srcB_buf_f32, multOutput, MAX_BLOCKSIZE); + + /* Accumulate the multiplication output values to + get the dot product of the two inputs */ + for(i=0; i< MAX_BLOCKSIZE; i++) + { + arm_add_f32(&testOutput, &multOutput[i], &testOutput, 1); + } + + /* absolute value of difference between ref and test */ + diff = fabsf(refDotProdOut - testOutput); + + /* Comparison of dot product value with reference */ + if (diff > DELTA) + { + status = ARM_MATH_TEST_FAILURE; + } + + if ( status == ARM_MATH_TEST_FAILURE) + { + while (1); + } + + while (1); /* main function does not return */ +} + + /** \endlink */ diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/Abstract.txt new file mode 100644 index 0000000..37bea21 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_fft_bin_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/arm_fft_bin_data.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/arm_fft_bin_data.c new file mode 100644 index 0000000..10f3e12 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/arm_fft_bin_data.c @@ -0,0 +1,308 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_fft_bin_data.c +* +* Description: Data file used for example code +* +* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +#include "arm_math.h" + +/* ---------------------------------------------------------------------- +Test Input signal contains 10KHz signal + Uniformly distributed white noise +** ------------------------------------------------------------------- */ + +float32_t testInput_f32_10khz[2048] = +{ +-0.865129623056441, 0.000000000000000, -2.655020678073846, 0.000000000000000, 0.600664612949661, 0.000000000000000, 0.080378093886515, 0.000000000000000, +-2.899160484012034, 0.000000000000000, 2.563004262857762, 0.000000000000000, 3.078328403304206, 0.000000000000000, 0.105906778385130, 0.000000000000000, +0.048366940168201, 0.000000000000000, -0.145696461188734, 0.000000000000000, -0.023417155362879, 0.000000000000000, 2.127729174988954, 0.000000000000000, +-1.176633086028377, 0.000000000000000, 3.690223557991855, 0.000000000000000, -0.622791766173194, 0.000000000000000, 0.722837373872203, 0.000000000000000, +2.739754205367484, 0.000000000000000, -0.062610410524552, 0.000000000000000, -0.891296810967338, 0.000000000000000, -1.845872258871811, 0.000000000000000, +1.195039415434387, 0.000000000000000, -2.177388969045026, 0.000000000000000, 1.078649103637905, 0.000000000000000, 2.570976050490193, 0.000000000000000, +-1.383551403404574, 0.000000000000000, 2.392141424058873, 0.000000000000000, 2.858002843205065, 0.000000000000000, -3.682433899725536, 0.000000000000000, +-3.488146646451150, 0.000000000000000, 1.323468578888120, 0.000000000000000, -0.099771155430726, 0.000000000000000, 1.561168082500454, 0.000000000000000, +1.025026795103179, 0.000000000000000, 0.928841900171200, 0.000000000000000, 2.930499509864950, 0.000000000000000, 2.013349089766430, 0.000000000000000, +2.381676148486737, 0.000000000000000, -3.081062307950236, 0.000000000000000, -0.389579115537544, 0.000000000000000, 0.181540149166620, 0.000000000000000, +-2.601953341353208, 0.000000000000000, 0.333435137783218, 0.000000000000000, -2.812945856162965, 0.000000000000000, 2.649109640172910, 0.000000000000000, +-1.003963025744654, 0.000000000000000, 1.552460768755035, 0.000000000000000, 0.088641345335247, 0.000000000000000, -2.519951327113426, 0.000000000000000, +-4.341348988610527, 0.000000000000000, 0.557772429359965, 0.000000000000000, -1.671267412948494, 0.000000000000000, 0.733951350960387, 0.000000000000000, +0.409263788034864, 0.000000000000000, 3.566033071952806, 0.000000000000000, 1.882565173848352, 0.000000000000000, -1.106017073793287, 0.000000000000000, +0.154456720778718, 0.000000000000000, -2.513205795512153, 0.000000000000000, 0.310978660939421, 0.000000000000000, 0.579706500111723, 0.000000000000000, +0.000086383683251, 0.000000000000000, -1.311866980897721, 0.000000000000000, 1.840007477574986, 0.000000000000000, -3.253005768451345, 0.000000000000000, +1.462584328739432, 0.000000000000000, 1.610103610851738, 0.000000000000000, 0.761914676858907, 0.000000000000000, 0.974541361089834, 0.000000000000000, +0.686845845885983, 0.000000000000000, 1.849153122025191, 0.000000000000000, 0.787800410401453, 0.000000000000000, -1.187438909666279, 0.000000000000000, +-0.754937911044720, 0.000000000000000, 0.084373858395232, 0.000000000000000, -2.600269011710521, 0.000000000000000, -0.962982842142644, 0.000000000000000, +-0.369328108540868, 0.000000000000000, 0.810791418361879, 0.000000000000000, 3.587016488699641, 0.000000000000000, -0.520776145083723, 0.000000000000000, +0.640249919627884, 0.000000000000000, 1.103122489464969, 0.000000000000000, 2.231779881455556, 0.000000000000000, -1.308035392685241, 0.000000000000000, +0.424070304330106, 0.000000000000000, -0.200383932651189, 0.000000000000000, -2.365526783356541, 0.000000000000000, -0.989114757436628, 0.000000000000000, +2.770807688959777, 0.000000000000000, -0.444172737462307, 0.000000000000000, 0.079760979374078, 0.000000000000000, -0.005199118412183, 0.000000000000000, +-0.664712668309527, 0.000000000000000, -0.624171857561896, 0.000000000000000, 0.537306979007338, 0.000000000000000, -2.575955675497642, 0.000000000000000, +1.562363235756780, 0.000000000000000, 1.814069369848895, 0.000000000000000, -1.293428583392509, 0.000000000000000, -1.026188449495686, 0.000000000000000, +-2.981771815588717, 0.000000000000000, -4.223468103075124, 0.000000000000000, 2.672674782004045, 0.000000000000000, -0.856096801117735, 0.000000000000000, +0.048517345512563, 0.000000000000000, -0.026860721136222, 0.000000000000000, 0.392932277758187, 0.000000000000000, -1.331740855093099, 0.000000000000000, +-1.894292129477081, 0.000000000000000, -1.425006468460681, 0.000000000000000, -2.721772427617057, 0.000000000000000, -1.616831100216806, 0.000000000000000, +3.551177651488947, 0.000000000000000, -0.069685667896087, 0.000000000000000, -3.134634907409102, 0.000000000000000, -0.263627598944639, 0.000000000000000, +-1.650469945991350, 0.000000000000000, -2.203580339374399, 0.000000000000000, -0.872203246123242, 0.000000000000000, 1.230782812607287, 0.000000000000000, +0.257288860093291, 0.000000000000000, 1.989083106173137, 0.000000000000000, -1.985638729453261, 0.000000000000000, -1.416185105842892, 0.000000000000000, +-1.131097688325772, 0.000000000000000, -2.245130805416057, 0.000000000000000, -1.938873996219074, 0.000000000000000, 2.043608361562645, 0.000000000000000, +-0.583727989880841, 0.000000000000000, -1.785266378212929, 0.000000000000000, 1.961457586224753, 0.000000000000000, 1.139400099963223, 0.000000000000000, +-1.979519343363991, 0.000000000000000, 2.003023322818429, 0.000000000000000, 0.229004069076829, 0.000000000000000, 3.452808862193135, 0.000000000000000, +2.882273808365857, 0.000000000000000, -1.549450501844438, 0.000000000000000, -3.283872089931876, 0.000000000000000, -0.327025884099064, 0.000000000000000, +-0.054979977136430, 0.000000000000000, -1.192280531479012, 0.000000000000000, 0.645539328365578, 0.000000000000000, 2.300832863404618, 0.000000000000000, +-1.092951789535240, 0.000000000000000, -1.017368249363773, 0.000000000000000, -0.142673056169787, 0.000000000000000, 0.831073544881250, 0.000000000000000, +-2.314612531587064, 0.000000000000000, -2.221456299106321, 0.000000000000000, 0.460261143885226, 0.000000000000000, 0.050585301888595, 0.000000000000000, +0.364373329183988, 0.000000000000000, -1.685956552069538, 0.000000000000000, 0.050664512351055, 0.000000000000000, -0.193355783902718, 0.000000000000000, +-0.158660446046828, 0.000000000000000, 2.394156453841953, 0.000000000000000, -1.562965718554525, 0.000000000000000, -2.199750600869900, 0.000000000000000, +1.544984022381773, 0.000000000000000, -1.988307216807315, 0.000000000000000, -0.628240722541046, 0.000000000000000, -1.436235771505429, 0.000000000000000, +1.677013691147313, 0.000000000000000, 1.600741781678228, 0.000000000000000, -0.757380959134706, 0.000000000000000, -4.784797439515566, 0.000000000000000, +0.265121462834569, 0.000000000000000, 3.862029485934378, 0.000000000000000, 2.386823577249430, 0.000000000000000, -3.655779745436893, 0.000000000000000, +-0.763541621368016, 0.000000000000000, -1.182140388432962, 0.000000000000000, -1.349106114858063, 0.000000000000000, -2.287533624396759, 0.000000000000000, +-0.028603745188423, 0.000000000000000, -1.353580755934427, 0.000000000000000, 0.461602380352937, 0.000000000000000, -0.059599055078928, 0.000000000000000, +-0.929946734342228, 0.000000000000000, 0.065773089295561, 0.000000000000000, 1.106565863102982, 0.000000000000000, 4.719295086373593, 0.000000000000000, +-2.108377703544395, 0.000000000000000, -2.226393620240159, 0.000000000000000, 1.375668397437521, 0.000000000000000, -0.960772428525443, 0.000000000000000, +-2.156313465390571, 0.000000000000000, 1.126060012375311, 0.000000000000000, 2.756485137030720, 0.000000000000000, 0.739639690862600, 0.000000000000000, +3.914769510295006, 0.000000000000000, 1.685232785586675, 0.000000000000000, 4.079058040970612, 0.000000000000000, -1.174598301660513, 0.000000000000000, +-2.885776587275580, 0.000000000000000, -0.241073635188767, 0.000000000000000, 3.080489872502403, 0.000000000000000, -2.051244183999421, 0.000000000000000, +0.664330486845139, 0.000000000000000, -1.697798999370016, 0.000000000000000, 1.452369423649782, 0.000000000000000, -1.523532831019280, 0.000000000000000, +0.171981186587481, 0.000000000000000, -4.685274721583927, 0.000000000000000, -1.336175835319380, 0.000000000000000, 1.419070770428945, 0.000000000000000, +-0.035791601713475, 0.000000000000000, 2.291937971632081, 0.000000000000000, -1.962559313450293, 0.000000000000000, -4.831595589339301, 0.000000000000000, +-1.857055284000925, 0.000000000000000, 2.606271522635512, 0.000000000000000, -0.576447978738030, 0.000000000000000, 0.082299166967720, 0.000000000000000, +1.888399453494614, 0.000000000000000, -3.564705298046079, 0.000000000000000, -0.939357831083889, 0.000000000000000, -1.903578203697778, 0.000000000000000, +-2.642492215447250, 0.000000000000000, -0.182990405251017, 0.000000000000000, 3.742026478011174, 0.000000000000000, 0.104295803798333, 0.000000000000000, +1.848678195370347, 0.000000000000000, -1.887384346896369, 0.000000000000000, 0.365048973046045, 0.000000000000000, -0.889638010354219, 0.000000000000000, +1.173877118428863, 0.000000000000000, -1.178562827540109, 0.000000000000000, 0.610271645685184, 0.000000000000000, 1.831284815697871, 0.000000000000000, +0.449575390102283, 0.000000000000000, 1.597171905253443, 0.000000000000000, 3.918574971904773, 0.000000000000000, 0.868104027970404, 0.000000000000000, +0.582643134746494, 0.000000000000000, 2.321256382353331, 0.000000000000000, -0.238118642223180, 0.000000000000000, -2.890287868054370, 0.000000000000000, +0.970995414625622, 0.000000000000000, 0.666137930891283, 0.000000000000000, -0.202435718709502, 0.000000000000000, 2.057930200518194, 0.000000000000000, +3.120583443719949, 0.000000000000000, -0.863945271701041, 0.000000000000000, 0.906848893874630, 0.000000000000000, -1.434124930222570, 0.000000000000000, +0.754659384848783, 0.000000000000000, -5.224154442713778, 0.000000000000000, 2.330229744098967, 0.000000000000000, 1.113946320164698, 0.000000000000000, +0.523324920322840, 0.000000000000000, 1.750740911548348, 0.000000000000000, -0.899333972913577, 0.000000000000000, 0.228705845203506, 0.000000000000000, +-1.934782624767648, 0.000000000000000, -3.508386237231303, 0.000000000000000, -2.107108523073510, 0.000000000000000, 0.380587645474815, 0.000000000000000, +-0.476200877183279, 0.000000000000000, -2.172086712642198, 0.000000000000000, 1.795372535780299, 0.000000000000000, -2.100318983391055, 0.000000000000000, +-0.022571122461405, 0.000000000000000, 0.674514020010955, 0.000000000000000, -0.148872569390857, 0.000000000000000, 0.298175890592737, 0.000000000000000, +-1.134244492493590, 0.000000000000000, -3.146848422289455, 0.000000000000000, -1.357950199087602, 0.000000000000000, 0.667362732020878, 0.000000000000000, +-3.119397998316724, 0.000000000000000, -1.189341126297637, 0.000000000000000, -1.532744386856668, 0.000000000000000, -1.672972484202534, 0.000000000000000, +-2.042283373871558, 0.000000000000000, -1.479481547595924, 0.000000000000000, -0.002668662875396, 0.000000000000000, 0.262737760129546, 0.000000000000000, +2.734456080621830, 0.000000000000000, -0.671945925075102, 0.000000000000000, -3.735078262179111, 0.000000000000000, -0.161705013319883, 0.000000000000000, +0.748963512361001, 0.000000000000000, 1.128046374367600, 0.000000000000000, 0.649651335592966, 0.000000000000000, 1.880020215025867, 0.000000000000000, +-1.095632293842306, 0.000000000000000, 1.197764876160487, 0.000000000000000, 0.323646656252985, 0.000000000000000, -1.655502751114502, 0.000000000000000, +3.666399062961496, 0.000000000000000, -0.334060899735197, 0.000000000000000, -2.119056978738397, 0.000000000000000, 3.721375117275012, 0.000000000000000, +0.044874186872307, 0.000000000000000, -2.733053897593234, 0.000000000000000, 1.590700278891042, 0.000000000000000, 3.215711772781902, 0.000000000000000, +-1.792085012843801, 0.000000000000000, -0.405797188885475, 0.000000000000000, -0.628080020080892, 0.000000000000000, -1.831815840843960, 0.000000000000000, +2.973656862522834, 0.000000000000000, -0.212032655138417, 0.000000000000000, 0.372437389437234, 0.000000000000000, -1.614030579023492, 0.000000000000000, +-0.704900996358698, 0.000000000000000, 1.123700273452105, 0.000000000000000, -0.136371848130819, 0.000000000000000, 3.020284357635585, 0.000000000000000, +-0.550211350877649, 0.000000000000000, 5.101256236381711, 0.000000000000000, 3.367051512192333, 0.000000000000000, -4.385131946669234, 0.000000000000000, +-3.967303337694391, 0.000000000000000, -0.965894936640022, 0.000000000000000, 0.328366945264681, 0.000000000000000, 0.199041562924914, 0.000000000000000, +1.067681999025495, 0.000000000000000, -1.939516091697170, 0.000000000000000, -1.092980954328824, 0.000000000000000, 0.273786079368066, 0.000000000000000, +-0.040928322190265, 0.000000000000000, -0.118368078577437, 0.000000000000000, 1.766589628899997, 0.000000000000000, 1.738321311635393, 0.000000000000000, +-2.895012794321649, 0.000000000000000, 1.213521771395142, 0.000000000000000, 0.922971726633985, 0.000000000000000, 1.091516563636489, 0.000000000000000, +3.226378465469620, 0.000000000000000, 1.149169778666974, 0.000000000000000, -1.695986327709386, 0.000000000000000, -0.974803077355813, 0.000000000000000, +-4.898035507513607, 0.000000000000000, 1.622719302889447, 0.000000000000000, 0.583891313586579, 0.000000000000000, -1.677182424094957, 0.000000000000000, +-1.915633132814685, 0.000000000000000, -1.980150370851616, 0.000000000000000, 0.604538269404190, 0.000000000000000, 0.939862406149365, 0.000000000000000, +-1.266939874246416, 0.000000000000000, -1.494771249200063, 0.000000000000000, 0.278042784093988, 0.000000000000000, 0.326627416008916, 0.000000000000000, +-1.914530157643303, 0.000000000000000, 1.908947721862196, 0.000000000000000, 0.531819285694044, 0.000000000000000, 3.056856632319658, 0.000000000000000, +-0.389241827774643, 0.000000000000000, -2.418606606780420, 0.000000000000000, 0.915299238878703, 0.000000000000000, -0.098774174295283, 0.000000000000000, +-0.906199428444304, 0.000000000000000, 0.316716451217743, 0.000000000000000, -4.367700643578311, 0.000000000000000, 1.491687997515293, 0.000000000000000, +-1.962381126288365, 0.000000000000000, -0.700829196527045, 0.000000000000000, 3.028958963615630, 0.000000000000000, -2.313461067462598, 0.000000000000000, +-1.431933239886712, 0.000000000000000, -0.831153039725342, 0.000000000000000, 3.939495598250743, 0.000000000000000, 0.342974753984771, 0.000000000000000, +-2.768330763002974, 0.000000000000000, -2.744010370019008, 0.000000000000000, 3.821352685212561, 0.000000000000000, 4.551065271455856, 0.000000000000000, +3.270136437041298, 0.000000000000000, -3.188028411950982, 0.000000000000000, -0.777075012417436, 0.000000000000000, 0.097110650265216, 0.000000000000000, +1.221216137608812, 0.000000000000000, -1.325824244541822, 0.000000000000000, -2.655296734084113, 0.000000000000000, -1.074792144885704, 0.000000000000000, +2.770401584439407, 0.000000000000000, 5.240270645610543, 0.000000000000000, 0.108576672208892, 0.000000000000000, -1.209394350650142, 0.000000000000000, +1.403344353838785, 0.000000000000000, -0.299032904177277, 0.000000000000000, 4.074959450638227, 0.000000000000000, 1.718727473952107, 0.000000000000000, +-3.061349227080806, 0.000000000000000, -1.158596888541269, 0.000000000000000, 3.381858904662625, 0.000000000000000, 0.957339964054052, 0.000000000000000, +0.179900074904899, 0.000000000000000, -3.909641902506081, 0.000000000000000, 0.805717289408649, 0.000000000000000, 2.047413793928261, 0.000000000000000, +-1.273580225826614, 0.000000000000000, -2.681359186869971, 0.000000000000000, -0.721241345822093, 0.000000000000000, -1.613090681569475, 0.000000000000000, +0.463138804815955, 0.000000000000000, 0.377223507800954, 0.000000000000000, 2.046550684968141, 0.000000000000000, 0.178508732797712, 0.000000000000000, +-0.477815330358845, 0.000000000000000, 3.763355908332053, 0.000000000000000, 1.300430303035163, 0.000000000000000, -0.214625793857725, 0.000000000000000, +1.343267891864081, 0.000000000000000, -0.340007682433245, 0.000000000000000, 2.062703194680005, 0.000000000000000, 0.042032160234235, 0.000000000000000, +0.643732569732250, 0.000000000000000, -1.913502543857589, 0.000000000000000, 3.771340762937158, 0.000000000000000, 1.050024807363386, 0.000000000000000, +-4.440489488592649, 0.000000000000000, 0.444904302066643, 0.000000000000000, 2.898702265650048, 0.000000000000000, 1.953232980548558, 0.000000000000000, +2.761564952735079, 0.000000000000000, 1.963537633260397, 0.000000000000000, -2.168858472916215, 0.000000000000000, -4.116235357699841, 0.000000000000000, +4.183678271896528, 0.000000000000000, 0.600422284944681, 0.000000000000000, -0.659352647255126, 0.000000000000000, -0.993127338218109, 0.000000000000000, +-2.463571314945747, 0.000000000000000, 0.937720951545881, 0.000000000000000, -3.098957308429730, 0.000000000000000, -2.354719140045463, 0.000000000000000, +-0.417285119323949, 0.000000000000000, 2.187974075975947, 0.000000000000000, 1.101468905172585, 0.000000000000000, -3.185800678152109, 0.000000000000000, +2.357534709345083, 0.000000000000000, 0.246645606729407, 0.000000000000000, 4.440905650784504, 0.000000000000000, -2.236807716637866, 0.000000000000000, +-2.171481518317550, 0.000000000000000, -2.029571795072690, 0.000000000000000, 0.135599790431348, 0.000000000000000, -1.277965265520191, 0.000000000000000, +-1.927976233157507, 0.000000000000000, -5.434492783745394, 0.000000000000000, -2.026375829312657, 0.000000000000000, 1.009666016819321, 0.000000000000000, +0.238549782367247, 0.000000000000000, -0.516403923971309, 0.000000000000000, -0.933977817429352, 0.000000000000000, 0.155803015935614, 0.000000000000000, +-0.396194809997929, 0.000000000000000, -0.915178100253214, 0.000000000000000, 0.666329367985015, 0.000000000000000, -1.517991149945785, 0.000000000000000, +0.458266744144822, 0.000000000000000, -1.242845974381418, 0.000000000000000, 0.057914823556477, 0.000000000000000, 0.994101307476875, 0.000000000000000, +-2.387209849199325, 0.000000000000000, 0.459297048883826, 0.000000000000000, 0.227711405683905, 0.000000000000000, 0.030255073506117, 0.000000000000000, +-1.323361608181337, 0.000000000000000, -4.650244457426706, 0.000000000000000, 0.062908579526021, 0.000000000000000, 3.462831028244432, 0.000000000000000, +1.303608183314856, 0.000000000000000, -1.430415193881612, 0.000000000000000, -1.672886118942142, 0.000000000000000, 0.992890699210099, 0.000000000000000, +-0.160814531784247, 0.000000000000000, -1.238132939350430, 0.000000000000000, -0.589223271459376, 0.000000000000000, 2.326363810561534, 0.000000000000000, +-4.433789496230785, 0.000000000000000, 1.664686987538929, 0.000000000000000, -2.366128834617921, 0.000000000000000, 1.212421570743837, 0.000000000000000, +-4.847914267690055, 0.000000000000000, 0.228485221404712, 0.000000000000000, 0.466139765470957, 0.000000000000000, -1.344202776943546, 0.000000000000000, +-1.012053673330574, 0.000000000000000, -2.844980626424742, 0.000000000000000, -1.552703722026340, 0.000000000000000, -1.448830983885038, 0.000000000000000, +0.127010756753980, 0.000000000000000, -1.667188263752299, 0.000000000000000, 3.424818052085100, 0.000000000000000, 0.956291135453840, 0.000000000000000, +-3.725533331754662, 0.000000000000000, -1.584534272368832, 0.000000000000000, -1.654148210472472, 0.000000000000000, 0.701610500675698, 0.000000000000000, +0.164954538683927, 0.000000000000000, -0.739260064712987, 0.000000000000000, -2.167324026090101, 0.000000000000000, -0.310240491909496, 0.000000000000000, +-2.281790349106906, 0.000000000000000, 1.719655331305361, 0.000000000000000, -2.997005923606441, 0.000000000000000, -1.999301431556852, 0.000000000000000, +-0.292229010068828, 0.000000000000000, 1.172317994855851, 0.000000000000000, 0.196734885241533, 0.000000000000000, 2.981365193477068, 0.000000000000000, +2.637726016926352, 0.000000000000000, 1.434045125217982, 0.000000000000000, 0.883627180451827, 0.000000000000000, -1.434040761445747, 0.000000000000000, +-1.528891971086553, 0.000000000000000, -3.306913135367542, 0.000000000000000, -0.399059265470646, 0.000000000000000, -0.265674394285178, 0.000000000000000, +3.502591252855384, 0.000000000000000, 0.830301156604454, 0.000000000000000, -0.220021317046083, 0.000000000000000, -0.090553770476646, 0.000000000000000, +0.771863477047951, 0.000000000000000, 1.351209629105760, 0.000000000000000, 3.773699756201963, 0.000000000000000, 0.472600118752329, 0.000000000000000, +2.332825668012222, 0.000000000000000, 1.853747950314528, 0.000000000000000, 0.759515251766178, 0.000000000000000, 1.327112776215496, 0.000000000000000, +2.518730296237868, 0.000000000000000, 0.764450208786353, 0.000000000000000, -0.278275349491296, 0.000000000000000, -0.041559465082020, 0.000000000000000, +1.387166083167787, 0.000000000000000, 2.612996769598122, 0.000000000000000, -0.385404831721799, 0.000000000000000, 2.005630016170309, 0.000000000000000, +-0.950500047307998, 0.000000000000000, -1.166884021392492, 0.000000000000000, 1.432973552928162, 0.000000000000000, 2.540370505384567, 0.000000000000000, +-1.140505295054501, 0.000000000000000, -3.673358835201185, 0.000000000000000, -0.450691288038056, 0.000000000000000, 1.601024294408014, 0.000000000000000, +0.773213556014045, 0.000000000000000, 2.973873693246168, 0.000000000000000, -1.361548406382279, 0.000000000000000, 1.409136332424815, 0.000000000000000, +-0.963382518314713, 0.000000000000000, -2.031268227368161, 0.000000000000000, 0.983309972085586, 0.000000000000000, -3.461412488471631, 0.000000000000000, +-2.601124929406039, 0.000000000000000, -0.533896239766343, 0.000000000000000, -2.627129008866350, 0.000000000000000, 0.622111169161305, 0.000000000000000, +-1.160926365580422, 0.000000000000000, -2.406196188132628, 0.000000000000000, -1.076870362758737, 0.000000000000000, -1.791866820937175, 0.000000000000000, +-0.749453071522325, 0.000000000000000, -5.324156615990973, 0.000000000000000, -1.038698022238289, 0.000000000000000, -2.106629944730630, 0.000000000000000, +0.659295598564773, 0.000000000000000, 0.520940881580988, 0.000000000000000, -0.055649203928700, 0.000000000000000, 0.292096765423137, 0.000000000000000, +-4.663743901790872, 0.000000000000000, -0.125066503391666, 0.000000000000000, -2.452620252445380, 0.000000000000000, -0.712128227397468, 0.000000000000000, +-0.048938037970968, 0.000000000000000, -1.821520226003361, 0.000000000000000, 0.810106421304257, 0.000000000000000, -0.196636623956257, 0.000000000000000, +-0.701769836763804, 0.000000000000000, 2.460345045649201, 0.000000000000000, 3.506597671641116, 0.000000000000000, -2.711322611972225, 0.000000000000000, +-0.658079876600542, 0.000000000000000, -2.040082099646173, 0.000000000000000, 2.201668355395807, 0.000000000000000, 1.181507395879711, 0.000000000000000, +-1.640739552179682, 0.000000000000000, -1.613393726467190, 0.000000000000000, -1.156741241731352, 0.000000000000000, 2.527773464519963, 0.000000000000000, +-0.497040638009502, 0.000000000000000, -0.975817112895589, 0.000000000000000, -2.866830755546166, 0.000000000000000, 1.120214498507878, 0.000000000000000, +5.986771654661698, 0.000000000000000, 0.398219252656757, 0.000000000000000, -3.545606013198135, 0.000000000000000, 0.312398099396191, 0.000000000000000, +-2.265327979531788, 0.000000000000000, 0.792121001107366, 0.000000000000000, -3.736145137670100, 0.000000000000000, 0.762228883650802, 0.000000000000000, +2.283545661214646, 0.000000000000000, 3.780020629583529, 0.000000000000000, 3.117260228608810, 0.000000000000000, -2.011159255609613, 0.000000000000000, +0.279107700476072, 0.000000000000000, 2.003369134246936, 0.000000000000000, -1.448171234480257, 0.000000000000000, 0.584697150310140, 0.000000000000000, +0.919508663636197, 0.000000000000000, -3.071349141675388, 0.000000000000000, -1.555923649263667, 0.000000000000000, 2.232497079438850, 0.000000000000000, +-0.012662139119883, 0.000000000000000, 0.372825540734715, 0.000000000000000, 2.378543590847629, 0.000000000000000, 1.459053407813062, 0.000000000000000, +-0.967913907390927, 0.000000000000000, 1.322825200678212, 0.000000000000000, -1.033775820061824, 0.000000000000000, -1.813629552693142, 0.000000000000000, +4.794348161661486, 0.000000000000000, 0.655279811518676, 0.000000000000000, -2.224590138589720, 0.000000000000000, 0.595329481295766, 0.000000000000000, +3.364055988866225, 0.000000000000000, 1.863416422998127, 0.000000000000000, 1.930305751828105, 0.000000000000000, -0.284467053432545, 0.000000000000000, +-0.923374905878938, 0.000000000000000, 1.922988234041399, 0.000000000000000, 0.310482143432719, 0.000000000000000, 0.332122302397134, 0.000000000000000, +-1.659487472408966, 0.000000000000000, -1.865943507877961, 0.000000000000000, -0.186775297569864, 0.000000000000000, -1.700543850628361, 0.000000000000000, +0.497157959366735, 0.000000000000000, -0.471244843957418, 0.000000000000000, -0.432013753969948, 0.000000000000000, -4.000189880113231, 0.000000000000000, +-0.415335170016467, 0.000000000000000, 0.317311950972859, 0.000000000000000, 0.038393428927595, 0.000000000000000, 0.177219909465206, 0.000000000000000, +0.531650958095143, 0.000000000000000, -2.711644985175806, 0.000000000000000, 0.328744077805156, 0.000000000000000, -0.938417707547928, 0.000000000000000, +0.970379584897379, 0.000000000000000, 1.873649473917137, 0.000000000000000, 0.177938226987023, 0.000000000000000, 0.155609346302393, 0.000000000000000, +-1.276504241867208, 0.000000000000000, -0.463725075928807, 0.000000000000000, -0.064748250389500, 0.000000000000000, -1.725568534062385, 0.000000000000000, +-0.139066584804067, 0.000000000000000, 1.975514554117767, 0.000000000000000, -0.807063199499478, 0.000000000000000, -0.326926659682788, 0.000000000000000, +1.445727032487938, 0.000000000000000, -0.597151107739100, 0.000000000000000, 2.732557531709386, 0.000000000000000, -2.907130934109188, 0.000000000000000, +-1.461264832679981, 0.000000000000000, -1.708588604968163, 0.000000000000000, 3.652851925431363, 0.000000000000000, 0.682050868282879, 0.000000000000000, +-0.281312579963294, 0.000000000000000, 0.554966483307825, 0.000000000000000, -0.981341739340932, 0.000000000000000, 1.279543331141603, 0.000000000000000, +0.036589747826856, 0.000000000000000, 2.312073745896073, 0.000000000000000, 1.754682200732425, 0.000000000000000, -0.957515875428627, 0.000000000000000, +-0.833596942819695, 0.000000000000000, 0.437054368791033, 0.000000000000000, -0.898819399360279, 0.000000000000000, -0.296050580896839, 0.000000000000000, +-0.785144257649601, 0.000000000000000, -2.541503089003311, 0.000000000000000, 2.225075846758761, 0.000000000000000, -1.587290487902002, 0.000000000000000, +-1.421404172056462, 0.000000000000000, -3.015149802293631, 0.000000000000000, 1.780874288867949, 0.000000000000000, -0.865812740882613, 0.000000000000000, +-2.845327531197112, 0.000000000000000, 1.445225867774367, 0.000000000000000, 2.183733236584647, 0.000000000000000, 1.163371072749080, 0.000000000000000, +0.883547693520409, 0.000000000000000, -1.224093106684675, 0.000000000000000, -1.854501116331044, 0.000000000000000, 1.783082089255796, 0.000000000000000, +2.301508706196191, 0.000000000000000, -0.539901944139077, 0.000000000000000, 1.962315832319967, 0.000000000000000, -0.060709041870503, 0.000000000000000, +-1.353139923300238, 0.000000000000000, -1.482887537805234, 0.000000000000000, 1.273732601967176, 0.000000000000000, -3.456609915556321, 0.000000000000000, +-3.752320586540873, 0.000000000000000, 3.536356614978951, 0.000000000000000, 0.206035952043233, 0.000000000000000, 5.933966913773842, 0.000000000000000, +-0.486633898075490, 0.000000000000000, -0.329595089863342, 0.000000000000000, 1.496414153905337, 0.000000000000000, 0.137868749388880, 0.000000000000000, +-0.437192030996792, 0.000000000000000, 2.682750615210656, 0.000000000000000, -2.440234892848570, 0.000000000000000, 1.433910252426186, 0.000000000000000, +-0.415051506104074, 0.000000000000000, 1.982003013708649, 0.000000000000000, 1.345796609972435, 0.000000000000000, -2.335949513404370, 0.000000000000000, +1.065988867433025, 0.000000000000000, 2.741844905000464, 0.000000000000000, -1.754047930934362, 0.000000000000000, 0.229252730015575, 0.000000000000000, +-0.679791016408669, 0.000000000000000, -2.274097820043743, 0.000000000000000, 0.149802252231876, 0.000000000000000, -0.139697151364830, 0.000000000000000, +-2.773367420505435, 0.000000000000000, -4.403400246165611, 0.000000000000000, -1.468974515184135, 0.000000000000000, 0.664990623095844, 0.000000000000000, +-3.446979775557143, 0.000000000000000, 1.850006428987618, 0.000000000000000, -1.550866747921936, 0.000000000000000, -3.632874882935257, 0.000000000000000, +0.828039662992464, 0.000000000000000, 2.794055182632816, 0.000000000000000, -0.593995716682633, 0.000000000000000, 0.142788156054200, 0.000000000000000, +0.552461945119668, 0.000000000000000, 0.842127129738758, 0.000000000000000, 1.414335509600077, 0.000000000000000, -0.311559241382430, 0.000000000000000, +1.510590844695250, 0.000000000000000, 1.692217183824300, 0.000000000000000, 0.613760285711957, 0.000000000000000, 0.065233463207770, 0.000000000000000, +-2.571912893711505, 0.000000000000000, -1.707001531141341, 0.000000000000000, 0.673884968382041, 0.000000000000000, 0.889863883420103, 0.000000000000000, +-2.395635435233346, 0.000000000000000, 1.129247296359819, 0.000000000000000, 0.569074704779735, 0.000000000000000, 6.139436017480722, 0.000000000000000, +0.822158309259017, 0.000000000000000, -3.289872016222589, 0.000000000000000, 0.417612988384414, 0.000000000000000, 1.493982103868165, 0.000000000000000, +-0.415353391377005, 0.000000000000000, 0.288670764933155, 0.000000000000000, -1.895650228872272, 0.000000000000000, -0.139631694475020, 0.000000000000000, +1.445103299005436, 0.000000000000000, 2.877182243683429, 0.000000000000000, 1.192428490172580, 0.000000000000000, -5.964591921763842, 0.000000000000000, +0.570859795882959, 0.000000000000000, 2.328333316356666, 0.000000000000000, 0.333755014930026, 0.000000000000000, 1.221901577771909, 0.000000000000000, +0.943358697415568, 0.000000000000000, 2.793063983613067, 0.000000000000000, 3.163005066073616, 0.000000000000000, 2.098300664513867, 0.000000000000000, +-3.915313164333447, 0.000000000000000, -2.475766769064539, 0.000000000000000, 1.720472044894277, 0.000000000000000, -1.273591949275665, 0.000000000000000, +-1.213451272938616, 0.000000000000000, 0.697439404325690, 0.000000000000000, -0.309902287574293, 0.000000000000000, 2.622575852162781, 0.000000000000000, +-2.075881936219060, 0.000000000000000, 0.777847545691770, 0.000000000000000, -3.967947986440650, 0.000000000000000, -3.066503371806472, 0.000000000000000, +1.193780625937845, 0.000000000000000, 0.214246579281311, 0.000000000000000, -2.610681491162162, 0.000000000000000, -1.261224183972745, 0.000000000000000, +-1.165071748544285, 0.000000000000000, -1.116548474834374, 0.000000000000000, 0.847202164846982, 0.000000000000000, -3.474301529532390, 0.000000000000000, +0.020799541946476, 0.000000000000000, -3.868995473288166, 0.000000000000000, 1.757979409638067, 0.000000000000000, 0.868115130183109, 0.000000000000000, +0.910167436737958, 0.000000000000000, -1.878855115563720, 0.000000000000000, 1.710357104174161, 0.000000000000000, -1.468933980990902, 0.000000000000000, +1.799544171601169, 0.000000000000000, -4.922332880027887, 0.000000000000000, 0.219424548939720, 0.000000000000000, -0.971671113451924, 0.000000000000000, +-0.940533475616266, 0.000000000000000, 0.122510114412152, 0.000000000000000, -1.373686254916911, 0.000000000000000, 1.760348103896323, 0.000000000000000, +0.391745067829643, 0.000000000000000, 2.521958505327354, 0.000000000000000, -1.300693516405092, 0.000000000000000, -0.538251788309178, 0.000000000000000, +0.797184135810173, 0.000000000000000, 2.908800548982588, 0.000000000000000, 1.590902251655215, 0.000000000000000, -1.070323714487264, 0.000000000000000, +-3.349764443340999, 0.000000000000000, -1.190563529731447, 0.000000000000000, 1.363369471291963, 0.000000000000000, -1.814270299924576, 0.000000000000000, +-0.023381588315711, 0.000000000000000, 1.719182048679569, 0.000000000000000, 0.839917213252626, 0.000000000000000, 1.006099633839122, 0.000000000000000, +0.812462674381527, 0.000000000000000, 1.755814336346739, 0.000000000000000, 2.546848681206319, 0.000000000000000, -1.555300208869455, 0.000000000000000, +1.017053811631167, 0.000000000000000, 0.996591039170903, 0.000000000000000, -1.228047247924881, 0.000000000000000, 4.809462271463009, 0.000000000000000, +2.318113116151685, 0.000000000000000, -1.206932520679733, 0.000000000000000, 1.273757685623312, 0.000000000000000, 0.724335352481802, 0.000000000000000, +1.519876652073198, 0.000000000000000, -2.749670314714158, 0.000000000000000, 3.424042481847581, 0.000000000000000, -3.714668360421517, 0.000000000000000, +1.612834197004014, 0.000000000000000, -2.038234723985566, 0.000000000000000, 1.470938786562152, 0.000000000000000, 2.111634918450302, 0.000000000000000, +1.030376670151787, 0.000000000000000, -0.420877189003829, 0.000000000000000, -1.502024800532894, 0.000000000000000, 0.452310749163804, 0.000000000000000, +-1.606059382300987, 0.000000000000000, -4.006159967834147, 0.000000000000000, -2.152801208196508, 0.000000000000000, 1.671674089372579, 0.000000000000000, +1.714536333564101, 0.000000000000000, -1.011518543005344, 0.000000000000000, -0.576410282180584, 0.000000000000000, 0.733689809480836, 0.000000000000000, +1.004245602717974, 0.000000000000000, 1.010090391888449, 0.000000000000000, 3.811459513385621, 0.000000000000000, -5.230621089271954, 0.000000000000000, +0.678044861034399, 0.000000000000000, 1.255935859598107, 0.000000000000000, 1.674521701615288, 0.000000000000000, -1.656695216761705, 0.000000000000000, +1.169286028869693, 0.000000000000000, 0.524915416191998, 0.000000000000000, 2.397642885039520, 0.000000000000000, 2.108711400616072, 0.000000000000000, +2.037618211018084, 0.000000000000000, -0.623664553406925, 0.000000000000000, 2.984106170984409, 0.000000000000000, 1.132182737400932, 0.000000000000000, +-2.859274340352130, 0.000000000000000, -0.975550071398723, 0.000000000000000, -1.359935119997407, 0.000000000000000, -2.963308211050121, 0.000000000000000, +-0.228726662781163, 0.000000000000000, -1.411110379682043, 0.000000000000000, 0.741553355734225, 0.000000000000000, 0.497554254758309, 0.000000000000000, +2.371907950598855, 0.000000000000000, 1.063465168988748, 0.000000000000000, -0.641082692081488, 0.000000000000000, -0.855439878540726, 0.000000000000000, +0.578321738578726, 0.000000000000000, 3.005809768796194, 0.000000000000000, 1.961458699064065, 0.000000000000000, -3.206261663772745, 0.000000000000000, +-0.364431989095434, 0.000000000000000, -0.263182496622273, 0.000000000000000, 1.843464680631139, 0.000000000000000, -0.419107530229249, 0.000000000000000, +1.662335873298487, 0.000000000000000, -0.853687563304005, 0.000000000000000, -2.584133404357169, 0.000000000000000, 3.466839568922895, 0.000000000000000, +0.881671345091973, 0.000000000000000, 0.454620014206908, 0.000000000000000, -1.737245187402739, 0.000000000000000, 2.162713238369243, 0.000000000000000, +-3.868539002714486, 0.000000000000000, 2.014114855933826, 0.000000000000000, -0.703233831811006, 0.000000000000000, -3.410319935997574, 0.000000000000000, +-1.851235811006584, 0.000000000000000, 0.909783907894036, 0.000000000000000, 0.091884002136728, 0.000000000000000, -2.688294201131650, 0.000000000000000, +-0.906134178460955, 0.000000000000000, 3.475054609035133, 0.000000000000000, -0.573927964170323, 0.000000000000000, -0.429542937515399, 0.000000000000000, +0.991348618739939, 0.000000000000000, 1.974804904926325, 0.000000000000000, 0.975783450796698, 0.000000000000000, -3.057119549071503, 0.000000000000000, +-3.899429237481194, 0.000000000000000, 0.362439009175350, 0.000000000000000, -1.124461670265618, 0.000000000000000, 1.806000360163583, 0.000000000000000, +-2.768333362600288, 0.000000000000000, 0.244387897900379, 0.000000000000000, 0.908767296720926, 0.000000000000000, 1.254669374391882, 0.000000000000000, +-1.420441929463686, 0.000000000000000, -0.875658895966293, 0.000000000000000, 0.183824603376167, 0.000000000000000, -3.361653917011686, 0.000000000000000, +-0.796615630227952, 0.000000000000000, -1.660226542658673, 0.000000000000000, 1.654439358307226, 0.000000000000000, 2.782812946709771, 0.000000000000000, +1.418064412811531, 0.000000000000000, -0.819645647243761, 0.000000000000000, 0.807724772592699, 0.000000000000000, -0.941967976379298, 0.000000000000000, +-2.312768306047469, 0.000000000000000, 0.872426936477443, 0.000000000000000, 0.919528961530845, 0.000000000000000, -2.084904575264847, 0.000000000000000, +-1.972464868459322, 0.000000000000000, -1.050687203338466, 0.000000000000000, 1.659579707007902, 0.000000000000000, -1.820640014705855, 0.000000000000000, +-1.195078061671045, 0.000000000000000, -1.639773173762048, 0.000000000000000, 1.616744338157063, 0.000000000000000, 4.019216096811563, 0.000000000000000, +3.461021102549681, 0.000000000000000, 1.642352734361484, 0.000000000000000, -0.046354693720813, 0.000000000000000, -0.041936252359677, 0.000000000000000, +-2.393307519480551, 0.000000000000000, -0.341471634615121, 0.000000000000000, -0.392073595257017, 0.000000000000000, -0.219299018372730, 0.000000000000000, +-2.016391579662071, 0.000000000000000, -0.653096251969787, 0.000000000000000, 1.466353155666821, 0.000000000000000, -2.872058864320412, 0.000000000000000, +-2.157180779503830, 0.000000000000000, 0.723257479841560, 0.000000000000000, 3.769951308104384, 0.000000000000000, -1.923392042420024, 0.000000000000000, +0.644899359942840, 0.000000000000000, -2.090226891621437, 0.000000000000000, -0.277043982890403, 0.000000000000000, -0.528271428321112, 0.000000000000000, +2.518120645960652, 0.000000000000000, 1.040820431111488, 0.000000000000000, -4.560583754742486, 0.000000000000000, -0.226899614918836, 0.000000000000000, +1.713331231108959, 0.000000000000000, -3.293941019163642, 0.000000000000000, -1.113331444648290, 0.000000000000000, -1.032308423149906, 0.000000000000000, +1.593774272982443, 0.000000000000000, -1.246840475090529, 0.000000000000000, -0.190344684920137, 0.000000000000000, -1.719386356896355, 0.000000000000000, +-2.827721754659679, 0.000000000000000, -0.092438285279020, 0.000000000000000, -0.565844430675246, 0.000000000000000, -1.077916121691716, 0.000000000000000, +-1.208665809504693, 0.000000000000000, -2.996014266381254, 0.000000000000000, 2.888573323402423, 0.000000000000000, 2.829507048720695, 0.000000000000000, +-0.859177034120755, 0.000000000000000, -1.969302377743254, 0.000000000000000, 0.777437674525362, 0.000000000000000, -0.124910190157646, 0.000000000000000, +0.129875493115290, 0.000000000000000, -4.192139262163992, 0.000000000000000, 3.023496047962126, 0.000000000000000, 1.149775163736637, 0.000000000000000, +2.038151304801731, 0.000000000000000, 3.016122489841263, 0.000000000000000, -4.829481812137012, 0.000000000000000, -1.668436615909279, 0.000000000000000, +0.958586784636918, 0.000000000000000, 1.550652410058678, 0.000000000000000, -1.456305257976716, 0.000000000000000, -0.079588392344731, 0.000000000000000, +-2.453213599392345, 0.000000000000000, 0.296795909127105, 0.000000000000000, -0.253426616607643, 0.000000000000000, 1.418937160028195, 0.000000000000000, +-1.672949529066915, 0.000000000000000, -1.620990298572947, 0.000000000000000, -1.085103073196045, 0.000000000000000, 0.738606361195386, 0.000000000000000, +-2.097831202853255, 0.000000000000000, 2.711952282071310, 0.000000000000000, 1.498539238246888, 0.000000000000000, 1.317457282535915, 0.000000000000000, +-0.302765938349717, 0.000000000000000, -0.044623707947201, 0.000000000000000, 2.337405215062395, 0.000000000000000, -3.980689173859100, 0.000000000000000, + + +}; + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/arm_fft_bin_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/arm_fft_bin_example_f32.c new file mode 100644 index 0000000..91d15b5 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fft_bin_example/arm_fft_bin_example_f32.c @@ -0,0 +1,158 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_fft_bin_example_f32.c +* +* Description: Example code demonstrating calculation of Max energy bin of +* frequency domain of input signal. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup FrequencyBin Frequency Bin Example + * + * \par Description + * \par + * Demonstrates the calculation of the maximum energy bin in the frequency + * domain of the input signal with the use of Complex FFT, Complex + * Magnitude, and Maximum functions. + * + * \par Algorithm: + * \par + * The input test signal contains a 10 kHz signal with uniformly distributed white noise. + * Calculating the FFT of the input signal will give us the maximum energy of the + * bin corresponding to the input frequency of 10 kHz. + * + * \par Block Diagram: + * \image html FFTBin.gif "Block Diagram" + * \par + * The figure below shows the time domain signal of 10 kHz signal with + * uniformly distributed white noise, and the next figure shows the input + * in the frequency domain. The bin with maximum energy corresponds to 10 kHz signal. + * \par + * \image html FFTBinInput.gif "Input signal in Time domain" + * \image html FFTBinOutput.gif "Input signal in Frequency domain" + * + * \par Variables Description: + * \par + * \li \c testInput_f32_10khz points to the input data + * \li \c testOutput points to the output data + * \li \c fftSize length of FFT + * \li \c ifftFlag flag for the selection of CFFT/CIFFT + * \li \c doBitReverse Flag for selection of normal order or bit reversed order + * \li \c refIndex reference index value at which maximum energy of bin ocuurs + * \li \c testIndex calculated index value at which maximum energy of bin ocuurs + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_cfft_f32() + * - arm_cmplx_mag_f32() + * - arm_max_f32() + * + * Refer + * \link arm_fft_bin_example_f32.c \endlink + * + */ + + +/** \example arm_fft_bin_example_f32.c + */ + + +#include "arm_math.h" +#include "arm_const_structs.h" + +#define TEST_LENGTH_SAMPLES 2048 + +/* ------------------------------------------------------------------- +* External Input and Output buffer Declarations for FFT Bin Example +* ------------------------------------------------------------------- */ +extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES]; +static float32_t testOutput[TEST_LENGTH_SAMPLES/2]; + +/* ------------------------------------------------------------------ +* Global variables for FFT Bin Example +* ------------------------------------------------------------------- */ +uint32_t fftSize = 1024; +uint32_t ifftFlag = 0; +uint32_t doBitReverse = 1; + +/* Reference index at which max energy of bin ocuurs */ +uint32_t refIndex = 213, testIndex = 0; + +/* ---------------------------------------------------------------------- +* Max magnitude FFT Bin test +* ------------------------------------------------------------------- */ + +int32_t main(void) +{ + + arm_status status; + float32_t maxValue; + + status = ARM_MATH_SUCCESS; + + /* Process the data through the CFFT/CIFFT module */ + arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse); + + /* Process the data through the Complex Magnitude Module for + calculating the magnitude at each bin */ + arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize); + + /* Calculates maxValue and returns corresponding BIN value */ + arm_max_f32(testOutput, fftSize, &maxValue, &testIndex); + + if (testIndex != refIndex) + { + status = ARM_MATH_TEST_FAILURE; + } + + /* ---------------------------------------------------------------------- + ** Loop here if the signals fail the PASS check. + ** This denotes a test failure + ** ------------------------------------------------------------------- */ + + if ( status != ARM_MATH_SUCCESS) + { + while (1); + } + + while (1); /* main function does not return */ +} + + /** \endlink */ diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/Abstract.txt new file mode 100644 index 0000000..9189b7c --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_fir_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/arm_fir_data.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/arm_fir_data.c new file mode 100644 index 0000000..3a95fc5 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/arm_fir_data.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_fir_data.c +* +* Description: Data file used for example code +* +* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +#include "arm_math.h" + +/* ---------------------------------------------------------------------- +** Test input signal contains 1000Hz + 15000 Hz +** ------------------------------------------------------------------- */ + +float32_t testInput_f32_1kHz_15kHz[320] = +{ ++0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, ++0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, ++0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, +-0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, +-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, +-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, ++0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, ++0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, ++0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, ++0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, +-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, +-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, ++0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, ++0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, ++0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, ++0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, +-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, +-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, +-0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, ++0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, ++0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, +-0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, +-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, +-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, ++0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, ++0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, ++0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, ++0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, +-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, +-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, +-0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, ++0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, ++0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, ++0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, +-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, +-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, +-0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, ++0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, ++0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, ++0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, +}; + +float32_t refOutput[320] = +{ ++0.0000000000f, -0.0010797829f, -0.0007681386f, -0.0001982932f, +0.0000644313f, +0.0020854271f, +0.0036891871f, +0.0015855941f, +-0.0026280805f, -0.0075907658f, -0.0119390538f, -0.0086665968f, +0.0088981202f, +0.0430539279f, +0.0974468742f, +0.1740405600f, ++0.2681416601f, +0.3747720089f, +0.4893362230f, +0.6024154672f, +0.7058740791f, +0.7968348987f, +0.8715901940f, +0.9277881093f, ++0.9682182661f, +0.9934674267f, +1.0012052245f, +0.9925859371f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, ++0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, -0.0000000000f, -0.1309866321f, +-0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, +-0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, +-0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, ++0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, ++0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, ++0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, -0.0000000000f, -0.1309866321f, +-0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, +-0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, +-0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, ++0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, ++0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, ++0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, -0.0000000000f, -0.1309866321f, +-0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, +-0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, +-0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, ++0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, ++0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, ++0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, +0.0000000000f, -0.1309866321f, +-0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, +-0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, +-0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, ++0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, ++0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, ++0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, +0.0000000000f, -0.1309866321f, +-0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, +-0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, +-0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, -0.0000000000f, +0.1309866321f, ++0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, ++0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, ++0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, +0.0000000000f, -0.1309866321f, +-0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, +-0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, +-0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, ++0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, ++0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f +}; + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/arm_fir_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/arm_fir_example_f32.c new file mode 100644 index 0000000..3dd9f5a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/arm_fir_example_f32.c @@ -0,0 +1,233 @@ +/* ---------------------------------------------------------------------- + * Copyright (C) 2010-2012 ARM Limited. All rights reserved. + * +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library + * Title: arm_fir_example_f32.c + * + * Description: Example code demonstrating how an FIR filter can be used + * as a low pass filter. + * + * Target Processor: Cortex-M4/Cortex-M3 + * +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup FIRLPF FIR Lowpass Filter Example + * + * \par Description: + * \par + * Removes high frequency signal components from the input using an FIR lowpass filter. + * The example demonstrates how to configure an FIR filter and then pass data through + * it in a block-by-block fashion. + * \image html FIRLPF_signalflow.gif + * + * \par Algorithm: + * \par + * The input signal is a sum of two sine waves: 1 kHz and 15 kHz. + * This is processed by an FIR lowpass filter with cutoff frequency 6 kHz. + * The lowpass filter eliminates the 15 kHz signal leaving only the 1 kHz sine wave at the output. + * \par + * The lowpass filter was designed using MATLAB with a sample rate of 48 kHz and + * a length of 29 points. + * The MATLAB code to generate the filter coefficients is shown below: + *
+ *     h = fir1(28, 6/24);
+ * 
+ * The first argument is the "order" of the filter and is always one less than the desired length. + * The second argument is the normalized cutoff frequency. This is in the range 0 (DC) to 1.0 (Nyquist). + * A 6 kHz cutoff with a Nyquist frequency of 24 kHz lies at a normalized frequency of 6/24 = 0.25. + * The CMSIS FIR filter function requires the coefficients to be in time reversed order. + *
+ *     fliplr(h)
+ * 
+ * The resulting filter coefficients and are shown below. + * Note that the filter is symmetric (a property of linear phase FIR filters) + * and the point of symmetry is sample 14. Thus the filter will have a delay of + * 14 samples for all frequencies. + * \par + * \image html FIRLPF_coeffs.gif + * \par + * The frequency response of the filter is shown next. + * The passband gain of the filter is 1.0 and it reaches 0.5 at the cutoff frequency 6 kHz. + * \par + * \image html FIRLPF_response.gif + * \par + * The input signal is shown below. + * The left hand side shows the signal in the time domain while the right hand side is a frequency domain representation. + * The two sine wave components can be clearly seen. + * \par + * \image html FIRLPF_input.gif + * \par + * The output of the filter is shown below. The 15 kHz component has been eliminated. + * \par + * \image html FIRLPF_output.gif + * + * \par Variables Description: + * \par + * \li \c testInput_f32_1kHz_15kHz points to the input data + * \li \c refOutput points to the reference output data + * \li \c testOutput points to the test output data + * \li \c firStateF32 points to state buffer + * \li \c firCoeffs32 points to coefficient buffer + * \li \c blockSize number of samples processed at a time + * \li \c numBlocks number of frames + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_fir_init_f32() + * - arm_fir_f32() + * + * Refer + * \link arm_fir_example_f32.c \endlink + * + */ + + +/** \example arm_fir_example_f32.c + */ + +/* ---------------------------------------------------------------------- +** Include Files +** ------------------------------------------------------------------- */ + +#include "arm_math.h" +#include "math_helper.h" + +/* ---------------------------------------------------------------------- +** Macro Defines +** ------------------------------------------------------------------- */ + +#define TEST_LENGTH_SAMPLES 320 +#define SNR_THRESHOLD_F32 140.0f +#define BLOCK_SIZE 32 +#define NUM_TAPS 29 + +/* ------------------------------------------------------------------- + * The input signal and reference output (computed with MATLAB) + * are defined externally in arm_fir_lpf_data.c. + * ------------------------------------------------------------------- */ + +extern float32_t testInput_f32_1kHz_15kHz[TEST_LENGTH_SAMPLES]; +extern float32_t refOutput[TEST_LENGTH_SAMPLES]; + +/* ------------------------------------------------------------------- + * Declare Test output buffer + * ------------------------------------------------------------------- */ + +static float32_t testOutput[TEST_LENGTH_SAMPLES]; + +/* ------------------------------------------------------------------- + * Declare State buffer of size (numTaps + blockSize - 1) + * ------------------------------------------------------------------- */ + +static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; + +/* ---------------------------------------------------------------------- +** FIR Coefficients buffer generated using fir1() MATLAB function. +** fir1(28, 6/24) +** ------------------------------------------------------------------- */ + +const float32_t firCoeffs32[NUM_TAPS] = { + -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, +0.0085302217f, -0.0000000000f, -0.0173976984f, + -0.0341458607f, -0.0333591565f, +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, +0.2229246956f, + +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, + +0.0080754303f, +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f +}; + +/* ------------------------------------------------------------------ + * Global variables for FIR LPF Example + * ------------------------------------------------------------------- */ + +uint32_t blockSize = BLOCK_SIZE; +uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; + +float32_t snr; + +/* ---------------------------------------------------------------------- + * FIR LPF Example + * ------------------------------------------------------------------- */ + +int32_t main(void) +{ + uint32_t i; + arm_fir_instance_f32 S; + arm_status status; + float32_t *inputF32, *outputF32; + + /* Initialize input and output buffer pointers */ + inputF32 = &testInput_f32_1kHz_15kHz[0]; + outputF32 = &testOutput[0]; + + /* Call FIR init function to initialize the instance structure. */ + arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize); + + /* ---------------------------------------------------------------------- + ** Call the FIR process function for every blockSize samples + ** ------------------------------------------------------------------- */ + + for(i=0; i < numBlocks; i++) + { + arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize); + } + + /* ---------------------------------------------------------------------- + ** Compare the generated output against the reference output computed + ** in MATLAB. + ** ------------------------------------------------------------------- */ + + snr = arm_snr_f32(&refOutput[0], &testOutput[0], TEST_LENGTH_SAMPLES); + + if (snr < SNR_THRESHOLD_F32) + { + status = ARM_MATH_TEST_FAILURE; + } + else + { + status = ARM_MATH_SUCCESS; + } + + /* ---------------------------------------------------------------------- + ** Loop here if the signal does not match the reference output. + ** ------------------------------------------------------------------- */ + + if ( status != ARM_MATH_SUCCESS) + { + while (1); + } + + while (1); /* main function does not return */ +} + +/** \endlink */ diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/math_helper.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/math_helper.c new file mode 100644 index 0000000..f615e6f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/math_helper.c @@ -0,0 +1,466 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 b +* +* Project: CMSIS DSP Library +* +* Title: math_helper.c +* +* Description: Definition of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +* Include standard header files +* -------------------------------------------------------------------- */ +#include + +/* ---------------------------------------------------------------------- +* Include project header files +* -------------------------------------------------------------------- */ +#include "math_helper.h" + +/** + * @brief Caluclation of SNR + * @param[in] pRef Pointer to the reference buffer + * @param[in] pTest Pointer to the test buffer + * @param[in] buffSize total number of samples + * @return SNR + * The function Caluclates signal to noise ratio for the reference output + * and test output + */ + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) +{ + float EnergySignal = 0.0, EnergyError = 0.0; + uint32_t i; + float SNR; + int temp; + int *test; + + for (i = 0; i < buffSize; i++) + { + /* Checking for a NAN value in pRef array */ + test = (int *)(&pRef[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + /* Checking for a NAN value in pTest array */ + test = (int *)(&pTest[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + EnergySignal += pRef[i] * pRef[i]; + EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); + } + + /* Checking for a NAN value in EnergyError */ + test = (int *)(&EnergyError); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + + SNR = 10 * log10 (EnergySignal / EnergyError); + + return (SNR); + +} + + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Converts float to fixed in q12.20 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to outputbuffer + * @param[in] numSamples number of samples in the input buffer + * @return none + * The function converts floating point values to fixed point(q12.20) values + */ + +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1048576.0f corresponds to pow(2, 20) */ + pOut[i] = (q31_t) (pIn[i] * 1048576.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 1.0) + { + pOut[i] = 0x000FFFFF; + } + } +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q31 (q31_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q7 (q7_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + + + +/** + * @brief Caluclates number of guard bits + * @param[in] num_adds number of additions + * @return guard bits + * The function Caluclates the number of guard bits + * depending on the numtaps + */ + +uint32_t arm_calc_guard_bits (uint32_t num_adds) +{ + uint32_t i = 1, j = 0; + + if (num_adds == 1) + { + return (0); + } + + while (i < num_adds) + { + i = i * 2; + j++; + } + + return (j); +} + +/** + * @brief Apply guard bits to buffer + * @param[in,out] pIn pointer to input buffer + * @param[in] numSamples number of samples in the input buffer + * @param[in] guard_bits guard bits + * @return none + */ + +void arm_apply_guard_bits (float32_t *pIn, + uint32_t numSamples, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); + } +} + +/** + * @brief Calculates pow(2, numShifts) + * @param[in] numShifts number of shifts + * @return pow(2, numShifts) + */ +uint32_t arm_calc_2pow(uint32_t numShifts) +{ + + uint32_t i, val = 1; + + for (i = 0; i < numShifts; i++) + { + val = val * 2; + } + + return(val); +} + + + +/** + * @brief Converts float to fixed q14 + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q14 (float *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 16384.0f corresponds to pow(2, 14) */ + pOut[i] = (q15_t) (pIn[i] * 16384.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFF; + } + + } + +} + + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q30 (float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q29 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 536870912.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 4.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + + +/** + * @brief Converts float to fixed q28 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q28 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 268435456.0f corresponds to pow(2, 28) */ + pOut[i] = (q31_t) (pIn[i] * 268435456.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 8.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Clip the float values to +/- 1 + * @param[in,out] pIn input buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_clip_f32 (float *pIn, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + if (pIn[i] > 1.0f) + { + pIn[i] = 1.0; + } + else if ( pIn[i] < -1.0f) + { + pIn[i] = -1.0; + } + + } +} + + + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/math_helper.h b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/math_helper.h new file mode 100644 index 0000000..5a18734 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_fir_example/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2013 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* +* Title: math_helper.h +* +* Description: Prototypes of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + + +#include "arm_math.h" + +#ifndef MATH_HELPER_H +#define MATH_HELPER_H + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); +void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); +void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_clip_f32(float *pIn, uint32_t numSamples); +uint32_t arm_calc_guard_bits(uint32_t num_adds); +void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); +uint32_t arm_calc_2pow(uint32_t guard_bits); +#endif + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/Abstract.txt new file mode 100644 index 0000000..c2452b6 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_graphic_equalizer_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/arm_graphic_equalizer_data.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/arm_graphic_equalizer_data.c new file mode 100644 index 0000000..b6ab8c9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/arm_graphic_equalizer_data.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_graphic_equalizer_data.c +* +* Description: Data file used for example code +* +* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +#include "arm_math.h" + +float32_t testRefOutput_f32[320] = { + +0.000000000000000000, 0.001898396760225296, 0.004215449094772339, 0.007432077080011368, 0.010948467999696732, 0.015026375651359558, 0.019191544502973557, 0.023574527353048325, +0.027919445186853409, 0.032277785241603851, 0.036551639437675476, 0.040732793509960175, 0.044799156486988068, 0.048710610717535019, 0.052476800978183746, 0.056059073656797409, +0.059482168406248093, 0.062726479023694992, 0.065821025520563126, 0.068763464689254761, 0.071577839553356171, 0.074270240962505341, 0.076856281608343124, 0.079344697296619415, +0.081745062023401260, 0.084067162126302719, 0.086318407207727432, 0.088509257882833481, 0.090647127479314804, 0.092742368578910828, 0.094802625477313995, 0.096837285906076431, +0.098853722214698792, 0.100859899073839190, 0.102862443774938580, 0.104867763817310330, 0.106881409883499150, 0.108908228576183320, 0.110952425748109820, 0.113017357885837550, +0.115105822682380680, 0.117219865322113040, 0.119361080229282380, 0.121530555188655850, 0.123729091137647630, 0.125957202166318890, 0.128215309232473370, 0.130503740161657330, +0.132822841405868530, 0.135173004120588300, 0.137554679065942760, 0.139968376606702800, 0.142414685338735580, 0.144894234836101530, 0.147407654672861100, 0.149955596774816510, +0.152538605034351350, 0.155157200992107390, 0.157811731100082400, 0.160502441227436070, 0.163229387253522870, 0.165992442518472670, 0.168791320174932480, 0.171625509858131410, +0.174494370818138120, 0.177397061139345170, 0.180332608520984650, 0.183299910277128220, 0.186297744512557980, 0.189324837177991870, 0.192379791289567950, 0.195461250841617580, +0.198567759245634080, 0.201697919517755510, 0.204850304871797560, 0.208023533225059510, 0.211216274648904800, 0.214427210390567780, 0.217655111104249950, 0.220898788422346120, +0.224157124757766720, 0.227429077029228210, 0.230713658034801480, 0.234009962528944020, 0.237317133694887160, 0.240634419023990630, 0.243961080908775330, 0.247296508401632310, +0.250640105456113820, 0.253991369158029560, 0.257349837571382520, 0.260715119540691380, 0.264086868613958360, 0.267464816570281980, 0.270848698914051060, 0.274238351732492450, +0.277633611112833020, 0.281034380197525020, 0.284440591931343080, 0.287852220237255100, 0.291269283741712570, 0.294691801071166990, 0.298119872808456420, 0.301553562283515930, +0.304993014782667160, 0.308438356965780260, 0.311889752745628360, 0.315347377210855480, 0.318811416625976560, 0.322282072156667710, 0.325759567320346830, 0.329244095832109450, +0.332735907286405560, 0.336235217750072480, 0.339742250740528110, 0.343257248401641850, 0.346780419349670410, 0.350311983376741410, 0.353852160274982450, 0.357401121407747270, +0.360959105193614960, 0.364526227116584780, 0.368102725595235820, 0.371688675135374070, 0.375284302979707720, 0.378889638930559160, 0.382504884153604510, 0.386130042374134060, +0.389765247702598570, 0.393410529941320420, 0.397065933793783190, 0.400731507688760760, 0.404407206922769550, 0.408093083649873730, 0.411789052188396450, 0.415495119988918300, +0.419211201369762420, 0.422937240451574330, 0.426673140376806260, 0.430418811738491060, 0.434174135327339170, 0.437938995659351350, 0.441713258624076840, 0.445496778935194020, +0.449289388954639430, 0.453090950846672060, 0.456901267170906070, 0.460720170289278030, 0.464547459036111830, 0.468382950872182850, 0.472226426005363460, 0.476077698171138760, +0.479936532676219940, 0.483802750706672670, 0.487676106393337250, 0.491556398570537570, 0.495443399995565410, 0.499336875975131990, 0.503236617892980580, 0.507142387330532070, +0.511053957045078280, 0.514971107244491580, 0.518893606960773470, 0.522821225225925450, 0.526753749698400500, 0.530690938234329220, 0.534632585942745210, 0.538578454405069350, +0.542528338730335240, 0.546481993049383160, 0.550439231097698210, 0.554399792104959490, 0.558363504707813260, 0.562330115586519240, 0.566299438476562500, 0.570271246135234830, +0.574245333671569820, 0.578221492469310760, 0.582199502736330030, 0.586179181933403020, 0.590160276740789410, 0.594142623245716090, 0.598125983029603960, 0.602110169827938080, +0.606094967573881150, 0.610080175101757050, 0.614065583795309070, 0.618050977587699890, 0.622036151587963100, 0.626020893454551700, 0.630004994571208950, 0.633988231420516970, +0.637970402836799620, 0.641951277852058410, 0.645930647850036620, 0.649908289313316350, 0.653883971273899080, 0.657857488840818410, 0.661828581243753430, 0.665797054767608640, +0.669762641191482540, 0.673725124448537830, 0.677684243768453600, 0.681639779359102250, 0.685591462999582290, 0.689539063721895220, 0.693482317030429840, 0.697420965880155560, +0.701354760676622390, 0.705283410847187040, 0.709206689149141310, 0.713124278932809830, 0.717035952955484390, 0.720941375941038130, 0.724840316921472550, 0.728732451796531680, +0.732617516070604320, 0.736495196819305420, 0.740365199744701390, 0.744227230548858640, 0.748080968856811520, 0.751926124095916750, 0.755762357264757160, 0.759589381515979770, +0.763406842947006230, 0.767214450985193250, 0.771011855453252790, 0.774798732250928880, 0.778574761003255840, 0.782339565455913540, 0.786092851310968400, 0.789834223687648770, +0.793563373386859890, 0.797279909253120420, 0.800983514636754990, 0.804673787206411360, 0.808350402861833570, 0.812012966722249980, 0.815661124885082240, 0.819294504821300510, +0.822912722826004030, 0.826515413820743560, 0.830102190375328060, 0.833672653883695600, 0.837226435542106630, 0.840763118118047710, 0.844282336533069610, 0.847783654928207400, +0.851266715675592420, 0.854731071740388870, 0.858176350593566890, 0.861602116376161580, 0.865007970482110980, 0.868393491953611370, 0.871758259832859040, 0.875101849436759950, +0.878423850983381270, 0.881723806262016300, 0.885001312941312790, 0.888255912810564040, 0.891487173736095430, 0.894694659858942030, 0.897877920418977740, 0.901036512106657030, +0.904169965535402300, 0.907277844846248630, 0.910359673202037810, 0.913415014743804930, 0.916443370282649990, 0.919444311410188670, 0.922417331486940380, 0.925361987203359600, +0.928277771919965740, 0.931164238601922990, 0.934020876884460450, 0.936847217381000520, 0.939642757177352910, 0.942407000809907910, 0.945139460265636440, 0.947839632630348210, +0.950507018715143200, 0.953141096979379650, 0.955741371959447860, 0.958307322114706040, 0.960838429629802700, 0.963334184139966960, 0.965794049203395840, 0.968217510730028150, +0.970604017376899720, 0.972953058779239650, 0.975264083594083790, 0.977536566555500030, 0.979769956320524220, 0.981963708996772770, 0.984117280691862110, 0.986230112612247470, +0.988301653414964680, 0.990331344306468960, 0.992318630218505860, 0.994262944906950000, 0.996163722127676010, 0.998020399361848830, 0.999832402914762500, 1.001599155366420700, +1.003320086747407900, 1.004994612187147100, 1.006622135639190700, 1.008202098309993700, 1.009733878076076500, 1.011216927319765100, 1.012650609016418500, 1.014034371823072400, +1.015367589890956900, 1.016649682074785200, 1.017880033701658200, 1.019058048725128200, 1.020183108747005500, 1.021254621446132700, 1.022271949797868700, 1.023234523832798000, + +}; +/* ---------------------------------------------------------------------- +** Test input - logarithmic chirp signal +** ------------------------------------------------------------------- */ + +float32_t testInput_f32[320] = + { + 0.000000000000000061, 0.002622410992047861, 0.005253663973466970, 0.007893770384930297, 0.010542741395035495, 0.013200587895525877, 0.015867320496454066, 0.018542949521290073, +0.021227485001971542, 0.023920936673895138, 0.026623313970853074, 0.029334626019908643, 0.032054881636210709, 0.034784089317753723, 0.037522257240071598, 0.040269393250875855, +0.043025504864628375, 0.045790599257054837, 0.048564683259595690, 0.051347763353792118, 0.054139845665610427, 0.056940935959702531, 0.059751039633601337, 0.062570161711849828, +0.065398306840066575, 0.068235479278943648, 0.071081682898178900, 0.073936921170339814, 0.076801197164660218, 0.079674513540768196, 0.082556872542344922, 0.085448275990715375, +0.088348725278367082, 0.091258221362398390, 0.094176764757897533, 0.097104355531246703, 0.100040993293358240, 0.102986677192832010, 0.105941405909045980, 0.108905177645166230, +0.111877990121087980, 0.114859840566297130, 0.117850725712659680, 0.120850641787131110, 0.123859584504392860, 0.126877549059407400, 0.129904530119898690, 0.132940521818751430, +0.135985517746334080, 0.139039510942737950, 0.142102493889940090, 0.145174458503884160, 0.148255396126476810, 0.151345297517508140, 0.154444152846483080, 0.157551951684374300, +0.160668682995289720, 0.163794335128054890, 0.166928895807713030, 0.170072352126936720, 0.173224690537355760, 0.176385896840798810, 0.179555956180445340, 0.182734853031894270, +0.185922571194139130, 0.189119093780459800, 0.192324403209221870, 0.195538481194587030, 0.198761308737133020, 0.201992866114384050, 0.205233132871247170, 0.208482087810360570, +0.211739708982344370, 0.215005973675965020, 0.218280858408200220, 0.221564338914212730, 0.224856390137231970, 0.228156986218334190, 0.231466100486134670, 0.234783705446379690, +0.238109772771442410, 0.241444273289723230, 0.244787176974952890, 0.248138452935395580, 0.251498069402956710, 0.254865993722190930, 0.258242192339209860, 0.261626630790492030, +0.265019273691591620, 0.268420084725748410, 0.271829026632395280, 0.275246061195565440, 0.278671149232197430, 0.282104250580339830, 0.285545324087251580, 0.288994327597401960, +0.292451217940364990, 0.295915950918612280, 0.299388481295203350, 0.302868762781368150, 0.306356748023990040, 0.309852388592980640, 0.313355634968552230, 0.316866436528383590, +0.320384741534681720, 0.323910497121136620, 0.327443649279772870, 0.330984142847692230, 0.334531921493712690, 0.338086927704900790, 0.341649102772995210, 0.345218386780727190, +0.348794718588032520, 0.352378035818156910, 0.355968274843654950, 0.359565370772282730, 0.363169257432780890, 0.366779867360555120, 0.370397131783246010, 0.374020980606193880, +0.377651342397795690, 0.381288144374756830, 0.384931312387234990, 0.388580770903877330, 0.392236442996751310, 0.395898250326170650, 0.399566113125414350, 0.403239950185338420, +0.406919678838884410, 0.410605214945482130, 0.414296472875345100, 0.417993365493664670, 0.421695804144698540, 0.425403698635752780, 0.429116957221065130, 0.432835486585582130, +0.436559191828633180, 0.440287976447505720, 0.444021742320914510, 0.447760389692375140, 0.451503817153472210, 0.455251921627031540, 0.459004598350192470, 0.462761740857380200, +0.466523240963184150, 0.470288988745136360, 0.474058872526396560, 0.477832778858340690, 0.481610592503056990, 0.485392196415748600, 0.489177471727042850, 0.492966297725213780, +0.496758551838309250, 0.500554109616195060, 0.504352844712508190, 0.508154628866524960, 0.511959331884944910, 0.515766821623591440, 0.519576963969030530, 0.523389622820107150, +0.527204660069405030, 0.531021935584629400, 0.534841307189911630, 0.538662630647041900, 0.542485759636628150, 0.546310545739186690, 0.550136838416161340, 0.553964484990880020, +0.557793330629441700, 0.561623218321546380, 0.565453988861259300, 0.569285480827721570, 0.573117530565801950, 0.576949972166696630, 0.580782637448476910, 0.584615355936589420, +0.588447954844309340, 0.592280259053150400, 0.596112091093235260, 0.599943271123626440, 0.603773616912622660, 0.607602943818024150, 0.611431064767369080, 0.615257790238142090, +0.619082928237961740, 0.622906284284749700, 0.626727661386881850, 0.630546860023327600, 0.634363678123782030, 0.638177911048790960, 0.641989351569874020, 0.645797789849653410, +0.649603013421986450, 0.653404807172108140, 0.657202953316791350, 0.660997231384523490, 0.664787418195706640, 0.668573287842887610, 0.672354611671016960, 0.676131158257749170, +0.679902693393781730, 0.683668980063242500, 0.687429778424128110, 0.691184845788802130, 0.694933936604551380, 0.698676802434213370, 0.702413191936877570, 0.706142850848662460, +0.709865521963579990, 0.713580945114492330, 0.717288857154159800, 0.720988991936399870, 0.724681080297347790, 0.728364850036839040, 0.732040025899910680, 0.735706329558433620, +0.739363479592880620, 0.743011191474238440, 0.746649177546067850, 0.750277147006723990, 0.753894805891742180, 0.757501857056394940, 0.761098000158428880, 0.764682931640995540, +0.768256344715771980, 0.771817929346292900, 0.775367372231492210, 0.778904356789468790, 0.782428563141483460, 0.785939668096195860, 0.789437345134148760, 0.792921264392515420, +0.796391092650110770, 0.799846493312681210, 0.803287126398485760, 0.806712648524170680, 0.810122712890953390, 0.813516969271127150, 0.816895063994893090, 0.820256639937531280, +0.823601336506926020, 0.826928789631450890, 0.830238631748229430, 0.833530491791779850, 0.836803995183058700, 0.840058763818912760, 0.843294416061954100, 0.846510566730867220, +0.849706827091166740, 0.852882804846411770, 0.856038104129895340, 0.859172325496819990, 0.862285065916973510, 0.865375918767918860, 0.868444473828712590, 0.871490317274166260, +0.874513031669661770, 0.877512195966544280, 0.880487385498096800, 0.883438171976119850, 0.886364123488128100, 0.889264804495180530, 0.892139775830360640, 0.894988594697921020, +0.897810814673113080, 0.900605985702712770, 0.903373654106265470, 0.906113362578062300, 0.908824650189867690, 0.911507052394417540, 0.914160101029702910, 0.916783324324059180, +0.919376246902079860, 0.921938389791372770, 0.924469270430179120, 0.926968402675872660, 0.929435296814361430, 0.931869459570409790, 0.934270394118903560, 0.936637600097074200, +0.938970573617708970, 0.941268807283364040, 0.943531790201601380, 0.945759008001275100, 0.947949942849885320, 0.950104073472023970, 0.952220875168933280, 0.954299819839202090, +0.956340376000621160, 0.958342008813221960, 0.960304180103520260, 0.962226348389994210, 0.964107968909812760, 0.965948493646846980, 0.967747371360983650, 0.969504047618768740, +0.971217964825405680, 0.972888562258134030, 0.974515276101013520, 0.976097539481141750, 0.977634782506330400, 0.979126432304266880, 0.980571913063189360, 0.981970646074102120, +0.983322049774557390, 0.984625539794035220, 0.985880529000944810, 0.987086427551279730, 0.988242642938953360, 0.989348580047844540, 0.990403641205582440, 0.991407226239099710, +0.992358732531984260, 0.993257555083659870, 0.994103086570423680, 0.994894717408374870, 0.995631835818261310, 0.996313827892278070, 0.996940077662846650, 0.997509967173408010, + + }; diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/arm_graphic_equalizer_example_q31.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/arm_graphic_equalizer_example_q31.c new file mode 100644 index 0000000..c263d18 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/arm_graphic_equalizer_example_q31.c @@ -0,0 +1,411 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_graphic_equalizer_example_q31.c +* +* Description: Example showing an audio graphic equalizer constructed +* out of Biquad filters. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup GEQ5Band Graphic Audio Equalizer Example + * + * \par Description: + * \par + * This example demonstrates how a 5-band graphic equalizer can be constructed + * using the Biquad cascade functions. + * A graphic equalizer is used in audio applications to vary the tonal quality + * of the audio. + * + * \par Block Diagram: + * \par + * The design is based on a cascade of 5 filter sections. + * \image html GEQ_signalflow.gif + * Each filter section is 4th order and consists of a cascade of two Biquads. + * Each filter has a nominal gain of 0 dB (1.0 in linear units) and + * boosts or cuts signals within a specific frequency range. + * The edge frequencies between the 5 bands are 100, 500, 2000, and 6000 Hz. + * Each band has an adjustable boost or cut in the range of +/- 9 dB. + * For example, the band that extends from 500 to 2000 Hz has the response shown below: + * \par + * \image html GEQ_bandresponse.gif + * \par + * With 1 dB steps, each filter has a total of 19 different settings. + * The filter coefficients for all possible 19 settings were precomputed + * in MATLAB and stored in a table. With 5 different tables, there are + * a total of 5 x 19 = 95 different 4th order filters. + * All 95 responses are shown below: + * \par + * \image html GEQ_allbandresponse.gif + * \par + * Each 4th order filter has 10 coefficents for a grand total of 950 different filter + * coefficients that must be tabulated. The input and output data is in Q31 format. + * For better noise performance, the two low frequency bands are implemented using the high + * precision 32x64-bit Biquad filters. The remaining 3 high frequency bands use standard + * 32x32-bit Biquad filters. The input signal used in the example is a logarithmic chirp. + * \par + * \image html GEQ_inputchirp.gif + * \par + * The array bandGains specifies the gain in dB to apply in each band. + * For example, if bandGains={0, -3, 6, 4, -6}; then the output signal will be: + * \par + * \image html GEQ_outputchirp.gif + * \par + * \note The output chirp signal follows the gain or boost of each band. + * \par + * + * \par Variables Description: + * \par + * \li \c testInput_f32 points to the input data + * \li \c testRefOutput_f32 points to the reference output data + * \li \c testOutput points to the test output data + * \li \c inputQ31 temporary input buffer + * \li \c outputQ31 temporary output buffer + * \li \c biquadStateBand1Q31 points to state buffer for band1 + * \li \c biquadStateBand2Q31 points to state buffer for band2 + * \li \c biquadStateBand3Q31 points to state buffer for band3 + * \li \c biquadStateBand4Q31 points to state buffer for band4 + * \li \c biquadStateBand5Q31 points to state buffer for band5 + * \li \c coeffTable points to coefficient buffer for all bands + * \li \c gainDB gain buffer which has gains applied for all the bands + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_biquad_cas_df1_32x64_init_q31() + * - arm_biquad_cas_df1_32x64_q31() + * - arm_biquad_cascade_df1_init_q31() + * - arm_biquad_cascade_df1_q31() + * - arm_scale_q31() + * - arm_scale_f32() + * - arm_float_to_q31() + * - arm_q31_to_float() + * + * Refer + * \link arm_graphic_equalizer_example_q31.c \endlink + * + */ + + +/** \example arm_graphic_equalizer_example_q31.c + */ + + +#include "arm_math.h" +#include "math_helper.h" + +/* Length of the overall data in the test */ +#define TESTLENGTH 320 + +/* Block size for the underlying processing */ +#define BLOCKSIZE 32 + +/* Total number of blocks to run */ +#define NUMBLOCKS (TESTLENGTH/BLOCKSIZE) + +/* Number of 2nd order Biquad stages per filter */ +#define NUMSTAGES 2 + +#define SNR_THRESHOLD_F32 98 + +/* ------------------------------------------------------------------- + * External Declarations for Input and Output buffers + * ------------------------------------------------------------------- */ + +extern float32_t testInput_f32[TESTLENGTH]; +static float32_t testOutput[TESTLENGTH]; + +extern float32_t testRefOutput_f32[TESTLENGTH]; + +/* ---------------------------------------------------------------------- +** Q31 state buffers for Band1, Band2, Band3, Band4, Band5 +** ------------------------------------------------------------------- */ + +static q63_t biquadStateBand1Q31[4 * 2]; +static q63_t biquadStateBand2Q31[4 * 2]; +static q31_t biquadStateBand3Q31[4 * 2]; +static q31_t biquadStateBand4Q31[4 * 2]; +static q31_t biquadStateBand5Q31[4 * 2]; + +/* ---------------------------------------------------------------------- +** Q31 input and output buffers +** ------------------------------------------------------------------- */ + +q31_t inputQ31[BLOCKSIZE]; +q31_t outputQ31[BLOCKSIZE]; + +/* ---------------------------------------------------------------------- +** Entire coefficient table. There are 10 coefficients per 4th order Biquad +** cascade filter. The first 10 coefficients correspond to the -9 dB gain +** setting of band 1; the next 10 coefficient correspond to the -8 dB gain +** setting of band 1; and so on. There are 10*19=190 coefficients in total +** for band 1 (gains = -9, -8, -7, ..., 9). After this come the 190 coefficients +** for band 2. +** +** The coefficients are in Q29 format and require a postShift of 2. +** ------------------------------------------------------------------- */ + +const q31_t coeffTable[950] = { + + /* Band 1, -9 dB gain */ + 535576962, -1071153923, 535576962, 1073741824, -536870912, 535576962, -1063501998, 527979313, 1060865294, -524146981, + /* Band 1, -8 dB gain */ + 535723226, -1071446451, 535723226, 1073741824, -536870912, 535723226, -1063568947, 527903217, 1061230578, -524503778, + 535868593, -1071737186, 535868593, 1073741824, -536870912, 535868593, -1063627467, 527819780, 1061585502, -524850686, + 536013181, -1072026363, 536013181, 1073741824, -536870912, 536013181, -1063677598, 527728935, 1061930361, -525187972, + 536157109, -1072314217, 536157109, 1073741824, -536870912, 536157109, -1063719372, 527630607, 1062265438, -525515897, + 536300492, -1072600983, 536300492, 1073741824, -536870912, 536300492, -1063752815, 527524720, 1062591011, -525834716, + 536443447, -1072886894, 536443447, 1073741824, -536870912, 536443447, -1063777945, 527411186, 1062907350, -526144676, + 536586091, -1073172183, 536586091, 1073741824, -536870912, 536586091, -1063794775, 527289917, 1063214717, -526446017, + 536728541, -1073457082, 536728541, 1073741824, -536870912, 536728541, -1063803308, 527160815, 1063513366, -526738975, + 536870912, -1073741824, 536870912, 1073741824, -536870912, 536870912, -1063803543, 527023777, 1063803543, -527023777, + 537013321, -1074026642, 537013321, 1073741824, -536870912, 537013321, -1063795470, 526878696, 1064085490, -527300648, + 537155884, -1074311768, 537155884, 1073741824, -536870912, 537155884, -1063779073, 526725455, 1064359439, -527569803, + 537298718, -1074597435, 537298718, 1073741824, -536870912, 537298718, -1063754328, 526563934, 1064625617, -527831454, + 537441939, -1074883878, 537441939, 1073741824, -536870912, 537441939, -1063721205, 526394005, 1064884245, -528085806, + 537585666, -1075171331, 537585666, 1073741824, -536870912, 537585666, -1063679666, 526215534, 1065135536, -528333059, + 537730015, -1075460030, 537730015, 1073741824, -536870912, 537730015, -1063629666, 526028380, 1065379699, -528573409, + 537875106, -1075750212, 537875106, 1073741824, -536870912, 537875106, -1063571152, 525832396, 1065616936, -528807045, + 538021057, -1076042114, 538021057, 1073741824, -536870912, 538021057, -1063504065, 525627429, 1065847444, -529034151, + 538167989, -1076335977, 538167989, 1073741824, -536870912, 538167989, -1063428338, 525413317, 1066071412, -529254907, + + /* Band 2, -9 dB gain */ + 531784976, -1055497692, 523873415, 1066213307, -529420241, 531784976, -1040357886, 509828014, 1028908252, -494627367, + /* Band 2, -8 dB gain */ + 532357636, -1056601982, 524400080, 1066115844, -529326645, 532357636, -1040623406, 509562600, 1030462237, -496062122, + 532927392, -1057707729, 524931110, 1066024274, -529239070, 532927392, -1040848253, 509262081, 1031969246, -497457090, + 533494678, -1058816094, 525467240, 1065939047, -529157961, 533494678, -1041032161, 508925950, 1033429976, -498812573, + 534059929, -1059928204, 526009170, 1065860582, -529083734, 534059929, -1041174868, 508553717, 1034845124, -500128887, + 534623580, -1061045148, 526557561, 1065789260, -529016764, 534623580, -1041276126, 508144920, 1036215393, -501406373, + 535186068, -1062167969, 527113032, 1065725420, -528957385, 535186068, -1041335703, 507699125, 1037541500, -502645399, + 535747827, -1063297666, 527676151, 1065669351, -528905879, 535747827, -1041353386, 507215934, 1038824183, -503846368, + 536309295, -1064435183, 528247436, 1065621289, -528862476, 536309295, -1041328990, 506694984, 1040064203, -505009724, + 536870912, -1065581413, 528827349, 1065581413, -528827349, 536870912, -1041262354, 506135953, 1041262354, -506135953, + 537433117, -1066737194, 529416295, 1065549847, -528800610, 537433117, -1041153346, 505538564, 1042419457, -507225588, + 537996352, -1067903307, 530014622, 1065526651, -528782316, 537996352, -1041001864, 504902578, 1043536370, -508279208, + 538561061, -1069080480, 530622620, 1065511830, -528772462, 538561061, -1040807833, 504227800, 1044613981, -509297437, + 539127690, -1070269387, 531240527, 1065505333, -528770987, 539127690, -1040571205, 503514074, 1045653211, -510280946, + 539696690, -1071470656, 531868525, 1065507054, -528777778, 539696690, -1040291951, 502761277, 1046655011, -511230450, + 540268512, -1072684867, 532506750, 1065516837, -528792672, 540268512, -1039970063, 501969320, 1047620358, -512146700, + 540843613, -1073912567, 533155297, 1065534483, -528815459, 540843613, -1039605542, 501138139, 1048550251, -513030484, + 541422451, -1075154268, 533814224, 1065559750, -528845892, 541422451, -1039198394, 500267687, 1049445708, -513882621, + 542005489, -1076410460, 534483561, 1065592362, -528883686, 542005489, -1038748624, 499357932, 1050307760, -514703956, + 518903861, -1001986830, 486725277, 1037235801, -502367695, 518903861, -945834422, 446371043, 902366163, -400700571, + 520899989, -1005630916, 488289126, 1036926846, -502147311, 520899989, -946490935, 445581846, 907921945, -404936158, + 522893209, -1009290002, 489869792, 1036650484, -501961419, 522893209, -947006359, 444685310, 913306106, -409075225, + 524884763, -1012968199, 491470256, 1036407567, -501810737, 524884763, -947377809, 443679533, 918521018, -413116221, + 526875910, -1016669649, 493093518, 1036198712, -501695739, 526875910, -947602324, 442562672, 923569247, -417057897, + 528867927, -1020398503, 494742575, 1036024293, -501616651, 528867927, -947676875, 441332970, 928453558, -420899319, + 530862111, -1024158905, 496420407, 1035884447, -501573457, 530862111, -947598385, 439988777, 933176909, -424639872, + 532859778, -1027954970, 498129955, 1035779077, -501565907, 532859778, -947363742, 438528571, 937742446, -428279254, + 534862260, -1031790763, 499874098, 1035707863, -501593525, 534862260, -946969823, 436950987, 942153486, -431817474, + 536870912, -1035670279, 501655630, 1035670279, -501655630, 536870912, -946413508, 435254839, 946413508, -435254839, + 538887107, -1039597419, 503477238, 1035665609, -501751354, 538887107, -945691703, 433439146, 950526127, -438591937, + 540912240, -1043575967, 505341475, 1035692963, -501879659, 540912240, -944801359, 431503152, 954495080, -441829621, + 542947726, -1047609569, 507250741, 1035751307, -502039364, 542947726, -943739490, 429446349, 958324201, -444968987, + 544995000, -1051701717, 509207261, 1035839473, -502229165, 544995000, -942503190, 427268492, 962017400, -448011351, + 547055523, -1055855728, 511213065, 1035956193, -502447657, 547055523, -941089647, 424969617, 965578640, -450958226, + 549130774, -1060074734, 513269973, 1036100110, -502693359, 549130774, -939496155, 422550049, 969011913, -453811298, + 551222259, -1064361672, 515379585, 1036269804, -502964731, 551222259, -937720119, 420010407, 972321228, -456572401, + 553331507, -1068719280, 517543273, 1036463810, -503260192, 553331507, -935759057, 417351601, 975510582, -459243495, + 555460072, -1073150100, 519762181, 1036680633, -503578144, 555460072, -933610600, 414574832, 978583948, -461826644, + 494084017, -851422604, 404056273, 930151631, -423619864, 494084017, -673714108, 339502486, 561843007, -265801750, + 498713542, -859177141, 406587077, 929211656, -423786402, 498713542, -673274906, 338185129, 573719128, -272222942, + 503369016, -867012190, 409148384, 928362985, -424054784, 503369016, -672533059, 336693984, 585290277, -278599028, + 508052536, -874935599, 411746438, 927604291, -424422151, 508052536, -671478538, 335026905, 596558312, -284920289, + 512766286, -882955583, 414387826, 926933782, -424885216, 512766286, -670100998, 333182045, 607525792, -291177811, + 517512534, -891080712, 417079474, 926349262, -425440318, 517512534, -668389789, 331157902, 618195914, -297363485, + 522293635, -899319903, 419828635, 925848177, -426083491, 522293635, -666333963, 328953368, 628572440, -303470012, + 527112032, -907682405, 422642886, 925427679, -426810526, 527112032, -663922286, 326567785, 638659631, -309490882, + 531970251, -916177781, 425530105, 925084675, -427617023, 531970251, -661143261, 324000998, 648462180, -315420352, + 536870912, -924815881, 428498454, 924815881, -428498454, 536870912, -657985147, 321253420, 657985147, -321253420, + 541816719, -933606817, 431556352, 924617870, -429450209, 541816719, -654435997, 318326093, 667233900, -326985786, + 546810467, -942560921, 434712438, 924487114, -430467639, 546810467, -650483688, 315220754, 676214053, -332613816, + 551855042, -951688708, 437975532, 924420027, -431546101, 551855042, -646115970, 311939896, 684931422, -338134495, + 556953421, -961000826, 441354588, 924413001, -432680993, 556953421, -641320513, 308486839, 693391970, -343545389, + 562108672, -970508005, 444858642, 924462435, -433867780, 562108672, -636084967, 304865786, 701601770, -348844597, + 567323959, -980220994, 448496743, 924564764, -435102022, 567323959, -630397020, 301081886, 709566963, -354030710, + 572602539, -990150500, 452277894, 924716482, -436379394, 572602539, -624244471, 297141281, 717293726, -359102767, + 577947763, -1000307125, 456210977, 924914158, -437695705, 577947763, -617615296, 293051155, 724788245, -364060214, + 583363084, -1010701292, 460304674, 925154455, -439046908, 583363084, -610497723, 288819761, 732056685, -368902865, + 387379495, -506912469, 196933274, 840112184, -347208270, 387379495, 506912469, 196933274, -840112184, -347208270, + 401658082, -532275898, 207149427, 833765363, -343175316, 401658082, 532275898, 207149427, -833765363, -343175316, + 416472483, -558722695, 217902617, 827270154, -339107319, 416472483, 558722695, 217902617, -827270154, -339107319, + 431841949, -586290861, 229212798, 820624988, -335007540, 431841949, 586290861, 229212798, -820624988, -335007540, + 447786335, -615019650, 241100489, 813828443, -330879528, 447786335, 615019650, 241100489, -813828443, -330879528, + 464326111, -644949597, 253586805, 806879270, -326727141, 464326111, 644949597, 253586805, -806879270, -326727141, + 481482377, -676122557, 266693475, 799776409, -322554559, 481482377, 676122557, 266693475, -799776409, -322554559, + 499276882, -708581728, 280442865, 792519013, -318366296, 499276882, 708581728, 280442865, -792519013, -318366296, + 517732032, -742371685, 294857996, 785106465, -314167221, 517732032, 742371685, 294857996, -785106465, -314167221, + 536870912, -777538408, 309962566, 777538408, -309962566, 536870912, 777538408, 309962566, -777538408, -309962566, + 556717294, -814129313, 325780968, 769814766, -305757943, 556717294, 814129313, 325780968, -769814766, -305757943, + 577295658, -852193284, 342338310, 761935777, -301559360, 577295658, 852193284, 342338310, -761935777, -301559360, + 598631206, -891780698, 359660433, 753902014, -297373230, 598631206, 891780698, 359660433, -753902014, -297373230, + 620749877, -932943463, 377773927, 745714425, -293206383, 620749877, 932943463, 377773927, -745714425, -293206383, + 643678365, -975735041, 396706151, 737374355, -289066077, 643678365, 975735041, 396706151, -737374355, -289066077, + 667444134, -1020210487, 416485252, 728883588, -284960004, 667444134, 1020210487, 416485252, -728883588, -284960004, + 692075438, -1066426476, 437140179, 720244375, -280896294, 692075438, 1066426476, 437140179, -720244375, -280896294, + 717601336, -1114441339, 458700704, 711459472, -276883515, 717601336, 1114441339, 458700704, -711459472, -276883515, + 744051710, -1164315096, 481197437, 702532174, -272930673, 744051710, 1164315096, 481197437, -702532174, -272930673 + +}; + +/* ---------------------------------------------------------------------- +** Desired gains, in dB, per band +** ------------------------------------------------------------------- */ + +int gainDB[5] = {0, -3, 6, 4, -6}; + +float32_t snr; + + +/* ---------------------------------------------------------------------- + * Graphic equalizer Example + * ------------------------------------------------------------------- */ + +int32_t main(void) +{ + float32_t *inputF32, *outputF32; + arm_biquad_cas_df1_32x64_ins_q31 S1; + arm_biquad_cas_df1_32x64_ins_q31 S2; + arm_biquad_casd_df1_inst_q31 S3; + arm_biquad_casd_df1_inst_q31 S4; + arm_biquad_casd_df1_inst_q31 S5; + int i; + int32_t status; + + inputF32 = &testInput_f32[0]; + outputF32 = &testOutput[0]; + + /* Initialize the state and coefficient buffers for all Biquad sections */ + + arm_biquad_cas_df1_32x64_init_q31(&S1, NUMSTAGES, + (q31_t *) &coeffTable[190*0 + 10*(gainDB[0] + 9)], + &biquadStateBand1Q31[0], 2); + + arm_biquad_cas_df1_32x64_init_q31(&S2, NUMSTAGES, + (q31_t *) &coeffTable[190*1 + 10*(gainDB[1] + 9)], + &biquadStateBand2Q31[0], 2); + + arm_biquad_cascade_df1_init_q31(&S3, NUMSTAGES, + (q31_t *) &coeffTable[190*2 + 10*(gainDB[2] + 9)], + &biquadStateBand3Q31[0], 2); + + arm_biquad_cascade_df1_init_q31(&S4, NUMSTAGES, + (q31_t *) &coeffTable[190*3 + 10*(gainDB[3] + 9)], + &biquadStateBand4Q31[0], 2); + + arm_biquad_cascade_df1_init_q31(&S5, NUMSTAGES, + (q31_t *) &coeffTable[190*4 + 10*(gainDB[4] + 9)], + &biquadStateBand5Q31[0], 2); + + + /* Call the process functions and needs to change filter coefficients + for varying the gain of each band */ + + for(i=0; i < NUMBLOCKS; i++) + { + + /* ---------------------------------------------------------------------- + ** Convert block of input data from float to Q31 + ** ------------------------------------------------------------------- */ + + arm_float_to_q31(inputF32 + (i*BLOCKSIZE), inputQ31, BLOCKSIZE); + + /* ---------------------------------------------------------------------- + ** Scale down by 1/8. This provides additional headroom so that the + ** graphic EQ can apply gain. + ** ------------------------------------------------------------------- */ + + arm_scale_q31(inputQ31, 0x7FFFFFFF, -3, inputQ31, BLOCKSIZE); + + /* ---------------------------------------------------------------------- + ** Call the Q31 Biquad Cascade DF1 32x64 process function for band1, band2 + ** ------------------------------------------------------------------- */ + + arm_biquad_cas_df1_32x64_q31(&S1, inputQ31, outputQ31, BLOCKSIZE); + arm_biquad_cas_df1_32x64_q31(&S2, outputQ31, outputQ31, BLOCKSIZE); + + /* ---------------------------------------------------------------------- + ** Call the Q31 Biquad Cascade DF1 process function for band3, band4, band5 + ** ------------------------------------------------------------------- */ + + arm_biquad_cascade_df1_q31(&S3, outputQ31, outputQ31, BLOCKSIZE); + arm_biquad_cascade_df1_q31(&S4, outputQ31, outputQ31, BLOCKSIZE); + arm_biquad_cascade_df1_q31(&S5, outputQ31, outputQ31, BLOCKSIZE); + + /* ---------------------------------------------------------------------- + ** Convert Q31 result back to float + ** ------------------------------------------------------------------- */ + + arm_q31_to_float(outputQ31, outputF32 + (i * BLOCKSIZE), BLOCKSIZE); + + /* ---------------------------------------------------------------------- + ** Scale back up + ** ------------------------------------------------------------------- */ + + arm_scale_f32(outputF32 + (i * BLOCKSIZE), 8.0f, outputF32 + (i * BLOCKSIZE), BLOCKSIZE); + }; + + snr = arm_snr_f32(testRefOutput_f32, testOutput, TESTLENGTH); + + if (snr < SNR_THRESHOLD_F32) + { + status = ARM_MATH_TEST_FAILURE; + } + else + { + status = ARM_MATH_SUCCESS; + } + + /* ---------------------------------------------------------------------- + ** Loop here if the signal does not match the reference output. + ** ------------------------------------------------------------------- */ + + if ( status != ARM_MATH_SUCCESS) + { + while (1); + } + + while (1); /* main function does not return */ +} + +/** \endlink */ + + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/math_helper.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/math_helper.c new file mode 100644 index 0000000..f615e6f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/math_helper.c @@ -0,0 +1,466 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 b +* +* Project: CMSIS DSP Library +* +* Title: math_helper.c +* +* Description: Definition of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +* Include standard header files +* -------------------------------------------------------------------- */ +#include + +/* ---------------------------------------------------------------------- +* Include project header files +* -------------------------------------------------------------------- */ +#include "math_helper.h" + +/** + * @brief Caluclation of SNR + * @param[in] pRef Pointer to the reference buffer + * @param[in] pTest Pointer to the test buffer + * @param[in] buffSize total number of samples + * @return SNR + * The function Caluclates signal to noise ratio for the reference output + * and test output + */ + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) +{ + float EnergySignal = 0.0, EnergyError = 0.0; + uint32_t i; + float SNR; + int temp; + int *test; + + for (i = 0; i < buffSize; i++) + { + /* Checking for a NAN value in pRef array */ + test = (int *)(&pRef[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + /* Checking for a NAN value in pTest array */ + test = (int *)(&pTest[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + EnergySignal += pRef[i] * pRef[i]; + EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); + } + + /* Checking for a NAN value in EnergyError */ + test = (int *)(&EnergyError); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + + SNR = 10 * log10 (EnergySignal / EnergyError); + + return (SNR); + +} + + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Converts float to fixed in q12.20 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to outputbuffer + * @param[in] numSamples number of samples in the input buffer + * @return none + * The function converts floating point values to fixed point(q12.20) values + */ + +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1048576.0f corresponds to pow(2, 20) */ + pOut[i] = (q31_t) (pIn[i] * 1048576.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 1.0) + { + pOut[i] = 0x000FFFFF; + } + } +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q31 (q31_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q7 (q7_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + + + +/** + * @brief Caluclates number of guard bits + * @param[in] num_adds number of additions + * @return guard bits + * The function Caluclates the number of guard bits + * depending on the numtaps + */ + +uint32_t arm_calc_guard_bits (uint32_t num_adds) +{ + uint32_t i = 1, j = 0; + + if (num_adds == 1) + { + return (0); + } + + while (i < num_adds) + { + i = i * 2; + j++; + } + + return (j); +} + +/** + * @brief Apply guard bits to buffer + * @param[in,out] pIn pointer to input buffer + * @param[in] numSamples number of samples in the input buffer + * @param[in] guard_bits guard bits + * @return none + */ + +void arm_apply_guard_bits (float32_t *pIn, + uint32_t numSamples, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); + } +} + +/** + * @brief Calculates pow(2, numShifts) + * @param[in] numShifts number of shifts + * @return pow(2, numShifts) + */ +uint32_t arm_calc_2pow(uint32_t numShifts) +{ + + uint32_t i, val = 1; + + for (i = 0; i < numShifts; i++) + { + val = val * 2; + } + + return(val); +} + + + +/** + * @brief Converts float to fixed q14 + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q14 (float *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 16384.0f corresponds to pow(2, 14) */ + pOut[i] = (q15_t) (pIn[i] * 16384.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFF; + } + + } + +} + + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q30 (float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q29 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 536870912.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 4.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + + +/** + * @brief Converts float to fixed q28 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q28 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 268435456.0f corresponds to pow(2, 28) */ + pOut[i] = (q31_t) (pIn[i] * 268435456.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 8.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Clip the float values to +/- 1 + * @param[in,out] pIn input buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_clip_f32 (float *pIn, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + if (pIn[i] > 1.0f) + { + pIn[i] = 1.0; + } + else if ( pIn[i] < -1.0f) + { + pIn[i] = -1.0; + } + + } +} + + + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/math_helper.h b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/math_helper.h new file mode 100644 index 0000000..5a18734 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2013 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* +* Title: math_helper.h +* +* Description: Prototypes of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + + +#include "arm_math.h" + +#ifndef MATH_HELPER_H +#define MATH_HELPER_H + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); +void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); +void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_clip_f32(float *pIn, uint32_t numSamples); +uint32_t arm_calc_guard_bits(uint32_t num_adds); +void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); +uint32_t arm_calc_2pow(uint32_t guard_bits); +#endif + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/Abstract.txt new file mode 100644 index 0000000..9062c48 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_linear_interp_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_data.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_data.c new file mode 100644 index 0000000..309326e --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_data.c @@ -0,0 +1,23616 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_linear_interp_data.c +* +* Description: Data file used for example. Generation method described +* below +* +* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +* Table generated from following MATLAB Command +* x = -pi: 0.00005 : (2*pi - 0.00005); +* y = sin(x); +* where pi value is 3.141592653589793 +* --------------------------------------------------------------------*/ + +float arm_linear_interep_table[188495] = { + + +-0.000000000000000122, -0.000049999999979173, -0.000099999999833667, -0.000149999999437717, -0.000199999998666767, -0.000249999997395817, -0.000299999995500311, -0.000349999992854362, +-0.000399999989333412, -0.000449999984812462, -0.000499999979166956, -0.000549999972271007, -0.000599999964000057, -0.000649999954229107, -0.000699999942833602, -0.000749999929687653, +-0.000799999914666704, -0.000849999897645755, -0.000899999878500250, -0.000949999857104302, -0.000999999833333354, -0.001049999807062851, -0.001099999778166904, -0.001149999746520957, +-0.001199999712000011, -0.001249999674479510, -0.001299999633833566, -0.001349999589937622, -0.001399999542666680, -0.001449999491896183, -0.001499999437500243, -0.001549999379354304, +-0.001599999317333367, -0.001649999251312876, -0.001699999181166942, -0.001749999106771011, -0.001799999028000082, -0.001849998944729599, -0.001899998856833675, -0.001949998764187754, +-0.001999998666666836, -0.002049998564146365, -0.002099998456500453, -0.002149998343604546, -0.002199998225334087, -0.002249998101563188, -0.002299997972167294, -0.002349997837021405, +-0.002399997696000966, -0.002449997548980088, -0.002499997395834216, -0.002549997236438351, -0.002599997070667937, -0.002649996898397086, -0.002699996719501243, -0.002749996533855408, +-0.002799996341335026, -0.002849996141814208, -0.002899995935168401, -0.002949995721272604, -0.002999995500002261, -0.003049995271231486, -0.003099995034835722, -0.003149994790690415, +-0.003199994538669677, -0.003249994278648952, -0.003299994010503243, -0.003349993734107991, -0.003399993449337312, -0.003449993156066649, -0.003499992854171003, -0.003549992543525819, +-0.003599992224005209, -0.003649991895484619, -0.003699991557839049, -0.003749991210943944, -0.003799990854673418, -0.003849990488902914, -0.003899990113507434, -0.003949989728362423, +-0.003999989333341993, -0.004049988928321590, -0.004099988513176658, -0.004149988087781312, -0.004199987652010995, -0.004249987205740709, -0.004299986748845899, -0.004349986281200678, +-0.004399985802680492, -0.004449985313160341, -0.004499984812515671, -0.004549984300620594, -0.004599983777350557, -0.004649983242580561, -0.004699982696186050, -0.004749982138041138, +-0.004799981568021272, -0.004849980986001451, -0.004899980391857122, -0.004949979785462398, -0.004999979166692725, -0.005049978535423547, -0.005099977891528979, -0.005149977234884466, +-0.005199976565365011, -0.005249975882846058, -0.005299975187201721, -0.005349974478307446, -0.005399973756038235, -0.005449973020269535, -0.005499972270875456, -0.005549971507731448, +-0.005599970730712511, -0.005649969939694091, -0.005699969134550302, -0.005749968315156590, -0.005799967481387958, -0.005849966633119851, -0.005899965770226383, -0.005949964892583000, +-0.005999964000064706, -0.006049963092546945, -0.006099962169903833, -0.006149961232010816, -0.006199960278743339, -0.006249959309975518, -0.006299958325582797, -0.006349957325440182, +-0.006399956309423117, -0.006449955277405718, -0.006499954229263430, -0.006549953164871257, -0.006599952084104644, -0.006649950986837708, -0.006699949872945895, -0.006749948742304206, +-0.006799947594788089, -0.006849946430271660, -0.006899945248630365, -0.006949944049739206, -0.006999942833473632, -0.007049941599707755, -0.007099940348317025, -0.007149939079176889, +-0.007199937792161461, -0.007249936487146187, -0.007299935164006074, -0.007349933822616566, -0.007399932462851779, -0.007449931084587162, -0.007499929687697716, -0.007549928272058891, +-0.007599926837544801, -0.007649925384030893, -0.007699923911392173, -0.007749922419504085, -0.007799920908240749, -0.007849919377477610, -0.007899917827089672, -0.007949916256952384, +-0.007999914666939863, -0.008049913056927554, -0.008099911426790906, -0.008149909776404035, -0.008199908105642390, -0.008249906414380975, -0.008299904702495238, -0.008349902969859295, +-0.008399901216348595, -0.008449899441838141, -0.008499897646203384, -0.008549895829318437, -0.008599893991058752, -0.008649892131299332, -0.008699890249915625, -0.008749888346781748, +-0.008799886421773151, -0.008849884474764837, -0.008899882505632256, -0.008949880514249525, -0.008999878500492093, -0.009049876464234965, -0.009099874405353590, -0.009149872323722084, +-0.009199870219215898, -0.009249868091710479, -0.009299865941079948, -0.009349863767199750, -0.009399861569944894, -0.009449859349190827, -0.009499857104811669, -0.009549854836682867, +-0.009599852544679429, -0.009649850228676803, -0.009699847888549109, -0.009749845524171793, -0.009799843135419864, -0.009849840722168771, -0.009899838284292632, -0.009949835821666898, +-0.009999833334166574, -0.010049830821667110, -0.010099828284042626, -0.010149825721168572, -0.010199823132920397, -0.010249820519172219, -0.010299817879799491, -0.010349815214677217, +-0.010399812523680850, -0.010449809806684508, -0.010499807063563642, -0.010549804294193258, -0.010599801498448806, -0.010649798676204407, -0.010699795827335511, -0.010749792951717126, +-0.010799790049224703, -0.010849787119732359, -0.010899784163115548, -0.010949781179249277, -0.010999778168008997, -0.011049775129268828, -0.011099772062904221, -0.011149768968790628, +-0.011199765846802169, -0.011249762696814294, -0.011299759518702013, -0.011349756312340777, -0.011399753077604706, -0.011449749814369253, -0.011499746522509425, -0.011549743201900674, +-0.011599739852417123, -0.011649736473934221, -0.011699733066326979, -0.011749729629470847, -0.011799726163239948, -0.011849722667509732, -0.011899719142155211, -0.011949715587051834, +-0.011999712002073726, -0.012049708387096337, -0.012099704741995123, -0.012149701066644201, -0.012199697360919026, -0.012249693624694609, -0.012299689857846402, -0.012349686060248525, +-0.012399682231776434, -0.012449678372305137, -0.012499674481710089, -0.012549670559865410, -0.012599666606646555, -0.012649662621928532, -0.012699658605586799, -0.012749654557495473, +-0.012799650477530011, -0.012849646365565424, -0.012899642221477166, -0.012949638045139357, -0.012999633836427452, -0.013049629595216463, -0.013099625321381845, -0.013149621014797719, +-0.013199616675339540, -0.013249612302882765, -0.013299607897301514, -0.013349603458471243, -0.013399598986266964, -0.013449594480564131, -0.013499589941236869, -0.013549585368160630, +-0.013599580761210430, -0.013649576120261721, -0.013699571445188626, -0.013749566735866605, -0.013799561992170667, -0.013849557213976266, -0.013899552401157530, -0.013949547553589911, +-0.013999542671148425, -0.014049537753708525, -0.014099532801144338, -0.014149527813331319, -0.014199522790144923, -0.014249517731459277, -0.014299512637149837, -0.014349507507091614, +-0.014399502341160067, -0.014449497139229321, -0.014499491901174831, -0.014549486626871612, -0.014599481316195120, -0.014649475969019481, -0.014699470585220153, -0.014749465164672147, +-0.014799459707250922, -0.014849454212830605, -0.014899448681286651, -0.014949443112494076, -0.014999437506328338, -0.015049431862663561, -0.015099426181375206, -0.015149420462338728, +-0.015199414705428255, -0.015249408910519246, -0.015299403077486715, -0.015349397206206119, -0.015399391296551587, -0.015449385348398575, -0.015499379361622101, -0.015549373336097624, +-0.015599367271699268, -0.015649361168302494, -0.015699355025782315, -0.015749348844014195, -0.015799342622872262, -0.015849336362231969, -0.015899330061968333, -0.015949323721956819, +-0.015999317342071551, -0.016049310922187990, -0.016099304462181149, -0.016149297961926493, -0.016199291421298147, -0.016249284840171574, -0.016299278218422232, -0.016349271555924253, +-0.016399264852553091, -0.016449258108183769, -0.016499251322691748, -0.016549244495951149, -0.016599237627837445, -0.016649230718225643, -0.016699223766991209, -0.016749216774008271, +-0.016799209739152290, -0.016849202662298290, -0.016899195543321723, -0.016949188382096723, -0.016999181178498753, -0.017049173932402829, -0.017099166643684417, -0.017149159312217641, +-0.017199151937877969, -0.017249144520540861, -0.017299137060080447, -0.017349129556372193, -0.017399122009291113, -0.017449114418712670, -0.017499106784510998, -0.017549099106561560, +-0.017599091384739373, -0.017649083618919904, -0.017699075808977279, -0.017749067954786969, -0.017799060056223986, -0.017849052113163795, -0.017899044125480532, -0.017949036093049660, +-0.017999028015746196, -0.018049019893445605, -0.018099011726022022, -0.018149003513350907, -0.018198995255307732, -0.018248986951766622, -0.018298978602603044, -0.018348970207692019, +-0.018398961766909014, -0.018448953280128161, -0.018498944747224924, -0.018548936168074327, -0.018598927542551831, -0.018648918870531574, -0.018698910151889018, -0.018748901386499189, +-0.018798892574237547, -0.018848883714978233, -0.018898874808596710, -0.018948865854967998, -0.018998856853967565, -0.019048847805469546, -0.019098838709349409, -0.019148829565482174, +-0.019198820373743309, -0.019248811134006949, -0.019298801846148562, -0.019348792510043615, -0.019398783125566241, -0.019448773692591910, -0.019498764210995646, -0.019548754680652914, +-0.019598745101437852, -0.019648735473225928, -0.019698725795892161, -0.019748716069312028, -0.019798706293359659, -0.019848696467910525, -0.019898686592839651, -0.019948676668022504, +-0.019998666693333219, -0.020048656668647271, -0.020098646593839677, -0.020148636468785914, -0.020198626293360115, -0.020248616067437750, -0.020298605790894288, -0.020348595463603868, +-0.020398585085441959, -0.020448574656283587, -0.020498564176004225, -0.020548553644478006, -0.020598543061580404, -0.020648532427186443, -0.020698521741171597, -0.020748511003410002, +-0.020798500213777129, -0.020848489372148005, -0.020898478478398104, -0.020948467532401559, -0.020998456534033847, -0.021048445483169996, -0.021098434379685473, -0.021148423223454418, +-0.021198412014352307, -0.021248400752254610, -0.021298389437035468, -0.021348378068570352, -0.021398366646734290, -0.021448355171402755, -0.021498343642449892, -0.021548332059751166, +-0.021598320423181612, -0.021648308732616698, -0.021698296987930570, -0.021748285188998701, -0.021798273335696117, -0.021848261427898294, -0.021898249465479372, -0.021948237448314829, +-0.021998225376279691, -0.022048213249249434, -0.022098201067098200, -0.022148188829701463, -0.022198176536934698, -0.022248164188672048, -0.022298151784788989, -0.022348139325160547, +-0.022398126809662203, -0.022448114238168098, -0.022498101610553708, -0.022548088926694063, -0.022598076186464637, -0.022648063389739580, -0.022698050536394364, -0.022748037626304021, +-0.022798024659344031, -0.022848011635388531, -0.022897998554313004, -0.022947985415992481, -0.022997972220302438, -0.023047958967117019, -0.023097945656311705, -0.023147932287761526, +-0.023197918861341957, -0.023247905376927152, -0.023297891834392580, -0.023347878233613725, -0.023397864574464730, -0.023447850856821072, -0.023497837080557787, -0.023547823245550353, +-0.023597809351672917, -0.023647795398800960, -0.023697781386809513, -0.023747767315574056, -0.023797753184968740, -0.023847738994869038, -0.023897724745149989, -0.023947710435687070, +-0.023997696066354435, -0.024047681637027557, -0.024097667147581475, -0.024147652597891669, -0.024197637987832289, -0.024247623317278814, -0.024297608586106724, -0.024347593794190169, +-0.024397578941404627, -0.024447564027625143, -0.024497549052727188, -0.024547534016584920, -0.024597518919073816, -0.024647503760068912, -0.024697488539445693, -0.024747473257078312, +-0.024797457912842245, -0.024847442506612534, -0.024897427038264662, -0.024947411507672778, -0.024997395914712364, -0.025047380259258463, -0.025097364541186551, -0.025147348760370787, +-0.025197332916686650, -0.025247317010009623, -0.025297301040213861, -0.025347285007174848, -0.025397268910767622, -0.025447252750867667, -0.025497236527349136, -0.025547220240087511, +-0.025597203888957840, -0.025647187473835601, -0.025697170994594950, -0.025747154451111372, -0.025797137843259908, -0.025847121170916042, -0.025897104433953929, -0.025947087632249056, +-0.025997070765676464, -0.026047053834111638, -0.026097036837428735, -0.026147019775503239, -0.026197002648210635, -0.026246985455425084, -0.026296968197022069, -0.026346950872876633, +-0.026396933482864263, -0.026446916026859116, -0.026496898504736681, -0.026546880916371998, -0.026596863261640555, -0.026646845540416509, -0.026696827752575352, -0.026746809897992125, +-0.026796791976542320, -0.026846773988100085, -0.026896755932540921, -0.026946737809739864, -0.026996719619572406, -0.027046701361912708, -0.027096683036636253, -0.027146664643618094, +-0.027196646182733715, -0.027246627653857276, -0.027296609056864270, -0.027346590391630184, -0.027396571658029178, -0.027446552855936744, -0.027496533985227927, -0.027546515045778219, +-0.027596496037461778, -0.027646476960154098, -0.027696457813730226, -0.027746438598065654, -0.027796419313034542, -0.027846399958512381, -0.027896380534374220, -0.027946361040495551, +-0.027996341476750536, -0.028046321843014668, -0.028096302139162994, -0.028146282365071010, -0.028196262520612875, -0.028246242605664086, -0.028296222620100130, -0.028346202563795178, +-0.028396182436624718, -0.028446162238463801, -0.028496141969187923, -0.028546121628671248, -0.028596101216789266, -0.028646080733417033, -0.028696060178430041, -0.028746039551702456, +-0.028796018853109770, -0.028845998082527038, -0.028895977239829753, -0.028945956324892084, -0.028995935337589523, -0.029045914277797125, -0.029095893145390381, -0.029145871940243463, +-0.029195850662231865, -0.029245829311231087, -0.029295807887115288, -0.029345786389759970, -0.029395764819040188, -0.029445743174831437, -0.029495721457007882, -0.029545699665445027, +-0.029595677800017921, -0.029645655860602062, -0.029695633847071624, -0.029745611759302099, -0.029795589597168545, -0.029845567360546461, -0.029895545049310013, -0.029945522663334705, +-0.029995500202495588, -0.030045477666668166, -0.030095455055726604, -0.030145432369546407, -0.030195409608002627, -0.030245386770970769, -0.030295363858325000, -0.030345340869940819, +-0.030395317805693732, -0.030445294665457905, -0.030495271449108841, -0.030545248156521602, -0.030595224787571682, -0.030645201342133260, -0.030695177820081833, -0.030745154221292460, +-0.030795130545640648, -0.030845106793000565, -0.030895082963247715, -0.030945059056257156, -0.030995035071904393, -0.031045011010063600, -0.031094986870610280, -0.031144962653419490, +-0.031194938358366741, -0.031244913985326202, -0.031294889534173378, -0.031344865004783770, -0.031394840397031561, -0.031444815710792245, -0.031494790945940897, -0.031544766102353010, +-0.031594741179902762, -0.031644716178465669, -0.031694691097916783, -0.031744665938131605, -0.031794640698984328, -0.031844615380350445, -0.031894589982105023, -0.031944564504123571, +-0.031994538946280265, -0.032044513308450616, -0.032094487590509674, -0.032144461792332962, -0.032194435913794651, -0.032244409954770251, -0.032294383915135269, -0.032344357794763884, +-0.032394331593531604, -0.032444305311313495, -0.032494278947985067, -0.032544252503420502, -0.032594225977495297, -0.032644199370084531, -0.032694172681063713, -0.032744145910307020, +-0.032794119057689960, -0.032844092123087601, -0.032894065106375457, -0.032944038007427706, -0.032994010826119857, -0.033043983562326990, -0.033093956215924598, -0.033143928786786875, +-0.033193901274789335, -0.033243873679807037, -0.033293846001715498, -0.033343818240388901, -0.033393790395702755, -0.033443762467532584, -0.033493734455752558, -0.033543706360238200, +-0.033593678180864575, -0.033643649917507193, -0.033693621570040251, -0.033743593138339245, -0.033793564622279268, -0.033843536021735815, -0.033893507336583077, -0.033943478566696578, +-0.033993449711951375, -0.034043420772222999, -0.034093391747385619, -0.034143362637314767, -0.034193333441885507, -0.034243304160973355, -0.034293274794452495, -0.034343245342198452, +-0.034393215804086739, -0.034443186179991543, -0.034493156469788386, -0.034543126673352333, -0.034593096790558907, -0.034643066821282299, -0.034693036765398019, -0.034743006622781153, +-0.034792976393307209, -0.034842946076850380, -0.034892915673286187, -0.034942885182489711, -0.034992854604336460, -0.035042823938700625, -0.035092793185457737, -0.035142762344482860, +-0.035192731415651525, -0.035242700398837916, -0.035292669293917563, -0.035342638100765975, -0.035392606819257343, -0.035442575449267197, -0.035492543990670616, -0.035542512443343117, +-0.035592480807158891, -0.035642449081993467, -0.035692417267721918, -0.035742385364219767, -0.035792353371361212, -0.035842321289021775, -0.035892289117076537, -0.035942256855401013, +-0.035992224503869408, -0.036042192062357238, -0.036092159530739590, -0.036142126908891986, -0.036192094196688625, -0.036242061394005022, -0.036292028500716271, -0.036341995516697888, +-0.036391962441824077, -0.036441929275970356, -0.036491896019012260, -0.036541862670823974, -0.036591829231281035, -0.036641795700258523, -0.036691762077631966, -0.036741728363275557, +-0.036791694557064832, -0.036841660658874870, -0.036891626668581194, -0.036941592586058017, -0.036991558411180854, -0.037041524143824792, -0.037091489783865367, -0.037141455331176770, +-0.037191420785634539, -0.037241386147113753, -0.037291351415489948, -0.037341316590637316, -0.037391281672431401, -0.037441246660747718, -0.037491211555460480, -0.037541176356445209, +-0.037591141063576999, -0.037641105676731380, -0.037691070195782550, -0.037741034620606045, -0.037790998951076960, -0.037840963187070815, -0.037890927328461818, -0.037940891375125504, +-0.037990855326936968, -0.038040819183771730, -0.038090782945504005, -0.038140746612009321, -0.038190710183162765, -0.038240673658839881, -0.038290637038914874, -0.038340600323263266, +-0.038390563511760609, -0.038440526604281093, -0.038490489600700263, -0.038540452500893212, -0.038590415304735469, -0.038640378012101247, -0.038690340622866082, -0.038740303136905060, +-0.038790265554093727, -0.038840227874306285, -0.038890190097418273, -0.038940152223304790, -0.038990114251841367, -0.039040076182902214, -0.039090038016362870, -0.039139999752098434, +-0.039189961389984436, -0.039239922929895095, -0.039289884371705948, -0.039339845715292532, -0.039389806960529065, -0.039439768107291072, -0.039489729155453658, -0.039539690104892368, +-0.039589650955481413, -0.039639611707096324, -0.039689572359612207, -0.039739532912904607, -0.039789493366847728, -0.039839453721317121, -0.039889413976187872, -0.039939374131335532, +-0.039989334186634320, -0.040039294141959766, -0.040089253997186977, -0.040139213752191497, -0.040189173406847543, -0.040239132961030655, -0.040289092414616375, -0.040339051767478921, +-0.040389011019493840, -0.040438970170536229, -0.040488929220481633, -0.040538888169204278, -0.040588847016579700, -0.040638805762483000, -0.040688764406789736, -0.040738722949374112, +-0.040788681390111679, -0.040838639728877552, -0.040888597965547259, -0.040938556099995034, -0.040988514132096414, -0.041038472061726512, -0.041088429888760873, -0.041138387613073715, +-0.041188345234540590, -0.041238302753036603, -0.041288260168437299, -0.041338217480616897, -0.041388174689450961, -0.041438131794815029, -0.041488088796583319, -0.041538045694631390, +-0.041588002488834347, -0.041637959179067742, -0.041687915765205794, -0.041737872247124060, -0.041787828624697640, -0.041837784897802099, -0.041887741066311650, -0.041937697130101842, +-0.041987653089047797, -0.042037608943025065, -0.042087564691907858, -0.042137520335571749, -0.042187475873891836, -0.042237431306743671, -0.042287386634001493, -0.042337341855540847, +-0.042387296971237283, -0.042437251980965041, -0.042487206884599664, -0.042537161682016274, -0.042587116373090421, -0.042637070957696331, -0.042687025435709569, -0.042736979807005242, +-0.042786934071458907, -0.042836888228944790, -0.042886842279338457, -0.042936796222515020, -0.042986750058350030, -0.043036703786717728, -0.043086657407493664, -0.043136610920552952, +-0.043186564325771164, -0.043236517623022518, -0.043286470812182579, -0.043336423893126905, -0.043386376865729728, -0.043436329729866607, -0.043486282485412663, -0.043536235132243459, +-0.043586187670233222, -0.043636140099257516, -0.043686092419191462, -0.043736044629910618, -0.043785996731289217, -0.043835948723202824, -0.043885900605526565, -0.043935852378135992, +-0.043985804040905345, -0.044035755593710195, -0.044085707036425649, -0.044135658368927279, -0.044185609591089324, -0.044235560702787342, -0.044285511703896455, -0.044335462594292240, +-0.044385413373848923, -0.044435364042442069, -0.044485314599947250, -0.044535265046238698, -0.044585215381191985, -0.044635165604682239, -0.044685115716585018, -0.044735065716774568, +-0.044785015605126446, -0.044834965381515789, -0.044884915045818166, -0.044934864597907805, -0.044984814037660290, -0.045034763364950735, -0.045084712579654712, -0.045134661681646468, +-0.045184610670801574, -0.045234559546995151, -0.045284508310102771, -0.045334456959998673, -0.045384405496558436, -0.045434353919657632, -0.045484302229170492, -0.045534250424972604, +-0.045584198506939087, -0.045634146474945521, -0.045684094328866137, -0.045734042068576522, -0.045783989693951803, -0.045833937204867552, -0.045883884601198015, -0.045933831882818764, +-0.045983779049604941, -0.046033726101432110, -0.046083673038174518, -0.046133619859707743, -0.046183566565906921, -0.046233513156647622, -0.046283459631804101, -0.046333405991251929, +-0.046383352234866684, -0.046433298362522614, -0.046483244374095303, -0.046533190269459880, -0.046583136048491923, -0.046633081711065685, -0.046683027257056739, -0.046732972686340225, +-0.046782917998791723, -0.046832863194285486, -0.046882808272697092, -0.046932753233901670, -0.046982698077774818, -0.047032642804190769, -0.047082587413025116, -0.047132531904152994, +-0.047182476277449988, -0.047232420532790344, -0.047282364670049655, -0.047332308689103049, -0.047382252589826118, -0.047432196372093109, -0.047482140035779608, -0.047532083580761206, +-0.047582027006912150, -0.047631970314108020, -0.047681913502223970, -0.047731856571135579, -0.047781799520717101, -0.047831742350844128, -0.047881685061391802, -0.047931627652235700, +-0.047981570123250085, -0.048031512474310548, -0.048081454705292230, -0.048131396816070718, -0.048181338806520271, -0.048231280676516476, -0.048281222425934481, -0.048331164054649871, +-0.048381105562536907, -0.048431046949471181, -0.048480988215328286, -0.048530929359982468, -0.048580870383309334, -0.048630811285184018, -0.048680752065482120, -0.048730692724077894, +-0.048780633260846945, -0.048830573675664408, -0.048880513968405877, -0.048930454138945624, -0.048980394187159236, -0.049030334112921854, -0.049080273916109085, -0.049130213596595189, +-0.049180153154255758, -0.049230092588965949, -0.049280031900601345, -0.049329971089036223, -0.049379910154146167, -0.049429849095806784, -0.049479787913892334, -0.049529726608278417, +-0.049579665178840181, -0.049629603625453225, -0.049679541947991818, -0.049729480146331551, -0.049779418220347586, -0.049829356169915524, -0.049879293994909625, -0.049929231695205488, +-0.049979169270678275, -0.050029106721203580, -0.050079044046655675, -0.050128981246910162, -0.050178918321842195, -0.050228855271327380, -0.050278792095239978, -0.050328728793455596, +-0.050378665365849389, -0.050428601812296969, -0.050478538132672598, -0.050528474326851883, -0.050578410394710421, -0.050628346336122496, -0.050678282150963705, -0.050728217839109205, +-0.050778153400434602, -0.050828088834814177, -0.050878024142123529, -0.050927959322237815, -0.050977894375032654, -0.051027829300382306, -0.051077764098162393, -0.051127698768248062, +-0.051177633310514933, -0.051227567724837275, -0.051277502011090700, -0.051327436169150371, -0.051377370198891888, -0.051427304100189544, -0.051477237872918934, -0.051527171516955676, +-0.051577105032174046, -0.051627038418449650, -0.051676971675657664, -0.051726904803673687, -0.051776837802372008, -0.051826770671628226, -0.051876703411317525, -0.051926636021315510, +-0.051976568501496463, -0.052026500851735991, -0.052076433071909262, -0.052126365161891904, -0.052176297121558184, -0.052226228950783722, -0.052276160649443688, -0.052326092217413696, +-0.052376023654568026, -0.052425954960782298, -0.052475886135932133, -0.052525817179891805, -0.052575748092536935, -0.052625678873742691, -0.052675609523384695, -0.052725540041337234, +-0.052775470427475921, -0.052825400681675933, -0.052875330803812882, -0.052925260793761066, -0.052975190651396095, -0.053025120376593154, -0.053075049969227850, -0.053124979429174476, +-0.053174908756308654, -0.053224837950505567, -0.053274767011640821, -0.053324695939588718, -0.053374624734224871, -0.053424553395424908, -0.053474481923063123, -0.053524410317015131, +-0.053574338577156107, -0.053624266703361685, -0.053674194695506154, -0.053724122553465134, -0.053774050277113808, -0.053823977866327796, -0.053873905320981401, -0.053923832640950242, +-0.053973759826109496, -0.054023686876334805, -0.054073613791500441, -0.054123540571482054, -0.054173467216154805, -0.054223393725394337, -0.054273320099074943, -0.054323246337072244, +-0.054373172439261881, -0.054423098405518136, -0.054473024235716642, -0.054522949929732598, -0.054572875487441615, -0.054622800908718003, -0.054672726193437382, -0.054722651341474957, +-0.054772576352706340, -0.054822501227005840, -0.054872425964249086, -0.054922350564311266, -0.054972275027068015, -0.055022199352393636, -0.055072123540163755, -0.055122047590253562, +-0.055171971502538698, -0.055221895276893460, -0.055271818913193486, -0.055321742411313962, -0.055371665771130528, -0.055421588992517486, -0.055471512075350470, -0.055521435019505121, +-0.055571357824855741, -0.055621280491277958, -0.055671203018646982, -0.055721125406838441, -0.055771047655726637, -0.055820969765187224, -0.055870891735095379, -0.055920813565326750, +-0.055970735255755640, -0.056020656806257701, -0.056070578216708113, -0.056120499486982521, -0.056170420616955243, -0.056220341606501911, -0.056270262455497724, -0.056320183163818323, +-0.056370103731338023, -0.056420024157932465, -0.056469944443477291, -0.056519864587846809, -0.056569784590916668, -0.056619704452562064, -0.056669624172658639, -0.056719543751080716, +-0.056769463187703935, -0.056819382482403487, -0.056869301635055033, -0.056919220645532884, -0.056969139513712679, -0.057019058239469622, -0.057068976822679369, -0.057118895263216229, +-0.057168813560955850, -0.057218731715773435, -0.057268649727544640, -0.057318567596143774, -0.057368485321446491, -0.057418402903328433, -0.057468320341663930, -0.057518237636328622, +-0.057568154787197720, -0.057618071794146873, -0.057667988657050410, -0.057717905375783973, -0.057767821950222766, -0.057817738380242456, -0.057867654665717354, -0.057917570806523114, +-0.057967486802534947, -0.058017402653628508, -0.058067318359678120, -0.058117233920559432, -0.058167149336147660, -0.058217064606318460, -0.058266979730946154, -0.058316894709906399, +-0.058366809543074410, -0.058416724230325838, -0.058466638771535011, -0.058516553166577591, -0.058566467415329226, -0.058616381517664254, -0.058666295473458328, -0.058716209282586661, +-0.058766122944924913, -0.058816036460347415, -0.058865949828729829, -0.058915863049947365, -0.058965776123875685, -0.059015689050389127, -0.059065601829363344, -0.059115514460673556, +-0.059165426944195423, -0.059215339279803283, -0.059265251467372798, -0.059315163506779178, -0.059365075397898093, -0.059414987140603878, -0.059464898734772197, -0.059514810180278710, +-0.059564721476997755, -0.059614632624804993, -0.059664543623575657, -0.059714454473185401, -0.059764365173508562, -0.059814275724420815, -0.059864186125797379, -0.059914096377513916, +-0.059964006479444776, -0.060013916431465614, -0.060063826233451661, -0.060113735885278588, -0.060163645386820737, -0.060213554737953763, -0.060263463938552905, -0.060313372988493832, +-0.060363281887650888, -0.060413190635899734, -0.060463099233116047, -0.060513007679174169, -0.060562915973949770, -0.060612824117318082, -0.060662732109154779, -0.060712639949334200, +-0.060762547637732020, -0.060812455174223477, -0.060862362558684234, -0.060912269790988648, -0.060962176871012380, -0.061012083798630670, -0.061061990573719201, -0.061111897196152308, +-0.061161803665805668, -0.061211709982554520, -0.061261616146274546, -0.061311522156840083, -0.061361428014126820, -0.061411333718009983, -0.061461239268365254, -0.061511144665066991, +-0.061561049907990856, -0.061610954997012544, -0.061660859932006401, -0.061710764712848115, -0.061760669339412912, -0.061810573811576473, -0.061860478129213164, -0.061910382292198654, +-0.061960286300408195, -0.062010190153717455, -0.062060093852000807, -0.062109997395133919, -0.062159900782992036, -0.062209804015450842, -0.062259707092384702, -0.062309610013669289, +-0.062359512779179851, -0.062409415388792078, -0.062459317842380319, -0.062509220139820271, -0.062559122280987617, -0.062609024265756708, -0.062658926094003239, -0.062708827765602451, +-0.062758729280430040, -0.062808630638360369, -0.062858531839269122, -0.062908432883031537, -0.062958333769523311, -0.063008234498618809, -0.063058135070193727, -0.063108035484123304, +-0.063157935740283236, -0.063207835838547888, -0.063257735778792956, -0.063307635560893666, -0.063357535184725741, -0.063407434650163547, -0.063457333957082751, -0.063507233105359065, +-0.063557132094866853, -0.063607030925481811, -0.063656929597079193, -0.063706828109534694, -0.063756726462722679, -0.063806624656518859, -0.063856522690798473, -0.063906420565437216, +-0.063956318280309468, -0.064006215835290925, -0.064056113230256839, -0.064106010465082922, -0.064155907539643522, -0.064205804453814366, -0.064255701207470692, -0.064305597800488210, +-0.064355494232741298, -0.064405390504105639, -0.064455286614456500, -0.064505182563669605, -0.064555078351619291, -0.064604973978181296, -0.064654869443231303, -0.064704764746643703, +-0.064754659888294180, -0.064804554868058001, -0.064854449685810889, -0.064904344341427209, -0.064954238834782671, -0.065004133165752528, -0.065054027334212505, -0.065103921340036966, +-0.065153815183101621, -0.065203708863281737, -0.065253602380453024, -0.065303495734489861, -0.065353388925267972, -0.065403281952663039, -0.065453174816549470, -0.065503067516802946, +-0.065552960053298776, -0.065602852425912628, -0.065652744634518923, -0.065702636678993342, -0.065752528559211182, -0.065802420275048137, -0.065852311826378601, -0.065902203213078284, +-0.065952094435022451, -0.066001985492086829, -0.066051876384145808, -0.066101767111075085, -0.066151657672749956, -0.066201548069046129, -0.066251438299837970, -0.066301328365001230, +-0.066351218264411163, -0.066401107997943493, -0.066450997565472611, -0.066500886966874243, -0.066550776202024098, -0.066600665270796555, -0.066650554173067367, -0.066700442908711785, +-0.066750331477605535, -0.066800219879623021, -0.066850108114639956, -0.066899996182531618, -0.066949884083173733, -0.066999771816440706, -0.067049659382208235, -0.067099546780351613, +-0.067149434010746578, -0.067199321073267509, -0.067249207967790145, -0.067299094694189751, -0.067348981252342066, -0.067398867642121496, -0.067448753863403738, -0.067498639916064113, +-0.067548525799978318, -0.067598411515020773, -0.067648297061067189, -0.067698182437993318, -0.067748067645673551, -0.067797952683983601, -0.067847837552798773, -0.067897722251994794, +-0.067947606781446068, -0.067997491141028335, -0.068047375330616861, -0.068097259350087397, -0.068147143199314336, -0.068197026878173431, -0.068246910386539947, -0.068296793724289637, +-0.068346676891296892, -0.068396559887437453, -0.068446442712587069, -0.068496325366620134, -0.068546207849412372, -0.068596090160839104, -0.068645972300776043, -0.068695854269097620, +-0.068745736065679547, -0.068795617690397146, -0.068845499143126140, -0.068895380423740937, -0.068945261532117288, -0.068995142468130488, -0.069045023231656275, -0.069094903822569068, +-0.069144784240744592, -0.069194664486058155, -0.069244544558385496, -0.069294424457601034, -0.069344304183580521, -0.069394183736199239, -0.069444063115332938, -0.069493942320856039, +-0.069543821352644294, -0.069593700210573428, -0.069643578894517874, -0.069693457404353371, -0.069743335739955226, -0.069793213901199178, -0.069843091887959660, -0.069892969700112398, +-0.069942847337532726, -0.069992724800096370, -0.070042602087677777, -0.070092479200152658, -0.070142356137396347, -0.070192232899284598, -0.070242109485691817, -0.070291985896493756, +-0.070341862131565736, -0.070391738190783509, -0.070441614074021483, -0.070491489781155436, -0.070541365312061094, -0.070591240666612903, -0.070641115844686603, -0.070690990846157514, +-0.070740865670901404, -0.070790740318792678, -0.070840614789707101, -0.070890489083519984, -0.070940363200107090, -0.070990237139342854, -0.071040110901103015, -0.071089984485262894, +-0.071139857891698272, -0.071189731120283539, -0.071239604170894505, -0.071289477043406435, -0.071339349737695137, -0.071389222253635004, -0.071439094591101829, -0.071488966749971350, +-0.071538838730118015, -0.071588710531417590, -0.071638582153745384, -0.071688453596977161, -0.071738324860987371, -0.071788195945651764, -0.071838066850845664, -0.071887937576444835, +-0.071937808122323726, -0.071987678488358103, -0.072037548674423274, -0.072087418680395018, -0.072137288506147770, -0.072187158151557310, -0.072237027616498944, -0.072286896900848469, +-0.072336766004480288, -0.072386634927270210, -0.072436503669093530, -0.072486372229826040, -0.072536240609342176, -0.072586108807517716, -0.072635976824228413, -0.072685844659348742, +-0.072735712312754441, -0.072785579784320875, -0.072835447073923795, -0.072885314181437663, -0.072935181106738231, -0.072985047849700863, -0.073034914410201310, -0.073084780788114020, +-0.073134646983314788, -0.073184512995678935, -0.073234378825082241, -0.073284244471399168, -0.073334109934505468, -0.073383975214276503, -0.073433840310588042, -0.073483705223314544, +-0.073533569952331776, -0.073583434497515518, -0.073633298858740245, -0.073683163035881710, -0.073733027028815276, -0.073782890837416723, -0.073832754461560485, -0.073882617901122369, +-0.073932481155977711, -0.073982344226002292, -0.074032207111070572, -0.074082069811058332, -0.074131932325840921, -0.074181794655294106, -0.074231656799292375, -0.074281518757711509, +-0.074331380530426830, -0.074381242117314159, -0.074431103518247929, -0.074480964733103935, -0.074530825761757985, -0.074580686604084512, -0.074630547259959337, -0.074680407729257797, +-0.074730268011855672, -0.074780128107627436, -0.074829988016448870, -0.074879847738195351, -0.074929707272742646, -0.074979566619965229, -0.075029425779738895, -0.075079284751938993, +-0.075129143536441331, -0.075179002133120371, -0.075228860541851891, -0.075278718762511271, -0.075328576794974303, -0.075378434639115435, -0.075428292294810489, -0.075478149761934815, +-0.075528007040364192, -0.075577864129973124, -0.075627721030637390, -0.075677577742232813, -0.075727434264633825, -0.075777290597716263, -0.075827146741355475, -0.075877002695427256, +-0.075926858459806096, -0.075976714034367787, -0.076026569418987694, -0.076076424613541610, -0.076126279617904039, -0.076176134431950759, -0.076225989055557150, -0.076275843488599004, +-0.076325697730950798, -0.076375551782488366, -0.076425405643087044, -0.076475259312622654, -0.076525112790969671, -0.076574966078003903, -0.076624819173601172, -0.076674672077635939, +-0.076724524789984039, -0.076774377310520822, -0.076824229639122096, -0.076874081775662365, -0.076923933720017421, -0.076973785472062642, -0.077023637031673850, -0.077073488398725520, +-0.077123339573093461, -0.077173190554653062, -0.077223041343280133, -0.077272891938849148, -0.077322742341235942, -0.077372592550315866, -0.077422442565964769, -0.077472292388057112, +-0.077522142016468731, -0.077571991451075434, -0.077621840691751709, -0.077671689738373392, -0.077721538590815847, -0.077771387248954896, -0.077821235712665041, -0.077871083981822090, +-0.077920932056301434, -0.077970779935978882, -0.078020627620728950, -0.078070475110427445, -0.078120322404949746, -0.078170169504171688, -0.078220016407967760, -0.078269863116213798, +-0.078319709628785178, -0.078369555945557723, -0.078419402066405935, -0.078469247991205637, -0.078519093719832234, -0.078568939252161518, -0.078618784588068036, -0.078668629727427580, +-0.078718474670115987, -0.078768319416007773, -0.078818163964978760, -0.078868008316904326, -0.078917852471660319, -0.078967696429121242, -0.079017540189162933, -0.079067383751660766, +-0.079117227116490579, -0.079167070283526875, -0.079216913252645516, -0.079266756023721852, -0.079316598596631746, -0.079366440971249716, -0.079416283147451569, -0.079466125125113155, +-0.079515966904108989, -0.079565808484314909, -0.079615649865606306, -0.079665491047859027, -0.079715332030947578, -0.079765172814747792, -0.079815013399135076, -0.079864853783985265, +-0.079914693969172876, -0.079964533954573758, -0.080014373740063302, -0.080064213325517358, -0.080114052710810443, -0.080163891895818393, -0.080213730880416598, -0.080263569664480935, +-0.080313408247885895, -0.080363246630507340, -0.080413084812220675, -0.080462922792901737, -0.080512760572425041, -0.080562598150666451, -0.080612435527501802, -0.080662272702805626, +-0.080712109676453772, -0.080761946448321645, -0.080811783018285080, -0.080861619386218636, -0.080911455551998121, -0.080961291515498982, -0.081011127276597053, -0.081060962835166867, +-0.081110798191084271, -0.081160633344224672, -0.081210468294463947, -0.081260303041676599, -0.081310137585738490, -0.081359971926525040, -0.081409806063912113, -0.081459639997774225, +-0.081509473727987225, -0.081559307254426547, -0.081609140576968053, -0.081658973695486248, -0.081708806609857021, -0.081758639319956222, -0.081808471825658369, -0.081858304126839351, +-0.081908136223374561, -0.081957968115139876, -0.082007799802009840, -0.082057631283860288, -0.082107462560566669, -0.082157293632004830, -0.082207124498049317, -0.082256955158575992, +-0.082306785613460276, -0.082356615862578045, -0.082406445905803830, -0.082456275743013493, -0.082506105374082914, -0.082555934798886635, -0.082605764017300506, -0.082655593029199975, +-0.082705421834460904, -0.082755250432957839, -0.082805078824566655, -0.082854907009162759, -0.082904734986622042, -0.082954562756819047, -0.083004390319629640, -0.083054217674929265, +-0.083104044822593787, -0.083153871762497750, -0.083203698494517031, -0.083253525018527078, -0.083303351334403752, -0.083353177442021600, -0.083403003341256499, -0.083452829031983894, +-0.083502654514079663, -0.083552479787418352, -0.083602304851875850, -0.083652129707328007, -0.083701954353649410, -0.083751778790715936, -0.083801603018403004, -0.083851427036586504, +-0.083901250845141009, -0.083951074443942370, -0.084000897832866059, -0.084050721011787927, -0.084100543980582573, -0.084150366739125848, -0.084200189287293198, -0.084250011624960527, +-0.084299833752002382, -0.084349655668294651, -0.084399477373712783, -0.084449298868132669, -0.084499120151428866, -0.084548941223477253, -0.084598762084153289, -0.084648582733332867, +-0.084698403170890543, -0.084748223396702210, -0.084798043410643759, -0.084847863212589761, -0.084897682802416108, -0.084947502179998247, -0.084997321345212068, -0.085047140297932144, +-0.085096959038034381, -0.085146777565394210, -0.085196595879887538, -0.085246413981388935, -0.085296231869774294, -0.085346049544919075, -0.085395867006699169, -0.085445684254989163, +-0.085495501289664946, -0.085545318110602411, -0.085595134717676144, -0.085644951110762035, -0.085694767289735560, -0.085744583254472595, -0.085794399004847741, -0.085844214540736888, +-0.085894029862015484, -0.085943844968559460, -0.085993659860243390, -0.086043474536943151, -0.086093288998534245, -0.086143103244892549, -0.086192917275892650, -0.086242731091410452, +-0.086292544691321443, -0.086342358075501502, -0.086392171243825228, -0.086441984196168525, -0.086491796932406870, -0.086541609452416152, -0.086591421756070971, -0.086641233843247234, +-0.086691045713820872, -0.086740857367666430, -0.086790668804659854, -0.086840480024676606, -0.086890291027592603, -0.086940101813282433, -0.086989912381622000, -0.087039722732486793, +-0.087089532865752717, -0.087139342781294371, -0.087189152478987661, -0.087238961958708075, -0.087288771220331532, -0.087338580263732604, -0.087388389088787238, -0.087438197695370895, +-0.087488006083359507, -0.087537814252627646, -0.087587622203051260, -0.087637429934506253, -0.087687237446867239, -0.087737044740010137, -0.087786851813810407, -0.087836658668143996, +-0.087886465302885491, -0.087936271717910838, -0.087986077913095498, -0.088035883888315403, -0.088085689643445153, -0.088135495178360682, -0.088185300492937477, -0.088235105587051457, +-0.088284910460577223, -0.088334715113390735, -0.088384519545367440, -0.088434323756383298, -0.088484127746312896, -0.088533931515032194, -0.088583735062417082, -0.088633538388342203, +-0.088683341492683476, -0.088733144375316403, -0.088782947036116902, -0.088832749474959588, -0.088882551691720407, -0.088932353686274848, -0.088982155458498843, -0.089031957008267007, +-0.089081758335455272, -0.089131559439939154, -0.089181360321594572, -0.089231160980296154, -0.089280961415919832, -0.089330761628341096, -0.089380561617435905, -0.089430361383078874, +-0.089480160925145935, -0.089529960243512591, -0.089579759338054787, -0.089629558208647153, -0.089679356855165607, -0.089729155277486122, -0.089778953475483314, -0.089828751449033115, +-0.089878549198011026, -0.089928346722293023, -0.089978144021753706, -0.090027941096269021, -0.090077737945714498, -0.090127534569966056, -0.090177330968898350, -0.090227127142387301, +-0.090276923090308450, -0.090326718812537732, -0.090376514308949760, -0.090426309579420522, -0.090476104623825493, -0.090525899442040647, -0.090575694033940626, -0.090625488399401349, +-0.090675282538298804, -0.090725076450507619, -0.090774870135903726, -0.090824663594362670, -0.090874456825760383, -0.090924249829971521, -0.090974042606872044, -0.091023835156337454, +-0.091073627478243713, -0.091123419572465461, -0.091173211438878660, -0.091223003077358839, -0.091272794487781944, -0.091322585670022619, -0.091372376623956836, -0.091422167349460112, +-0.091471957846408408, -0.091521748114676379, -0.091571538154139959, -0.091621327964675148, -0.091671117546156575, -0.091720906898460214, -0.091770696021461567, -0.091820484915036638, +-0.091870273579060052, -0.091920062013407786, -0.091969850217955354, -0.092019638192578745, -0.092069425937152602, -0.092119213451552884, -0.092169000735655135, -0.092218787789335330, +-0.092268574612468124, -0.092318361204929464, -0.092368147566594908, -0.092417933697340429, -0.092467719597040671, -0.092517505265571606, -0.092567290702808780, -0.092617075908628180, +-0.092666860882904434, -0.092716645625513544, -0.092766430136331485, -0.092816214415232912, -0.092865998462093799, -0.092915782276789677, -0.092965565859196561, -0.093015349209189080, +-0.093065132326643221, -0.093114915211434529, -0.093164697863439005, -0.093214480282531278, -0.093264262468587364, -0.093314044421482792, -0.093363826141093550, -0.093413607627294296, +-0.093463388879961029, -0.093513169898969725, -0.093562950684195054, -0.093612731235513016, -0.093662511552799144, -0.093712291635929437, -0.093762071484778553, -0.093811851099222493, +-0.093861630479136815, -0.093911409624397493, -0.093961188534879211, -0.094010967210457944, -0.094060745651009275, -0.094110523856409167, -0.094160301826532330, -0.094210079561254725, +-0.094259857060451924, -0.094309634323999914, -0.094359411351773378, -0.094409188143648320, -0.094458964699500297, -0.094508741019205297, -0.094558517102638004, -0.094608292949674419, +-0.094658068560190545, -0.094707843934061051, -0.094757619071161953, -0.094807393971368809, -0.094857168634557607, -0.094906943060603058, -0.094956717249381151, -0.095006491200767443, +-0.095056264914637950, -0.095106038390867356, -0.095155811629331663, -0.095205584629906442, -0.095255357392467710, -0.095305129916890136, -0.095354902203049735, -0.095404674250822080, +-0.095454446060083187, -0.095504217630707725, -0.095553988962571723, -0.095603760055550754, -0.095653530909520820, -0.095703301524356618, -0.095753071899934178, -0.095802842036129487, +-0.095852611932817244, -0.095902381589873478, -0.095952151007173761, -0.096001920184594094, -0.096051689122009204, -0.096101457819295077, -0.096151226276327315, -0.096200994492981917, +-0.096250762469133597, -0.096300530204658383, -0.096350297699431819, -0.096400064953329978, -0.096449831966227514, -0.096499598738000486, -0.096549365268524895, -0.096599131557675438, +-0.096648897605328174, -0.096698663411358646, -0.096748428975642911, -0.096798194298055668, -0.096847959378472931, -0.096897724216770301, -0.096947488812823793, -0.096997253166508118, +-0.097047017277699321, -0.097096781146272987, -0.097146544772105131, -0.097196308155070479, -0.097246071295045047, -0.097295834191904434, -0.097345596845524685, -0.097395359255780509, +-0.097445121422547923, -0.097494883345702540, -0.097544645025120391, -0.097594406460676186, -0.097644167652245956, -0.097693928599705757, -0.097743689302930301, -0.097793449761795617, +-0.097843209976177306, -0.097892969945951411, -0.097942729670992656, -0.097992489151177073, -0.098042248386380260, -0.098092007376478274, -0.098141766121345828, -0.098191524620858978, +-0.098241282874893296, -0.098291040883324854, -0.098340798646028377, -0.098390556162879894, -0.098440313433755033, -0.098490070458529824, -0.098539827237078992, -0.098589583769278594, +-0.098639340055004243, -0.098689096094131970, -0.098738851886536527, -0.098788607432093958, -0.098838362730680307, -0.098888117782170298, -0.098937872586440004, -0.098987627143365023, +-0.099037381452821427, -0.099087135514683927, -0.099136889328828595, -0.099186642895131030, -0.099236396213467304, -0.099286149283712141, -0.099335902105741614, -0.099385654679431334, +-0.099435407004657347, -0.099485159081294405, -0.099534910909218566, -0.099584662488305900, -0.099634413818431120, -0.099684164899470323, -0.099733915731299097, -0.099783666313793540, +-0.099833416646828363, -0.099883166730279652, -0.099932916564023019, -0.099982666147934537, -0.100032415481888940, -0.100082164565762330, -0.100131913399430280, -0.100181661982768900, +-0.100231410315652930, -0.100281158397958430, -0.100330906229561020, -0.100380653810336800, -0.100430401140160510, -0.100480148218908200, -0.100529895046455530, -0.100579641622678570, +-0.100629387947452050, -0.100679134020652070, -0.100728879842154700, -0.100778625411834670, -0.100828370729568100, -0.100878115795230590, -0.100927860608698240, -0.100977605169845790, +-0.101027349478549330, -0.101077093534684480, -0.101126837338127360, -0.101176580888752700, -0.101226324186436580, -0.101276067231054660, -0.101325810022483000, -0.101375552560596400, +-0.101425294845270890, -0.101475036876382150, -0.101524778653806270, -0.101574520177418000, -0.101624261447093430, -0.101674002462708630, -0.101723743224138390, -0.101773483731258800, +-0.101823223983945500, -0.101872963982074590, -0.101922703725520810, -0.101972443214160280, -0.102022182447868630, -0.102071921426521980, -0.102121660149995090, -0.102171398618164040, +-0.102221136830904490, -0.102270874788092550, -0.102320612489602970, -0.102370349935311870, -0.102420087125094890, -0.102469824058828120, -0.102519560736386360, -0.102569297157645710, +-0.102619033322482250, -0.102668769230770760, -0.102718504882387360, -0.102768240277207680, -0.102817975415107860, -0.102867710295962640, -0.102917444919648160, -0.102967179286040060, +-0.103016913395014450, -0.103066647246446120, -0.103116380840211170, -0.103166114176185280, -0.103215847254244530, -0.103265580074263730, -0.103315312636118970, -0.103365044939685930, +-0.103414776984840720, -0.103464508771458140, -0.103514240299414280, -0.103563971568584810, -0.103613702578845860, -0.103663433330072220, -0.103713163822139990, -0.103762894054925280, +-0.103812624028302910, -0.103862353742148970, -0.103912083196339160, -0.103961812390749570, -0.104011541325255020, -0.104061269999731600, -0.104110998414055010, -0.104160726568101370, +-0.104210454461745470, -0.104260182094863430, -0.104309909467330940, -0.104359636579024130, -0.104409363429817770, -0.104459090019588000, -0.104508816348210510, -0.104558542415561420, +-0.104608268221515530, -0.104657993765948980, -0.104707719048737880, -0.104757444069757040, -0.104807168828882590, -0.104856893325990230, -0.104906617560956070, -0.104956341533654920, +-0.105006065243962910, -0.105055788691755750, -0.105105511876909560, -0.105155234799299140, -0.105204957458800640, -0.105254679855289730, -0.105304401988642590, -0.105354123858733980, +-0.105403845465440070, -0.105453566808636550, -0.105503287888199540, -0.105553008704003890, -0.105602729255925700, -0.105652449543841150, -0.105702169567625020, -0.105751889327153460, +-0.105801608822302190, -0.105851328052947320, -0.105901047018963700, -0.105950765720227480, -0.106000484156614320, -0.106050202328000400, -0.106099920234260540, -0.106149637875270870, +-0.106199355250907110, -0.106249072361045400, -0.106298789205560570, -0.106348505784328760, -0.106398222097225700, -0.106447938144127520, -0.106497653924909050, -0.106547369439446440, +-0.106597084687615420, -0.106646799669292120, -0.106696514384351390, -0.106746228832669360, -0.106795943014122210, -0.106845656928584750, -0.106895370575933170, -0.106945083956043140, +-0.106994797068790850, -0.107044509914051120, -0.107094222491700130, -0.107143934801613580, -0.107193646843667630, -0.107243358617737110, -0.107293070123698210, -0.107342781361426620, +-0.107392492330798530, -0.107442203031688760, -0.107491913463973490, -0.107541623627528430, -0.107591333522229770, -0.107641043147952320, -0.107690752504572260, -0.107740461591965760, +-0.107790170410007670, -0.107839878958574160, -0.107889587237540940, -0.107939295246784210, -0.107989002986178780, -0.108038710455600860, -0.108088417654926150, -0.108138124584030840, +-0.108187831242789790, -0.108237537631079140, -0.108287243748774660, -0.108336949595752520, -0.108386655171887540, -0.108436360477055950, -0.108486065511133430, -0.108535770273996220, +-0.108585474765519120, -0.108635178985578340, -0.108684882934050060, -0.108734586610809120, -0.108784290015731710, -0.108833993148693590, -0.108883696009570920, -0.108933398598238570, +-0.108983100914572720, -0.109032802958449120, -0.109082504729743970, -0.109132206228332100, -0.109181907454089720, -0.109231608406892570, -0.109281309086616830, -0.109331009493137380, +-0.109380709626330420, -0.109430409486071680, -0.109480109072237350, -0.109529808384702320, -0.109579507423342760, -0.109629206188034430, -0.109678904678653530, -0.109728602895074930, +-0.109778300837174810, -0.109827998504829380, -0.109877695897913520, -0.109927393016303430, -0.109977089859874840, -0.110026786428503970, -0.110076482722065700, -0.110126178740436220, +-0.110175874483491300, -0.110225569951107120, -0.110275265143158580, -0.110324960059521890, -0.110374654700072780, -0.110424349064687480, -0.110474043153240870, -0.110523736965609160, +-0.110573430501668540, -0.110623123761293910, -0.110672816744361450, -0.110722509450746960, -0.110772201880326650, -0.110821894032975390, -0.110871585908569380, -0.110921277506984410, +-0.110970968828096710, -0.111020659871781110, -0.111070350637913890, -0.111120041126370780, -0.111169731337028010, -0.111219421269760480, -0.111269110924444390, -0.111318800300955510, +-0.111368489399170090, -0.111418178218962990, -0.111467866760210450, -0.111517555022788250, -0.111567243006572600, -0.111616930711438400, -0.111666618137261860, -0.111716305283919240, +-0.111765992151285400, -0.111815678739236590, -0.111865365047648570, -0.111915051076397580, -0.111964736825358540, -0.112014422294407640, -0.112064107483420690, -0.112113792392273910, +-0.112163477020842210, -0.112213161369001820, -0.112262845436628520, -0.112312529223598560, -0.112362212729786830, -0.112411895955069560, -0.112461578899322550, -0.112511261562422040, +-0.112560943944242940, -0.112610626044661470, -0.112660307863553450, -0.112709989400795090, -0.112759670656261320, -0.112809351629828370, -0.112859032321372480, -0.112908712730768570, +-0.112958392857892890, -0.113008072702621210, -0.113057752264829790, -0.113107431544393550, -0.113157110541188740, -0.113206789255091160, -0.113256467685977020, -0.113306145833721300, +-0.113355823698200200, -0.113405501279289540, -0.113455178576865570, -0.113504855590803210, -0.113554532320978730, -0.113604208767268340, -0.113653884929546990, -0.113703560807690940, +-0.113753236401575970, -0.113802911711078360, -0.113852586736073030, -0.113902261476436230, -0.113951935932043780, -0.114001610102771930, -0.114051283988495610, -0.114100957589091080, +-0.114150630904434160, -0.114200303934401100, -0.114249976678866840, -0.114299649137707640, -0.114349321310799320, -0.114398993198018130, -0.114448664799239030, -0.114498336114338270, +-0.114548007143191650, -0.114597677885675460, -0.114647348341664640, -0.114697018511035450, -0.114746688393664140, -0.114796357989425680, -0.114846027298196330, -0.114895696319851900, +-0.114945365054268680, -0.114995033501321610, -0.115044701660886940, -0.115094369532840520, -0.115144037117058630, -0.115193704413416200, -0.115243371421789500, -0.115293038142054380, +-0.115342704574087100, -0.115392370717762640, -0.115442036572957220, -0.115491702139546720, -0.115541367417407420, -0.115591032406414250, -0.115640697106443490, -0.115690361517371440, +-0.115740025639073050, -0.115789689471424580, -0.115839353014301900, -0.115889016267581270, -0.115938679231137670, -0.115988341904847360, -0.116038004288586200, -0.116087666382230480, +-0.116137328185655130, -0.116186989698736480, -0.116236650921350340, -0.116286311853373030, -0.116335972494679490, -0.116385632845146010, -0.116435292904648460, -0.116484952673063120, +-0.116534612150264960, -0.116584271336130270, -0.116633930230535320, -0.116683588833355130, -0.116733247144465950, -0.116782905163743660, -0.116832562891064560, -0.116882220326303590, +-0.116931877469337090, -0.116981534320040880, -0.117031190878291280, -0.117080847143963260, -0.117130503116933130, -0.117180158797076740, -0.117229814184270390, -0.117279469278389060, +-0.117329124079309070, -0.117378778586906260, -0.117428432801056940, -0.117478086721636110, -0.117527740348520050, -0.117577393681584650, -0.117627046720706200, -0.117676699465759700, +-0.117726351916621450, -0.117776004073167750, -0.117825655935273610, -0.117875307502815330, -0.117924958775668780, -0.117974609753710270, -0.118024260436814800, -0.118073910824858670, +-0.118123560917717770, -0.118173210715268410, -0.118222860217385580, -0.118272509423945600, -0.118322158334824350, -0.118371806949898140, -0.118421455269041960, -0.118471103292132160, +-0.118520751019044610, -0.118570398449655600, -0.118620045583840160, -0.118669692421474610, -0.118719338962435280, -0.118768985206597150, -0.118818631153836550, -0.118868276804029380, +-0.118917922157051960, -0.118967567212779290, -0.119017211971087710, -0.119066856431853090, -0.119116500594951780, -0.119166144460258780, -0.119215788027650400, -0.119265431297002570, +-0.119315074268191590, -0.119364716941092490, -0.119414359315581590, -0.119464001391534800, -0.119513643168828440, -0.119563284647337540, -0.119612925826938430, -0.119662566707507440, +-0.119712207288919580, -0.119761847571051220, -0.119811487553778240, -0.119861127236976980, -0.119910766620522450, -0.119960405704291020, -0.120010044488158570, -0.120059682972001450, +-0.120109321155694670, -0.120158959039114610, -0.120208596622137130, -0.120258233904638610, -0.120307870886494070, -0.120357507567579850, -0.120407143947771860, -0.120456780026946440, +-0.120506415804978630, -0.120556051281744790, -0.120605686457120830, -0.120655321330983080, -0.120704955903206600, -0.120754590173667710, -0.120804224142242800, -0.120853857808806880, +-0.120903491173236330, -0.120953124235407040, -0.121002756995195390, -0.121052389452476390, -0.121102021607126420, -0.121151653459021420, -0.121201285008037700, -0.121250916254050340, +-0.121300547196935680, -0.121350177836569660, -0.121399808172828640, -0.121449438205587650, -0.121499067934723070, -0.121548697360110810, -0.121598326481627260, -0.121647955299147440, +-0.121697583812547750, -0.121747212021704530, -0.121796839926492840, -0.121846467526789060, -0.121896094822469090, -0.121945721813409350, -0.121995348499484850, -0.122044974880571980, +-0.122094600956546660, -0.122144226727285300, -0.122193852192662920, -0.122243477352555920, -0.122293102206840210, -0.122342726755392190, -0.122392350998086930, -0.122441974934800770, +-0.122491598565409680, -0.122541221889790040, -0.122590844907816910, -0.122640467619366660, -0.122690090024315680, -0.122739712122539040, -0.122789333913913110, -0.122838955398313850, +-0.122888576575617640, -0.122938197445699550, -0.122987818008435970, -0.123037438263702840, -0.123087058211376550, -0.123136677851332190, -0.123186297183446130, -0.123235916207594320, +-0.123285534923653170, -0.123335153331497730, -0.123384771431004420, -0.123434389222049160, -0.123484006704508390, -0.123533623878257160, -0.123583240743171850, -0.123632857299128460, +-0.123682473546003370, -0.123732089483671630, -0.123781705112009700, -0.123831320430893930, -0.123880935440199420, -0.123930550139802560, -0.123980164529579340, -0.124029778609406140, +-0.124079392379158060, -0.124129005838711490, -0.124178618987942410, -0.124228231826727240, -0.124277844354941030, -0.124327456572460210, -0.124377068479160760, -0.124426680074919070, +-0.124476291359610230, -0.124525902333110690, -0.124575512995296820, -0.124625123346043710, -0.124674733385227820, -0.124724343112725080, -0.124773952528411920, -0.124823561632163450, +-0.124873170423856070, -0.124922778903365760, -0.124972387070568940, -0.125021994925340720, -0.125071602467557520, -0.125121209697095310, -0.125170816613830500, -0.125220423217638240, +-0.125270029508394890, -0.125319635485976490, -0.125369241150259410, -0.125418846501118810, -0.125468451538431110, -0.125518056262072240, -0.125567660671918710, -0.125617264767845570, +-0.125666868549729280, -0.125716472017446230, -0.125766075170871570, -0.125815678009881750, -0.125865280534352700, -0.125914882744160910, -0.125964484639181470, -0.126014086219290810, +-0.126063687484364940, -0.126113288434280300, -0.126162889068911990, -0.126212489388136450, -0.126262089391829670, -0.126311689079868140, -0.126361288452126940, -0.126410887508482530, +-0.126460486248810870, -0.126510084672988470, -0.126559682780890390, -0.126609280572393120, -0.126658878047372640, -0.126708475205705410, -0.126758072047266550, -0.126807668571932510, +-0.126857264779579730, -0.126906860670083360, -0.126956456243319830, -0.127006051499165160, -0.127055646437495810, -0.127105241058186910, -0.127154835361114880, -0.127204429346155780, +-0.127254023013186060, -0.127303616362080820, -0.127353209392716550, -0.127402802104969240, -0.127452394498715400, -0.127501986573830110, -0.127551578330189850, -0.127601169767671080, +-0.127650760886148960, -0.127700351685499920, -0.127749942165600040, -0.127799532326325710, -0.127849122167552120, -0.127898711689155730, -0.127948300891012560, -0.127997889772999060, +-0.128047478334990390, -0.128097066576863040, -0.128146654498493050, -0.128196242099756830, -0.128245829380529560, -0.128295416340687750, -0.128345002980107370, -0.128394589298664930, +-0.128444175296235590, -0.128493760972695800, -0.128543346327921610, -0.128592931361789480, -0.128642516074174600, -0.128692100464953410, -0.128741684534002420, -0.128791268281196800, +-0.128840851706412990, -0.128890434809527050, -0.128940017590415460, -0.128989600048953410, -0.129039182185017340, -0.129088763998483290, -0.129138345489227810, -0.129187926657126000, +-0.129237507502054400, -0.129287088023889000, -0.129336668222506330, -0.129386248097781570, -0.129435827649591190, -0.129485406877811210, -0.129534985782318170, -0.129584564362987240, +-0.129634142619694890, -0.129683720552317170, -0.129733298160730590, -0.129782875444810320, -0.129832452404432890, -0.129882029039474740, -0.129931605349811100, -0.129981181335318440, +-0.130030756995872830, -0.130080332331350750, -0.130129907341627410, -0.130179482026579310, -0.130229056386082480, -0.130278630420013470, -0.130328204128247440, -0.130377777510660900, +-0.130427350567129920, -0.130476923297530990, -0.130526495701739330, -0.130576067779631410, -0.130625639531083780, -0.130675210955971590, -0.130724782054171400, -0.130774352825559240, +-0.130823923270011630, -0.130873493387403780, -0.130923063177612210, -0.130972632640512980, -0.131022201775982590, -0.131071770583896270, -0.131121339064130510, -0.131170907216561410, +-0.131220475041065490, -0.131270042537517920, -0.131319609705795260, -0.131369176545773570, -0.131418743057329400, -0.131468309240337890, -0.131517875094675660, -0.131567440620218690, +-0.131617005816843600, -0.131666570684425530, -0.131716135222841040, -0.131765699431966670, -0.131815263311677590, -0.131864826861850360, -0.131914390082361050, -0.131963952973086220, +-0.132013515533901060, -0.132063077764682120, -0.132112639665305480, -0.132162201235647670, -0.132211762475583940, -0.132261323384990780, -0.132310883963744320, -0.132360444211721110, +-0.132410004128796330, -0.132459563714846550, -0.132509122969748290, -0.132558681893376770, -0.132608240485608570, -0.132657798746319750, -0.132707356675386440, -0.132756914272685180, +-0.132806471538091220, -0.132856028471481040, -0.132905585072731260, -0.132955141341717040, -0.133004697278315010, -0.133054252882401220, -0.133103808153852230, -0.133153363092543280, +-0.133202917698350940, -0.133252471971151280, -0.133302025910820880, -0.133351579517235000, -0.133401132790270160, -0.133450685729802480, -0.133500238335708540, -0.133549790607863570, +-0.133599342546144110, -0.133648894150426720, -0.133698445420586680, -0.133747996356500500, -0.133797546958044360, -0.133847097225094770, -0.133896647157527000, -0.133946196755217630, +-0.133995746018042760, -0.134045294945878940, -0.134094843538601460, -0.134144391796086890, -0.134193939718211310, -0.134243487304851330, -0.134293034555882210, -0.134342581471180500, +-0.134392128050622310, -0.134441674294084270, -0.134491220201441580, -0.134540765772570870, -0.134590311007348220, -0.134639855905650250, -0.134689400467352170, -0.134738944692330610, +-0.134788488580462130, -0.134838032131621990, -0.134887575345686770, -0.134937118222532600, -0.134986660762036080, -0.135036202964072480, -0.135085744828518340, -0.135135286355249880, +-0.135184827544143630, -0.135234368395074860, -0.135283908907920160, -0.135333449082555710, -0.135382988918858080, -0.135432528416702530, -0.135482067575965650, -0.135531606396524030, +-0.135581144878252980, -0.135630683021029070, -0.135680220824728440, -0.135729758289227260, -0.135779295414402120, -0.135828832200128310, -0.135878368646282420, -0.135927904752741050, +-0.135977440519379460, -0.136026975946074300, -0.136076511032701660, -0.136126045779138200, -0.136175580185259220, -0.136225114250941250, -0.136274647976060510, -0.136324181360493570, +-0.136373714404115750, -0.136423247106803650, -0.136472779468433420, -0.136522311488881690, -0.136571843168023730, -0.136621374505736190, -0.136670905501895620, -0.136720436156377360, +-0.136769966469058010, -0.136819496439813750, -0.136869026068521190, -0.136918555355055620, -0.136968084299293660, -0.137017612901111500, -0.137067141160385740, -0.137116669076991690, +-0.137166196650805950, -0.137215723881704720, -0.137265250769564640, -0.137314777314260980, -0.137364303515670390, -0.137413829373669030, -0.137463354888133550, -0.137512880058939220, +-0.137562404885962690, -0.137611929369080180, -0.137661453508168250, -0.137710977303102280, -0.137760500753758840, -0.137810023860014590, -0.137859546621744850, -0.137909069038826240, +-0.137958591111134980, -0.138008112838547640, -0.138057634220939610, -0.138107155258187480, -0.138156675950167480, -0.138206196296756210, -0.138255716297829010, -0.138305235953262520, +-0.138354755262932950, -0.138404274226716920, -0.138453792844489780, -0.138503311116128150, -0.138552829041508670, -0.138602346620506690, -0.138651863852998850, -0.138701380738861350, +-0.138750897277970820, -0.138800413470202640, -0.138849929315433380, -0.138899444813539330, -0.138948959964397100, -0.138998474767882020, -0.139047989223870770, -0.139097503332239550, +-0.139147017092865010, -0.139196530505622470, -0.139246043570388610, -0.139295556287039630, -0.139345068655452240, -0.139394580675501700, -0.139444092347064730, -0.139493603670017510, +-0.139543114644236720, -0.139592625269597730, -0.139642135545977150, -0.139691645473251690, -0.139741155051296670, -0.139790664279988760, -0.139840173159204190, -0.139889681688819630, +-0.139939189868710400, -0.139988697698753220, -0.140038205178824320, -0.140087712308800290, -0.140137219088556590, -0.140186725517969820, -0.140236231596916230, -0.140285737325272520, +-0.140335242702914000, -0.140384747729717400, -0.140434252405558930, -0.140483756730315270, -0.140533260703861770, -0.140582764326075110, -0.140632267596831530, -0.140681770516007750, +-0.140731273083479070, -0.140780775299122250, -0.140830277162813900, -0.140879778674429440, -0.140929279833845510, -0.140978780640938380, -0.141028281095584770, -0.141077781197659980, +-0.141127280947040770, -0.141176780343603340, -0.141226279387224400, -0.141275778077779330, -0.141325276415144810, -0.141374774399197070, -0.141424272029812860, -0.141473769306867560, +-0.141523266230237780, -0.141572762799800300, -0.141622259015430490, -0.141671754877005010, -0.141721250384400140, -0.141770745537492610, -0.141820240336157750, -0.141869734780272320, +-0.141919228869712530, -0.141968722604355110, -0.142018215984075440, -0.142067709008750240, -0.142117201678255760, -0.142166693992468700, -0.142216185951264510, -0.142265677554519830, +-0.142315168802110950, -0.142364659693914600, -0.142414150229806140, -0.142463640409662310, -0.142513130233359400, -0.142562619700774080, -0.142612108811781800, -0.142661597566259210, +-0.142711085964083080, -0.142760574005128820, -0.142810061689273100, -0.142859549016392220, -0.142909035986362930, -0.142958522599060610, -0.143008008854361960, -0.143057494752143300, +-0.143106980292281360, -0.143156465474651500, -0.143205950299130500, -0.143255434765594600, -0.143304918873920580, -0.143354402623983800, -0.143403886015661040, -0.143453369048828550, +-0.143502851723363080, -0.143552334039140030, -0.143601815996036160, -0.143651297593927750, -0.143700778832691530, -0.143750259712202900, -0.143799740232338660, -0.143849220392975490, +-0.143898700193988820, -0.143948179635255410, -0.143997658716651540, -0.144047137438054000, -0.144096615799338130, -0.144146093800380760, -0.144195571441058130, -0.144245048721247020, +-0.144294525640822850, -0.144344002199662370, -0.144393478397641880, -0.144442954234638130, -0.144492429710526560, -0.144541904825183890, -0.144591379578486940, -0.144640853970311070, +-0.144690328000533080, -0.144739801669029280, -0.144789274975676400, -0.144838747920349900, -0.144888220502926520, -0.144937692723282580, -0.144987164581294880, -0.145036636076838810, +-0.145086107209791150, -0.145135577980028210, -0.145185048387426800, -0.145234518431862300, -0.145283988113211500, -0.145333457431350730, -0.145382926386156800, -0.145432394977505070, +-0.145481863205272370, -0.145531331069335000, -0.145580798569569740, -0.145630265705852050, -0.145679732478058710, -0.145729198886066470, -0.145778664929750780, -0.145828130608988440, +-0.145877595923655760, -0.145927060873629550, -0.145976525458785260, -0.146025989678999630, -0.146075453534149020, -0.146124917024110230, -0.146174380148758720, -0.146223842907971250, +-0.146273305301624160, -0.146322767329594230, -0.146372228991756980, -0.146421690287989150, -0.146471151218167530, -0.146520611782167580, -0.146570071979866130, -0.146619531811139460, +-0.146668991275864000, -0.146718450373916480, -0.146767909105172400, -0.146817367469508550, -0.146866825466801710, -0.146916283096927360, -0.146965740359762310, -0.147015197255182940, +-0.147064653783065990, -0.147114109943286970, -0.147163565735722670, -0.147213021160249450, -0.147262476216744130, -0.147311930905082180, -0.147361385225140390, -0.147410839176795150, +-0.147460292759923230, -0.147509745974400170, -0.147559198820102740, -0.147608651296907730, -0.147658103404690650, -0.147707555143328340, -0.147757006512697130, -0.147806457512673850, +-0.147855908143133980, -0.147905358403954330, -0.147954808295011290, -0.148004257816181680, -0.148053706967340960, -0.148103155748365990, -0.148152604159133140, -0.148202052199519210, +-0.148251499869399730, -0.148300947168651470, -0.148350394097150840, -0.148399840654774680, -0.148449286841398490, -0.148498732656899060, -0.148548178101152810, -0.148597623174036550, +-0.148647067875425810, -0.148696512205197360, -0.148745956163228110, -0.148795399749393510, -0.148844842963570420, -0.148894285805635210, -0.148943728275464730, -0.148993170372934500, +-0.149042612097921330, -0.149092053450301630, -0.149141494429952250, -0.149190935036748680, -0.149240375270567800, -0.149289815131285950, -0.149339254618780000, -0.149388693732925510, +-0.149438132473599240, -0.149487570840678120, -0.149537008834037620, -0.149586446453554590, -0.149635883699105440, -0.149685320570566580, -0.149734757067814860, -0.149784193190725830, +-0.149833628939176290, -0.149883064313043130, -0.149932499312201870, -0.149981933936529370, -0.150031368185902010, -0.150080802060196690, -0.150130235559288920, -0.150179668683055570, +-0.150229101431373020, -0.150278533804118180, -0.150327965801166560, -0.150377397422395030, -0.150426828667680010, -0.150476259536898360, -0.150525690029925610, -0.150575120146638620, +-0.150624549886914290, -0.150673979250628140, -0.150723408237657060, -0.150772836847877430, -0.150822265081166170, -0.150871692937398800, -0.150921120416452200, -0.150970547518202800, +-0.151019974242527470, -0.151069400589301740, -0.151118826558402530, -0.151168252149706280, -0.151217677363089800, -0.151267102198428700, -0.151316526655599860, -0.151365950734479670, +-0.151415374434945070, -0.151464797756871580, -0.151514220700136090, -0.151563643264615080, -0.151613065450185380, -0.151662487256722570, -0.151711908684103560, -0.151761329732205210, +-0.151810750400903080, -0.151860170690074100, -0.151909590599594690, -0.151959010129341710, -0.152008429279190810, -0.152057848049018810, -0.152107266438702200, -0.152156684448117860, +-0.152206102077141360, -0.152255519325649620, -0.152304936193519090, -0.152354352680626640, -0.152403768786847860, -0.152453184512059690, -0.152502599856138980, -0.152552014818961330, +-0.152601429400403640, -0.152650843600342370, -0.152700257418654450, -0.152749670855215430, -0.152799083909902270, -0.152848496582591360, -0.152897908873159650, -0.152947320781482740, +-0.152996732307437540, -0.153046143450900480, -0.153095554211748530, -0.153144964589857240, -0.153194374585103540, -0.153243784197363900, -0.153293193426515260, -0.153342602272433180, +-0.153392010734994590, -0.153441418814075970, -0.153490826509554260, -0.153540233821305020, -0.153589640749205230, -0.153639047293131740, -0.153688453452960230, -0.153737859228567560, +-0.153787264619830250, -0.153836669626625210, -0.153886074248828050, -0.153935478486315720, -0.153984882338964710, -0.154034285806651900, -0.154083688889252970, -0.154133091586644790, +-0.154182493898703890, -0.154231895825307190, -0.154281297366330340, -0.154330698521650210, -0.154380099291143350, -0.154429499674686670, -0.154478899672155810, -0.154528299283427710, +-0.154577698508378850, -0.154627097346886180, -0.154676495798825340, -0.154725893864073260, -0.154775291542506880, -0.154824688834001830, -0.154874085738435060, -0.154923482255683060, +-0.154972878385622820, -0.155022274128129940, -0.155071669483081350, -0.155121064450353620, -0.155170459029823630, -0.155219853221367080, -0.155269247024860890, -0.155318640440181590, +-0.155368033467206120, -0.155417426105810140, -0.155466818355870590, -0.155516210217264420, -0.155565601689867300, -0.155614992773556170, -0.155664383468207550, -0.155713773773698410, +-0.155763163689904420, -0.155812553216702510, -0.155861942353969190, -0.155911331101581480, -0.155960719459415000, -0.156010107427346720, -0.156059495005253180, -0.156108882193011330, +-0.156158268990496840, -0.156207655397586690, -0.156257041414157390, -0.156306427040085900, -0.156355812275247950, -0.156405197119520440, -0.156454581572779940, -0.156503965634903430, +-0.156553349305766560, -0.156602732585246350, -0.156652115473219690, -0.156701497969562340, -0.156750880074151250, -0.156800261786862930, -0.156849643107574430, -0.156899024036161380, +-0.156948404572500750, -0.156997784716469110, -0.157047164467943450, -0.157096543826799440, -0.157145922792914060, -0.157195301366163890, -0.157244679546425900, -0.157294057333575790, +-0.157343434727490520, -0.157392811728046670, -0.157442188335121220, -0.157491564548589870, -0.157540940368329580, -0.157590315794216980, -0.157639690826129000, -0.157689065463941370, +-0.157738439707531070, -0.157787813556775100, -0.157837187011549170, -0.157886560071730270, -0.157935932737194970, -0.157985305007820290, -0.158034676883481880, -0.158084048364056820, +-0.158133419449421610, -0.158182790139453300, -0.158232160434027550, -0.158281530333021420, -0.158330899836311460, -0.158380268943774720, -0.158429637655286840, -0.158479005970724840, +-0.158528373889965800, -0.158577741412885390, -0.158627108539360600, -0.158676475269268060, -0.158725841602484760, -0.158775207538886440, -0.158824573078350070, -0.158873938220752270, +-0.158923302965970070, -0.158972667313879180, -0.159022031264356630, -0.159071394817279000, -0.159120757972523310, -0.159170120729965280, -0.159219483089481970, -0.159268845050949930, +-0.159318206614246230, -0.159367567779246570, -0.159416928545827980, -0.159466288913867080, -0.159515648883240910, -0.159565008453825150, -0.159614367625496880, -0.159663726398133140, +-0.159713084771609640, -0.159762442745803420, -0.159811800320591110, -0.159861157495849730, -0.159910514271455030, -0.159959870647284040, -0.160009226623213350, -0.160058582199120060, +-0.160107937374879860, -0.160157292150369810, -0.160206646525466540, -0.160256000500047100, -0.160305354073987190, -0.160354707247163940, -0.160404060019454310, -0.160453412390734130, +-0.160502764360880400, -0.160552115929769780, -0.160601467097278850, -0.160650817863284700, -0.160700168227663060, -0.160749518190291010, -0.160798867751045600, -0.160848216909802580, +-0.160897565666439010, -0.160946914020831560, -0.160996261972857210, -0.161045609522391800, -0.161094956669312370, -0.161144303413495530, -0.161193649754818370, -0.161242995693156670, +-0.161292341228387450, -0.161341686360387400, -0.161391031089033580, -0.161440375414201730, -0.161489719335768940, -0.161539062853612280, -0.161588405967607540, -0.161637748677631780, +-0.161687090983561650, -0.161736432885274230, -0.161785774382645300, -0.161835115475551930, -0.161884456163870760, -0.161933796447478880, -0.161983136326252110, -0.162032475800067470, +-0.162081814868801630, -0.162131153532331710, -0.162180491790533450, -0.162229829643284000, -0.162279167090459950, -0.162328504131938420, -0.162377840767595180, -0.162427176997307350, +-0.162476512820951570, -0.162525848238404960, -0.162575183249543290, -0.162624517854243640, -0.162673852052383160, -0.162723185843837600, -0.162772519228484100, -0.162821852206199270, +-0.162871184776860270, -0.162920516940342850, -0.162969848696524140, -0.163019180045280820, -0.163068510986489970, -0.163117841520027420, -0.163167171645770270, -0.163216501363595200, +-0.163265830673379300, -0.163315159574998370, -0.163364488068329570, -0.163413816153249960, -0.163463143829635390, -0.163512471097362940, -0.163561797956309350, -0.163611124406351230, +-0.163660450447365740, -0.163709776079228710, -0.163759101301817230, -0.163808426115008430, -0.163857750518678120, -0.163907074512703450, -0.163956398096961080, -0.164005721271328150, +-0.164055044035680500, -0.164104366389895230, -0.164153688333849020, -0.164203009867419060, -0.164252330990481120, -0.164301651702912360, -0.164350972004589480, -0.164400291895389600, +-0.164449611375188540, -0.164498930443863460, -0.164548249101291480, -0.164597567347348460, -0.164646885181911510, -0.164696202604857370, -0.164745519616063120, -0.164794836215404670, +-0.164844152402759130, -0.164893468178003180, -0.164942783541014020, -0.164992098491667460, -0.165041413029840630, -0.165090727155410290, -0.165140040868253570, -0.165189354168246320, +-0.165238667055265660, -0.165287979529188330, -0.165337291589891520, -0.165386603237251020, -0.165435914471144030, -0.165485225291447240, -0.165534535698037830, -0.165583845690791630, +-0.165633155269585830, -0.165682464434297570, -0.165731773184802730, -0.165781081520978420, -0.165830389442701450, -0.165879696949848910, -0.165929004042296710, -0.165978310719922000, +-0.166027616982601520, -0.166076922830212410, -0.166126228262630570, -0.166175533279733170, -0.166224837881396910, -0.166274142067499020, -0.166323445837915310, -0.166372749192523010, +-0.166422052131199260, -0.166471354653819960, -0.166520656760262260, -0.166569958450402900, -0.166619259724119120, -0.166668560581286730, -0.166717861021782930, -0.166767161045484500, +-0.166816460652268600, -0.166865759842011100, -0.166915058614589190, -0.166964356969879660, -0.167013654907759660, -0.167062952428105090, -0.167112249530793150, -0.167161546215700560, +-0.167210842482704570, -0.167260138331681020, -0.167309433762507120, -0.167358728775059670, -0.167408023369215790, -0.167457317544851440, -0.167506611301843800, -0.167555904640070060, +-0.167605197559406120, -0.167654490059729180, -0.167703782140916020, -0.167753073802843850, -0.167802365045388540, -0.167851655868427350, -0.167900946271836990, -0.167950236255494710, +-0.167999525819276410, -0.168048814963059290, -0.168098103686720120, -0.168147391990136150, -0.168196679873183240, -0.168245967335738660, -0.168295254377679140, -0.168344540998881910, +-0.168393827199222910, -0.168443112978579330, -0.168492398336828000, -0.168541683273846080, -0.168590967789509520, -0.168640251883695550, -0.168689535556281380, -0.168738818807142920, +-0.168788101636157430, -0.168837384043201700, -0.168886666028152920, -0.168935947590887060, -0.168985228731281300, -0.169034509449212500, -0.169083789744557840, -0.169133069617193290, +-0.169182349066996060, -0.169231628093842960, -0.169280906697611230, -0.169330184878176780, -0.169379462635416870, -0.169428739969208740, -0.169478016879428340, -0.169527293365952870, +-0.169576569428659200, -0.169625845067424510, -0.169675120282124810, -0.169724395072637290, -0.169773669438838760, -0.169822943380606520, -0.169872216897816480, -0.169921489990345900, +-0.169970762658071570, -0.170020034900870810, -0.170069306718619500, -0.170118578111194930, -0.170167849078473900, -0.170217119620333700, -0.170266389736650260, -0.170315659427300870, +-0.170364928692162300, -0.170414197531111870, -0.170463465944025480, -0.170512733930780450, -0.170562001491254000, -0.170611268625322140, -0.170660535332862070, -0.170709801613750680, +-0.170759067467865230, -0.170808332895081680, -0.170857597895277270, -0.170906862468328900, -0.170956126614113770, -0.171005390332507920, -0.171054653623388590, -0.171103916486632620, +-0.171153178922117290, -0.171202440929718590, -0.171251702509313790, -0.171300963660779710, -0.171350224383993670, -0.171399484678831650, -0.171448744545170890, -0.171498003982888280, +-0.171547262991861100, -0.171596521571965310, -0.171645779723078230, -0.171695037445077160, -0.171744294737838030, -0.171793551601238160, -0.171842808035154420, -0.171892064039464110, +-0.171941319614043190, -0.171990574758768970, -0.172039829473518310, -0.172089083758168530, -0.172138337612595590, -0.172187591036676800, -0.172236844030289050, -0.172286096593309620, +-0.172335348725614510, -0.172384600427081040, -0.172433851697586490, -0.172483102537006850, -0.172532352945219490, -0.172581602922101260, -0.172630852467529430, -0.172680101581380030, +-0.172729350263530400, -0.172778598513857380, -0.172827846332238300, -0.172877093718549170, -0.172926340672667290, -0.172975587194469590, -0.173024833283833330, -0.173074078940634590, +-0.173123324164750620, -0.173172568956058340, -0.173221813314435090, -0.173271057239756860, -0.173320300731900970, -0.173369543790744350, -0.173418786416164320, -0.173468028608036840, +-0.173517270366239320, -0.173566511690649070, -0.173615752581142090, -0.173664993037595750, -0.173714233059886900, -0.173763472647892910, -0.173812711801489800, -0.173861950520554920, +-0.173911188804965170, -0.173960426654597880, -0.174009664069329080, -0.174058901049036100, -0.174108137593595890, -0.174157373702885780, -0.174206609376781780, -0.174255844615161280, +-0.174305079417901160, -0.174354313784878760, -0.174403547715970160, -0.174452781211052680, -0.174502014270003250, -0.174551246892699240, -0.174600479079016660, -0.174649710828832880, +-0.174698942142025250, -0.174748173018469840, -0.174797403458043980, -0.174846633460624650, -0.174895863026089140, -0.174945092154313560, -0.174994320845175220, -0.175043549098551100, +-0.175092776914318540, -0.175142004292353600, -0.175191231232533630, -0.175240457734735620, -0.175289683798836890, -0.175338909424713500, -0.175388134612242840, -0.175437359361302280, +-0.175486583671767890, -0.175535807543517050, -0.175585030976426660, -0.175634253970374160, -0.175683476525235580, -0.175732698640888310, -0.175781920317209290, -0.175831141554075920, +-0.175880362351364230, -0.175929582708951650, -0.175978802626715110, -0.176028022104532000, -0.176077241142278410, -0.176126459739831710, -0.176175677897068870, -0.176224895613867260, +-0.176274112890102970, -0.176323329725653400, -0.176372546120395520, -0.176421762074206710, -0.176470977586963030, -0.176520192658541940, -0.176569407288820780, -0.176618621477675680, +-0.176667835224984030, -0.176717048530622780, -0.176766261394469350, -0.176815473816399840, -0.176864685796291640, -0.176913897334021710, -0.176963108429467500, -0.177012319082505060, +-0.177061529293011830, -0.177110739060864770, -0.177159948385941320, -0.177209157268117530, -0.177258365707270880, -0.177307573703278740, -0.177356781256017230, -0.177405988365363750, +-0.177455195031195310, -0.177504401253388870, -0.177553607031821880, -0.177602812366370460, -0.177652017256911960, -0.177701221703323890, -0.177750425705482330, -0.177799629263264670, +-0.177848832376547970, -0.177898035045209620, -0.177947237269125730, -0.177996439048173780, -0.178045640382230700, -0.178094841271173950, -0.178144041714879690, -0.178193241713225310, +-0.178242441266087820, -0.178291640373344690, -0.178340839034872000, -0.178390037250547220, -0.178439235020247780, -0.178488432343849810, -0.178537629221230760, -0.178586825652267630, +-0.178636021636837890, -0.178685217174817670, -0.178734412266084390, -0.178783606910515090, -0.178832801107987190, -0.178881994858376860, -0.178931188161561530, -0.178980381017418260, +-0.179029573425824460, -0.179078765386656290, -0.179127956899791190, -0.179177147965106230, -0.179226338582478800, -0.179275528751785120, -0.179324718472902600, -0.179373907745708300, +-0.179423096570079650, -0.179472284945892820, -0.179521472873025280, -0.179570660351354520, -0.179619847380756650, -0.179669033961109170, -0.179718220092289080, -0.179767405774173910, +-0.179816591006639770, -0.179865775789564140, -0.179914960122824100, -0.179964144006297090, -0.180013327439859290, -0.180062510423388140, -0.180111692956760740, -0.180160875039854530, +-0.180210056672545720, -0.180259237854711730, -0.180308418586230120, -0.180357598866977000, -0.180406778696829890, -0.180455958075665860, -0.180505137003362350, -0.180554315479795560, +-0.180603493504842980, -0.180652671078381650, -0.180701848200289120, -0.180751024870441510, -0.180800201088716330, -0.180849376854990640, -0.180898552169141970, -0.180947727031046470, +-0.180996901440581640, -0.181046075397624600, -0.181095248902052780, -0.181144421953742390, -0.181193594552570950, -0.181242766698415550, -0.181291938391153620, -0.181341109630661440, +-0.181390280416816490, -0.181439450749496270, -0.181488620628576990, -0.181537790053936170, -0.181586959025450860, -0.181636127542998570, -0.181685295606455550, -0.181734463215699280, +-0.181783630370606850, -0.181832797071055790, -0.181881963316922300, -0.181931129108083900, -0.181980294444417680, -0.182029459325801170, -0.182078623752110540, -0.182127787723223380, +-0.182176951239016750, -0.182226114299368160, -0.182275276904153880, -0.182324439053251380, -0.182373600746537800, -0.182422761983890620, -0.182471922765186150, -0.182521083090301850, +-0.182570242959115250, -0.182619402371502650, -0.182668561327341520, -0.182717719826509000, -0.182766877868882600, -0.182816035454338580, -0.182865192582754470, -0.182914349254007370, +-0.182963505467974850, -0.183012661224533140, -0.183061816523559740, -0.183110971364931820, -0.183160125748526910, -0.183209279674221260, -0.183258433141892390, -0.183307586151417870, +-0.183356738702673970, -0.183405890795538210, -0.183455042429887720, -0.183504193605600080, -0.183553344322551490, -0.183602494580619560, -0.183651644379681400, -0.183700793719614540, +-0.183749942600295290, -0.183799091021601160, -0.183848238983409300, -0.183897386485597310, -0.183946533528041380, -0.183995680110619150, -0.184044826233207700, -0.184093971895684600, +-0.184143117097926160, -0.184192261839809940, -0.184241406121213040, -0.184290549942013080, -0.184339693302086300, -0.184388836201310270, -0.184437978639562600, -0.184487120616719570, +-0.184536262132658700, -0.184585403187257190, -0.184634543780392620, -0.184683683911941260, -0.184732823581780670, -0.184781962789788030, -0.184831101535840920, -0.184880239819815610, +-0.184929377641589700, -0.184978515001040340, -0.185027651898045150, -0.185076788332480400, -0.185125924304223670, -0.185175059813152100, -0.185224194859143350, -0.185273329442073670, +-0.185322463561820670, -0.185371597218261520, -0.185420730411273800, -0.185469863140733800, -0.185518995406519170, -0.185568127208507460, -0.185617258546575010, -0.185666389420599430, +-0.185715519830457860, -0.185764649776027940, -0.185813779257185950, -0.185862908273809500, -0.185912036825775780, -0.185961164912962440, -0.186010292535245730, -0.186059419692503280, +-0.186108546384612270, -0.186157672611450360, -0.186206798372893810, -0.186255923668820270, -0.186305048499107370, -0.186354172863631400, -0.186403296762269990, -0.186452420194900350, +-0.186501543161400110, -0.186550665661645550, -0.186599787695514360, -0.186648909262883660, -0.186698030363631140, -0.186747150997633120, -0.186796271164767210, -0.186845390864910620, +-0.186894510097941000, -0.186943628863734670, -0.186992747162169240, -0.187041864993121980, -0.187090982356470450, -0.187140099252091070, -0.187189215679861410, -0.187238331639658750, +-0.187287447131360670, -0.187336562154843540, -0.187385676709984990, -0.187434790796662700, -0.187483904414752990, -0.187533017564133540, -0.187582130244681510, -0.187631242456274630, +-0.187680354198789170, -0.187729465472102870, -0.187778576276092870, -0.187827686610636870, -0.187876796475611230, -0.187925905870893580, -0.187975014796361200, -0.188024123251891690, +-0.188073231237361440, -0.188122338752648110, -0.188171445797628960, -0.188220552372181600, -0.188269658476182430, -0.188318764109509120, -0.188367869272038880, -0.188416973963649430, +-0.188466078184217100, -0.188515181933619570, -0.188564285211734520, -0.188613388018438330, -0.188662490353608660, -0.188711592217122780, -0.188760693608858330, -0.188809794528691730, +-0.188858894976500660, -0.188907994952162320, -0.188957094455554450, -0.189006193486553400, -0.189055292045036850, -0.189104390130882090, -0.189153487743966790, -0.189202584884167330, +-0.189251681551361410, -0.189300777745426720, -0.189349873466239630, -0.189398968713677900, -0.189448063487618720, -0.189497157787939820, -0.189546251614517600, -0.189595344967229740, +-0.189644437845953530, -0.189693530250566650, -0.189742622180945510, -0.189791713636967810, -0.189840804618510830, -0.189889895125452260, -0.189938985157668550, -0.189988074715037340, +-0.190037163797435990, -0.190086252404742110, -0.190135340536832200, -0.190184428193583940, -0.190233515374874600, -0.190282602080581900, -0.190331688310582280, -0.190380774064753430, +-0.190429859342973070, -0.190478944145117620, -0.190528028471064840, -0.190577112320691970, -0.190626195693876760, -0.190675278590495630, -0.190724361010426280, -0.190773442953546060, +-0.190822524419732630, -0.190871605408862500, -0.190920685920813320, -0.190969765955462440, -0.191018845512687580, -0.191067924592365160, -0.191117003194372940, -0.191166081318588640, +-0.191215158964888720, -0.191264236133150880, -0.191313312823252450, -0.191362389035070750, -0.191411464768483530, -0.191460540023367180, -0.191509614799599490, -0.191558689097058200, +-0.191607762915619760, -0.191656836255161890, -0.191705909115561960, -0.191754981496697670, -0.191804053398445500, -0.191853124820683200, -0.191902195763288070, -0.191951266226137920, +-0.192000336209109140, -0.192049405712079540, -0.192098474734926420, -0.192147543277527530, -0.192196611339759350, -0.192245678921499660, -0.192294746022626200, -0.192343812643015450, +-0.192392878782545160, -0.192441944441092670, -0.192491009618535740, -0.192540074314750870, -0.192589138529615820, -0.192638202263007900, -0.192687265514804920, -0.192736328284883350, +-0.192785390573120940, -0.192834452379395090, -0.192883513703583500, -0.192932574545562730, -0.192981634905210500, -0.193030694782404200, -0.193079754177021580, -0.193128813088939140, +-0.193177871518034670, -0.193226929464185540, -0.193275986927269490, -0.193325043907163070, -0.193374100403744030, -0.193423156416890170, -0.193472211946477980, -0.193521266992385250, +-0.193570321554489390, -0.193619375632668120, -0.193668429226798000, -0.193717482336756790, -0.193766534962421880, -0.193815587103671080, -0.193864638760380880, -0.193913689932429080, +-0.193962740619693040, -0.194011790822050580, -0.194060840539378220, -0.194109889771553770, -0.194158938518455000, -0.194207986779958490, -0.194257034555941980, -0.194306081846282900, +-0.194355128650858610, -0.194404174969546930, -0.194453220802224380, -0.194502266148768780, -0.194551311009057950, -0.194600355382968410, -0.194649399270377970, -0.194698442671164040, +-0.194747485585204440, -0.194796528012375710, -0.194845569952555640, -0.194894611405621640, -0.194943652371451560, -0.194992692849921910, -0.195041732840910500, -0.195090772344294780, +-0.195139811359952590, -0.195188849887760390, -0.195237887927596110, -0.195286925479337510, -0.195335962542861170, -0.195384999118044940, -0.195434035204766210, -0.195483070802902810, +-0.195532105912331310, -0.195581140532929550, -0.195630174664574910, -0.195679208307145300, -0.195728241460517230, -0.195777274124568550, -0.195826306299176660, -0.195875337984219470, +-0.195924369179573510, -0.195973399885116610, -0.196022430100726200, -0.196071459826280160, -0.196120489061655050, -0.196169517806728700, -0.196218546061378560, -0.196267573825482490, +-0.196316601098917050, -0.196365627881560120, -0.196414654173289540, -0.196463679973981900, -0.196512705283515030, -0.196561730101766420, -0.196610754428613920, -0.196659778263934100, +-0.196708801607604840, -0.196757824459503570, -0.196806846819508160, -0.196855868687495220, -0.196904890063342610, -0.196953910946927770, -0.197002931338128570, -0.197051951236821620, +-0.197100970642884790, -0.197149989556195980, -0.197199007976631730, -0.197248025904070010, -0.197297043338388180, -0.197346060279464190, -0.197395076727174630, -0.197444092681397340, +-0.197493108142009850, -0.197542123108890020, -0.197591137581914460, -0.197640151560961040, -0.197689165045907250, -0.197738178036630960, -0.197787190533008810, -0.197836202534918680, +-0.197885214042238050, -0.197934225054844810, -0.197983235572615570, -0.198032245595428260, -0.198081255123160330, -0.198130264155689680, -0.198179272692892950, -0.198228280734648040, +-0.198277288280832850, -0.198326295331324010, -0.198375301885999440, -0.198424307944736590, -0.198473313507413430, -0.198522318573906560, -0.198571323144093870, -0.198620327217852890, +-0.198669330795061520, -0.198718333875596370, -0.198767336459335420, -0.198816338546156100, -0.198865340135936370, -0.198914341228552870, -0.198963341823883500, -0.199012341921805810, +-0.199061341522197680, -0.199110340624935740, -0.199159339229897980, -0.199208337336961860, -0.199257334946005310, -0.199306332056905010, -0.199355328669538890, -0.199404324783784860, +-0.199453320399519600, -0.199502315516621040, -0.199551310134966690, -0.199600304254434480, -0.199649297874901100, -0.199698290996244480, -0.199747283618342100, -0.199796275741071980, +-0.199845267364310710, -0.199894258487936290, -0.199943249111826200, -0.199992239235858430, -0.200041228859909660, -0.200090217983857790, -0.200139206607580810, -0.200188194730955370, +-0.200237182353859460, -0.200286169476170590, -0.200335156097766730, -0.200384142218524550, -0.200433127838322010, -0.200482112957036630, -0.200531097574546430, -0.200580081690728050, +-0.200629065305459460, -0.200678048418618190, -0.200727031030082270, -0.200776013139728320, -0.200824994747434320, -0.200873975853077870, -0.200922956456536880, -0.200971936557688080, +-0.201020916156409430, -0.201069895252578510, -0.201118873846073270, -0.201167851936770420, -0.201216829524547920, -0.201265806609283810, -0.201314783190854720, -0.201363759269138690, +-0.201412734844013260, -0.201461709915356420, -0.201510684483044880, -0.201559658546956620, -0.201608632106969220, -0.201657605162960690, -0.201706577714807680, -0.201755549762388240, +-0.201804521305579940, -0.201853492344260750, -0.201902462878307400, -0.201951432907597900, -0.202000402432009810, -0.202049371451421160, -0.202098339965708640, -0.202147307974750280, +-0.202196275478423640, -0.202245242476606750, -0.202294208969176300, -0.202343174956010340, -0.202392140436986890, -0.202441105411982650, -0.202490069880875640, -0.202539033843543460, +-0.202587997299864130, -0.202636960249714370, -0.202685922692972200, -0.202734884629515220, -0.202783846059221480, -0.202832806981967710, -0.202881767397631890, -0.202930727306091660, +-0.202979686707225050, -0.203028645600908770, -0.203077603987020900, -0.203126561865439450, -0.203175519236041160, -0.203224476098704060, -0.203273432453305790, -0.203322388299724350, +-0.203371343637836520, -0.203420298467520330, -0.203469252788653380, -0.203518206601113750, -0.203567159904778170, -0.203616112699524680, -0.203665064985230900, -0.203714016761774920, +-0.203762968029033460, -0.203811918786884570, -0.203860869035205870, -0.203909818773875460, -0.203958768002770050, -0.204007716721767710, -0.204056664930746090, -0.204105612629583240, +-0.204154559818155920, -0.204203506496342220, -0.204252452664020170, -0.204301398321066560, -0.204350343467359450, -0.204399288102776490, -0.204448232227195740, -0.204497175840493980, +-0.204546118942549260, -0.204595061533239280, -0.204644003612442060, -0.204692945180034390, -0.204741886235894370, -0.204790826779899630, -0.204839766811928250, -0.204888706331857020, +-0.204937645339564020, -0.204986583834927350, -0.205035521817823780, -0.205084459288131400, -0.205133396245727910, -0.205182332690490880, -0.205231268622298480, -0.205280204041027480, +-0.205329138946555970, -0.205378073338762010, -0.205427007217522470, -0.205475940582715400, -0.205524873434218490, -0.205573805771909810, -0.205622737595666180, -0.205671668905365730, +-0.205720599700886100, -0.205769529982105400, -0.205818459748900450, -0.205867389001149340, -0.205916317738729760, -0.205965245961519800, -0.206014173669396310, -0.206063100862237390, +-0.206112027539921170, -0.206160953702324400, -0.206209879349325280, -0.206258804480801440, -0.206307729096631060, -0.206356653196690890, -0.206405576780859110, -0.206454499849013370, +-0.206503422401031810, -0.206552344436791270, -0.206601265956169870, -0.206650186959045300, -0.206699107445295710, -0.206748027414797920, -0.206796946867430030, -0.206845865803069790, +-0.206894784221595320, -0.206943702122883460, -0.206992619506812360, -0.207041536373259670, -0.207090452722103610, -0.207139368553220990, -0.207188283866489910, -0.207237198661788580, +-0.207286112938993820, -0.207335026697983760, -0.207383939938636160, -0.207432852660829110, -0.207481764864439530, -0.207530676549345510, -0.207579587715424810, -0.207628498362555590, +-0.207677408490614670, -0.207726318099480220, -0.207775227189029990, -0.207824135759142130, -0.207873043809693490, -0.207921951340562240, -0.207970858351626570, -0.208019764842763300, +-0.208068670813850610, -0.208117576264766240, -0.208166481195387940, -0.208215385605593880, -0.208264289495260910, -0.208313192864267220, -0.208362095712490980, -0.208410998039809060, +-0.208459899846099670, -0.208508801131240510, -0.208557701895109780, -0.208606602137584360, -0.208655501858542450, -0.208704401057861750, -0.208753299735420530, -0.208802197891095610, +-0.208851095524765190, -0.208899992636307010, -0.208948889225599320, -0.208997785292518940, -0.209046680836944110, -0.209095575858753020, -0.209144470357822550, -0.209193364334030910, +-0.209242257787255860, -0.209291150717375580, -0.209340043124267020, -0.209388935007808340, -0.209437826367877310, -0.209486717204352160, -0.209535607517109780, -0.209584497306028380, +-0.209633386570985740, -0.209682275311860070, -0.209731163528528270, -0.209780051220868570, -0.209828938388758740, -0.209877825032077000, -0.209926711150700250, -0.209975596744506720, +-0.210024481813374210, -0.210073366357180940, -0.210122250375803820, -0.210171133869121060, -0.210220016837010890, -0.210268899279350270, -0.210317781196017380, -0.210366662586890050, +-0.210415543451846490, -0.210464423790763630, -0.210513303603519750, -0.210562182889992570, -0.210611061650060380, -0.210659939883600100, -0.210708817590489980, -0.210757694770607800, +-0.210806571423831830, -0.210855447550038990, -0.210904323149107540, -0.210953198220915710, -0.211002072765340440, -0.211050946782260000, -0.211099820271552190, -0.211148693233095260, +-0.211197565666766170, -0.211246437572443190, -0.211295308950004090, -0.211344179799327150, -0.211393050120289330, -0.211441919912768870, -0.211490789176643630, -0.211539657911791860, +-0.211588526118090480, -0.211637393795417790, -0.211686260943651640, -0.211735127562670270, -0.211783993652350620, -0.211832859212571000, -0.211881724243209250, -0.211930588744143610, +-0.211979452715251070, -0.212028316156409880, -0.212077179067498340, -0.212126041448393420, -0.212174903298973400, -0.212223764619116130, -0.212272625408699870, -0.212321485667601620, +-0.212370345395699660, -0.212419204592871810, -0.212468063258996390, -0.212516921393950400, -0.212565778997612090, -0.212614636069859340, -0.212663492610570440, -0.212712348619622380, +-0.212761204096893420, -0.212810059042261470, -0.212858913455604790, -0.212907767336800420, -0.212956620685726600, -0.213005473502261260, -0.213054325786282640, -0.213103177537667800, +-0.213152028756294990, -0.213200879442042580, -0.213249729594787500, -0.213298579214408120, -0.213347428300782270, -0.213396276853788290, -0.213445124873303190, -0.213493972359205280, +-0.213542819311372420, -0.213591665729682970, -0.213640511614013930, -0.213689356964243570, -0.213738201780249850, -0.213787046061911040, -0.213835889809104200, -0.213884733021707630, +-0.213933575699599670, -0.213982417842657310, -0.214031259450758930, -0.214080100523782400, -0.214128941061606040, -0.214177781064106900, -0.214226620531163310, -0.214275459462653170, +-0.214324297858454800, -0.214373135718445270, -0.214421973042502880, -0.214470809830505590, -0.214519646082331680, -0.214568481797858230, -0.214617316976963600, -0.214666151619525620, +-0.214714985725422750, -0.214763819294531950, -0.214812652326731630, -0.214861484821899650, -0.214910316779914400, -0.214959148200652930, -0.215007979083993610, -0.215056809429814750, +-0.215105639237993420, -0.215154468508408030, -0.215203297240936430, -0.215252125435457050, -0.215300953091846910, -0.215349780209984380, -0.215398606789747430, -0.215447432831014360, +-0.215496258333662290, -0.215545083297569580, -0.215593907722614160, -0.215642731608674390, -0.215691554955627360, -0.215740377763351480, -0.215789200031724610, -0.215838021760625190, +-0.215886842949930300, -0.215935663599518270, -0.215984483709267090, -0.216033303279055150, -0.216082122308759510, -0.216130940798258560, -0.216179758747430700, -0.216228576156153010, +-0.216277393024303880, -0.216326209351761250, -0.216375025138403540, -0.216423840384107840, -0.216472655088752520, -0.216521469252215580, -0.216570282874375410, -0.216619095955109090, +-0.216667908494295010, -0.216716720491811180, -0.216765531947535980, -0.216814342861346520, -0.216863153233121190, -0.216911963062738440, -0.216960772350075330, -0.217009581095010280, +-0.217058389297421270, -0.217107196957186750, -0.217156004074183780, -0.217204810648290810, -0.217253616679385810, -0.217302422167347210, -0.217351227112052130, -0.217400031513378940, +-0.217448835371205710, -0.217497638685410830, -0.217546441455871400, -0.217595243682465860, -0.217644045365072230, -0.217692846503568900, -0.217741647097833060, -0.217790447147743070, +-0.217839246653176940, -0.217888045614013180, -0.217936844030128830, -0.217985641901402400, -0.218034439227712290, -0.218083236008935640, -0.218132032244950900, -0.218180827935636090, +-0.218229623080869630, -0.218278417680528690, -0.218327211734491710, -0.218376005242636670, -0.218424798204842090, -0.218473590620985060, -0.218522382490944050, -0.218571173814597090, +-0.218619964591822650, -0.218668754822497840, -0.218717544506501160, -0.218766333643711040, -0.218815122234004650, -0.218863910277260460, -0.218912697773356480, -0.218961484722170780, +-0.219010271123581790, -0.219059056977466690, -0.219107842283703950, -0.219156627042172040, -0.219205411252748120, -0.219254194915310670, -0.219302978029737750, -0.219351760595907800, +-0.219400542613698010, -0.219449324082986900, -0.219498105003652440, -0.219546885375573180, -0.219595665198626250, -0.219644444472690160, -0.219693223197642980, -0.219742001373363170, +-0.219790778999727900, -0.219839556076615710, -0.219888332603905030, -0.219937108581473110, -0.219985884009198410, -0.220034658886959030, -0.220083433214633390, -0.220132206992098760, +-0.220180980219233600, -0.220229752895916010, -0.220278525022024470, -0.220327296597436160, -0.220376067622029630, -0.220424838095682920, -0.220473608018274540, -0.220522377389681720, +-0.220571146209782960, -0.220619914478456330, -0.220668682195580330, -0.220717449361032210, -0.220766215974690480, -0.220814982036433180, -0.220863747546138880, -0.220912512503684770, +-0.220961276908949370, -0.221010040761811240, -0.221058804062147530, -0.221107566809836840, -0.221156329004757230, -0.221205090646787230, -0.221253851735804090, -0.221302612271686290, +-0.221351372254311980, -0.221400131683559650, -0.221448890559306580, -0.221497648881431250, -0.221546406649811840, -0.221595163864326820, -0.221643920524853460, -0.221692676631270320, +-0.221741432183455910, -0.221790187181287480, -0.221838941624643570, -0.221887695513402320, -0.221936448847441850, -0.221985201626640680, -0.222033953850876040, -0.222082705520026540, +-0.222131456633970710, -0.222180207192585830, -0.222228957195750390, -0.222277706643342590, -0.222326455535240940, -0.222375203871322730, -0.222423951651466500, -0.222472698875550380, +-0.222521445543452960, -0.222570191655051490, -0.222618937210224550, -0.222667682208850250, -0.222716426650807180, -0.222765170535972640, -0.222813913864225140, -0.222862656635443300, +-0.222911398849504390, -0.222960140506286990, -0.223008881605669200, -0.223057622147529670, -0.223106362131745640, -0.223155101558195730, -0.223203840426758030, -0.223252578737311190, +-0.223301316489732480, -0.223350053683900460, -0.223398790319693290, -0.223447526396989590, -0.223496261915666660, -0.223544996875603060, -0.223593731276676950, -0.223642465118766980, +-0.223691198401750390, -0.223739931125505800, -0.223788663289911400, -0.223837394894845780, -0.223886125940186230, -0.223934856425811350, -0.223983586351599790, -0.224032315717428790, +-0.224081044523177040, -0.224129772768722670, -0.224178500453944300, -0.224227227578719240, -0.224275954142926110, -0.224324680146443110, -0.224373405589148840, -0.224422130470920610, +-0.224470854791637060, -0.224519578551176350, -0.224568301749417170, -0.224617024386236760, -0.224665746461513830, -0.224714467975126950, -0.224763188926953460, -0.224811909316872010, +-0.224860629144760770, -0.224909348410498390, -0.224958067113962240, -0.225006785255030900, -0.225055502833582580, -0.225104219849495970, -0.225152936302648350, -0.225201652192918410, +-0.225250367520184320, -0.225299082284324740, -0.225347796485217050, -0.225396510122739840, -0.225445223196771380, -0.225493935707190260, -0.225542647653873910, -0.225591359036700910, +-0.225640069855549520, -0.225688780110298390, -0.225737489800824890, -0.225786198927007660, -0.225834907488725340, -0.225883615485855340, -0.225932322918276310, -0.225981029785866460, +-0.226029736088504490, -0.226078441826067710, -0.226127146998434860, -0.226175851605484120, -0.226224555647094180, -0.226273259123142450, -0.226321962033507550, -0.226370664378067740, +-0.226419366156701720, -0.226468067369286820, -0.226516768015701780, -0.226565468095824810, -0.226614167609534590, -0.226662866556708560, -0.226711564937225330, -0.226760262750963200, +-0.226808959997800820, -0.226857656677615650, -0.226906352790286310, -0.226955048335691520, -0.227003743313708680, -0.227052437724216490, -0.227101131567093190, -0.227149824842217520, +-0.227198517549466850, -0.227247209688719860, -0.227295901259854880, -0.227344592262750560, -0.227393282697284320, -0.227441972563334870, -0.227490661860780510, -0.227539350589499920, +-0.227588038749370530, -0.227636726340271020, -0.227685413362080150, -0.227734099814675290, -0.227782785697935200, -0.227831471011738150, -0.227880155755962850, -0.227928839930486710, +-0.227977523535188490, -0.228026206569946460, -0.228074889034639350, -0.228123570929144560, -0.228172252253340870, -0.228220933007106550, -0.228269613190320330, -0.228318292802859620, +-0.228366971844603190, -0.228415650315429320, -0.228464328215216780, -0.228513005543842990, -0.228561682301186670, -0.228610358487126130, -0.228659034101540150, -0.228707709144306160, +-0.228756383615302870, -0.228805057514409080, -0.228853730841502210, -0.228902403596461000, -0.228951075779163770, -0.228999747389489310, -0.229048418427315020, -0.229097088892519700, +-0.229145758784981670, -0.229194428104579660, -0.229243096851191150, -0.229291765024694890, -0.229340432624969250, -0.229389099651892940, -0.229437766105343440, -0.229486431985199520, +-0.229535097291339560, -0.229583762023642250, -0.229632426181985120, -0.229681089766246900, -0.229729752776305970, -0.229778415212041120, -0.229827077073329780, -0.229875738360050740, +-0.229924399072082790, -0.229973059209303390, -0.230021718771591360, -0.230070377758825050, -0.230119036170883200, -0.230167694007643340, -0.230216351268984270, -0.230265007954784270, +-0.230313664064922210, -0.230362319599275560, -0.230410974557723110, -0.230459628940143210, -0.230508282746414690, -0.230556935976415020, -0.230605588630023030, -0.230654240707117490, +-0.230702892207575890, -0.230751543131277080, -0.230800193478099410, -0.230848843247921710, -0.230897492440621440, -0.230946141056077440, -0.230994789094168100, -0.231043436554772220, +-0.231092083437767330, -0.231140729743032210, -0.231189375470445270, -0.231238020619885330, -0.231286665191229900, -0.231335309184357800, -0.231383952599147430, -0.231432595435477620, +-0.231481237693225870, -0.231529879372271040, -0.231578520472491530, -0.231627160993766120, -0.231675800935972400, -0.231724440298989170, -0.231773079082695260, -0.231821717286968240, +-0.231870354911686890, -0.231918991956729690, -0.231967628421975440, -0.232016264307301680, -0.232064899612587250, -0.232113534337710590, -0.232162168482550500, -0.232210802046984580, +-0.232259435030891640, -0.232308067434150110, -0.232356699256638850, -0.232405330498235420, -0.232453961158818670, -0.232502591238267000, -0.232551220736459290, -0.232599849653273070, +-0.232648477988587260, -0.232697105742280250, -0.232745732914230900, -0.232794359504316790, -0.232842985512416780, -0.232891610938409740, -0.232940235782173240, -0.232988860043586150, +-0.233037483722526920, -0.233086106818874400, -0.233134729332506170, -0.233183351263301140, -0.233231972611137710, -0.233280593375894800, -0.233329213557449950, -0.233377833155682110, +-0.233426452170469640, -0.233475070601691510, -0.233523688449225250, -0.233572305712949760, -0.233620922392743960, -0.233669538488485430, -0.233718154000053020, -0.233766768927325260, +-0.233815383270180980, -0.233863997028497830, -0.233912610202154670, -0.233961222791029990, -0.234009834795002700, -0.234058446213950390, -0.234107057047751950, -0.234155667296285870, +-0.234204276959431050, -0.234252886037065120, -0.234301494529066960, -0.234350102435315070, -0.234398709755688360, -0.234447316490064450, -0.234495922638322220, -0.234544528200340220, +-0.234593133175997310, -0.234641737565171150, -0.234690341367740610, -0.234738944583584690, -0.234787547212580970, -0.234836149254608360, -0.234884750709545400, -0.234933351577270990, +-0.234981951857662770, -0.235030551550599650, -0.235079150655960160, -0.235127749173623250, -0.235176347103466520, -0.235224944445368900, -0.235273541199208960, -0.235322137364865570, +-0.235370732942216420, -0.235419327931140430, -0.235467922331516530, -0.235516516143222420, -0.235565109366137030, -0.235613702000138840, -0.235662294045106410, -0.235710885500918680, +-0.235759476367453290, -0.235808066644589230, -0.235856656332205400, -0.235905245430179540, -0.235953833938390530, -0.236002421856716970, -0.236051009185037770, -0.236099595923230600, +-0.236148182071174470, -0.236196767628747860, -0.236245352595829770, -0.236293936972297860, -0.236342520758031140, -0.236391103952908080, -0.236439686556807720, -0.236488268569607700, +-0.236536849991187010, -0.236585430821424610, -0.236634011060198210, -0.236682590707386810, -0.236731169762868900, -0.236779748226523510, -0.236828326098228320, -0.236876903377862320, +-0.236925480065304060, -0.236974056160432520, -0.237022631663125400, -0.237071206573261720, -0.237119780890720030, -0.237168354615379300, -0.237216927747117250, -0.237265500285812890, +-0.237314072231344790, -0.237362643583591940, -0.237411214342432040, -0.237459784507744100, -0.237508354079406710, -0.237556923057298860, -0.237605491441298280, -0.237654059231283940, +-0.237702626427134910, -0.237751193028728880, -0.237799759035944860, -0.237848324448661470, -0.237896889266757670, -0.237945453490111230, -0.237994017118601160, -0.238042580152106030, +-0.238091142590504870, -0.238139704433675460, -0.238188265681496760, -0.238236826333847410, -0.238285386390606420, -0.238333945851651550, -0.238382504716861790, -0.238431062986116220, +-0.238479620659292540, -0.238528177736269830, -0.238576734216926660, -0.238625290101142080, -0.238673845388793880, -0.238722400079761030, -0.238770954173922190, -0.238819507671156390, +-0.238868060571341410, -0.238916612874356280, -0.238965164580079600, -0.239013715688390440, -0.239062266199166570, -0.239110816112287020, -0.239159365427630440, -0.239207914145075890, +-0.239256462264501090, -0.239305009785785170, -0.239353556708806700, -0.239402103033444780, -0.239450648759577170, -0.239499193887082930, -0.239547738415841150, -0.239596282345729610, +-0.239644825676627340, -0.239693368408413020, -0.239741910540965690, -0.239790452074163160, -0.239838993007884500, -0.239887533342008350, -0.239936073076413820, -0.239984612210978670, +-0.240033150745581960, -0.240081688680102410, -0.240130226014419050, -0.240178762748409710, -0.240227298881953430, -0.240275834414928950, -0.240324369347215290, -0.240372903678690270, +-0.240421437409233000, -0.240469970538722130, -0.240518503067036760, -0.240567034994054710, -0.240615566319655080, -0.240664097043716970, -0.240712627166118160, -0.240761156686737810, +-0.240809685605454540, -0.240858213922147510, -0.240906741636694510, -0.240955268748974660, -0.241003795258866640, -0.241052321166249560, -0.241100846471001220, -0.241149371173000780, +-0.241197895272126930, -0.241246418768258750, -0.241294941661274100, -0.241343463951052110, -0.241391985637471880, -0.241440506720411260, -0.241489027199749350, -0.241537547075364900, +-0.241586066347137000, -0.241634585014943500, -0.241683103078663560, -0.241731620538175850, -0.241780137393359520, -0.241828653644092400, -0.241877169290253660, -0.241925684331721990, +-0.241974198768376560, -0.242022712600095170, -0.242071225826757020, -0.242119738448240810, -0.242168250464425670, -0.242216761875189480, -0.242265272680411370, -0.242313782879970100, +-0.242362292473744800, -0.242410801461613340, -0.242459309843454870, -0.242507817619148550, -0.242556324788572280, -0.242604831351605180, -0.242653337308125990, -0.242701842658013920, +-0.242750347401146790, -0.242798851537403800, -0.242847355066663660, -0.242895857988805590, -0.242944360303707420, -0.242992862011248370, -0.243041363111307170, -0.243089863603762970, +-0.243138363488493690, -0.243186862765378510, -0.243235361434296170, -0.243283859495125850, -0.243332356947745470, -0.243380853792034170, -0.243429350027870750, -0.243477845655134390, +-0.243526340673702960, -0.243574835083455700, -0.243623328884271790, -0.243671822076029110, -0.243720314658606880, -0.243768806631883880, -0.243817297995739280, -0.243865788750050990, +-0.243914278894698240, -0.243962768429559800, -0.244011257354514870, -0.244059745669441360, -0.244108233374218500, -0.244156720468725050, -0.244205206952840200, -0.244253692826441940, +-0.244302178089409430, -0.244350662741621930, -0.244399146782957290, -0.244447630213294830, -0.244496113032513280, -0.244544595240491880, -0.244593076837108570, -0.244641557822242560, +-0.244690038195772650, -0.244738517957578060, -0.244786997107536760, -0.244835475645527990, -0.244883953571430500, -0.244932430885123560, -0.244980907586485140, -0.245029383675394420, +-0.245077859151730250, -0.245126334015371870, -0.245174808266197230, -0.245223281904085540, -0.245271754928915680, -0.245320227340566850, -0.245368699138917010, -0.245417170323845440, +-0.245465640895231370, -0.245514110852952770, -0.245562580196888870, -0.245611048926918540, -0.245659517042921020, -0.245707984544774270, -0.245756451432357550, -0.245804917705549740, +-0.245853383364230020, -0.245901848408276450, -0.245950312837568240, -0.245998776651984250, -0.246047239851403730, -0.246095702435704690, -0.246144164404766410, -0.246192625758467700, +-0.246241086496687880, -0.246289546619304880, -0.246338006126198050, -0.246386465017246180, -0.246434923292328580, -0.246483380951323240, -0.246531837994109470, -0.246580294420566530, +-0.246628750230572400, -0.246677205424006420, -0.246725660000747420, -0.246774113960674670, -0.246822567303666250, -0.246871020029601370, -0.246919472138358960, -0.246967923629818310, +-0.247016374503857410, -0.247064824760355600, -0.247113274399191700, -0.247161723420245030, -0.247210171823393670, -0.247258619608516830, -0.247307066775493910, -0.247355513324202860, +-0.247403959254523050, -0.247452404566333330, -0.247500849259512600, -0.247549293333940180, -0.247597736789494090, -0.247646179626053680, -0.247694621843498250, -0.247743063441705800, +-0.247791504420555720, -0.247839944779926880, -0.247888384519698610, -0.247936823639748920, -0.247985262139957200, -0.248033700020202750, -0.248082137280363600, -0.248130573920319120, +-0.248179009939948210, -0.248227445339129770, -0.248275880117743150, -0.248324314275666400, -0.248372747812778880, -0.248421180728959880, -0.248469613024087540, -0.248518044698041150, +-0.248566475750699650, -0.248614906181942400, -0.248663335991647440, -0.248711765179694150, -0.248760193745961420, -0.248808621690328660, -0.248857049012673910, -0.248905475712876550, +-0.248953901790815500, -0.249002327246370110, -0.249050752079418490, -0.249099176289839960, -0.249147599877513950, -0.249196022842318510, -0.249244445184133000, -0.249292866902836360, +-0.249341287998307570, -0.249389708470425990, -0.249438128319069720, -0.249486547544118110, -0.249534966145450590, -0.249583384122945200, -0.249631801476481370, -0.249680218205938030, +-0.249728634311194550, -0.249777049792129090, -0.249825464648620960, -0.249873878880549210, -0.249922292487793190, -0.249970705470230980, -0.250019117827742050, -0.250067529560205280, +-0.250115940667500150, -0.250164351149504690, -0.250212761006098410, -0.250261170237160660, -0.250309578842569490, -0.250357986822204450, -0.250406394175944400, -0.250454800903668340, +-0.250503207005255750, -0.250551612480584720, -0.250600017329534630, -0.250648421551984910, -0.250696825147813720, -0.250745228116900480, -0.250793630459124170, -0.250842032174364240, +-0.250890433262498770, -0.250938833723407200, -0.250987233556969000, -0.251035632763062290, -0.251084031341566480, -0.251132429292360630, -0.251180826615323650, -0.251229223310335090, +-0.251277619377273000, -0.251326014816016910, -0.251374409626446140, -0.251422803808438950, -0.251471197361874790, -0.251519590286632570, -0.251567982582591830, -0.251616374249630740, +-0.251664765287628660, -0.251713155696464690, -0.251761545476018260, -0.251809934626167580, -0.251858323146792020, -0.251906711037770630, -0.251955098298982940, -0.252003484930307050, +-0.252051870931622460, -0.252100256302808580, -0.252148641043743680, -0.252197025154307140, -0.252245408634378050, -0.252293791483835460, -0.252342173702558790, -0.252390555290426310, +-0.252438936247317390, -0.252487316573111580, -0.252535696267687020, -0.252584075330923250, -0.252632453762699270, -0.252680831562894610, -0.252729208731387430, -0.252777585268057270, +-0.252825961172783110, -0.252874336445444440, -0.252922711085919520, -0.252971085094087830, -0.253019458469828480, -0.253067831213020840, -0.253116203323543230, -0.253164574801275080, +-0.253212945646095980, -0.253261315857884030, -0.253309685436518830, -0.253358054381879360, -0.253406422693845220, -0.253454790372294620, -0.253503157417106990, -0.253551523828161480, +-0.253599889605337640, -0.253648254748513600, -0.253696619257568920, -0.253744983132382750, -0.253793346372834520, -0.253841708978802430, -0.253890070950166140, -0.253938432286805070, +-0.253986792988597500, -0.254035153055422960, -0.254083512487160550, -0.254131871283689300, -0.254180229444888880, -0.254228586970637380, -0.254276943860814450, -0.254325300115299640, +-0.254373655733971080, -0.254422010716708390, -0.254470365063390660, -0.254518718773897480, -0.254567071848107060, -0.254615424285899010, -0.254663776087152350, -0.254712127251746630, +-0.254760477779560230, -0.254808827670472640, -0.254857176924362940, -0.254905525541110790, -0.254953873520594340, -0.255002220862693200, -0.255050567567286950, -0.255098913634253910, +-0.255147259063473520, -0.255195603854824980, -0.255243948008187450, -0.255292291523440520, -0.255340634400462340, -0.255388976639132630, -0.255437318239330910, -0.255485659200935470, +-0.255533999523825880, -0.255582339207881260, -0.255630678252981250, -0.255679016659004110, -0.255727354425829450, -0.255775691553336350, -0.255824028041404530, -0.255872363889912140, +-0.255920699098738880, -0.255969033667763860, -0.256017367596866660, -0.256065700885925620, -0.256114033534820370, -0.256162365543430410, -0.256210696911634170, -0.256259027639311130, +-0.256307357726340560, -0.256355687172601990, -0.256404015977973800, -0.256452344142335530, -0.256500671665566450, -0.256548998547546090, -0.256597324788152840, -0.256645650387266220, +-0.256693975344765510, -0.256742299660530300, -0.256790623334438920, -0.256838946366370950, -0.256887268756206040, -0.256935590503822590, -0.256983911609100110, -0.257032232071917830, +-0.257080551892155010, -0.257128871069691230, -0.257177189604404830, -0.257225507496175450, -0.257273824744882810, -0.257322141350405100, -0.257370457312622040, -0.257418772631412830, +-0.257467087306657180, -0.257515401338233310, -0.257563714726020960, -0.257612027469899360, -0.257660339569748100, -0.257708651025445550, -0.257756961836871360, -0.257805272003904800, +-0.257853581526425460, -0.257901890404311770, -0.257950198637443340, -0.257998506225699810, -0.258046813168959610, -0.258095119467102400, -0.258143425120007370, -0.258191730127553750, +-0.258240034489621300, -0.258288338206088260, -0.258336641276834420, -0.258384943701739420, -0.258433245480681580, -0.258481546613540670, -0.258529847100195890, -0.258578146940526890, +-0.258626446134412100, -0.258674744681731240, -0.258723042582363500, -0.258771339836188550, -0.258819636443084870, -0.258867932402932040, -0.258916227715609400, -0.258964522380996650, +-0.259012816398972170, -0.259061109769415600, -0.259109402492206710, -0.259157694567223870, -0.259205985994346800, -0.259254276773454810, -0.259302566904427490, -0.259350856387143340, +-0.259399145221482110, -0.259447433407322960, -0.259495720944545650, -0.259544007833028610, -0.259592294072651550, -0.259640579663293790, -0.259688864604834980, -0.259737148897153600, +-0.259785432540129370, -0.259833715533641930, -0.259881997877569830, -0.259930279571792660, -0.259978560616189850, -0.260026841010640610, -0.260075120755024700, -0.260123399849220560, +-0.260171678293107940, -0.260219956086566560, -0.260268233229474840, -0.260316509721712550, -0.260364785563158950, -0.260413060753693860, -0.260461335293195650, -0.260509609181544140, +-0.260557882418618600, -0.260606155004298790, -0.260654426938463140, -0.260702698220991400, -0.260750968851762970, -0.260799238830657530, -0.260847508157553530, -0.260895776832330780, +-0.260944044854869050, -0.260992312225046710, -0.261040578942743630, -0.261088845007839130, -0.261137110420212480, -0.261185375179743500, -0.261233639286310660, -0.261281902739793680, +-0.261330165540072430, -0.261378427687025290, -0.261426689180532080, -0.261474950020472160, -0.261523210206725310, -0.261571469739170000, -0.261619728617686010, -0.261667986842152700, +-0.261716244412449890, -0.261764501328455970, -0.261812757590050850, -0.261861013197113800, -0.261909268149524700, -0.261957522447161920, -0.262005776089905380, -0.262054029077634810, +-0.262102281410228790, -0.262150533087567030, -0.262198784109528900, -0.262247034475994290, -0.262295284186841670, -0.262343533241950810, -0.262391781641201140, -0.262440029384472420, +-0.262488276471643240, -0.262536522902593330, -0.262584768677202100, -0.262633013795349420, -0.262681258256913740, -0.262729502061774920, -0.262777745209812790, -0.262825987700905870, +-0.262874229534934000, -0.262922470711776550, -0.262970711231312880, -0.263018951093422880, -0.263067190297985090, -0.263115428844879320, -0.263163666733985390, -0.263211903965181850, +-0.263260140538348620, -0.263308376453364970, -0.263356611710110820, -0.263404846308464720, -0.263453080248306550, -0.263501313529515610, -0.263549546151971850, -0.263597778115553790, +-0.263646009420141270, -0.263694240065613760, -0.263742470051851030, -0.263790699378731730, -0.263838928046135680, -0.263887156053942750, -0.263935383402031490, -0.263983610090281760, +-0.264031836118573000, -0.264080061486784650, -0.264128286194796610, -0.264176510242487390, -0.264224733629736920, -0.264272956356425060, -0.264321178422430300, -0.264369399827632690, +-0.264417620571911540, -0.264465840655146780, -0.264514060077216950, -0.264562278838001990, -0.264610496937381760, -0.264658714375234860, -0.264706931151441170, -0.264755147265880180, +-0.264803362718431300, -0.264851577508974480, -0.264899791637388250, -0.264948005103552540, -0.264996217907347230, -0.265044430048650970, -0.265092641527343630, -0.265140852343304700, +-0.265189062496414050, -0.265237271986550340, -0.265285480813593430, -0.265333688977422820, -0.265381896477918430, -0.265430103314958870, -0.265478309488423990, -0.265526514998193410, +-0.265574719844146930, -0.265622924026163280, -0.265671127544122250, -0.265719330397903850, -0.265767532587386720, -0.265815734112450740, -0.265863934972975450, -0.265912135168840270, +-0.265960334699925250, -0.266008533566108930, -0.266056731767271240, -0.266104929303292210, -0.266153126174050400, -0.266201322379425730, -0.266249517919297850, -0.266297712793546530, +-0.266345907002050520, -0.266394100544689760, -0.266442293421343730, -0.266490485631892370, -0.266538677176214430, -0.266586868054189740, -0.266635058265697940, -0.266683247810618860, +-0.266731436688831260, -0.266779624900215060, -0.266827812444650260, -0.266875999322015440, -0.266924185532190660, -0.266972371075055450, -0.267020555950489680, -0.267068740158372120, +-0.267116923698582700, -0.267165106571000950, -0.267213288775506930, -0.267261470311979220, -0.267309651180297810, -0.267357831380342300, -0.267406010911992620, -0.267454189775127530, +-0.267502367969626900, -0.267550545495370830, -0.267598722352237970, -0.267646898540108260, -0.267695074058861340, -0.267743248908376750, -0.267791423088534430, -0.267839596599213140, +-0.267887769440292860, -0.267935941611653570, -0.267984113113173990, -0.268032283944734160, -0.268080454106213560, -0.268128623597492340, -0.268176792418449050, -0.268224960568963830, +-0.268273128048916230, -0.268321294858186180, -0.268369460996652490, -0.268417626464195150, -0.268465791260693750, -0.268513955386028290, -0.268562118840077520, -0.268610281622721440, +-0.268658443733840120, -0.268706605173312240, -0.268754765941017830, -0.268802926036836530, -0.268851085460647900, -0.268899244212331970, -0.268947402291767500, -0.268995559698834540, +-0.269043716433413130, -0.269091872495381970, -0.269140027884621160, -0.269188182601010240, -0.269236336644429360, -0.269284490014757130, -0.269332642711873740, -0.269380794735658680, +-0.269428946085992100, -0.269477096762752720, -0.269525246765820630, -0.269573396095075360, -0.269621544750397070, -0.269669692731664470, -0.269717840038757650, -0.269765986671556660, +-0.269814132629940310, -0.269862277913788580, -0.269910422522981140, -0.269958566457398130, -0.270006709716918260, -0.270054852301421570, -0.270102994210787820, -0.270151135444896940, +-0.270199276003627810, -0.270247415886860520, -0.270295555094474670, -0.270343693626350360, -0.270391831482366400, -0.270439968662402890, -0.270488105166339870, -0.270536240994056100, +-0.270584376145431790, -0.270632510620346490, -0.270680644418679950, -0.270728777540312220, -0.270776909985122160, -0.270825041752989770, -0.270873172843795200, -0.270921303257417310, +-0.270969432993736100, -0.271017562052631390, -0.271065690433983150, -0.271113818137670270, -0.271161945163572840, -0.271210071511570560, -0.271258197181543480, -0.271306322173370530, +-0.271354446486931740, -0.271402570122106890, -0.271450693078776010, -0.271498815356817970, -0.271546936956112870, -0.271595057876540870, -0.271643178117980830, -0.271691297680312800, +-0.271739416563416550, -0.271787534767171770, -0.271835652291458560, -0.271883769136155810, -0.271931885301143590, -0.271980000786302130, -0.272028115591510240, -0.272076229716648020, +-0.272124343161595280, -0.272172455926232070, -0.272220568010437310, -0.272268679414091110, -0.272316790137073270, -0.272364900179263850, -0.272413009540541710, -0.272461118220787110, +-0.272509226219879660, -0.272557333537699620, -0.272605440174125800, -0.272653546129038360, -0.272701651402317500, -0.272749755993842050, -0.272797859903492260, -0.272845963131147780, +-0.272894065676688890, -0.272942167539994340, -0.272990268720944400, -0.273038369219418760, -0.273086469035297650, -0.273134568168459930, -0.273182666618785820, -0.273230764386155010, +-0.273278861470447720, -0.273326957871542870, -0.273375053589320570, -0.273423148623661130, -0.273471242974443360, -0.273519336641547480, -0.273567429624853250, -0.273615521924240490, +-0.273663613539589290, -0.273711704470778690, -0.273759794717688800, -0.273807884280199860, -0.273855973158190770, -0.273904061351541770, -0.273952148860132580, -0.274000235683843460, +-0.274048321822553340, -0.274096407276142370, -0.274144492044490430, -0.274192576127477660, -0.274240659524983050, -0.274288742236886760, -0.274336824263068660, -0.274384905603408890, +-0.274432986257786450, -0.274481066226081540, -0.274529145508174370, -0.274577224103943920, -0.274625302013270400, -0.274673379236033630, -0.274721455772113430, -0.274769531621390010, +-0.274817606783742340, -0.274865681259050640, -0.274913755047195170, -0.274961828148054870, -0.275009900561510030, -0.275057972287440390, -0.275106043325726300, -0.275154113676246650, +-0.275202183338881750, -0.275250252313511360, -0.275298320600015740, -0.275346388198273890, -0.275394455108166130, -0.275442521329572200, -0.275490586862372380, -0.275538651706445700, +-0.275586715861672380, -0.275634779327932680, -0.275682842105105630, -0.275730904193071450, -0.275778965591710000, -0.275827026300901610, -0.275875086320525150, -0.275923145650461050, +-0.275971204290589080, -0.276019262240789490, -0.276067319500941320, -0.276115376070924900, -0.276163431950619990, -0.276211487139906950, -0.276259541638664730, -0.276307595446773690, +-0.276355648564114100, -0.276403700990564940, -0.276451752726006530, -0.276499803770318740, -0.276547854123381450, -0.276595903785074930, -0.276643952755278260, -0.276692001033871650, +-0.276740048620735530, -0.276788095515748790, -0.276836141718791890, -0.276884187229744560, -0.276932232048487270, -0.276980276174898900, -0.277028319608859870, -0.277076362350250070, +-0.277124404398949750, -0.277172445754838010, -0.277220486417795120, -0.277268526387701050, -0.277316565664436080, -0.277364604247879290, -0.277412642137910950, -0.277460679334411490, +-0.277508715837259830, -0.277556751646336420, -0.277604786761521170, -0.277652821182693910, -0.277700854909735010, -0.277748887942523560, -0.277796920280939890, -0.277844951924864360, +-0.277892982874176020, -0.277941013128755240, -0.277989042688481900, -0.278037071553236370, -0.278085099722897740, -0.278133127197346400, -0.278181153976462650, -0.278229180060125540, +-0.278277205448215550, -0.278325230140612500, -0.278373254137196380, -0.278421277437847560, -0.278469300042445130, -0.278517321950869420, -0.278565343163000860, -0.278613363678718530, +-0.278661383497902760, -0.278709402620433530, -0.278757421046191220, -0.278805438775054980, -0.278853455806905070, -0.278901472141621590, -0.278949487779084790, -0.278997502719173900, +-0.279045516961769210, -0.279093530506750790, -0.279141543353998880, -0.279189555503392750, -0.279237566954812720, -0.279285577708139220, -0.279333587763251290, -0.279381597120029410, +-0.279429605778353570, -0.279477613738103700, -0.279525620999160230, -0.279573627561402250, -0.279621633424710250, -0.279669638588964540, -0.279717643054044340, -0.279765646819830020, +-0.279813649886201610, -0.279861652253039440, -0.279909653920222770, -0.279957654887631970, -0.280005655155146970, -0.280053654722648320, -0.280101653590015100, -0.280149651757127690, +-0.280197649223866200, -0.280245645990111040, -0.280293642055741310, -0.280341637420637450, -0.280389632084679930, -0.280437626047747910, -0.280485619309721880, -0.280533611870481760, +-0.280581603729907590, -0.280629594887879860, -0.280677585344277670, -0.280725575098981550, -0.280773564151871930, -0.280821552502827980, -0.280869540151730160, -0.280917527098458460, +-0.280965513342893380, -0.281013498884914060, -0.281061483724401040, -0.281109467861234700, -0.281157451295294290, -0.281205434026460200, -0.281253416054612570, -0.281301397379631450, +-0.281349378001397200, -0.281397357919789090, -0.281445337134687560, -0.281493315645973130, -0.281541293453525020, -0.281589270557223600, -0.281637246956949080, -0.281685222652581830, +-0.281733197644001120, -0.281781171931087430, -0.281829145513720740, -0.281877118391781700, -0.281925090565149360, -0.281973062033704310, -0.282021032797326650, -0.282069002855896810, +-0.282116972209294050, -0.282164940857398850, -0.282212908800091700, -0.282260876037251860, -0.282308842568759880, -0.282356808394495730, -0.282404773514339570, -0.282452737928171940, +-0.282500701635871990, -0.282548664637320310, -0.282596626932397400, -0.282644588520982510, -0.282692549402956130, -0.282740509578198350, -0.282788469046589770, -0.282836427808009610, +-0.282884385862338330, -0.282932343209456090, -0.282980299849243440, -0.283028255781579590, -0.283076211006345110, -0.283124165523420070, -0.283172119332685100, -0.283220072434019370, +-0.283268024827303510, -0.283315976512417970, -0.283363927489242050, -0.283411877757656310, -0.283459827317540940, -0.283507776168776370, -0.283555724311241930, -0.283603671744818210, +-0.283651618469385300, -0.283699564484823750, -0.283747509791012880, -0.283795454387833270, -0.283843398275164970, -0.283891341452888630, -0.283939283920883470, -0.283987225679030120, +-0.284035166727209190, -0.284083107065299880, -0.284131046693182790, -0.284178985610738070, -0.284226923817845870, -0.284274861314386840, -0.284322798100240190, -0.284370734175286580, +-0.284418669539406530, -0.284466604192479430, -0.284514538134385760, -0.284562471365005790, -0.284610403884220040, -0.284658335691907850, -0.284706266787949860, -0.284754197172226160, +-0.284802126844617420, -0.284850055805002940, -0.284897984053263280, -0.284945911589278680, -0.284993838412929750, -0.285041764524095800, -0.285089689922657430, -0.285137614608495240, +-0.285185538581488600, -0.285233461841518100, -0.285281384388463950, -0.285329306222206370, -0.285377227342625940, -0.285425147749601980, -0.285473067443015200, -0.285520986422746150, +-0.285568904688674190, -0.285616822240680020, -0.285664739078643760, -0.285712655202446100, -0.285760570611966360, -0.285808485307085190, -0.285856399287682810, -0.285904312553639850, +-0.285952225104835700, -0.286000136941150950, -0.286048048062465920, -0.286095958468661150, -0.286143868159616070, -0.286191777135211320, -0.286239685395327570, -0.286287592939844130, +-0.286335499768641750, -0.286383405881600610, -0.286431311278601390, -0.286479215959523470, -0.286527119924247510, -0.286575023172653710, -0.286622925704622830, -0.286670827520034140, +-0.286718728618768460, -0.286766629000705930, -0.286814528665727260, -0.286862427613711830, -0.286910325844540350, -0.286958223358093460, -0.287006120154250590, -0.287054016232892390, +-0.287101911593899200, -0.287149806237151200, -0.287197700162529160, -0.287245593369912400, -0.287293485859181690, -0.287341377630217610, -0.287389268682899710, -0.287437159017108650, +-0.287485048632724730, -0.287532937529628550, -0.287580825707699610, -0.287628713166818650, -0.287676599906865840, -0.287724485927721980, -0.287772371229266520, -0.287820255811380100, +-0.287868139673943040, -0.287916022816836090, -0.287963905239938590, -0.288011786943131400, -0.288059667926295120, -0.288107548189309230, -0.288155427732054490, -0.288203306554411230, +-0.288251184656259650, -0.288299062037480570, -0.288346938697953360, -0.288394814637558840, -0.288442689856177710, -0.288490564353689420, -0.288538438129974710, -0.288586311184913900, +-0.288634183518387770, -0.288682055130275730, -0.288729926020458550, -0.288777796188816550, -0.288825665635230490, -0.288873534359579850, -0.288921402361745410, -0.288969269641607410, +-0.289017136199046680, -0.289065002033942700, -0.289112867146176180, -0.289160731535627940, -0.289208595202177450, -0.289256458145705440, -0.289304320366092330, -0.289352181863218820, +-0.289400042636964390, -0.289447902687209930, -0.289495762013835700, -0.289543620616722450, -0.289591478495749730, -0.289639335650798360, -0.289687192081748590, -0.289735047788481300, +-0.289782902770875980, -0.289830757028813390, -0.289878610562174290, -0.289926463370838270, -0.289974315454686100, -0.290022166813598160, -0.290070017447454750, -0.290117867356136760, +-0.290165716539523670, -0.290213564997496290, -0.290261412729935440, -0.290309259736720620, -0.290357106017732620, -0.290404951572851900, -0.290452796401959200, -0.290500640504934070, +-0.290548483881657380, -0.290596326532009450, -0.290644168455871150, -0.290692009653121970, -0.290739850123642780, -0.290787689867314010, -0.290835528884016370, -0.290883367173629560, +-0.290931204736034290, -0.290979041571111430, -0.291026877678740530, -0.291074713058802450, -0.291122547711177570, -0.291170381635746320, -0.291218214832389580, -0.291266047300986870, +-0.291313879041419030, -0.291361710053566920, -0.291409540337310090, -0.291457369892529410, -0.291505198719105350, -0.291553026816918690, -0.291600854185849020, -0.291648680825777220, +-0.291696506736584150, -0.291744331918149410, -0.291792156370353830, -0.291839980093077880, -0.291887803086201940, -0.291935625349606930, -0.291983446883172400, -0.292031267686779280, +-0.292079087760308440, -0.292126907103639420, -0.292174725716653150, -0.292222543599230110, -0.292270360751251070, -0.292318177172595730, -0.292365992863144910, -0.292413807822779150, +-0.292461622051379320, -0.292509435548824970, -0.292557248314997020, -0.292605060349775960, -0.292652871653042710, -0.292700682224676820, -0.292748492064559220, -0.292796301172570830, +-0.292844109548591250, -0.292891917192501410, -0.292939724104181790, -0.292987530283512820, -0.293035335730375490, -0.293083140444649340, -0.293130944426215400, -0.293178747674954500, +-0.293226550190746280, -0.293274351973471740, -0.293322153023011290, -0.293369953339245870, -0.293417752922055190, -0.293465551771320050, -0.293513349886921070, -0.293561147268739160, +-0.293608943916653930, -0.293656739830546350, -0.293704535010296920, -0.293752329455786610, -0.293800123166895020, -0.293847916143503090, -0.293895708385491840, -0.293943499892740880, +-0.293991290665131190, -0.294039080702543250, -0.294086870004857610, -0.294134658571955250, -0.294182446403715770, -0.294230233500020200, -0.294278019860749470, -0.294325805485783240, +-0.294373590375002550, -0.294421374528287870, -0.294469157945520140, -0.294516940626579130, -0.294564722571345750, -0.294612503779701000, -0.294660284251524520, -0.294708063986697410, +-0.294755842985100100, -0.294803621246613130, -0.294851398771117600, -0.294899175558493150, -0.294946951608620720, -0.294994726921381340, -0.295042501496654790, -0.295090275334321920, +-0.295138048434263330, -0.295185820796360130, -0.295233592420491910, -0.295281363306539700, -0.295329133454384110, -0.295376902863906050, -0.295424671534985360, -0.295472439467503010, +-0.295520206661339550, -0.295567973116375950, -0.295615738832492040, -0.295663503809568740, -0.295711268047487150, -0.295759031546126930, -0.295806794305369160, -0.295854556325094390, +-0.295902317605183260, -0.295950078145516720, -0.295997837945974560, -0.296045597006437840, -0.296093355326787540, -0.296141112906903430, -0.296188869746666530, -0.296236625845957450, +-0.296284381204657220, -0.296332135822645610, -0.296379889699803670, -0.296427642836012030, -0.296475395231151680, -0.296523146885102450, -0.296570897797745310, -0.296618647968960980, +-0.296666397398630380, -0.296714146086633430, -0.296761894032851080, -0.296809641237164410, -0.296857387699453250, -0.296905133419598620, -0.296952878397481130, -0.297000622632981880, +-0.297048366125980620, -0.297096108876358460, -0.297143850883996030, -0.297191592148774440, -0.297239332670573400, -0.297287072449274050, -0.297334811484756990, -0.297382549776903370, +-0.297430287325592900, -0.297478024130706730, -0.297525760192125950, -0.297573495509730330, -0.297621230083400970, -0.297668963913018500, -0.297716696998463700, -0.297764429339617500, +-0.297812160936359870, -0.297859891788571810, -0.297907621896134400, -0.297955351258927580, -0.298003079876832330, -0.298050807749729420, -0.298098534877499880, -0.298146261260023640, +-0.298193986897181680, -0.298241711788854780, -0.298289435934924020, -0.298337159335269280, -0.298384881989771590, -0.298432603898311720, -0.298480325060770770, -0.298528045477028550, +-0.298575765146966270, -0.298623484070464960, -0.298671202247404510, -0.298718919677666060, -0.298766636361130320, -0.298814352297678000, -0.298862067487190240, -0.298909781929546870, +-0.298957495624629030, -0.299005208572317880, -0.299052920772493290, -0.299100632225036410, -0.299148342929827950, -0.299196052886749000, -0.299243762095679540, -0.299291470556500680, +-0.299339178269093120, -0.299386885233338060, -0.299434591449115380, -0.299482296916306180, -0.299530001634791270, -0.299577705604451740, -0.299625408825167580, -0.299673111296819840, +-0.299720813019289770, -0.299768513992457300, -0.299816214216203470, -0.299863913690409100, -0.299911612414955400, -0.299959310389722230, -0.300007007614590810, -0.300054704089441850, +-0.300102399814156600, -0.300150094788614870, -0.300197789012697950, -0.300245482486286520, -0.300293175209261800, -0.300340867181503710, -0.300388558402893470, -0.300436248873312270, +-0.300483938592640050, -0.300531627560757960, -0.300579315777546760, -0.300627003242887330, -0.300674689956660800, -0.300722375918747060, -0.300770061129027490, -0.300817745587383110, +-0.300865429293693980, -0.300913112247841230, -0.300960794449705750, -0.301008475899168680, -0.301056156596110010, -0.301103836540410950, -0.301151515731952310, -0.301199194170615250, +-0.301246871856279850, -0.301294548788827220, -0.301342224968138230, -0.301389900394094130, -0.301437575066574810, -0.301485248985461580, -0.301532922150635650, -0.301580594561977000, +-0.301628266219366890, -0.301675937122686030, -0.301723607271815410, -0.301771276666636170, -0.301818945307028300, -0.301866613192873060, -0.301914280324051710, -0.301961946700444240, +-0.302009612321931910, -0.302057277188395590, -0.302104941299716430, -0.302152604655774540, -0.302200267256451100, -0.302247929101627070, -0.302295590191183570, -0.302343250525000660, +-0.302390910102959650, -0.302438568924941420, -0.302486226990827110, -0.302533884300496820, -0.302581540853831880, -0.302629196650713470, -0.302676851691021650, -0.302724505974637680, +-0.302772159501442430, -0.302819812271317270, -0.302867464284142130, -0.302915115539798270, -0.302962766038166690, -0.303010415779128630, -0.303058064762564080, -0.303105712988354370, +-0.303153360456380360, -0.303201007166523370, -0.303248653118663450, -0.303296298312681900, -0.303343942748460050, -0.303391586425877880, -0.303439229344816760, -0.303486871505157570, +-0.303534512906781240, -0.303582153549569020, -0.303629793433400960, -0.303677432558158430, -0.303725070923722750, -0.303772708529974010, -0.303820345376793480, -0.303867981464062020, +-0.303915616791661130, -0.303963251359470720, -0.304010885167372180, -0.304058518215246430, -0.304106150502974790, -0.304153782030437360, -0.304201412797515500, -0.304249042804090100, +-0.304296672050042520, -0.304344300535252850, -0.304391928259602370, -0.304439555222972560, -0.304487181425243390, -0.304534806866296300, -0.304582431546012170, -0.304630055464271960, +-0.304677678620957070, -0.304725301015947530, -0.304772922649124760, -0.304820543520370080, -0.304868163629563590, -0.304915782976586780, -0.304963401561320460, -0.305011019383646050, +-0.305058636443443660, -0.305106252740594720, -0.305153868274980530, -0.305201483046481260, -0.305249097054978320, -0.305296710300352600, -0.305344322782485080, -0.305391934501257230, +-0.305439545456549110, -0.305487155648242080, -0.305534765076217630, -0.305582373740355850, -0.305629981640538120, -0.305677588776645410, -0.305725195148559170, -0.305772800756159540, +-0.305820405599327880, -0.305868009677945250, -0.305915612991892960, -0.305963215541051270, -0.306010817325301500, -0.306058418344524740, -0.306106018598602310, -0.306153618087414430, +-0.306201216810842450, -0.306248814768767920, -0.306296411961070880, -0.306344008387632870, -0.306391604048334760, -0.306439198943057710, -0.306486793071683080, -0.306534386434091030, +-0.306581979030162990, -0.306629570859780430, -0.306677161922823570, -0.306724752219173780, -0.306772341748712100, -0.306819930511319950, -0.306867518506877600, -0.306915105735266420, +-0.306962692196367510, -0.307010277890062300, -0.307057862816230930, -0.307105446974754950, -0.307153030365515330, -0.307200612988393570, -0.307248194843269820, -0.307295775930025610, +-0.307343356248542420, -0.307390935798700360, -0.307438514580380960, -0.307486092593465320, -0.307533669837834420, -0.307581246313369750, -0.307628822019951560, -0.307676396957461300, +-0.307723971125780480, -0.307771544524789330, -0.307819117154369270, -0.307866689014401450, -0.307914260104767360, -0.307961830425347140, -0.308009399976022390, -0.308056968756674540, +-0.308104536767183860, -0.308152104007431820, -0.308199670477299510, -0.308247236176668050, -0.308294801105418960, -0.308342365263432390, -0.308389928650589900, -0.308437491266773060, +-0.308485053111862030, -0.308532614185738350, -0.308580174488283180, -0.308627734019377930, -0.308675292778902990, -0.308722850766739780, -0.308770407982769500, -0.308817964426873590, +-0.308865520098932310, -0.308913074998827250, -0.308960629126439510, -0.309008182481650630, -0.309055735064340860, -0.309103286874391760, -0.309150837911684850, -0.309198388176100460, +-0.309245937667520070, -0.309293486385824820, -0.309341034330895880, -0.309388581502614780, -0.309436127900861780, -0.309483673525518480, -0.309531218376466410, -0.309578762453585900, +-0.309626305756758420, -0.309673848285865250, -0.309721390040787860, -0.309768931021406570, -0.309816471227602920, -0.309864010659258120, -0.309911549316253700, -0.309959087198469980, +-0.310006624305788570, -0.310054160638090600, -0.310101696195257630, -0.310149230977170010, -0.310196764983709290, -0.310244298214757130, -0.310291830670193720, -0.310339362349900780, +-0.310386893253759450, -0.310434423381651340, -0.310481952733456690, -0.310529481309057160, -0.310577009108333970, -0.310624536131168640, -0.310672062377441550, -0.310719587847034300, +-0.310767112539828080, -0.310814636455704560, -0.310862159594543940, -0.310909681956227980, -0.310957203540638220, -0.311004724347655030, -0.311052244377160000, -0.311099763629034410, +-0.311147282103159390, -0.311194799799416610, -0.311242316717686370, -0.311289832857850330, -0.311337348219790140, -0.311384862803386180, -0.311432376608520080, -0.311479889635073000, +-0.311527401882926660, -0.311574913351961360, -0.311622424042058750, -0.311669933953100110, -0.311717443084967070, -0.311764951437540020, -0.311812459010700540, -0.311859965804329900, +-0.311907471818309800, -0.311954977052520620, -0.312002481506843950, -0.312049985181161560, -0.312097488075353760, -0.312144990189302200, -0.312192491522888190, -0.312239992075992960, +-0.312287491848498190, -0.312334990840284210, -0.312382489051232840, -0.312429986481225610, -0.312477483130143010, -0.312524978997866690, -0.312572474084277910, -0.312619968389258370, +-0.312667461912688520, -0.312714954654449980, -0.312762446614424090, -0.312809937792492440, -0.312857428188535570, -0.312904917802435180, -0.312952406634072420, -0.312999894683329060, +-0.313047381950085580, -0.313094868434223630, -0.313142354135624970, -0.313189839054169970, -0.313237323189740350, -0.313284806542217460, -0.313332289111482980, -0.313379770897417310, +-0.313427251899902230, -0.313474732118819040, -0.313522211554049410, -0.313569690205473870, -0.313617168072974070, -0.313664645156431390, -0.313712121455727470, -0.313759596970742850, +-0.313807071701359240, -0.313854545647458400, -0.313902018808920710, -0.313949491185628040, -0.313996962777461590, -0.314044433584302730, -0.314091903606033230, -0.314139372842533570, +-0.314186841293685460, -0.314234308959370660, -0.314281775839469700, -0.314329241933864250, -0.314376707242435720, -0.314424171765065820, -0.314471635501635090, -0.314519098452025300, +-0.314566560616117710, -0.314614021993794180, -0.314661482584935150, -0.314708942389422430, -0.314756401407137340, -0.314803859637961700, -0.314851317081775940, -0.314898773738461920, +-0.314946229607901420, -0.314993684689974850, -0.315041138984564100, -0.315088592491550520, -0.315136045210815450, -0.315183497142240700, -0.315230948285706750, -0.315278398641095470, +-0.315325848208288570, -0.315373296987166650, -0.315420744977611520, -0.315468192179504450, -0.315515638592727410, -0.315563084217160780, -0.315610529052686490, -0.315657973099185860, +-0.315705416356540700, -0.315752858824631610, -0.315800300503340350, -0.315847741392548340, -0.315895181492137410, -0.315942620801988090, -0.315990059321982260, -0.316037497052001680, +-0.316084933991926890, -0.316132370141639810, -0.316179805501021820, -0.316227240069954670, -0.316274673848319090, -0.316322106835996760, -0.316369539032869180, -0.316416970438818170, +-0.316464401053724310, -0.316511830877469480, -0.316559259909935050, -0.316606688151002900, -0.316654115600553570, -0.316701542258469030, -0.316748968124630990, -0.316796393198920110, +-0.316843817481218260, -0.316891240971406860, -0.316938663669367400, -0.316986085574981650, -0.317033506688130300, -0.317080927008695170, -0.317128346536558140, -0.317175765271599800, +-0.317223183213702080, -0.317270600362746400, -0.317318016718614650, -0.317365432281187410, -0.317412847050346610, -0.317460261025973690, -0.317507674207950510, -0.317555086596157720, +-0.317602498190477260, -0.317649908990790540, -0.317697318996979450, -0.317744728208924630, -0.317792136626508070, -0.317839544249611530, -0.317886951078115710, -0.317934357111902490, +-0.317981762350853400, -0.318029166794849940, -0.318076570443773910, -0.318123973297506080, -0.318171375355928320, -0.318218776618922510, -0.318266177086369400, -0.318313576758150810, +-0.318360975634148220, -0.318408373714243690, -0.318455770998317790, -0.318503167486252460, -0.318550563177929180, -0.318597958073229990, -0.318645352172035430, -0.318692745474227490, +-0.318740137979687700, -0.318787529688297930, -0.318834920599939010, -0.318882310714492690, -0.318929700031841070, -0.318977088551864800, -0.319024476274445800, -0.319071863199465570, +-0.319119249326806130, -0.319166634656348150, -0.319214019187973540, -0.319261402921563910, -0.319308785857001230, -0.319356167994166110, -0.319403549332940630, -0.319450929873206220, +-0.319498309614844930, -0.319545688557737460, -0.319593066701765740, -0.319640444046811800, -0.319687820592756300, -0.319735196339481280, -0.319782571286868270, -0.319829945434798810, +-0.319877318783154900, -0.319924691331817280, -0.319972063080667950, -0.320019434029588880, -0.320066804178460780, -0.320114173527165700, -0.320161542075585170, -0.320208909823601170, +-0.320256276771094530, -0.320303642917947160, -0.320351008264040730, -0.320398372809257150, -0.320445736553477250, -0.320493099496583000, -0.320540461638456010, -0.320587822978978250, +-0.320635183518030550, -0.320682543255494890, -0.320729902191253300, -0.320777260325186500, -0.320824617657176570, -0.320871974187105110, -0.320919329914853670, -0.320966684840304380, +-0.321014038963337910, -0.321061392283836400, -0.321108744801681780, -0.321156096516754860, -0.321203447428937750, -0.321250797538112030, -0.321298146844159690, -0.321345495346961610, +-0.321392843046399760, -0.321440189942356180, -0.321487536034711750, -0.321534881323348510, -0.321582225808148050, -0.321629569488992020, -0.321676912365762460, -0.321724254438340240, +-0.321771595706607350, -0.321818936170445880, -0.321866275829736700, -0.321913614684361800, -0.321960952734202890, -0.322008289979141990, -0.322055626419059940, -0.322102962053838810, +-0.322150296883360330, -0.322197630907506470, -0.322244964126158160, -0.322292296539197440, -0.322339628146505960, -0.322386958947965820, -0.322434288943457880, -0.322481618132864190, +-0.322528946516066890, -0.322576274092946810, -0.322623600863386040, -0.322670926827266280, -0.322718251984469180, -0.322765576334876900, -0.322812899878370250, -0.322860222614831380, +-0.322907544544142330, -0.322954865666183980, -0.323002185980838520, -0.323049505487987550, -0.323096824187513290, -0.323144142079296480, -0.323191459163219340, -0.323238775439163570, +-0.323286090907011270, -0.323333405566643360, -0.323380719417941890, -0.323428032460788660, -0.323475344695065730, -0.323522656120654010, -0.323569966737435710, -0.323617276545292880, +-0.323664585544106430, -0.323711893733758530, -0.323759201114130870, -0.323806507685105600, -0.323853813446563720, -0.323901118398387260, -0.323948422540458030, -0.323995725872658120, +-0.324043028394868540, -0.324090330106971360, -0.324137631008848350, -0.324184931100381660, -0.324232230381452270, -0.324279528851942280, -0.324326826511733890, -0.324374123360707980, +-0.324421419398746800, -0.324468714625732070, -0.324516009041545540, -0.324563302646069420, -0.324610595439184630, -0.324657887420773340, -0.324705178590717740, -0.324752468948898750, +-0.324799758495198650, -0.324847047229499140, -0.324894335151682420, -0.324941622261629430, -0.324988908559222410, -0.325036194044343090, -0.325083478716873710, -0.325130762576695260, +-0.325178045623689850, -0.325225327857739330, -0.325272609278725920, -0.325319889886530600, -0.325367169681035520, -0.325414448662122930, -0.325461726829673840, -0.325509004183570370, +-0.325556280723694410, -0.325603556449927780, -0.325650831362152670, -0.325698105460250020, -0.325745378744102140, -0.325792651213591240, -0.325839922868598310, -0.325887193709005540, +-0.325934463734694810, -0.325981732945548330, -0.326029001341447080, -0.326076268922273320, -0.326123535687908920, -0.326170801638236090, -0.326218066773135810, -0.326265331092490400, +-0.326312594596181670, -0.326359857284091840, -0.326407119156101930, -0.326454380212094280, -0.326501640451951070, -0.326548899875553360, -0.326596158482783390, -0.326643416273523000, +-0.326690673247654500, -0.326737929405058910, -0.326785184745618460, -0.326832439269215120, -0.326879692975731050, -0.326926945865047340, -0.326974197937046240, -0.327021449191609690, +-0.327068699628619900, -0.327115949247957950, -0.327163198049506110, -0.327210446033146750, -0.327257693198760800, -0.327304939546230630, -0.327352185075438170, -0.327399429786265180, +-0.327446673678594040, -0.327493916752305820, -0.327541159007282810, -0.327588400443407310, -0.327635641060560370, -0.327682880858624350, -0.327730119837481130, -0.327777357997013020, +-0.327824595337101120, -0.327871831857627690, -0.327919067558474720, -0.327966302439524520, -0.328013536500658060, -0.328060769741757850, -0.328108002162705640, -0.328155233763383900, +-0.328202464543673630, -0.328249694503457200, -0.328296923642616980, -0.328344151961034000, -0.328391379458590650, -0.328438606135168840, -0.328485831990650510, -0.328533057024918030, +-0.328580281237852550, -0.328627504629336260, -0.328674727199251670, -0.328721948947479860, -0.328769169873903200, -0.328816389978403570, -0.328863609260863390, -0.328910827721163810, +-0.328958045359187100, -0.329005262174815290, -0.329052478167930760, -0.329099693338414660, -0.329146907686149240, -0.329194121211016600, -0.329241333912899060, -0.329288545791677770, +-0.329335756847235150, -0.329382967079453530, -0.329430176488214040, -0.329477385073399130, -0.329524592834890770, -0.329571799772571340, -0.329619005886322040, -0.329666211176025180, +-0.329713415641562760, -0.329760619282817250, -0.329807822099669800, -0.329855024092002790, -0.329902225259698200, -0.329949425602638460, -0.329996625120704710, -0.330043823813779450, +-0.330091021681745030, -0.330138218724482620, -0.330185414941874700, -0.330232610333803240, -0.330279804900150240, -0.330326998640798120, -0.330374191555628140, -0.330421383644522610, +-0.330468574907364090, -0.330515765344033710, -0.330562954954413960, -0.330610143738386760, -0.330657331695834610, -0.330704518826638760, -0.330751705130681580, -0.330798890607845120, +-0.330846075258011910, -0.330893259081063040, -0.330940442076881060, -0.330987624245347940, -0.331034805586346240, -0.331081986099757030, -0.331129165785462920, -0.331176344643346280, +-0.331223522673288360, -0.331270699875171660, -0.331317876248878150, -0.331365051794289990, -0.331412226511289650, -0.331459400399758300, -0.331506573459578460, -0.331553745690632560, +-0.331600917092801930, -0.331648087665968980, -0.331695257410015760, -0.331742426324824920, -0.331789594410277500, -0.331836761666256140, -0.331883928092642890, -0.331931093689320220, +-0.331978258456169410, -0.332025422393072980, -0.332072585499912920, -0.332119747776571880, -0.332166909222931020, -0.332214069838872860, -0.332261229624280010, -0.332308388579033610, +-0.332355546703016260, -0.332402703996110050, -0.332449860458197520, -0.332497016089159880, -0.332544170888879720, -0.332591324857239130, -0.332638477994120660, -0.332685630299405570, +-0.332732781772976380, -0.332779932414715260, -0.332827082224504740, -0.332874231202226030, -0.332921379347761840, -0.332968526660994520, -0.333015673141805520, -0.333062818790077380, +-0.333109963605692120, -0.333157107588531950, -0.333204250738479480, -0.333251393055415960, -0.333298534539223920, -0.333345675189785970, -0.333392815006983420, -0.333439953990698870, +-0.333487092140814400, -0.333534229457212620, -0.333581365939774830, -0.333628501588383640, -0.333675636402921190, -0.333722770383270080, -0.333769903529311630, -0.333817035840928420, +-0.333864167318002610, -0.333911297960416800, -0.333958427768052350, -0.334005556740791800, -0.334052684878517800, -0.334099812181111620, -0.334146938648455960, -0.334194064280432970, +-0.334241189076924790, -0.334288313037814030, -0.334335436162982110, -0.334382558452311570, -0.334429679905685120, -0.334476800522983950, -0.334523920304090840, -0.334571039248887920, +-0.334618157357257860, -0.334665274629081910, -0.334712391064242830, -0.334759506662623160, -0.334806621424104330, -0.334853735348568940, -0.334900848435899180, -0.334947960685977320, +-0.334995072098686010, -0.335042182673906560, -0.335089292411521690, -0.335136401311413980, -0.335183509373464860, -0.335230616597556930, -0.335277722983572500, -0.335324828531394170, +-0.335371933240903360, -0.335419037111982680, -0.335466140144514480, -0.335513242338381260, -0.335560343693464600, -0.335607444209647000, -0.335654543886810870, -0.335701642724838710, +-0.335748740723612100, -0.335795837883013590, -0.335842934202925940, -0.335890029683230510, -0.335937124323810010, -0.335984218124546760, -0.336031311085322910, -0.336078403206021170, +-0.336125494486523070, -0.336172584926711200, -0.336219674526468280, -0.336266763285675730, -0.336313851204216310, -0.336360938281972280, -0.336408024518826290, -0.336455109914659820, +-0.336502194469355590, -0.336549278182795900, -0.336596361054863400, -0.336643443085439530, -0.336690524274407150, -0.336737604621648370, -0.336784684127046040, -0.336831762790481600, +-0.336878840611837760, -0.336925917590997210, -0.336972993727841450, -0.337020069022253180, -0.337067143474114760, -0.337114217083308520, -0.337161289849717110, -0.337208361773222050, +-0.337255432853706130, -0.337302503091051980, -0.337349572485141190, -0.337396641035856480, -0.337443708743080160, -0.337490775606694990, -0.337537841626582460, -0.337584906802625320, +-0.337631971134706390, -0.337679034622707040, -0.337726097266510090, -0.337773159065997970, -0.337820220021052890, -0.337867280131557700, -0.337914339397393900, -0.337961397818444250, +-0.338008455394591510, -0.338055512125717270, -0.338102568011704190, -0.338149623052434680, -0.338196677247791570, -0.338243730597656330, -0.338290783101911800, -0.338337834760440270, +-0.338384885573124570, -0.338431935539846240, -0.338478984660488090, -0.338526032934932440, -0.338573080363062160, -0.338620126944758790, -0.338667172679905040, -0.338714217568383820, +-0.338761261610076640, -0.338808304804866290, -0.338855347152635160, -0.338902388653265660, -0.338949429306640630, -0.338996469112641640, -0.339043508071151410, -0.339090546182052870, +-0.339137583445227540, -0.339184619860558260, -0.339231655427927440, -0.339278690147217840, -0.339325724018311130, -0.339372757041090160, -0.339419789215437250, -0.339466820541235280, +-0.339513851018365840, -0.339560880646711800, -0.339607909426155540, -0.339654937356579920, -0.339701964437866540, -0.339748990669898280, -0.339796016052557880, -0.339843040585727120, +-0.339890064269288690, -0.339937087103125150, -0.339984109087119290, -0.340031130221152720, -0.340078150505108310, -0.340125169938868600, -0.340172188522316340, -0.340219206255333200, +-0.340266223137802030, -0.340313239169605260, -0.340360254350625890, -0.340407268680745390, -0.340454282159846800, -0.340501294787812880, -0.340548306564525280, -0.340595317489866930, +-0.340642327563720320, -0.340689336785967860, -0.340736345156492480, -0.340783352675175840, -0.340830359341900810, -0.340877365156550320, -0.340924370119005950, -0.340971374229150690, +-0.341018377486866970, -0.341065379892037720, -0.341112381444544640, -0.341159382144270550, -0.341206381991098100, -0.341253380984910040, -0.341300379125588080, -0.341347376413015270, +-0.341394372847073910, -0.341441368427647110, -0.341488363154616450, -0.341535357027864920, -0.341582350047275330, -0.341629342212729500, -0.341676333524110310, -0.341723323981300290, +-0.341770313584181970, -0.341817302332638300, -0.341864290226550900, -0.341911277265802840, -0.341958263450276970, -0.342005248779855000, -0.342052233254419910, -0.342099216873854250, +-0.342146199638040990, -0.342193181546861790, -0.342240162600199630, -0.342287142797937090, -0.342334122139957120, -0.342381100626141410, -0.342428078256372950, -0.342475055030534270, +-0.342522030948508360, -0.342569006010176980, -0.342615980215423110, -0.342662953564129680, -0.342709926056178450, -0.342756897691452400, -0.342803868469834130, -0.342850838391206610, +-0.342897807455451560, -0.342944775662451960, -0.342991743012090460, -0.343038709504250030, -0.343085675138812380, -0.343132639915660560, -0.343179603834677100, -0.343226566895745100, +-0.343273529098746260, -0.343320490443563550, -0.343367450930080090, -0.343414410558177560, -0.343461369327739020, -0.343508327238647050, -0.343555284290784250, -0.343602240484033650, +-0.343649195818277020, -0.343696150293397450, -0.343743103909277870, -0.343790056665800150, -0.343837008562847270, -0.343883959600301880, -0.343930909778047020, -0.343977859095964460, +-0.344024807553937220, -0.344071755151847960, -0.344118701889579770, -0.344165647767014420, -0.344212592784034880, -0.344259536940523910, -0.344306480236364510, -0.344353422671438480, +-0.344400364245628920, -0.344447304958818870, -0.344494244810890080, -0.344541183801725710, -0.344588121931208410, -0.344635059199220770, -0.344681995605645940, -0.344728931150365680, +-0.344775865833263080, -0.344822799654221250, -0.344869732613121980, -0.344916664709848390, -0.344963595944283160, -0.345010526316309350, -0.345057455825808770, -0.345104384472664620, +-0.345151312256759430, -0.345198239177976430, -0.345245165236197420, -0.345292090431305490, -0.345339014763183290, -0.345385938231713980, -0.345432860836779430, -0.345479782578262730, +-0.345526703456047020, -0.345573623470014080, -0.345620542620047100, -0.345667460906028790, -0.345714378327842240, -0.345761294885369270, -0.345808210578493090, -0.345855125407096400, +-0.345902039371062340, -0.345948952470272740, -0.345995864704610740, -0.346042776073959110, -0.346089686578200940, -0.346136596217218100, -0.346183504990893840, -0.346230412899111160, +-0.346277319941752090, -0.346324226118699730, -0.346371131429836780, -0.346418035875045990, -0.346464939454210530, -0.346511842167212310, -0.346558744013934490, -0.346605644994260220, +-0.346652545108071420, -0.346699444355251240, -0.346746342735682500, -0.346793240249248290, -0.346840136895830540, -0.346887032675312460, -0.346933927587576800, -0.346980821632506760, +-0.347027714809984230, -0.347074607119892410, -0.347121498562114110, -0.347168389136532420, -0.347215278843029380, -0.347262167681488150, -0.347309055651791930, -0.347355942753822590, +-0.347402828987463440, -0.347449714352597190, -0.347496598849106720, -0.347543482476875110, -0.347590365235784400, -0.347637247125717750, -0.347684128146558410, -0.347731008298188370, +-0.347777887580490770, -0.347824765993348440, -0.347871643536644630, -0.347918520210261320, -0.347965396014081660, -0.348012270947988980, -0.348059145011865190, -0.348106018205593500, +-0.348152890529056790, -0.348199761982137870, -0.348246632564719940, -0.348293502276684990, -0.348340371117916330, -0.348387239088297160, -0.348434106187709420, -0.348480972416036480, +-0.348527837773161100, -0.348574702258966530, -0.348621565873334760, -0.348668428616149110, -0.348715290487292380, -0.348762151486647850, -0.348809011614097500, -0.348855870869524630, +-0.348902729252812070, -0.348949586763843130, -0.348996443402499800, -0.349043299168665330, -0.349090154062223100, -0.349137008083055030, -0.349183861231044390, -0.349230713506074150, +-0.349277564908027140, -0.349324415436786610, -0.349371265092234650, -0.349418113874254480, -0.349464961782729460, -0.349511808817541620, -0.349558654978574300, -0.349605500265710300, +-0.349652344678832990, -0.349699188217824360, -0.349746030882567780, -0.349792872672946120, -0.349839713588842750, -0.349886553630139600, -0.349933392796720090, -0.349980231088467150, +-0.350027068505263990, -0.350073905046992760, -0.350120740713536770, -0.350167575504779340, -0.350214409420602560, -0.350261242460889740, -0.350308074625523820, -0.350354905914387730, +-0.350401736327364770, -0.350448565864337090, -0.350495394525187960, -0.350542222309800760, -0.350589049218057610, -0.350635875249841860, -0.350682700405036350, -0.350729524683524580, +-0.350776348085188540, -0.350823170609911640, -0.350869992257577200, -0.350916813028067380, -0.350963632921265530, -0.351010451937054660, -0.351057270075317560, -0.351104087335937790, +-0.351150903718797310, -0.351197719223779630, -0.351244533850768040, -0.351291347599644700, -0.351338160470292980, -0.351384972462595870, -0.351431783576436730, -0.351478593811697770, +-0.351525403168262250, -0.351572211646013270, -0.351619019244834190, -0.351665825964607100, -0.351712631805215450, -0.351759436766542260, -0.351806240848470900, -0.351853044050883470, +-0.351899846373663450, -0.351946647816694210, -0.351993448379857960, -0.352040248063038130, -0.352087046866117640, -0.352133844788979520, -0.352180641831507210, -0.352227437993582910, +-0.352274233275090000, -0.352321027675911890, -0.352367821195930800, -0.352414613835030200, -0.352461405593093020, -0.352508196470002750, -0.352554986465641600, -0.352601775579892970, +-0.352648563812639930, -0.352695351163765880, -0.352742137633152990, -0.352788923220684780, -0.352835707926244300, -0.352882491749714920, -0.352929274690978960, -0.352976056749919720, +-0.353022837926420810, -0.353069618220364420, -0.353116397631633940, -0.353163176160112450, -0.353209953805683490, -0.353256730568229150, -0.353303506447633030, -0.353350281443778170, +-0.353397055556547990, -0.353443828785824750, -0.353490601131492000, -0.353537372593432650, -0.353584143171530360, -0.353630912865667280, -0.353677681675726880, -0.353724449601592720, +-0.353771216643147040, -0.353817982800273320, -0.353864748072854620, -0.353911512460774010, -0.353958275963915100, -0.354005038582160040, -0.354051800315392410, -0.354098561163495700, +-0.354145321126352160, -0.354192080203845350, -0.354238838395858290, -0.354285595702274580, -0.354332352122976420, -0.354379107657847410, -0.354425862306770640, -0.354472616069629650, +-0.354519368946306700, -0.354566120936685270, -0.354612872040648560, -0.354659622258080120, -0.354706371588862200, -0.354753120032878340, -0.354799867590012090, -0.354846614260145740, +-0.354893360043162910, -0.354940104938946620, -0.354986848947380140, -0.355033592068346890, -0.355080334301729250, -0.355127075647410810, -0.355173816105275040, -0.355220555675204390, +-0.355267294357082260, -0.355314032150791990, -0.355360769056217000, -0.355407505073239650, -0.355454240201743600, -0.355500974441611880, -0.355547707792728210, -0.355594440254974830, +-0.355641171828235350, -0.355687902512392910, -0.355734632307331160, -0.355781361212932410, -0.355828089229080270, -0.355874816355658260, -0.355921542592548880, -0.355968267939635600, +-0.356014992396801620, -0.356061715963930600, -0.356108438640904910, -0.356155160427608090, -0.356201881323923390, -0.356248601329734400, -0.356295320444923460, -0.356342038669374250, +-0.356388756002969930, -0.356435472445594150, -0.356482187997129220, -0.356528902657458900, -0.356575616426466680, -0.356622329304035040, -0.356669041290047560, -0.356715752384387460, +-0.356762462586938000, -0.356809171897582820, -0.356855880316204240, -0.356902587842686030, -0.356949294476911700, -0.356996000218763760, -0.357042705068125800, -0.357089409024881070, +-0.357136112088913270, -0.357182814260104730, -0.357229515538339200, -0.357276215923499840, -0.357322915415470340, -0.357369614014133200, -0.357416311719371990, -0.357463008531069990, +-0.357509704449110900, -0.357556399473377140, -0.357603093603752360, -0.357649786840120280, -0.357696479182363300, -0.357743170630365150, -0.357789861184009070, -0.357836550843178340, +-0.357883239607756640, -0.357929927477626420, -0.357976614452671370, -0.358023300532775200, -0.358069985717820390, -0.358116670007690600, -0.358163353402269120, -0.358210035901439680, +-0.358256717505084750, -0.358303398213088040, -0.358350078025332810, -0.358396756941702810, -0.358443434962080480, -0.358490112086349570, -0.358536788314393400, -0.358583463646095670, +-0.358630138081338870, -0.358676811620006700, -0.358723484261982920, -0.358770156007150070, -0.358816826855391740, -0.358863496806591410, -0.358910165860632730, -0.358956834017398200, +-0.359003501276771610, -0.359050167638636290, -0.359096833102875930, -0.359143497669373090, -0.359190161338011520, -0.359236824108674520, -0.359283485981245880, -0.359330146955608110, +-0.359376807031644980, -0.359423466209240210, -0.359470124488276420, -0.359516781868637280, -0.359563438350206210, -0.359610093932866530, -0.359656748616501990, -0.359703402400995240, +-0.359750055286229940, -0.359796707272089900, -0.359843358358457710, -0.359890008545217130, -0.359936657832251540, -0.359983306219444690, -0.360029953706679170, -0.360076600293838760, +-0.360123245980806860, -0.360169890767467250, -0.360216534653702460, -0.360263177639396410, -0.360309819724432380, -0.360356460908694220, -0.360403101192064480, -0.360449740574426970, +-0.360496379055665560, -0.360543016635662790, -0.360589653314302430, -0.360636289091468000, -0.360682923967042820, -0.360729557940910720, -0.360776191012954330, -0.360822823183057470, +-0.360869454451103970, -0.360916084816976460, -0.360962714280558650, -0.361009342841734140, -0.361055970500386620, -0.361102597256398760, -0.361149223109654470, -0.361195848060037460, +-0.361242472107430490, -0.361289095251717260, -0.361335717492781370, -0.361382338830506130, -0.361428959264775470, -0.361475578795472040, -0.361522197422479600, -0.361568815145682120, +-0.361615431964962210, -0.361662047880203670, -0.361708662891290060, -0.361755276998105170, -0.361801890200531660, -0.361848502498453460, -0.361895113891753990, -0.361941724380317130, +-0.361988333964025580, -0.362034942642763150, -0.362081550416413430, -0.362128157284860200, -0.362174763247986140, -0.362221368305675250, -0.362267972457811280, -0.362314575704277000, +-0.362361178044956270, -0.362407779479732630, -0.362454380008489510, -0.362500979631110830, -0.362547578347479300, -0.362594176157478850, -0.362640773060993350, -0.362687369057905550, +-0.362733964148099270, -0.362780558331458110, -0.362827151607865940, -0.362873743977205510, -0.362920335439360700, -0.362966925994215090, -0.363013515641652520, -0.363060104381555780, +-0.363106692213808810, -0.363153279138295040, -0.363199865154898550, -0.363246450263501940, -0.363293034463989200, -0.363339617756244350, -0.363386200140150000, -0.363432781615590120, +-0.363479362182448310, -0.363525941840608100, -0.363572520589953490, -0.363619098430367100, -0.363665675361733000, -0.363712251383935090, -0.363758826496856150, -0.363805400700380200, +-0.363851973994390680, -0.363898546378771670, -0.363945117853405890, -0.363991688418177250, -0.364038258072969860, -0.364084826817666410, -0.364131394652150890, -0.364177961576306890, +-0.364224527590018000, -0.364271092693168150, -0.364317656885640220, -0.364364220167318060, -0.364410782538085840, -0.364457343997826260, -0.364503904546423290, -0.364550464183760530, +-0.364597022909722070, -0.364643580724190560, -0.364690137627050210, -0.364736693618184450, -0.364783248697477360, -0.364829802864811760, -0.364876356120071690, -0.364922908463140680, +-0.364969459893902840, -0.365016010412240910, -0.365062560018038940, -0.365109108711181020, -0.365155656491549910, -0.365202203359029640, -0.365248749313503870, -0.365295294354856250, +-0.365341838482970750, -0.365388381697730300, -0.365434923999018890, -0.365481465386720550, -0.365528005860718150, -0.365574545420895740, -0.365621084067137000, -0.365667621799325880, +-0.365714158617345350, -0.365760694521079450, -0.365807229510411780, -0.365853763585226420, -0.365900296745406250, -0.365946828990835360, -0.365993360321397400, -0.366039890736976460, +-0.366086420237455360, -0.366132948822718180, -0.366179476492649090, -0.366226003247130890, -0.366272529086047680, -0.366319054009283110, -0.366365578016721370, -0.366412101108245240, +-0.366458623283738900, -0.366505144543085970, -0.366551664886170580, -0.366598184312875610, -0.366644702823085200, -0.366691220416683060, -0.366737737093553230, -0.366784252853578690, +-0.366830767696643470, -0.366877281622631780, -0.366923794631426440, -0.366970306722911640, -0.367016817896971050, -0.367063328153488470, -0.367109837492347930, -0.367156345913432380, +-0.367202853416626010, -0.367249360001812910, -0.367295865668875950, -0.367342370417699350, -0.367388874248166850, -0.367435377160162560, -0.367481879153569450, -0.367528380228271560, +-0.367574880384152760, -0.367621379621097200, -0.367667877938987750, -0.367714375337708620, -0.367760871817143560, -0.367807367377176730, -0.367853862017691050, -0.367900355738570720, +-0.367946848539699890, -0.367993340420961550, -0.368039831382239890, -0.368086321423418570, -0.368132810544381520, -0.368179298745012820, -0.368225786025195510, -0.368272272384813690, +-0.368318757823751620, -0.368365242341892220, -0.368411725939119750, -0.368458208615317920, -0.368504690370371040, -0.368551171204161980, -0.368597651116575000, -0.368644130107493860, +-0.368690608176802880, -0.368737085324384930, -0.368783561550124260, -0.368830036853904700, -0.368876511235610440, -0.368922984695124470, -0.368969457232331100, -0.369015928847114480, +-0.369062399539357600, -0.369108869308944710, -0.369155338155759680, -0.369201806079686720, -0.369248273080608810, -0.369294739158410270, -0.369341204312974790, -0.369387668544186810, +-0.369434131851929190, -0.369480594236086260, -0.369527055696541820, -0.369573516233180190, -0.369619975845884300, -0.369666434534538510, -0.369712892299027040, -0.369759349139232920, +-0.369805805055040460, -0.369852260046333480, -0.369898714112995800, -0.369945167254911830, -0.369991619471964460, -0.370038070764038050, -0.370084521131016920, -0.370130970572784050, +-0.370177419089223750, -0.370223866680219890, -0.370270313345656740, -0.370316759085417500, -0.370363203899386260, -0.370409647787447060, -0.370456090749484160, -0.370502532785380590, +-0.370548973895020730, -0.370595414078288390, -0.370641853335067940, -0.370688291665242480, -0.370734729068696260, -0.370781165545313650, -0.370827601094977700, -0.370874035717572710, +-0.370920469412982680, -0.370966902181091460, -0.371013334021783440, -0.371059764934941580, -0.371106194920450380, -0.371152623978194100, -0.371199052108055820, -0.371245479309919910, +-0.371291905583670310, -0.371338330929191380, -0.371384755346366220, -0.371431178835079150, -0.371477601395214130, -0.371524023026655490, -0.371570443729286440, -0.371616863502991220, +-0.371663282347653890, -0.371709700263158750, -0.371756117249388950, -0.371802533306228870, -0.371848948433562810, -0.371895362631274040, -0.371941775899246820, -0.371988188237365180, +-0.372034599645513440, -0.372081010123574860, -0.372127419671433700, -0.372173828288974000, -0.372220235976080170, -0.372266642732635320, -0.372313048558523870, -0.372359453453629750, +-0.372405857417837490, -0.372452260451030140, -0.372498662553092110, -0.372545063723907890, -0.372591463963360570, -0.372637863271334580, -0.372684261647713900, -0.372730659092382620, +-0.372777055605225120, -0.372823451186124530, -0.372869845834965300, -0.372916239551631890, -0.372962632336007460, -0.373009024187976490, -0.373055415107422910, -0.373101805094231240, +-0.373148194148284600, -0.373194582269467500, -0.373240969457664000, -0.373287355712758400, -0.373333741034634070, -0.373380125423175340, -0.373426508878266280, -0.373472891399791400, +-0.373519272987633880, -0.373565653641678150, -0.373612033361808700, -0.373658412147908790, -0.373704789999862840, -0.373751166917554890, -0.373797542900869030, -0.373843917949689740, +-0.373890292063900230, -0.373936665243385040, -0.373983037488028520, -0.374029408797714070, -0.374075779172326040, -0.374122148611748580, -0.374168517115866130, -0.374214884684562040, +-0.374261251317720700, -0.374307617015226250, -0.374353981776963110, -0.374400345602814650, -0.374446708492665370, -0.374493070446399230, -0.374539431463900900, -0.374585791545053560, +-0.374632150689741710, -0.374678508897849930, -0.374724866169261430, -0.374771222503860800, -0.374817577901532140, -0.374863932362159870, -0.374910285885627410, -0.374956638471819200, +-0.375002990120619440, -0.375049340831912600, -0.375095690605581960, -0.375142039441512140, -0.375188387339587200, -0.375234734299691730, -0.375281080321708980, -0.375327425405523550, +-0.375373769551019980, -0.375420112758081510, -0.375466455026592820, -0.375512796356437970, -0.375559136747501130, -0.375605476199666890, -0.375651814712818500, -0.375698152286840610, +-0.375744488921617710, -0.375790824617033230, -0.375837159372971630, -0.375883493189317190, -0.375929826065954380, -0.375976158002766630, -0.376022488999638470, -0.376068819056454060, +-0.376115148173098050, -0.376161476349453740, -0.376207803585405790, -0.376254129880838280, -0.376300455235635880, -0.376346779649681880, -0.376393103122861010, -0.376439425655057720, +-0.376485747246155520, -0.376532067896038880, -0.376578387604592110, -0.376624706371699370, -0.376671024197245300, -0.376717341081113210, -0.376763657023187810, -0.376809972023353700, +-0.376856286081494190, -0.376902599197493970, -0.376948911371237260, -0.376995222602608700, -0.377041532891491670, -0.377087842237770810, -0.377134150641330770, -0.377180458102054920, +-0.377226764619827900, -0.377273070194533990, -0.377319374826057430, -0.377365678514282820, -0.377411981259093590, -0.377458283060374430, -0.377504583918009950, -0.377550883831883620, +-0.377597182801880090, -0.377643480827883570, -0.377689777909778810, -0.377736074047449130, -0.377782369240779290, -0.377828663489653550, -0.377874956793956550, -0.377921249153571730, +-0.377967540568383830, -0.378013831038277020, -0.378060120563136090, -0.378106409142844440, -0.378152696777286750, -0.378198983466347730, -0.378245269209910860, -0.378291554007860800, +-0.378337837860081850, -0.378384120766458330, -0.378430402726874890, -0.378476683741215070, -0.378522963809363510, -0.378569242931204970, -0.378615521106622890, -0.378661798335502060, +-0.378708074617726650, -0.378754349953181520, -0.378800624341750100, -0.378846897783317090, -0.378893170277766870, -0.378939441824984120, -0.378985712424852350, -0.379031982077256360, +-0.379078250782080350, -0.379124518539209140, -0.379170785348526220, -0.379217051209916330, -0.379263316123264250, -0.379309580088453450, -0.379355843105368680, -0.379402105173894330, +-0.379448366293915100, -0.379494626465314570, -0.379540885687977450, -0.379587143961788160, -0.379633401286631370, -0.379679657662390700, -0.379725913088950870, -0.379772167566196250, +-0.379818421094011650, -0.379864673672280610, -0.379910925300887830, -0.379957175979718180, -0.380003425708655140, -0.380049674487583590, -0.380095922316387780, -0.380142169194952250, +-0.380188415123161650, -0.380234660100899620, -0.380280904128050930, -0.380327147204500390, -0.380373389330131590, -0.380419630504829350, -0.380465870728477980, -0.380512110000962360, +-0.380558348322166060, -0.380604585691973860, -0.380650822110270240, -0.380697057576939950, -0.380743292091866580, -0.380789525654935010, -0.380835758266029610, -0.380881989925035250, +-0.380928220631835510, -0.380974450386315220, -0.381020679188359190, -0.381066907037851070, -0.381113133934675660, -0.381159359878717410, -0.381205584869860780, -0.381251808907990600, +-0.381298031992990500, -0.381344254124745260, -0.381390475303139850, -0.381436695528057870, -0.381482914799384070, -0.381529133117003040, -0.381575350480799600, -0.381621566890657290, +-0.381667782346461150, -0.381713996848095540, -0.381760210395445330, -0.381806422988394180, -0.381852634626826950, -0.381898845310628180, -0.381945055039682680, -0.381991263813874160, +-0.382037471633087430, -0.382083678497207480, -0.382129884406117950, -0.382176089359703650, -0.382222293357849130, -0.382268496400439310, -0.382314698487357830, -0.382360899618489570, +-0.382407099793719120, -0.382453299012931290, -0.382499497276009850, -0.382545694582839600, -0.382591890933305150, -0.382638086327291400, -0.382684280764682030, -0.382730474245361940, +-0.382776666769216070, -0.382822858336128110, -0.382869048945983000, -0.382915238598665280, -0.382961427294059460, -0.383007615032050500, -0.383053801812522080, -0.383099987635359180, +-0.383146172500446690, -0.383192356407668360, -0.383238539356909160, -0.383284721348053580, -0.383330902380986660, -0.383377082455592040, -0.383423261571754710, -0.383469439729359210, +-0.383515616928290560, -0.383561793168432420, -0.383607968449669820, -0.383654142771887310, -0.383700316134969850, -0.383746488538801170, -0.383792659983266280, -0.383838830468250130, +-0.383884999993636510, -0.383931168559310420, -0.383977336165156390, -0.384023502811058960, -0.384069668496903270, -0.384115833222572980, -0.384161996987953060, -0.384208159792928610, +-0.384254321637383320, -0.384300482521202250, -0.384346642444269910, -0.384392801406471470, -0.384438959407690570, -0.384485116447812250, -0.384531272526721150, -0.384577427644302310, +-0.384623581800439480, -0.384669734995017660, -0.384715887227921550, -0.384762038499036120, -0.384808188808245130, -0.384854338155433740, -0.384900486540486860, -0.384946633963288430, +-0.384992780423723370, -0.385038925921676320, -0.385085070457032440, -0.385131214029675430, -0.385177356639490380, -0.385223498286361930, -0.385269638970175190, -0.385315778690813900, +-0.385361917448163170, -0.385408055242107640, -0.385454192072532400, -0.385500327939321320, -0.385546462842359330, -0.385592596781531630, -0.385638729756722030, -0.385684861767815630, +-0.385730992814697030, -0.385777122897250970, -0.385823252015362550, -0.385869380168915530, -0.385915507357795060, -0.385961633581886290, -0.386007758841072970, -0.386053883135240310, +-0.386100006464272890, -0.386146128828055880, -0.386192250226473130, -0.386238370659409750, -0.386284490126750480, -0.386330608628380370, -0.386376726164183340, -0.386422842734044480, +-0.386468958337848500, -0.386515072975480540, -0.386561186646824540, -0.386607299351765520, -0.386653411090188690, -0.386699521861977870, -0.386745631667018310, -0.386791740505194660, +-0.386837848376391620, -0.386883955280494410, -0.386930061217386880, -0.386976166186954180, -0.387022270189081530, -0.387068373223652730, -0.387114475290553040, -0.387160576389667170, +-0.387206676520880260, -0.387252775684076230, -0.387298873879140250, -0.387344971105957110, -0.387391067364411980, -0.387437162654388710, -0.387483256975772570, -0.387529350328448260, +-0.387575442712301040, -0.387621534127214780, -0.387667624573074630, -0.387713714049765900, -0.387759802557172460, -0.387805890095179460, -0.387851976663671830, -0.387898062262534590, +-0.387944146891651800, -0.387990230550908640, -0.388036313240189950, -0.388082394959380850, -0.388128475708365340, -0.388174555487028670, -0.388220634295255610, -0.388266712132931350, +-0.388312788999939930, -0.388358864896166500, -0.388404939821496320, -0.388451013775813430, -0.388497086759002960, -0.388543158770949800, -0.388589229811538710, -0.388635299880654980, +-0.388681368978182620, -0.388727437104006810, -0.388773504258012770, -0.388819570440084640, -0.388865635650107510, -0.388911699887966370, -0.388957763153546350, -0.389003825446731510, +-0.389049886767407090, -0.389095947115457970, -0.389142006490769410, -0.389188064893225380, -0.389234122322711210, -0.389280178779111750, -0.389326234262312280, -0.389372288772196760, +-0.389418342308650520, -0.389464394871558870, -0.389510446460805790, -0.389556497076276600, -0.389602546717856160, -0.389648595385429400, -0.389694643078881520, -0.389740689798096620, +-0.389786735542960010, -0.389832780313357000, -0.389878824109171570, -0.389924866930289100, -0.389970908776594460, -0.390016949647973010, -0.390062989544308740, -0.390109028465486950, +-0.390155066411393080, -0.390201103381911050, -0.390247139376926340, -0.390293174396323720, -0.390339208439988210, -0.390385241507805070, -0.390431273599658460, -0.390477304715433570, +-0.390523334855015890, -0.390569364018289460, -0.390615392205139630, -0.390661419415451290, -0.390707445649109860, -0.390753470905999380, -0.390799495186005210, -0.390845518489012280, +-0.390891540814906010, -0.390937562163570450, -0.390983582534891020, -0.391029601928752580, -0.391075620345040620, -0.391121637783639120, -0.391167654244433560, -0.391213669727309310, +-0.391259684232150410, -0.391305697758842330, -0.391351710307270010, -0.391397721877318420, -0.391443732468872930, -0.391489742081817690, -0.391535750716038080, -0.391581758371419510, +-0.391627765047846190, -0.391673770745203380, -0.391719775463376220, -0.391765779202249980, -0.391811781961708900, -0.391857783741638320, -0.391903784541923320, -0.391949784362449320, +-0.391995783203100360, -0.392041781063761970, -0.392087777944319150, -0.392133773844657310, -0.392179768764660600, -0.392225762704214440, -0.392271755663204320, -0.392317747641514390, +-0.392363738639030070, -0.392409728655636450, -0.392455717691218450, -0.392501705745661620, -0.392547692818850100, -0.392593678910669320, -0.392639664021004810, -0.392685648149740660, +-0.392731631296762470, -0.392777613461955170, -0.392823594645204220, -0.392869574846393840, -0.392915554065409620, -0.392961532302136870, -0.393007509556459860, -0.393053485828264100, +-0.393099461117434660, -0.393145435423856550, -0.393191408747415210, -0.393237381087995000, -0.393283352445481290, -0.393329322819759630, -0.393375292210714270, -0.393421260618230680, +-0.393467228042193920, -0.393513194482489500, -0.393559159939001700, -0.393605124411615990, -0.393651087900217470, -0.393697050404691610, -0.393743011924922730, -0.393788972460796360, +-0.393834932012197490, -0.393880890579011770, -0.393926848161123390, -0.393972804758417890, -0.394018760370780760, -0.394064714998096370, -0.394110668640250130, -0.394156621297127250, +-0.394202572968612830, -0.394248523654592400, -0.394294473354950210, -0.394340422069571870, -0.394386369798342850, -0.394432316541147520, -0.394478262297871420, -0.394524207068399630, +-0.394570150852617760, -0.394616093650410060, -0.394662035461662180, -0.394707976286259200, -0.394753916124086670, -0.394799854975028900, -0.394845792838971590, -0.394891729715799720, +-0.394937665605398950, -0.394983600507653630, -0.395029534422449310, -0.395075467349671530, -0.395121399289204700, -0.395167330240934370, -0.395213260204745680, -0.395259189180524270, +-0.395305117168154470, -0.395351044167521930, -0.395396970178511720, -0.395442895201009500, -0.395488819234899700, -0.395534742280067800, -0.395580664336399050, -0.395626585403779040, +-0.395672505482092150, -0.395718424571224030, -0.395764342671060200, -0.395810259781485150, -0.395856175902384420, -0.395902091033643270, -0.395948005175146890, -0.395993918326780940, +-0.396039830488429720, -0.396085741659979010, -0.396131651841314270, -0.396177561032320050, -0.396223469232881880, -0.396269376442885070, -0.396315282662215220, -0.396361187890756750, +-0.396407092128395310, -0.396452995375016160, -0.396498897630504940, -0.396544798894746030, -0.396590699167625130, -0.396636598449027490, -0.396682496738838760, -0.396728394036943380, +-0.396774290343227030, -0.396820185657575320, -0.396866079979872780, -0.396911973310005000, -0.396957865647857340, -0.397003756993314970, -0.397049647346263630, -0.397095536706587760, +-0.397141425074173100, -0.397187312448905210, -0.397233198830668650, -0.397279084219349150, -0.397324968614831910, -0.397370852017002620, -0.397416734425745820, -0.397462615840947160, +-0.397508496262492020, -0.397554375690265970, -0.397600254124153620, -0.397646131564040610, -0.397692008009812300, -0.397737883461354360, -0.397783757918551310, -0.397829631381288850, +-0.397875503849452750, -0.397921375322927480, -0.397967245801598760, -0.398013115285351940, -0.398058983774072670, -0.398104851267645610, -0.398150717765956400, -0.398196583268890400, +-0.398242447776333330, -0.398288311288169770, -0.398334173804285370, -0.398380035324565620, -0.398425895848896150, -0.398471755377161510, -0.398517613909247500, -0.398563471445039840, +-0.398609327984423110, -0.398655183527283070, -0.398701038073505100, -0.398746891622974500, -0.398792744175577090, -0.398838595731197400, -0.398884446289721200, -0.398930295851034340, +-0.398976144415021330, -0.399021991981567900, -0.399067838550559550, -0.399113684121881970, -0.399159528695419820, -0.399205372271058790, -0.399251214848684370, -0.399297056428182310, +-0.399342897009437200, -0.399388736592334870, -0.399434575176760680, -0.399480412762600430, -0.399526249349738790, -0.399572084938061510, -0.399617919527454400, -0.399663753117802110, +-0.399709585708990460, -0.399755417300904800, -0.399801247893430630, -0.399847077486453760, -0.399892906079858720, -0.399938733673531500, -0.399984560267357790, -0.400030385861222300, +-0.400076210455010850, -0.400122034048608850, -0.400167856641902190, -0.400213678234775490, -0.400259498827114590, -0.400305318418804900, -0.400351137009732350, -0.400396954599781580, +-0.400442771188838420, -0.400488586776788280, -0.400534401363517150, -0.400580214948909550, -0.400626027532851430, -0.400671839115228630, -0.400717649695925880, -0.400763459274828980, +-0.400809267851823410, -0.400855075426795100, -0.400900881999628700, -0.400946687570210070, -0.400992492138424750, -0.401038295704158610, -0.401084098267296300, -0.401129899827723730, +-0.401175700385326460, -0.401221499939990290, -0.401267298491600030, -0.401313096040041450, -0.401358892585200580, -0.401404688126962060, -0.401450482665211830, -0.401496276199835410, +-0.401542068730718240, -0.401587860257746340, -0.401633650780804430, -0.401679440299778310, -0.401725228814554080, -0.401771016325016330, -0.401816802831051030, -0.401862588332543740, +-0.401908372829380360, -0.401954156321445650, -0.401999938808625560, -0.402045720290805600, -0.402091500767871760, -0.402137280239708790, -0.402183058706202580, -0.402228836167238760, +-0.402274612622703250, -0.402320388072480770, -0.402366162516457350, -0.402411935954518910, -0.402457708386550210, -0.402503479812437280, -0.402549250232065610, -0.402595019645320850, +-0.402640788052088970, -0.402686555452254680, -0.402732321845703960, -0.402778087232322890, -0.402823851611996190, -0.402869614984609880, -0.402915377350049510, -0.402961138708201110, +-0.403006899058949430, -0.403052658402180520, -0.403098416737780410, -0.403144174065633800, -0.403189930385626780, -0.403235685697644900, -0.403281440001573840, -0.403327193297299600, +-0.403372945584706930, -0.403418696863681920, -0.403464447134110560, -0.403510196395877710, -0.403555944648869350, -0.403601691892971130, -0.403647438128069080, -0.403693183354048020, +-0.403738927570793990, -0.403784670778192690, -0.403830412976130090, -0.403876154164491070, -0.403921894343161610, -0.403967633512027470, -0.404013371670974620, -0.404059108819887990, +-0.404104844958653510, -0.404150580087157370, -0.404196314205284400, -0.404242047312920570, -0.404287779409951700, -0.404333510496263320, -0.404379240571741630, -0.404424969636271390, +-0.404470697689738700, -0.404516424732029760, -0.404562150763029260, -0.404607875782623420, -0.404653599790697930, -0.404699322787138770, -0.404745044771830930, -0.404790765744660500, +-0.404836485705513170, -0.404882204654274990, -0.404927922590830880, -0.404973639515066990, -0.405019355426869010, -0.405065070326123040, -0.405110784212713960, -0.405156497086527960, +-0.405202208947451130, -0.405247919795368340, -0.405293629630165740, -0.405339338451729090, -0.405385046259944090, -0.405430753054696890, -0.405476458835872410, -0.405522163603356740, +-0.405567867357036150, -0.405613570096795380, -0.405659271822520760, -0.405704972534097930, -0.405750672231413090, -0.405796370914351170, -0.405842068582798310, -0.405887765236640660, +-0.405933460875763210, -0.405979155500052090, -0.406024849109393130, -0.406070541703672020, -0.406116233282774960, -0.406161923846586890, -0.406207613394994060, -0.406253301927882560, +-0.406298989445137430, -0.406344675946644810, -0.406390361432290510, -0.406436045901960700, -0.406481729355540390, -0.406527411792915740, -0.406573093213972560, -0.406618773618597050, +-0.406664453006674200, -0.406710131378090260, -0.406755808732730930, -0.406801485070482530, -0.406847160391229980, -0.406892834694859540, -0.406938507981257410, -0.406984180250308640, +-0.407029851501899350, -0.407075521735915490, -0.407121190952242810, -0.407166859150767560, -0.407212526331374780, -0.407258192493950620, -0.407303857638381450, -0.407349521764552190, +-0.407395184872349160, -0.407440846961658170, -0.407486508032365410, -0.407532168084356050, -0.407577827117516220, -0.407623485131731800, -0.407669142126889150, -0.407714798102873200, +-0.407760453059570260, -0.407806106996866150, -0.407851759914647230, -0.407897411812798480, -0.407943062691206170, -0.407988712549756660, -0.408034361388334930, -0.408080009206827350, +-0.408125656005119690, -0.408171301783098290, -0.408216946540648270, -0.408262590277655880, -0.408308232994006980, -0.408353874689587950, -0.408399515364283820, -0.408445155017980900, +-0.408490793650565060, -0.408536431261922680, -0.408582067851938790, -0.408627703420499750, -0.408673337967491830, -0.408718971492800180, -0.408764603996311090, -0.408810235477910510, +-0.408855865937484300, -0.408901495374918880, -0.408947123790099290, -0.408992751182911900, -0.409038377553243020, -0.409084002900977790, -0.409129627226002600, -0.409175250528203300, +-0.409220872807466270, -0.409266494063676710, -0.409312114296720870, -0.409357733506484740, -0.409403351692854690, -0.409448968855715860, -0.409494584994954610, -0.409540200110456890, +-0.409585814202109100, -0.409631427269796340, -0.409677039313405040, -0.409722650332821510, -0.409768260327930960, -0.409813869298619790, -0.409859477244773900, -0.409905084166279350, +-0.409950690063022480, -0.409996294934888480, -0.410041898781763780, -0.410087501603534690, -0.410133103400086460, -0.410178704171305470, -0.410224303917077760, -0.410269902637289630, +-0.410315500331826340, -0.410361097000574330, -0.410406692643419610, -0.410452287260248520, -0.410497880850946300, -0.410543473415399370, -0.410589064953493790, -0.410634655465115960, +-0.410680244950151040, -0.410725833408485560, -0.410771420840005840, -0.410817007244597240, -0.410862592622146080, -0.410908176972538450, -0.410953760295660770, -0.410999342591398250, +-0.411044923859637420, -0.411090504100264260, -0.411136083313165260, -0.411181661498225660, -0.411227238655331890, -0.411272814784370060, -0.411318389885226510, -0.411363963957786630, +-0.411409537001936890, -0.411455109017563660, -0.411500680004552260, -0.411546249962789160, -0.411591818892160400, -0.411637386792552130, -0.411682953663850830, -0.411728519505941690, +-0.411774084318711260, -0.411819648102046020, -0.411865210855831280, -0.411910772579953510, -0.411956333274298760, -0.412001892938753670, -0.412047451573203380, -0.412093009177534440, +-0.412138565751633050, -0.412184121295385620, -0.412229675808677480, -0.412275229291395100, -0.412320781743424680, -0.412366333164652770, -0.412411883554964550, -0.412457432914246640, +-0.412502981242385550, -0.412548528539266660, -0.412594074804776390, -0.412639620038800950, -0.412685164241226420, -0.412730707411939460, -0.412776249550825260, -0.412821790657770470, +-0.412867330732661570, -0.412912869775383990, -0.412958407785824210, -0.413003944763868420, -0.413049480709403170, -0.413095015622313820, -0.413140549502486910, -0.413186082349808640, +-0.413231614164165590, -0.413277144945443040, -0.413322674693527680, -0.413368203408305600, -0.413413731089663450, -0.413459257737486600, -0.413504783351661520, -0.413550307932074920, +-0.413595831478612170, -0.413641353991159810, -0.413686875469604090, -0.413732395913831600, -0.413777915323727650, -0.413823433699178960, -0.413868951040071710, -0.413914467346292450, +-0.413959982617726600, -0.414005496854260800, -0.414051010055781320, -0.414096522222174630, -0.414142033353326330, -0.414187543449122840, -0.414233052509450970, -0.414278560534196040, +-0.414324067523244740, -0.414369573476483230, -0.414415078393797760, -0.414460582275075100, -0.414506085120200480, -0.414551586929060690, -0.414597087701542360, -0.414642587437530850, +-0.414688086136912880, -0.414733583799574760, -0.414779080425403010, -0.414824576014283190, -0.414870070566101920, -0.414915564080745480, -0.414961056558100560, -0.415006547998052530, +-0.415052038400488210, -0.415097527765293740, -0.415143016092355880, -0.415188503381560050, -0.415233989632792950, -0.415279474845941350, -0.415324959020890620, -0.415370442157527440, +-0.415415924255738260, -0.415461405315409200, -0.415506885336427050, -0.415552364318677260, -0.415597842262046550, -0.415643319166421670, -0.415688795031688100, -0.415734269857732490, +-0.415779743644441260, -0.415825216391701060, -0.415870688099397420, -0.415916158767417050, -0.415961628395646650, -0.416007096983971870, -0.416052564532279230, -0.416098031040455290, +-0.416143496508386220, -0.416188960935958810, -0.416234424323058570, -0.416279886669572330, -0.416325347975386730, -0.416370808240387360, -0.416416267464460980, -0.416461725647493950, +-0.416507182789372990, -0.416552638889983670, -0.416598093949212770, -0.416643547966946640, -0.416689000943071990, -0.416734452877474460, -0.416779903770040820, -0.416825353620657420, +-0.416870802429211040, -0.416916250195587200, -0.416961696919672780, -0.417007142601354520, -0.417052587240518020, -0.417098030837049990, -0.417143473390836960, -0.417188914901765180, +-0.417234355369721530, -0.417279794794591650, -0.417325233176262190, -0.417370670514620120, -0.417416106809550940, -0.417461542060941490, -0.417506976268678220, -0.417552409432647880, +-0.417597841552736100, -0.417643272628829780, -0.417688702660815200, -0.417734131648579310, -0.417779559592007690, -0.417824986490987150, -0.417870412345404170, -0.417915837155145520, +-0.417961260920096890, -0.418006683640145150, -0.418052105315177060, -0.418097525945078320, -0.418142945529735800, -0.418188364069035870, -0.418233781562865000, -0.418279198011110130, +-0.418324613413656840, -0.418370027770392060, -0.418415441081202600, -0.418460853345974100, -0.418506264564593500, -0.418551674736947210, -0.418597083862922160, -0.418642491942403940, +-0.418687898975279580, -0.418733304961435790, -0.418778709900758380, -0.418824113793134220, -0.418869516638449730, -0.418914918436591450, -0.418960319187446310, -0.419005718890899990, +-0.419051117546839320, -0.419096515155151280, -0.419141911715721520, -0.419187307228437000, -0.419232701693184220, -0.419278095109850090, -0.419323487478320320, -0.419368878798481840, +-0.419414269070221170, -0.419459658293425190, -0.419505046467979700, -0.419550433593771530, -0.419595819670687380, -0.419641204698613990, -0.419686588677437240, -0.419731971607044010, +-0.419777353487321260, -0.419822734318154700, -0.419868114099431310, -0.419913492831037630, -0.419958870512860240, -0.420004247144786070, -0.420049622726700820, -0.420094997258491590, +-0.420140370740045230, -0.420185743171247570, -0.420231114551985530, -0.420276484882145750, -0.420321854161615100, -0.420367222390279460, -0.420412589568025740, -0.420457955694740540, +-0.420503320770310830, -0.420548684794622480, -0.420594047767562370, -0.420639409689017140, -0.420684770558873820, -0.420730130377018170, -0.420775489143337180, -0.420820846857717870, +-0.420866203520046000, -0.420911559130208670, -0.420956913688092460, -0.421002267193584300, -0.421047619646570110, -0.421092971046936880, -0.421138321394571250, -0.421183670689360190, +-0.421229018931189520, -0.421274366119946340, -0.421319712255517230, -0.421365057337789230, -0.421410401366648200, -0.421455744341981190, -0.421501086263675160, -0.421546427131616050, +-0.421591766945690890, -0.421637105705786270, -0.421682443411788950, -0.421727780063585860, -0.421773115661062960, -0.421818450204107240, -0.421863783692605850, -0.421909116126444550, +-0.421954447505510480, -0.421999777829690280, -0.422045107098871000, -0.422090435312938610, -0.422135762471780080, -0.422181088575282190, -0.422226413623331960, -0.422271737615815320, +-0.422317060552619310, -0.422362382433630670, -0.422407703258736440, -0.422453023027822620, -0.422498341740776160, -0.422543659397484280, -0.422588975997832850, -0.422634291541709010, +-0.422679606028999400, -0.422724919459590790, -0.422770231833370260, -0.422815543150223790, -0.422860853410038430, -0.422906162612701360, -0.422951470758098470, -0.422996777846116890, +-0.423042083876643380, -0.423087388849565090, -0.423132692764767890, -0.423177995622138980, -0.423223297421565060, -0.423268598162933330, -0.423313897846129660, -0.423359196471041310, +-0.423404494037554920, -0.423449790545557700, -0.423495085994935570, -0.423540380385575790, -0.423585673717365440, -0.423630965990190460, -0.423676257203938140, -0.423721547358495100, +-0.423766836453748630, -0.423812124489584720, -0.423857411465890400, -0.423902697382552600, -0.423947982239458510, -0.423993266036494010, -0.424038548773546300, -0.424083830450502300, +-0.424129111067249100, -0.424174390623672680, -0.424219669119660300, -0.424264946555099160, -0.424310222929875300, -0.424355498243875810, -0.424400772496987600, -0.424446045689097500, +-0.424491317820092640, -0.424536588889859070, -0.424581858898284090, -0.424627127845254800, -0.424672395730657350, -0.424717662554378870, -0.424762928316306240, -0.424808193016326660, +-0.424853456654326220, -0.424898719230192180, -0.424943980743811290, -0.424989241195070870, -0.425034500583856940, -0.425079758910056780, -0.425125016173557190, -0.425170272374245480, +-0.425215527512007700, -0.425260781586731080, -0.425306034598302910, -0.425351286546609250, -0.425396537431537380, -0.425441787252974160, -0.425487036010806510, -0.425532283704921630, +-0.425577530335205680, -0.425622775901545850, -0.425668020403829510, -0.425713263841942690, -0.425758506215772770, -0.425803747525206560, -0.425848987770131360, -0.425894226950433270, +-0.425939465065999670, -0.425984702116717350, -0.426029938102473750, -0.426075173023154840, -0.426120406878648050, -0.426165639668840190, -0.426210871393618680, -0.426256102052869570, +-0.426301331646480150, -0.426346560174337860, -0.426391787636328790, -0.426437014032340190, -0.426482239362259100, -0.426527463625972820, -0.426572686823367460, -0.426617908954330380, +-0.426663130018748560, -0.426708350016509250, -0.426753568947498720, -0.426798786811604270, -0.426844003608712830, -0.426889219338711770, -0.426934434001487280, -0.426979647596926690, +-0.427024860124917420, -0.427070071585345550, -0.427115281978098500, -0.427160491303063270, -0.427205699560126830, -0.427250906749176540, -0.427296112870098550, -0.427341317922780290, +-0.427386521907109130, -0.427431724822971320, -0.427476926670254110, -0.427522127448844660, -0.427567327158630270, -0.427612525799497160, -0.427657723371332680, -0.427702919874023980, +-0.427748115307458320, -0.427793309671521960, -0.427838502966102370, -0.427883695191086540, -0.427928886346361840, -0.427974076431814510, -0.428019265447331990, -0.428064453392801750, +-0.428109640268109940, -0.428154826073144030, -0.428200010807791080, -0.428245194471938100, -0.428290377065472520, -0.428335558588280600, -0.428380739040249760, -0.428425918421267480, +-0.428471096731220020, -0.428516273969994810, -0.428561450137478930, -0.428606625233559860, -0.428651799258123740, -0.428696972211058180, -0.428742144092250200, -0.428787314901587220, +-0.428832484638955570, -0.428877653304242710, -0.428922820897335690, -0.428967987418122090, -0.429013152866488060, -0.429058317242321130, -0.429103480545508840, -0.429148642775937450, +-0.429193803933494490, -0.429238964018066940, -0.429284123029542440, -0.429329280967807200, -0.429374437832748810, -0.429419593624254250, -0.429464748342211160, -0.429509901986505790, +-0.429555054557025640, -0.429600206053657900, -0.429645356476289990, -0.429690505824808330, -0.429735654099100420, -0.429780801299053720, -0.429825947424554660, -0.429871092475490710, +-0.429916236451749030, -0.429961379353216770, -0.430006521179781440, -0.430051661931329430, -0.430096801607748270, -0.430141940208925490, -0.430187077734747460, -0.430232214185101770, +-0.430277349559875510, -0.430322483858956270, -0.430367617082230420, -0.430412749229585560, -0.430457880300908810, -0.430503010296087730, -0.430548139215008780, -0.430593267057559460, +-0.430638393823626950, -0.430683519513098860, -0.430728644125861590, -0.430773767661802700, -0.430818890120809820, -0.430864011502769260, -0.430909131807568730, -0.430954251035095330, +-0.430999369185236290, -0.431044486257879280, -0.431089602252910600, -0.431134717170217950, -0.431179831009688930, -0.431224943771209900, -0.431270055454668510, -0.431315166059951960, +-0.431360275586947890, -0.431405384035542790, -0.431450491405624190, -0.431495597697079790, -0.431540702909795960, -0.431585807043660400, -0.431630910098560310, -0.431676012074382940, +-0.431721112971015950, -0.431766212788345760, -0.431811311526260070, -0.431856409184646520, -0.431901505763391480, -0.431946601262382710, -0.431991695681507410, -0.432036789020653340, +-0.432081881279706810, -0.432126972458555640, -0.432172062557087010, -0.432217151575188640, -0.432262239512747000, -0.432307326369649750, -0.432352412145784180, -0.432397496841037950, +-0.432442580455297650, -0.432487662988450820, -0.432532744440385310, -0.432577824810987500, -0.432622904100145090, -0.432667982307745500, -0.432713059433675880, -0.432758135477824050, +-0.432803210440076470, -0.432848284320320850, -0.432893357118444950, -0.432938428834335250, -0.432983499467879510, -0.433028569018964970, -0.433073637487479400, -0.433118704873309390, +-0.433163771176342580, -0.433208836396466350, -0.433253900533568440, -0.433298963587535340, -0.433344025558254850, -0.433389086445614360, -0.433434146249501500, -0.433479204969802860, +-0.433524262606406200, -0.433569319159199330, -0.433614374628068730, -0.433659429012902220, -0.433704482313587100, -0.433749534530011190, -0.433794585662061030, -0.433839635709624470, +-0.433884684672588780, -0.433929732550841770, -0.433974779344270030, -0.434019825052761320, -0.434064869676203060, -0.434109913214483060, -0.434154955667487850, -0.434199997035105260, +-0.434245037317223080, -0.434290076513727920, -0.434335114624507520, -0.434380151649449380, -0.434425187588440840, -0.434470222441369740, -0.434515256208122700, -0.434560288888587500, +-0.434605320482651940, -0.434650350990202720, -0.434695380411127650, -0.434740408745314060, -0.434785435992649900, -0.434830462153021740, -0.434875487226317410, -0.434920511212424420, +-0.434965534111230460, -0.435010555922622330, -0.435055576646487810, -0.435100596282714300, -0.435145614831189740, -0.435190632291800720, -0.435235648664435150, -0.435280663948980850, +-0.435325678145324470, -0.435370691253353930, -0.435415703272956640, -0.435460714204020050, -0.435505724046432120, -0.435550732800079500, -0.435595740464850000, -0.435640747040631600, +-0.435685752527310900, -0.435730756924775810, -0.435775760232913870, -0.435820762451612890, -0.435865763580759620, -0.435910763620241950, -0.435955762569947340, -0.436000760429763770, +-0.436045757199577830, -0.436090752879277570, -0.436135747468750390, -0.436180740967884230, -0.436225733376565840, -0.436270724694683140, -0.436315714922124010, -0.436360704058775140, +-0.436405692104524570, -0.436450679059259770, -0.436495664922868620, -0.436540649695237980, -0.436585633376255670, -0.436630615965809320, -0.436675597463786760, -0.436720577870074840, +-0.436765557184561500, -0.436810535407134220, -0.436855512537681070, -0.436900488576088710, -0.436945463522245110, -0.436990437376038270, -0.437035410137354920, -0.437080381806083000, +-0.437125352382110200, -0.437170321865324010, -0.437215290255612400, -0.437260257552862130, -0.437305223756961290, -0.437350188867797750, -0.437395152885258320, -0.437440115809231030, +-0.437485077639603430, -0.437530038376263590, -0.437574998019098220, -0.437619956567995350, -0.437664914022842580, -0.437709870383527930, -0.437754825649938230, -0.437799779821961440, +-0.437844732899485220, -0.437889684882397550, -0.437934635770585280, -0.437979585563936400, -0.438024534262339000, -0.438069481865679840, -0.438114428373846950, -0.438159373786728030, +-0.438204318104210680, -0.438249261326182860, -0.438294203452531560, -0.438339144483144760, -0.438384084417910440, -0.438429023256715570, -0.438473960999448080, -0.438518897645995720, +-0.438563833196246530, -0.438608767650087330, -0.438653701007406250, -0.438698633268090890, -0.438743564432029330, -0.438788494499108510, -0.438833423469216390, -0.438878351342240740, +-0.438923278118069640, -0.438968203796589910, -0.439013128377689690, -0.439058051861257010, -0.439102974247178870, -0.439147895535343220, -0.439192815725637900, -0.439237734817950860, +-0.439282652812169160, -0.439327569708180820, -0.439372485505873490, -0.439417400205135420, -0.439462313805853430, -0.439507226307915610, -0.439552137711209770, -0.439597048015623990, +-0.439641957221045150, -0.439686865327361450, -0.439731772334460980, -0.439776678242230710, -0.439821583050558680, -0.439866486759332760, -0.439911389368440600, -0.439956290877770330, +-0.440001191287208990, -0.440046090596644620, -0.440090988805965480, -0.440135885915058420, -0.440180781923811660, -0.440225676832112940, -0.440270570639850420, -0.440315463346911130, +-0.440360354953183100, -0.440405245458554250, -0.440450134862912620, -0.440495023166145310, -0.440539910368140440, -0.440584796468785790, -0.440629681467969550, -0.440674565365578700, +-0.440719448161501380, -0.440764329855625910, -0.440809210447839220, -0.440854089938029440, -0.440898968326084490, -0.440943845611892150, -0.440988721795340540, -0.441033596876316710, +-0.441078470854708920, -0.441123343730405350, -0.441168215503293050, -0.441213086173260160, -0.441257955740194550, -0.441302824203984480, -0.441347691564516980, -0.441392557821680190, +-0.441437422975362040, -0.441482287025450730, -0.441527149971833290, -0.441572011814397980, -0.441616872553032670, -0.441661732187625560, -0.441706590718063670, -0.441751448144235390, +-0.441796304466028860, -0.441841159683331150, -0.441886013796030540, -0.441930866804014890, -0.441975718707172500, -0.442020569505390370, -0.442065419198556850, -0.442110267786559820, +-0.442155115269287470, -0.442199961646626890, -0.442244806918466460, -0.442289651084694040, -0.442334494145197880, -0.442379336099865070, -0.442424176948583880, -0.442469016691242720, +-0.442513855327728580, -0.442558692857929810, -0.442603529281734300, -0.442648364599029950, -0.442693198809705090, -0.442738031913646910, -0.442782863910743560, -0.442827694800883460, +-0.442872524583953760, -0.442917353259842770, -0.442962180828438360, -0.443007007289628880, -0.443051832643301500, -0.443096656889344580, -0.443141480027645970, -0.443186302058094060, +-0.443231122980575990, -0.443275942794980120, -0.443320761501194430, -0.443365579099107180, -0.443410395588605620, -0.443455210969578070, -0.443500025241912900, -0.443544838405497240, +-0.443589650460219480, -0.443634461405967630, -0.443679271242629570, -0.443724079970093780, -0.443768887588247400, -0.443813694096978790, -0.443858499496176280, -0.443903303785727230, +-0.443948106965519840, -0.443992909035442200, -0.444037709995382720, -0.444082509845228510, -0.444127308584868100, -0.444172106214189790, -0.444216902733080790, -0.444261698141429520, +-0.444306492439124010, -0.444351285626052310, -0.444396077702102770, -0.444440868667162650, -0.444485658521120370, -0.444530447263864310, -0.444575234895281720, -0.444620021415261080, +-0.444664806823690360, -0.444709591120458050, -0.444754374305451390, -0.444799156378558710, -0.444843937339668210, -0.444888717188668240, -0.444933495925446070, -0.444978273549890170, +-0.445023050061888580, -0.445067825461329780, -0.445112599748101020, -0.445157372922090730, -0.445202144983187440, -0.445246915931278350, -0.445291685766252000, -0.445336454487996470, +-0.445381222096399740, -0.445425988591350410, -0.445470753972735670, -0.445515518240444050, -0.445560281394364040, -0.445605043434382900, -0.445649804360389200, -0.445694564172270940, +-0.445739322869916690, -0.445784080453213770, -0.445828836922050610, -0.445873592276315340, -0.445918346515896510, -0.445963099640681430, -0.446007851650558620, -0.446052602545416120, +-0.446097352325142580, -0.446142100989625200, -0.446186848538752570, -0.446231594972413270, -0.446276340290494570, -0.446321084492884990, -0.446365827579472680, -0.446410569550145850, +-0.446455310404792970, -0.446500050143301460, -0.446544788765559750, -0.446589526271456540, -0.446634262660879080, -0.446678997933715960, -0.446723732089855330, -0.446768465129185830, +-0.446813197051594720, -0.446857927856970650, -0.446902657545202090, -0.446947386116176570, -0.446992113569782520, -0.447036839905908200, -0.447081565124441800, -0.447126289225271920, +-0.447171012208285870, -0.447215734073372280, -0.447260454820419760, -0.447305174449315720, -0.447349892959948760, -0.447394610352207070, -0.447439326625979240, -0.447484041781152640, +-0.447528755817616030, -0.447573468735257440, -0.447618180533965630, -0.447662891213627960, -0.447707600774133070, -0.447752309215369180, -0.447797016537224920, -0.447841722739587720, +-0.447886427822346170, -0.447931131785389010, -0.447975834628603580, -0.448020536351878550, -0.448065236955102250, -0.448109936438162770, -0.448154634800948910, -0.448199332043348050, +-0.448244028165248830, -0.448288723166540000, -0.448333417047108940, -0.448378109806844280, -0.448422801445634400, -0.448467491963367940, -0.448512181359932320, -0.448556869635216240, +-0.448601556789107960, -0.448646242821496230, -0.448690927732268490, -0.448735611521313420, -0.448780294188519340, -0.448824975733774890, -0.448869656156967610, -0.448914335457986200, +-0.448959013636719360, -0.449003690693054570, -0.449048366626880580, -0.449093041438085650, -0.449137715126558530, -0.449182387692186710, -0.449227059134858940, -0.449271729454463480, +-0.449316398650889130, -0.449361066724023370, -0.449405733673754970, -0.449450399499972230, -0.449495064202563850, -0.449539727781417490, -0.449584390236421720, -0.449629051567465410, +-0.449673711774436100, -0.449718370857222490, -0.449763028815712950, -0.449807685649795840, -0.449852341359359920, -0.449896995944292720, -0.449941649404483060, -0.449986301739819680, +-0.450030952950190130, -0.450075603035483160, -0.450120251995587250, -0.450164899830391100, -0.450209546539782290, -0.450254192123649590, -0.450298836581881410, -0.450343479914366570, +-0.450388122120992610, -0.450432763201648380, -0.450477403156222200, -0.450522041984602940, -0.450566679686678130, -0.450611316262336690, -0.450655951711467330, -0.450700586033957680, +-0.450745219229696570, -0.450789851298572410, -0.450834482240473620, -0.450879112055289020, -0.450923740742906250, -0.450968368303214130, -0.451012994736101460, -0.451057620041455940, +-0.451102244219166340, -0.451146867269121180, -0.451191489191209220, -0.451236109985318160, -0.451280729651336750, -0.451325348189153600, -0.451369965598657440, -0.451414581879735990, +-0.451459197032278050, -0.451503811056172160, -0.451548423951307120, -0.451593035717570590, -0.451637646354851540, -0.451682255863038730, -0.451726864242019910, -0.451771471491683900, +-0.451816077611919220, -0.451860682602614750, -0.451905286463658130, -0.451949889194938340, -0.451994490796343850, -0.452039091267763480, -0.452083690609084990, -0.452128288820197290, +-0.452172885900988920, -0.452217481851348630, -0.452262076671164300, -0.452306670360324790, -0.452351262918718970, -0.452395854346234580, -0.452440444642760620, -0.452485033808185500, +-0.452529621842397810, -0.452574208745286420, -0.452618794516739200, -0.452663379156644900, -0.452707962664892600, -0.452752545041369970, -0.452797126285966020, -0.452841706398569240, +-0.452886285379068550, -0.452930863227351820, -0.452975439943307860, -0.453020015526825360, -0.453064589977793200, -0.453109163296099130, -0.453153735481632180, -0.453198306534280890, +-0.453242876453934240, -0.453287445240480040, -0.453332012893807150, -0.453376579413804660, -0.453421144800360330, -0.453465709053363140, -0.453510272172701680, -0.453554834158264530, +-0.453599395009940680, -0.453643954727617980, -0.453688513311185370, -0.453733070760531820, -0.453777627075545250, -0.453822182256114650, -0.453866736302128540, -0.453911289213476010, +-0.453955840990044880, -0.454000391631724120, -0.454044941138402380, -0.454089489509968690, -0.454134036746310870, -0.454178582847317940, -0.454223127812878600, -0.454267671642881840, +-0.454312214337215470, -0.454356755895768570, -0.454401296318430180, -0.454445835605088170, -0.454490373755631500, -0.454534910769949010, -0.454579446647929540, -0.454623981389461140, +-0.454668514994432730, -0.454713047462733060, -0.454757578794251160, -0.454802108988874910, -0.454846638046493390, -0.454891165966995250, -0.454935692750269630, -0.454980218396204390, +-0.455024742904688580, -0.455069266275611280, -0.455113788508860470, -0.455158309604325180, -0.455202829561894120, -0.455247348381455970, -0.455291866062899840, -0.455336382606113640, +-0.455380898010986520, -0.455425412277407520, -0.455469925405264600, -0.455514437394446860, -0.455558948244843050, -0.455603457956342270, -0.455647966528832440, -0.455692473962202690, +-0.455736980256341740, -0.455781485411138780, -0.455825989426481670, -0.455870492302259570, -0.455914994038361280, -0.455959494634675890, -0.456003994091091380, -0.456048492407496840, +-0.456092989583781530, -0.456137485619833300, -0.456181980515541370, -0.456226474270794490, -0.456270966885481410, -0.456315458359491330, -0.456359948692712240, -0.456404437885033210, +-0.456448925936343510, -0.456493412846531110, -0.456537898615485160, -0.456582383243094470, -0.456626866729248240, -0.456671349073834440, -0.456715830276742230, -0.456760310337860850, +-0.456804789257078350, -0.456849267034283860, -0.456893743669366190, -0.456938219162214110, -0.456982693512716920, -0.457027166720762660, -0.457071638786240410, -0.457116109709039490, +-0.457160579489047870, -0.457205048126154810, -0.457249515620249130, -0.457293981971220060, -0.457338447178955660, -0.457382911243345120, -0.457427374164277310, -0.457471835941641480, +-0.457516296575325660, -0.457560756065219070, -0.457605214411210600, -0.457649671613189480, -0.457694127671043840, -0.457738582584662820, -0.457783036353935750, -0.457827488978750700, +-0.457871940458996930, -0.457916390794563310, -0.457960839985338760, -0.458005288031212430, -0.458049734932072520, -0.458094180687808270, -0.458138625298308950, -0.458183068763462710, +-0.458227511083158730, -0.458271952257286060, -0.458316392285733840, -0.458360831168390270, -0.458405268905144600, -0.458449705495885820, -0.458494140940503110, -0.458538575238884640, +-0.458583008390919760, -0.458627440396497390, -0.458671871255506790, -0.458716300967836110, -0.458760729533374660, -0.458805156952011790, -0.458849583223635670, -0.458894008348135540, +-0.458938432325400440, -0.458982855155319220, -0.459027276837781270, -0.459071697372674730, -0.459116116759888950, -0.459160534999313310, -0.459204952090835890, -0.459249368034346070, +-0.459293782829732880, -0.459338196476885620, -0.459382608975692440, -0.459427020326042770, -0.459471430527825960, -0.459515839580930120, -0.459560247485244710, -0.459604654240658720, +-0.459649059847061060, -0.459693464304341160, -0.459737867612387160, -0.459782269771088550, -0.459826670780334620, -0.459871070640013650, -0.459915469350014980, -0.459959866910227670, +-0.460004263320541060, -0.460048658580843370, -0.460093052691024070, -0.460137445650972140, -0.460181837460576950, -0.460226228119726850, -0.460270617628311120, -0.460315005986218880, +-0.460359393193339460, -0.460403779249561220, -0.460448164154773520, -0.460492547908865790, -0.460536930511726340, -0.460581311963244480, -0.460625692263309410, -0.460670071411810100, +-0.460714449408635980, -0.460758826253675370, -0.460803201946817680, -0.460847576487952380, -0.460891949876967740, -0.460936322113753240, -0.460980693198197900, -0.461025063130191260, +-0.461069431909621570, -0.461113799536378320, -0.461158166010350530, -0.461202531331427690, -0.461246895499498210, -0.461291258514451410, -0.461335620376176540, -0.461379981084562960, +-0.461424340639499050, -0.461468699040874290, -0.461513056288578140, -0.461557412382499030, -0.461601767322526340, -0.461646121108549250, -0.461690473740457240, -0.461734825218138630, +-0.461779175541482960, -0.461823524710379410, -0.461867872724717410, -0.461912219584385330, -0.461956565289272700, -0.462000909839268610, -0.462045253234262710, -0.462089595474143240, +-0.462133936558799810, -0.462178276488121930, -0.462222615261997980, -0.462266952880317440, -0.462311289342969560, -0.462355624649843480, -0.462399958800828680, -0.462444291795813590, +-0.462488623634687790, -0.462532954317340820, -0.462577283843661090, -0.462621612213538150, -0.462665939426861180, -0.462710265483519730, -0.462754590383402220, -0.462798914126398230, +-0.462843236712397020, -0.462887558141288010, -0.462931878412959800, -0.462976197527301850, -0.463020515484203420, -0.463064832283554110, -0.463109147925242270, -0.463153462409157610, +-0.463197775735189670, -0.463242087903226910, -0.463286398913158930, -0.463330708764874980, -0.463375017458264200, -0.463419324993216310, -0.463463631369619710, -0.463507936587364000, +-0.463552240646338880, -0.463596543546432700, -0.463640845287535240, -0.463685145869535630, -0.463729445292323570, -0.463773743555787490, -0.463818040659817020, -0.463862336604301480, +-0.463906631389130520, -0.463950925014192550, -0.463995217479377280, -0.464039508784573950, -0.464083798929672280, -0.464128087914560670, -0.464172375739128900, -0.464216662403266530, +-0.464260947906862120, -0.464305232249805360, -0.464349515431985550, -0.464393797453292290, -0.464438078313614170, -0.464482358012840820, -0.464526636550861630, -0.464570913927566160, +-0.464615190142843080, -0.464659465196582020, -0.464703739088672300, -0.464748011819003600, -0.464792283387464480, -0.464836553793944670, -0.464880823038333830, -0.464925091120520610, +-0.464969358040394630, -0.465013623797845220, -0.465057888392761800, -0.465102151825034000, -0.465146414094550490, -0.465190675201200890, -0.465234935144875020, -0.465279193925461410, +-0.465323451542849820, -0.465367707996929610, -0.465411963287590490, -0.465456217414721100, -0.465500470378211180, -0.465544722177950070, -0.465588972813827550, -0.465633222285732230, +-0.465677470593553800, -0.465721717737181740, -0.465765963716505750, -0.465810208531414470, -0.465854452181797660, -0.465898694667545080, -0.465942935988545410, -0.465987176144688430, +-0.466031415135863440, -0.466075652961959960, -0.466119889622867770, -0.466164125118475380, -0.466208359448672730, -0.466252592613349560, -0.466296824612394520, -0.466341055445697430, +-0.466385285113147700, -0.466429513614635140, -0.466473740950048400, -0.466517967119277340, -0.466562192122211340, -0.466606415958740250, -0.466650638628752720, -0.466694860132138570, +-0.466739080468787320, -0.466783299638588720, -0.466827517641431490, -0.466871734477205480, -0.466915950145800560, -0.466960164647105320, -0.467004377981009690, -0.467048590147403130, +-0.467092801146175460, -0.467137010977215380, -0.467181219640412810, -0.467225427135657180, -0.467269633462838340, -0.467313838621845060, -0.467358042612567190, -0.467402245434894230, +-0.467446447088716020, -0.467490647573921280, -0.467534846890399920, -0.467579045038041870, -0.467623242016735830, -0.467667437826371660, -0.467711632466838890, -0.467755825938027000, +-0.467800018239826030, -0.467844209372124560, -0.467888399334812580, -0.467932588127779990, -0.467976775750915560, -0.468020962204109160, -0.468065147487250370, -0.468109331600229110, +-0.468153514542934080, -0.468197696315255320, -0.468241876917082300, -0.468286056348305000, -0.468330234608812120, -0.468374411698493700, -0.468418587617239260, -0.468462762364938720, +-0.468506935941480850, -0.468551108346755670, -0.468595279580653110, -0.468639449643061980, -0.468683618533872190, -0.468727786252973400, -0.468771952800255130, -0.468816118175607310, +-0.468860282378918860, -0.468904445410079700, -0.468948607268979800, -0.468992767955508040, -0.469036927469554330, -0.469081085811008270, -0.469125242979759940, -0.469169398975698090, +-0.469213553798712710, -0.469257707448693880, -0.469301859925530360, -0.469346011229112180, -0.469390161359329040, -0.469434310316070410, -0.469478458099226450, -0.469522604708685950, +-0.469566750144338960, -0.469610894406075450, -0.469655037493784290, -0.469699179407355560, -0.469743320146678910, -0.469787459711644320, -0.469831598102140700, -0.469875735318058100, +-0.469919871359286150, -0.469964006225714880, -0.470008139917233230, -0.470052272433731270, -0.470096403775098590, -0.470140533941225290, -0.470184662932000290, -0.470228790747313610, +-0.470272917387055340, -0.470317042851114360, -0.470361167139380810, -0.470405290251744320, -0.470449412188094660, -0.470493532948321800, -0.470537652532314780, -0.470581770939963560, +-0.470625888171158360, -0.470670004225787970, -0.470714119103742670, -0.470758232804912020, -0.470802345329186190, -0.470846456676454080, -0.470890566846605850, -0.470934675839531190, +-0.470978783655120250, -0.471022890293261940, -0.471066995753846420, -0.471111100036763430, -0.471155203141903070, -0.471199305069154250, -0.471243405818407230, -0.471287505389552110, +-0.471331603782477790, -0.471375700997074430, -0.471419797033231890, -0.471463891890839810, -0.471507985569788400, -0.471552078069966680, -0.471596169391264700, -0.471640259533572690, +-0.471684348496779700, -0.471728436280775820, -0.471772522885450800, -0.471816608310694940, -0.471860692556397120, -0.471904775622447540, -0.471948857508736500, -0.471992938215152870, +-0.472037017741586850, -0.472081096087928360, -0.472125173254067110, -0.472169249239893280, -0.472213324045295980, -0.472257397670165390, -0.472301470114391660, -0.472345541377863830, +-0.472389611460472200, -0.472433680362106530, -0.472477748082657080, -0.472521814622012810, -0.472565879980064050, -0.472609944156700550, -0.472654007151812610, -0.472698068965289260, +-0.472742129597020720, -0.472786189046896900, -0.472830247314807940, -0.472874304400642990, -0.472918360304292300, -0.472962415025646070, -0.473006468564593440, -0.473050520921024620, +-0.473094572094829520, -0.473138622085897960, -0.473182670894120250, -0.473226718519385470, -0.473270764961583930, -0.473314810220605840, -0.473358854296340340, -0.473402897188677670, +-0.473446938897507770, -0.473490979422720950, -0.473535018764206280, -0.473579056921854040, -0.473623093895554180, -0.473667129685196920, -0.473711164290671500, -0.473755197711868190, +-0.473799229948676850, -0.473843261000987840, -0.473887290868690250, -0.473931319551674450, -0.473975347049830800, -0.474019373363048340, -0.474063398491217420, -0.474107422434228040, +-0.474151445191970500, -0.474195466764333940, -0.474239487151208730, -0.474283506352484780, -0.474327524368052480, -0.474371541197800950, -0.474415556841620620, -0.474459571299401360, +-0.474503584571033530, -0.474547596656406390, -0.474591607555410240, -0.474635617267935520, -0.474679625793871300, -0.474723633133108060, -0.474767639285535670, -0.474811644251044220, +-0.474855648029524070, -0.474899650620864420, -0.474943652024955590, -0.474987652241688040, -0.475031651270950980, -0.475075649112634830, -0.475119645766629520, -0.475163641232825450, +-0.475207635511111950, -0.475251628601379320, -0.475295620503517650, -0.475339611217417300, -0.475383600742967540, -0.475427589080058780, -0.475471576228580990, -0.475515562188424720, +-0.475559546959479110, -0.475603530541634680, -0.475647512934781800, -0.475691494138809730, -0.475735474153608950, -0.475779452979069430, -0.475823430615081310, -0.475867407061535020, +-0.475911382318319810, -0.475955356385326160, -0.475999329262444480, -0.476043300949564100, -0.476087271446575480, -0.476131240753368660, -0.476175208869834170, -0.476219175795861260, +-0.476263141531340360, -0.476307106076161610, -0.476351069430215550, -0.476395031593391360, -0.476438992565579640, -0.476482952346670430, -0.476526910936554190, -0.476570868335120300, +-0.476614824542259290, -0.476658779557861570, -0.476702733381816510, -0.476746686014014600, -0.476790637454345970, -0.476834587702701150, -0.476878536758969520, -0.476922484623041490, +-0.476966431294807260, -0.477010376774157360, -0.477054321060981110, -0.477098264155169090, -0.477142206056611340, -0.477186146765198550, -0.477230086280819920, -0.477274024603366150, +-0.477317961732727670, -0.477361897668793890, -0.477405832411455400, -0.477449765960602290, -0.477493698316124760, -0.477537629477913450, -0.477581559445857620, -0.477625488219847850, +-0.477669415799774840, -0.477713342185527860, -0.477757267376997470, -0.477801191374074010, -0.477845114176647880, -0.477889035784608620, -0.477932956197846760, -0.477976875416252500, +-0.478020793439716480, -0.478064710268128020, -0.478108625901377820, -0.478152540339356060, -0.478196453581953340, -0.478240365629059080, -0.478284276480563930, -0.478328186136358470, +-0.478372094596332180, -0.478416001860375580, -0.478459907928379060, -0.478503812800232740, -0.478547716475827280, -0.478591618955052090, -0.478635520237797930, -0.478679420323955330, +-0.478723319213413770, -0.478767216906063940, -0.478811113401796050, -0.478855008700500740, -0.478898902802067540, -0.478942795706387090, -0.478986687413349650, -0.479030577922845920, +-0.479074467234765320, -0.479118355348998550, -0.479162242265435860, -0.479206127983968000, -0.479250012504484400, -0.479293895826875820, -0.479337777951032830, -0.479381658876845030, +-0.479425538604203120, -0.479469417132997340, -0.479513294463117970, -0.479557170594455790, -0.479601045526900300, -0.479644919260342200, -0.479688791794672160, -0.479732663129779800, +-0.479776533265555750, -0.479820402201890370, -0.479864269938674370, -0.479908136475797330, -0.479952001813149950, -0.479995865950622940, -0.480039728888105870, -0.480083590625489500, +-0.480127451162664090, -0.480171310499520110, -0.480215168635948260, -0.480259025571838080, -0.480302881307080320, -0.480346735841565730, -0.480390589175183960, -0.480434441307825700, +-0.480478292239381320, -0.480522141969741190, -0.480565990498796110, -0.480609837826435680, -0.480653683952551090, -0.480697528877031820, -0.480741372599768790, -0.480785215120652310, +-0.480829056439572740, -0.480872896556421010, -0.480916735471086600, -0.480960573183460360, -0.481004409693433050, -0.481048245000894330, -0.481092079105735040, -0.481135912007845500, +-0.481179743707116250, -0.481223574203437980, -0.481267403496700390, -0.481311231586794290, -0.481355058473610490, -0.481398884157038690, -0.481442708636969640, -0.481486531913293820, +-0.481530353985902100, -0.481574174854684070, -0.481617994519530630, -0.481661812980332560, -0.481705630236979600, -0.481749446289362560, -0.481793261137371920, -0.481837074780898100, +-0.481880887219831970, -0.481924698454063270, -0.481968508483482770, -0.482012317307981440, -0.482056124927448930, -0.482099931341776090, -0.482143736550853410, -0.482187540554571410, +-0.482231343352820920, -0.482275144945491730, -0.482318945332474600, -0.482362744513660570, -0.482406542488939270, -0.482450339258201580, -0.482494134821338070, -0.482537929178239620, +-0.482581722328795980, -0.482625514272898020, -0.482669305010436640, -0.482713094541301620, -0.482756882865383820, -0.482800669982573870, -0.482844455892762260, -0.482888240595839850, +-0.482932024091696440, -0.482975806380223030, -0.483019587461310460, -0.483063367334848560, -0.483107146000728180, -0.483150923458839980, -0.483194699709074470, -0.483238474751322590, +-0.483282248585474140, -0.483326021211420430, -0.483369792629051330, -0.483413562838257700, -0.483457331838930190, -0.483501099630959390, -0.483544866214236150, -0.483588631588650400, +-0.483632395754093060, -0.483676158710455160, -0.483719920457626410, -0.483763680995497880, -0.483807440323960170, -0.483851198442903860, -0.483894955352219940, -0.483938711051798200, +-0.483982465541529740, -0.484026218821305480, -0.484069970891015280, -0.484113721750550120, -0.484157471399800700, -0.484201219838657990, -0.484244967067011810, -0.484288713084753240, +-0.484332457891773320, -0.484376201487961790, -0.484419943873209800, -0.484463685047407940, -0.484507425010446860, -0.484551163762217630, -0.484594901302610070, -0.484638637631515270, +-0.484682372748824250, -0.484726106654426950, -0.484769839348214330, -0.484813570830077150, -0.484857301099906050, -0.484901030157592060, -0.484944758003025110, -0.484988484636096670, +-0.485032210056696610, -0.485075934264716010, -0.485119657260045630, -0.485163379042576060, -0.485207099612198430, -0.485250818968802730, -0.485294537112279930, -0.485338254042521180, +-0.485381969759416390, -0.485425684262856700, -0.485469397552732770, -0.485513109628935400, -0.485556820491355570, -0.485600530139883360, -0.485644238574409800, -0.485687945794826050, +-0.485731651801022070, -0.485775356592888900, -0.485819060170317400, -0.485862762533198600, -0.485906463681422480, -0.485950163614880250, -0.485993862333462980, -0.486037559837060650, +-0.486081256125564460, -0.486124951198865120, -0.486168645056853370, -0.486212337699420400, -0.486256029126456210, -0.486299719337851990, -0.486343408333498820, -0.486387096113286730, +-0.486430782677106930, -0.486474468024850120, -0.486518152156407200, -0.486561835071669280, -0.486605516770526330, -0.486649197252869650, -0.486692876518590330, -0.486736554567578470, +-0.486780231399725150, -0.486823907014921340, -0.486867581413058080, -0.486911254594025510, -0.486954926557714830, -0.486998597304017180, -0.487042266832822650, -0.487085935144022490, +-0.487129602237507450, -0.487173268113168410, -0.487216932770896620, -0.487260596210582100, -0.487304258432116060, -0.487347919435389800, -0.487391579220293360, -0.487435237786717930, +-0.487478895134554390, -0.487522551263693650, -0.487566206174026960, -0.487609859865444310, -0.487653512337837440, -0.487697163591096330, -0.487740813625112350, -0.487784462439776360, +-0.487828110034979220, -0.487871756410612150, -0.487915401566565320, -0.487959045502730000, -0.488002688218997450, -0.488046329715257740, -0.488089969991402250, -0.488133609047321840, +-0.488177246882907420, -0.488220883498050260, -0.488264518892640500, -0.488308153066569440, -0.488351786019728400, -0.488395417752007450, -0.488439048263297980, -0.488482677553490950, +-0.488526305622477560, -0.488569932470148020, -0.488613558096393670, -0.488657182501105790, -0.488700805684174570, -0.488744427645491360, -0.488788048384947050, -0.488831667902432650, +-0.488875286197839490, -0.488918903271057640, -0.488962519121978580, -0.489006133750493620, -0.489049747156492960, -0.489093359339867860, -0.489136970300509450, -0.489180580038308550, +-0.489224188553156640, -0.489267795844943840, -0.489311401913561540, -0.489355006758901090, -0.489398610380852810, -0.489442212779307990, -0.489485813954157580, -0.489529413905293090, +-0.489573012632604660, -0.489616610135983680, -0.489660206415321540, -0.489703801470508570, -0.489747395301436020, -0.489790987907995020, -0.489834579290076570, -0.489878169447572010, +-0.489921758380371660, -0.489965346088366950, -0.490008932571449230, -0.490052517829508820, -0.490096101862437070, -0.490139684670125090, -0.490183266252463890, -0.490226846609344900, +-0.490270425740658430, -0.490314003646296290, -0.490357580326148730, -0.490401155780107230, -0.490444730008062880, -0.490488303009906650, -0.490531874785530060, -0.490575445334823390, +-0.490619014657678100, -0.490662582753985720, -0.490706149623636460, -0.490749715266521780, -0.490793279682532890, -0.490836842871560760, -0.490880404833496930, -0.490923965568231650, +-0.490967525075656500, -0.491011083355662900, -0.491054640408141230, -0.491098196232982950, -0.491141750830079220, -0.491185304199321440, -0.491228856340600040, -0.491272407253806500, +-0.491315956938832290, -0.491359505395567830, -0.491403052623904660, -0.491446598623733800, -0.491490143394946450, -0.491533686937434100, -0.491577229251087210, -0.491620770335797210, +-0.491664310191455680, -0.491707848817952990, -0.491751386215180660, -0.491794922383029850, -0.491838457321391750, -0.491881991030157950, -0.491925523509218750, -0.491969054758465700, +-0.492012584777790420, -0.492056113567083340, -0.492099641126235940, -0.492143167455139420, -0.492186692553685410, -0.492230216421764230, -0.492273739059267520, -0.492317260466086930, +-0.492360780642112690, -0.492404299587236580, -0.492447817301349680, -0.492491333784343230, -0.492534849036108830, -0.492578363056536960, -0.492621875845519200, -0.492665387402947070, +-0.492708897728711130, -0.492752406822702940, -0.492795914684813710, -0.492839421314934690, -0.492882926712957530, -0.492926430878772640, -0.492969933812272110, -0.493013435513346310, +-0.493056935981886930, -0.493100435217785240, -0.493143933220932420, -0.493187429991220170, -0.493230925528538980, -0.493274419832780480, -0.493317912903836250, -0.493361404741596900, +-0.493404895345954050, -0.493448384716798970, -0.493491872854022910, -0.493535359757517500, -0.493578845427173400, -0.493622329862882130, -0.493665813064535440, -0.493709295032023820, +-0.493752775765238960, -0.493796255264072170, -0.493839733528415150, -0.493883210558158370, -0.493926686353193590, -0.493970160913412450, -0.494013634238705530, -0.494057106328964550, +-0.494100577184080790, -0.494144046803945640, -0.494187515188450670, -0.494230982337486580, -0.494274448250945020, -0.494317912928717740, -0.494361376370695270, -0.494404838576769370, +-0.494448299546831340, -0.494491759280772600, -0.494535217778484860, -0.494578675039858640, -0.494622131064785810, -0.494665585853157950, -0.494709039404865770, -0.494752491719801010, +-0.494795942797855050, -0.494839392638919570, -0.494882841242885230, -0.494926288609643770, -0.494969734739087010, -0.495013179631105530, -0.495056623285591080, -0.495100065702435090, +-0.495143506881528920, -0.495186946822764370, -0.495230385526032050, -0.495273822991223800, -0.495317259218231390, -0.495360694206945400, -0.495404127957257690, -0.495447560469059690, +-0.495490991742242760, -0.495534421776698760, -0.495577850572318290, -0.495621278128993590, -0.495664704446615310, -0.495708129525075260, -0.495751553364264910, -0.495794975964075680, +-0.495838397324399380, -0.495881817445126660, -0.495925236326149430, -0.495968653967359560, -0.496012070368647580, -0.496055485529905470, -0.496098899451024640, -0.496142312131896520, +-0.496185723572413080, -0.496229133772464910, -0.496272542731943880, -0.496315950450741890, -0.496359356928749660, -0.496402762165859050, -0.496446166161961520, -0.496489568916948950, +-0.496532970430712040, -0.496576370703142760, -0.496619769734132910, -0.496663167523573260, -0.496706564071355720, -0.496749959377371710, -0.496793353441512820, -0.496836746263670970, +-0.496880137843736860, -0.496923528181602350, -0.496966917277159470, -0.497010305130298870, -0.497053691740912520, -0.497097077108891950, -0.497140461234128690, -0.497183844116514670, +-0.497227225755940640, -0.497270606152298900, -0.497313985305480320, -0.497357363215376710, -0.497400739881879770, -0.497444115304880920, -0.497487489484272180, -0.497530862419944320, +-0.497574234111789360, -0.497617604559699170, -0.497660973763564550, -0.497704341723277540, -0.497747708438729620, -0.497791073909812480, -0.497834438136418030, -0.497877801118437100, +-0.497921162855761660, -0.497964523348283730, -0.498007882595894070, -0.498051240598484710, -0.498094597355947240, -0.498137952868173690, -0.498181307135054870, -0.498224660156482760, +-0.498268011932349380, -0.498311362462545590, -0.498354711746963440, -0.498398059785494450, -0.498441406578030380, -0.498484752124463140, -0.498528096424683600, -0.498571439478583840, +-0.498614781286055910, -0.498658121846990600, -0.498701461161280000, -0.498744799228815710, -0.498788136049489460, -0.498831471623193250, -0.498874805949817980, -0.498918139029255690, +-0.498961470861398420, -0.499004801446137130, -0.499048130783363800, -0.499091458872970130, -0.499134785714848260, -0.499178111308889010, -0.499221435654984450, -0.499264758753026730, +-0.499308080602906710, -0.499351401204516490, -0.499394720557747750, -0.499438038662492260, -0.499481355518642030, -0.499524671126088000, -0.499567985484722310, -0.499611298594437040, +-0.499654610455123160, -0.499697921066672710, -0.499741230428977500, -0.499784538541929220, -0.499827845405419970, -0.499871151019340710, -0.499914455383583920, -0.499957758498040640, +-0.500001060362602940, -0.500044360977162650, -0.500087660341611450, -0.500130958455841430, -0.500174255319743690, -0.500217550933210300, -0.500260845296133350, -0.500304138408403930, +-0.500347430269914240, -0.500390720880555920, -0.500434010240220830, -0.500477298348801060, -0.500520585206187580, -0.500563870812272830, -0.500607155166948650, -0.500650438270106250, +-0.500693720121637710, -0.500737000721434900, -0.500780280069389900, -0.500823558165393920, -0.500866835009339040, -0.500910110601117450, -0.500953384940620140, -0.500996658027739410, +-0.501039929862367010, -0.501083200444394810, -0.501126469773715000, -0.501169737850218570, -0.501213004673797920, -0.501256270244345050, -0.501299534561751140, -0.501342797625908390, +-0.501386059436708660, -0.501429319994043720, -0.501472579297805980, -0.501515837347886300, -0.501559094144177100, -0.501602349686570470, -0.501645603974957610, -0.501688857009230830, +-0.501732108789281760, -0.501775359315002940, -0.501818608586285240, -0.501861856603021070, -0.501905103365102630, -0.501948348872421010, -0.501991593124868630, -0.502034836122337120, +-0.502078077864718590, -0.502121318351905320, -0.502164557583788310, -0.502207795560259850, -0.502251032281212370, -0.502294267746536850, -0.502337501956125700, -0.502380734909870790, +-0.502423966607664090, -0.502467197049397800, -0.502510426234963110, -0.502553654164252790, -0.502596880837157920, -0.502640106253570920, -0.502683330413383640, -0.502726553316487970, +-0.502769774962776310, -0.502812995352139860, -0.502856214484470930, -0.502899432359661840, -0.502942648977603770, -0.502985864338189040, -0.503029078441309730, -0.503072291286857600, +-0.503115502874725280, -0.503158713204803760, -0.503201922276985460, -0.503245130091162670, -0.503288336647226720, -0.503331541945069900, -0.503374745984584320, -0.503417948765662150, +-0.503461150288194830, -0.503504350552074540, -0.503547549557193830, -0.503590747303443780, -0.503633943790716910, -0.503677139018905210, -0.503720332987900640, -0.503763525697595640, +-0.503806717147881390, -0.503849907338650320, -0.503893096269794950, -0.503936283941206490, -0.503979470352777240, -0.504022655504399290, -0.504065839395964720, -0.504109022027365960, +-0.504152203398494310, -0.504195383509242090, -0.504238562359501820, -0.504281739949164700, -0.504324916278123260, -0.504368091346269590, -0.504411265153495990, -0.504454437699693890, +-0.504497608984755710, -0.504540779008573860, -0.504583947771039760, -0.504627115272045730, -0.504670281511483850, -0.504713446489246320, -0.504756610205225550, -0.504799772659312860, +-0.504842933851400780, -0.504886093781381720, -0.504929252449147100, -0.504972409854589240, -0.505015565997600450, -0.505058720878072690, -0.505101874495898610, -0.505145026850969290, +-0.505188177943177940, -0.505231327772415750, -0.505274476338575140, -0.505317623641548420, -0.505360769681227560, -0.505403914457505210, -0.505447057970272670, -0.505490200219422590, +-0.505533341204847280, -0.505576480926438250, -0.505619619384088060, -0.505662756577688780, -0.505705892507132600, -0.505749027172312180, -0.505792160573118710, -0.505835292709444830, +-0.505878423581183070, -0.505921553188224960, -0.505964681530462920, -0.506007808607789160, -0.506050934420096300, -0.506094058967275770, -0.506137182249220000, -0.506180304265821720, +-0.506223425016972260, -0.506266544502564250, -0.506309662722489890, -0.506352779676641380, -0.506395895364911250, -0.506439009787191030, -0.506482122943373250, -0.506525234833350660, +-0.506568345457014460, -0.506611454814257510, -0.506654562904971790, -0.506697669729049840, -0.506740775286383950, -0.506783879576865770, -0.506826982600387940, -0.506870084356843000, +-0.506913184846122470, -0.506956284068118990, -0.506999382022724880, -0.507042478709832540, -0.507085574129333750, -0.507128668281120910, -0.507171761165086890, -0.507214852781122990, +-0.507257943129121980, -0.507301032208976150, -0.507344120020577720, -0.507387206563819420, -0.507430291838592670, -0.507473375844790240, -0.507516458582304650, -0.507559540051027660, +-0.507602620250851790, -0.507645699181669240, -0.507688776843372550, -0.507731853235854350, -0.507774928359006060, -0.507818002212720890, -0.507861074796890240, -0.507904146111407000, +-0.507947216156163340, -0.507990284931051580, -0.508033352435964590, -0.508076418670793780, -0.508119483635431910, -0.508162547329771840, -0.508205609753704880, -0.508248670907124000, +-0.508291730789921400, -0.508334789401989400, -0.508377846743220840, -0.508420902813507380, -0.508463957612741550, -0.508507011140816310, -0.508550063397623100, -0.508593114383054770, +-0.508636164097003520, -0.508679212539362440, -0.508722259710022830, -0.508765305608877560, -0.508808350235819380, -0.508851393590740050, -0.508894435673532210, -0.508937476484088270, +-0.508980516022300660, -0.509023554288062010, -0.509066591281264190, -0.509109627001799960, -0.509152661449561950, -0.509195694624441920, -0.509238726526332730, -0.509281757155126580, +-0.509324786510716220, -0.509367814592994070, -0.509410841401852110, -0.509453866937183530, -0.509496891198879750, -0.509539914186833750, -0.509582935900938060, -0.509625956341084980, +-0.509668975507167390, -0.509711993399076910, -0.509755010016706530, -0.509798025359949000, -0.509841039428696070, -0.509884052222840390, -0.509927063742274700, -0.509970073986891310, +-0.510013082956583210, -0.510056090651241910, -0.510099097070760400, -0.510142102215031530, -0.510185106083947070, -0.510228108677399870, -0.510271109995282250, -0.510314110037486950, +-0.510357108803906830, -0.510400106294433440, -0.510443102508960190, -0.510486097447378830, -0.510529091109582220, -0.510572083495462900, -0.510615074604913400, -0.510658064437826460, +-0.510701052994094070, -0.510744040273609090, -0.510787026276264380, -0.510830011001951690, -0.510872994450563890, -0.510915976621993730, -0.510958957516133520, -0.511001937132876450, +-0.511044915472114060, -0.511087892533739320, -0.511130868317645310, -0.511173842823723800, -0.511216816051867640, -0.511259788001969360, -0.511302758673922050, -0.511345728067617470, +-0.511388696182948580, -0.511431663019808360, -0.511474628578088450, -0.511517592857682170, -0.511560555858481810, -0.511603517580380030, -0.511646478023269900, -0.511689437187043180, +-0.511732395071592850, -0.511775351676811870, -0.511818307002592230, -0.511861261048826680, -0.511904213815408070, -0.511947165302228950, -0.511990115509182280, -0.512033064436159920, +-0.512076012083055310, -0.512118958449760300, -0.512161903536167860, -0.512204847342170640, -0.512247789867661290, -0.512290731112532870, -0.512333671076677270, -0.512376609759987560, +-0.512419547162356600, -0.512462483283676380, -0.512505418123839980, -0.512548351682740040, -0.512591283960269210, -0.512634214956320670, -0.512677144670786070, -0.512720073103558600, +-0.512763000254531360, -0.512805926123596320, -0.512848850710646340, -0.512891774015574290, -0.512934696038273240, -0.512977616778634960, -0.513020536236552750, -0.513063454411919470, +-0.513106371304627330, -0.513149286914569070, -0.513192201241637780, -0.513235114285725880, -0.513278026046726570, -0.513320936524531810, -0.513363845719034710, -0.513406753630128440, +-0.513449660257704890, -0.513492565601657120, -0.513535469661878020, -0.513578372438260210, -0.513621273930696790, -0.513664174139079830, -0.513707073063302540, -0.513749970703257790, +-0.513792867058837870, -0.513835762129935760, -0.513878655916444220, -0.513921548418256320, -0.513964439635264280, -0.514007329567361170, -0.514050218214440080, -0.514093105576392980, +-0.514135991653113190, -0.514178876444493450, -0.514221759950426520, -0.514264642170805590, -0.514307523105522520, -0.514350402754470860, -0.514393281117543450, -0.514436158194632400, +-0.514479033985631110, -0.514521908490432110, -0.514564781708928390, -0.514607653641013020, -0.514650524286578200, -0.514693393645517470, -0.514736261717722910, -0.514779128503087600, +-0.514821994001504520, -0.514864858212866430, -0.514907721137066620, -0.514950582773997080, -0.514993443123551110, -0.515036302185621910, -0.515079159960101560, -0.515122016446883380, +-0.515164871645860110, -0.515207725556924620, -0.515250578179970220, -0.515293429514888990, -0.515336279561574240, -0.515379128319919060, -0.515421975789815750, -0.515464821971157510, +-0.515507666863837200, -0.515550510467748140, -0.515593352782782400, -0.515636193808833300, -0.515679033545794030, -0.515721871993556790, -0.515764709152015000, -0.515807545021061300, +-0.515850379600588770, -0.515893212890490730, -0.515936044890659250, -0.515978875600987650, -0.516021705021369240, -0.516064533151696200, -0.516107359991861750, -0.516150185541758950, +-0.516193009801280690, -0.516235832770320370, -0.516278654448769970, -0.516321474836523020, -0.516364293933472720, -0.516407111739511260, -0.516449928254532060, -0.516492743478428110, +-0.516535557411092580, -0.516578370052417800, -0.516621181402297180, -0.516663991460623920, -0.516706800227290210, -0.516749607702189580, -0.516792413885215020, -0.516835218776259260, +-0.516878022375215960, -0.516920824681977200, -0.516963625696436390, -0.517006425418486850, -0.517049223848020880, -0.517092020984931900, -0.517134816829112780, -0.517177611380456700, +-0.517220404638856880, -0.517263196604205720, -0.517305987276396980, -0.517348776655322860, -0.517391564740876770, -0.517434351532951810, -0.517477137031440940, -0.517519921236237690, +-0.517562704147234150, -0.517605485764323860, -0.517648266087400330, -0.517691045116355660, -0.517733822851083380, -0.517776599291476570, -0.517819374437428310, -0.517862148288831920, +-0.517904920845579820, -0.517947692107565420, -0.517990462074682250, -0.518033230746822390, -0.518075998123879500, -0.518118764205746650, -0.518161528992317270, -0.518204292483483650, +-0.518247054679139340, -0.518289815579177750, -0.518332575183491300, -0.518375333491973290, -0.518418090504517040, -0.518460846221015510, -0.518503600641362250, -0.518546353765449660, +-0.518589105593171170, -0.518631856124420310, -0.518674605359089380, -0.518717353297071910, -0.518760099938261110, -0.518802845282550160, -0.518845589329832270, -0.518888332080000180, +-0.518931073532947210, -0.518973813688566990, -0.519016552546751720, -0.519059290107395150, -0.519102026370390380, -0.519144761335630920, -0.519187495003009200, -0.519230227372418640, +-0.519272958443752990, -0.519315688216904550, -0.519358416691766860, -0.519401143868233110, -0.519443869746196500, -0.519486594325550670, -0.519529317606187920, -0.519572039588001910, +-0.519614760270886160, -0.519657479654733080, -0.519700197739436320, -0.519742914524889080, -0.519785630010984660, -0.519828344197616370, -0.519871057084676960, -0.519913768672060290, +-0.519956478959658800, -0.519999187947365990, -0.520041895635075300, -0.520084602022679920, -0.520127307110073380, -0.520170010897148210, -0.520212713383797930, -0.520255414569916420, +-0.520298114455395870, -0.520340813040130020, -0.520383510324012200, -0.520426206306935480, -0.520468900988793730, -0.520511594369479360, -0.520554286448886020, -0.520596977226907230, +-0.520639666703435760, -0.520682354878365010, -0.520725041751588400, -0.520767727322999590, -0.520810411592491080, -0.520853094559956540, -0.520895776225289600, -0.520938456588382890, +-0.520981135649130070, -0.521023813407424320, -0.521066489863159070, -0.521109165016228060, -0.521151838866523610, -0.521194511413939690, -0.521237182658369820, -0.521279852599706550, +-0.521322521237843730, -0.521365188572674660, -0.521407854604092560, -0.521450519331991160, -0.521493182756263110, -0.521535844876802050, -0.521578505693501840, -0.521621165206255010, +-0.521663823414955210, -0.521706480319495850, -0.521749135919770680, -0.521791790215672350, -0.521834443207094490, -0.521877094893930860, -0.521919745276074100, -0.521962394353418070, +-0.522005042125855970, -0.522047688593281320, -0.522090333755587890, -0.522132977612668080, -0.522175620164415990, -0.522218261410725140, -0.522260901351488280, -0.522303539986599170, +-0.522346177315951230, -0.522388813339437760, -0.522431448056952740, -0.522474081468388700, -0.522516713573639820, -0.522559344372598770, -0.522601973865159270, -0.522644602051214990, +-0.522687228930659110, -0.522729854503385600, -0.522772478769287010, -0.522815101728257290, -0.522857723380190100, -0.522900343724978290, -0.522942962762515620, -0.522985580492695610, +-0.523028196915411580, -0.523070812030557390, -0.523113425838025780, -0.523156038337710740, -0.523198649529505900, -0.523241259413304020, -0.523283867988999060, -0.523326475256484350, +-0.523369081215653950, -0.523411685866400410, -0.523454289208617580, -0.523496891242199560, -0.523539491967038860, -0.523582091383029360, -0.523624689490064690, -0.523667286288038270, +-0.523709881776844080, -0.523752475956374750, -0.523795068826524270, -0.523837660387186490, -0.523880250638254160, -0.523922839579621160, -0.523965427211181110, -0.524008013532827550, +-0.524050598544454240, -0.524093182245954140, -0.524135764637221340, -0.524178345718148920, -0.524220925488630530, -0.524263503948559810, -0.524306081097830390, -0.524348656936336030, +-0.524391231463969820, -0.524433804680625390, -0.524476376586196950, -0.524518947180577120, -0.524561516463659890, -0.524604084435338900, -0.524646651095507680, -0.524689216444060300, +-0.524731780480889420, -0.524774343205889120, -0.524816904618953250, -0.524859464719974910, -0.524902023508847740, -0.524944580985465590, -0.524987137149722340, -0.525029692001510950, +-0.525072245540725290, -0.525114797767259330, -0.525157348681006050, -0.525199898281859420, -0.525242446569712970, -0.525284993544460450, -0.525327539205995840, -0.525370083554212000, +-0.525412626589002900, -0.525455168310262730, -0.525497708717884150, -0.525540247811761340, -0.525582785591787950, -0.525625322057857500, -0.525667857209864200, -0.525710391047700790, +-0.525752923571261470, -0.525795454780440210, -0.525837984675129990, -0.525880513255224780, -0.525923040520618220, -0.525965566471204520, -0.526008091106876410, -0.526050614427528210, +-0.526093136433053780, -0.526135657123346090, -0.526178176498299340, -0.526220694557807180, -0.526263211301763230, -0.526305726730061600, -0.526348240842595240, -0.526390753639258360, +-0.526433265119944930, -0.526475775284548030, -0.526518284132961640, -0.526560791665079520, -0.526603297880795520, -0.526645802780003500, -0.526688306362596670, -0.526730808628469440, +-0.526773309577514890, -0.526815809209627010, -0.526858307524699530, -0.526900804522626440, -0.526943300203301600, -0.526985794566618200, -0.527028287612470230, -0.527070779340751970, +-0.527113269751356420, -0.527155758844177650, -0.527198246619109410, -0.527240733076045690, -0.527283218214880440, -0.527325702035506770, -0.527368184537818860, -0.527410665721710910, +-0.527453145587075790, -0.527495624133807910, -0.527538101361801020, -0.527580577270949090, -0.527623051861145440, -0.527665525132284150, -0.527707997084259530, -0.527750467716964430, +-0.527792937030293170, -0.527835405024139500, -0.527877871698397390, -0.527920337052961040, -0.527962801087723310, -0.528005263802578730, -0.528047725197421270, -0.528090185272144240, +-0.528132644026641620, -0.528175101460807370, -0.528217557574535480, -0.528260012367720020, -0.528302465840254200, -0.528344917992032200, -0.528387368822948230, -0.528429818332895480, +-0.528472266521768150, -0.528514713389460210, -0.528557158935865860, -0.528599603160878280, -0.528642046064391580, -0.528684487646300270, -0.528726927906497220, -0.528769366844876960, +-0.528811804461333250, -0.528854240755760040, -0.528896675728051550, -0.528939109378101070, -0.528981541705802800, -0.529023972711051060, -0.529066402393738920, -0.529108830753760920, +-0.529151257791010690, -0.529193683505382430, -0.529236107896770340, -0.529278530965067500, -0.529320952710168770, -0.529363373131967350, -0.529405792230357440, -0.529448210005233010, +-0.529490626456488030, -0.529533041584016930, -0.529575455387712890, -0.529617867867470120, -0.529660279023183130, -0.529702688854745030, -0.529745097362050220, -0.529787504544992680, +-0.529829910403466280, -0.529872314937365640, -0.529914718146583750, -0.529957120031015030, -0.529999520590553890, -0.530041919825093630, -0.530084317734528580, -0.530126714318752690, +-0.530169109577660390, -0.530211503511144990, -0.530253896119100790, -0.530296287401422210, -0.530338677358002550, -0.530381065988736240, -0.530423453293517260, -0.530465839272239560, +-0.530508223924797680, -0.530550607251084940, -0.530592989250995630, -0.530635369924424170, -0.530677749271263990, -0.530720127291409380, -0.530762503984754440, -0.530804879351193360, +-0.530847253390620330, -0.530889626102928890, -0.530931997488013340, -0.530974367545768100, -0.531016736276086590, -0.531059103678863330, -0.531101469753992310, -0.531143834501367930, +-0.531186197920883510, -0.531228560012433680, -0.531270920775912870, -0.531313280211214380, -0.531355638318232630, -0.531397995096861810, -0.531440350546996010, -0.531482704668529650, +-0.531525057461356250, -0.531567408925370130, -0.531609759060465930, -0.531652107866536830, -0.531694455343477590, -0.531736801491182190, -0.531779146309544810, -0.531821489798459890, +-0.531863831957820830, -0.531906172787522610, -0.531948512287458650, -0.531990850457523260, -0.532033187297610840, -0.532075522807615500, -0.532117856987431640, -0.532160189836952790, +-0.532202521356073490, -0.532244851544688260, -0.532287180402690520, -0.532329507929974800, -0.532371834126435290, -0.532414158991966200, -0.532456482526462160, -0.532498804729816480, +-0.532541125601923790, -0.532583445142678750, -0.532625763351974650, -0.532668080229706130, -0.532710395775767400, -0.532752709990053090, -0.532795022872456610, -0.532837334422872620, +-0.532879644641195640, -0.532921953527319080, -0.532964261081137810, -0.533006567302545810, -0.533048872191437370, -0.533091175747707150, -0.533133477971248550, -0.533175778861956330, +-0.533218078419725020, -0.533260376644448140, -0.533302673536020230, -0.533344969094335710, -0.533387263319288870, -0.533429556210774150, -0.533471847768685170, -0.533514137992916580, +-0.533556426883363020, -0.533598714439917910, -0.533641000662476110, -0.533683285550931920, -0.533725569105179760, -0.533767851325113290, -0.533810132210627230, -0.533852411761616240, +-0.533894689977973740, -0.533936966859594580, -0.533979242406373070, -0.534021516618203410, -0.534063789494980350, -0.534106061036597410, -0.534148331242949250, -0.534190600113930710, +-0.534232867649435340, -0.534275133849357760, -0.534317398713592300, -0.534359662242033460, -0.534401924434575680, -0.534444185291112820, -0.534486444811539840, -0.534528702995750390, +-0.534570959843639230, -0.534613215355100650, -0.534655469530028960, -0.534697722368319030, -0.534739973869864380, -0.534782224034559770, -0.534824472862300060, -0.534866720352978780, +-0.534908966506490670, -0.534951211322730160, -0.534993454801591550, -0.535035696942969820, -0.535077937746758380, -0.535120177212852100, -0.535162415341145730, -0.535204652131533010, +-0.535246887583908590, -0.535289121698167000, -0.535331354474202990, -0.535373585911910200, -0.535415816011183380, -0.535458044771917500, -0.535500272194006090, -0.535542498277344010, +-0.535584723021825690, -0.535626946427345540, -0.535669168493798420, -0.535711389221077970, -0.535753608609079060, -0.535795826657696540, -0.535838043366824060, -0.535880258736356470, +-0.535922472766188210, -0.535964685456213790, -0.536006896806327960, -0.536049106816424590, -0.536091315486398880, -0.536133522816144460, -0.536175728805556200, -0.536217933454528620, +-0.536260136762956250, -0.536302338730733850, -0.536344539357755280, -0.536386738643915280, -0.536428936589108950, -0.536471133193229810, -0.536513328456172830, -0.536555522377832550, +-0.536597714958103490, -0.536639906196880510, -0.536682096094057370, -0.536724284649529040, -0.536766471863190260, -0.536808657734935020, -0.536850842264658180, -0.536893025452254150, +-0.536935207297617900, -0.536977387800643300, -0.537019566961225210, -0.537061744779258610, -0.537103921254637350, -0.537146096387256190, -0.537188270177009760, -0.537230442623792710, +-0.537272613727499900, -0.537314783488025190, -0.537356951905263560, -0.537399118979109970, -0.537441284709458070, -0.537483449096203050, -0.537525612139239330, -0.537567773838461660, +-0.537609934193764900, -0.537652093205042920, -0.537694250872190690, -0.537736407195103290, -0.537778562173674480, -0.537820715807799220, -0.537862868097372160, -0.537905019042288270, +-0.537947168642441520, -0.537989316897726890, -0.538031463808039230, -0.538073609373272640, -0.538115753593321980, -0.538157896468081990, -0.538200037997447200, -0.538242178181312700, +-0.538284317019572360, -0.538326454512121240, -0.538368590658854340, -0.538410725459665620, -0.538452858914450160, -0.538494991023102390, -0.538537121785517270, -0.538579251201589670, +-0.538621379271213560, -0.538663505994284470, -0.538705631370696160, -0.538747755400343700, -0.538789878083121950, -0.538831999418925460, -0.538874119407649400, -0.538916238049187650, +-0.538958355343435280, -0.539000471290287390, -0.539042585889638050, -0.539084699141382130, -0.539126811045414490, -0.539168921601629770, -0.539211030809923280, -0.539253138670188650, +-0.539295245182321300, -0.539337350346216220, -0.539379454161767250, -0.539421556628869810, -0.539463657747418330, -0.539505757517308230, -0.539547855938433240, -0.539589953010688680, +-0.539632048733969640, -0.539674143108169970, -0.539716236133185090, -0.539758327808909530, -0.539800418135238160, -0.539842507112066160, -0.539884594739287520, -0.539926681016797310, +-0.539968765944490840, -0.540010849522262080, -0.540052931750006240, -0.540095012627617940, -0.540137092154992170, -0.540179170332024120, -0.540221247158607750, -0.540263322634638170, +-0.540305396760010770, -0.540347469534619430, -0.540389540958359450, -0.540431611031125580, -0.540473679752813020, -0.540515747123315960, -0.540557813142529490, -0.540599877810348910, +-0.540641941126668300, -0.540684003091382760, -0.540726063704387250, -0.540768122965576530, -0.540810180874845890, -0.540852237432089430, -0.540894292637202460, -0.540936346490080040, +-0.540978398990616390, -0.541020450138706700, -0.541062499934245930, -0.541104548377128960, -0.541146595467250970, -0.541188641204506050, -0.541230685588789950, -0.541272728619996870, +-0.541314770298021770, -0.541356810622759870, -0.541398849594105890, -0.541440887211955160, -0.541482923476201970, -0.541524958386741310, -0.541566991943468690, -0.541609024146278210, +-0.541651054995065160, -0.541693084489724420, -0.541735112630151060, -0.541777139416240280, -0.541819164847886280, -0.541861188924984360, -0.541903211647429830, -0.541945233015116880, +-0.541987253027940820, -0.542029271685796730, -0.542071288988579700, -0.542113304936184150, -0.542155319528505380, -0.542197332765438690, -0.542239344646878170, -0.542281355172719360, +-0.542323364342857220, -0.542365372157186610, -0.542407378615602950, -0.542449383718000440, -0.542491387464274500, -0.542533389854320540, -0.542575390888032640, -0.542617390565306220, +-0.542659388886036490, -0.542701385850118180, -0.542743381457446720, -0.542785375707916520, -0.542827368601422890, -0.542869360137861130, -0.542911350317125670, -0.542953339139111810, +-0.542995326603714630, -0.543037312710829450, -0.543079297460350660, -0.543121280852173590, -0.543163262886193770, -0.543205243562305370, -0.543247222880403830, -0.543289200840384230, +-0.543331177442141660, -0.543373152685571510, -0.543415126570568120, -0.543457099097026890, -0.543499070264843340, -0.543541040073911690, -0.543583008524127440, -0.543624975615385700, +-0.543666941347581530, -0.543708905720610370, -0.543750868734366510, -0.543792830388745930, -0.543834790683642820, -0.543876749618952830, -0.543918707194570920, -0.543960663410392180, +-0.544002618266312240, -0.544044571762225320, -0.544086523898027030, -0.544128474673612810, -0.544170424088877060, -0.544212372143715100, -0.544254318838022330, -0.544296264171693740, +-0.544338208144624860, -0.544380150756710090, -0.544422092007844970, -0.544464031897924920, -0.544505970426844450, -0.544547907594499110, -0.544589843400783980, -0.544631777845594580, +-0.544673710928825330, -0.544715642650371870, -0.544757573010129610, -0.544799502007993100, -0.544841429643857840, -0.544883355917618940, -0.544925280829171800, -0.544967204378411730, +-0.545009126565233260, -0.545051047389531920, -0.545092966851203450, -0.545134884950142170, -0.545176801686243610, -0.545218717059403170, -0.545260631069515830, -0.545302543716477240, +-0.545344455000182030, -0.545386364920525610, -0.545428273477403750, -0.545470180670710740, -0.545512086500342330, -0.545553990966193610, -0.545595894068160450, -0.545637795806137030, +-0.545679696180019210, -0.545721595189702420, -0.545763492835081410, -0.545805389116051590, -0.545847284032508260, -0.545889177584346850, -0.545931069771462770, -0.545972960593750670, +-0.546014850051106170, -0.546056738143424920, -0.546098624870601350, -0.546140510232531300, -0.546182394229110080, -0.546224276860232780, -0.546266158125795150, -0.546308038025691720, +-0.546349916559818570, -0.546391793728070340, -0.546433669530342560, -0.546475543966530640, -0.546517417036529900, -0.546559288740235850, -0.546601159077543360, -0.546643028048347860, +-0.546684895652545190, -0.546726761890030000, -0.546768626760697820, -0.546810490264444060, -0.546852352401164140, -0.546894213170753600, -0.546936072573107280, -0.546977930608120720, +-0.547019787275689670, -0.547061642575708880, -0.547103496508073880, -0.547145349072680200, -0.547187200269423470, -0.547229050098198440, -0.547270898558900760, -0.547312745651426180, +-0.547354591375669330, -0.547396435731526080, -0.547438278718891720, -0.547480120337661690, -0.547521960587731620, -0.547563799468996360, -0.547605636981351560, -0.547647473124693080, +-0.547689307898915570, -0.547731141303914760, -0.547772973339586080, -0.547814804005825050, -0.547856633302527320, -0.547898461229587630, -0.547940287786902180, -0.547982112974365610, +-0.548023936791873780, -0.548065759239321990, -0.548107580316606000, -0.548149400023621340, -0.548191218360262740, -0.548233035326426200, -0.548274850922007340, -0.548316665146901140, +-0.548358478001003120, -0.548400289484208940, -0.548442099596414100, -0.548483908337514370, -0.548525715707404490, -0.548567521705980220, -0.548609326333137640, -0.548651129588771380, +-0.548692931472777200, -0.548734731985050740, -0.548776531125487850, -0.548818328893983300, -0.548860125290432820, -0.548901920314732390, -0.548943713966776880, -0.548985506246462030, +-0.549027297153683480, -0.549069086688336650, -0.549110874850317400, -0.549152661639520700, -0.549194447055842310, -0.549236231099178180, -0.549278013769423090, -0.549319795066472990, +-0.549361574990223310, -0.549403353540569790, -0.549445130717408190, -0.549486906520633480, -0.549528680950141400, -0.549570454005828050, -0.549612225687588160, -0.549653995995317720, +-0.549695764928912370, -0.549737532488267950, -0.549779298673279240, -0.549821063483842300, -0.549862826919853110, -0.549904588981206530, -0.549946349667798430, -0.549988108979524440, +-0.550029866916280200, -0.550071623477961680, -0.550113378664463640, -0.550155132475682260, -0.550196884911513310, -0.550238635971851850, -0.550280385656593870, -0.550322133965634790, +-0.550363880898870450, -0.550405626456196730, -0.550447370637508700, -0.550489113442702460, -0.550530854871673190, -0.550572594924316650, -0.550614333600528690, -0.550656070900204960, +-0.550697806823241320, -0.550739541369532850, -0.550781274538975520, -0.550823006331465410, -0.550864736746897400, -0.550906465785167440, -0.550948193446171410, -0.550989919729804930, +-0.551031644635963990, -0.551073368164543550, -0.551115090315439700, -0.551156811088548420, -0.551198530483764880, -0.551240248500984850, -0.551281965140104410, -0.551323680401019310, +-0.551365394283624630, -0.551407106787816460, -0.551448817913490870, -0.551490527660542960, -0.551532236028868580, -0.551573943018363710, -0.551615648628924090, -0.551657352860445590, +-0.551699055712823290, -0.551740757185953390, -0.551782457279732070, -0.551824155994054100, -0.551865853328815880, -0.551907549283912950, -0.551949243859241050, -0.551990937054696600, +-0.552032628870174350, -0.552074319305570490, -0.552116008360781230, -0.552157696035701530, -0.552199382330227690, -0.552241067244255370, -0.552282750777680740, -0.552324432930398790, +-0.552366113702305820, -0.552407793093298020, -0.552449471103270250, -0.552491147732118830, -0.552532822979739490, -0.552574496846028220, -0.552616169330880980, -0.552657840434192970, +-0.552699510155860390, -0.552741178495779420, -0.552782845453845040, -0.552824511029953560, -0.552866175224000940, -0.552907838035882730, -0.552949499465495320, -0.552991159512733810, +-0.553032818177494830, -0.553074475459673360, -0.553116131359165820, -0.553157785875867840, -0.553199439009675390, -0.553241090760484780, -0.553282741128190980, -0.553324390112690410, +-0.553366037713879160, -0.553407683931652520, -0.553449328765906690, -0.553490972216537420, -0.553532614283440800, -0.553574254966513020, -0.553615894265649280, -0.553657532180745650, +-0.553699168711698660, -0.553740803858403410, -0.553782437620756070, -0.553824069998652750, -0.553865700991989510, -0.553907330600661660, -0.553948958824565520, -0.553990585663597380, +-0.554032211117652440, -0.554073835186626900, -0.554115457870416720, -0.554157079168917990, -0.554198699082026900, -0.554240317609638660, -0.554281934751649660, -0.554323550507956230, +-0.554365164878453440, -0.554406777863037830, -0.554448389461605240, -0.554489999674051770, -0.554531608500273610, -0.554573215940165950, -0.554614821993625440, -0.554656426660548150, +-0.554698029940829400, -0.554739631834365590, -0.554781232341052700, -0.554822831460787150, -0.554864429193464130, -0.554906025538979940, -0.554947620497231120, -0.554989214068112970, +-0.555030806251521680, -0.555072397047353340, -0.555113986455504140, -0.555155574475870270, -0.555197161108347050, -0.555238746352830990, -0.555280330209218410, -0.555321912677404720, +-0.555363493757286110, -0.555405073448758890, -0.555446651751718920, -0.555488228666062730, -0.555529804191685520, -0.555571378328484240, -0.555612951076354110, -0.555654522435191640, +-0.555696092404892820, -0.555737660985353820, -0.555779228176470960, -0.555820793978139660, -0.555862358390256440, -0.555903921412717720, -0.555945483045418800, -0.555987043288256100, +-0.556028602141125820, -0.556070159603924140, -0.556111715676547270, -0.556153270358890840, -0.556194823650851270, -0.556236375552324970, -0.556277926063207360, -0.556319475183394860, +-0.556361022912783780, -0.556402569251270410, -0.556444114198750390, -0.556485657755119930, -0.556527199920275770, -0.556568740694113330, -0.556610280076528910, -0.556651818067418810, +-0.556693354666679130, -0.556734889874206500, -0.556776423689896330, -0.556817956113645040, -0.556859487145349160, -0.556901016784904330, -0.556942545032206860, -0.556984071887153040, +-0.557025597349639080, -0.557067121419561380, -0.557108644096815600, -0.557150165381298250, -0.557191685272905860, -0.557233203771533850, -0.557274720877078740, -0.557316236589436960, +-0.557357750908504920, -0.557399263834178040, -0.557440775366353170, -0.557482285504926620, -0.557523794249794040, -0.557565301600851940, -0.557606807557996520, -0.557648312121124200, +-0.557689815290131400, -0.557731317064913750, -0.557772817445367770, -0.557814316431390120, -0.557855814022876320, -0.557897310219722890, -0.557938805021826360, -0.557980298429082700, +-0.558021790441388670, -0.558063281058639780, -0.558104770280733130, -0.558146258107564130, -0.558187744539029530, -0.558229229575025520, -0.558270713215448520, -0.558312195460194950, +-0.558353676309160660, -0.558395155762242080, -0.558436633819336060, -0.558478110480338130, -0.558519585745144820, -0.558561059613652540, -0.558602532085757720, -0.558644003161356870, +-0.558685472840345640, -0.558726941122620670, -0.558768408008078810, -0.558809873496615590, -0.558851337588127550, -0.558892800282511320, -0.558934261579663310, -0.558975721479479380, +-0.559017179981856070, -0.559058637086690240, -0.559100092793877510, -0.559141547103314430, -0.559183000014897510, -0.559224451528523180, -0.559265901644087960, -0.559307350361487710, +-0.559348797680619070, -0.559390243601378680, -0.559431688123662510, -0.559473131247366970, -0.559514572972388710, -0.559556013298623920, -0.559597452225969460, -0.559638889754321080, +-0.559680325883575860, -0.559721760613629440, -0.559763193944378570, -0.559804625875719660, -0.559846056407549360, -0.559887485539764200, -0.559928913272259910, -0.559970339604933360, +-0.560011764537681310, -0.560053188070399610, -0.560094610202984790, -0.560136030935333480, -0.560177450267342110, -0.560218868198907540, -0.560260284729925400, -0.560301699860292550, +-0.560343113589905740, -0.560384525918660840, -0.560425936846454590, -0.560467346373183520, -0.560508754498744160, -0.560550161223033140, -0.560591566545946440, -0.560632970467381140, +-0.560674372987233110, -0.560715774105399190, -0.560757173821775700, -0.560798572136259390, -0.560839969048746890, -0.560881364559134180, -0.560922758667318110, -0.560964151373195440, +-0.561005542676662030, -0.561046932577614840, -0.561088321075950190, -0.561129708171564820, -0.561171093864355600, -0.561212478154218150, -0.561253861041049570, -0.561295242524746720, +-0.561336622605205340, -0.561378001282322400, -0.561419378555994550, -0.561460754426118540, -0.561502128892590320, -0.561543501955306780, -0.561584873614164870, -0.561626243869060350, +-0.561667612719890190, -0.561708980166551130, -0.561750346208939490, -0.561791710846952450, -0.561833074080485660, -0.561874435909436310, -0.561915796333701150, -0.561957155353176140, +-0.561998512967758270, -0.562039869177344050, -0.562081223981830250, -0.562122577381113710, -0.562163929375090410, -0.562205279963657540, -0.562246629146711200, -0.562287976924148340, +-0.562329323295865380, -0.562370668261759190, -0.562412011821726730, -0.562453353975663870, -0.562494694723467580, -0.562536034065034940, -0.562577372000261810, -0.562618708529045390, +-0.562660043651282080, -0.562701377366868650, -0.562742709675702170, -0.562784040577678500, -0.562825370072694840, -0.562866698160648050, -0.562908024841434210, -0.562949350114950180, +-0.562990673981092930, -0.563031996439759210, -0.563073317490845220, -0.563114637134247920, -0.563155955369864400, -0.563197272197590640, -0.563238587617323700, -0.563279901628960240, +-0.563321214232397120, -0.563362525427531290, -0.563403835214258740, -0.563445143592476660, -0.563486450562082020, -0.563527756122970900, -0.563569060275040390, -0.563610363018187230, +-0.563651664352308290, -0.563692964277300420, -0.563734262793059830, -0.563775559899483470, -0.563816855596468660, -0.563858149883911360, -0.563899442761708670, -0.563940734229757430, +-0.563982024287954630, -0.564023312936196450, -0.564064600174379980, -0.564105886002402410, -0.564147170420159720, -0.564188453427549090, -0.564229735024467380, -0.564271015210811240, +-0.564312293986477980, -0.564353571351363660, -0.564394847305365380, -0.564436121848380320, -0.564477394980304580, -0.564518666701035450, -0.564559937010469580, -0.564601205908503930, +-0.564642473395035480, -0.564683739469960640, -0.564725004133176720, -0.564766267384580020, -0.564807529224067520, -0.564848789651536290, -0.564890048666883080, -0.564931306270005100, +-0.564972562460798520, -0.565013817239160550, -0.565055070604988270, -0.565096322558178100, -0.565137573098627000, -0.565178822226232060, -0.565220069940890020, -0.565261316242498200, +-0.565302561130952670, -0.565343804606150860, -0.565385046667989830, -0.565426287316365790, -0.565467526551176050, -0.565508764372317450, -0.565550000779687310, -0.565591235773181930, +-0.565632469352698290, -0.565673701518134010, -0.565714932269384960, -0.565756161606348670, -0.565797389528922000, -0.565838616037001810, -0.565879841130485390, -0.565921064809269070, +-0.565962287073250030, -0.566003507922325680, -0.566044727356392220, -0.566085945375346960, -0.566127161979086750, -0.566168377167508670, -0.566209590940510040, -0.566250803297987050, +-0.566292014239837100, -0.566333223765957410, -0.566374431876244370, -0.566415638570595180, -0.566456843848906930, -0.566498047711076920, -0.566539250157001350, -0.566580451186577740, +-0.566621650799703390, -0.566662848996274500, -0.566704045776188490, -0.566745241139342440, -0.566786435085633200, -0.566827627614958200, -0.566868818727213840, -0.566910008422297440, +-0.566951196700106410, -0.566992383560536940, -0.567033569003486560, -0.567074753028852240, -0.567115935636531070, -0.567157116826420450, -0.567198296598416580, -0.567239474952417440, +-0.567280651888319110, -0.567321827406019220, -0.567363001505414850, -0.567404174186402880, -0.567445345448880810, -0.567486515292745080, -0.567527683717893080, -0.567568850724222250, +-0.567610016311628770, -0.567651180480010400, -0.567692343229264100, -0.567733504559286840, -0.567774664469976150, -0.567815822961228570, -0.567856980032941380, -0.567898135685012130, +-0.567939289917337110, -0.567980442729813850, -0.568021594122339550, -0.568062744094811610, -0.568103892647126460, -0.568145039779181520, -0.568186185490874410, -0.568227329782101440, +-0.568268472652760150, -0.568309614102747720, -0.568350754131961230, -0.568391892740298220, -0.568433029927655100, -0.568474165693929390, -0.568515300039018620, -0.568556432962819320, +-0.568597564465228800, -0.568638694546144460, -0.568679823205463400, -0.568720950443083130, -0.568762076258900070, -0.568803200652811870, -0.568844323624716040, -0.568885445174509010, +-0.568926565302088410, -0.568967684007351430, -0.569008801290195490, -0.569049917150517230, -0.569091031588214170, -0.569132144603183950, -0.569173256195323000, -0.569214366364528820, +-0.569255475110698740, -0.569296582433730050, -0.569337688333520160, -0.569378792809965840, -0.569419895862964380, -0.569460997492413630, -0.569502097698210030, -0.569543196480251200, +-0.569584293838434340, -0.569625389772656750, -0.569666484282816080, -0.569707577368808730, -0.569748669030532890, -0.569789759267885000, -0.569830848080762680, -0.569871935469063340, +-0.569913021432684070, -0.569954105971522630, -0.569995189085475530, -0.570036270774440520, -0.570077351038315140, -0.570118429876996120, -0.570159507290380900, -0.570200583278366980, +-0.570241657840851570, -0.570282730977732410, -0.570323802688906030, -0.570364872974270190, -0.570405941833722510, -0.570447009267159630, -0.570488075274479200, -0.570529139855578520, +-0.570570203010355440, -0.570611264738706490, -0.570652325040529320, -0.570693383915721770, -0.570734441364180390, -0.570775497385802800, -0.570816551980486530, -0.570857605148128890, +-0.570898656888627620, -0.570939707201879370, -0.570980756087781760, -0.571021803546232780, -0.571062849577128830, -0.571103894180367670, -0.571144937355846930, -0.571185979103463690, +-0.571227019423115930, -0.571268058314700290, -0.571309095778114510, -0.571350131813256330, -0.571391166420022520, -0.571432199598310710, -0.571473231348018420, -0.571514261669043400, +-0.571555290561282400, -0.571596318024633180, -0.571637344058993580, -0.571678368664260140, -0.571719391840330830, -0.571760413587103060, -0.571801433904474240, -0.571842452792342140, +-0.571883470250603600, -0.571924486279156370, -0.571965500877898330, -0.572006514046726200, -0.572047525785537640, -0.572088536094230380, -0.572129544972701740, -0.572170552420849690, +-0.572211558438570740, -0.572252563025763330, -0.572293566182324190, -0.572334567908151070, -0.572375568203141620, -0.572416567067193240, -0.572457564500203690, -0.572498560502069930, +-0.572539555072689830, -0.572580548211961140, -0.572621539919780710, -0.572662530196046520, -0.572703519040655860, -0.572744506453506500, -0.572785492434496170, -0.572826476983521850, +-0.572867460100481280, -0.572908441785272340, -0.572949422037792090, -0.572990400857938180, -0.573031378245608350, -0.573072354200700350, -0.573113328723111160, -0.573154301812738630, +-0.573195273469480630, -0.573236243693234230, -0.573277212483897070, -0.573318179841367010, -0.573359145765541480, -0.573400110256318430, -0.573441073313594730, -0.573482034937268240, +-0.573522995127237150, -0.573563953883398200, -0.573604911205649380, -0.573645867093888210, -0.573686821548012430, -0.573727774567920010, -0.573768726153507710, -0.573809676304673940, +-0.573850625021315670, -0.573891572303330880, -0.573932518150617080, -0.573973462563072020, -0.574014405540593690, -0.574055347083078930, -0.574096287190425820, -0.574137225862532350, +-0.574178163099295480, -0.574219098900613180, -0.574260033266383090, -0.574300966196502950, -0.574341897690870740, -0.574382827749383540, -0.574423756371939100, -0.574464683558435720, +-0.574505609308770260, -0.574546533622840800, -0.574587456500544990, -0.574628377941780900, -0.574669297946445500, -0.574710216514436880, -0.574751133645653110, -0.574792049339991060, +-0.574832963597348920, -0.574873876417624330, -0.574914787800715140, -0.574955697746519220, -0.574996606254933870, -0.575037513325856840, -0.575078418959186430, -0.575119323154819620, +-0.575160225912654590, -0.575201127232588870, -0.575242027114520440, -0.575282925558347260, -0.575323822563966300, -0.575364718131275880, -0.575405612260174060, -0.575446504950557820, +-0.575487396202325250, -0.575528286015374310, -0.575569174389602980, -0.575610061324908330, -0.575650946821188450, -0.575691830878341640, -0.575732713496264870, -0.575773594674856340, +-0.575814474414013900, -0.575855352713635190, -0.575896229573618410, -0.575937104993860750, -0.575977978974260400, -0.576018851514715320, -0.576059722615122840, -0.576100592275381020, +-0.576141460495387720, -0.576182327275040820, -0.576223192614238490, -0.576264056512877710, -0.576304918970857230, -0.576345779988074010, -0.576386639564426370, -0.576427497699812160, +-0.576468354394129250, -0.576509209647275700, -0.576550063459148830, -0.576590915829646830, -0.576631766758667790, -0.576672616246109100, -0.576713464291868870, -0.576754310895844840, +-0.576795156057935190, -0.576835999778037900, -0.576876842056050280, -0.576917682891870620, -0.576958522285397010, -0.576999360236526870, -0.577040196745158160, -0.577081031811189080, +-0.577121865434517820, -0.577162697615041460, -0.577203528352658310, -0.577244357647266780, -0.577285185498763950, -0.577326011907048130, -0.577366836872017400, -0.577407660393569500, +-0.577448482471602740, -0.577489303106014540, -0.577530122296702970, -0.577570940043566570, -0.577611756346502410, -0.577652571205408800, -0.577693384620183830, -0.577734196590725340, +-0.577775007116931750, -0.577815816198700370, -0.577856623835929280, -0.577897430028517120, -0.577938234776360970, -0.577979038079359240, -0.578019839937410020, -0.578060640350411380, +-0.578101439318260860, -0.578142236840856860, -0.578183032918097470, -0.578223827549880220, -0.578264620736103300, -0.578305412476664890, -0.578346202771462980, -0.578386991620395860, +-0.578427779023360960, -0.578468564980256560, -0.578509349490981210, -0.578550132555432080, -0.578590914173507500, -0.578631694345105750, -0.578672473070124820, -0.578713250348462990, +-0.578754026180017590, -0.578794800564687570, -0.578835573502370250, -0.578876344992963920, -0.578917115036366780, -0.578957883632476800, -0.578998650781192500, -0.579039416482411200, +-0.579080180736031290, -0.579120943541951430, -0.579161704900068800, -0.579202464810281810, -0.579243223272488780, -0.579283980286587670, -0.579324735852476900, -0.579365489970053990, +-0.579406242639217360, -0.579446993859865420, -0.579487743631895700, -0.579528491955206610, -0.579569238829696240, -0.579609984255263220, -0.579650728231804860, -0.579691470759219670, +-0.579732211837406200, -0.579772951466261730, -0.579813689645684920, -0.579854426375573940, -0.579895161655826890, -0.579935895486342280, -0.579976627867017540, -0.580017358797751290, +-0.580058088278441960, -0.580098816308987080, -0.580139542889285040, -0.580180268019234280, -0.580220991698732760, -0.580261713927679220, -0.580302434705970980, -0.580343154033506670, +-0.580383871910184810, -0.580424588335902940, -0.580465303310559570, -0.580506016834053010, -0.580546728906281670, -0.580587439527143200, -0.580628148696536120, -0.580668856414359060, +-0.580709562680509440, -0.580750267494885900, -0.580790970857386730, -0.580831672767910150, -0.580872373226354770, -0.580913072232618120, -0.580953769786598630, -0.580994465888195260, +-0.581035160537305310, -0.581075853733827420, -0.581116545477659900, -0.581157235768701040, -0.581197924606849380, -0.581238611992002660, -0.581279297924059750, -0.581319982402918160, +-0.581360665428476640, -0.581401347000633510, -0.581442027119286940, -0.581482705784335700, -0.581523382995677300, -0.581564058753210490, -0.581604733056833910, -0.581645405906445090, +-0.581686077301942770, -0.581726747243225260, -0.581767415730190860, -0.581808082762738320, -0.581848748340765280, -0.581889412464170250, -0.581930075132852110, -0.581970736346708370, +-0.582011396105637790, -0.582052054409538780, -0.582092711258309970, -0.582133366651849000, -0.582174020590054630, -0.582214673072825590, -0.582255324100059420, -0.582295973671655090, +-0.582336621787510780, -0.582377268447524800, -0.582417913651596120, -0.582458557399622270, -0.582499199691501990, -0.582539840527134150, -0.582580479906416260, -0.582621117829247190, +-0.582661754295525360, -0.582702389305149170, -0.582743022858017270, -0.582783654954027510, -0.582824285593078640, -0.582864914775069410, -0.582905542499897460, -0.582946168767461750, +-0.582986793577660590, -0.583027416930392840, -0.583068038825556020, -0.583108659263049330, -0.583149278242771190, -0.583189895764619550, -0.583230511828493170, -0.583271126434290580, +-0.583311739581910070, -0.583352351271250620, -0.583392961502209870, -0.583433570274686790, -0.583474177588580110, -0.583514783443787710, -0.583555387840208220, -0.583595990777740380, +-0.583636592256282500, -0.583677192275733450, -0.583717790835991070, -0.583758387936954670, -0.583798983578521890, -0.583839577760591590, -0.583880170483062400, -0.583920761745832850, +-0.583961351548801690, -0.584001939891866770, -0.584042526774927070, -0.584083112197881340, -0.584123696160627540, -0.584164278663064420, -0.584204859705090620, -0.584245439286604660, +-0.584286017407505520, -0.584326594067690940, -0.584367169267059890, -0.584407743005511350, -0.584448315282942940, -0.584488886099253870, -0.584529455454342540, -0.584570023348107930, +-0.584610589780447890, -0.584651154751261390, -0.584691718260447300, -0.584732280307903700, -0.584772840893529210, -0.584813400017222820, -0.584853957678882820, -0.584894513878408300, +-0.584935068615697110, -0.584975621890648220, -0.585016173703160720, -0.585056724053132360, -0.585097272940462210, -0.585137820365048910, -0.585178366326791100, -0.585218910825587630, +-0.585259453861336600, -0.585299995433937290, -0.585340535543287580, -0.585381074189286530, -0.585421611371832800, -0.585462147090825110, -0.585502681346162350, -0.585543214137742570, +-0.585583745465464660, -0.585624275329227780, -0.585664803728929930, -0.585705330664470060, -0.585745856135746810, -0.585786380142658940, -0.585826902685105510, -0.585867423762984400, +-0.585907943376194780, -0.585948461524635640, -0.585988978208204950, -0.586029493426801880, -0.586070007180325090, -0.586110519468673540, -0.586151030291745420, -0.586191539649439710, +-0.586232047541655590, -0.586272553968290810, -0.586313058929244790, -0.586353562424416050, -0.586394064453703460, -0.586434565017005970, -0.586475064114221790, -0.586515561745249990, +-0.586556057909989550, -0.586596552608338650, -0.586637045840196380, -0.586677537605461490, -0.586718027904032710, -0.586758516735809250, -0.586799004100689190, -0.586839489998571610, +-0.586879974429355580, -0.586920457392939300, -0.586960938889221960, -0.587001418918102200, -0.587041897479479210, -0.587082374573251190, -0.587122850199317200, -0.587163324357576450, +-0.587203797047927020, -0.587244268270268100, -0.587284738024498430, -0.587325206310516990, -0.587365673128222960, -0.587406138477514330, -0.587446602358290380, -0.587487064770450210, +-0.587527525713892110, -0.587567985188515160, -0.587608443194218230, -0.587648899730900180, -0.587689354798460300, -0.587729808396796560, -0.587770260525808720, -0.587810711185394960, +-0.587851160375454260, -0.587891608095885810, -0.587932054346588240, -0.587972499127460970, -0.588012942438402080, -0.588053384279310750, -0.588093824650086420, -0.588134263550627150, +-0.588174700980832130, -0.588215136940600460, -0.588255571429830870, -0.588296004448422780, -0.588336435996274280, -0.588376866073284650, -0.588417294679353330, -0.588457721814378390, +-0.588498147478259010, -0.588538571670894410, -0.588578994392183750, -0.588619415642025130, -0.588659835420318080, -0.588700253726961660, -0.588740670561854420, -0.588781085924895420, +-0.588821499815983640, -0.588861912235018160, -0.588902323181898280, -0.588942732656522190, -0.588983140658789320, -0.589023547188598950, -0.589063952245849400, -0.589104355830439850, +-0.589144757942269500, -0.589185158581237210, -0.589225557747242500, -0.589265955440183340, -0.589306351659959480, -0.589346746406470000, -0.589387139679613310, -0.589427531479288720, +-0.589467921805395420, -0.589508310657832600, -0.589548698036498560, -0.589589083941292950, -0.589629468372114830, -0.589669851328862850, -0.589710232811436090, -0.589750612819733840, +-0.589790991353654980, -0.589831368413099020, -0.589871743997964380, -0.589912118108150250, -0.589952490743556270, -0.589992861904080620, -0.590033231589622950, -0.590073599800082120, +-0.590113966535357300, -0.590154331795347930, -0.590194695579952300, -0.590235057889070380, -0.590275418722600360, -0.590315778080441890, -0.590356135962493920, -0.590396492368655660, +-0.590436847298826510, -0.590477200752904880, -0.590517552730790210, -0.590557903232382110, -0.590598252257578780, -0.590638599806279860, -0.590678945878384540, -0.590719290473791680, +-0.590759633592401130, -0.590799975234110990, -0.590840315398820980, -0.590880654086430530, -0.590920991296838060, -0.590961327029943200, -0.591001661285644910, -0.591041994063842950, +-0.591082325364435500, -0.591122655187322320, -0.591162983532402930, -0.591203310399575630, -0.591243635788740060, -0.591283959699795410, -0.591324282132640880, -0.591364603087175980, +-0.591404922563299240, -0.591445240560910190, -0.591485557079908350, -0.591525872120192250, -0.591566185681661530, -0.591606497764215370, -0.591646808367752850, -0.591687117492173840, +-0.591727425137376530, -0.591767731303260660, -0.591808035989725870, -0.591848339196670680, -0.591888640923994620, -0.591928941171596890, -0.591969239939377220, -0.592009537227234040, +-0.592049833035067090, -0.592090127362775890, -0.592130420210258970, -0.592170711577416080, -0.592211001464146290, -0.592251289870349140, -0.592291576795924040, -0.592331862240769610, +-0.592372146204785620, -0.592412428687871580, -0.592452709689926140, -0.592492989210848810, -0.592533267250539120, -0.592573543808896260, -0.592613818885819880, -0.592654092481208480, +-0.592694364594962390, -0.592734635226979890, -0.592774904377160960, -0.592815172045404570, -0.592855438231610350, -0.592895702935677950, -0.592935966157505880, -0.592976227896993890, +-0.593016488154041730, -0.593056746928547930, -0.593097004220412230, -0.593137260029534150, -0.593177514355812780, -0.593217767199148090, -0.593258018559438600, -0.593298268436584060, +-0.593338516830484220, -0.593378763741037710, -0.593419009168144270, -0.593459253111703330, -0.593499495571614630, -0.593539736547776810, -0.593579976040089610, -0.593620214048452890, +-0.593660450572765290, -0.593700685612926550, -0.593740919168836090, -0.593781151240393210, -0.593821381827498000, -0.593861610930048860, -0.593901838547945760, -0.593942064681088340, +-0.593982289329375470, -0.594022512492706880, -0.594062734170981990, -0.594102954364100320, -0.594143173071961520, -0.594183390294464430, -0.594223606031508920, -0.594263820282994850, +-0.594304033048820730, -0.594344244328886550, -0.594384454123091820, -0.594424662431336180, -0.594464869253518600, -0.594505074589538940, -0.594545278439296830, -0.594585480802691250, +-0.594625681679621930, -0.594665881069988410, -0.594706078973690100, -0.594746275390627080, -0.594786470320697980, -0.594826663763802670, -0.594866855719841100, -0.594907046188712040, +-0.594947235170315340, -0.594987422664550510, -0.595027608671317210, -0.595067793190515170, -0.595107976222043260, -0.595148157765801880, -0.595188337821689670, -0.595228516389606610, +-0.595268693469452330, -0.595308869061126230, -0.595349043164528410, -0.595389215779557610, -0.595429386906113690, -0.595469556544096720, -0.595509724693405460, -0.595549891353939990, +-0.595590056525599710, -0.595630220208284270, -0.595670382401893630, -0.595710543106326760, -0.595750702321483530, -0.595790860047263780, -0.595831016283566610, -0.595871171030291860, +-0.595911324287339280, -0.595951476054608630, -0.595991626331998980, -0.596031775119410300, -0.596071922416742560, -0.596112068223894510, -0.596152212540766450, -0.596192355367257790, +-0.596232496703268280, -0.596272636548697780, -0.596312774903445360, -0.596352911767411120, -0.596393047140494900, -0.596433181022595680, -0.596473313413613540, -0.596513444313448100, +-0.596553573721999020, -0.596593701639166360, -0.596633828064849100, -0.596673952998947650, -0.596714076441360990, -0.596754198391989070, -0.596794318850731640, -0.596834437817488460, +-0.596874555292159600, -0.596914671274643930, -0.596954785764841620, -0.596994898762652660, -0.597035010267976120, -0.597075120280711970, -0.597115228800760180, -0.597155335828020160, +-0.597195441362392220, -0.597235545403775330, -0.597275647952069550, -0.597315749007175100, -0.597355848568990820, -0.597395946637417020, -0.597436043212353220, -0.597476138293699720, +-0.597516231881355610, -0.597556323975220850, -0.597596414575195630, -0.597636503681178930, -0.597676591293071050, -0.597716677410771720, -0.597756762034180710, -0.597796845163198090, +-0.597836926797723050, -0.597877006937655660, -0.597917085582896140, -0.597957162733343540, -0.597997238388898070, -0.598037312549459470, -0.598077385214927480, -0.598117456385202530, +-0.598157526060183580, -0.598197594239770700, -0.598237660923864320, -0.598277726112363410, -0.598317789805168140, -0.598357852002178390, -0.598397912703294340, -0.598437971908415190, +-0.598478029617441120, -0.598518085830272330, -0.598558140546808000, -0.598598193766948230, -0.598638245490593080, -0.598678295717642310, -0.598718344447996100, -0.598758391681553650, +-0.598798437418215260, -0.598838481657881120, -0.598878524400450420, -0.598918565645823460, -0.598958605393900000, -0.598998643644580110, -0.599038680397763980, -0.599078715653350690, +-0.599118749411240990, -0.599158781671334180, -0.599198812433530350, -0.599238841697729450, -0.599278869463831470, -0.599318895731736580, -0.599358920501344210, -0.599398943772554540, +-0.599438965545267880, -0.599478985819383410, -0.599519004594801450, -0.599559021871421960, -0.599599037649145020, -0.599639051927870700, -0.599679064707498540, -0.599719075987928620, +-0.599759085769061450, -0.599799094050796120, -0.599839100833033050, -0.599879106115672300, -0.599919109898614080, -0.599959112181757790, -0.599999112965003740, -0.600039112248252240, +-0.600079110031402570, -0.600119106314355170, -0.600159101097009870, -0.600199094379267000, -0.600239086161026610, -0.600279076442188250, -0.600319065222652100, -0.600359052502318800, +-0.600399038281087320, -0.600439022558858390, -0.600479005335531890, -0.600518986611007780, -0.600558966385186690, -0.600598944657967700, -0.600638921429251460, -0.600678896698938150, +-0.600718870466927290, -0.600758842733119300, -0.600798813497414150, -0.600838782759712360, -0.600878750519913350, -0.600918716777917310, -0.600958681533624860, -0.600998644786935430, +-0.601038606537749320, -0.601078566785966720, -0.601118525531487700, -0.601158482774212690, -0.601198438514041200, -0.601238392750873540, -0.601278345484610230, -0.601318296715150800, +-0.601358246442395550, -0.601398194666244670, -0.601438141386598350, -0.601478086603357000, -0.601518030316420150, -0.601557972525688540, -0.601597913231061600, -0.601637852432439950, +-0.601677790129723560, -0.601717726322812840, -0.601757661011607990, -0.601797594196008760, -0.601837525875915550, -0.601877456051228780, -0.601917384721848080, -0.601957311887673980, +-0.601997237548606570, -0.602037161704546020, -0.602077084355392870, -0.602117005501046740, -0.602156925141408060, -0.602196843276377460, -0.602236759905854350, -0.602276675029739360, +-0.602316588647932690, -0.602356500760334980, -0.602396411366845520, -0.602436320467365170, -0.602476228061794240, -0.602516134150032470, -0.602556038731980380, -0.602595941807538060, +-0.602635843376606030, -0.602675743439084700, -0.602715641994873600, -0.602755539043873470, -0.602795434585984840, -0.602835328621107220, -0.602875221149141380, -0.602915112169987390, +-0.602955001683545650, -0.602994889689716820, -0.603034776188400290, -0.603074661179496930, -0.603114544662907260, -0.603154426638530810, -0.603194307106268310, -0.603234186066020080, +-0.603274063517686640, -0.603313939461167850, -0.603353813896364110, -0.603393686823176180, -0.603433558241503690, -0.603473428151247380, -0.603513296552307340, -0.603553163444584210, +-0.603593028827978490, -0.603632892702389840, -0.603672755067718890, -0.603712615923866490, -0.603752475270732170, -0.603792333108216670, -0.603832189436220300, -0.603872044254643470, +-0.603911897563386920, -0.603951749362350300, -0.603991599651434560, -0.604031448430539570, -0.604071295699565860, -0.604111141458414050, -0.604150985706984220, -0.604190828445177350, +-0.604230669672893070, -0.604270509390032130, -0.604310347596495270, -0.604350184292182120, -0.604390019476993560, -0.604429853150829980, -0.604469685313591800, -0.604509515965179660, +-0.604549345105493410, -0.604589172734433800, -0.604628998851901580, -0.604668823457796600, -0.604708646552019500, -0.604748468134470700, -0.604788288205051260, -0.604828106763660610, +-0.604867923810199710, -0.604907739344569430, -0.604947553366669390, -0.604987365876400450, -0.605027176873663140, -0.605066986358357870, -0.605106794330385500, -0.605146600789645770, +-0.605186405736039550, -0.605226209169467680, -0.605266011089829910, -0.605305811497027110, -0.605345610390959800, -0.605385407771528490, -0.605425203638634060, -0.605464997992176120, +-0.605504790832055770, -0.605544582158173860, -0.605584371970430020, -0.605624160268725340, -0.605663947052960230, -0.605703732323035540, -0.605743516078851240, -0.605783298320308080, +-0.605823079047307140, -0.605862858259748060, -0.605902635957531910, -0.605942412140559110, -0.605982186808730280, -0.606021959961946300, -0.606061731600107120, -0.606101501723113610, +-0.606141270330866730, -0.606181037423266340, -0.606220803000213300, -0.606260567061608250, -0.606300329607351810, -0.606340090637344840, -0.606379850151487320, -0.606419608149680540, +-0.606459364631824370, -0.606499119597819880, -0.606538873047567480, -0.606578624980967930, -0.606618375397922180, -0.606658124298330100, -0.606697871682092770, -0.606737617549111040, +-0.606777361899284990, -0.606817104732515490, -0.606856846048703270, -0.606896585847748970, -0.606936324129553450, -0.606976060894016790, -0.607015796141040060, -0.607055529870524140, +-0.607095262082368970, -0.607134992776475760, -0.607174721952745020, -0.607214449611077840, -0.607254175751374190, -0.607293900373535030, -0.607333623477461560, -0.607373345063053630, +-0.607413065130212430, -0.607452783678838480, -0.607492500708832540, -0.607532216220095790, -0.607571930212528090, -0.607611642686030520, -0.607651353640504270, -0.607691063075849300, +-0.607730770991966600, -0.607770477388757000, -0.607810182266121270, -0.607849885623960360, -0.607889587462174360, -0.607929287780664800, -0.607968986579331740, -0.608008683858076050, +-0.608048379616798810, -0.608088073855400530, -0.608127766573782420, -0.608167457771844560, -0.608207147449488120, -0.608246835606614080, -0.608286522243122520, -0.608326207358914850, +-0.608365890953891490, -0.608405573027953510, -0.608445253581001880, -0.608484932612936790, -0.608524610123659440, -0.608564286113070900, -0.608603960581071140, -0.608643633527561680, +-0.608683304952442940, -0.608722974855616110, -0.608762643236982150, -0.608802310096441150, -0.608841975433894840, -0.608881639249243210, -0.608921301542387440, -0.608960962313228380, +-0.609000621561667010, -0.609040279287604400, -0.609079935490940750, -0.609119590171577240, -0.609159243329415070, -0.609198894964354530, -0.609238545076296710, -0.609278193665142460, +-0.609317840730792870, -0.609357486273148900, -0.609397130292110960, -0.609436772787580130, -0.609476413759457710, -0.609516053207643900, -0.609555691132040000, -0.609595327532546860, +-0.609634962409065780, -0.609674595761496960, -0.609714227589741590, -0.609753857893700960, -0.609793486673275490, -0.609833113928366140, -0.609872739658874120, -0.609912363864700160, +-0.609951986545745670, -0.609991607701910970, -0.610031227333097110, -0.610070845439205640, -0.610110462020136630, -0.610150077075791500, -0.610189690606071090, -0.610229302610876600, +-0.610268913090109110, -0.610308522043669030, -0.610348129471458000, -0.610387735373376210, -0.610427339749325170, -0.610466942599205750, -0.610506543922918920, -0.610546143720366200, +-0.610585741991447660, -0.610625338736064840, -0.610664933954119030, -0.610704527645510530, -0.610744119810140650, -0.610783710447910470, -0.610823299558721060, -0.610862887142473720, +-0.610902473199068870, -0.610942057728407820, -0.610981640730391960, -0.611021222204921610, -0.611060802151898290, -0.611100380571222850, -0.611139957462796920, -0.611179532826520710, +-0.611219106662295620, -0.611258678970023170, -0.611298249749603670, -0.611337819000938530, -0.611377386723928830, -0.611416952918475640, -0.611456517584480500, -0.611496080721843690, +-0.611535642330466640, -0.611575202410250870, -0.611614760961096680, -0.611654317982905700, -0.611693873475578800, -0.611733427439017370, -0.611772979873122620, -0.611812530777795070, +-0.611852080152936240, -0.611891627998447430, -0.611931174314229390, -0.611970719100183300, -0.612010262356210370, -0.612049804082212210, -0.612089344278089250, -0.612128882943742790, +-0.612168420079074570, -0.612207955683984890, -0.612247489758375400, -0.612287022302147150, -0.612326553315201250, -0.612366082797439430, -0.612405610748762100, -0.612445137169070560, +-0.612484662058266680, -0.612524185416250750, -0.612563707242924300, -0.612603227538188740, -0.612642746301944930, -0.612682263534094720, -0.612721779234538410, -0.612761293403178090, +-0.612800806039914160, -0.612840317144648260, -0.612879826717281470, -0.612919334757715210, -0.612958841265850870, -0.612998346241589110, -0.613037849684831550, -0.613077351595479600, +-0.613116851973434020, -0.613156350818596210, -0.613195848130867580, -0.613235343910149330, -0.613274838156343090, -0.613314330869349390, -0.613353822049069960, -0.613393311695406230, +-0.613432799808258820, -0.613472286387529490, -0.613511771433119410, -0.613551254944930240, -0.613590736922862590, -0.613630217366818110, -0.613669696276698430, -0.613709173652404180, +-0.613748649493837010, -0.613788123800898200, -0.613827596573489060, -0.613867067811511240, -0.613906537514865460, -0.613946005683453370, -0.613985472317176480, -0.614024937415935670, +-0.614064400979632550, -0.614103863008168330, -0.614143323501444520, -0.614182782459362750, -0.614222239881823670, -0.614261695768728910, -0.614301150119980320, -0.614340602935478540, +-0.614380054215125200, -0.614419503958821830, -0.614458952166469950, -0.614498398837970310, -0.614537843973224750, -0.614577287572134920, -0.614616729634601460, -0.614656170160526210, +-0.614695609149810580, -0.614735046602355890, -0.614774482518063990, -0.614813916896835400, -0.614853349738572090, -0.614892781043175800, -0.614932210810547160, -0.614971639040588050, +-0.615011065733199750, -0.615050490888283900, -0.615089914505742020, -0.615129336585475080, -0.615168757127385170, -0.615208176131373020, -0.615247593597340490, -0.615287009525188890, +-0.615326423914819730, -0.615365836766134990, -0.615405248079035180, -0.615444657853422280, -0.615484066089198150, -0.615523472786263400, -0.615562877944520030, -0.615602281563869540, +-0.615641683644213230, -0.615681084185453090, -0.615720483187489950, -0.615759880650225470, -0.615799276573561820, -0.615838670957399530, -0.615878063801640560, -0.615917455106186450, +-0.615956844870938940, -0.615996233095799100, -0.616035619780668680, -0.616075004925449530, -0.616114388530042520, -0.616153770594349500, -0.616193151118272110, -0.616232530101711750, +-0.616271907544570510, -0.616311283446749130, -0.616350657808149570, -0.616390030628673700, -0.616429401908222370, -0.616468771646697560, -0.616508139844000770, -0.616547506500033650, +-0.616586871614698160, -0.616626235187895170, -0.616665597219526520, -0.616704957709494180, -0.616744316657699240, -0.616783674064043440, -0.616823029928428410, -0.616862384250756230, +-0.616901737030927650, -0.616941088268844750, -0.616980437964409600, -0.617019786117522840, -0.617059132728086770, -0.617098477796002800, -0.617137821321172560, -0.617177163303498140, +-0.617216503742880510, -0.617255842639221620, -0.617295179992423560, -0.617334515802387070, -0.617373850069014350, -0.617413182792206920, -0.617452513971866620, -0.617491843607895330, +-0.617531171700194110, -0.617570498248665390, -0.617609823253210010, -0.617649146713730060, -0.617688468630127270, -0.617727789002303300, -0.617767107830160090, -0.617806425113598960, +-0.617845740852521640, -0.617885055046830330, -0.617924367696426110, -0.617963678801210840, -0.618002988361086470, -0.618042296375954650, -0.618081602845717340, -0.618120907770275730, +-0.618160211149531900, -0.618199512983387820, -0.618238813271744570, -0.618278112014504440, -0.618317409211568860, -0.618356704862840220, -0.618395998968219400, -0.618435291527608680, +-0.618474582540910030, -0.618513872008024550, -0.618553159928854400, -0.618592446303301350, -0.618631731131267130, -0.618671014412654040, -0.618710296147362950, -0.618749576335296260, +-0.618788854976355830, -0.618828132070443070, -0.618867407617459840, -0.618906681617308110, -0.618945954069889730, -0.618985224975106770, -0.619024494332860440, -0.619063762143052920, +-0.619103028405586290, -0.619142293120361730, -0.619181556287281440, -0.619220817906247280, -0.619260077977161430, -0.619299336499924970, -0.619338593474440200, -0.619377848900609320, +-0.619417102778333510, -0.619456355107514840, -0.619495605888055300, -0.619534855119856840, -0.619574102802821550, -0.619613348936850610, -0.619652593521846320, -0.619691836557710870, +-0.619731078044345570, -0.619770317981652500, -0.619809556369533610, -0.619848793207890880, -0.619888028496626500, -0.619927262235641650, -0.619966494424839090, -0.620005725064119880, +-0.620044954153386450, -0.620084181692540540, -0.620123407681484220, -0.620162632120119680, -0.620201855008348240, -0.620241076346072170, -0.620280296133193800, -0.620319514369614300, +-0.620358731055235980, -0.620397946189960800, -0.620437159773690850, -0.620476371806328310, -0.620515582287774480, -0.620554791217931780, -0.620593998596702390, -0.620633204423987620, +-0.620672408699689870, -0.620711611423711120, -0.620750812595953660, -0.620790012216318800, -0.620829210284708940, -0.620868406801026400, -0.620907601765172570, -0.620946795177049650, +-0.620985987036559720, -0.621025177343604850, -0.621064366098087460, -0.621103553299908740, -0.621142738948971100, -0.621181923045176940, -0.621221105588427690, -0.621260286578625640, +-0.621299466015672990, -0.621338643899471580, -0.621377820229923940, -0.621416995006931370, -0.621456168230396620, -0.621495339900221210, -0.621534510016307330, -0.621573678578557280, +-0.621612845586873020, -0.621652011041156860, -0.621691174941310430, -0.621730337287236150, -0.621769498078836300, -0.621808657316012310, -0.621847814998666700, -0.621886971126701550, +-0.621926125700019040, -0.621965278718521470, -0.622004430182110380, -0.622043580090688280, -0.622082728444157460, -0.622121875242419580, -0.622161020485377030, -0.622200164172931780, +-0.622239306304986580, -0.622278446881442740, -0.622317585902202760, -0.622356723367169300, -0.622395859276243520, -0.622434993629328190, -0.622474126426325270, -0.622513257667137170, +-0.622552387351666180, -0.622591515479813840, -0.622630642051482770, -0.622669767066575510, -0.622708890524993340, -0.622748012426639130, -0.622787132771414730, -0.622826251559222550, +-0.622865368789965120, -0.622904484463543850, -0.622943598579861370, -0.622982711138820310, -0.623021822140322090, -0.623060931584269340, -0.623100039470564250, -0.623139145799109340, +-0.623178250569806360, -0.623217353782557600, -0.623256455437265930, -0.623295555533832760, -0.623334654072160600, -0.623373751052151870, -0.623412846473708760, -0.623451940336733900, +-0.623491032641128820, -0.623530123386796140, -0.623569212573638510, -0.623608300201557550, -0.623647386270455790, -0.623686470780235540, -0.623725553730799190, -0.623764635122049270, +-0.623803714953887420, -0.623842793226216610, -0.623881869938938460, -0.623920945091955610, -0.623960018685170480, -0.623999090718485250, -0.624038161191802660, -0.624077230105024360, +-0.624116297458052970, -0.624155363250791130, -0.624194427483140580, -0.624233490155003960, -0.624272551266283560, -0.624311610816881800, -0.624350668806701430, -0.624389725235643960, +-0.624428780103612250, -0.624467833410508820, -0.624506885156235540, -0.624545935340695020, -0.624584983963789700, -0.624624031025422300, -0.624663076525494350, -0.624702120463908830, +-0.624741162840568350, -0.624780203655374570, -0.624819242908230320, -0.624858280599037920, -0.624897316727699770, -0.624936351294118730, -0.624975384298196550, -0.625014415739835740, +-0.625053445618939390, -0.625092473935409010, -0.625131500689147470, -0.625170525880057170, -0.625209549508040530, -0.625248571573000400, -0.625287592074838420, -0.625326611013457550, +-0.625365628388760530, -0.625404644200649010, -0.625443658449025830, -0.625482671133793630, -0.625521682254855050, -0.625560691812111940, -0.625599699805467040, -0.625638706234823210, +-0.625677711100082410, -0.625716714401147180, -0.625755716137920250, -0.625794716310304030, -0.625833714918201390, -0.625872711961514060, -0.625911707440144900, -0.625950701353996890, +-0.625989693702971860, -0.626028684486972460, -0.626067673705901440, -0.626106661359661200, -0.626145647448154600, -0.626184631971283600, -0.626223614928951290, -0.626262596321059740, +-0.626301576147511590, -0.626340554408209570, -0.626379531103056110, -0.626418506231954160, -0.626457479794805590, -0.626496451791513360, -0.626535422221980330, -0.626574391086108460, +-0.626613358383800500, -0.626652324114959190, -0.626691288279487170, -0.626730250877287180, -0.626769211908261180, -0.626808171372312260, -0.626847129269343160, -0.626886085599255960, +-0.626925040361953510, -0.626963993557338450, -0.627002945185313740, -0.627041895245781360, -0.627080843738644260, -0.627119790663805300, -0.627158736021166560, -0.627197679810631010, +-0.627236622032101290, -0.627275562685480010, -0.627314501770670050, -0.627353439287573590, -0.627392375236093590, -0.627431309616132920, -0.627470242427593640, -0.627509173670378730, +-0.627548103344390930, -0.627587031449532870, -0.627625957985707530, -0.627664882952816970, -0.627703806350764170, -0.627742728179452310, -0.627781648438783150, -0.627820567128659970, +-0.627859484248985300, -0.627898399799662330, -0.627937313780593030, -0.627976226191680360, -0.628015137032827520, -0.628054046303936460, -0.628092954004910390, -0.628131860135651810, +-0.628170764696063590, -0.628209667686048910, -0.628248569105509640, -0.628287468954348950, -0.628326367232469930, -0.628365263939774650, -0.628404159076166200, -0.628443052641547430, +-0.628481944635820860, -0.628520835058889890, -0.628559723910656510, -0.628598611191024110, -0.628637496899894900, -0.628676381037171940, -0.628715263602757980, -0.628754144596555880, +-0.628793024018468700, -0.628831901868398770, -0.628870778146248920, -0.628909652851922570, -0.628948525985321690, -0.628987397546349580, -0.629026267534908870, -0.629065135950902520, +-0.629104002794233730, -0.629142868064804570, -0.629181731762518240, -0.629220593887277910, -0.629259454438985680, -0.629298313417544940, -0.629337170822858340, -0.629376026654829170, +-0.629414880913359620, -0.629453733598352770, -0.629492584709712030, -0.629531434247339480, -0.629570282211138310, -0.629609128601011480, -0.629647973416861740, -0.629686816658592500, +-0.629725658326105830, -0.629764498419305040, -0.629803336938093320, -0.629842173882372960, -0.629881009252047150, -0.629919843047018760, -0.629958675267190850, -0.629997505912466500, +-0.630036334982748140, -0.630075162477938930, -0.630113988397942080, -0.630152812742660000, -0.630191635511995860, -0.630230456705852540, -0.630269276324133540, -0.630308094366740960, +-0.630346910833578190, -0.630385725724548430, -0.630424539039553980, -0.630463350778498240, -0.630502160941284200, -0.630540969527814580, -0.630579776537993020, -0.630618581971721600, +-0.630657385828903850, -0.630696188109442830, -0.630734988813241080, -0.630773787940201780, -0.630812585490228120, -0.630851381463222950, -0.630890175859089570, -0.630928968677730520, +-0.630967759919049410, -0.631006549582948550, -0.631045337669331240, -0.631084124178100670, -0.631122909109159690, -0.631161692462411830, -0.631200474237759380, -0.631239254435105760, +-0.631278033054354370, -0.631316810095407630, -0.631355585558168730, -0.631394359442540850, -0.631433131748427190, -0.631471902475731040, -0.631510671624354700, -0.631549439194201700, +-0.631588205185175440, -0.631626969597178340, -0.631665732430113810, -0.631704493683885040, -0.631743253358395320, -0.631782011453547070, -0.631820767969243800, -0.631859522905389050, +-0.631898276261885110, -0.631937028038635380, -0.631975778235543180, -0.632014526852511470, -0.632053273889443880, -0.632092019346242710, -0.632130763222811480, -0.632169505519053710, +-0.632208246234871820, -0.632246985370169320, -0.632285722924849300, -0.632324458898815060, -0.632363193291969990, -0.632401926104216530, -0.632440657335458620, -0.632479386985598800, +-0.632518115054540480, -0.632556841542186830, -0.632595566448441170, -0.632634289773206790, -0.632673011516386440, -0.632711731677883530, -0.632750450257601680, -0.632789167255443320, +-0.632827882671312070, -0.632866596505111120, -0.632905308756743670, -0.632944019426113340, -0.632982728513122540, -0.633021436017674910, -0.633060141939674080, -0.633098846279022460, +-0.633137549035623800, -0.633176250209381290, -0.633214949800198550, -0.633253647807977990, -0.633292344232623260, -0.633331039074038090, -0.633369732332125010, -0.633408424006787540, +-0.633447114097929090, -0.633485802605452840, -0.633524489529262320, -0.633563174869260390, -0.633601858625350460, -0.633640540797436150, -0.633679221385420210, -0.633717900389206170, +-0.633756577808697430, -0.633795253643797300, -0.633833927894409290, -0.633872600560436150, -0.633911271641781400, -0.633949941138349020, -0.633988609050041290, -0.634027275376762070, +-0.634065940118414660, -0.634104603274902810, -0.634143264846129040, -0.634181924831997090, -0.634220583232410710, -0.634259240047272520, -0.634297895276486280, -0.634336548919955280, +-0.634375200977582930, -0.634413851449272760, -0.634452500334927840, -0.634491147634451580, -0.634529793347747730, -0.634568437474719140, -0.634607080015269440, -0.634645720969301940, +-0.634684360336720270, -0.634722998117427940, -0.634761634311327820, -0.634800268918323970, -0.634838901938319160, -0.634877533371217000, -0.634916163216921010, -0.634954791475334620, +-0.634993418146361680, -0.635032043229904810, -0.635070666725867760, -0.635109288634154500, -0.635147908954667550, -0.635186527687310990, -0.635225144831988000, -0.635263760388602110, +-0.635302374357057160, -0.635340986737256030, -0.635379597529102450, -0.635418206732500050, -0.635456814347351910, -0.635495420373561770, -0.635534024811033050, -0.635572627659669600, +-0.635611228919374160, -0.635649828590050700, -0.635688426671603080, -0.635727023163934040, -0.635765618066947420, -0.635804211380546660, -0.635842803104635480, -0.635881393239117630, +-0.635919981783895860, -0.635958568738874240, -0.635997154103956520, -0.636035737879045550, -0.636074320064045300, -0.636112900658859170, -0.636151479663390810, -0.636190057077544060, +-0.636228632901221890, -0.636267207134328160, -0.636305779776766720, -0.636344350828440430, -0.636382920289253360, -0.636421488159108930, -0.636460054437911090, -0.636498619125562830, +-0.636537182221967980, -0.636575743727030520, -0.636614303640653410, -0.636652861962740510, -0.636691418693195450, -0.636729973831921870, -0.636768527378823720, -0.636807079333803870, +-0.636845629696766280, -0.636884178467615030, -0.636922725646252960, -0.636961271232584060, -0.636999815226511950, -0.637038357627940370, -0.637076898436773290, -0.637115437652913450, +-0.637153975276265490, -0.637192511306732270, -0.637231045744217740, -0.637269578588625540, -0.637308109839859420, -0.637346639497823330, -0.637385167562420360, -0.637423694033554480, +-0.637462218911129750, -0.637500742195049040, -0.637539263885216530, -0.637577783981535860, -0.637616302483910660, -0.637654819392245110, -0.637693334706442180, -0.637731848426405850, +-0.637770360552040280, -0.637808871083248460, -0.637847380019934460, -0.637885887362002020, -0.637924393109355230, -0.637962897261897030, -0.638001399819531630, -0.638039900782163110, +-0.638078400149694520, -0.638116897922029860, -0.638155394099072960, -0.638193888680727570, -0.638232381666897890, -0.638270873057486750, -0.638309362852398590, -0.638347851051537240, +-0.638386337654806010, -0.638424822662108980, -0.638463306073349780, -0.638501787888432370, -0.638540268107260830, -0.638578746729738240, -0.638617223755768790, -0.638655699185256660, +-0.638694173018104940, -0.638732645254217800, -0.638771115893499000, -0.638809584935852710, -0.638848052381182250, -0.638886518229391580, -0.638924982480384870, -0.638963445134065560, +-0.639001906190337480, -0.639040365649104710, -0.639078823510271010, -0.639117279773740550, -0.639155734439416650, -0.639194187507203360, -0.639232638977004890, -0.639271088848724520, +-0.639309537122266460, -0.639347983797534550, -0.639386428874432640, -0.639424872352865050, -0.639463314232734840, -0.639501754513946750, -0.639540193196403980, -0.639578630280010610, +-0.639617065764670810, -0.639655499650288230, -0.639693931936767270, -0.639732362624011230, -0.639770791711924190, -0.639809219200410560, -0.639847645089373530, -0.639886069378717390, +-0.639924492068346010, -0.639962913158163450, -0.640001332648073910, -0.640039750537980790, -0.640078166827788180, -0.640116581517400580, -0.640154994606721210, -0.640193406095654230, +-0.640231815984103840, -0.640270224271974220, -0.640308630959168680, -0.640347036045591620, -0.640385439531147240, -0.640423841415738940, -0.640462241699271130, -0.640500640381647560, +-0.640539037462772520, -0.640577432942550100, -0.640615826820883920, -0.640654219097678060, -0.640692609772837040, -0.640730998846264050, -0.640769386317863730, -0.640807772187539810, +-0.640846156455196490, -0.640884539120738170, -0.640922920184068160, -0.640961299645090850, -0.640999677503710560, -0.641038053759830810, -0.641076428413355880, -0.641114801464189870, +-0.641153172912237170, -0.641191542757401310, -0.641229910999586480, -0.641268277638697310, -0.641306642674637000, -0.641345006107310160, -0.641383367936620870, -0.641421728162473000, +-0.641460086784771290, -0.641498443803418920, -0.641536799218320520, -0.641575153029380400, -0.641613505236502070, -0.641651855839590060, -0.641690204838548330, -0.641728552233281070, +-0.641766898023692800, -0.641805242209686930, -0.641843584791168320, -0.641881925768040370, -0.641920265140207720, -0.641958602907574340, -0.641996939070044400, -0.642035273627522440, +-0.642073606579912080, -0.642111937927117630, -0.642150267669043600, -0.642188595805593730, -0.642226922336672220, -0.642265247262183480, -0.642303570582031580, -0.642341892296121150, +-0.642380212404355610, -0.642418530906639470, -0.642456847802877480, -0.642495163092972940, -0.642533476776830590, -0.642571788854354400, -0.642610099325449210, -0.642648408190018340, +-0.642686715447966520, -0.642725021099198160, -0.642763325143617000, -0.642801627581127580, -0.642839928411633950, -0.642878227635040540, -0.642916525251251980, -0.642954821260171670, +-0.642993115661704360, -0.643031408455754570, -0.643069699642225930, -0.643107989221023080, -0.643146277192050200, -0.643184563555211700, -0.643222848310411990, -0.643261131457554920, +-0.643299412996545360, -0.643337692927286930, -0.643375971249684260, -0.643414247963641660, -0.643452523069063420, -0.643490796565854280, -0.643529068453917770, -0.643567338733158520, +-0.643605607403481380, -0.643643874464789880, -0.643682139916988530, -0.643720403759981960, -0.643758665993674370, -0.643796926617970500, -0.643835185632773870, -0.643873443037989320, +-0.643911698833521510, -0.643949953019274160, -0.643988205595151910, -0.644026456561059060, -0.644064705916900460, -0.644102953662579750, -0.644141199798001660, -0.644179444323070950, +-0.644217687237691240, -0.644255928541767390, -0.644294168235203690, -0.644332406317904450, -0.644370642789774630, -0.644408877650717860, -0.644447110900638890, -0.644485342539442560, +-0.644523572567032410, -0.644561800983313390, -0.644600027788189920, -0.644638252981566300, -0.644676476563347370, -0.644714698533436990, -0.644752918891739800, -0.644791137638160650, +-0.644829354772603390, -0.644867570294972660, -0.644905784205173080, -0.644943996503109300, -0.644982207188685260, -0.645020416261805620, -0.645058623722375320, -0.645096829570298120, +-0.645135033805478870, -0.645173236427821980, -0.645211437437232080, -0.645249636833613920, -0.645287834616871230, -0.645326030786909090, -0.645364225343632140, -0.645402418286944220, +-0.645440609616750430, -0.645478799332954930, -0.645516987435462490, -0.645555173924178050, -0.645593358799005150, -0.645631542059849290, -0.645669723706614240, -0.645707903739204840, +-0.645746082157525710, -0.645784258961481390, -0.645822434150976730, -0.645860607725915690, -0.645898779686203020, -0.645936950031743900, -0.645975118762441960, -0.646013285878202170, +-0.646051451378929280, -0.646089615264527680, -0.646127777534902470, -0.646165938189957380, -0.646204097229597600, -0.646242254653727750, -0.646280410462252040, -0.646318564655075200, +-0.646356717232101970, -0.646394868193237330, -0.646433017538385220, -0.646471165267450520, -0.646509311380338180, -0.646547455876952280, -0.646585598757197790, -0.646623740020979220, +-0.646661879668201320, -0.646700017698769170, -0.646738154112586510, -0.646776288909558520, -0.646814422089590060, -0.646852553652585320, -0.646890683598449150, -0.646928811927086290, +-0.646966938638401380, -0.647005063732299380, -0.647043187208684480, -0.647081309067461640, -0.647119429308535830, -0.647157547931811130, -0.647195664937192490, -0.647233780324584670, +-0.647271894093892850, -0.647310006245020890, -0.647348116777873960, -0.647386225692357040, -0.647424332988374210, -0.647462438665830530, -0.647500542724630870, -0.647538645164679740, +-0.647576745985882330, -0.647614845188142720, -0.647652942771366090, -0.647691038735457410, -0.647729133080320760, -0.647767225805861320, -0.647805316911983730, -0.647843406398592950, +-0.647881494265593940, -0.647919580512890780, -0.647957665140389110, -0.647995748147992880, -0.648033829535607400, -0.648071909303137180, -0.648109987450487310, -0.648148063977562750, +-0.648186138884267680, -0.648224212170507300, -0.648262283836186780, -0.648300353881210100, -0.648338422305482550, -0.648376489108908990, -0.648414554291394270, -0.648452617852843470, +-0.648490679793160660, -0.648528740112251260, -0.648566798810020330, -0.648604855886372070, -0.648642911341211660, -0.648680965174443960, -0.648719017385974260, -0.648757067975706650, +-0.648795116943546300, -0.648833164289398520, -0.648871210013167500, -0.648909254114758530, -0.648947296594076350, -0.648985337451025930, -0.649023376685512470, -0.649061414297440350, +-0.649099450286714560, -0.649137484653240620, -0.649175517396922470, -0.649213548517665660, -0.649251578015374920, -0.649289605889955210, -0.649327632141311840, -0.649365656769349100, +-0.649403679773972180, -0.649441701155086480, -0.649479720912596090, -0.649517739046406420, -0.649555755556422420, -0.649593770442549290, -0.649631783704691550, -0.649669795342754150, +-0.649707805356642740, -0.649745813746261500, -0.649783820511515620, -0.649821825652310280, -0.649859829168550340, -0.649897831060141210, -0.649935831326987070, -0.649973829968993440, +-0.650011826986065520, -0.650049822378107710, -0.650087816145025420, -0.650125808286723510, -0.650163798803107040, -0.650201787694081430, -0.650239774959551100, -0.650277760599421660, +-0.650315744613597420, -0.650353727001983790, -0.650391707764485850, -0.650429686901008770, -0.650467664411457650, -0.650505640295737100, -0.650543614553752430, -0.650581587185409150, +-0.650619558190611460, -0.650657527569264870, -0.650695495321274580, -0.650733461446545420, -0.650771425944983050, -0.650809388816491640, -0.650847350060976940, -0.650885309678344020, +-0.650923267668497620, -0.650961224031343040, -0.650999178766785370, -0.651037131874730110, -0.651075083355081570, -0.651113033207745500, -0.651150981432627060, -0.651188928029630910, +-0.651226872998662330, -0.651264816339626630, -0.651302758052428880, -0.651340698136974590, -0.651378636593168300, -0.651416573420915300, -0.651454508620121220, -0.651492442190690580, +-0.651530374132528790, -0.651568304445541040, -0.651606233129632620, -0.651644160184708940, -0.651682085610674420, -0.651720009407434800, -0.651757931574895370, -0.651795852112960870, +-0.651833771021536720, -0.651871688300528220, -0.651909603949840650, -0.651947517969378890, -0.651985430359048320, -0.652023341118754480, -0.652061250248402000, -0.652099157747896290, +-0.652137063617142740, -0.652174967856046560, -0.652212870464513260, -0.652250771442447470, -0.652288670789754720, -0.652326568506340630, -0.652364464592109840, -0.652402359046967860, +-0.652440251870819890, -0.652478143063571440, -0.652516032625127920, -0.652553920555393960, -0.652591806854275540, -0.652629691521677270, -0.652667574557504790, -0.652705455961663290, +-0.652743335734058180, -0.652781213874595200, -0.652819090383178760, -0.652856965259714480, -0.652894838504108230, -0.652932710116264640, -0.652970580096089100, -0.653008448443487270, +-0.653046315158364200, -0.653084180240625760, -0.653122043690176460, -0.653159905506922040, -0.653197765690768260, -0.653235624241619740, -0.653273481159382110, -0.653311336443960780, +-0.653349190095261490, -0.653387042113188880, -0.653424892497648570, -0.653462741248546530, -0.653500588365787170, -0.653538433849276350, -0.653576277698919460, -0.653614119914621930, +-0.653651960496289370, -0.653689799443826660, -0.653727636757139410, -0.653765472436133370, -0.653803306480713280, -0.653841138890784990, -0.653878969666253810, -0.653916798807025250, +-0.653954626313005050, -0.653992452184097850, -0.654030276420209940, -0.654068099021245960, -0.654105919987111760, -0.654143739317712750, -0.654181557012954440, -0.654219373072742580, +-0.654257187496981810, -0.654295000285578190, -0.654332811438437360, -0.654370620955464170, -0.654408428836564470, -0.654446235081643680, -0.654484039690607310, -0.654521842663361110, +-0.654559643999810040, -0.654597443699859840, -0.654635241763416360, -0.654673038190384470, -0.654710832980670010, -0.654748626134178390, -0.654786417650815240, -0.654824207530486310, +-0.654861995773096670, -0.654899782378552290, -0.654937567346758120, -0.654975350677620030, -0.655013132371043530, -0.655050912426934250, -0.655088690845198050, -0.655126467625739780, +-0.655164242768465300, -0.655202016273280560, -0.655239788140090430, -0.655277558368800860, -0.655315326959317380, -0.655353093911545610, -0.655390859225391420, -0.655428622900759650, +-0.655466384937556490, -0.655504145335687570, -0.655541904095058080, -0.655579661215573760, -0.655617416697140240, -0.655655170539663600, -0.655692922743048690, -0.655730673307201360, +-0.655768422232027800, -0.655806169517432870, -0.655843915163322410, -0.655881659169602170, -0.655919401536177890, -0.655957142262955430, -0.655994881349839630, -0.656032618796736800, +-0.656070354603552670, -0.656108088770192330, -0.656145821296561740, -0.656183552182566630, -0.656221281428112650, -0.656259009033105740, -0.656296734997451110, -0.656334459321054830, +-0.656372182003822190, -0.656409903045659050, -0.656447622446471150, -0.656485340206164110, -0.656523056324644140, -0.656560770801816180, -0.656598483637586330, -0.656636194831860530, +-0.656673904384543980, -0.656711612295542650, -0.656749318564762260, -0.656787023192108580, -0.656824726177487660, -0.656862427520804590, -0.656900127221965560, -0.656937825280876410, +-0.656975521697442440, -0.657013216471569630, -0.657050909603163810, -0.657088601092131070, -0.657126290938376490, -0.657163979141806130, -0.657201665702326190, -0.657239350619841730, +-0.657277033894258840, -0.657314715525483480, -0.657352395513421280, -0.657390073857978430, -0.657427750559060000, -0.657465425616572290, -0.657503099030421370, -0.657540770800512210, +-0.657578440926751330, -0.657616109409044140, -0.657653776247296820, -0.657691441441415340, -0.657729104991304990, -0.657766766896871750, -0.657804427158022010, -0.657842085774660860, +-0.657879742746694470, -0.657917398074028830, -0.657955051756569990, -0.657992703794223030, -0.658030354186894480, -0.658068002934490300, -0.658105650036915790, -0.658143295494077240, +-0.658180939305880290, -0.658218581472231110, -0.658256221993035790, -0.658293860868199630, -0.658331498097628700, -0.658369133681229400, -0.658406767618907040, -0.658444399910567690, +-0.658482030556117310, -0.658519659555461880, -0.658557286908507570, -0.658594912615159790, -0.658632536675325060, -0.658670159088908580, -0.658707779855816740, -0.658745398975955520, +-0.658783016449230760, -0.658820632275548770, -0.658858246454814830, -0.658895858986935370, -0.658933469871816560, -0.658971079109363700, -0.659008686699483200, -0.659046292642080920, +-0.659083896937062930, -0.659121499584335520, -0.659159100583804110, -0.659196699935374890, -0.659234297638954250, -0.659271893694447500, -0.659309488101761040, -0.659347080860800960, +-0.659384671971473440, -0.659422261433683880, -0.659459849247338690, -0.659497435412344180, -0.659535019928605750, -0.659572602796029810, -0.659610184014522320, -0.659647763583989350, +-0.659685341504337440, -0.659722917775471760, -0.659760492397298730, -0.659798065369724850, -0.659835636692655440, -0.659873206365997000, -0.659910774389655510, -0.659948340763537140, +-0.659985905487548210, -0.660023468561594110, -0.660061029985581470, -0.660098589759416490, -0.660136147883004790, -0.660173704356252670, -0.660211259179066200, -0.660248812351352020, +-0.660286363873015420, -0.660323913743963040, -0.660361461964101060, -0.660399008533335220, -0.660436553451571710, -0.660474096718716930, -0.660511638334676850, -0.660549178299358110, +-0.660586716612665990, -0.660624253274507130, -0.660661788284787940, -0.660699321643413940, -0.660736853350291640, -0.660774383405327240, -0.660811911808426800, -0.660849438559496960, +-0.660886963658443240, -0.660924487105172380, -0.660962008899590000, -0.660999529041602640, -0.661037047531116360, -0.661074564368037580, -0.661112079552272580, -0.661149593083727120, +-0.661187104962307700, -0.661224615187920860, -0.661262123760472110, -0.661299630679868080, -0.661337135946014950, -0.661374639558818920, -0.661412141518186720, -0.661449641824023770, +-0.661487140476236800, -0.661524637474732220, -0.661562132819415780, -0.661599626510193990, -0.661637118546973160, -0.661674608929659790, -0.661712097658159640, -0.661749584732379210, +-0.661787070152225150, -0.661824553917603090, -0.661862036028419640, -0.661899516484581120, -0.661936995285993810, -0.661974472432564240, -0.662011947924198260, -0.662049421760802390, +-0.662086893942283370, -0.662124364468546720, -0.662161833339499180, -0.662199300555046940, -0.662236766115096630, -0.662274230019554650, -0.662311692268326760, -0.662349152861319570, +-0.662386611798439940, -0.662424069079593390, -0.662461524704686670, -0.662498978673626170, -0.662536430986318540, -0.662573881642669500, -0.662611330642585820, -0.662648777985974100, +-0.662686223672740100, -0.662723667702790450, -0.662761110076031780, -0.662798550792370270, -0.662835989851712660, -0.662873427253964810, -0.662910862999033350, -0.662948297086825120, +-0.662985729517245770, -0.663023160290202140, -0.663060589405600530, -0.663098016863347570, -0.663135442663349780, -0.663172866805513130, -0.663210289289744680, -0.663247710115950070, +-0.663285129284036270, -0.663322546793909560, -0.663359962645476590, -0.663397376838643970, -0.663434789373317570, -0.663472200249404230, -0.663509609466810700, -0.663547017025442830, +-0.663584422925207360, -0.663621827166010920, -0.663659229747759930, -0.663696630670361110, -0.663734029933720440, -0.663771427537744650, -0.663808823482340600, -0.663846217767414260, +-0.663883610392872360, -0.663921001358621310, -0.663958390664568190, -0.663995778310618730, -0.664033164296679910, -0.664070548622658350, -0.664107931288460240, -0.664145312293992210, +-0.664182691639160990, -0.664220069323873010, -0.664257445348035100, -0.664294819711553350, -0.664332192414334500, -0.664369563456285510, -0.664406932837312230, -0.664444300557321730, +-0.664481666616220430, -0.664519031013914960, -0.664556393750312170, -0.664593754825318130, -0.664631114238839690, -0.664668471990783830, -0.664705828081056490, -0.664743182509564430, +-0.664780535276214610, -0.664817886380913660, -0.664855235823567650, -0.664892583604083650, -0.664929929722368420, -0.664967274178328130, -0.665004616971869520, -0.665041958102899460, +-0.665079297571324560, -0.665116635377051680, -0.665153971519986900, -0.665191306000037170, -0.665228638817109470, -0.665265969971109870, -0.665303299461945330, -0.665340627289522590, +-0.665377953453748280, -0.665415277954529370, -0.665452600791772040, -0.665489921965383480, -0.665527241475269760, -0.665564559321337960, -0.665601875503494700, -0.665639190021646730, +-0.665676502875701240, -0.665713814065564070, -0.665751123591142410, -0.665788431452343340, -0.665825737649072710, -0.665863042181237820, -0.665900345048745400, -0.665937646251501980, +-0.665974945789414850, -0.666012243662389980, -0.666049539870334550, -0.666086834413155530, -0.666124127290759200, -0.666161418503052440, -0.666198708049942190, -0.666235995931335530, +-0.666273282147138550, -0.666310566697258300, -0.666347849581601980, -0.666385130800075780, -0.666422410352586650, -0.666459688239041560, -0.666496964459347250, -0.666534239013410800, +-0.666571511901138500, -0.666608783122437320, -0.666646052677214660, -0.666683320565376380, -0.666720586786829880, -0.666757851341481910, -0.666795114229239320, -0.666832375450009280, +-0.666869635003698000, -0.666906892890212880, -0.666944149109460200, -0.666981403661347170, -0.667018656545780740, -0.667055907762667540, -0.667093157311914870, -0.667130405193429140, +-0.667167651407117200, -0.667204895952886570, -0.667242138830643430, -0.667279380040294860, -0.667316619581747820, -0.667353857454909270, -0.667391093659686410, -0.667428328195985520, +-0.667465561063713800, -0.667502792262778420, -0.667540021793085800, -0.667577249654543130, -0.667614475847057240, -0.667651700370535670, -0.667688923224884380, -0.667726144410010770, +-0.667763363925822250, -0.667800581772224900, -0.667837797949126120, -0.667875012456432880, -0.667912225294052030, -0.667949436461890980, -0.667986645959856020, -0.668023853787854450, +-0.668061059945793570, -0.668098264433579780, -0.668135467251120160, -0.668172668398322010, -0.668209867875092180, -0.668247065681337960, -0.668284261816965760, -0.668321456281882890, +-0.668358649075996740, -0.668395840199213610, -0.668433029651440910, -0.668470217432585610, -0.668507403542555110, -0.668544587981255820, -0.668581770748595040, -0.668618951844480170, +-0.668656131268817510, -0.668693309021514580, -0.668730485102478340, -0.668767659511615990, -0.668804832248834690, -0.668842003314041090, -0.668879172707142370, -0.668916340428046150, +-0.668953506476658740, -0.668990670852887440, -0.669027833556639640, -0.669064994587822090, -0.669102153946342540, -0.669139311632107160, -0.669176467645023920, -0.669213621984999120, +-0.669250774651940270, -0.669287925645754460, -0.669325074966348850, -0.669362222613630990, -0.669399368587507150, -0.669436512887884860, -0.669473655514671640, -0.669510796467774010, +-0.669547935747099250, -0.669585073352554790, -0.669622209284047590, -0.669659343541485260, -0.669696476124774120, -0.669733607033821900, -0.669770736268536000, -0.669807863828822850, +-0.669844989714590060, -0.669882113925744820, -0.669919236462194640, -0.669956357323845950, -0.669993476510606480, -0.670030594022383630, -0.670067709859083930, -0.670104824020614890, +-0.670141936506883920, -0.670179047317798090, -0.670216156453264930, -0.670253263913191070, -0.670290369697484010, -0.670327473806051290, -0.670364576238799750, -0.670401676995636690, +-0.670438776076469290, -0.670475873481205080, -0.670512969209751560, -0.670550063262015270, -0.670587155637903720, -0.670624246337324650, -0.670661335360184680, -0.670698422706391460, +-0.670735508375852050, -0.670772592368474200, -0.670809674684164530, -0.670846755322830780, -0.670883834284380360, -0.670920911568720140, -0.670957987175757500, -0.670995061105399970, +-0.671032133357554850, -0.671069203932129540, -0.671106272829031130, -0.671143340048166890, -0.671180405589444580, -0.671217469452771050, -0.671254531638053820, -0.671291592145200180, +-0.671328650974117650, -0.671365708124713860, -0.671402763596895320, -0.671439817390570350, -0.671476869505645450, -0.671513919942028360, -0.671550968699626490, -0.671588015778347150, +-0.671625061178098170, -0.671662104898786190, -0.671699146940318850, -0.671736187302604090, -0.671773225985548450, -0.671810262989059880, -0.671847298313045570, -0.671884331957413040, +-0.671921363922069910, -0.671958394206923160, -0.671995422811880290, -0.672032449736849280, -0.672069474981736860, -0.672106498546450770, -0.672143520430898310, -0.672180540634987440, +-0.672217559158624910, -0.672254576001718450, -0.672291591164175920, -0.672328604645904050, -0.672365616446810700, -0.672402626566803270, -0.672439635005789290, -0.672476641763676500, +-0.672513646840371850, -0.672550650235783090, -0.672587651949818070, -0.672624651982383530, -0.672661650333387320, -0.672698647002736960, -0.672735641990340080, -0.672772635296104430, +-0.672809626919936840, -0.672846616861745070, -0.672883605121437300, -0.672920591698920050, -0.672957576594101270, -0.672994559806888600, -0.673031541337189900, -0.673068521184912010, +-0.673105499349962780, -0.673142475832250180, -0.673179450631681050, -0.673216423748163260, -0.673253395181604430, -0.673290364931912190, -0.673327332998994280, -0.673364299382757660, +-0.673401264083110410, -0.673438227099960260, -0.673475188433214190, -0.673512148082780260, -0.673549106048565880, -0.673586062330478690, -0.673623016928426740, -0.673659969842316910, +-0.673696921072057480, -0.673733870617555410, -0.673770818478718670, -0.673807764655454890, -0.673844709147671690, -0.673881651955277050, -0.673918593078177920, -0.673955532516282370, +-0.673992470269498270, -0.674029406337732670, -0.674066340720893550, -0.674103273418888650, -0.674140204431625480, -0.674177133759012230, -0.674214061400955740, -0.674250987357364110, +-0.674287911628145280, -0.674324834213206440, -0.674361755112455440, -0.674398674325800140, -0.674435591853148390, -0.674472507694407360, -0.674509421849485150, -0.674546334318289590, +-0.674583245100727870, -0.674620154196708070, -0.674657061606137920, -0.674693967328925170, -0.674730871364977670, -0.674767773714202820, -0.674804674376508370, -0.674841573351802730, +-0.674878470639992730, -0.674915366240986580, -0.674952260154692010, -0.674989152381016750, -0.675026042919869010, -0.675062931771155840, -0.675099818934785210, -0.675136704410665530, +-0.675173588198703660, -0.675210470298807870, -0.675247350710885820, -0.675284229434845900, -0.675321106470594960, -0.675357981818041190, -0.675394855477092880, -0.675431727447657120, +-0.675468597729641960, -0.675505466322955380, -0.675542333227505120, -0.675579198443199360, -0.675616061969945170, -0.675652923807650960, -0.675689783956224700, -0.675726642415573680, +-0.675763499185606080, -0.675800354266229640, -0.675837207657352450, -0.675874059358882450, -0.675910909370727060, -0.675947757692794690, -0.675984604324992520, -0.676021449267228960, +-0.676058292519411740, -0.676095134081448720, -0.676131973953248310, -0.676168812134717580, -0.676205648625764820, -0.676242483426298220, -0.676279316536225080, -0.676316147955453810, +-0.676352977683892020, -0.676389805721447800, -0.676426632068029440, -0.676463456723544130, -0.676500279687900160, -0.676537100961005940, -0.676573920542768550, -0.676610738433096380, +-0.676647554631897300, -0.676684369139079700, -0.676721181954550890, -0.676757993078219040, -0.676794802509992690, -0.676831610249778890, -0.676868416297486060, -0.676905220653022170, +-0.676942023316295270, -0.676978824287213680, -0.677015623565684680, -0.677052421151616570, -0.677089217044917870, -0.677126011245495650, -0.677162803753258440, -0.677199594568114290, +-0.677236383689971080, -0.677273171118737190, -0.677309956854320160, -0.677346740896628500, -0.677383523245569720, -0.677420303901052120, -0.677457082862983670, -0.677493860131272550, +-0.677530635705827170, -0.677567409586554810, -0.677604181773364010, -0.677640952266163050, -0.677677721064859240, -0.677714488169361310, -0.677751253579577110, -0.677788017295414710, +-0.677824779316782640, -0.677861539643588310, -0.677898298275740220, -0.677935055213146560, -0.677971810455714970, -0.678008564003353850, -0.678045315855971390, -0.678082066013475870, +-0.678118814475774930, -0.678155561242776980, -0.678192306314390430, -0.678229049690522780, -0.678265791371082450, -0.678302531355977620, -0.678339269645116590, -0.678376006238407660, +-0.678412741135758330, -0.678449474337077250, -0.678486205842272700, -0.678522935651252430, -0.678559663763924740, -0.678596390180197910, -0.678633114899980020, -0.678669837923179810, +-0.678706559249704580, -0.678743278879463060, -0.678779996812363560, -0.678816713048313810, -0.678853427587222220, -0.678890140428997090, -0.678926851573546930, -0.678963561020779370, +-0.679000268770602820, -0.679036974822926020, -0.679073679177656380, -0.679110381834702630, -0.679147082793972840, -0.679183782055375330, -0.679220479618818710, -0.679257175484210610, +-0.679293869651459550, -0.679330562120474160, -0.679367252891161950, -0.679403941963431680, -0.679440629337191520, -0.679477315012349870, -0.679513998988815150, -0.679550681266495200, +-0.679587361845298890, -0.679624040725133720, -0.679660717905908540, -0.679697393387531550, -0.679734067169911030, -0.679770739252955720, -0.679807409636573270, -0.679844078320672280, +-0.679880745305161400, -0.679917410589948370, -0.679954074174941690, -0.679990736060049890, -0.680027396245181270, -0.680064054730244560, -0.680100711515147280, -0.680137366599798290, +-0.680174019984106090, -0.680210671667978660, -0.680247321651324510, -0.680283969934051940, -0.680320616516069900, -0.680357261397285920, -0.680393904577608840, -0.680430546056947310, +-0.680467185835209150, -0.680503823912302910, -0.680540460288137190, -0.680577094962620310, -0.680613727935660990, -0.680650359207166990, -0.680686988777047140, -0.680723616645210190, +-0.680760242811563780, -0.680796867276016850, -0.680833490038477710, -0.680870111098854870, -0.680906730457057070, -0.680943348112992060, -0.680979964066568800, -0.681016578317695800, +-0.681053190866281130, -0.681089801712233430, -0.681126410855461330, -0.681163018295873450, -0.681199624033377750, -0.681236228067882870, -0.681272830399297870, -0.681309431027530390, +-0.681346029952489380, -0.681382627174083270, -0.681419222692220660, -0.681455816506810200, -0.681492408617759950, -0.681528999024978650, -0.681565587728375170, -0.681602174727857450, +-0.681638760023334230, -0.681675343614714160, -0.681711925501905740, -0.681748505684817820, -0.681785084163358260, -0.681821660937436350, -0.681858236006959940, -0.681894809371838000, +-0.681931381031979030, -0.681967950987291570, -0.682004519237684570, -0.682041085783065880, -0.682077650623344580, -0.682114213758429400, -0.682150775188228420, -0.682187334912650490, +-0.682223892931604240, -0.682260449244998180, -0.682297003852741390, -0.682333556754741720, -0.682370107950908240, -0.682406657441149810, -0.682443205225374380, -0.682479751303490810, +-0.682516295675408060, -0.682552838341034750, -0.682589379300279080, -0.682625918553049990, -0.682662456099256460, -0.682698991938806340, -0.682735526071608810, -0.682772058497572500, +-0.682808589216606030, -0.682845118228618380, -0.682881645533517600, -0.682918171131212780, -0.682954695021612770, -0.682991217204625740, -0.683027737680160670, -0.683064256448126180, +-0.683100773508431120, -0.683137288860984460, -0.683173802505694260, -0.683210314442469490, -0.683246824671219330, -0.683283333191851750, -0.683319840004275920, -0.683356345108400380, +-0.683392848504134290, -0.683429350191385840, -0.683465850170064000, -0.683502348440077840, -0.683538845001335440, -0.683575339853745970, -0.683611832997218170, -0.683648324431660790, +-0.683684814156982900, -0.683721302173092570, -0.683757788479899100, -0.683794273077311440, -0.683830755965237790, -0.683867237143587210, -0.683903716612268560, -0.683940194371190690, +-0.683976670420262560, -0.684013144759392460, -0.684049617388489910, -0.684086088307462870, -0.684122557516220640, -0.684159025014672070, -0.684195490802725900, -0.684231954880291320, +-0.684268417247276490, -0.684304877903590740, -0.684341336849143000, -0.684377794083841580, -0.684414249607595780, -0.684450703420314330, -0.684487155521906090, -0.684523605912280230, +-0.684560054591345170, -0.684596501559009860, -0.684632946815183720, -0.684669390359774810, -0.684705832192692430, -0.684742272313845430, -0.684778710723143110, -0.684815147420493760, +-0.684851582405806460, -0.684888015678990600, -0.684924447239954270, -0.684960877088606980, -0.684997305224857360, -0.685033731648614590, -0.685070156359787630, -0.685106579358285120, +-0.685143000644016120, -0.685179420216889930, -0.685215838076814850, -0.685252254223700170, -0.685288668657454970, -0.685325081377987980, -0.685361492385208600, -0.685397901679025260, +-0.685434309259347120, -0.685470715126083490, -0.685507119279142760, -0.685543521718434250, -0.685579922443867010, -0.685616321455350230, -0.685652718752792320, -0.685689114336102580, +-0.685725508205190400, -0.685761900359964090, -0.685798290800333050, -0.685834679526206360, -0.685871066537492970, -0.685907451834102180, -0.685943835415942390, -0.685980217282923020, +-0.686016597434953470, -0.686052975871942140, -0.686089352593798330, -0.686125727600431110, -0.686162100891749670, -0.686198472467663190, -0.686234842328080300, -0.686271210472910510, +-0.686307576902062460, -0.686343941615445540, -0.686380304612968620, -0.686416665894540980, -0.686453025460072030, -0.686489383309470180, -0.686525739442644830, -0.686562093859505510, +-0.686598446559960610, -0.686634797543919650, -0.686671146811291600, -0.686707494361985750, -0.686743840195911500, -0.686780184312977270, -0.686816526713092570, -0.686852867396166910, +-0.686889206362108820, -0.686925543610827690, -0.686961879142232610, -0.686998212956233200, -0.687034545052737980, -0.687070875431656350, -0.687107204092897830, -0.687143531036371050, +-0.687179856261985410, -0.687216179769650100, -0.687252501559274420, -0.687288821630767770, -0.687325139984038770, -0.687361456618996840, -0.687397771535551590, -0.687434084733611670, +-0.687470396213086480, -0.687506705973885300, -0.687543014015917440, -0.687579320339092300, -0.687615624943318520, -0.687651927828506040, -0.687688228994563390, -0.687724528441400200, +-0.687760826168925640, -0.687797122177049030, -0.687833416465679970, -0.687869709034726990, -0.687905999884099840, -0.687942289013707910, -0.687978576423459940, -0.688014862113265570, +-0.688051146083034080, -0.688087428332674670, -0.688123708862097060, -0.688159987671209780, -0.688196264759922570, -0.688232540128145050, -0.688268813775785860, -0.688305085702754620, +-0.688341355908960620, -0.688377624394313600, -0.688413891158722090, -0.688450156202096040, -0.688486419524344750, -0.688522681125377180, -0.688558941005102950, -0.688595199163431260, +-0.688631455600271610, -0.688667710315533640, -0.688703963309126090, -0.688740214580958690, -0.688776464130941070, -0.688812711958981860, -0.688848958064990910, -0.688885202448877630, +-0.688921445110551200, -0.688957686049921580, -0.688993925266897510, -0.689030162761388510, -0.689066398533304430, -0.689102632582554110, -0.689138864909047080, -0.689175095512692960, +-0.689211324393401490, -0.689247551551081310, -0.689283776985642250, -0.689320000696994060, -0.689356222685045590, -0.689392442949706590, -0.689428661490886440, -0.689464878308494570, +-0.689501093402440920, -0.689537306772634140, -0.689573518418984180, -0.689609728341400660, -0.689645936539792560, -0.689682143014069600, -0.689718347764141320, -0.689754550789917100, +-0.689790752091306910, -0.689826951668219390, -0.689863149520564930, -0.689899345648252280, -0.689935540051191180, -0.689971732729291240, -0.690007923682462000, -0.690044112910613290, +-0.690080300413653980, -0.690116486191493910, -0.690152670244042920, -0.690188852571209990, -0.690225033172904840, -0.690261212049037120, -0.690297389199516440, -0.690333564624252550, +-0.690369738323154510, -0.690405910296132070, -0.690442080543095190, -0.690478249063952720, -0.690514415858614730, -0.690550580926990620, -0.690586744268990360, -0.690622905884523020, +-0.690659065773498340, -0.690695223935826390, -0.690731380371415900, -0.690767535080177080, -0.690803688062019420, -0.690839839316852560, -0.690875988844586340, -0.690912136645129960, +-0.690948282718393150, -0.690984427064285980, -0.691020569682717410, -0.691056710573597410, -0.691092849736835600, -0.691128987172341720, -0.691165122880025630, -0.691201256859796500, +-0.691237389111564180, -0.691273519635238640, -0.691309648430729060, -0.691345775497945400, -0.691381900836797290, -0.691418024447194690, -0.691454146329046780, -0.691490266482263420, +-0.691526384906754780, -0.691562501602429820, -0.691598616569198630, -0.691634729806970830, -0.691670841315656260, -0.691706951095164890, -0.691743059145405900, -0.691779165466289150, +-0.691815270057724920, -0.691851372919622070, -0.691887474051890880, -0.691923573454441000, -0.691959671127182150, -0.691995767070024530, -0.692031861282877080, -0.692067953765650220, +-0.692104044518253360, -0.692140133540596230, -0.692176220832588780, -0.692212306394140890, -0.692248390225162490, -0.692284472325562780, -0.692320552695251830, -0.692356631334139940, +-0.692392708242136060, -0.692428783419150480, -0.692464856865092850, -0.692500928579873110, -0.692536998563401450, -0.692573066815586950, -0.692609133336339780, -0.692645198125570020, +-0.692681261183186960, -0.692717322509100790, -0.692753382103221350, -0.692789439965458720, -0.692825496095722190, -0.692861550493921950, -0.692897603159968070, -0.692933654093769950, +-0.692969703295237550, -0.693005750764281060, -0.693041796500810100, -0.693077840504734980, -0.693113882775964970, -0.693149923314410280, -0.693185962119981070, -0.693221999192586650, +-0.693258034532137190, -0.693294068138542660, -0.693330100011712910, -0.693366130151558350, -0.693402158557988040, -0.693438185230912390, -0.693474210170241580, -0.693510233375884910, +-0.693546254847752670, -0.693582274585754830, -0.693618292589801570, -0.693654308859802280, -0.693690323395667270, -0.693726336197306730, -0.693762347264629930, -0.693798356597547410, +-0.693834364195968890, -0.693870370059804560, -0.693906374188964500, -0.693942376583358330, -0.693978377242896130, -0.694014376167488290, -0.694050373357044230, -0.694086368811474230, +-0.694122362530688370, -0.694158354514596510, -0.694194344763109150, -0.694230333276135590, -0.694266320053586460, -0.694302305095371270, -0.694338288401400330, -0.694374269971583580, +-0.694410249805831210, -0.694446227904053530, -0.694482204266160030, -0.694518178892060910, -0.694554151781666800, -0.694590122934886870, -0.694626092351631640, -0.694662060031811300, +-0.694698025975335700, -0.694733990182115350, -0.694769952652059760, -0.694805913385079240, -0.694841872381084300, -0.694877829639984230, -0.694913785161689780, -0.694949738946110780, +-0.694985690993157770, -0.695021641302740130, -0.695057589874768510, -0.695093536709153190, -0.695129481805803700, -0.695165425164630420, -0.695201366785543670, -0.695237306668453510, +-0.695273244813270350, -0.695309181219903820, -0.695345115888264310, -0.695381048818262350, -0.695416980009807450, -0.695452909462810130, -0.695488837177180460, -0.695524763152828740, +-0.695560687389665370, -0.695596609887600080, -0.695632530646543180, -0.695668449666405290, -0.695704366947095920, -0.695740282488525710, -0.695776196290604720, -0.695812108353243590, +-0.695848018676351820, -0.695883927259840050, -0.695919834103618800, -0.695955739207597680, -0.695991642571687220, -0.696027544195797490, -0.696063444079839110, -0.696099342223722270, +-0.696135238627356820, -0.696171133290653280, -0.696207026213522260, -0.696242917395873300, -0.696278806837617110, -0.696314694538663790, -0.696350580498923840, -0.696386464718307780, +-0.696422347196725130, -0.696458227934086960, -0.696494106930302890, -0.696529984185283670, -0.696565859698939360, -0.696601733471180480, -0.696637605501917560, -0.696673475791060310, +-0.696709344338519390, -0.696745211144205400, -0.696781076208027980, -0.696816939529897980, -0.696852801109725580, -0.696888660947421300, -0.696924519042895540, -0.696960375396058260, +-0.696996230006819980, -0.697032082875091440, -0.697067934000782370, -0.697103783383803520, -0.697139631024065180, -0.697175476921478080, -0.697211321075951960, -0.697247163487397570, +-0.697283004155725530, -0.697318843080845690, -0.697354680262668780, -0.697390515701105220, -0.697426349396065290, -0.697462181347459740, -0.697498011555198530, -0.697533840019192270, +-0.697569666739351720, -0.697605491715586610, -0.697641314947807900, -0.697677136435925770, -0.697712956179850960, -0.697748774179493990, -0.697784590434764710, -0.697820404945574290, +-0.697856217711832590, -0.697892028733450350, -0.697927838010338090, -0.697963645542406090, -0.697999451329565420, -0.698035255371725730, -0.698071057668797960, -0.698106858220692850, +-0.698142657027320150, -0.698178454088590920, -0.698214249404415570, -0.698250042974704610, -0.698285834799368790, -0.698321624878318170, -0.698357413211463380, -0.698393199798715390, +-0.698428984639984150, -0.698464767735180400, -0.698500549084214770, -0.698536328686997780, -0.698572106543440150, -0.698607882653452080, -0.698643657016944530, -0.698679429633827560, +-0.698715200504012040, -0.698750969627408570, -0.698786737003927570, -0.698822502633480000, -0.698858266515975930, -0.698894028651326330, -0.698929789039441810, -0.698965547680232560, +-0.699001304573609320, -0.699037059719482930, -0.699072813117763920, -0.699108564768363140, -0.699144314671190650, -0.699180062826157300, -0.699215809233174170, -0.699251553892151320, +-0.699287296802999390, -0.699323037965629330, -0.699358777379952000, -0.699394515045877350, -0.699430250963316460, -0.699465985132180170, -0.699501717552378670, -0.699537448223822910, +-0.699573177146423530, -0.699608904320091150, -0.699644629744736850, -0.699680353420270680, -0.699716075346603520, -0.699751795523646640, -0.699787513951309890, -0.699823230629504360, +-0.699858945558140770, -0.699894658737129750, -0.699930370166382380, -0.699966079845808940, -0.700001787775320410, -0.700037493954827280, -0.700073198384240310, -0.700108901063470350, +-0.700144601992428120, -0.700180301171024700, -0.700215998599170280, -0.700251694276775800, -0.700287388203752470, -0.700323080380010340, -0.700358770805460500, -0.700394459480013660, +-0.700430146403580700, -0.700465831576072780, -0.700501514997399880, -0.700537196667473160, -0.700572876586203820, -0.700608554753502030, -0.700644231169278760, -0.700679905833444970, +-0.700715578745911730, -0.700751249906589210, -0.700786919315388610, -0.700822586972220880, -0.700858252876996550, -0.700893917029626450, -0.700929579430021650, -0.700965240078092800, +-0.701000898973751290, -0.701036556116907180, -0.701072211507471680, -0.701107865145355950, -0.701143517030470180, -0.701179167162725660, -0.701214815542033240, -0.701250462168303780, +-0.701286107041448450, -0.701321750161377650, -0.701357391528002360, -0.701393031141233970, -0.701428669000982660, -0.701464305107159620, -0.701499939459675930, -0.701535572058442640, +-0.701571202903370050, -0.701606831994369570, -0.701642459331352280, -0.701678084914228560, -0.701713708742909500, -0.701749330817306280, -0.701784951137329750, -0.701820569702891080, +-0.701856186513900690, -0.701891801570269870, -0.701927414871909790, -0.701963026418730980, -0.701998636210644510, -0.702034244247561560, -0.702069850529392860, -0.702105455056049930, +-0.702141057827442960, -0.702176658843483790, -0.702212258104082610, -0.702247855609150710, -0.702283451358599260, -0.702319045352339130, -0.702354637590281720, -0.702390228072337420, +-0.702425816798417530, -0.702461403768433360, -0.702496988982295510, -0.702532572439915070, -0.702568154141203220, -0.702603734086071020, -0.702639312274429770, -0.702674888706189880, +-0.702710463381262860, -0.702746036299559900, -0.702781607460991610, -0.702817176865469300, -0.702852744512904030, -0.702888310403207210, -0.702923874536289350, -0.702959436912061750, +-0.702994997530435820, -0.703030556391322170, -0.703066113494632110, -0.703101668840276810, -0.703137222428167230, -0.703172774258215010, -0.703208324330330430, -0.703243872644425120, +-0.703279419200410480, -0.703314963998196930, -0.703350507037695970, -0.703386048318818680, -0.703421587841476350, -0.703457125605580380, -0.703492661611041180, -0.703528195857770380, +-0.703563728345679480, -0.703599259074678910, -0.703634788044680160, -0.703670315255594430, -0.703705840707333220, -0.703741364399807170, -0.703776886332927560, -0.703812406506606150, +-0.703847924920753430, -0.703883441575280930, -0.703918956470099720, -0.703954469605121200, -0.703989980980256780, -0.704025490595417080, -0.704060998450513730, -0.704096504545458140, +-0.704132008880160920, -0.704167511454533710, -0.704203012268487800, -0.704238511321934270, -0.704274008614784840, -0.704309504146950040, -0.704344997918341820, -0.704380489928870810, +-0.704415980178448530, -0.704451468666986270, -0.704486955394395430, -0.704522440360587420, -0.704557923565473090, -0.704593405008963840, -0.704628884690971510, -0.704664362611406640, +-0.704699838770180830, -0.704735313167205390, -0.704770785802391720, -0.704806256675651330, -0.704841725786895080, -0.704877193136034360, -0.704912658722981140, -0.704948122547645940, +-0.704983584609940370, -0.705019044909775850, -0.705054503447064000, -0.705089960221715660, -0.705125415233642360, -0.705160868482755830, -0.705196319968966810, -0.705231769692187040, +-0.705267217652327800, -0.705302663849300520, -0.705338108283017020, -0.705373550953387830, -0.705408991860324800, -0.705444431003739550, -0.705479868383542930, -0.705515303999646570, +-0.705550737851962100, -0.705586169940400690, -0.705621600264874190, -0.705657028825293350, -0.705692455621569900, -0.705727880653615690, -0.705763303921341460, -0.705798725424658930, +-0.705834145163479640, -0.705869563137715320, -0.705904979347276810, -0.705940393792075740, -0.705975806472024070, -0.706011217387032540, -0.706046626537013000, -0.706082033921876850, +-0.706117439541535610, -0.706152843395901120, -0.706188245484884240, -0.706223645808396690, -0.706259044366350340, -0.706294441158656030, -0.706329836185225710, -0.706365229445970690, +-0.706400620940802690, -0.706436010669633460, -0.706471398632373850, -0.706506784828936030, -0.706542169259230970, -0.706577551923170510, -0.706612932820666170, -0.706648311951629470, +-0.706683689315972250, -0.706719064913605590, -0.706754438744441220, -0.706789810808391090, -0.706825181105366070, -0.706860549635278220, -0.706895916398038840, -0.706931281393559760, +-0.706966644621752740, -0.707002006082528830, -0.707037365775799900, -0.707072723701477890, -0.707108079859473770, -0.707143434249699390, -0.707178786872066480, -0.707214137726486890, +-0.707249486812871590, -0.707284834131132630, -0.707320179681181880, -0.707355523462930400, -0.707390865476290150, -0.707426205721172650, -0.707461544197489630, -0.707496880905153170, +-0.707532215844074110, -0.707567549014164520, -0.707602880415336370, -0.707638210047500720, -0.707673537910569530, -0.707708864004454540, -0.707744188329067380, -0.707779510884319900, +-0.707814831670123490, -0.707850150686390010, -0.707885467933031420, -0.707920783409958900, -0.707956097117084400, -0.707991409054319680, -0.708026719221576670, -0.708062027618766580, +-0.708097334245801460, -0.708132639102593280, -0.708167942189053210, -0.708203243505093230, -0.708238543050625170, -0.708273840825560770, -0.708309136829812110, -0.708344431063290260, +-0.708379723525907280, -0.708415014217575360, -0.708450303138205670, -0.708485590287710190, -0.708520875666000640, -0.708556159272988980, -0.708591441108587180, -0.708626721172706530, +-0.708661999465259320, -0.708697275986156840, -0.708732550735311160, -0.708767823712634140, -0.708803094918037500, -0.708838364351433440, -0.708873632012733120, -0.708908897901848860, +-0.708944162018692590, -0.708979424363175630, -0.709014684935210030, -0.709049943734707750, -0.709085200761580660, -0.709120456015740810, -0.709155709497099610, -0.709190961205569010, +-0.709226211141061440, -0.709261459303487940, -0.709296705692760820, -0.709331950308791930, -0.709367193151493550, -0.709402434220776760, -0.709437673516553960, -0.709472911038737330, +-0.709508146787237950, -0.709543380761968320, -0.709578612962840300, -0.709613843389765630, -0.709649072042656700, -0.709684298921424820, -0.709719524025982150, -0.709754747356240890, +-0.709789968912112550, -0.709825188693509300, -0.709860406700343120, -0.709895622932525840, -0.709930837389969870, -0.709966050072586510, -0.710001260980288260, -0.710036470112986540, +-0.710071677470593740, -0.710106883053021720, -0.710142086860182430, -0.710177288891988170, -0.710212489148350560, -0.710247687629181670, -0.710282884334393790, -0.710318079263898450, +-0.710353272417607930, -0.710388463795434190, -0.710423653397289300, -0.710458841223085560, -0.710494027272734470, -0.710529211546148340, -0.710564394043239340, -0.710599574763919220, +-0.710634753708100030, -0.710669930875694080, -0.710705106266613540, -0.710740279880769820, -0.710775451718075550, -0.710810621778442900, -0.710845790061783500, -0.710880956568009540, +-0.710916121297033190, -0.710951284248766520, -0.710986445423121950, -0.711021604820010870, -0.711056762439345900, -0.711091918281039350, -0.711127072345002610, -0.711162224631148200, +-0.711197375139388300, -0.711232523869634870, -0.711267670821800540, -0.711302815995796700, -0.711337959391535770, -0.711373101008930250, -0.711408240847891780, -0.711443378908332540, +-0.711478515190165030, -0.711513649693301440, -0.711548782417653400, -0.711583913363133420, -0.711619042529654020, -0.711654169917126600, -0.711689295525463890, -0.711724419354577750, +-0.711759541404380800, -0.711794661674785110, -0.711829780165702530, -0.711864896877045460, -0.711900011808726530, -0.711935124960657250, -0.711970236332750140, -0.712005345924917380, +-0.712040453737071370, -0.712075559769124510, -0.712110664020988440, -0.712145766492575990, -0.712180867183798800, -0.712215966094569500, -0.712251063224800250, -0.712286158574403250, +-0.712321252143291340, -0.712356343931375810, -0.712391433938569520, -0.712426522164784970, -0.712461608609933790, -0.712496693273928620, -0.712531776156681620, -0.712566857258105200, +-0.712601936578111990, -0.712637014116613620, -0.712672089873522710, -0.712707163848751880, -0.712742236042212870, -0.712777306453818320, -0.712812375083480390, -0.712847441931111940, +-0.712882506996624480, -0.712917570279930750, -0.712952631780943370, -0.712987691499574190, -0.713022749435735740, -0.713057805589340510, -0.713092859960300700, -0.713127912548529030, +-0.713162963353937250, -0.713198012376438100, -0.713233059615944190, -0.713268105072367380, -0.713303148745620290, -0.713338190635615320, -0.713373230742264890, -0.713408269065481710, +-0.713443305605177440, -0.713478340361265010, -0.713513373333657050, -0.713548404522265310, -0.713583433927002520, -0.713618461547781190, -0.713653487384513950, -0.713688511437112760, +-0.713723533705490350, -0.713758554189559250, -0.713793572889231620, -0.713828589804419880, -0.713863604935036870, -0.713898618280994770, -0.713933629842206320, -0.713968639618583590, +-0.714003647610039200, -0.714038653816486120, -0.714073658237835970, -0.714108660874001710, -0.714143661724895850, -0.714178660790430800, -0.714213658070519400, -0.714248653565073610, +-0.714283647274006390, -0.714318639197229820, -0.714353629334656630, -0.714388617686199320, -0.714423604251770540, -0.714458589031283120, -0.714493572024648800, -0.714528553231780550, +-0.714563532652591200, -0.714598510286992840, -0.714633486134898080, -0.714668460196219660, -0.714703432470870090, -0.714738402958762230, -0.714773371659808030, -0.714808338573920450, +-0.714843303701012340, -0.714878267040995660, -0.714913228593783370, -0.714948188359287860, -0.714983146337422330, -0.715018102528098500, -0.715053056931229450, -0.715088009546728130, +-0.715122960374506400, -0.715157909414477320, -0.715192856666553520, -0.715227802130647410, -0.715262745806672260, -0.715297687694539830, -0.715332627794163290, -0.715367566105455490, +-0.715402502628328390, -0.715437437362695050, -0.715472370308468110, -0.715507301465560190, -0.715542230833884460, -0.715577158413352790, -0.715612084203878230, -0.715647008205373640, +-0.715681930417751410, -0.715716850840924290, -0.715751769474805010, -0.715786686319306640, -0.715821601374341250, -0.715856514639821810, -0.715891426115661370, -0.715926335801772120, +-0.715961243698067020, -0.715996149804458910, -0.716031054120860320, -0.716065956647184310, -0.716100857383343280, -0.716135756329250080, -0.716170653484817680, -0.716205548849958460, +-0.716240442424585290, -0.716275334208611000, -0.716310224201948450, -0.716345112404510600, -0.716379998816209730, -0.716414883436959030, -0.716449766266670900, -0.716484647305258400, +-0.716519526552634290, -0.716554404008711290, -0.716589279673402580, -0.716624153546620460, -0.716659025628277880, -0.716693895918288030, -0.716728764416563190, -0.716763631123016330, +-0.716798496037560520, -0.716833359160108370, -0.716868220490573190, -0.716903080028867160, -0.716937937774903440, -0.716972793728595130, -0.717007647889854600, -0.717042500258594840, +-0.717077350834728900, -0.717112199618169850, -0.717147046608830110, -0.717181891806622620, -0.717216735211460790, -0.717251576823256800, -0.717286416641923830, -0.717321254667374840, +-0.717356090899522790, -0.717390925338280640, -0.717425757983561010, -0.717460588835276970, -0.717495417893341700, -0.717530245157667610, -0.717565070628167990, -0.717599894304755680, +-0.717634716187343540, -0.717669536275844950, -0.717704354570172230, -0.717739171070238550, -0.717773985775957300, -0.717808798687240790, -0.717843609804002300, -0.717878419126154800, +-0.717913226653611570, -0.717948032386284910, -0.717982836324088210, -0.718017638466934670, -0.718052438814736790, -0.718087237367407760, -0.718122034124860640, -0.718156829087008510, +-0.718191622253764540, -0.718226413625041250, -0.718261203200751930, -0.718295990980809870, -0.718330776965127480, -0.718365561153618270, -0.718400343546195090, -0.718435124142771110, +-0.718469902943259520, -0.718504679947572940, -0.718539455155624900, -0.718574228567328000, -0.718609000182595440, -0.718643770001340500, -0.718678538023476030, -0.718713304248915550, +-0.718748068677571570, -0.718782831309357380, -0.718817592144186390, -0.718852351181971110, -0.718887108422624930, -0.718921863866061050, -0.718956617512192420, -0.718991369360932660, +-0.719026119412194080, -0.719060867665890280, -0.719095614121934570, -0.719130358780239560, -0.719165101640718560, -0.719199842703284850, -0.719234581967851950, -0.719269319434332250, +-0.719304055102639170, -0.719338788972686330, -0.719373521044386120, -0.719408251317652070, -0.719442979792397570, -0.719477706468535480, -0.719512431345979530, -0.719547154424642120, +-0.719581875704436880, -0.719616595185277210, -0.719651312867075840, -0.719686028749745970, -0.719720742833201200, -0.719755455117354610, -0.719790165602119610, -0.719824874287408930, +-0.719859581173136310, -0.719894286259214480, -0.719928989545556950, -0.719963691032076800, -0.719998390718687540, -0.720033088605302680, -0.720067784691834740, -0.720102478978197350, +-0.720137171464304000, -0.720171862150067450, -0.720206551035401210, -0.720241238120218670, -0.720275923404433030, -0.720310606887957890, -0.720345288570705790, -0.720379968452590670, +-0.720414646533525830, -0.720449322813424110, -0.720483997292199030, -0.720518669969763880, -0.720553340846032510, -0.720588009920917430, -0.720622677194332370, -0.720657342666190860, +-0.720692006336405620, -0.720726668204890510, -0.720761328271558700, -0.720795986536323490, -0.720830642999098710, -0.720865297659797010, -0.720899950518332000, -0.720934601574617420, +-0.720969250828566110, -0.721003898280091590, -0.721038543929107380, -0.721073187775526760, -0.721107829819263470, -0.721142470060230470, -0.721177108498341160, -0.721211745133509390, +-0.721246379965647890, -0.721281012994670510, -0.721315644220490660, -0.721350273643021960, -0.721384901262177140, -0.721419527077870270, -0.721454151090014760, -0.721488773298523570, +-0.721523393703310530, -0.721558012304288840, -0.721592629101372230, -0.721627244094474430, -0.721661857283508180, -0.721696468668387210, -0.721731078249025380, -0.721765686025335640, +-0.721800291997231610, -0.721834896164626820, -0.721869498527434870, -0.721904099085569410, -0.721938697838943490, -0.721973294787471080, -0.722007889931065130, -0.722042483269639380, +-0.722077074803107570, -0.722111664531382870, -0.722146252454379580, -0.722180838572010100, -0.722215422884188610, -0.722250005390828950, -0.722284586091843980, -0.722319164987147430, +-0.722353742076653040, -0.722388317360274200, -0.722422890837924990, -0.722457462509518140, -0.722492032374967730, -0.722526600434187590, -0.722561166687090580, -0.722595731133590550, +-0.722630293773601330, -0.722664854607036670, -0.722699413633809410, -0.722733970853833840, -0.722768526267023480, -0.722803079873291620, -0.722837631672551990, -0.722872181664718340, +-0.722906729849704170, -0.722941276227423550, -0.722975820797789330, -0.723010363560715570, -0.723044904516116360, -0.723079443663904420, -0.723113981003993930, -0.723148516536298520, +-0.723183050260731710, -0.723217582177207770, -0.723252112285639350, -0.723286640585940830, -0.723321167078025960, -0.723355691761807810, -0.723390214637200430, -0.723424735704117580, +-0.723459254962473210, -0.723493772412180380, -0.723528288053153060, -0.723562801885305310, -0.723597313908550310, -0.723631824122802030, -0.723666332527974190, -0.723700839123980530, +-0.723735343910735020, -0.723769846888150940, -0.723804348056142130, -0.723838847414622900, -0.723873344963506080, -0.723907840702705970, -0.723942334632136310, -0.723976826751710710, +-0.724011317061343470, -0.724045805560947550, -0.724080292250437460, -0.724114777129726270, -0.724149260198728160, -0.724183741457356980, -0.724218220905526340, -0.724252698543150550, +-0.724287174370142670, -0.724321648386416770, -0.724356120591887140, -0.724390590986466850, -0.724425059570070200, -0.724459526342610790, -0.724493991304002600, -0.724528454454159700, +-0.724562915792995480, -0.724597375320423900, -0.724631833036359140, -0.724666288940714500, -0.724700743033404260, -0.724735195314341940, -0.724769645783442160, -0.724804094440617890, +-0.724838541285783400, -0.724872986318852770, -0.724907429539739410, -0.724941870948357490, -0.724976310544620860, -0.725010748328443590, -0.725045184299739630, -0.725079618458422390, +-0.725114050804406160, -0.725148481337605010, -0.725182910057932450, -0.725217336965302660, -0.725251762059629490, -0.725286185340826780, -0.725320606808809050, -0.725355026463489480, +-0.725389444304782360, -0.725423860332601870, -0.725458274546861510, -0.725492686947475370, -0.725527097534357620, -0.725561506307422330, -0.725595913266583010, -0.725630318411753960, +-0.725664721742849350, -0.725699123259782590, -0.725733522962468180, -0.725767920850819760, -0.725802316924751610, -0.725836711184178030, -0.725871103629012420, -0.725905494259168950, +-0.725939883074562140, -0.725974270075105180, -0.726008655260712680, -0.726043038631298380, -0.726077420186776570, -0.726111799927061650, -0.726146177852066700, -0.726180553961706780, +-0.726214928255895060, -0.726249300734546080, -0.726283671397573770, -0.726318040244892440, -0.726352407276416150, -0.726386772492058630, -0.726421135891734180, -0.726455497475357200, +-0.726489857242841100, -0.726524215194100380, -0.726558571329049220, -0.726592925647601470, -0.726627278149671870, -0.726661628835173710, -0.726695977704021390, -0.726730324756129530, +-0.726764669991411540, -0.726799013409781920, -0.726833355011154650, -0.726867694795444440, -0.726902032762564600, -0.726936368912429630, -0.726970703244954050, -0.727005035760051490, +-0.727039366457636340, -0.727073695337622670, -0.727108022399924890, -0.727142347644457290, -0.727176671071133600, -0.727210992679868110, -0.727245312470575440, -0.727279630443169340, +-0.727313946597563990, -0.727348260933673880, -0.727382573451413110, -0.727416884150696160, -0.727451193031436680, -0.727485500093549290, -0.727519805336948490, -0.727554108761547800, +-0.727588410367261850, -0.727622710154004810, -0.727657008121691320, -0.727691304270235100, -0.727725598599550550, -0.727759891109552300, -0.727794181800154090, -0.727828470671270320, +-0.727862757722815500, -0.727897042954703700, -0.727931326366849650, -0.727965607959166870, -0.727999887731570210, -0.728034165683974050, -0.728068441816292160, -0.728102716128439240, +-0.728136988620329490, -0.728171259291877200, -0.728205528142997220, -0.728239795173603040, -0.728274060383609640, -0.728308323772930870, -0.728342585341481220, -0.728376845089175000, +-0.728411103015926820, -0.728445359121651200, -0.728479613406261880, -0.728513865869673370, -0.728548116511800630, -0.728582365332557380, -0.728616612331858040, -0.728650857509617220, +-0.728685100865749340, -0.728719342400168890, -0.728753582112789840, -0.728787820003526820, -0.728822056072294560, -0.728856290319006890, -0.728890522743578460, -0.728924753345923770, +-0.728958982125957440, -0.728993209083593330, -0.729027434218746270, -0.729061657531330900, -0.729095879021261160, -0.729130098688451690, -0.729164316532816880, -0.729198532554271360, +-0.729232746752729750, -0.729266959128106020, -0.729301169680314890, -0.729335378409271100, -0.729369585314888490, -0.729403790397082140, -0.729437993655766110, -0.729472195090855260, +-0.729506394702264080, -0.729540592489906660, -0.729574788453698050, -0.729608982593552220, -0.729643174909383910, -0.729677365401107720, -0.729711554068637970, -0.729745740911889710, +-0.729779925930776900, -0.729814109125214160, -0.729848290495116460, -0.729882470040397750, -0.729916647760972870, -0.729950823656756340, -0.729984997727662790, -0.730019169973606940, +-0.730053340394502980, -0.730087508990265640, -0.730121675760809890, -0.730155840706049550, -0.730190003825899710, -0.730224165120274770, -0.730258324589089680, -0.730292482232258620, +-0.730326638049696330, -0.730360792041317650, -0.730394944207036770, -0.730429094546768410, -0.730463243060427430, -0.730497389747928330, -0.730531534609186070, -0.730565677644114620, +-0.730599818852629030, -0.730633958234644170, -0.730668095790074080, -0.730702231518833730, -0.730736365420837860, -0.730770497496001090, -0.730804627744238380, -0.730838756165463790, +-0.730872882759592280, -0.730907007526538920, -0.730941130466217670, -0.730975251578543590, -0.731009370863431430, -0.731043488320796130, -0.731077603950551770, -0.731111717752613410, +-0.731145829726896120, -0.731179939873313980, -0.731214048191781930, -0.731248154682214710, -0.731282259344527170, -0.731316362178634270, -0.731350463184450180, -0.731384562361889980, +-0.731418659710868500, -0.731452755231300270, -0.731486848923100010, -0.731520940786182680, -0.731555030820463030, -0.731589119025855990, -0.731623205402275990, -0.731657289949638190, +-0.731691372667856890, -0.731725453556847150, -0.731759532616523820, -0.731793609846801640, -0.731827685247595780, -0.731861758818820320, -0.731895830560390540, -0.731929900472221510, +-0.731963968554227300, -0.731998034806323190, -0.732032099228424050, -0.732066161820444710, -0.732100222582300120, -0.732134281513904810, -0.732168338615173720, -0.732202393886022040, +-0.732236447326364170, -0.732270498936115180, -0.732304548715189910, -0.732338596663503650, -0.732372642780970470, -0.732406687067505780, -0.732440729523024640, -0.732474770147441330, +-0.732508808940671050, -0.732542845902628860, -0.732576881033229600, -0.732610914332388340, -0.732644945800019490, -0.732678975436038330, -0.732713003240359930, -0.732747029212898800, +-0.732781053353570130, -0.732815075662288870, -0.732849096138969760, -0.732883114783528300, -0.732917131595878790, -0.732951146575936410, -0.732985159723616440, -0.733019171038833290, +-0.733053180521502260, -0.733087188171538170, -0.733121193988856560, -0.733155197973371480, -0.733189200124998550, -0.733223200443652860, -0.733257198929248900, -0.733291195581701970, +-0.733325190400927030, -0.733359183386839030, -0.733393174539353490, -0.733427163858384580, -0.733461151343847930, -0.733495136995658600, -0.733529120813731120, -0.733563102797980870, +-0.733597082948322820, -0.733631061264672150, -0.733665037746944030, -0.733699012395053090, -0.733732985208914830, -0.733766956188443900, -0.733800925333555560, -0.733834892644164900, +-0.733868858120186980, -0.733902821761537210, -0.733936783568130190, -0.733970743539881120, -0.734004701676705510, -0.734038657978517860, -0.734072612445233470, -0.734106565076767640, +-0.734140515873035420, -0.734174464833952100, -0.734208411959432430, -0.734242357249391690, -0.734276300703745390, -0.734310242322408050, -0.734344182105295060, -0.734378120052321610, +-0.734412056163403100, -0.734445990438454270, -0.734479922877390390, -0.734513853480126990, -0.734547782246578800, -0.734581709176660990, -0.734615634270288980, -0.734649557527377820, +-0.734683478947843140, -0.734717398531599450, -0.734751316278562270, -0.734785232188647110, -0.734819146261768590, -0.734853058497842100, -0.734886968896783070, -0.734920877458506540, +-0.734954784182928140, -0.734988689069962400, -0.735022592119525030, -0.735056493331531560, -0.735090392705896490, -0.735124290242535450, -0.735158185941363620, -0.735192079802296620, +-0.735225971825249180, -0.735259862010136820, -0.735293750356875050, -0.735327636865378610, -0.735361521535563110, -0.735395404367343850, -0.735429285360636010, -0.735463164515355210, +-0.735497041831416290, -0.735530917308734770, -0.735564790947226270, -0.735598662746805410, -0.735632532707387930, -0.735666400828889120, -0.735700267111224270, -0.735734131554309110, +-0.735767994158058380, -0.735801854922387810, -0.735835713847212360, -0.735869570932447650, -0.735903426178009080, -0.735937279583811830, -0.735971131149771750, -0.736004980875803570, +-0.736038828761822810, -0.736072674807745410, -0.736106519013485890, -0.736140361378960220, -0.736174201904083560, -0.736208040588771430, -0.736241877432939450, -0.736275712436502580, +-0.736309545599376340, -0.736343376921476560, -0.736377206402717980, -0.736411034043016440, -0.736444859842287360, -0.736478683800446340, -0.736512505917408360, -0.736546326193089130, +-0.736580144627404400, -0.736613961220268900, -0.736647775971598580, -0.736681588881308860, -0.736715399949315120, -0.736749209175533220, -0.736783016559877880, -0.736816822102265070, +-0.736850625802610510, -0.736884427660829180, -0.736918227676836680, -0.736952025850548530, -0.736985822181880470, -0.737019616670748110, -0.737053409317066420, -0.737087200120751130, +-0.737120989081718190, -0.737154776199882460, -0.737188561475159760, -0.737222344907465740, -0.737256126496716120, -0.737289906242825870, -0.737323684145710920, -0.737357460205287030, +-0.737391234421469140, -0.737425006794173220, -0.737458777323314770, -0.737492546008809310, -0.737526312850572800, -0.737560077848520290, -0.737593841002567530, -0.737627602312630470, +-0.737661361778624180, -0.737695119400464390, -0.737728875178066850, -0.737762629111347050, -0.737796381200221060, -0.737830131444603850, -0.737863879844411490, -0.737897626399559140, +-0.737931371109962870, -0.737965113975538100, -0.737998854996200440, -0.738032594171866060, -0.738066331502449820, -0.738100066987867900, -0.738133800628036020, -0.738167532422869250, +-0.738201262372283780, -0.738234990476195120, -0.738268716734518990, -0.738302441147171250, -0.738336163714067180, -0.738369884435122750, -0.738403603310253900, -0.738437320339375700, +-0.738471035522404230, -0.738504748859255210, -0.738538460349844610, -0.738572169994087480, -0.738605877791900010, -0.738639583743198050, -0.738673287847896880, -0.738706990105912450, +-0.738740690517160630, -0.738774389081557010, -0.738808085799017800, -0.738841780669458050, -0.738875473692793830, -0.738909164868941200, -0.738942854197815360, -0.738976541679332470, +-0.739010227313408150, -0.739043911099958260, -0.739077593038898860, -0.739111273130145240, -0.739144951373613690, -0.739178627769219500, -0.739212302316878840, -0.739245975016507240, +-0.739279645868020860, -0.739313314871335560, -0.739346982026366620, -0.739380647333030330, -0.739414310791242760, -0.739447972400919080, -0.739481632161975380, -0.739515290074327700, +-0.739548946137891680, -0.739582600352583720, -0.739616252718318990, -0.739649903235013450, -0.739683551902583610, -0.739717198720944550, -0.739750843690012430, -0.739784486809703210, +-0.739818128079932860, -0.739851767500617430, -0.739885405071672330, -0.739919040793013960, -0.739952674664557720, -0.739986306686219790, -0.740019936857916120, -0.740053565179562560, +-0.740087191651075390, -0.740120816272369920, -0.740154439043362420, -0.740188059963969190, -0.740221679034105410, -0.740255296253687580, -0.740288911622631330, -0.740322525140852950, +-0.740356136808268510, -0.740389746624793400, -0.740423354590343920, -0.740456960704836350, -0.740490564968186100, -0.740524167380309460, -0.740557767941122380, -0.740591366650541150, +-0.740624963508481280, -0.740658558514858960, -0.740692151669590570, -0.740725742972591420, -0.740759332423778010, -0.740792920023066180, -0.740826505770372120, -0.740860089665612120, +-0.740893671708701460, -0.740927251899556770, -0.740960830238094230, -0.740994406724229230, -0.741027981357878280, -0.741061554138957360, -0.741095125067382510, -0.741128694143070140, +-0.741162261365935880, -0.741195826735896120, -0.741229390252866600, -0.741262951916763500, -0.741296511727503100, -0.741330069685001370, -0.741363625789174810, -0.741397180039938820, +-0.741430732437210030, -0.741464282980904500, -0.741497831670938080, -0.741531378507227060, -0.741564923489687610, -0.741598466618235810, -0.741632007892788160, -0.741665547313260290, +-0.741699084879568480, -0.741732620591629250, -0.741766154449358120, -0.741799686452671690, -0.741833216601486050, -0.741866744895717580, -0.741900271335282020, -0.741933795920095670, +-0.741967318650075260, -0.742000839525136180, -0.742034358545195060, -0.742067875710167970, -0.742101391019971300, -0.742134904474521350, -0.742168416073733850, -0.742201925817525420, +-0.742235433705812350, -0.742268939738510490, -0.742302443915536130, -0.742335946236805770, -0.742369446702235480, -0.742402945311742000, -0.742436442065240840, -0.742469936962648510, +-0.742503430003881640, -0.742536921188855840, -0.742570410517487840, -0.742603897989693730, -0.742637383605390220, -0.742670867364493060, -0.742704349266918530, -0.742737829312583590, +-0.742771307501403630, -0.742804783833295510, -0.742838258308175400, -0.742871730925959710, -0.742905201686564930, -0.742938670589906810, -0.742972137635902090, -0.743005602824467260, +-0.743039066155518180, -0.743072527628971360, -0.743105987244743300, -0.743139445002750200, -0.743172900902908880, -0.743206354945134870, -0.743239807129345340, -0.743273257455456140, +-0.743306705923383550, -0.743340152533044310, -0.743373597284354700, -0.743407040177231470, -0.743440481211590230, -0.743473920387347720, -0.743507357704420890, -0.743540793162725260, +-0.743574226762177660, -0.743607658502694500, -0.743641088384192180, -0.743674516406587440, -0.743707942569796220, -0.743741366873734930, -0.743774789318320640, -0.743808209903469190, +-0.743841628629097080, -0.743875045495120850, -0.743908460501457420, -0.743941873648022560, -0.743975284934732860, -0.744008694361505410, -0.744042101928255820, -0.744075507634901050, +-0.744108911481357490, -0.744142313467541670, -0.744175713593370200, -0.744209111858759380, -0.744242508263625700, -0.744275902807886030, -0.744309295491456300, -0.744342686314253270, +-0.744376075276193650, -0.744409462377193740, -0.744442847617170500, -0.744476230996039880, -0.744509612513718720, -0.744542992170123650, -0.744576369965170960, -0.744609745898777260, +-0.744643119970859300, -0.744676492181333800, -0.744709862530116730, -0.744743231017125030, -0.744776597642275550, -0.744809962405484250, -0.744843325306668080, -0.744876686345743670, +-0.744910045522627410, -0.744943402837236370, -0.744976758289486510, -0.745010111879294780, -0.745043463606578140, -0.745076813471252430, -0.745110161473234720, -0.745143507612441640, +-0.745176851888789790, -0.745210194302196150, -0.745243534852576660, -0.745276873539848510, -0.745310210363928080, -0.745343545324732020, -0.745376878422177150, -0.745410209656180100, +-0.745443539026657720, -0.745476866533526290, -0.745510192176702670, -0.745543515956103910, -0.745576837871645970, -0.745610157923245920, -0.745643476110820600, -0.745676792434286530, +-0.745710106893560760, -0.745743419488559490, -0.745776730219199660, -0.745810039085398220, -0.745843346087071370, -0.745876651224136270, -0.745909954496509540, -0.745943255904108150, +-0.745976555446848270, -0.746009853124647070, -0.746043148937421520, -0.746076442885087900, -0.746109734967563050, -0.746143025184763940, -0.746176313536607180, -0.746209600023010070, +-0.746242884643888550, -0.746276167399159810, -0.746309448288741020, -0.746342727312548250, -0.746376004470498790, -0.746409279762509150, -0.746442553188496390, -0.746475824748377480, +-0.746509094442068810, -0.746542362269487340, -0.746575628230550240, -0.746608892325173910, -0.746642154553275210, -0.746675414914771180, -0.746708673409578920, -0.746741930037614690, +-0.746775184798795570, -0.746808437693038840, -0.746841688720260690, -0.746874937880378290, -0.746908185173308590, -0.746941430598968450, -0.746974674157275030, -0.747007915848144630, +-0.747041155671494430, -0.747074393627241480, -0.747107629715302420, -0.747140863935594310, -0.747174096288034000, -0.747207326772538430, -0.747240555389024900, -0.747273782137409580, +-0.747307007017610100, -0.747340230029542860, -0.747373451173125040, -0.747406670448273690, -0.747439887854905560, -0.747473103392937930, -0.747506317062287430, -0.747539528862871010, +-0.747572738794606060, -0.747605946857409000, -0.747639153051197100, -0.747672357375887330, -0.747705559831396640, -0.747738760417642310, -0.747771959134540860, -0.747805155982009360, +-0.747838350959965430, -0.747871544068325230, -0.747904735307006190, -0.747937924675925350, -0.747971112175000010, -0.748004297804146570, -0.748037481563282310, -0.748070663452324760, +-0.748103843471190190, -0.748137021619796010, -0.748170197898059270, -0.748203372305897170, -0.748236544843226770, -0.748269715509964680, -0.748302884306028430, -0.748336051231335290, +-0.748369216285801660, -0.748402379469344960, -0.748435540781882350, -0.748468700223330900, -0.748501857793608010, -0.748535013492630070, -0.748568167320314730, -0.748601319276579140, +-0.748634469361340040, -0.748667617574514720, -0.748700763916020470, -0.748733908385774470, -0.748767050983693450, -0.748800191709694810, -0.748833330563695940, -0.748866467545613590, +-0.748899602655364930, -0.748932735892867350, -0.748965867258037930, -0.748998996750794070, -0.749032124371052490, -0.749065250118730490, -0.749098373993745680, -0.749131495996014810, +-0.749164616125455040, -0.749197734381983780, -0.749230850765518100, -0.749263965275975720, -0.749297077913273050, -0.749330188677328040, -0.749363297568057200, -0.749396404585378150, +-0.749429509729208080, -0.749462612999464260, -0.749495714396064220, -0.749528813918924560, -0.749561911567962920, -0.749595007343096700, -0.749628101244242730, -0.749661193271318420, +-0.749694283424241270, -0.749727371702928360, -0.749760458107297300, -0.749793542637264720, -0.749826625292748460, -0.749859706073665810, -0.749892784979933610, -0.749925862011469490, +-0.749958937168190620, -0.749992010450014850, -0.750025081856858680, -0.750058151388639740, -0.750091219045275760, -0.750124284826683470, -0.750157348732780500, -0.750190410763484140, +-0.750223470918711670, -0.750256529198380930, -0.750289585602408550, -0.750322640130712150, -0.750355692783209460, -0.750388743559817220, -0.750421792460453150, -0.750454839485034660, +-0.750487884633478930, -0.750520927905703910, -0.750553969301626210, -0.750587008821163910, -0.750620046464233860, -0.750653082230753550, -0.750686116120640730, -0.750719148133812460, +-0.750752178270186700, -0.750785206529680060, -0.750818232912210610, -0.750851257417695650, -0.750884280046052450, -0.750917300797198430, -0.750950319671051190, -0.750983336667528150, +-0.751016351786547020, -0.751049365028024880, -0.751082376391879250, -0.751115385878027840, -0.751148393486387730, -0.751181399216876770, -0.751214403069412230, -0.751247405043911960, +-0.751280405140292820, -0.751313403358472740, -0.751346399698369470, -0.751379394159899850, -0.751412386742981830, -0.751445377447532700, -0.751478366273470310, -0.751511353220712160, +-0.751544338289175330, -0.751577321478777760, -0.751610302789437080, -0.751643282221070460, -0.751676259773595530, -0.751709235446930020, -0.751742209240991330, -0.751775181155697410, +-0.751808151190965330, -0.751841119346712940, -0.751874085622857850, -0.751907050019317460, -0.751940012536009280, -0.751972973172851170, -0.752005931929760840, -0.752038888806655480, +-0.752071843803452820, -0.752104796920070930, -0.752137748156426640, -0.752170697512438040, -0.752203644988022720, -0.752236590583098220, -0.752269534297582590, -0.752302476131392780, +-0.752335416084446870, -0.752368354156662590, -0.752401290347957220, -0.752434224658248610, -0.752467157087454490, -0.752500087635492370, -0.752533016302280310, -0.752565943087735610, +-0.752598867991776110, -0.752631791014319320, -0.752664712155282970, -0.752697631414584900, -0.752730548792142740, -0.752763464287874440, -0.752796377901697290, -0.752829289633529020, +-0.752862199483287920, -0.752895107450891050, -0.752928013536256380, -0.752960917739301740, -0.752993820059944750, -0.753026720498103490, -0.753059619053695120, -0.753092515726637710, +-0.753125410516849450, -0.753158303424247280, -0.753191194448749270, -0.753224083590273370, -0.753256970848737440, -0.753289856224058860, -0.753322739716155710, -0.753355621324945930, +-0.753388501050346830, -0.753421378892276450, -0.753454254850652650, -0.753487128925393160, -0.753520001116416150, -0.753552871423638910, -0.753585739846979520, -0.753618606386355920, +-0.753651471041685620, -0.753684333812886690, -0.753717194699876750, -0.753750053702573970, -0.753782910820896320, -0.753815766054761080, -0.753848619404086540, -0.753881470868790540, +-0.753914320448790700, -0.753947168144005090, -0.753980013954351440, -0.754012857879748140, -0.754045699920112390, -0.754078540075362350, -0.754111378345416310, -0.754144214730191440, +-0.754177049229606160, -0.754209881843578180, -0.754242712572025460, -0.754275541414866300, -0.754308368372017980, -0.754341193443398780, -0.754374016628926890, -0.754406837928519590, +-0.754439657342095280, -0.754472474869571700, -0.754505290510867120, -0.754538104265899510, -0.754570916134586380, -0.754603726116846120, -0.754636534212596350, -0.754669340421755260, +-0.754702144744240800, -0.754734947179971030, -0.754767747728864120, -0.754800546390837600, -0.754833343165809630, -0.754866138053698620, -0.754898931054422070, -0.754931722167898060, +-0.754964511394044860, -0.754997298732780320, -0.755030084184022840, -0.755062867747689830, -0.755095649423699670, -0.755128429211970760, -0.755161207112420410, -0.755193983124966990, +-0.755226757249528700, -0.755259529486023710, -0.755292299834369740, -0.755325068294484980, -0.755357834866287710, -0.755390599549695670, -0.755423362344627150, -0.755456123251000200, +-0.755488882268732900, -0.755521639397743750, -0.755554394637950160, -0.755587147989270620, -0.755619899451623560, -0.755652649024926350, -0.755685396709097510, -0.755718142504055330, +-0.755750886409717660, -0.755783628426003110, -0.755816368552829190, -0.755849106790114300, -0.755881843137776950, -0.755914577595734770, -0.755947310163906150, -0.755980040842209160, +-0.756012769630562410, -0.756045496528883530, -0.756078221537090810, -0.756110944655102870, -0.756143665882837210, -0.756176385220212350, -0.756209102667146690, -0.756241818223558180, +-0.756274531889365440, -0.756307243664485980, -0.756339953548838540, -0.756372661542341510, -0.756405367644912510, -0.756438071856470050, -0.756470774176932430, -0.756503474606217810, +-0.756536173144244820, -0.756568869790931190, -0.756601564546195650, -0.756634257409955930, -0.756666948382130560, -0.756699637462637800, -0.756732324651395950, -0.756765009948323520, +-0.756797693353338240, -0.756830374866358850, -0.756863054487303840, -0.756895732216090740, -0.756928408052638390, -0.756961081996865070, -0.756993754048689070, -0.757026424208028900, +-0.757059092474802410, -0.757091758848928100, -0.757124423330324810, -0.757157085918910070, -0.757189746614602700, -0.757222405417320890, -0.757255062326983470, -0.757287717343507970, +-0.757320370466813220, -0.757353021696817840, -0.757385671033439680, -0.757418318476597240, -0.757450964026209150, -0.757483607682193470, -0.757516249444469160, -0.757548889312953940, +-0.757581527287566450, -0.757614163368225510, -0.757646797554848870, -0.757679429847355150, -0.757712060245662840, -0.757744688749690480, -0.757777315359356660, -0.757809940074579250, +-0.757842562895276960, -0.757875183821368650, -0.757907802852771930, -0.757940419989405870, -0.757973035231188640, -0.758005648578039090, -0.758038260029875290, -0.758070869586615740, +-0.758103477248179280, -0.758136083014483870, -0.758168686885448250, -0.758201288860990920, -0.758233888941030390, -0.758266487125485390, -0.758299083414273880, -0.758331677807314700, +-0.758364270304526580, -0.758396860905827470, -0.758429449611136340, -0.758462036420371470, -0.758494621333451470, -0.758527204350295300, -0.758559785470820810, -0.758592364694947060, +-0.758624942022592230, -0.758657517453675050, -0.758690090988114020, -0.758722662625827770, -0.758755232366735140, -0.758787800210754090, -0.758820366157803680, -0.758852930207802530, +-0.758885492360668820, -0.758918052616321390, -0.758950610974678750, -0.758983167435659630, -0.759015721999182880, -0.759048274665166560, -0.759080825433529500, -0.759113374304190680, +-0.759145921277068150, -0.759178466352080860, -0.759211009529147330, -0.759243550808186620, -0.759276090189116790, -0.759308627671856580, -0.759341163256325280, -0.759373696942440720, +-0.759406228730121760, -0.759438758619287450, -0.759471286609856080, -0.759503812701746940, -0.759536336894877760, -0.759568859189167940, -0.759601379584536220, -0.759633898080900650, +-0.759666414678180520, -0.759698929376294240, -0.759731442175160530, -0.759763953074698680, -0.759796462074826650, -0.759828969175463610, -0.759861474376527960, -0.759893977677938650, +-0.759926479079614300, -0.759958978581473880, -0.759991476183436210, -0.760023971885419590, -0.760056465687343090, -0.760088957589125650, -0.760121447590685450, -0.760153935691941780, +-0.760186421892813270, -0.760218906193218640, -0.760251388593077060, -0.760283869092306720, -0.760316347690826680, -0.760348824388556110, -0.760381299185413080, -0.760413772081316890, +-0.760446243076186250, -0.760478712169940340, -0.760511179362497240, -0.760543644653776330, -0.760576108043696460, -0.760608569532176150, -0.760641029119134340, -0.760673486804489980, +-0.760705942588161930, -0.760738396470069360, -0.760770848450130430, -0.760803298528264450, -0.760835746704390360, -0.760868192978426780, -0.760900637350292670, -0.760933079819906990, +-0.760965520387188450, -0.760997959052056580, -0.761030395814429440, -0.761062830674226310, -0.761095263631366480, -0.761127694685768130, -0.761160123837350540, -0.761192551086032680, +-0.761224976431733700, -0.761257399874372020, -0.761289821413866810, -0.761322241050137350, -0.761354658783101930, -0.761387074612679960, -0.761419488538790270, -0.761451900561351810, +-0.761484310680283990, -0.761516718895505100, -0.761549125206934300, -0.761581529614490990, -0.761613932118093690, -0.761646332717661470, -0.761678731413113490, -0.761711128204368590, +-0.761743523091346190, -0.761775916073964670, -0.761808307152143650, -0.761840696325801650, -0.761873083594857840, -0.761905468959231390, -0.761937852418841270, -0.761970233973606750, +-0.762002613623446350, -0.762034991368279350, -0.762067367208025260, -0.762099741142602480, -0.762132113171930300, -0.762164483295927900, -0.762196851514514220, -0.762229217827608770, +-0.762261582235129960, -0.762293944736997080, -0.762326305333129730, -0.762358664023446320, -0.762391020807866250, -0.762423375686308690, -0.762455728658692930, -0.762488079724937600, +-0.762520428884961960, -0.762552776138685550, -0.762585121486026970, -0.762617464926905630, -0.762649806461240590, -0.762682146088951020, -0.762714483809956320, -0.762746819624175230, +-0.762779153531527030, -0.762811485531931230, -0.762843815625306450, -0.762876143811572090, -0.762908470090647440, -0.762940794462451550, -0.762973116926904060, -0.763005437483923350, +-0.763037756133429170, -0.763070072875340790, -0.763102387709576950, -0.763134700636057260, -0.763167011654700690, -0.763199320765426960, -0.763231627968154580, -0.763263933262803170, +-0.763296236649292140, -0.763328538127540310, -0.763360837697467210, -0.763393135358991890, -0.763425431112033760, -0.763457724956512320, -0.763490016892346300, -0.763522306919455220, +-0.763554595037758690, -0.763586881247175440, -0.763619165547624880, -0.763651447939026510, -0.763683728421299390, -0.763716006994363370, -0.763748283658136960, -0.763780558412540110, +-0.763812831257491660, -0.763845102192911130, -0.763877371218717790, -0.763909638334831050, -0.763941903541170530, -0.763974166837654840, -0.764006428224203840, -0.764038687700737020, +-0.764070945267173230, -0.764103200923432090, -0.764135454669432890, -0.764167706505095130, -0.764199956430338330, -0.764232204445081330, -0.764264450549243860, -0.764296694742745530, +-0.764328937025505200, -0.764361177397442580, -0.764393415858476870, -0.764425652408528000, -0.764457887047514720, -0.764490119775356750, -0.764522350591973710, -0.764554579497284560, +-0.764586806491208910, -0.764619031573666290, -0.764651254744576070, -0.764683476003858000, -0.764715695351430910, -0.764747912787214550, -0.764780128311128850, -0.764812341923092440, +-0.764844553623025170, -0.764876763410846540, -0.764908971286475950, -0.764941177249833350, -0.764973381300837360, -0.765005583439408050, -0.765037783665465040, -0.765069981978927280, +-0.765102178379714500, -0.765134372867746330, -0.765166565442942480, -0.765198756105221920, -0.765230944854504490, -0.765263131690710030, -0.765295316613757490, -0.765327499623566500, +-0.765359680720056890, -0.765391859903148060, -0.765424037172759860, -0.765456212528811240, -0.765488385971222150, -0.765520557499912320, -0.765552727114800820, -0.765584894815807600, +-0.765617060602852060, -0.765649224475853820, -0.765681386434732940, -0.765713546479408150, -0.765745704609799960, -0.765777860825827110, -0.765810015127409540, -0.765842167514466990, +-0.765874317986919070, -0.765906466544685640, -0.765938613187685750, -0.765970757915839240, -0.766002900729066290, -0.766035041627285640, -0.766067180610417450, -0.766099317678381350, +-0.766131452831096960, -0.766163586068484110, -0.766195717390462110, -0.766227846796950770, -0.766259974287870180, -0.766292099863139290, -0.766324223522678150, -0.766356345266406390, +-0.766388465094244190, -0.766420583006110490, -0.766452699001925360, -0.766484813081608760, -0.766516925245079750, -0.766549035492258500, -0.766581143823064640, -0.766613250237418000, +-0.766645354735238430, -0.766677457316445210, -0.766709557980958410, -0.766741656728697870, -0.766773753559582990, -0.766805848473533720, -0.766837941470469800, -0.766870032550311050, +-0.766902121712977560, -0.766934208958388370, -0.766966294286463680, -0.766998377697123650, -0.767030459190287230, -0.767062538765874820, -0.767094616423805940, -0.767126692164000870, +-0.767158765986378780, -0.767190837890859730, -0.767222907877363910, -0.767254975945810600, -0.767287042096119750, -0.767319106328211320, -0.767351168642005140, -0.767383229037421290, +-0.767415287514379150, -0.767447344072798690, -0.767479398712600290, -0.767511451433703030, -0.767543502236027080, -0.767575551119492490, -0.767607598084018910, -0.767639643129526710, +-0.767671686255935070, -0.767703727463164620, -0.767735766751134420, -0.767767804119764860, -0.767799839568975790, -0.767831873098687060, -0.767863904708819050, -0.767895934399290820, +-0.767927962170022900, -0.767959988020935350, -0.767992011951947550, -0.768024033962979690, -0.768056054053951720, -0.768088072224783590, -0.768120088475395590, -0.768152102805707120, +-0.768184115215638450, -0.768216125705109660, -0.768248134274040370, -0.768280140922350640, -0.768312145649960640, -0.768344148456790550, -0.768376149342759770, -0.768408148307788700, +-0.768440145351797390, -0.768472140474705580, -0.768504133676433330, -0.768536124956900820, -0.768568114316027890, -0.768600101753735050, -0.768632087269941700, -0.768664070864568010, +-0.768696052537534480, -0.768728032288760630, -0.768760010118166530, -0.768791986025672560, -0.768823960011198570, -0.768855932074664960, -0.768887902215991240, -0.768919870435098020, +-0.768951836731904810, -0.768983801106332130, -0.769015763558299810, -0.769047724087728150, -0.769079682694537530, -0.769111639378647350, -0.769143594139978020, -0.769175546978450030, +-0.769207497893982910, -0.769239446886497040, -0.769271393955912600, -0.769303339102149540, -0.769335282325128600, -0.769367223624769060, -0.769399163000991430, -0.769431100453716210, +-0.769463035982863030, -0.769494969588352170, -0.769526901270103920, -0.769558831028038680, -0.769590758862076060, -0.769622684772136580, -0.769654608758140730, -0.769686530820007930, +-0.769718450957658900, -0.769750369171013800, -0.769782285459992720, -0.769814199824516150, -0.769846112264503830, -0.769878022779876270, -0.769909931370553970, -0.769941838036456440, +-0.769973742777504410, -0.770005645593617950, -0.770037546484717450, -0.770069445450723310, -0.770101342491555260, -0.770133237607133920, -0.770165130797379800, -0.770197022062212520, +-0.770228911401552590, -0.770260798815320500, -0.770292684303436670, -0.770324567865820820, -0.770356449502393570, -0.770388329213075540, -0.770420206997786350, -0.770452082856446620, +-0.770483956788976740, -0.770515828795296900, -0.770547698875327810, -0.770579567028989110, -0.770611433256201630, -0.770643297556885760, -0.770675159930961360, -0.770707020378349150, +-0.770738878898969300, -0.770770735492742330, -0.770802590159588740, -0.770834442899428370, -0.770866293712182180, -0.770898142597770120, -0.770929989556112580, -0.770961834587130080, +-0.770993677690742900, -0.771025518866871980, -0.771057358115436850, -0.771089195436358340, -0.771121030829557190, -0.771152864294953220, -0.771184695832466960, -0.771216525442019020, +-0.771248353123529800, -0.771280178876919910, -0.771312002702109420, -0.771343824599018730, -0.771375644567568910, -0.771407462607679670, -0.771439278719271760, -0.771471092902265680, +-0.771502905156582040, -0.771534715482140920, -0.771566523878863040, -0.771598330346669140, -0.771630134885479050, -0.771661937495213720, -0.771693738175793560, -0.771725536927138970, +-0.771757333749170880, -0.771789128641809150, -0.771820921604974620, -0.771852712638588010, -0.771884501742569400, -0.771916288916839500, -0.771948074161318940, -0.771979857475928120, +-0.772011638860587990, -0.772043418315218390, -0.772075195839740270, -0.772106971434074470, -0.772138745098141070, -0.772170516831860660, -0.772202286635154000, -0.772234054507941910, +-0.772265820450144470, -0.772297584461682400, -0.772329346542476650, -0.772361106692447290, -0.772392864911515150, -0.772424621199600760, -0.772456375556624940, -0.772488127982508430, +-0.772519878477171300, -0.772551627040534480, -0.772583373672518950, -0.772615118373044530, -0.772646861142032400, -0.772678601979403190, -0.772710340885077400, -0.772742077858976080, +-0.772773812901019320, -0.772805546011128160, -0.772837277189223020, -0.772869006435224600, -0.772900733749053660, -0.772932459130630910, -0.772964182579877310, -0.772995904096712930, +-0.773027623681058820, -0.773059341332835940, -0.773091057051964350, -0.773122770838365230, -0.773154482691959080, -0.773186192612666860, -0.773217900600409290, -0.773249606655106780, +-0.773281310776680160, -0.773313012965050620, -0.773344713220138310, -0.773376411541864210, -0.773408107930149020, -0.773439802384913830, -0.773471494906078920, -0.773503185493565230, +-0.773534874147293830, -0.773566560867185000, -0.773598245653159710, -0.773629928505138900, -0.773661609423043180, -0.773693288406793860, -0.773724965456310980, -0.773756640571515610, +-0.773788313752328930, -0.773819984998671220, -0.773851654310463540, -0.773883321687626750, -0.773914987130081670, -0.773946650637749260, -0.773978312210550130, -0.774009971848405140, +-0.774041629551235450, -0.774073285318961470, -0.774104939151504360, -0.774136591048784740, -0.774168241010724010, -0.774199889037242350, -0.774231535128261040, -0.774263179283701140, +-0.774294821503482940, -0.774326461787527840, -0.774358100135756460, -0.774389736548089850, -0.774421371024449190, -0.774453003564754880, -0.774484634168927990, -0.774516262836889790, +-0.774547889568560690, -0.774579514363861850, -0.774611137222714240, -0.774642758145038800, -0.774674377130756710, -0.774705994179788360, -0.774737609292055370, -0.774769222467478040, +-0.774800833705977740, -0.774832443007475220, -0.774864050371891660, -0.774895655799148320, -0.774927259289165500, -0.774958860841864490, -0.774990460457166690, -0.775022058134992360, +-0.775053653875263040, -0.775085247677899440, -0.775116839542822730, -0.775148429469954330, -0.775180017459214500, -0.775211603510524540, -0.775243187623805950, -0.775274769798979140, +-0.775306350035965260, -0.775337928334685620, -0.775369504695061500, -0.775401079117013170, -0.775432651600462260, -0.775464222145329950, -0.775495790751536850, -0.775527357419004250, +-0.775558922147653320, -0.775590484937405010, -0.775622045788180730, -0.775653604699901080, -0.775685161672487470, -0.775716716705861180, -0.775748269799942940, -0.775779820954653920, +-0.775811370169915300, -0.775842917445648370, -0.775874462781774410, -0.775906006178213930, -0.775937547634888540, -0.775969087151719530, -0.776000624728627410, -0.776032160365533800, +-0.776063694062359870, -0.776095225819026900, -0.776126755635455630, -0.776158283511567460, -0.776189809447283770, -0.776221333442525420, -0.776252855497213680, -0.776284375611269840, +-0.776315893784614960, -0.776347410017170670, -0.776378924308857580, -0.776410436659597190, -0.776441947069311020, -0.776473455537919690, -0.776504962065344690, -0.776536466651507330, +-0.776567969296328760, -0.776599469999730510, -0.776630968761633400, -0.776662465581959060, -0.776693960460628330, -0.776725453397562720, -0.776756944392683390, -0.776788433445911750, +-0.776819920557169310, -0.776851405726376790, -0.776882888953455810, -0.776914370238327770, -0.776945849580913620, -0.776977326981134750, -0.777008802438912680, -0.777040275954168580, +-0.777071747526824060, -0.777103217156799860, -0.777134684844017600, -0.777166150588398890, -0.777197614389864680, -0.777229076248336260, -0.777260536163735250, -0.777291994135983160, +-0.777323450165000820, -0.777354904250709740, -0.777386356393031770, -0.777417806591887640, -0.777449254847198960, -0.777480701158887230, -0.777512145526873640, -0.777543587951080030, +-0.777575028431427120, -0.777606466967836750, -0.777637903560230330, -0.777669338208529020, -0.777700770912654220, -0.777732201672527660, -0.777763630488070400, -0.777795057359204510, +-0.777826482285850610, -0.777857905267930860, -0.777889326305366000, -0.777920745398077870, -0.777952162545987870, -0.777983577749017390, -0.778014991007088370, -0.778046402320121460, +-0.778077811688038580, -0.778109219110761470, -0.778140624588211090, -0.778172028120309060, -0.778203429706977090, -0.778234829348136480, -0.778266227043708960, -0.778297622793615700, +-0.778329016597778420, -0.778360408456118870, -0.778391798368557990, -0.778423186335017500, -0.778454572355419150, -0.778485956429684430, -0.778517338557734970, -0.778548718739491940, +-0.778580096974877400, -0.778611473263812410, -0.778642847606218710, -0.778674220002017800, -0.778705590451131410, -0.778736958953481270, -0.778768325508988560, -0.778799690117574880, +-0.778831052779162420, -0.778862413493671910, -0.778893772261025410, -0.778925129081144530, -0.778956483953950780, -0.778987836879366120, -0.779019187857311610, -0.779050536887709090, +-0.779081883970480500, -0.779113229105546920, -0.779144572292830300, -0.779175913532252240, -0.779207252823734710, -0.779238590167198760, -0.779269925562566250, -0.779301259009759330, +-0.779332590508698850, -0.779363920059306990, -0.779395247661505360, -0.779426573315215480, -0.779457897020359610, -0.779489218776858620, -0.779520538584634550, -0.779551856443609470, +-0.779583172353704450, -0.779614486314841540, -0.779645798326942360, -0.779677108389928650, -0.779708416503722580, -0.779739722668245090, -0.779771026883418590, -0.779802329149164250, +-0.779833629465404020, -0.779864927832059850, -0.779896224249053250, -0.779927518716306500, -0.779958811233740560, -0.779990101801277590, -0.780021390418839670, -0.780052677086348070, +-0.780083961803724630, -0.780115244570891430, -0.780146525387769960, -0.780177804254282630, -0.780209081170350370, -0.780240356135895490, -0.780271629150840030, -0.780302900215105180, +-0.780334169328612990, -0.780365436491285420, -0.780396701703044650, -0.780427964963811730, -0.780459226273508940, -0.780490485632058360, -0.780521743039381270, -0.780552998495399830, +-0.780584252000036010, -0.780615503553211410, -0.780646753154848330, -0.780678000804868160, -0.780709246503192960, -0.780740490249744900, -0.780771732044445390, -0.780802971887216480, +-0.780834209777980240, -0.780865445716658390, -0.780896679703173220, -0.780927911737446130, -0.780959141819399180, -0.780990369948954770, -0.781021596126034060, -0.781052820350559340, +-0.781084042622452570, -0.781115262941636020, -0.781146481308031100, -0.781177697721559870, -0.781208912182144720, -0.781240124689706940, -0.781271335244168920, -0.781302543845452610, +-0.781333750493479860, -0.781364955188173060, -0.781396157929453490, -0.781427358717243670, -0.781458557551465650, -0.781489754432040940, -0.781520949358891940, -0.781552142331940480, +-0.781583333351108630, -0.781614522416318790, -0.781645709527492350, -0.781676894684551930, -0.781708077887419030, -0.781739259136015830, -0.781770438430264610, -0.781801615770087220, +-0.781832791155406050, -0.781863964586142710, -0.781895136062219390, -0.781926305583558470, -0.781957473150081570, -0.781988638761710990, -0.782019802418368880, -0.782050964119977100, +-0.782082123866458370, -0.782113281657733860, -0.782144437493726310, -0.782175591374357880, -0.782206743299550200, -0.782237893269225660, -0.782269041283306320, -0.782300187341714690, +-0.782331331444372390, -0.782362473591201700, -0.782393613782125130, -0.782424752017064180, -0.782455888295941480, -0.782487022618678970, -0.782518154985198940, -0.782549285395423790, +-0.782580413849275120, -0.782611540346675460, -0.782642664887547190, -0.782673787471811930, -0.782704908099392300, -0.782736026770210370, -0.782767143484188410, -0.782798258241248820, +-0.782829371041313230, -0.782860481884304350, -0.782891590770144470, -0.782922697698755330, -0.782953802670059540, -0.782984905683979160, -0.783016006740436810, -0.783047105839354110, +-0.783078202980653780, -0.783109298164258120, -0.783140391390088950, -0.783171482658068800, -0.783202571968119930, -0.783233659320164640, -0.783264744714125550, -0.783295828149924270, +-0.783326909627483410, -0.783357989146725610, -0.783389066707572470, -0.783420142309946720, -0.783451215953770540, -0.783482287638966430, -0.783513357365456800, -0.783544425133163580, +-0.783575490942009510, -0.783606554791916430, -0.783637616682806960, -0.783668676614603490, -0.783699734587228300, -0.783730790600604020, -0.783761844654652600, -0.783792896749296420, +-0.783823946884458440, -0.783854995060060180, -0.783886041276024460, -0.783917085532273680, -0.783948127828730130, -0.783979168165316650, -0.784010206541954860, -0.784041242958567590, +-0.784072277415077460, -0.784103309911406420, -0.784134340447477100, -0.784165369023211880, -0.784196395638533490, -0.784227420293363900, -0.784258442987625810, -0.784289463721241750, +-0.784320482494133890, -0.784351499306224720, -0.784382514157436870, -0.784413527047692740, -0.784444537976914940, -0.784475546945025640, -0.784506553951947460, -0.784537558997603130, +-0.784568562081914720, -0.784599563204804840, -0.784630562366196100, -0.784661559566010910, -0.784692554804172100, -0.784723548080601630, -0.784754539395222220, -0.784785528747956820, +-0.784816516138727270, -0.784847501567456530, -0.784878485034066880, -0.784909466538481480, -0.784940446080621970, -0.784971423660411500, -0.785002399277772600, -0.785033372932627540, +-0.785064344624899050, -0.785095314354509630, -0.785126282121381910, -0.785157247925438840, -0.785188211766602250, -0.785219173644795210, -0.785250133559940560, -0.785281091511960240, +-0.785312047500777210, -0.785343001526314090, -0.785373953588493380, -0.785404903687238140, -0.785435851822470330, -0.785466797994113230, -0.785497742202088790, -0.785528684446319960, +-0.785559624726729470, -0.785590563043239930, -0.785621499395774300, -0.785652433784254530, -0.785683366208603800, -0.785714296668744820, -0.785745225164599880, -0.785776151696091940, +-0.785807076263143500, -0.785837998865677400, -0.785868919503616590, -0.785899838176883250, -0.785930754885400320, -0.785961669629090750, -0.785992582407876730, -0.786023493221681190, +-0.786054402070426980, -0.786085308954037050, -0.786116213872433580, -0.786147116825539500, -0.786178017813278010, -0.786208916835571150, -0.786239813892341990, -0.786270708983513260, +-0.786301602109007790, -0.786332493268748660, -0.786363382462657910, -0.786394269690658840, -0.786425154952674180, -0.786456038248626530, -0.786486919578438750, -0.786517798942033550, +-0.786548676339334010, -0.786579551770262950, -0.786610425234742780, -0.786641296732696560, -0.786672166264047350, -0.786703033828717420, -0.786733899426629970, -0.786764763057707710, +-0.786795624721873920, -0.786826484419050680, -0.786857342149161370, -0.786888197912128830, -0.786919051707875570, -0.786949903536324660, -0.786980753397399040, -0.787011601291021550, +-0.787042447217115250, -0.787073291175602650, -0.787104133166406710, -0.787134973189450800, -0.787165811244657120, -0.787196647331949050, -0.787227481451249210, -0.787258313602480770, +-0.787289143785566800, -0.787319972000429580, -0.787350798246992830, -0.787381622525178740, -0.787412444834910690, -0.787443265176111410, -0.787474083548704070, -0.787504899952611750, +-0.787535714387756940, -0.787566526854062810, -0.787597337351452650, -0.787628145879848860, -0.787658952439174610, -0.787689757029353180, -0.787720559650307180, -0.787751360301960140, +-0.787782158984234430, -0.787812955697053340, -0.787843750440340050, -0.787874543214017180, -0.787905334018008000, -0.787936122852235350, -0.787966909716622750, -0.787997694611092590, +-0.788028477535568150, -0.788059258489972940, -0.788090037474229230, -0.788120814488260320, -0.788151589531989490, -0.788182362605339690, -0.788213133708234200, -0.788243902840595640, +-0.788274670002347300, -0.788305435193412560, -0.788336198413713940, -0.788366959663174830, -0.788397718941718400, -0.788428476249267600, -0.788459231585745820, -0.788489984951075810, +-0.788520736345181050, -0.788551485767984170, -0.788582233219408680, -0.788612978699377520, -0.788643722207813870, -0.788674463744641230, -0.788705203309782220, -0.788735940903160130, +-0.788766676524698450, -0.788797410174319920, -0.788828141851947720, -0.788858871557505230, -0.788889599290915510, -0.788920325052102190, -0.788951048840987660, -0.788981770657495530, +-0.789012490501549310, -0.789043208373071630, -0.789073924271985750, -0.789104638198215190, -0.789135350151683350, -0.789166060132312720, -0.789196768140027040, -0.789227474174749700, +-0.789258178236403320, -0.789288880324911620, -0.789319580440197680, -0.789350278582184760, -0.789380974750796380, -0.789411668945955380, -0.789442361167585150, -0.789473051415609310, +-0.789503739689950580, -0.789534425990532470, -0.789565110317278270, -0.789595792670111370, -0.789626473048955280, -0.789657151453732610, -0.789687827884367200, -0.789718502340782450, +-0.789749174822901080, -0.789779845330646930, -0.789810513863943080, -0.789841180422713230, -0.789871845006880120, -0.789902507616367380, -0.789933168251098720, -0.789963826910996870, +-0.789994483595985340, -0.790025138305987750, -0.790055791040927160, -0.790086441800727510, -0.790117090585311430, -0.790147737394602650, -0.790178382228524660, -0.790209025087000640, +-0.790239665969953880, -0.790270304877308090, -0.790300941808986470, -0.790331576764912840, -0.790362209745009920, -0.790392840749201800, -0.790423469777411290, -0.790454096829562030, +-0.790484721905577610, -0.790515345005381450, -0.790545966128897050, -0.790576585276047570, -0.790607202446756530, -0.790637817640947870, -0.790668430858544320, -0.790699042099469730, +-0.790729651363647480, -0.790760258651001190, -0.790790863961454480, -0.790821467294930300, -0.790852068651352490, -0.790882668030644780, -0.790913265432730110, -0.790943860857532320, +-0.790974454304974820, -0.791005045774981540, -0.791035635267475330, -0.791066222782380040, -0.791096808319619370, -0.791127391879116510, -0.791157973460795190, -0.791188553064578910, +-0.791219130690391180, -0.791249706338155940, -0.791280280007796270, -0.791310851699235760, -0.791341421412398380, -0.791371989147207300, -0.791402554903586130, -0.791433118681458600, +-0.791463680480748330, -0.791494240301379050, -0.791524798143274030, -0.791555354006356900, -0.791585907890551720, -0.791616459795781440, -0.791647009721970000, -0.791677557669041130, +-0.791708103636918570, -0.791738647625525480, -0.791769189634785820, -0.791799729664623310, -0.791830267714961340, -0.791860803785723650, -0.791891337876833970, -0.791921869988216010, +-0.791952400119793510, -0.791982928271489860, -0.792013454443228900, -0.792043978634934480, -0.792074500846529860, -0.792105021077939010, -0.792135539329085650, -0.792166055599893390, +-0.792196569890286310, -0.792227082200187450, -0.792257592529521220, -0.792288100878210780, -0.792318607246179970, -0.792349111633352750, -0.792379614039652740, -0.792410114465003870, +-0.792440612909329540, -0.792471109372553610, -0.792501603854600220, -0.792532096355392570, -0.792562586874854590, -0.792593075412910240, -0.792623561969483140, -0.792654046544497450, +-0.792684529137876350, -0.792715009749543900, -0.792745488379424270, -0.792775965027440630, -0.792806439693517050, -0.792836912377577360, -0.792867383079545630, -0.792897851799345240, +-0.792928318536900270, -0.792958783292134650, -0.792989246064971900, -0.793019706855335960, -0.793050165663150790, -0.793080622488340210, -0.793111077330828310, -0.793141530190538460, +-0.793171981067394840, -0.793202429961321510, -0.793232876872241750, -0.793263321800079860, -0.793293764744759770, -0.793324205706205100, -0.793354644684340250, -0.793385081679088610, +-0.793415516690374130, -0.793445949718121210, -0.793476380762253130, -0.793506809822694060, -0.793537236899368060, -0.793567661992199080, -0.793598085101110850, -0.793628506226027320, +-0.793658925366872770, -0.793689342523570710, -0.793719757696045190, -0.793750170884220290, -0.793780582088020050, -0.793810991307368650, -0.793841398542189380, -0.793871803792406630, +-0.793902207057944790, -0.793932608338727030, -0.793963007634677750, -0.793993404945721020, -0.794023800271780660, -0.794054193612781180, -0.794084584968645870, -0.794114974339299450, +-0.794145361724665320, -0.794175747124667760, -0.794206130539230730, -0.794236511968278490, -0.794266891411735230, -0.794297268869524450, -0.794327644341570550, -0.794358017827797690, +-0.794388389328129610, -0.794418758842490580, -0.794449126370804560, -0.794479491912995830, -0.794509855468988560, -0.794540217038706480, -0.794570576622073750, -0.794600934219014900, +-0.794631289829453410, -0.794661643453313690, -0.794691995090519910, -0.794722344740996340, -0.794752692404666730, -0.794783038081455340, -0.794813381771286690, -0.794843723474084270, +-0.794874063189772500, -0.794904400918275630, -0.794934736659517640, -0.794965070413423240, -0.794995402179915820, -0.795025731958919900, -0.795056059750359980, -0.795086385554159560, +-0.795116709370243150, -0.795147031198535030, -0.795177351038959260, -0.795207668891440460, -0.795237984755902240, -0.795268298632269000, -0.795298610520465350, -0.795328920420414810, +-0.795359228332041980, -0.795389534255271150, -0.795419838190026710, -0.795450140136232390, -0.795480440093812800, -0.795510738062692350, -0.795541034042794750, -0.795571328034044510, +-0.795601620036366030, -0.795631910049683480, -0.795662198073921470, -0.795692484109003620, -0.795722768154854650, -0.795753050211398970, -0.795783330278560410, -0.795813608356263470, +-0.795843884444432550, -0.795874158542991930, -0.795904430651866220, -0.795934700770979160, -0.795964968900255590, -0.795995235039619220, -0.796025499188994900, -0.796055761348306800, +-0.796086021517479310, -0.796116279696436950, -0.796146535885103760, -0.796176790083404140, -0.796207042291262820, -0.796237292508603640, -0.796267540735351220, -0.796297786971429940, +-0.796328031216764210, -0.796358273471278740, -0.796388513734897160, -0.796418752007544420, -0.796448988289145120, -0.796479222579623000, -0.796509454878902790, -0.796539685186908990, +-0.796569913503566210, -0.796600139828798400, -0.796630364162530190, -0.796660586504686410, -0.796690806855190890, -0.796721025213968370, -0.796751241580943240, -0.796781455956040000, +-0.796811668339183380, -0.796841878730297330, -0.796872087129306680, -0.796902293536135950, -0.796932497950709310, -0.796962700372951360, -0.796992900802786730, -0.797023099240139810, +-0.797053295684935330, -0.797083490137097450, -0.797113682596551130, -0.797143873063220210, -0.797174061537029740, -0.797204248017904020, -0.797234432505767750, -0.797264615000545680, +-0.797294795502161760, -0.797324974010540810, -0.797355150525607790, -0.797385325047286540, -0.797415497575502010, -0.797445668110178700, -0.797475836651241330, -0.797506003198614530, +-0.797536167752222580, -0.797566330311990090, -0.797596490877842010, -0.797626649449702520, -0.797656806027496450, -0.797686960611148300, -0.797717113200583030, -0.797747263795724690, +-0.797777412396498130, -0.797807559002828400, -0.797837703614639460, -0.797867846231856360, -0.797897986854403500, -0.797928125482205820, -0.797958262115187940, -0.797988396753274270, +-0.798018529396389510, -0.798048660044458740, -0.798078788697406120, -0.798108915355156380, -0.798139040017634470, -0.798169162684764900, -0.798199283356472720, -0.798229402032682110, +-0.798259518713317910, -0.798289633398305170, -0.798319746087568170, -0.798349856781031760, -0.798379965478620670, -0.798410072180260060, -0.798440176885873880, -0.798470279595387300, +-0.798500380308725280, -0.798530479025811980, -0.798560575746572580, -0.798590670470931690, -0.798620763198814140, -0.798650853930144900, -0.798680942664848350, -0.798711029402849440, +-0.798741114144073120, -0.798771196888443890, -0.798801277635886600, -0.798831356386326070, -0.798861433139687160, -0.798891507895895030, -0.798921580654873730, -0.798951651416548890, +-0.798981720180844570, -0.799011786947685930, -0.799041851716997820, -0.799071914488705070, -0.799101975262732860, -0.799132034039005460, -0.799162090817447930, -0.799192145597985460, +-0.799222198380542430, -0.799252249165043780, -0.799282297951414590, -0.799312344739579570, -0.799342389529464010, -0.799372432320992200, -0.799402473114089300, -0.799432511908680480, +-0.799462548704690130, -0.799492583502043440, -0.799522616300665230, -0.799552647100480800, -0.799582675901414520, -0.799612702703391460, -0.799642727506336910, -0.799672750310175370, +-0.799702771114831900, -0.799732789920231560, -0.799762806726299180, -0.799792821532960050, -0.799822834340138570, -0.799852845147760010, -0.799882853955749650, -0.799912860764031900, +-0.799942865572531910, -0.799972868381174870, -0.800002869189885610, -0.800032867998589410, -0.800062864807210780, -0.800092859615675000, -0.800122852423907460, -0.800152843231832330, +-0.800182832039375240, -0.800212818846461000, -0.800242803653014920, -0.800272786458961720, -0.800302767264226440, -0.800332746068734500, -0.800362722872410500, -0.800392697675179620, +-0.800422670476967020, -0.800452641277697770, -0.800482610077297150, -0.800512576875689770, -0.800542541672800920, -0.800572504468556100, -0.800602465262879590, -0.800632424055697010, +-0.800662380846933310, -0.800692335636513760, -0.800722288424363550, -0.800752239210407280, -0.800782187994570790, -0.800812134776778590, -0.800842079556955970, -0.800872022335028190, +-0.800901963110920320, -0.800931901884557870, -0.800961838655865450, -0.800991773424768240, -0.801021706191192060, -0.801051636955061210, -0.801081565716301400, -0.801111492474837590, +-0.801141417230595070, -0.801171339983499210, -0.801201260733474860, -0.801231179480447200, -0.801261096224341940, -0.801291010965083710, -0.801320923702597890, -0.801350834436809880, +-0.801380743167644960, -0.801410649895027860, -0.801440554618884190, -0.801470457339139350, -0.801500358055718180, -0.801530256768546170, -0.801560153477548390, -0.801590048182650340, +-0.801619940883777300, -0.801649831580854230, -0.801679720273806520, -0.801709606962559880, -0.801739491647038840, -0.801769374327169220, -0.801799255002876080, -0.801829133674084700, +-0.801859010340720930, -0.801888885002709270, -0.801918757659975450, -0.801948628312444960, -0.801978496960042640, -0.802008363602694010, -0.802038228240324560, -0.802068090872859800, +-0.802097951500224560, -0.802127810122344350, -0.802157666739145010, -0.802187521350551160, -0.802217373956488510, -0.802247224556882470, -0.802277073151658300, -0.802306919740741750, +-0.802336764324057650, -0.802366606901531610, -0.802396447473089360, -0.802426286038655730, -0.802456122598156350, -0.802485957151516600, -0.802515789698662110, -0.802545620239518250, +-0.802575448774010210, -0.802605275302063710, -0.802635099823603810, -0.802664922338556130, -0.802694742846846170, -0.802724561348399420, -0.802754377843141410, -0.802784192330997290, +-0.802814004811892580, -0.802843815285753220, -0.802873623752504040, -0.802903430212070780, -0.802933234664378940, -0.802963037109354020, -0.802992837546921740, -0.803022635977007180, +-0.803052432399535940, -0.803082226814433970, -0.803112019221626120, -0.803141809621038320, -0.803171598012595860, -0.803201384396224680, -0.803231168771849860, -0.803260951139397110, +-0.803290731498792150, -0.803320509849960170, -0.803350286192826890, -0.803380060527317920, -0.803409832853358760, -0.803439603170875370, -0.803469371479792580, -0.803499137780036450, +-0.803528902071532710, -0.803558664354206530, -0.803588424627983630, -0.803618182892789630, -0.803647939148550260, -0.803677693395191130, -0.803707445632637630, -0.803737195860815490, +-0.803766944079650660, -0.803796690289068310, -0.803826434488994050, -0.803856176679353720, -0.803885916860073270, -0.803915655031077760, -0.803945391192293140, -0.803975125343645350, +-0.804004857485059340, -0.804034587616461290, -0.804064315737776700, -0.804094041848931410, -0.804123765949851130, -0.804153488040461270, -0.804183208120687780, -0.804212926190456370, +-0.804242642249692440, -0.804272356298321940, -0.804302068336270600, -0.804331778363463920, -0.804361486379828180, -0.804391192385288440, -0.804420896379770990, -0.804450598363200990, +-0.804480298335504610, -0.804509996296607350, -0.804539692246435180, -0.804569386184914030, -0.804599078111969180, -0.804628768027526590, -0.804658455931512310, -0.804688141823851620, +-0.804717825704470700, -0.804747507573295050, -0.804777187430250730, -0.804806865275263790, -0.804836541108259310, -0.804866214929163440, -0.804895886737902360, -0.804925556534401340, +-0.804955224318586350, -0.804984890090383320, -0.805014553849718320, -0.805044215596516730, -0.805073875330704510, -0.805103533052207940, -0.805133188760952300, -0.805162842456863650, +-0.805192494139867820, -0.805222143809890880, -0.805251791466858770, -0.805281437110697000, -0.805311080741331510, -0.805340722358688700, -0.805370361962693740, -0.805399999553272910, +-0.805429635130352040, -0.805459268693857090, -0.805488900243714220, -0.805518529779848950, -0.805548157302187540, -0.805577782810655510, -0.805607406305178910, -0.805637027785683910, +-0.805666647252096360, -0.805696264704342300, -0.805725880142347470, -0.805755493566037930, -0.805785104975339840, -0.805814714370178710, -0.805844321750480930, -0.805873927116172230, +-0.805903530467178770, -0.805933131803426630, -0.805962731124841510, -0.805992328431349600, -0.806021923722877070, -0.806051516999349400, -0.806081108260693010, -0.806110697506833950, +-0.806140284737698280, -0.806169869953211600, -0.806199453153300330, -0.806229034337890730, -0.806258613506908190, -0.806288190660279120, -0.806317765797929690, -0.806347338919785720, +-0.806376910025773720, -0.806406479115819200, -0.806436046189848430, -0.806465611247787820, -0.806495174289562860, -0.806524735315100050, -0.806554294324325350, -0.806583851317165030, +-0.806613406293545280, -0.806642959253391690, -0.806672510196630780, -0.806702059123188820, -0.806731606032991430, -0.806761150925965010, -0.806790693802035830, -0.806820234661130060, +-0.806849773503173440, -0.806879310328092460, -0.806908845135813510, -0.806938377926262110, -0.806967908699364740, -0.806997437455047590, -0.807026964193236940, -0.807056488913859060, +-0.807086011616839680, -0.807115532302105310, -0.807145050969582440, -0.807174567619196590, -0.807204082250874370, -0.807233594864541940, -0.807263105460125470, -0.807292614037551590, +-0.807322120596745800, -0.807351625137635030, -0.807381127660144910, -0.807410628164202060, -0.807440126649732530, -0.807469623116662700, -0.807499117564919210, -0.807528609994427550, +-0.807558100405114330, -0.807587588796906180, -0.807617075169728800, -0.807646559523508720, -0.807676041858172210, -0.807705522173645550, -0.807735000469855470, -0.807764476746727580, +-0.807793951004188490, -0.807823423242164830, -0.807852893460582310, -0.807882361659367550, -0.807911827838446840, -0.807941291997746890, -0.807970754137193440, -0.808000214256713090, +-0.808029672356232460, -0.808059128435677400, -0.808088582494974510, -0.808118034534050180, -0.808147484552830810, -0.808176932551242900, -0.808206378529212510, -0.808235822486666030, +-0.808265264423530420, -0.808294704339731270, -0.808324142235195330, -0.808353578109849090, -0.808383011963618950, -0.808412443796431510, -0.808441873608212620, -0.808471301398889120, +-0.808500727168387720, -0.808530150916634050, -0.808559572643555160, -0.808588992349077220, -0.808618410033127180, -0.808647825695630760, -0.808677239336514810, -0.808706650955706040, +-0.808736060553130410, -0.808765468128714530, -0.808794873682385010, -0.808824277214068350, -0.808853678723691180, -0.808883078211179660, -0.808912475676460410, -0.808941871119460140, +-0.808971264540105040, -0.809000655938321710, -0.809030045314036880, -0.809059432667176730, -0.809088817997668410, -0.809118201305437770, -0.809147582590411860, -0.809176961852516640, +-0.809206339091679160, -0.809235714307825820, -0.809265087500883110, -0.809294458670777980, -0.809323827817436500, -0.809353194940785390, -0.809382560040751490, -0.809411923117261070, +-0.809441284170240750, -0.809470643199617260, -0.809500000205317090, -0.809529355187267320, -0.809558708145393770, -0.809588059079623500, -0.809617407989883350, -0.809646754876099380, +-0.809676099738198540, -0.809705442576107550, -0.809734783389753130, -0.809764122179061460, -0.809793458943959490, -0.809822793684374150, -0.809852126400231630, -0.809881457091458760, +-0.809910785757982250, -0.809940112399728740, -0.809969437016625160, -0.809998759608597800, -0.810028080175573590, -0.810057398717479390, -0.810086715234241360, -0.810116029725786670, +-0.810145342192041820, -0.810174652632933650, -0.810203961048389100, -0.810233267438334350, -0.810262571802696450, -0.810291874141402470, -0.810321174454378460, -0.810350472741551480, +-0.810379769002848360, -0.810409063238196170, -0.810438355447520960, -0.810467645630749800, -0.810496933787809960, -0.810526219918627390, -0.810555504023129370, -0.810584786101242520, +-0.810614066152893660, -0.810643344178009980, -0.810672620176517640, -0.810701894148343820, -0.810731166093415450, -0.810760436011658920, -0.810789703903001310, -0.810818969767369450, +-0.810848233604690160, -0.810877495414890510, -0.810906755197896900, -0.810936012953636600, -0.810965268682036110, -0.810994522383022390, -0.811023774056522370, -0.811053023702462910, +-0.811082271320771150, -0.811111516911373510, -0.811140760474197030, -0.811170002009168890, -0.811199241516215470, -0.811228478995263960, -0.811257714446241280, -0.811286947869074290, +-0.811316179263690260, -0.811345408630015470, -0.811374635967977210, -0.811403861277502520, -0.811433084558517930, -0.811462305810950690, -0.811491525034727660, -0.811520742229776100, +-0.811549957396022430, -0.811579170533393790, -0.811608381641817590, -0.811637590721220100, -0.811666797771528610, -0.811696002792670180, -0.811725205784571750, -0.811754406747160600, +-0.811783605680363120, -0.811812802584106600, -0.811841997458318420, -0.811871190302924870, -0.811900381117853450, -0.811929569903031000, -0.811958756658384680, -0.811987941383841670, +-0.812017124079328580, -0.812046304744772800, -0.812075483380101380, -0.812104659985240950, -0.812133834560119010, -0.812163007104662380, -0.812192177618798470, -0.812221346102453890, +-0.812250512555556030, -0.812279676978032050, -0.812308839369808690, -0.812337999730813220, -0.812367158060972700, -0.812396314360214310, -0.812425468628465320, -0.812454620865652570, +-0.812483771071703110, -0.812512919246544560, -0.812542065390103430, -0.812571209502307210, -0.812600351583082860, -0.812629491632357650, -0.812658629650058970, -0.812687765636113560, +-0.812716899590448900, -0.812746031512991740, -0.812775161403669570, -0.812804289262409440, -0.812833415089138530, -0.812862538883784350, -0.812891660646273720, -0.812920780376533700, +-0.812949898074492140, -0.812979013740075640, -0.813008127373211490, -0.813037238973827070, -0.813066348541849450, -0.813095456077206350, -0.813124561579824270, -0.813153665049630820, +-0.813182766486553520, -0.813211865890518970, -0.813240963261454790, -0.813270058599288140, -0.813299151903946640, -0.813328243175357010, -0.813357332413446880, -0.813386419618143510, +-0.813415504789373970, -0.813444587927065530, -0.813473669031145710, -0.813502748101541660, -0.813531825138181120, -0.813560900140990580, -0.813589973109897890, -0.813619044044830540, +-0.813648112945715370, -0.813677179812479780, -0.813706244645051370, -0.813735307443357200, -0.813764368207325120, -0.813793426936881840, -0.813822483631955310, -0.813851538292472250, +-0.813880590918360400, -0.813909641509547030, -0.813938690065959540, -0.813967736587525640, -0.813996781074172060, -0.814025823525826530, -0.814054863942416770, -0.814083902323869620, +-0.814112938670112580, -0.814141972981073270, -0.814171005256679070, -0.814200035496857600, -0.814229063701535690, -0.814258089870641190, -0.814287114004101810, -0.814316136101844280, +-0.814345156163796440, -0.814374174189885670, -0.814403190180039480, -0.814432204134185600, -0.814461216052250970, -0.814490225934163540, -0.814519233779850250, -0.814548239589238940, +-0.814577243362257010, -0.814606245098831950, -0.814635244798891490, -0.814664242462362690, -0.814693238089173380, -0.814722231679251170, -0.814751223232523030, -0.814780212748916990, +-0.814809200228360340, -0.814838185670780700, -0.814867169076105790, -0.814896150444262780, -0.814925129775179390, -0.814954107068783350, -0.814983082325001940, -0.815012055543762660, +-0.815041026724993340, -0.815069995868621720, -0.815098962974574850, -0.815127928042780560, -0.815156891073166690, -0.815185852065660300, -0.815214811020189330, -0.815243767936681300, +-0.815272722815063910, -0.815301675655264900, -0.815330626457211440, -0.815359575220831470, -0.815388521946052820, -0.815417466632802570, -0.815446409281008640, -0.815475349890598780, +-0.815504288461500470, -0.815533224993641670, -0.815562159486949660, -0.815591091941352380, -0.815620022356777220, -0.815648950733151910, -0.815677877070404290, -0.815706801368461960, +-0.815735723627252880, -0.815764643846704330, -0.815793562026744020, -0.815822478167300140, -0.815851392268299720, -0.815880304329670960, -0.815909214351341340, -0.815938122333238700, +-0.815967028275291110, -0.815995932177425500, -0.816024834039570270, -0.816053733861653030, -0.816082631643601290, -0.816111527385342980, -0.816140421086805850, -0.816169312747917930, +-0.816198202368606410, -0.816227089948799440, -0.816255975488424990, -0.816284858987410320, -0.816313740445683500, -0.816342619863172360, -0.816371497239804730, -0.816400372575508460, +-0.816429245870211150, -0.816458117123840640, -0.816486986336325100, -0.816515853507591930, -0.816544718637569060, -0.816573581726184330, -0.816602442773365690, -0.816631301779041310, +-0.816660158743138240, -0.816689013665584880, -0.816717866546309180, -0.816746717385238630, -0.816775566182301290, -0.816804412937425010, -0.816833257650537940, -0.816862100321567470, +-0.816890940950441790, -0.816919779537088940, -0.816948616081436430, -0.816977450583412310, -0.817006283042944650, -0.817035113459961270, -0.817063941834390350, -0.817092768166159390, +-0.817121592455196440, -0.817150414701429680, -0.817179234904786720, -0.817208053065195730, -0.817236869182584540, -0.817265683256881200, -0.817294495288013900, -0.817323305275910130, +-0.817352113220498280, -0.817380919121705960, -0.817409722979461240, -0.817438524793692390, -0.817467324564327140, -0.817496122291293760, -0.817524917974519870, -0.817553711613933750, +-0.817582503209463570, -0.817611292761036830, -0.817640080268581930, -0.817668865732026680, -0.817697649151299390, -0.817726430526328320, -0.817755209857040750, -0.817783987143365200, +-0.817812762385229930, -0.817841535582562560, -0.817870306735291370, -0.817899075843344310, -0.817927842906649880, -0.817956607925135580, -0.817985370898729800, -0.818014131827360820, +-0.818042890710956260, -0.818071647549444390, -0.818100402342753500, -0.818129155090811630, -0.818157905793546970, -0.818186654450887450, -0.818215401062761250, -0.818244145629096750, +-0.818272888149821690, -0.818301628624864330, -0.818330367054152960, -0.818359103437615750, -0.818387837775180980, -0.818416570066776260, -0.818445300312330200, -0.818474028511771200, +-0.818502754665026750, -0.818531478772025480, -0.818560200832695540, -0.818588920846965330, -0.818617638814762570, -0.818646354736015660, -0.818675068610653200, -0.818703780438602810, +-0.818732490219792890, -0.818761197954151810, -0.818789903641607750, -0.818818607282089110, -0.818847308875523710, -0.818876008421840050, -0.818904705920966650, -0.818933401372831220, +-0.818962094777362370, -0.818990786134488170, -0.819019475444137000, -0.819048162706237480, -0.819076847920717220, -0.819105531087505170, -0.819134212206528930, -0.819162891277717240, +-0.819191568300998260, -0.819220243276300500, -0.819248916203552220, -0.819277587082681500, -0.819306255913616830, -0.819334922696286720, -0.819363587430618990, -0.819392250116542380, +-0.819420910753985150, -0.819449569342875610, -0.819478225883142340, -0.819506880374713420, -0.819535532817517120, -0.819564183211482390, -0.819592831556536840, -0.819621477852609300, +-0.819650122099627950, -0.819678764297521620, -0.819707404446218150, -0.819736042545646140, -0.819764678595734320, -0.819793312596410530, -0.819821944547603380, -0.819850574449241480, +-0.819879202301253110, -0.819907828103566880, -0.819936451856110970, -0.819965073558813870, -0.819993693211604310, -0.820022310814410350, -0.820050926367160480, -0.820079539869783440, +-0.820108151322207490, -0.820136760724361480, -0.820165368076173240, -0.820193973377571610, -0.820222576628485190, -0.820251177828842160, -0.820279776978571240, -0.820308374077600820, +-0.820336969125859740, -0.820365562123275940, -0.820394153069778250, -0.820422741965295520, -0.820451328809755580, -0.820479913603087360, -0.820508496345219380, -0.820537077036080030, +-0.820565655675598360, -0.820594232263702320, -0.820622806800320630, -0.820651379285382230, -0.820679949718815080, -0.820708518100548120, -0.820737084430509740, -0.820765648708628780, +-0.820794210934833960, -0.820822771109053220, -0.820851329231215950, -0.820879885301250000, -0.820908439319084420, -0.820936991284647700, -0.820965541197868460, -0.820994089058675660, +-0.821022634866997450, -0.821051178622762560, -0.821079720325900040, -0.821108259976337960, -0.821136797574005150, -0.821165333118830440, -0.821193866610742340, -0.821222398049669790, +-0.821250927435541070, -0.821279454768285010, -0.821307980047830570, -0.821336503274106010, -0.821365024447040070, -0.821393543566561580, -0.821422060632599480, -0.821450575645082060, +-0.821479088603938150, -0.821507599509096800, -0.821536108360486180, -0.821564615158035250, -0.821593119901672830, -0.821621622591327540, -0.821650123226928540, -0.821678621808403900, +-0.821707118335682770, -0.821735612808694120, -0.821764105227366090, -0.821792595591627870, -0.821821083901408180, -0.821849570156635730, -0.821878054357239600, -0.821906536503148040, +-0.821935016594290250, -0.821963494630595040, -0.821991970611990920, -0.822020444538406950, -0.822048916409771730, -0.822077386226014560, -0.822105853987063600, -0.822134319692848110, +-0.822162783343297070, -0.822191244938338730, -0.822219704477902270, -0.822248161961916630, -0.822276617390310550, -0.822305070763013180, -0.822333522079952810, -0.822361971341058710, +-0.822390418546259940, -0.822418863695484890, -0.822447306788662620, -0.822475747825722190, -0.822504186806592320, -0.822532623731202170, -0.822561058599480250, -0.822589491411355960, +-0.822617922166757780, -0.822646350865614660, -0.822674777507855670, -0.822703202093409750, -0.822731624622206170, -0.822760045094173220, -0.822788463509240060, -0.822816879867336090, +-0.822845294168389700, -0.822873706412330040, -0.822902116599086080, -0.822930524728586850, -0.822958930800761550, -0.822987334815538650, -0.823015736772847450, -0.823044136672617220, +-0.823072534514776350, -0.823100930299254130, -0.823129324025979600, -0.823157715694881940, -0.823186105305889870, -0.823214492858932450, -0.823242878353939060, -0.823271261790838200, +-0.823299643169559170, -0.823328022490031120, -0.823356399752183000, -0.823384774955944090, -0.823413148101243000, -0.823441519188009010, -0.823469888216171510, -0.823498255185659000, +-0.823526620096400990, -0.823554982948326300, -0.823583343741364100, -0.823611702475443910, -0.823640059150494210, -0.823668413766444620, -0.823696766323223640, -0.823725116820760880, +-0.823753465258985180, -0.823781811637825930, -0.823810155957212410, -0.823838498217073110, -0.823866838417337650, -0.823895176557935430, -0.823923512638794930, -0.823951846659845670, +-0.823980178621016800, -0.824008508522237500, -0.824036836363437160, -0.824065162144544390, -0.824093485865488810, -0.824121807526199790, -0.824150127126605960, -0.824178444666636810, +-0.824206760146221520, -0.824235073565289690, -0.824263384923769830, -0.824291694221591540, -0.824320001458684230, -0.824348306634976710, -0.824376609750398390, -0.824404910804878540, +-0.824433209798346440, -0.824461506730731600, -0.824489801601962610, -0.824518094411969330, -0.824546385160680910, -0.824574673848026300, -0.824602960473935000, -0.824631245038336290, +-0.824659527541159560, -0.824687807982334210, -0.824716086361789060, -0.824744362679453720, -0.824772636935257710, -0.824800909129129840, -0.824829179260999750, -0.824857447330796690, +-0.824885713338450290, -0.824913977283889270, -0.824942239167043350, -0.824970498987842140, -0.824998756746214370, -0.825027012442089650, -0.825055266075397480, -0.825083517646067240, +-0.825111767154028340, -0.825140014599209710, -0.825168259981541200, -0.825196503300952180, -0.825224744557371710, -0.825252983750729310, -0.825281220880954570, -0.825309455947976670, +-0.825337688951725430, -0.825365919892129710, -0.825394148769119430, -0.825422375582623440, -0.825450600332571670, -0.825478823018893300, -0.825507043641517950, -0.825535262200375100, +-0.825563478695394040, -0.825591693126504160, -0.825619905493635290, -0.825648115796716490, -0.825676324035677260, -0.825704530210447320, -0.825732734320956060, -0.825760936367133210, +-0.825789136348907830, -0.825817334266209510, -0.825845530118968110, -0.825873723907112670, -0.825901915630572910, -0.825930105289278350, -0.825958292883158810, -0.825986478412143230, +-0.826014661876161460, -0.826042843275143320, -0.826071022609017880, -0.826099199877714850, -0.826127375081163740, -0.826155548219294270, -0.826183719292036160, -0.826211888299318460, +-0.826240055241071140, -0.826268220117223780, -0.826296382927705800, -0.826324543672446680, -0.826352702351376370, -0.826380858964424150, -0.826409013511520190, -0.826437165992593310, +-0.826465316407573590, -0.826493464756390850, -0.826521611038974150, -0.826549755255253430, -0.826577897405158300, -0.826606037488618720, -0.826634175505563840, -0.826662311455923390, +-0.826690445339627540, -0.826718577156605240, -0.826746706906786530, -0.826774834590101040, -0.826802960206478480, -0.826831083755848790, -0.826859205238141160, -0.826887324653285400, +-0.826915442001211700, -0.826943557281849100, -0.826971670495127540, -0.826999781640976870, -0.827027890719326810, -0.827055997730107180, -0.827084102673247390, -0.827112205548677480, +-0.827140306356326850, -0.827168405096125550, -0.827196501768003080, -0.827224596371889500, -0.827252688907714640, -0.827280779375407670, -0.827308867774898870, -0.827336954106118180, +-0.827365038368994780, -0.827393120563458930, -0.827421200689440140, -0.827449278746868360, -0.827477354735673630, -0.827505428655785360, -0.827533500507133370, -0.827561570289648050, +-0.827589638003258350, -0.827617703647894780, -0.827645767223486820, -0.827673828729964640, -0.827701888167257760, -0.827729945535296110, -0.827758000834009850, -0.827786054063328280, +-0.827814105223181660, -0.827842154313499720, -0.827870201334212520, -0.827898246285249880, -0.827926289166541540, -0.827954329978017320, -0.827982368719607620, -0.828010405391241820, +-0.828038439992849870, -0.828066472524361830, -0.828094502985707640, -0.828122531376817460, -0.828150557697620690, -0.828178581948047610, -0.828206604128028270, -0.828234624237492060, +-0.828262642276369480, -0.828290658244590140, -0.828318672142084430, -0.828346683968781860, -0.828374693724612590, -0.828402701409506780, -0.828430707023393940, -0.828458710566204350, +-0.828486712037868060, -0.828514711438314900, -0.828542708767475160, -0.828570704025278550, -0.828598697211655130, -0.828626688326535190, -0.828654677369848210, -0.828682664341524710, +-0.828710649241494400, -0.828738632069687560, -0.828766612826034250, -0.828794591510464310, -0.828822568122908110, -0.828850542663295160, -0.828878515131555970, -0.828906485527620470, +-0.828934453851418730, -0.828962420102881010, -0.828990384281937160, -0.829018346388517240, -0.829046306422551730, -0.829074264383970250, -0.829102220272703080, -0.829130174088680280, +-0.829158125831832130, -0.829186075502088890, -0.829214023099380300, -0.829241968623636530, -0.829269912074788170, -0.829297853452764630, -0.829325792757496630, -0.829353729988914100, +-0.829381665146947440, -0.829409598231526490, -0.829437529242581410, -0.829465458180042800, -0.829493385043840290, -0.829521309833904370, -0.829549232550165110, -0.829577153192552870, +-0.829605071760997960, -0.829632988255430080, -0.829660902675779740, -0.829688815021977330, -0.829716725293952680, -0.829744633491636300, -0.829772539614958230, -0.829800443663848860, +-0.829828345638238600, -0.829856245538057260, -0.829884143363235350, -0.829912039113703260, -0.829939932789390820, -0.829967824390228540, -0.829995713916146790, -0.830023601367075870, +-0.830051486742945820, -0.830079370043686930, -0.830107251269230020, -0.830135130419504600, -0.830163007494441390, -0.830190882493970770, -0.830218755418022810, -0.830246626266528230, +-0.830274495039416860, -0.830302361736619310, -0.830330226358066080, -0.830358088903686900, -0.830385949373412590, -0.830413807767173440, -0.830441664084899720, -0.830469518326522160, +-0.830497370491970480, -0.830525220581175730, -0.830553068594067520, -0.830580914530576810, -0.830608758390633750, -0.830636600174168740, -0.830664439881112490, -0.830692277511394960, +-0.830720113064946640, -0.830747946541698370, -0.830775777941579970, -0.830803607264522070, -0.830831434510455270, -0.830859259679309740, -0.830887082771016420, -0.830914903785505030, +-0.830942722722706420, -0.830970539582551290, -0.830998354364969600, -0.831026167069891960, -0.831053977697248980, -0.831081786246971270, -0.831109592718988770, -0.831137397113232310, +-0.831165199429632630, -0.831192999668119770, -0.831220797828624350, -0.831248593911076970, -0.831276387915408030, -0.831304179841548360, -0.831331969689428130, -0.831359757458977830, +-0.831387543150128530, -0.831415326762810050, -0.831443108296953230, -0.831470887752488670, -0.831498665129346890, -0.831526440427458600, -0.831554213646754080, -0.831581984787164270, +-0.831609753848619130, -0.831637520831049800, -0.831665285734386470, -0.831693048558560080, -0.831720809303501230, -0.831748567969140100, -0.831776324555407620, -0.831804079062234520, +-0.831831831489551090, -0.831859581837287920, -0.831887330105375860, -0.831915076293745500, -0.831942820402327700, -0.831970562431052500, -0.831998302379851060, -0.832026040248654010, +-0.832053776037391610, -0.832081509745994820, -0.832109241374394240, -0.832136970922520700, -0.832164698390304600, -0.832192423777676770, -0.832220147084568040, -0.832247868310908800, +-0.832275587456629770, -0.832303304521661900, -0.832331019505935690, -0.832358732409382180, -0.832386443231931560, -0.832414151973514870, -0.832441858634063060, -0.832469563213506400, +-0.832497265711775740, -0.832524966128802000, -0.832552664464515810, -0.832580360718848220, -0.832608054891729400, -0.832635746983090510, -0.832663436992862490, -0.832691124920975630, +-0.832718810767360980, -0.832746494531949380, -0.832774176214671650, -0.832801855815458290, -0.832829533334240260, -0.832857208770948710, -0.832884882125513810, -0.832912553397866740, +-0.832940222587938320, -0.832967889695659270, -0.832995554720960760, -0.833023217663773190, -0.833050878524027590, -0.833078537301654930, -0.833106193996585700, -0.833133848608751060, +-0.833161501138081740, -0.833189151584508680, -0.833216799947963050, -0.833244446228375120, -0.833272090425676290, -0.833299732539797060, -0.833327372570668360, -0.833355010518221360, +-0.833382646382386790, -0.833410280163095820, -0.833437911860279050, -0.833465541473867310, -0.833493169003792110, -0.833520794449983620, -0.833548417812373210, -0.833576039090891730, +-0.833603658285470230, -0.833631275396039760, -0.833658890422530830, -0.833686503364874710, -0.833714114223002570, -0.833741722996844900, -0.833769329686332990, -0.833796934291397670, +-0.833824536811970330, -0.833852137247981350, -0.833879735599362020, -0.833907331866043600, -0.833934926047956600, -0.833962518145032420, -0.833990108157201760, -0.834017696084395910, +-0.834045281926546030, -0.834072865683582740, -0.834100447355437310, -0.834128026942040910, -0.834155604443324260, -0.834183179859218640, -0.834210753189654990, -0.834238324434564580, +-0.834265893593878480, -0.834293460667527410, -0.834321025655442750, -0.834348588557555780, -0.834376149373797000, -0.834403708104097920, -0.834431264748389580, -0.834458819306603260, +-0.834486371778669690, -0.834513922164520140, -0.834541470464086110, -0.834569016677298100, -0.834596560804087620, -0.834624102844385710, -0.834651642798123540, -0.834679180665232500, +-0.834706716445643200, -0.834734250139287150, -0.834761781746095720, -0.834789311265999650, -0.834816838698930310, -0.834844364044818770, -0.834871887303596400, -0.834899408475194500, +-0.834926927559543900, -0.834954444556576190, -0.834981959466222110, -0.835009472288413160, -0.835036983023080490, -0.835064491670155400, -0.835091998229569370, -0.835119502701253010, +-0.835147005085137950, -0.835174505381155560, -0.835202003589236690, -0.835229499709312820, -0.835256993741315230, -0.835284485685175100, -0.835311975540824040, -0.835339463308192860, +-0.835366948987212980, -0.835394432577815870, -0.835421914079932600, -0.835449393493494450, -0.835476870818432800, -0.835504346054679160, -0.835531819202164570, -0.835559290260820320, +-0.835586759230578120, -0.835614226111368820, -0.835641690903123900, -0.835669153605774760, -0.835696614219252680, -0.835724072743489480, -0.835751529178415660, -0.835778983523963180, +-0.835806435780063420, -0.835833885946647310, -0.835861334023646490, -0.835888780010992320, -0.835916223908616200, -0.835943665716449850, -0.835971105434423990, -0.835998543062470350, +-0.836025978600520750, -0.836053412048505810, -0.836080843406357350, -0.836108272674006890, -0.836135699851385920, -0.836163124938425480, -0.836190547935057200, -0.836217968841212800, +-0.836245387656823210, -0.836272804381820170, -0.836300219016135160, -0.836327631559699580, -0.836355042012445150, -0.836382450374302920, -0.836409856645204510, -0.836437260825081740, +-0.836464662913865450, -0.836492062911487700, -0.836519460817879650, -0.836546856632973010, -0.836574250356699410, -0.836601641988990010, -0.836629031529776750, -0.836656418978990680, +-0.836683804336563530, -0.836711187602426800, -0.836738568776512200, -0.836765947858751360, -0.836793324849075540, -0.836820699747416240, -0.836848072553705520, -0.836875443267874330, +-0.836902811889854600, -0.836930178419577840, -0.836957542856975540, -0.836984905201979660, -0.837012265454521340, -0.837039623614532320, -0.837066979681944430, -0.837094333656688950, +-0.837121685538697590, -0.837149035327901970, -0.837176383024234030, -0.837203728627624930, -0.837231072138006520, -0.837258413555310610, -0.837285752879468490, -0.837313090110411880, +-0.837340425248072620, -0.837367758292382300, -0.837395089243272770, -0.837422418100675410, -0.837449744864521950, -0.837477069534744320, -0.837504392111273810, -0.837531712594042240, +-0.837559030982981460, -0.837586347278023060, -0.837613661479099100, -0.837640973586140760, -0.837668283599079850, -0.837695591517848560, -0.837722897342378150, -0.837750201072600340, +-0.837777502708447090, -0.837804802249850320, -0.837832099696741330, -0.837859395049052050, -0.837886688306714530, -0.837913979469660060, -0.837941268537820690, -0.837968555511128140, +-0.837995840389514140, -0.838023123172910830, -0.838050403861249400, -0.838077682454462010, -0.838104958952480610, -0.838132233355236680, -0.838159505662662060, -0.838186775874688710, +-0.838214043991248440, -0.838241310012273310, -0.838268573937694610, -0.838295835767444820, -0.838323095501455120, -0.838350353139657670, -0.838377608681984300, -0.838404862128367070, +-0.838432113478737810, -0.838459362733028010, -0.838486609891169850, -0.838513854953095380, -0.838541097918735990, -0.838568338788023950, -0.838595577560890980, -0.838622814237269140, +-0.838650048817090490, -0.838677281300286400, -0.838704511686789170, -0.838731739976530940, -0.838758966169443120, -0.838786190265457860, -0.838813412264507010, -0.838840632166523050, +-0.838867849971437150, -0.838895065679181710, -0.838922279289688770, -0.838949490802889940, -0.838976700218717400, -0.839003907537103080, -0.839031112757978930, -0.839058315881277330, +-0.839085516906929670, -0.839112715834868240, -0.839139912665025190, -0.839167107397332130, -0.839194300031721350, -0.839221490568124890, -0.839248679006474600, -0.839275865346702840, +-0.839303049588741250, -0.839330231732522190, -0.839357411777977400, -0.839384589725039040, -0.839411765573639170, -0.839438939323709940, -0.839466110975183640, -0.839493280527991770, +-0.839520447982066600, -0.839547613337340740, -0.839574776593745460, -0.839601937751213280, -0.839629096809676350, -0.839656253769066610, -0.839683408629316450, -0.839710561390357490, +-0.839737712052122220, -0.839764860614542810, -0.839792007077551080, -0.839819151441079330, -0.839846293705059700, -0.839873433869424590, -0.839900571934105610, -0.839927707899035260, +-0.839954841764145810, -0.839981973529369100, -0.840009103194637400, -0.840036230759882980, -0.840063356225037920, -0.840090479590034690, -0.840117600854805140, -0.840144720019281530, +-0.840171837083396380, -0.840198952047081280, -0.840226064910268970, -0.840253175672891370, -0.840280284334880890, -0.840307390896170010, -0.840334495356690250, -0.840361597716374310, +-0.840388697975154700, -0.840415796132963020, -0.840442892189731890, -0.840469986145393590, -0.840497077999880490, -0.840524167753124440, -0.840551255405058040, -0.840578340955613680, +-0.840605424404723190, -0.840632505752319180, -0.840659584998333930, -0.840686662142699710, -0.840713737185349030, -0.840740810126213820, -0.840767880965226590, -0.840794949702319940, +-0.840822016337425590, -0.840849080870476160, -0.840876143301404140, -0.840903203630141700, -0.840930261856621560, -0.840957317980775440, -0.840984372002536280, -0.841011423921836030, +-0.841038473738607180, -0.841065521452782020, -0.841092567064293250, -0.841119610573073160, -0.841146651979053920, -0.841173691282168010, -0.841200728482348060, -0.841227763579526000, +-0.841254796573634670, -0.841281827464606340, -0.841308856252373390, -0.841335882936868560, -0.841362907518023670, -0.841389929995771670, -0.841416950370045050, -0.841443968640775750, +-0.841470984807896620, -0.841497998871339910, -0.841525010831038260, -0.841552020686924360, -0.841579028438930180, -0.841606034086988640, -0.841633037631031700, -0.841660039070992290, +-0.841687038406802700, -0.841714035638395530, -0.841741030765703280, -0.841768023788658670, -0.841795014707194090, -0.841822003521241590, -0.841848990230734230, -0.841875974835604280, +-0.841902957335784460, -0.841929937731207280, -0.841956916021805450, -0.841983892207511020, -0.842010866288257160, -0.842037838263975940, -0.842064808134600050, -0.842091775900062120, +-0.842118741560294870, -0.842145705115230680, -0.842172666564802500, -0.842199625908942370, -0.842226583147583470, -0.842253538280657850, -0.842280491308098340, -0.842307442229837670, +-0.842334391045808430, -0.842361337755943350, -0.842388282360174710, -0.842415224858435670, -0.842442165250658290, -0.842469103536775510, -0.842496039716719940, -0.842522973790424290, +-0.842549905757821180, -0.842576835618843560, -0.842603763373423580, -0.842630689021494520, -0.842657612562988430, -0.842684533997838270, -0.842711453325976860, -0.842738370547336800, +-0.842765285661850830, -0.842792198669451880, -0.842819109570072110, -0.842846018363644920, -0.842872925050102360, -0.842899829629377480, -0.842926732101403120, -0.842953632466111880, +-0.842980530723436820, -0.843007426873310100, -0.843034320915665210, -0.843061212850434120, -0.843088102677550080, -0.843114990396945820, -0.843141876008553950, -0.843168759512307520, +-0.843195640908139370, -0.843222520195981980, -0.843249397375768430, -0.843276272447431200, -0.843303145410903230, -0.843330016266117370, -0.843356885013006540, -0.843383751651503480, +-0.843410616181541340, -0.843437478603052520, -0.843464338915969840, -0.843491197120226350, -0.843518053215754790, -0.843544907202488200, -0.843571759080359310, -0.843598608849301160, +-0.843625456509246360, -0.843652302060128090, -0.843679145501878950, -0.843705986834431760, -0.843732826057719710, -0.843759663171675610, -0.843786498176232410, -0.843813331071323060, +-0.843840161856880160, -0.843866990532837200, -0.843893817099126480, -0.843920641555681250, -0.843947463902434250, -0.843974284139318740, -0.844001102266267790, -0.844027918283213770, +-0.844054732190090200, -0.844081543986829550, -0.844108353673365120, -0.844135161249629730, -0.844161966715556430, -0.844188770071078290, -0.844215571316128340, -0.844242370450639320, +-0.844269167474544610, -0.844295962387776710, -0.844322755190268890, -0.844349545881954210, -0.844376334462765720, -0.844403120932636360, -0.844429905291499420, -0.844456687539287380, +-0.844483467675933960, -0.844510245701371680, -0.844537021615533680, -0.844563795418353250, -0.844590567109763210, -0.844617336689697070, -0.844644104158087330, -0.844670869514867580, +-0.844697632759970340, -0.844724393893329100, -0.844751152914876900, -0.844777909824546700, -0.844804664622271880, -0.844831417307985500, -0.844858167881620380, -0.844884916343110140, +-0.844911662692387270, -0.844938406929385270, -0.844965149054037300, -0.844991889066276540, -0.845018626966035910, -0.845045362753249040, -0.845072096427848640, -0.845098827989767880, +-0.845125557438940020, -0.845152284775298250, -0.845179009998775820, -0.845205733109305800, -0.845232454106821680, -0.845259172991256190, -0.845285889762543040, -0.845312604420614950, +-0.845339316965405320, -0.845366027396847410, -0.845392735714874390, -0.845419441919419530, -0.845446146010416340, -0.845472847987797650, -0.845499547851496950, -0.845526245601447180, +-0.845552941237581730, -0.845579634759834000, -0.845606326168137130, -0.845633015462424750, -0.845659702642629570, -0.845686387708685320, -0.845713070660524920, -0.845739751498081780, +-0.845766430221289390, -0.845793106830080800, -0.845819781324389510, -0.845846453704149010, -0.845873123969292040, -0.845899792119752640, -0.845926458155463410, -0.845953122076358090, +-0.845979783882369940, -0.846006443573432350, -0.846033101149478610, -0.846059756610442410, -0.846086409956256610, -0.846113061186854920, -0.846139710302170390, -0.846166357302136630, +-0.846193002186686920, -0.846219644955754750, -0.846246285609273620, -0.846272924147176590, -0.846299560569397480, -0.846326194875869240, -0.846352827066525590, -0.846379457141299810, +-0.846406085100125270, -0.846432710942935710, -0.846459334669664500, -0.846485956280244700, -0.846512575774610370, -0.846539193152694210, -0.846565808414430190, -0.846592421559751560, +-0.846619032588591950, -0.846645641500884950, -0.846672248296563620, -0.846698852975561910, -0.846725455537812870, -0.846752055983250100, -0.846778654311807210, -0.846805250523417710, +-0.846831844618015190, -0.846858436595533170, -0.846885026455904800, -0.846911614199064130, -0.846938199824944230, -0.846964783333478800, -0.846991364724601460, -0.847017943998245700, +-0.847044521154345030, -0.847071096192833270, -0.847097669113643590, -0.847124239916709930, -0.847150808601965450, -0.847177375169343990, -0.847203939618779160, -0.847230501950204330, +-0.847257062163553560, -0.847283620258759810, -0.847310176235757330, -0.847336730094479180, -0.847363281834859210, -0.847389831456831000, -0.847416378960328180, -0.847442924345284450, +-0.847469467611633660, -0.847496008759308970, -0.847522547788244540, -0.847549084698373420, -0.847575619489629560, -0.847602152161946790, -0.847628682715258490, -0.847655211149498600, +-0.847681737464600850, -0.847708261660498510, -0.847734783737125850, -0.847761303694415820, -0.847787821532302700, -0.847814337250719970, -0.847840850849601370, -0.847867362328880940, +-0.847893871688491840, -0.847920378928368250, -0.847946884048443540, -0.847973387048651550, -0.847999887928926110, -0.848026386689201050, -0.848052883329409870, -0.848079377849486840, +-0.848105870249365120, -0.848132360528978890, -0.848158848688261520, -0.848185334727147190, -0.848211818645569380, -0.848238300443462050, -0.848264780120759230, -0.848291257677394110, +-0.848317733113301160, -0.848344206428413680, -0.848370677622665600, -0.848397146695990980, -0.848423613648323420, -0.848450078479596750, -0.848476541189745140, -0.848503001778702080, +-0.848529460246401520, -0.848555916592777290, -0.848582370817763110, -0.848608822921293140, -0.848635272903300990, -0.848661720763720710, -0.848688166502486350, -0.848714610119531420, +-0.848741051614790190, -0.848767490988196040, -0.848793928239683140, -0.848820363369185430, -0.848846796376636850, -0.848873227261971450, -0.848899656025122850, -0.848926082666025210, +-0.848952507184612240, -0.848978929580818000, -0.849005349854576320, -0.849031768005821360, -0.849058184034486960, -0.849084597940507390, -0.849111009723816030, -0.849137419384347390, +-0.849163826922034960, -0.849190232336813010, -0.849216635628615490, -0.849243036797376340, -0.849269435843029610, -0.849295832765509460, -0.849322227564749840, -0.849348620240684250, +-0.849375010793247290, -0.849401399222372680, -0.849427785527994690, -0.849454169710047170, -0.849480551768464380, -0.849506931703180150, -0.849533309514128640, -0.849559685201243700, +-0.849586058764459580, -0.849612430203710360, -0.849638799518929950, -0.849665166710052660, -0.849691531777012620, -0.849717894719743460, -0.849744255538179890, -0.849770614232255420, +-0.849796970801904420, -0.849823325247060950, -0.849849677567659170, -0.849876027763633470, -0.849902375834917460, -0.849928721781445740, -0.849955065603152040, -0.849981407299970630, +-0.850007746871835670, -0.850034084318681330, -0.850060419640441770, -0.850086752837051480, -0.850113083908444090, -0.850139412854554080, -0.850165739675315390, -0.850192064370662410, +-0.850218386940529200, -0.850244707384850030, -0.850271025703559060, -0.850297341896590900, -0.850323655963878930, -0.850349967905358220, -0.850376277720962360, -0.850402585410625740, +-0.850428890974282650, -0.850455194411867340, -0.850481495723314330, -0.850507794908557320, -0.850534091967531050, -0.850560386900169330, -0.850586679706406560, -0.850612970386177230, +-0.850639258939415390, -0.850665545366055430, -0.850691829666031850, -0.850718111839278370, -0.850744391885729920, -0.850770669805320230, -0.850796945597983910, -0.850823219263655230, +-0.850849490802268460, -0.850875760213757990, -0.850902027498058320, -0.850928292655103610, -0.850954555684828030, -0.850980816587165960, -0.851007075362051780, -0.851033332009420000, +-0.851059586529204880, -0.851085838921341040, -0.851112089185762310, -0.851138337322403630, -0.851164583331198930, -0.851190827212082720, -0.851217068964989390, -0.851243308589853420, +-0.851269546086609210, -0.851295781455191360, -0.851322014695533810, -0.851348245807571510, -0.851374474791238290, -0.851400701646468970, -0.851426926373197830, -0.851453148971359370, +-0.851479369440888310, -0.851505587781718590, -0.851531803993785030, -0.851558018077021810, -0.851584230031363630, -0.851610439856744780, -0.851636647553099760, -0.851662853120363270, +-0.851689056558469830, -0.851715257867353470, -0.851741457046949260, -0.851767654097191130, -0.851793849018013920, -0.851820041809352000, -0.851846232471140000, -0.851872421003312510, +-0.851898607405804030, -0.851924791678548950, -0.851950973821482100, -0.851977153834537540, -0.852003331717650080, -0.852029507470754340, -0.852055681093784820, -0.852081852586676350, +-0.852108021949362970, -0.852134189181779860, -0.852160354283860940, -0.852186517255541180, -0.852212678096755050, -0.852238836807437390, -0.852264993387522480, -0.852291147836945370, +-0.852317300155640220, -0.852343450343541980, -0.852369598400584900, -0.852395744326703840, -0.852421888121833390, -0.852448029785908280, -0.852474169318863110, -0.852500306720632710, +-0.852526441991151460, -0.852552575130353980, -0.852578706138174990, -0.852604835014549310, -0.852630961759411440, -0.852657086372696220, -0.852683208854338570, -0.852709329204272560, +-0.852735447422433570, -0.852761563508755650, -0.852787677463173850, -0.852813789285622900, -0.852839898976037400, -0.852866006534352180, -0.852892111960502300, -0.852918215254421690, +-0.852944316416045960, -0.852970415445309050, -0.852996512342146240, -0.853022607106492030, -0.853048699738281350, -0.853074790237449250, -0.853100878603929800, -0.853126964837658490, +-0.853153048938569470, -0.853179130906597800, -0.853205210741678320, -0.853231288443745850, -0.853257364012735220, -0.853283437448581370, -0.853309508751218580, -0.853335577920582460, +-0.853361644956607050, -0.853387709859227410, -0.853413772628378700, -0.853439833263995420, -0.853465891766012620, -0.853491948134365350, -0.853518002368987890, -0.853544054469815740, +-0.853570104436783160, -0.853596152269825330, -0.853622197968877170, -0.853648241533873420, -0.853674282964749340, -0.853700322261439330, -0.853726359423878760, -0.853752394452002130, +-0.853778427345744380, -0.853804458105040690, -0.853830486729825750, -0.853856513220034640, -0.853882537575602510, -0.853908559796463740, -0.853934579882553830, -0.853960597833807180, +-0.853986613650159150, -0.854012627331544480, -0.854038638877898330, -0.854064648289155740, -0.854090655565251320, -0.854116660706120580, -0.854142663711697890, -0.854168664581918420, +-0.854194663316717450, -0.854220659916029800, -0.854246654379790420, -0.854272646707934790, -0.854298636900397200, -0.854324624957113250, -0.854350610878017450, -0.854376594663045270, +-0.854402576312131460, -0.854428555825211270, -0.854454533202219760, -0.854480508443092090, -0.854506481547762880, -0.854532452516167720, -0.854558421348241230, -0.854584388043918670, +-0.854610352603135110, -0.854636315025825710, -0.854662275311925730, -0.854688233461369910, -0.854714189474093610, -0.854740143350031680, -0.854766095089119380, -0.854792044691291890, +-0.854817992156484240, -0.854843937484631610, -0.854869880675669380, -0.854895821729532160, -0.854921760646155660, -0.854947697425474500, -0.854973632067424160, -0.854999564571939710, +-0.855025494938956410, -0.855051423168409320, -0.855077349260233820, -0.855103273214364860, -0.855129195030737810, -0.855155114709287620, -0.855181032249949680, -0.855206947652659030, +-0.855232860917351180, -0.855258772043961280, -0.855284681032424280, -0.855310587882675780, -0.855336492594650610, -0.855362395168284160, -0.855388295603511710, -0.855414193900268630, +-0.855440090058489980, -0.855465984078111360, -0.855491875959067620, -0.855517765701294230, -0.855543653304726370, -0.855569538769299310, -0.855595422094948430, -0.855621303281608900, +-0.855647182329216440, -0.855673059237705870, -0.855698934007012690, -0.855724806637072070, -0.855750677127819380, -0.855776545479190130, -0.855802411691119370, -0.855828275763542590, +-0.855854137696395400, -0.855879997489612630, -0.855905855143130110, -0.855931710656882670, -0.855957564030806030, -0.855983415264835350, -0.856009264358906230, -0.856035111312953960, +-0.856060956126914130, -0.856086798800721690, -0.856112639334312480, -0.856138477727621420, -0.856164313980584120, -0.856190148093136090, -0.856215980065212710, -0.856241809896749580, +-0.856267637587681650, -0.856293463137944970, -0.856319286547474360, -0.856345107816205430, -0.856370926944073910, -0.856396743931014950, -0.856422558776964160, -0.856448371481857150, +-0.856474182045629080, -0.856499990468215680, -0.856525796749552200, -0.856551600889574160, -0.856577402888217150, -0.856603202745416570, -0.856629000461108010, -0.856654796035227210, +-0.856680589467709310, -0.856706380758489820, -0.856732169907504340, -0.856757956914688480, -0.856783741779977740, -0.856809524503307610, -0.856835305084613810, -0.856861083523831610, +-0.856886859820896960, -0.856912633975744910, -0.856938405988311280, -0.856964175858531570, -0.856989943586341510, -0.857015709171676470, -0.857041472614472500, -0.857067233914664550, +-0.857092993072188780, -0.857118750086980240, -0.857144504958974980, -0.857170257688108280, -0.857196008274316080, -0.857221756717533980, -0.857247503017697370, -0.857273247174742070, +-0.857298989188603590, -0.857324729059217530, -0.857350466786519720, -0.857376202370445650, -0.857401935810931160, -0.857427667107912070, -0.857453396261323550, -0.857479123271101760, +-0.857504848137181860, -0.857530570859500020, -0.857556291437991610, -0.857582009872592480, -0.857607726163238330, -0.857633440309865210, -0.857659152312408080, -0.857684862170803420, +-0.857710569884986400, -0.857736275454892840, -0.857761978880458690, -0.857787680161619550, -0.857813379298311470, -0.857839076290469630, -0.857864771138030390, -0.857890463840929040, +-0.857916154399101520, -0.857941842812483530, -0.857967529081010930, -0.857993213204619630, -0.858018895183245480, -0.858044575016823850, -0.858070252705290910, -0.858095928248582270, +-0.858121601646633760, -0.858147272899381200, -0.858172942006760420, -0.858198608968707370, -0.858224273785158090, -0.858249936456047970, -0.858275596981312840, -0.858301255360888750, +-0.858326911594711530, -0.858352565682717010, -0.858378217624841120, -0.858403867421019820, -0.858429515071188700, -0.858455160575283930, -0.858480803933241110, -0.858506445144996300, +-0.858532084210485320, -0.858557721129644120, -0.858583355902408640, -0.858608988528715030, -0.858634619008498690, -0.858660247341695990, -0.858685873528242550, -0.858711497568074410, +-0.858737119461127410, -0.858762739207337700, -0.858788356806641340, -0.858813972258973930, -0.858839585564271760, -0.858865196722470410, -0.858890805733506070, -0.858916412597314660, +-0.858942017313832350, -0.858967619882994860, -0.858993220304738680, -0.859018818578999090, -0.859044414705712690, -0.859070008684815090, -0.859095600516242450, -0.859121190199930830, +-0.859146777735816270, -0.859172363123834710, -0.859197946363922440, -0.859223527456015160, -0.859249106400049150, -0.859274683195960230, -0.859300257843684690, -0.859325830343158350, +-0.859351400694317590, -0.859376968897098470, -0.859402534951436700, -0.859428098857268790, -0.859453660614530430, -0.859479220223157920, -0.859504777683087420, -0.859530332994254850, +-0.859555886156596620, -0.859581437170048760, -0.859606986034547100, -0.859632532750028270, -0.859658077316427850, -0.859683619733682240, -0.859709160001727590, -0.859734698120499960, +-0.859760234089935630, -0.859785767909970970, -0.859811299580541920, -0.859836829101584320, -0.859862356473034660, -0.859887881694829210, -0.859913404766903920, -0.859938925689195170, +-0.859964444461639330, -0.859989961084172250, -0.860015475556730300, -0.860040987879249540, -0.860066498051666350, -0.860092006073916890, -0.860117511945937440, -0.860143015667664160, +-0.860168517239033540, -0.860194016659981520, -0.860219513930444490, -0.860245009050358610, -0.860270502019660150, -0.860295992838285510, -0.860321481506170830, -0.860346968023252610, +-0.860372452389466800, -0.860397934604750110, -0.860423414669038380, -0.860448892582267980, -0.860474368344375520, -0.860499841955297050, -0.860525313414968960, -0.860550782723327860, +-0.860576249880309560, -0.860601714885850800, -0.860627177739887620, -0.860652638442356510, -0.860678096993193640, -0.860703553392335730, -0.860729007639718820, -0.860754459735279640, +-0.860779909678954120, -0.860805357470678990, -0.860830803110390290, -0.860856246598024620, -0.860881687933518270, -0.860907127116807720, -0.860932564147829480, -0.860957999026519700, +-0.860983431752815220, -0.861008862326651860, -0.861034290747966340, -0.861059717016695040, -0.861085141132774570, -0.861110563096141090, -0.861135982906731550, -0.861161400564481870, +-0.861186816069328790, -0.861212229421208560, -0.861237640620057700, -0.861263049665812690, -0.861288456558410130, -0.861313861297786310, -0.861339263883878160, -0.861364664316621840, +-0.861390062595953740, -0.861415458721810360, -0.861440852694128290, -0.861466244512844150, -0.861491634177894430, -0.861517021689215850, -0.861542407046744450, -0.861567790250417300, +-0.861593171300170440, -0.861618550195940580, -0.861643926937664450, -0.861669301525278430, -0.861694673958719130, -0.861720044237923480, -0.861745412362827420, -0.861770778333368010, +-0.861796142149481530, -0.861821503811104670, -0.861846863318174060, -0.861872220670626190, -0.861897575868398100, -0.861922928911425860, -0.861948279799646390, -0.861973628532996190, +-0.861998975111411770, -0.862024319534829940, -0.862049661803187320, -0.862075001916420610, -0.862100339874466550, -0.862125675677261390, -0.862151009324742310, -0.862176340816845470, +-0.862201670153507790, -0.862226997334666010, -0.862252322360256620, -0.862277645230216440, -0.862302965944482410, -0.862328284502990710, -0.862353600905678590, -0.862378915152482220, +-0.862404227243338430, -0.862429537178184270, -0.862454844956956120, -0.862480150579591150, -0.862505454046025630, -0.862530755356196610, -0.862556054510040470, -0.862581351507494270, +-0.862606646348494600, -0.862631939032978410, -0.862657229560882310, -0.862682517932143340, -0.862707804146697900, -0.862733088204483240, -0.862758370105435550, -0.862783649849491960, +-0.862808927436589210, -0.862834202866664120, -0.862859476139653860, -0.862884747255494580, -0.862910016214123670, -0.862935283015477510, -0.862960547659493150, -0.862985810146107420, +-0.863011070475257270, -0.863036328646879290, -0.863061584660910760, -0.863086838517288070, -0.863112090215948480, -0.863137339756828490, -0.863162587139865050, -0.863187832364995190, +-0.863213075432155860, -0.863238316341283670, -0.863263555092316000, -0.863288791685189240, -0.863314026119840650, -0.863339258396206840, -0.863364488514224870, -0.863389716473831670, +-0.863414942274964180, -0.863440165917559570, -0.863465387401554320, -0.863490606726885820, -0.863515823893490580, -0.863541038901305740, -0.863566251750268350, -0.863591462440315260, +-0.863616670971383620, -0.863641877343410470, -0.863667081556332430, -0.863692283610086880, -0.863717483504610420, -0.863742681239840220, -0.863767876815713320, -0.863793070232166780, +-0.863818261489137540, -0.863843450586562870, -0.863868637524379590, -0.863893822302524430, -0.863919004920934760, -0.863944185379547540, -0.863969363678299910, -0.863994539817128810, +-0.864019713795971640, -0.864044885614765000, -0.864070055273446270, -0.864095222771952280, -0.864120388110220180, -0.864145551288187150, -0.864170712305790120, -0.864195871162966480, +-0.864221027859653270, -0.864246182395787320, -0.864271334771306020, -0.864296484986146310, -0.864321633040245340, -0.864346778933540280, -0.864371922665968300, -0.864397064237466650, +-0.864422203647972180, -0.864447340897422480, -0.864472475985754050, -0.864497608912904610, -0.864522739678811100, -0.864547868283410680, -0.864572994726640620, -0.864598119008438300, +-0.864623241128740450, -0.864648361087484660, -0.864673478884607880, -0.864698594520047270, -0.864723707993740210, -0.864748819305623970, -0.864773928455635610, -0.864799035443712620, +-0.864824140269791930, -0.864849242933811050, -0.864874343435706790, -0.864899441775416670, -0.864924537952878050, -0.864949631968027990, -0.864974723820804090, -0.864999813511143190, +-0.865024901038983000, -0.865049986404260340, -0.865075069606912610, -0.865100150646877290, -0.865125229524091540, -0.865150306238492760, -0.865175380790018430, -0.865200453178605500, +-0.865225523404191570, -0.865250591466713570, -0.865275657366109120, -0.865300721102315600, -0.865325782675270270, -0.865350842084910420, -0.865375899331173760, -0.865400954413997230, +-0.865426007333318200, -0.865451058089074080, -0.865476106681202450, -0.865501153109640380, -0.865526197374325570, -0.865551239475195410, -0.865576279412186960, -0.865601317185238030, +-0.865626352794285570, -0.865651386239267180, -0.865676417520120370, -0.865701446636782500, -0.865726473589191080, -0.865751498377283710, -0.865776521000997330, -0.865801541460269770, +-0.865826559755038190, -0.865851575885240310, -0.865876589850813390, -0.865901601651695050, -0.865926611287822890, -0.865951618759134070, -0.865976624065566300, -0.866001627207056870, +-0.866026628183543260, -0.866051626994963190, -0.866076623641253930, -0.866101618122353200, -0.866126610438198610, -0.866151600588727310, -0.866176588573877140, -0.866201574393585360, +-0.866226558047789700, -0.866251539536427530, -0.866276518859436570, -0.866301496016754210, -0.866326471008318500, -0.866351443834066260, -0.866376414493935650, -0.866401382987863840, +-0.866426349315788550, -0.866451313477647370, -0.866476275473377910, -0.866501235302918000, -0.866526192966204810, -0.866551148463176270, -0.866576101793769760, -0.866601052957922890, +-0.866626001955573380, -0.866650948786658940, -0.866675893451117170, -0.866700835948885810, -0.866725776279902100, -0.866750714444104230, -0.866775650441429350, -0.866800584271815280, +-0.866825515935199850, -0.866850445431520570, -0.866875372760715250, -0.866900297922721610, -0.866925220917477260, -0.866950141744919690, -0.866975060404986730, -0.866999976897616100, +-0.867024891222745510, -0.867049803380312790, -0.867074713370255660, -0.867099621192511600, -0.867124526847018680, -0.867149430333714280, -0.867174331652536210, -0.867199230803422430, +-0.867224127786310530, -0.867249022601138230, -0.867273915247843700, -0.867298805726364090, -0.867323694036637670, -0.867348580178601950, -0.867373464152194630, -0.867398345957353660, +-0.867423225594016860, -0.867448103062122280, -0.867472978361607080, -0.867497851492409770, -0.867522722454467600, -0.867547591247718520, -0.867572457872100580, -0.867597322327551380, +-0.867622184614008970, -0.867647044731411300, -0.867671902679695850, -0.867696758458800790, -0.867721612068663610, -0.867746463509222470, -0.867771312780415080, -0.867796159882179400, +-0.867821004814453460, -0.867845847577175090, -0.867870688170281900, -0.867895526593712270, -0.867920362847403590, -0.867945196931294020, -0.867970028845321370, -0.867994858589423710, +-0.868019686163539190, -0.868044511567605090, -0.868069334801560010, -0.868094155865341440, -0.868118974758887330, -0.868143791482135940, -0.868168606035024990, -0.868193418417492540, +-0.868218228629476730, -0.868243036670915180, -0.868267842541746270, -0.868292646241907500, -0.868317447771337130, -0.868342247129973100, -0.868367044317753470, -0.868391839334616170, +-0.868416632180499580, -0.868441422855341430, -0.868466211359079420, -0.868490997691651940, -0.868515781852996940, -0.868540563843052560, -0.868565343661756640, -0.868590121309047670, +-0.868614896784863140, -0.868639670089141670, -0.868664441221820630, -0.868689210182838620, -0.868713976972133590, -0.868738741589643590, -0.868763504035306780, -0.868788264309061310, +-0.868813022410845020, -0.868837778340596500, -0.868862532098253150, -0.868887283683753560, -0.868912033097035800, -0.868936780338037900, -0.868961525406698240, -0.868986268302954560, +-0.869011009026745440, -0.869035747578008610, -0.869060483956682450, -0.869085218162705010, -0.869109950196014560, -0.869134680056549150, -0.869159407744247380, -0.869184133259046750, +-0.869208856600886090, -0.869233577769703000, -0.869258296765436090, -0.869283013588023290, -0.869307728237403100, -0.869332440713513450, -0.869357151016293070, -0.869381859145679450, +-0.869406565101611520, -0.869431268884026890, -0.869455970492864050, -0.869480669928061390, -0.869505367189556950, -0.869530062277289350, -0.869554755191196400, -0.869579445931216830, +-0.869604134497288350, -0.869628820889349560, -0.869653505107338630, -0.869678187151194050, -0.869702867020853980, -0.869727544716256910, -0.869752220237340890, -0.869776893584044420, +-0.869801564756305550, -0.869826233754062650, -0.869850900577254340, -0.869875565225818660, -0.869900227699694330, -0.869924887998819170, -0.869949546123132130, -0.869974202072570920, +-0.869998855847074150, -0.870023507446580300, -0.870048156871027660, -0.870072804120354700, -0.870097449194499940, -0.870122092093401190, -0.870146732816997610, -0.870171371365226930, +-0.870196007738027740, -0.870220641935338660, -0.870245273957097830, -0.870269903803243870, -0.870294531473715490, -0.870319156968450410, -0.870343780287387680, -0.870368401430465340, +-0.870393020397622010, -0.870417637188796060, -0.870442251803925980, -0.870466864242950610, -0.870491474505807770, -0.870516082592436510, -0.870540688502774770, -0.870565292236761380, +-0.870589893794334710, -0.870614493175433380, -0.870639090379995760, -0.870663685407960690, -0.870688278259266090, -0.870712868933851030, -0.870737457431653650, -0.870762043752612570, +-0.870786627896666390, -0.870811209863753710, -0.870835789653812920, -0.870860367266782840, -0.870884942702601970, -0.870909515961208470, -0.870934087042541160, -0.870958655946538650, +-0.870983222673139430, -0.871007787222282230, -0.871032349593905740, -0.871056909787948250, -0.871081467804348590, -0.871106023643045120, -0.871130577303976580, -0.871155128787081570, +-0.871179678092298680, -0.871204225219566750, -0.871228770168824380, -0.871253312940009850, -0.871277853533062310, -0.871302391947919920, -0.871326928184521510, -0.871351462242805800, +-0.871375994122711380, -0.871400523824177210, -0.871425051347141540, -0.871449576691543440, -0.871474099857321270, -0.871498620844413760, -0.871523139652759740, -0.871547656282297800, +-0.871572170732966780, -0.871596683004705610, -0.871621193097452450, -0.871645701011146470, -0.871670206745726150, -0.871694710301130220, -0.871719211677297490, -0.871743710874166800, +-0.871768207891676750, -0.871792702729766500, -0.871817195388374210, -0.871841685867439150, -0.871866174166899710, -0.871890660286694820, -0.871915144226763310, -0.871939625987043890, +-0.871964105567475610, -0.871988582967996860, -0.872013058188546910, -0.872037531229064020, -0.872062002089487360, -0.872086470769755650, -0.872110937269807820, -0.872135401589582580, +-0.872159863729019100, -0.872184323688055760, -0.872208781466631830, -0.872233237064685700, -0.872257690482156510, -0.872282141718983110, -0.872306590775104310, -0.872331037650458940, +-0.872355482344986390, -0.872379924858625030, -0.872404365191313590, -0.872428803342991330, -0.872453239313596970, -0.872477673103069670, -0.872502104711348040, -0.872526534138371450, +-0.872550961384078280, -0.872575386448407820, -0.872599809331298880, -0.872624230032690300, -0.872648648552521110, -0.872673064890730380, -0.872697479047256920, -0.872721891022040010, +-0.872746300815018140, -0.872770708426130800, -0.872795113855316380, -0.872819517102514260, -0.872843918167663380, -0.872868317050702560, -0.872892713751571290, -0.872917108270207960, +-0.872941500606552070, -0.872965890760542210, -0.872990278732117650, -0.873014664521217340, -0.873039048127780440, -0.873063429551745980, -0.873087808793053030, -0.873112185851640410, +-0.873136560727447500, -0.873160933420413010, -0.873185303930476220, -0.873209672257576060, -0.873234038401651810, -0.873258402362642410, -0.873282764140487220, -0.873307123735124980, +-0.873331481146495060, -0.873355836374536290, -0.873380189419187940, -0.873404540280389050, -0.873428888958078800, -0.873453235452196550, -0.873477579762681030, -0.873501921889471840, +-0.873526261832507590, -0.873550599591727650, -0.873574935167071190, -0.873599268558477360, -0.873623599765885440, -0.873647928789234810, -0.873672255628463960, -0.873696580283512820, +-0.873720902754320020, -0.873745223040824910, -0.873769541142966680, -0.873793857060684690, -0.873818170793917990, -0.873842482342606200, -0.873866791706688130, -0.873891098886102840, +-0.873915403880789810, -0.873939706690688320, -0.873964007315737530, -0.873988305755876720, -0.874012602011045360, -0.874036896081182290, -0.874061187966227230, -0.874085477666118880, +-0.874109765180796860, -0.874134050510200540, -0.874158333654268980, -0.874182614612941670, -0.874206893386157980, -0.874231169973856860, -0.874255444375978020, -0.874279716592460400, +-0.874303986623243490, -0.874328254468266560, -0.874352520127469000, -0.874376783600790410, -0.874401044888169610, -0.874425303989546320, -0.874449560904859700, -0.874473815634049130, +-0.874498068177054000, -0.874522318533813680, -0.874546566704267560, -0.874570812688355350, -0.874595056486015760, -0.874619298097188860, -0.874643537521813450, -0.874667774759829150, +-0.874692009811175450, -0.874716242675791730, -0.874740473353617490, -0.874764701844592100, -0.874788928148654830, -0.874813152265745520, -0.874837374195803100, -0.874861593938767170, +-0.874885811494577340, -0.874910026863172870, -0.874934240044493610, -0.874958451038478580, -0.874982659845067510, -0.875006866464199670, -0.875031070895814670, -0.875055273139851990, +-0.875079473196251120, -0.875103671064951570, -0.875127866745893050, -0.875152060239014600, -0.875176251544256270, -0.875200440661557110, -0.875224627590856840, -0.875248812332094950, +-0.875272994885211040, -0.875297175250144720, -0.875321353426835590, -0.875345529415223140, -0.875369703215246650, -0.875393874826845830, -0.875418044249960390, -0.875442211484529830, +-0.875466376530493750, -0.875490539387791870, -0.875514700056363560, -0.875538858536148660, -0.875563014827086320, -0.875587168929116480, -0.875611320842178740, -0.875635470566212710, +-0.875659618101158000, -0.875683763446954420, -0.875707906603541250, -0.875732047570858540, -0.875756186348845560, -0.875780322937442010, -0.875804457336587630, -0.875828589546222220, +-0.875852719566285520, -0.875876847396716780, -0.875900973037456070, -0.875925096488442860, -0.875949217749616760, -0.875973336820917710, -0.875997453702285320, -0.876021568393659190, +-0.876045680894979470, -0.876069791206185330, -0.876093899327216820, -0.876118005258013420, -0.876142108998515080, -0.876166210548661390, -0.876190309908392200, -0.876214407077647190, +-0.876238502056366440, -0.876262594844489100, -0.876286685441955650, -0.876310773848705150, -0.876334860064677760, -0.876358944089813190, -0.876383025924051260, -0.876407105567332030, +-0.876431183019594880, -0.876455258280779860, -0.876479331350826560, -0.876503402229674930, -0.876527470917264680, -0.876551537413535860, -0.876575601718428190, -0.876599663831881700, +-0.876623723753835900, -0.876647781484230950, -0.876671837023006330, -0.876695890370102090, -0.876719941525458180, -0.876743990489014410, -0.876768037260710840, -0.876792081840487070, +-0.876816124228283260, -0.876840164424038890, -0.876864202427694140, -0.876888238239188820, -0.876912271858462990, -0.876936303285456350, -0.876960332520109300, -0.876984359562361200, +-0.877008384412152340, -0.877032407069422320, -0.877056427534111280, -0.877080445806159180, -0.877104461885506060, -0.877128475772091630, -0.877152487465856390, -0.877176496966739610, +-0.877200504274681770, -0.877224509389622490, -0.877248512311502030, -0.877272513040260220, -0.877296511575837100, -0.877320507918172950, -0.877344502067207270, -0.877368494022880640, +-0.877392483785132460, -0.877416471353903100, -0.877440456729132620, -0.877464439910760950, -0.877488420898728140, -0.877512399692974570, -0.877536376293439720, -0.877560350700064220, +-0.877584322912787650, -0.877608292931550180, -0.877632260756291970, -0.877656226386953180, -0.877680189823473840, -0.877704151065794140, -0.877728110113853880, -0.877752066967593560, +-0.877776021626952900, -0.877799974091872160, -0.877823924362291510, -0.877847872438151100, -0.877871818319391100, -0.877895762005951430, -0.877919703497772490, -0.877943642794794200, +-0.877967579896956730, -0.877991514804200230, -0.878015447516464990, -0.878039378033691250, -0.878063306355819200, -0.878087232482788640, -0.878111156414540180, -0.878135078151013770, +-0.878158997692149560, -0.878182915037887810, -0.878206830188168810, -0.878230743142933030, -0.878254653902120100, -0.878278562465670710, -0.878302468833524810, -0.878326373005622660, +-0.878350274981904540, -0.878374174762310830, -0.878398072346781690, -0.878421967735257490, -0.878445860927678180, -0.878469751923984470, -0.878493640724116180, -0.878517527328013800, +-0.878541411735617510, -0.878565293946867780, -0.878589173961704770, -0.878613051780069100, -0.878636927401900470, -0.878660800827139820, -0.878684672055726980, -0.878708541087602430, +-0.878732407922706460, -0.878756272560979550, -0.878780135002362180, -0.878803995246794200, -0.878827853294216530, -0.878851709144568890, -0.878875562797792110, -0.878899414253826340, +-0.878923263512612070, -0.878947110574089590, -0.878970955438199590, -0.878994798104882010, -0.879018638574077580, -0.879042476845726450, -0.879066312919769000, -0.879090146796145830, +-0.879113978474797330, -0.879137807955663870, -0.879161635238686070, -0.879185460323804180, -0.879209283210958480, -0.879233103900089460, -0.879256922391137730, -0.879280738684043770, +-0.879304552778747860, -0.879328364675190930, -0.879352174373312700, -0.879375981873054320, -0.879399787174355850, -0.879423590277157770, -0.879447391181400810, -0.879471189887025330, +-0.879494986393971940, -0.879518780702181260, -0.879542572811593430, -0.879566362722149280, -0.879590150433789190, -0.879613935946453540, -0.879637719260083160, -0.879661500374618430, +-0.879685279290000180, -0.879709056006168550, -0.879732830523064500, -0.879756602840628180, -0.879780372958800290, -0.879804140877521460, -0.879827906596732270, -0.879851670116373330, +-0.879875431436385470, -0.879899190556708840, -0.879922947477284390, -0.879946702198052380, -0.879970454718953630, -0.879994205039928650, -0.880017953160918240, -0.880041699081862920, +-0.880065442802703600, -0.880089184323380460, -0.880112923643834530, -0.880136660764006100, -0.880160395683835970, -0.880184128403264990, -0.880207858922233520, -0.880231587240682730, +-0.880255313358552780, -0.880279037275784710, -0.880302758992318800, -0.880326478508095980, -0.880350195823057070, -0.880373910937142570, -0.880397623850293300, -0.880421334562450310, +-0.880445043073553650, -0.880468749383544580, -0.880492453492363490, -0.880516155399951210, -0.880539855106248550, -0.880563552611196340, -0.880587247914735190, -0.880610941016806150, +-0.880634631917349700, -0.880658320616306440, -0.880682007113617440, -0.880705691409223500, -0.880729373503065240, -0.880753053395083580, -0.880776731085219480, -0.880800406573413300, +-0.880824079859606310, -0.880847750943739020, -0.880871419825752230, -0.880895086505587010, -0.880918750983183950, -0.880942413258484100, -0.880966073331428400, -0.880989731201957340, +-0.881013386870012070, -0.881037040335533210, -0.881060691598461680, -0.881084340658738530, -0.881107987516304370, -0.881131632171100580, -0.881155274623067530, -0.881178914872146390, +-0.881202552918277760, -0.881226188761402800, -0.881249822401462430, -0.881273453838397390, -0.881297083072148710, -0.881320710102657670, -0.881344334929864530, -0.881367957553710780, +-0.881391577974136920, -0.881415196191084100, -0.881438812204493380, -0.881462426014305580, -0.881486037620461740, -0.881509647022902910, -0.881533254221569810, -0.881556859216403810, +-0.881580462007345520, -0.881604062594335990, -0.881627660977316260, -0.881651257156227500, -0.881674851131010740, -0.881698442901606590, -0.881722032467956550, -0.881745619830001330, +-0.881769204987681960, -0.881792787940939630, -0.881816368689715360, -0.881839947233950090, -0.881863523573585220, -0.881887097708561220, -0.881910669638819810, -0.881934239364301490, +-0.881957806884947510, -0.881981372200699170, -0.882004935311497260, -0.882028496217283080, -0.882052054917997760, -0.882075611413582370, -0.882099165703977840, -0.882122717789125210, +-0.882146267668965980, -0.882169815343440970, -0.882193360812491440, -0.882216904076058680, -0.882240445134083510, -0.882263983986507410, -0.882287520633271090, -0.882311055074316060, +-0.882334587309583360, -0.882358117339014150, -0.882381645162549690, -0.882405170780131360, -0.882428694191699890, -0.882452215397196760, -0.882475734396563020, -0.882499251189739930, +-0.882522765776668660, -0.882546278157290480, -0.882569788331546870, -0.882593296299378550, -0.882616802060727230, -0.882640305615533640, -0.882663806963739360, -0.882687306105285450, +-0.882710803040113400, -0.882734297768164260, -0.882757790289379620, -0.882781280603700310, -0.882804768711067940, -0.882828254611423450, -0.882851738304708420, -0.882875219790863920, +-0.882898699069831430, -0.882922176141552220, -0.882945651005967780, -0.882969123663018940, -0.882992594112647520, -0.883016062354794460, -0.883039528389401140, -0.883062992216409160, +-0.883086453835759570, -0.883109913247394070, -0.883133370451253620, -0.883156825447279910, -0.883180278235414010, -0.883203728815597280, -0.883227177187771330, -0.883250623351877430, +-0.883274067307856960, -0.883297509055651520, -0.883320948595202160, -0.883344385926450480, -0.883367821049337750, -0.883391253963805470, -0.883414684669795000, -0.883438113167247850, +-0.883461539456105620, -0.883484963536309340, -0.883508385407800860, -0.883531805070521200, -0.883555222524412100, -0.883578637769414920, -0.883602050805471050, -0.883625461632522090, +-0.883648870250509750, -0.883672276659374980, -0.883695680859059700, -0.883719082849505070, -0.883742482630652690, -0.883765880202444070, -0.883789275564820900, -0.883812668717724350, +-0.883836059661096460, -0.883859448394878180, -0.883882834919011540, -0.883906219233437480, -0.883929601338097950, -0.883952981232934420, -0.883976358917888390, -0.883999734392901690, +-0.884023107657915470, -0.884046478712871790, -0.884069847557711560, -0.884093214192376740, -0.884116578616808920, -0.884139940830949600, -0.884163300834740480, -0.884186658628123290, +-0.884210014211039290, -0.884233367583430410, -0.884256718745237920, -0.884280067696403550, -0.884303414436869110, -0.884326758966576200, -0.884350101285466210, -0.884373441393481290, +-0.884396779290562600, -0.884420114976652070, -0.884443448451691090, -0.884466779715621490, -0.884490108768384960, -0.884513435609923130, -0.884536760240177910, -0.884560082659090590, +-0.884583402866603310, -0.884606720862657350, -0.884630036647194420, -0.884653350220156560, -0.884676661581485280, -0.884699970731122280, -0.884723277669009600, -0.884746582395088630, +-0.884769884909301310, -0.884793185211589010, -0.884816483301893890, -0.884839779180157440, -0.884863072846321600, -0.884886364300328300, -0.884909653542118810, -0.884932940571635520, +-0.884956225388819570, -0.884979507993613020, -0.885002788385957810, -0.885026066565795520, -0.885049342533068220, -0.885072616287717610, -0.885095887829685290, -0.885119157158913540, +-0.885142424275343620, -0.885165689178917690, -0.885188951869577470, -0.885212212347264880, -0.885235470611921870, -0.885258726663490260, -0.885281980501911650, -0.885305232127128310, +-0.885328481539081720, -0.885351728737713950, -0.885374973722966810, -0.885398216494782230, -0.885421457053102270, -0.885444695397868520, -0.885467931529023260, -0.885491165446507860, +-0.885514397150264700, -0.885537626640235390, -0.885560853916362080, -0.885584078978586710, -0.885607301826851320, -0.885630522461097410, -0.885653740881267360, -0.885676957087302870, +-0.885700171079145890, -0.885723382856738570, -0.885746592420022740, -0.885769799768940440, -0.885793004903433820, -0.885816207823444720, -0.885839408528914960, -0.885862607019786590, +-0.885885803296001750, -0.885908997357502390, -0.885932189204230450, -0.885955378836128400, -0.885978566253137640, -0.886001751455200550, -0.886024934442259050, -0.886048115214255080, +-0.886071293771130920, -0.886094470112828490, -0.886117644239289850, -0.886140816150457370, -0.886163985846272540, -0.886187153326678080, -0.886210318591615480, -0.886233481641027110, +-0.886256642474854920, -0.886279801093041280, -0.886302957495528230, -0.886326111682257610, -0.886349263653171900, -0.886372413408212930, -0.886395560947322860, -0.886418706270443830, +-0.886441849377518130, -0.886464990268487680, -0.886488128943295100, -0.886511265401881960, -0.886534399644190780, -0.886557531670163490, -0.886580661479742350, -0.886603789072869520, +-0.886626914449487270, -0.886650037609537640, -0.886673158552963250, -0.886696277279705680, -0.886719393789707540, -0.886742508082910890, -0.886765620159257860, -0.886788730018690850, +-0.886811837661151900, -0.886834943086583620, -0.886858046294927820, -0.886881147286127100, -0.886904246060123300, -0.886927342616858900, -0.886950436956276070, -0.886973529078317170, +-0.886996618982924480, -0.887019706670040490, -0.887042792139607020, -0.887065875391566670, -0.887088956425861500, -0.887112035242433980, -0.887135111841226290, -0.887158186222180900, +-0.887181258385239980, -0.887204328330346130, -0.887227396057441500, -0.887250461566468140, -0.887273524857368550, -0.887296585930085310, -0.887319644784560490, -0.887342701420736570, +-0.887365755838556150, -0.887388808037961050, -0.887411858018894220, -0.887434905781297580, -0.887457951325113630, -0.887480994650284740, -0.887504035756753410, -0.887527074644462010, +-0.887550111313353040, -0.887573145763368650, -0.887596177994451670, -0.887619208006543920, -0.887642235799588230, -0.887665261373526970, -0.887688284728302520, -0.887711305863857490, +-0.887734324780134140, -0.887757341477075080, -0.887780355954622460, -0.887803368212718990, -0.887826378251307060, -0.887849386070329260, -0.887872391669727980, -0.887895395049445810, +-0.887918396209425030, -0.887941395149608460, -0.887964391869938250, -0.887987386370357010, -0.888010378650807340, -0.888033368711231620, -0.888056356551572560, -0.888079342171772870, +-0.888102325571774490, -0.888125306751520570, -0.888148285710953170, -0.888171262450015100, -0.888194236968648850, -0.888217209266796930, -0.888240179344402250, -0.888263147201406980, +-0.888286112837753940, -0.888309076253385510, -0.888332037448244290, -0.888354996422273110, -0.888377953175414350, -0.888400907707610710, -0.888423860018805020, -0.888446810108939440, +-0.888469757977957130, -0.888492703625800130, -0.888515647052411370, -0.888538588257733570, -0.888561527241709230, -0.888584464004281150, -0.888607398545392060, -0.888630330864984440, +-0.888653260963000790, -0.888676188839384040, -0.888699114494076790, -0.888722037927021760, -0.888744959138161650, -0.888767878127439290, -0.888790794894797180, -0.888813709440178120, +-0.888836621763524630, -0.888859531864779620, -0.888882439743885810, -0.888905345400785810, -0.888928248835422540, -0.888951150047738840, -0.888974049037676960, -0.888996945805180290, +-0.889019840350190990, -0.889042732672651990, -0.889065622772506340, -0.889088510649696520, -0.889111396304165690, -0.889134279735856130, -0.889157160944711090, -0.889180039930672960, +-0.889202916693684680, -0.889225791233689170, -0.889248663550629040, -0.889271533644447440, -0.889294401515087100, -0.889317267162490600, -0.889340130586601110, -0.889362991787361110, +-0.889385850764713550, -0.889408707518601460, -0.889431562048967560, -0.889454414355754790, -0.889477264438906180, -0.889500112298364230, -0.889522957934072100, -0.889545801345972500, +-0.889568642534008360, -0.889591481498122500, -0.889614318238258090, -0.889637152754358060, -0.889659985046364900, -0.889682815114221980, -0.889705642957871800, -0.889728468577257510, +-0.889751291972322170, -0.889774113143008470, -0.889796932089259580, -0.889819748811018440, -0.889842563308227860, -0.889865375580831010, -0.889888185628770480, -0.889910993451989540, +-0.889933799050431130, -0.889956602424038180, -0.889979403572753740, -0.890002202496521070, -0.890024999195282770, -0.890047793668981790, -0.890070585917561390, -0.890093375940964490, +-0.890116163739134160, -0.890138949312013430, -0.890161732659545460, -0.890184513781673070, -0.890207292678339530, -0.890230069349487560, -0.890252843795060420, -0.890275616015001160, +-0.890298386009252930, -0.890321153777758670, -0.890343919320461750, -0.890366682637304780, -0.890389443728231370, -0.890412202593184100, -0.890434959232106360, -0.890457713644941200, +-0.890480465831631760, -0.890503215792121440, -0.890525963526352720, -0.890548709034269410, -0.890571452315814140, -0.890594193370930150, -0.890616932199560730, -0.890639668801648910, +-0.890662403177138070, -0.890685135325971270, -0.890707865248091530, -0.890730592943442260, -0.890753318411966370, -0.890776041653607130, -0.890798762668307820, -0.890821481456011590, +-0.890844198016661700, -0.890866912350201430, -0.890889624456573710, -0.890912334335722140, -0.890935041987589550, -0.890957747412119420, -0.890980450609254790, -0.891003151578939170, +-0.891025850321115700, -0.891048546835727540, -0.891071241122718180, -0.891093933182030450, -0.891116623013607940, -0.891139310617393930, -0.891161995993331570, -0.891184679141364230, +-0.891207360061435420, -0.891230038753488050, -0.891252715217465740, -0.891275389453311420, -0.891298061460968570, -0.891320731240380690, -0.891343398791490940, -0.891366064114242910, +-0.891388727208579420, -0.891411388074444420, -0.891434046711780730, -0.891456703120531820, -0.891479357300641320, -0.891502009252052360, -0.891524658974708340, -0.891547306468552850, +-0.891569951733528930, -0.891592594769580420, -0.891615235576650120, -0.891637874154681760, -0.891660510503618720, -0.891683144623404370, -0.891705776513982200, -0.891728406175295810, +-0.891751033607288130, -0.891773658809903110, -0.891796281783083790, -0.891818902526773650, -0.891841521040916410, -0.891864137325455220, -0.891886751380333910, -0.891909363205495630, +-0.891931972800884100, -0.891954580166442360, -0.891977185302114230, -0.891999788207843090, -0.892022388883572550, -0.892044987329245980, -0.892067583544807200, -0.892090177530199260, +-0.892112769285365980, -0.892135358810250630, -0.892157946104796930, -0.892180531168948350, -0.892203114002648400, -0.892225694605840670, -0.892248272978468980, -0.892270849120476490, +-0.892293423031806810, -0.892315994712403420, -0.892338564162210130, -0.892361131381170460, -0.892383696369227870, -0.892406259126326320, -0.892428819652408940, -0.892451377947419690, +-0.892473934011301710, -0.892496487843999040, -0.892519039445455080, -0.892541588815613520, -0.892564135954417970, -0.892586680861812250, -0.892609223537739640, -0.892631763982144280, +-0.892654302194969220, -0.892676838176158390, -0.892699371925655520, -0.892721903443404190, -0.892744432729348340, -0.892766959783431120, -0.892789484605596820, -0.892812007195788460, +-0.892834527553950210, -0.892857045680025550, -0.892879561573958420, -0.892902075235692210, -0.892924586665171160, -0.892947095862338340, -0.892969602827138000, -0.892992107559513530, +-0.893014610059408740, -0.893037110326767360, -0.893059608361533310, -0.893082104163650190, -0.893104597733061940, -0.893127089069712170, -0.893149578173544680, -0.893172065044503190, +-0.893194549682531540, -0.893217032087573410, -0.893239512259572770, -0.893261990198473520, -0.893284465904219170, -0.893306939376753760, -0.893329410616020780, -0.893351879621964380, +-0.893374346394528280, -0.893396810933656190, -0.893419273239292160, -0.893441733311380220, -0.893464191149863640, -0.893486646754686810, -0.893509100125793100, -0.893531551263126780, +-0.893554000166631450, -0.893576446836251260, -0.893598891271929820, -0.893621333473611390, -0.893643773441239690, -0.893666211174758310, -0.893688646674111300, -0.893711079939242810, +-0.893733510970096570, -0.893755939766616600, -0.893778366328746960, -0.893800790656431140, -0.893823212749613630, -0.893845632608237790, -0.893868050232248020, -0.893890465621588030, +-0.893912878776201850, -0.893935289696033530, -0.893957698381027120, -0.893980104831126330, -0.894002509046275430, -0.894024911026418120, -0.894047310771498460, -0.894069708281460600, +-0.894092103556248460, -0.894114496595806220, -0.894136887400077570, -0.894159275969006790, -0.894181662302537820, -0.894204046400614570, -0.894226428263181220, -0.894248807890181800, +-0.894271185281560350, -0.894293560437261160, -0.894315933357227810, -0.894338304041404910, -0.894360672489736050, -0.894383038702165400, -0.894405402678637220, -0.894427764419095550, +-0.894450123923484550, -0.894472481191748270, -0.894494836223830750, -0.894517189019676250, -0.894539539579228600, -0.894561887902432070, -0.894584233989230810, -0.894606577839568980, +-0.894628919453390960, -0.894651258830640340, -0.894673595971261840, -0.894695930875199160, -0.894718263542396700, -0.894740593972798480, -0.894762922166348900, -0.894785248122991870, +-0.894807571842672010, -0.894829893325333030, -0.894852212570919400, -0.894874529579375190, -0.894896844350644540, -0.894919156884671830, -0.894941467181401220, -0.894963775240776970, +-0.894986081062743470, -0.895008384647244750, -0.895030685994224860, -0.895052985103628300, -0.895075281975399210, -0.895097576609481970, -0.895119869005820750, -0.895142159164360130, +-0.895164447085043840, -0.895186732767816680, -0.895209016212622500, -0.895231297419405660, -0.895253576388110650, -0.895275853118681740, -0.895298127611063200, -0.895320399865199510, +-0.895342669881034610, -0.895364937658513220, -0.895387203197579360, -0.895409466498177430, -0.895431727560251910, -0.895453986383746960, -0.895476242968607280, -0.895498497314776820, +-0.895520749422200280, -0.895542999290821710, -0.895565246920585700, -0.895587492311436420, -0.895609735463318570, -0.895631976376176310, -0.895654215049954240, -0.895676451484596510, +-0.895698685680047850, -0.895720917636252280, -0.895743147353154410, -0.895765374830698620, -0.895787600068829400, -0.895809823067491240, -0.895832043826628730, -0.895854262346185810, +-0.895876478626107530, -0.895898692666337810, -0.895920904466821380, -0.895943114027502710, -0.895965321348326180, -0.895987526429236620, -0.896009729270178080, -0.896031929871095370, +-0.896054128231932530, -0.896076324352634510, -0.896098518233145680, -0.896120709873410410, -0.896142899273373540, -0.896165086432979540, -0.896187271352172580, -0.896209454030897690, +-0.896231634469099040, -0.896253812666721220, -0.896275988623708830, -0.896298162340006590, -0.896320333815558870, -0.896342503050310490, -0.896364670044205840, -0.896386834797189390, +-0.896408997309205870, -0.896431157580199760, -0.896453315610115880, -0.896475471398898600, -0.896497624946492880, -0.896519776252842850, -0.896541925317893670, -0.896564072141589400, +-0.896586216723875060, -0.896608359064695050, -0.896630499163994180, -0.896652637021717050, -0.896674772637808590, -0.896696906012212970, -0.896719037144875330, -0.896741166035739830, +-0.896763292684751410, -0.896785417091854780, -0.896807539256994630, -0.896829659180115810, -0.896851776861162690, -0.896873892300080190, -0.896896005496812920, -0.896918116451305590, +-0.896940225163502910, -0.896962331633349710, -0.896984435860790690, -0.897006537845770780, -0.897028637588234260, -0.897050735088126380, -0.897072830345391540, -0.897094923359974540, +-0.897117014131820320, -0.897139102660873490, -0.897161188947078970, -0.897183272990381590, -0.897205354790725830, -0.897227434348056960, -0.897249511662319250, -0.897271586733457750, +-0.897293659561417380, -0.897315730146142740, -0.897337798487579000, -0.897359864585670630, -0.897381928440362690, -0.897403990051599880, -0.897426049419327020, -0.897448106543488940, +-0.897470161424030800, -0.897492214060897080, -0.897514264454033040, -0.897536312603383290, -0.897558358508892760, -0.897580402170506280, -0.897602443588168760, -0.897624482761825050, +-0.897646519691420290, -0.897668554376899300, -0.897690586818206790, -0.897712617015287930, -0.897734644968087410, -0.897756670676550290, -0.897778694140621390, -0.897800715360245860, +-0.897822734335368520, -0.897844751065934530, -0.897866765551888490, -0.897888777793175660, -0.897910787789740760, -0.897932795541528830, -0.897954801048485020, -0.897976804310554160, +-0.897998805327681170, -0.898020804099811550, -0.898042800626889570, -0.898064794908860820, -0.898086786945670010, -0.898108776737262080, -0.898130764283582290, -0.898152749584575580, +-0.898174732640187210, -0.898196713450361780, -0.898218692015044670, -0.898240668334180810, -0.898262642407715140, -0.898284614235592920, -0.898306583817759190, -0.898328551154158990, +-0.898350516244737610, -0.898372479089439730, -0.898394439688210870, -0.898416398040995710, -0.898438354147739540, -0.898460308008387500, -0.898482259622884640, -0.898504208991176220, +-0.898526156113207410, -0.898548100988923240, -0.898570043618268530, -0.898591984001188780, -0.898613922137629140, -0.898635858027534650, -0.898657791670850470, -0.898679723067521970, +-0.898701652217494100, -0.898723579120712210, -0.898745503777121150, -0.898767426186666380, -0.898789346349293080, -0.898811264264946400, -0.898833179933571480, -0.898855093355113930, +-0.898877004529518350, -0.898898913456730450, -0.898920820136695160, -0.898942724569357750, -0.898964626754663600, -0.898986526692557740, -0.899008424382985890, -0.899030319825892770, +-0.899052213021223960, -0.899074103968924510, -0.899095992668939800, -0.899117879121215100, -0.899139763325695670, -0.899161645282326890, -0.899183524991054140, -0.899205402451822340, +-0.899227277664577330, -0.899249150629263800, -0.899271021345827480, -0.899292889814213630, -0.899314756034367500, -0.899336620006234600, -0.899358481729760180, -0.899380341204889520, +-0.899402198431568100, -0.899424053409740960, -0.899445906139353820, -0.899467756620351830, -0.899489604852680370, -0.899511450836285250, -0.899533294571111200, -0.899555136057104130, +-0.899576975294208990, -0.899598812282371480, -0.899620647021536990, -0.899642479511650770, -0.899664309752658430, -0.899686137744505450, -0.899707963487136890, -0.899729786980498770, +-0.899751608224535810, -0.899773427219193960, -0.899795243964418570, -0.899817058460154920, -0.899838870706348710, -0.899860680702945560, -0.899882488449890610, -0.899904293947129340, +-0.899926097194607260, -0.899947898192270060, -0.899969696940063010, -0.899991493437931720, -0.900013287685821890, -0.900035079683678680, -0.900056869431447910, -0.900078656929074850, +-0.900100442176505090, -0.900122225173684230, -0.900144005920557880, -0.900165784417071400, -0.900187560663170740, -0.900209334658800930, -0.900231106403908020, -0.900252875898437170, +-0.900274643142334070, -0.900296408135544350, -0.900318170878013690, -0.900339931369687710, -0.900361689610511770, -0.900383445600431820, -0.900405199339393000, -0.900426950827341250, +-0.900448700064222060, -0.900470447049981140, -0.900492191784564080, -0.900513934267916820, -0.900535674499984400, -0.900557412480713080, -0.900579148210048030, -0.900600881687935060, +-0.900622612914320000, -0.900644341889148330, -0.900666068612365760, -0.900687793083918220, -0.900709515303751100, -0.900731235271810320, -0.900752952988041260, -0.900774668452389850, +-0.900796381664801690, -0.900818092625222610, -0.900839801333598530, -0.900861507789874730, -0.900883211993997350, -0.900904913945911770, -0.900926613645563920, -0.900948311092899520, +-0.900970006287864280, -0.900991699230404120, -0.901013389920464870, -0.901035078357991900, -0.901056764542931490, -0.901078448475229000, -0.901100130154830370, -0.901121809581681310, +-0.901143486755727860, -0.901165161676915630, -0.901186834345190760, -0.901208504760498740, -0.901230172922785180, -0.901251838831996330, -0.901273502488077800, -0.901295163890975640, +-0.901316823040635430, -0.901338479937003450, -0.901360134580024950, -0.901381786969646440, -0.901403437105813170, -0.901425084988471400, -0.901446730617566860, -0.901468373993045470, +-0.901490015114853270, -0.901511653982936090, -0.901533290597239630, -0.901554924957710170, -0.901576557064293180, -0.901598186916934720, -0.901619814515580930, -0.901641439860177530, +-0.901663062950670780, -0.901684683787006060, -0.901706302369129960, -0.901727918696987760, -0.901749532770525940, -0.901771144589690210, -0.901792754154426610, -0.901814361464681080, +-0.901835966520399880, -0.901857569321528610, -0.901879169868013530, -0.901900768159800360, -0.901922364196835360, -0.901943957979064350, -0.901965549506433480, -0.901987138778888700, +-0.902008725796376360, -0.902030310558841970, -0.902051893066231900, -0.902073473318491970, -0.902095051315568440, -0.902116627057407250, -0.902138200543954440, -0.902159771775156270, +-0.902181340750958570, -0.902202907471307710, -0.902224471936149300, -0.902246034145429810, -0.902267594099095180, -0.902289151797091570, -0.902310707239365130, -0.902332260425862120, +-0.902353811356528260, -0.902375360031310030, -0.902396906450153140, -0.902418450613004080, -0.902439992519808890, -0.902461532170513720, -0.902483069565064630, -0.902504604703408210, +-0.902526137585490160, -0.902547668211256650, -0.902569196580653930, -0.902590722693628170, -0.902612246550125620, -0.902633768150092550, -0.902655287493475230, -0.902676804580219370, +-0.902698319410271790, -0.902719831983578190, -0.902741342300085070, -0.902762850359738580, -0.902784356162484980, -0.902805859708270430, -0.902827360997041420, -0.902848860028743870, +-0.902870356803324280, -0.902891851320728690, -0.902913343580903470, -0.902934833583794780, -0.902956321329349110, -0.902977806817512830, -0.902999290048231870, -0.903020771021452840, +-0.903042249737121660, -0.903063726195184820, -0.903085200395588710, -0.903106672338279680, -0.903128142023203910, -0.903149609450307870, -0.903171074619537720, -0.903192537530840060, +-0.903213998184160930, -0.903235456579446700, -0.903256912716643880, -0.903278366595698820, -0.903299818216557800, -0.903321267579167420, -0.903342714683473710, -0.903364159529423390, +-0.903385602116962390, -0.903407042446037530, -0.903428480516594970, -0.903449916328581290, -0.903471349881942890, -0.903492781176626010, -0.903514210212577380, -0.903535636989742930, +-0.903557061508069470, -0.903578483767503380, -0.903599903767991040, -0.903621321509478940, -0.903642736991913780, -0.903664150215241600, -0.903685561179409120, -0.903706969884362610, +-0.903728376330048650, -0.903749780516413860, -0.903771182443404490, -0.903792582110967360, -0.903813979519048630, -0.903835374667595230, -0.903856767556553090, -0.903878158185869030, +-0.903899546555489540, -0.903920932665361330, -0.903942316515430670, -0.903963698105644480, -0.903985077435948800, -0.904006454506290580, -0.904027829316616070, -0.904049201866871990, +-0.904070572157004930, -0.904091940186961480, -0.904113305956688150, -0.904134669466131750, -0.904156030715238420, -0.904177389703955230, -0.904198746432228420, -0.904220100900004710, +-0.904241453107230700, -0.904262803053853090, -0.904284150739818720, -0.904305496165073720, -0.904326839329565260, -0.904348180233239480, -0.904369518876043220, -0.904390855257923070, +-0.904412189378825950, -0.904433521238698250, -0.904454850837487000, -0.904476178175138370, -0.904497503251599500, -0.904518826066816770, -0.904540146620736900, -0.904561464913306580, +-0.904582780944472750, -0.904604094714181910, -0.904625406222380970, -0.904646715469016430, -0.904668022454035210, -0.904689327177383820, -0.904710629639009060, -0.904731929838857640, +-0.904753227776876500, -0.904774523453012570, -0.904795816867212000, -0.904817108019422060, -0.904838396909589230, -0.904859683537660440, -0.904880967903582410, -0.904902250007301960, +-0.904923529848765780, -0.904944807427921160, -0.904966082744714130, -0.904987355799092170, -0.905008626591001670, -0.905029895120389670, -0.905051161387202760, -0.905072425391388100, +-0.905093687132892400, -0.905114946611662470, -0.905136203827645260, -0.905157458780787350, -0.905178711471035790, -0.905199961898337510, -0.905221210062639340, -0.905242455963888080, +-0.905263699602030900, -0.905284940977014290, -0.905306180088785490, -0.905327416937291020, -0.905348651522478120, -0.905369883844293510, -0.905391113902684120, -0.905412341697597100, +-0.905433567228979270, -0.905454790496777460, -0.905476011500938820, -0.905497230241409930, -0.905518446718137970, -0.905539660931069970, -0.905560872880152750, -0.905582082565333460, +-0.905603289986558920, -0.905624495143776300, -0.905645698036932180, -0.905666898665973940, -0.905688097030848400, -0.905709293131502500, -0.905730486967883500, -0.905751678539938430, +-0.905772867847614020, -0.905794054890857630, -0.905815239669615860, -0.905836422183836090, -0.905857602433465140, -0.905878780418450270, -0.905899956138738420, -0.905921129594276840, +-0.905942300785012480, -0.905963469710892140, -0.905984636371863110, -0.906005800767872520, -0.906026962898867420, -0.906048122764794960, -0.906069280365602300, -0.906090435701236370, +-0.906111588771644440, -0.906132739576773430, -0.906153888116570490, -0.906175034390982900, -0.906196178399957700, -0.906217320143442030, -0.906238459621383160, -0.906259596833728140, +-0.906280731780424230, -0.906301864461418250, -0.906322994876657680, -0.906344123026089580, -0.906365248909661190, -0.906386372527319910, -0.906407493879012430, -0.906428612964686460, +-0.906449729784288840, -0.906470844337766810, -0.906491956625067650, -0.906513066646138620, -0.906534174400926870, -0.906555279889380010, -0.906576383111444620, -0.906597484067068530, +-0.906618582756198550, -0.906639679178782080, -0.906660773334766470, -0.906681865224098880, -0.906702954846726580, -0.906724042202597170, -0.906745127291657460, -0.906766210113855050, +-0.906787290669136990, -0.906808368957450760, -0.906829444978743520, -0.906850518732962630, -0.906871590220055700, -0.906892659439969550, -0.906913726392652000, -0.906934791078049970, +-0.906955853496110850, -0.906976913646782230, -0.906997971530011270, -0.907019027145745340, -0.907040080493932030, -0.907061131574518400, -0.907082180387452140, -0.907103226932680200, +-0.907124271210150160, -0.907145313219809510, -0.907166352961605530, -0.907187390435485690, -0.907208425641397480, -0.907229458579288270, -0.907250489249105230, -0.907271517650796060, +-0.907292543784308010, -0.907313567649588590, -0.907334589246585280, -0.907355608575245550, -0.907376625635516800, -0.907397640427346610, -0.907418652950682140, -0.907439663205470980, +-0.907460671191660740, -0.907481676909198790, -0.907502680358032610, -0.907523681538109920, -0.907544680449377860, -0.907565677091784260, -0.907586671465276380, -0.907607663569801710, +-0.907628653405307960, -0.907649640971742610, -0.907670626269053260, -0.907691609297187170, -0.907712590056092280, -0.907733568545715630, -0.907754544766005140, -0.907775518716908310, +-0.907796490398372620, -0.907817459810345780, -0.907838426952775390, -0.907859391825608820, -0.907880354428793890, -0.907901314762277980, -0.907922272826008680, -0.907943228619933820, +-0.907964182144000760, -0.907985133398157340, -0.908006082382351250, -0.908027029096529770, -0.908047973540640820, -0.908068915714631890, -0.908089855618450570, -0.908110793252044580, +-0.908131728615361730, -0.908152661708349630, -0.908173592530955750, -0.908194521083128150, -0.908215447364813970, -0.908236371375961140, -0.908257293116517480, -0.908278212586430490, +-0.908299129785647970, -0.908320044714117870, -0.908340957371787440, -0.908361867758604840, -0.908382775874517430, -0.908403681719472940, -0.908424585293419410, -0.908445486596304310, +-0.908466385628075470, -0.908487282388680930, -0.908508176878068170, -0.908529069096184690, -0.908549959042978640, -0.908570846718397610, -0.908591732122389530, -0.908612615254902110, +-0.908633496115883400, -0.908654374705280650, -0.908675251023042250, -0.908696125069115460, -0.908716996843448420, -0.908737866345988850, -0.908758733576684570, -0.908779598535483510, +-0.908800461222333600, -0.908821321637182430, -0.908842179779978050, -0.908863035650668060, -0.908883889249200600, -0.908904740575523280, -0.908925589629584140, -0.908946436411331220, +-0.908967280920712000, -0.908988123157674850, -0.909008963122167170, -0.909029800814136980, -0.909050636233532440, -0.909071469380301140, -0.909092300254391360, -0.909113128855750910, +-0.909133955184327490, -0.909154779240069270, -0.909175601022924050, -0.909196420532839780, -0.909217237769764370, -0.909238052733646000, -0.909258865424432350, -0.909279675842071810, +-0.909300483986511980, -0.909321289857700890, -0.909342093455586700, -0.909362894780117110, -0.909383693831240400, -0.909404490608904270, -0.909425285113057090, -0.909446077343646580, +-0.909466867300621100, -0.909487654983928140, -0.909508440393516300, -0.909529223529333190, -0.909550004391327160, -0.909570782979446050, -0.909591559293638000, -0.909612333333850940, +-0.909633105100033260, -0.909653874592132650, -0.909674641810097380, -0.909695406753875500, -0.909716169423415270, -0.909736929818664500, -0.909757687939571350, -0.909778443786084080, +-0.909799197358150510, -0.909819948655719140, -0.909840697678737760, -0.909861444427154780, -0.909882188900918100, -0.909902931099976000, -0.909923671024276510, -0.909944408673767910, +-0.909965144048398230, -0.909985877148115740, -0.910006607972868480, -0.910027336522604810, -0.910048062797272680, -0.910068786796820460, -0.910089508521196300, -0.910110227970348350, +-0.910130945144224770, -0.910151660042773920, -0.910172372665943970, -0.910193083013682850, -0.910213791085939250, -0.910234496882661000, -0.910255200403796700, -0.910275901649294280, +-0.910296600619102110, -0.910317297313168460, -0.910337991731441590, -0.910358683873869650, -0.910379373740401120, -0.910400061330984060, -0.910420746645566940, -0.910441429684097800, +-0.910462110446525250, -0.910482788932797330, -0.910503465142862510, -0.910524139076668960, -0.910544810734165160, -0.910565480115299140, -0.910586147220019630, -0.910606812048274760, +-0.910627474600012700, -0.910648134875182040, -0.910668792873730930, -0.910689448595608080, -0.910710102040761300, -0.910730753209139540, -0.910751402100690720, -0.910772048715363550, +-0.910792693053106060, -0.910813335113866970, -0.910833974897594540, -0.910854612404237150, -0.910875247633743170, -0.910895880586061190, -0.910916511261139370, -0.910937139658926420, +-0.910957765779370490, -0.910978389622420280, -0.910999011188024070, -0.911019630476130220, -0.911040247486687440, -0.911060862219643890, -0.911081474674948380, -0.911102084852548950, +-0.911122692752394550, -0.911143298374433200, -0.911163901718613720, -0.911184502784884390, -0.911205101573194010, -0.911225698083490630, -0.911246292315723180, -0.911266884269839930, +-0.911287473945789460, -0.911308061343520270, -0.911328646462981060, -0.911349229304120100, -0.911369809866886200, -0.911390388151227640, -0.911410964157093220, -0.911431537884431320, +-0.911452109333190540, -0.911472678503319590, -0.911493245394766840, -0.911513810007481110, -0.911534372341410770, -0.911554932396504540, -0.911575490172710890, -0.911596045669978540, +-0.911616598888256080, -0.911637149827492220, -0.911657698487635340, -0.911678244868634360, -0.911698788970437660, -0.911719330792994050, -0.911739870336252030, -0.911760407600160530, +-0.911780942584667800, -0.911801475289722770, -0.911822005715274160, -0.911842533861270450, -0.911863059727660460, -0.911883583314392680, -0.911904104621416020, -0.911924623648679100, +-0.911945140396130730, -0.911965654863719280, -0.911986167051393900, -0.912006676959102980, -0.912027184586795440, -0.912047689934419870, -0.912068193001925210, -0.912088693789259830, +-0.912109192296372990, -0.912129688523212970, -0.912150182469728790, -0.912170674135869160, -0.912191163521582920, -0.912211650626818640, -0.912232135451525370, -0.912252617995651720, +-0.912273098259146380, -0.912293576241958500, -0.912314051944036470, -0.912334525365329550, -0.912354996505786110, -0.912375465365355300, -0.912395931943985720, -0.912416396241626520, +-0.912436858258226070, -0.912457317993733640, -0.912477775448097830, -0.912498230621267670, -0.912518683513191880, -0.912539134123819370, -0.912559582453099090, -0.912580028500979750, +-0.912600472267410370, -0.912620913752339890, -0.912641352955717020, -0.912661789877490910, -0.912682224517610270, -0.912702656876024030, -0.912723086952681120, -0.912743514747530570, +-0.912763940260521210, -0.912784363491601860, -0.912804784440721770, -0.912825203107829660, -0.912845619492874570, -0.912866033595805430, -0.912886445416571270, -0.912906854955120810, +-0.912927262211403410, -0.912947667185367680, -0.912968069876962880, -0.912988470286137940, -0.913008868412841790, -0.913029264257023470, -0.913049657818632010, -0.913070049097616350, +-0.913090438093925540, -0.913110824807508830, -0.913131209238314810, -0.913151591386292870, -0.913171971251391930, -0.913192348833561150, -0.913212724132749450, -0.913233097148905880, +-0.913253467881979590, -0.913273836331919720, -0.913294202498675210, -0.913314566382195210, -0.913334927982428660, -0.913355287299324910, -0.913375644332832910, -0.913395999082901920, +-0.913416351549480750, -0.913436701732518790, -0.913457049631965060, -0.913477395247768720, -0.913497738579878930, -0.913518079628244720, -0.913538418392815350, -0.913558754873539990, +-0.913579089070367670, -0.913599420983247650, -0.913619750612129080, -0.913640077956961010, -0.913660403017692910, -0.913680725794273730, -0.913701046286652830, -0.913721364494779140, +-0.913741680418602260, -0.913761994058071010, -0.913782305413134770, -0.913802614483742780, -0.913822921269844430, -0.913843225771388550, -0.913863527988324710, -0.913883827920602080, +-0.913904125568169800, -0.913924420930977250, -0.913944714008973700, -0.913965004802108290, -0.913985293310330400, -0.914005579533589300, -0.914025863471834120, -0.914046145125014480, +-0.914066424493079290, -0.914086701575978160, -0.914106976373660230, -0.914127248886074880, -0.914147519113171380, -0.914167787054899090, -0.914188052711207400, -0.914208316082045560, +-0.914228577167362830, -0.914248835967108710, -0.914269092481232450, -0.914289346709683650, -0.914309598652411350, -0.914329848309365030, -0.914350095680494190, -0.914370340765747970, +-0.914390583565075970, -0.914410824078427440, -0.914431062305752000, -0.914451298246998780, -0.914471531902117380, -0.914491763271057080, -0.914511992353767460, -0.914532219150197780, +-0.914552443660297640, -0.914572665884016310, -0.914592885821303380, -0.914613103472108220, -0.914633318836380330, -0.914653531914069060, -0.914673742705124030, -0.914693951209494700, +-0.914714157427130360, -0.914734361357980700, -0.914754563001995090, -0.914774762359123140, -0.914794959429314210, -0.914815154212517910, -0.914835346708683720, -0.914855536917761230, +-0.914875724839699700, -0.914895910474449070, -0.914916093821958600, -0.914936274882177880, -0.914956453655056400, -0.914976630140543980, -0.914996804338589760, -0.915016976249143690, +-0.915037145872155120, -0.915057313207573770, -0.915077478255349020, -0.915097641015430670, -0.915117801487768220, -0.915137959672311150, -0.915158115569009280, -0.915178269177812090, +-0.915198420498669170, -0.915218569531530250, -0.915238716276345010, -0.915258860733062840, -0.915279002901633550, -0.915299142782006750, -0.915319280374132130, -0.915339415677959290, +-0.915359548693437940, -0.915379679420517570, -0.915399807859148210, -0.915419934009279230, -0.915440057870860470, -0.915460179443841390, -0.915480298728172050, -0.915500415723801920, +-0.915520530430680710, -0.915540642848758250, -0.915560752977984120, -0.915580860818308140, -0.915600966369680020, -0.915621069632049480, -0.915641170605366210, -0.915661269289580030, +-0.915681365684640650, -0.915701459790498000, -0.915721551607101560, -0.915741641134401260, -0.915761728372346820, -0.915781813320888150, -0.915801895979974970, -0.915821976349556980, +-0.915842054429584000, -0.915862130220006070, -0.915882203720772560, -0.915902274931833740, -0.915922343853139200, -0.915942410484638760, -0.915962474826282350, -0.915982536878019670, +-0.916002596639800770, -0.916022654111575240, -0.916042709293293120, -0.916062762184904230, -0.916082812786358500, -0.916102861097605640, -0.916122907118595680, -0.916142950849278440, +-0.916162992289603850, -0.916183031439521730, -0.916203068298982130, -0.916223102867934740, -0.916243135146329600, -0.916263165134116650, -0.916283192831245820, -0.916303218237666920, +-0.916323241353330100, -0.916343262178185180, -0.916363280712181980, -0.916383296955270770, -0.916403310907401130, -0.916423322568523320, -0.916443331938587070, -0.916463339017542620, +-0.916483343805339800, -0.916503346301928650, -0.916523346507258970, -0.916543344421281160, -0.916563340043944800, -0.916583333375200260, -0.916603324414997140, -0.916623313163285940, +-0.916643299620016340, -0.916663283785138620, -0.916683265658602480, -0.916703245240358400, -0.916723222530356100, -0.916743197528545720, -0.916763170234877410, -0.916783140649301110, +-0.916803108771767070, -0.916823074602225120, -0.916843038140625620, -0.916862999386918290, -0.916882958341053710, -0.916902915002981600, -0.916922869372652330, -0.916942821450015710, +-0.916962771235022120, -0.916982718727621600, -0.917002663927764420, -0.917022606835400380, -0.917042547450479970, -0.917062485772953020, -0.917082421802770000, -0.917102355539880840, +-0.917122286984235920, -0.917142216135785170, -0.917162142994478960, -0.917182067560267320, -0.917201989833100530, -0.917221909812928730, -0.917241827499702180, -0.917261742893371150, +-0.917281655993885670, -0.917301566801196120, -0.917321475315252540, -0.917341381536005310, -0.917361285463404670, -0.917381187097400800, -0.917401086437943940, -0.917420983484984460, +-0.917440878238472310, -0.917460770698358190, -0.917480660864592010, -0.917500548737124280, -0.917520434315905130, -0.917540317600884950, -0.917560198592013880, -0.917580077289242290, +-0.917599953692520680, -0.917619827801798960, -0.917639699617027850, -0.917659569138157380, -0.917679436365138050, -0.917699301297920100, -0.917719163936453920, -0.917739024280689760, +-0.917758882330578230, -0.917778738086069250, -0.917798591547113630, -0.917818442713661420, -0.917838291585663100, -0.917858138163069050, -0.917877982445829740, -0.917897824433895340, +-0.917917664127216540, -0.917937501525743490, -0.917957336629426690, -0.917977169438216610, -0.917996999952063520, -0.918016828170918010, -0.918036654094730230, -0.918056477723451000, +-0.918076299057030590, -0.918096118095419360, -0.918115934838567790, -0.918135749286426490, -0.918155561438945830, -0.918175371296076180, -0.918195178857768140, -0.918214984123972180, +-0.918234787094638680, -0.918254587769718360, -0.918274386149161350, -0.918294182232918590, -0.918313976020940230, -0.918333767513177080, -0.918353556709579410, -0.918373343610097810, +-0.918393128214682890, -0.918412910523285220, -0.918432690535855190, -0.918452468252343390, -0.918472243672700530, -0.918492016796876980, -0.918511787624823440, -0.918531556156490400, +-0.918551322391828570, -0.918571086330788320, -0.918590847973320360, -0.918610607319375270, -0.918630364368903770, -0.918650119121856230, -0.918669871578183470, -0.918689621737835970, +-0.918709369600764550, -0.918729115166919690, -0.918748858436251870, -0.918768599408712030, -0.918788338084250640, -0.918808074462818420, -0.918827808544366080, -0.918847540328844190, +-0.918867269816203370, -0.918886997006394420, -0.918906721899367950, -0.918926444495074770, -0.918946164793465360, -0.918965882794490650, -0.918985598498101130, -0.919005311904247720, +-0.919025023012880920, -0.919044731823951740, -0.919064438337410470, -0.919084142553208360, -0.919103844471295670, -0.919123544091623560, -0.919143241414142500, -0.919162936438803310, +-0.919182629165556930, -0.919202319594353830, -0.919222007725144950, -0.919241693557880990, -0.919261377092512990, -0.919281058328991320, -0.919300737267267240, -0.919320413907291130, +-0.919340088249014030, -0.919359760292386750, -0.919379430037360110, -0.919399097483884710, -0.919418762631911800, -0.919438425481391760, -0.919458086032275860, -0.919477744284514560, +-0.919497400238059150, -0.919517053892860090, -0.919536705248868320, -0.919556354306034880, -0.919576001064310480, -0.919595645523646250, -0.919615287683992700, -0.919634927545301070, +-0.919654565107521970, -0.919674200370606650, -0.919693833334505720, -0.919713463999170200, -0.919733092364551030, -0.919752718430599250, -0.919772342197265450, -0.919791963664501000, +-0.919811582832256500, -0.919831199700483100, -0.919850814269131730, -0.919870426538153320, -0.919890036507498790, -0.919909644177119180, -0.919929249546965530, -0.919948852616988670, +-0.919968453387139840, -0.919988051857369650, -0.920007648027629470, -0.920027241897870110, -0.920046833468042720, -0.920066422738098130, -0.920086009707987600, -0.920105594377661930, +-0.920125176747072390, -0.920144756816169810, -0.920164334584905430, -0.920183910053230190, -0.920203483221095130, -0.920223054088451400, -0.920242622655250030, -0.920262188921442070, +-0.920281752886978670, -0.920301314551810970, -0.920320873915889790, -0.920340430979166620, -0.920359985741592280, -0.920379538203118020, -0.920399088363694770, -0.920418636223274020, +-0.920438181781806470, -0.920457725039243610, -0.920477265995536360, -0.920496804650635990, -0.920516341004493530, -0.920535875057060360, -0.920555406808287400, -0.920574936258126030, +-0.920594463406527170, -0.920613988253442320, -0.920633510798822270, -0.920653031042618640, -0.920672548984782350, -0.920692064625264760, -0.920711577964016930, -0.920731089000990210, +-0.920750597736135770, -0.920770104169404750, -0.920789608300748520, -0.920809110130118240, -0.920828609657465270, -0.920848106882740660, -0.920867601805895890, -0.920887094426882100, +-0.920906584745650570, -0.920926072762152550, -0.920945558476339410, -0.920965041888162190, -0.920984522997572610, -0.921004001804521580, -0.921023478308960590, -0.921042952510840780, +-0.921062424410113770, -0.921081894006730570, -0.921101361300642800, -0.921120826291801590, -0.921140288980158100, -0.921159749365664140, -0.921179207448270640, -0.921198663227929200, +-0.921218116704591080, -0.921237567878207760, -0.921257016748730400, -0.921276463316110570, -0.921295907580299440, -0.921315349541248720, -0.921334789198909540, -0.921354226553233400, +-0.921373661604171670, -0.921393094351675820, -0.921412524795697240, -0.921431952936187290, -0.921451378773097460, -0.921470802306379340, -0.921490223535984090, -0.921509642461863290, +-0.921529059083968430, -0.921548473402250880, -0.921567885416662120, -0.921587295127153650, -0.921606702533677050, -0.921626107636183580, -0.921645510434624840, -0.921664910928952310, +-0.921684309119117580, -0.921703705005072040, -0.921723098586767260, -0.921742489864154750, -0.921761878837185970, -0.921781265505812520, -0.921800649869985890, -0.921820031929657670, +-0.921839411684779340, -0.921858789135302390, -0.921878164281178640, -0.921897537122359450, -0.921916907658796300, -0.921936275890441030, -0.921955641817244990, -0.921975005439159780, +-0.921994366756137110, -0.922013725768128570, -0.922033082475085640, -0.922052436876960150, -0.922071788973703340, -0.922091138765267270, -0.922110486251603190, -0.922129831432663030, +-0.922149174308398270, -0.922168514878760500, -0.922187853143701440, -0.922207189103172900, -0.922226522757126240, -0.922245854105513300, -0.922265183148285760, -0.922284509885395230, +-0.922303834316793520, -0.922323156442432010, -0.922342476262262840, -0.922361793776237280, -0.922381108984307360, -0.922400421886424680, -0.922419732482540940, -0.922439040772607740, +-0.922458346756577120, -0.922477650434400550, -0.922496951806029860, -0.922516250871416750, -0.922535547630513040, -0.922554842083270430, -0.922574134229640850, -0.922593424069575780, +-0.922612711603027270, -0.922631996829946900, -0.922651279750286600, -0.922670560363998080, -0.922689838671033050, -0.922709114671343640, -0.922728388364881250, -0.922747659751598000, +-0.922766928831445510, -0.922786195604375800, -0.922805460070340480, -0.922824722229291570, -0.922843982081180900, -0.922863239625960290, -0.922882494863581430, -0.922901747793996470, +-0.922920998417157130, -0.922940246733015220, -0.922959492741522780, -0.922978736442631620, -0.922997977836293450, -0.923017216922460530, -0.923036453701084560, -0.923055688172117360, +-0.923074920335510970, -0.923094150191217210, -0.923113377739188220, -0.923132602979375720, -0.923151825911731730, -0.923171046536208070, -0.923190264852756900, -0.923209480861330030, +-0.923228694561879500, -0.923247905954357240, -0.923267115038715170, -0.923286321814905330, -0.923305526282879650, -0.923324728442590170, -0.923343928293988920, -0.923363125837027840, +-0.923382321071658960, -0.923401513997834100, -0.923420704615505630, -0.923439892924625470, -0.923459078925145450, -0.923478262617017710, -0.923497444000194400, -0.923516623074627450, +-0.923535799840268900, -0.923554974297070900, -0.923574146444985370, -0.923593316283964680, -0.923612483813960440, -0.923631649034925230, -0.923650811946810760, -0.923669972549569280, +-0.923689130843152850, -0.923708286827513710, -0.923727440502603690, -0.923746591868375160, -0.923765740924780140, -0.923784887671770800, -0.923804032109299180, -0.923823174237317520, +-0.923842314055777880, -0.923861451564632510, -0.923880586763833560, -0.923899719653332950, -0.923918850233083290, -0.923937978503036270, -0.923957104463144500, -0.923976228113359780, +-0.923995349453634710, -0.924014468483921100, -0.924033585204171340, -0.924052699614337670, -0.924071811714372250, -0.924090921504227230, -0.924110028983854970, -0.924129134153207630, +-0.924148237012237470, -0.924167337560896640, -0.924186435799137620, -0.924205531726912440, -0.924224625344173270, -0.924243716650872790, -0.924262805646962840, -0.924281892332395990, +-0.924300976707124300, -0.924320058771100240, -0.924339138524275960, -0.924358215966603950, -0.924377291098036350, -0.924396363918525530, -0.924415434428023760, -0.924434502626483410, +-0.924453568513856850, -0.924472632090096340, -0.924491693355154240, -0.924510752308982940, -0.924529808951534690, -0.924548863282762090, -0.924567915302617060, -0.924586965011052530, +-0.924606012408020430, -0.924625057493473350, -0.924644100267363540, -0.924663140729643510, -0.924682178880265710, -0.924701214719182430, -0.924720248246346130, -0.924739279461709080, +-0.924758308365223990, -0.924777334956843000, -0.924796359236518820, -0.924815381204203590, -0.924834400859850030, -0.924853418203410380, -0.924872433234837250, -0.924891445954083010, +-0.924910456361100140, -0.924929464455841120, -0.924948470238258440, -0.924967473708304680, -0.924986474865932110, -0.925005473711093540, -0.925024470243741010, -0.925043464463827570, +-0.925062456371305240, -0.925081445966126960, -0.925100433248244980, -0.925119418217611900, -0.925138400874180310, -0.925157381217902700, -0.925176359248731650, -0.925195334966619650, +-0.925214308371519300, -0.925233279463383300, -0.925252248242164010, -0.925271214707814150, -0.925290178860286190, -0.925309140699532850, -0.925328100225506600, -0.925347057438160260, +-0.925366012337446090, -0.925384964923317010, -0.925403915195725400, -0.925422863154624080, -0.925441808799965630, -0.925460752131702540, -0.925479693149787730, -0.925498631854173470, +-0.925517568244812790, -0.925536502321658180, -0.925555434084662340, -0.925574363533777870, -0.925593290668957460, -0.925612215490153820, -0.925631137997319780, -0.925650058190407690, +-0.925668976069370600, -0.925687891634160990, -0.925706804884731780, -0.925725715821035360, -0.925744624443024850, -0.925763530750652760, -0.925782434743871670, -0.925801336422634620, +-0.925820235786894210, -0.925839132836603240, -0.925858027571714310, -0.925876919992180470, -0.925895810097954190, -0.925914697888988500, -0.925933583365236010, -0.925952466526649640, +-0.925971347373181990, -0.925990225904786080, -0.926009102121414520, -0.926027976023020230, -0.926046847609556020, -0.926065716880974720, -0.926084583837229030, -0.926103448478271970, +-0.926122310804056270, -0.926141170814534730, -0.926160028509660390, -0.926178883889385850, -0.926197736953664250, -0.926216587702448080, -0.926235436135690700, -0.926254282253344500, +-0.926273126055362720, -0.926291967541698070, -0.926310806712303590, -0.926329643567131990, -0.926348478106136410, -0.926367310329269440, -0.926386140236484360, -0.926404967827733850, +-0.926423793102971070, -0.926442616062148620, -0.926461436705219740, -0.926480255032137160, -0.926499071042854120, -0.926517884737323330, -0.926536696115497720, -0.926555505177330430, +-0.926574311922774400, -0.926593116351782650, -0.926611918464307900, -0.926630718260303630, -0.926649515739722320, -0.926668310902517440, -0.926687103748641610, -0.926705894278048060, +-0.926724682490689840, -0.926743468386519890, -0.926762251965491220, -0.926781033227557010, -0.926799812172670050, -0.926818588800783720, -0.926837363111850830, -0.926856135105824650, +-0.926874904782658100, -0.926893672142304230, -0.926912437184716160, -0.926931199909846960, -0.926949960317649870, -0.926968718408077820, -0.926987474181084070, -0.927006227636621550, +-0.927024978774643520, -0.927043727595102900, -0.927062474097953060, -0.927081218283147050, -0.927099960150638000, -0.927118699700378970, -0.927137436932323310, -0.927156171846423960, +-0.927174904442634280, -0.927193634720907210, -0.927212362681196110, -0.927231088323454130, -0.927249811647634430, -0.927268532653690250, -0.927287251341574640, -0.927305967711240960, +-0.927324681762642270, -0.927343393495732030, -0.927362102910463170, -0.927380810006789180, -0.927399514784662980, -0.927418217244038170, -0.927436917384867780, -0.927455615207105070, +-0.927474310710703300, -0.927493003895615730, -0.927511694761795740, -0.927530383309196460, -0.927549069537771160, -0.927567753447473330, -0.927586435038256000, -0.927605114310072640, +-0.927623791262876530, -0.927642465896620920, -0.927661138211259060, -0.927679808206744450, -0.927698475883030340, -0.927717141240069880, -0.927735804277816770, -0.927754464996223940, +-0.927773123395245090, -0.927791779474833380, -0.927810433234942280, -0.927829084675525050, -0.927847733796535180, -0.927866380597925810, -0.927885025079650650, -0.927903667241662840, +-0.927922307083915990, -0.927940944606363230, -0.927959579808958160, -0.927978212691654150, -0.927996843254404570, -0.928015471497163010, -0.928034097419882630, -0.928052721022517010, +-0.928071342305019640, -0.928089961267343890, -0.928108577909443230, -0.928127192231271160, -0.928145804232781040, -0.928164413913926570, -0.928183021274660900, -0.928201626314937740, +-0.928220229034710460, -0.928238829433932770, -0.928257427512557800, -0.928276023270539370, -0.928294616707830870, -0.928313207824385870, -0.928331796620157750, -0.928350383095100320, +-0.928368967249166730, -0.928387549082310800, -0.928406128594486120, -0.928424705785645950, -0.928443280655744110, -0.928461853204733960, -0.928480423432569310, -0.928498991339203440, +-0.928517556924590260, -0.928536120188683030, -0.928554681131435690, -0.928573239752801480, -0.928591796052734230, -0.928610350031187530, -0.928628901688114850, -0.928647451023470020, +-0.928665998037206510, -0.928684542729278030, -0.928703085099638170, -0.928721625148240640, -0.928740162875039020, -0.928758698279987030, -0.928777231363038250, -0.928795762124146500, +-0.928814290563265140, -0.928832816680348230, -0.928851340475349120, -0.928869861948221850, -0.928888381098919800, -0.928906897927396780, -0.928925412433606600, -0.928943924617502860, +-0.928962434479039260, -0.928980942018169610, -0.928999447234847620, -0.929017950129026990, -0.929036450700661430, -0.929054948949704860, -0.929073444876110880, -0.929091938479833290, +-0.929110429760825810, -0.929128918719042350, -0.929147405354436520, -0.929165889666962120, -0.929184371656573190, -0.929202851323223110, -0.929221328666866020, -0.929239803687455620, +-0.929258276384945630, -0.929276746759289950, -0.929295214810442530, -0.929313680538356950, -0.929332143942987240, -0.929350605024287120, -0.929369063782210510, -0.929387520216711230, +-0.929405974327743190, -0.929424426115260100, -0.929442875579216120, -0.929461322719564830, -0.929479767536260270, -0.929498210029256370, -0.929516650198506820, -0.929535088043965670, +-0.929553523565586850, -0.929571956763324270, -0.929590387637131640, -0.929608816186963120, -0.929627242412772500, -0.929645666314513950, -0.929664087892141060, -0.929682507145608070, +-0.929700924074868710, -0.929719338679877110, -0.929737750960587080, -0.929756160916952790, -0.929774568548928040, -0.929792973856466860, -0.929811376839523200, -0.929829777498051180, +-0.929848175832004630, -0.929866571841337810, -0.929884965526004410, -0.929903356885958600, -0.929921745921154510, -0.929940132631545960, -0.929958517017087090, -0.929976899077731960, +-0.929995278813434580, -0.930013656224148890, -0.930032031309829250, -0.930050404070429380, -0.930068774505903640, -0.930087142616205840, -0.930105508401290250, -0.930123871861110780, +-0.930142232995621710, -0.930160591804777060, -0.930178948288530980, -0.930197302446837400, -0.930215654279650690, -0.930234003786924890, -0.930252350968613920, -0.930270695824672260, +-0.930289038355053720, -0.930307378559712570, -0.930325716438602960, -0.930344051991679240, -0.930362385218895140, -0.930380716120205340, -0.930399044695563560, -0.930417370944924270, +-0.930435694868241400, -0.930454016465469440, -0.930472335736562410, -0.930490652681474570, -0.930508967300159970, -0.930527279592573090, -0.930545589558667950, -0.930563897198398830, +-0.930582202511719970, -0.930600505498585640, -0.930618806158950100, -0.930637104492767490, -0.930655400499992070, -0.930673694180578100, -0.930691985534480070, -0.930710274561651900, +-0.930728561262048170, -0.930746845635622930, -0.930765127682330770, -0.930783407402125620, -0.930801684794961950, -0.930819959860794130, -0.930838232599576430, -0.930856503011263100, +-0.930874771095808520, -0.930893036853166930, -0.930911300283292940, -0.930929561386140580, -0.930947820161664330, -0.930966076609818450, -0.930984330730557530, -0.931002582523835720, +-0.931020831989607500, -0.931039079127827130, -0.931057323938449090, -0.931075566421427750, -0.931093806576717480, -0.931112044404272640, -0.931130279904047730, -0.931148513075997220, +-0.931166743920075260, -0.931184972436236550, -0.931203198624435350, -0.931221422484626250, -0.931239644016763510, -0.931257863220801730, -0.931276080096695160, -0.931294294644398500, +-0.931312506863866020, -0.931330716755052410, -0.931348924317911940, -0.931367129552399090, -0.931385332458468550, -0.931403533036074590, -0.931421731285171810, -0.931439927205714670, +-0.931458120797657770, -0.931476312060955490, -0.931494500995562520, -0.931512687601433240, -0.931530871878522350, -0.931549053826784100, -0.931567233446173320, -0.931585410736644470, +-0.931603585698152050, -0.931621758330650640, -0.931639928634094950, -0.931658096608439350, -0.931676262253638530, -0.931694425569646990, -0.931712586556419530, -0.931730745213910530, +-0.931748901542074680, -0.931767055540866580, -0.931785207210240830, -0.931803356550152010, -0.931821503560554820, -0.931839648241403970, -0.931857790592653830, -0.931875930614259330, +-0.931894068306174940, -0.931912203668355480, -0.931930336700755420, -0.931948467403329590, -0.931966595776032580, -0.931984721818819080, -0.932002845531643700, -0.932020966914461240, +-0.932039085967226400, -0.932057202689893890, -0.932075317082418310, -0.932093429144754350, -0.932111538876856940, -0.932129646278680670, -0.932147751350180240, -0.932165854091310480, +-0.932183954502026070, -0.932202052582281730, -0.932220148332032370, -0.932238241751232490, -0.932256332839837110, -0.932274421597800830, -0.932292508025078570, -0.932310592121624930, +-0.932328673887394930, -0.932346753322343180, -0.932364830426424600, -0.932382905199593880, -0.932400977641805960, -0.932419047753015540, -0.932437115533177540, -0.932455180982246780, +-0.932473244100178070, -0.932491304886926220, -0.932509363342446050, -0.932527419466692600, -0.932545473259620450, -0.932563524721184640, -0.932581573851340110, -0.932599620650041650, +-0.932617665117243980, -0.932635707252902350, -0.932653747056971350, -0.932671784529406020, -0.932689819670161180, -0.932707852479191860, -0.932725882956452760, -0.932743911101899140, +-0.932761936915485590, -0.932779960397167260, -0.932797981546899080, -0.932816000364635860, -0.932834016850332740, -0.932852031003944540, -0.932870042825426180, -0.932888052314732820, +-0.932906059471819260, -0.932924064296640540, -0.932942066789151810, -0.932960066949307780, -0.932978064777063580, -0.932996060272374250, -0.933014053435194720, -0.933032044265480140, +-0.933050032763185430, -0.933068018928265520, -0.933086002760675770, -0.933103984260370890, -0.933121963427306020, -0.933139940261436320, -0.933157914762716700, -0.933175886931102430, +-0.933193856766548310, -0.933211824269009620, -0.933229789438441260, -0.933247752274798500, -0.933265712778036380, -0.933283670948109930, -0.933301626784974300, -0.933319580288584750, +-0.933337531458896090, -0.933355480295863680, -0.933373426799442460, -0.933391370969587800, -0.933409312806254610, -0.933427252309398270, -0.933445189478973700, -0.933463124314936170, +-0.933481056817240810, -0.933498986985842880, -0.933516914820697430, -0.933534840321759710, -0.933552763488984860, -0.933570684322328150, -0.933588602821744720, -0.933606518987189720, +-0.933624432818618510, -0.933642344315986140, -0.933660253479247970, -0.933678160308359150, -0.933696064803274940, -0.933713966963950480, -0.933731866790341260, -0.933749764282402190, +-0.933767659440088880, -0.933785552263356360, -0.933803442752159980, -0.933821330906454920, -0.933839216726196630, -0.933857100211340160, -0.933874981361841110, -0.933892860177654490, +-0.933910736658735700, -0.933928610805040190, -0.933946482616523020, -0.933964352093139770, -0.933982219234845590, -0.934000084041595850, -0.934017946513345910, -0.934035806650051040, +-0.934053664451666710, -0.934071519918148300, -0.934089373049450940, -0.934107223845530240, -0.934125072306341450, -0.934142918431840050, -0.934160762221981190, -0.934178603676720560, +-0.934196442796013330, -0.934214279579815180, -0.934232114028081150, -0.934249946140766950, -0.934267775917827840, -0.934285603359219170, -0.934303428464896670, -0.934321251234815460, +-0.934339071668931260, -0.934356889767199330, -0.934374705529575130, -0.934392518956014160, -0.934410330046472000, -0.934428138800903920, -0.934445945219265490, -0.934463749301512210, +-0.934481551047599560, -0.934499350457483000, -0.934517147531118250, -0.934534942268460340, -0.934552734669465310, -0.934570524734088300, -0.934588312462285130, -0.934606097854011050, +-0.934623880909221770, -0.934641661627872770, -0.934659440009919630, -0.934677216055317950, -0.934694989764023100, -0.934712761135990890, -0.934730530171176690, -0.934748296869536200, +-0.934766061231025010, -0.934783823255598610, -0.934801582943212690, -0.934819340293822850, -0.934837095307384570, -0.934854847983853540, -0.934872598323185480, -0.934890346325335850, +-0.934908091990260370, -0.934925835317914730, -0.934943576308254420, -0.934961314961235250, -0.934979051276812800, -0.934996785254942560, -0.935014516895580570, -0.935032246198682080, +-0.935049973164203130, -0.935067697792099200, -0.935085420082325980, -0.935103140034839300, -0.935120857649594740, -0.935138572926548010, -0.935156285865654800, -0.935173996466870940, +-0.935191704730152120, -0.935209410655453930, -0.935227114242732300, -0.935244815491942830, -0.935262514403041420, -0.935280210975983680, -0.935297905210725420, -0.935315597107222340, +-0.935333286665430360, -0.935350973885305080, -0.935368658766802420, -0.935386341309878080, -0.935404021514487870, -0.935421699380587610, -0.935439374908133110, -0.935457048097080190, +-0.935474718947384650, -0.935492387459002320, -0.935510053631888990, -0.935527717466000610, -0.935545378961292860, -0.935563038117721680, -0.935580694935242870, -0.935598349413812370, +-0.935616001553385980, -0.935633651353919630, -0.935651298815369010, -0.935668943937690290, -0.935686586720839260, -0.935704227164771640, -0.935721865269443450, -0.935739501034810630, +-0.935757134460829090, -0.935774765547454650, -0.935792394294643340, -0.935810020702350980, -0.935827644770533710, -0.935845266499147230, -0.935862885888147590, -0.935880502937490700, +-0.935898117647132600, -0.935915730017029210, -0.935933340047136460, -0.935950947737410390, -0.935968553087807020, -0.935986156098282060, -0.936003756768791880, -0.936021355099292300, +-0.936038951089739340, -0.936056544740089040, -0.936074136050297210, -0.936091725020320230, -0.936109311650113800, -0.936126895939634160, -0.936144477888837260, -0.936162057497679110, +-0.936179634766115880, -0.936197209694103580, -0.936214782281598160, -0.936232352528555970, -0.936249920434932710, -0.936267486000684770, -0.936285049225768050, -0.936302610110138710, +-0.936320168653752780, -0.936337724856566630, -0.936355278718535970, -0.936372830239617260, -0.936390379419766440, -0.936407926258939540, -0.936425470757093040, -0.936443012914182640, +-0.936460552730164820, -0.936478090204995620, -0.936495625338631290, -0.936513158131027760, -0.936530688582141390, -0.936548216691928230, -0.936565742460344630, -0.936583265887346530, +-0.936600786972890400, -0.936618305716932280, -0.936635822119428420, -0.936653336180334860, -0.936670847899608080, -0.936688357277204120, -0.936705864313079340, -0.936723369007189890, +-0.936740871359492020, -0.936758371369942000, -0.936775869038495970, -0.936793364365110290, -0.936810857349741230, -0.936828347992345050, -0.936845836292877880, -0.936863322251296200, +-0.936880805867556180, -0.936898287141614270, -0.936915766073426530, -0.936933242662949420, -0.936950716910139090, -0.936968188814952140, -0.936985658377344600, -0.937003125597272950, +-0.937020590474693440, -0.937038053009562550, -0.937055513201836440, -0.937072971051471690, -0.937090426558424450, -0.937107879722651080, -0.937125330544108070, -0.937142779022751670, +-0.937160225158538360, -0.937177668951424400, -0.937195110401366380, -0.937212549508320560, -0.937229986272243410, -0.937247420693091190, -0.937264852770820500, -0.937282282505387590, +-0.937299709896749160, -0.937317134944861240, -0.937334557649680660, -0.937351978011163540, -0.937369396029266610, -0.937386811703946000, -0.937404225035158520, -0.937421636022860440, +-0.937439044667008230, -0.937456450967558470, -0.937473854924467550, -0.937491256537692050, -0.937508655807188340, -0.937526052732913010, -0.937543447314822530, -0.937560839552873500, +-0.937578229447022290, -0.937595616997225600, -0.937613002203439790, -0.937630385065621460, -0.937647765583727200, -0.937665143757713590, -0.937682519587537010, -0.937699893073154270, +-0.937717264214521620, -0.937734633011595990, -0.937751999464333630, -0.937769363572691360, -0.937786725336625550, -0.937804084756093110, -0.937821441831050430, -0.937838796561454080, +-0.937856148947260770, -0.937873498988426980, -0.937890846684909630, -0.937908192036664980, -0.937925535043649950, -0.937942875705821020, -0.937960214023135010, -0.937977549995548390, +-0.937994883623017970, -0.938012214905500240, -0.938029543842952010, -0.938046870435329970, -0.938064194682590720, -0.938081516584690860, -0.938098836141587400, -0.938116153353236730, +-0.938133468219595760, -0.938150780740621080, -0.938168090916269510, -0.938185398746497650, -0.938202704231262290, -0.938220007370520140, -0.938237308164228010, -0.938254606612342610, +-0.938271902714820750, -0.938289196471619010, -0.938306487882694330, -0.938323776948003510, -0.938341063667503140, -0.938358348041150260, -0.938375630068901350, -0.938392909750713430, +-0.938410187086543220, -0.938427462076347530, -0.938444734720083160, -0.938462005017707050, -0.938479272969175880, -0.938496538574446590, -0.938513801833475880, -0.938531062746220670, +-0.938548321312637770, -0.938565577532684100, -0.938582831406316600, -0.938600082933491840, -0.938617332114166980, -0.938634578948298710, -0.938651823435844080, -0.938669065576759780, +-0.938686305371002950, -0.938703542818530300, -0.938720777919298750, -0.938738010673265340, -0.938755241080386880, -0.938772469140620290, -0.938789694853922500, -0.938806918220250530, +-0.938824139239561210, -0.938841357911811670, -0.938858574236958620, -0.938875788214959210, -0.938892999845770240, -0.938910209129348750, -0.938927416065651780, -0.938944620654636350, +-0.938961822896259290, -0.938979022790477740, -0.938996220337248500, -0.939013415536528840, -0.939030608388275570, -0.939047798892445830, -0.939064987048996550, -0.939082172857884870, +-0.939099356319067600, -0.939116537432502120, -0.939133716198145120, -0.939150892615953970, -0.939168066685885590, -0.939185238407897030, -0.939202407781945410, -0.939219574807987680, +-0.939236739485981080, -0.939253901815882530, -0.939271061797649300, -0.939288219431238410, -0.939305374716607020, -0.939322527653712050, -0.939339678242510970, -0.939356826482960480, +-0.939373972375018070, -0.939391115918640660, -0.939408257113785510, -0.939425395960409640, -0.939442532458470430, -0.939459666607924680, -0.939476798408729890, -0.939493927860843070, +-0.939511054964221490, -0.939528179718822300, -0.939545302124602520, -0.939562422181519640, -0.939579539889530580, -0.939596655248592820, -0.939613768258663270, -0.939630878919699320, +-0.939647987231658210, -0.939665093194497090, -0.939682196808173330, -0.939699298072643960, -0.939716396987866460, -0.939733493553797870, -0.939750587770395550, -0.939767679637616870, +-0.939784769155418860, -0.939801856323759120, -0.939818941142594570, -0.939836023611882680, -0.939853103731580710, -0.939870181501646140, -0.939887256922036010, -0.939904329992707680, +-0.939921400713618630, -0.939938469084726000, -0.939955535105987280, -0.939972598777359610, -0.939989660098800580, -0.940006719070267230, -0.940023775691717240, -0.940040829963107670, +-0.940057881884396210, -0.940074931455539890, -0.940091978676496300, -0.940109023547222700, -0.940126066067676680, -0.940143106237815380, -0.940160144057596400, -0.940177179526976880, +-0.940194212645914630, -0.940211243414366680, -0.940228271832290740, -0.940245297899644170, -0.940262321616384230, -0.940279342982468510, -0.940296361997854380, -0.940313378662499530, +-0.940330392976361010, -0.940347404939396720, -0.940364414551563720, -0.940381421812819810, -0.940398426723122350, -0.940415429282428830, -0.940432429490696610, -0.940449427347883390, +-0.940466422853946660, -0.940483416008843780, -0.940500406812532440, -0.940517395264970020, -0.940534381366114110, -0.940551365115922300, -0.940568346514352170, -0.940585325561360990, +-0.940602302256906550, -0.940619276600946350, -0.940636248593438080, -0.940653218234339010, -0.940670185523607040, -0.940687150461199440, -0.940704113047074130, -0.940721073281188480, +-0.940738031163500190, -0.940754986693966730, -0.940771939872545810, -0.940788890699195020, -0.940805839173872170, -0.940822785296534510, -0.940839729067140080, -0.940856670485646250, +-0.940873609552010710, -0.940890546266191170, -0.940907480628145330, -0.940924412637830660, -0.940941342295204990, -0.940958269600226100, -0.940975194552851390, -0.940992117153038770, +-0.941009037400745820, -0.941025955295930250, -0.941042870838549870, -0.941059784028562270, -0.941076694865925160, -0.941093603350596440, -0.941110509482533500, -0.941127413261694470, +-0.941144314688036830, -0.941161213761518510, -0.941178110482096990, -0.941195004849730400, -0.941211896864376120, -0.941228786525992180, -0.941245673834536280, -0.941262558789966120, +-0.941279441392239620, -0.941296321641314490, -0.941313199537148650, -0.941330075079699680, -0.941346948268925620, -0.941363819104784170, -0.941380687587233140, -0.941397553716230350, +-0.941414417491733820, -0.941431278913701040, -0.941448137982090260, -0.941464994696859070, -0.941481849057965390, -0.941498701065367040, -0.941515550719022040, -0.941532398018887990, +-0.941549242964923150, -0.941566085557085100, -0.941582925795331870, -0.941599763679621280, -0.941616599209911250, -0.941633432386159820, -0.941650263208324790, -0.941667091676364090, +-0.941683917790235640, -0.941700741549897360, -0.941717562955307290, -0.941734382006423340, -0.941751198703203340, -0.941768013045605420, -0.941784825033587400, -0.941801634667107420, +-0.941818441946123190, -0.941835246870593060, -0.941852049440474630, -0.941868849655726150, -0.941885647516305550, -0.941902443022170850, -0.941919236173280110, -0.941936026969591110, +-0.941952815411062240, -0.941969601497651190, -0.941986385229316210, -0.942003166606015130, -0.942019945627706300, -0.942036722294347540, -0.942053496605896990, -0.942070268562312570, +-0.942087038163552660, -0.942103805409575060, -0.942120570300338020, -0.942137332835799480, -0.942154093015917680, -0.942170850840650550, -0.942187606309956350, -0.942204359423793100, +-0.942221110182119070, -0.942237858584892170, -0.942254604632070670, -0.942271348323612590, -0.942288089659476190, -0.942304828639619510, -0.942321565264000790, -0.942338299532578190, +-0.942355031445309850, -0.942371761002153920, -0.942388488203068530, -0.942405213048011950, -0.942421935536942310, -0.942438655669817880, -0.942455373446596800, -0.942472088867237320, +-0.942488801931697600, -0.942505512639935870, -0.942522220991910300, -0.942538926987579240, -0.942555630626900840, -0.942572331909833360, -0.942589030836335050, -0.942605727406364170, +-0.942622421619879080, -0.942639113476837820, -0.942655802977198750, -0.942672490120920250, -0.942689174907960450, -0.942705857338277720, -0.942722537411830430, -0.942739215128576720, +-0.942755890488475080, -0.942772563491483530, -0.942789234137560770, -0.942805902426664730, -0.942822568358754110, -0.942839231933786940, -0.942855893151721800, -0.942872552012516850, +-0.942889208516130560, -0.942905862662521190, -0.942922514451647210, -0.942939163883466990, -0.942955810957938790, -0.942972455675021080, -0.942989098034672240, -0.943005738036850730, +-0.943022375681514700, -0.943039010968622860, -0.943055643898133460, -0.943072274470004970, -0.943088902684195760, -0.943105528540664320, -0.943122152039369000, -0.943138773180268400, +-0.943155391963320770, -0.943172008388484810, -0.943188622455718660, -0.943205234164981030, -0.943221843516230280, -0.943238450509425010, -0.943255055144523460, -0.943271657421484440, +-0.943288257340266220, -0.943304854900827270, -0.943321450103126290, -0.943338042947121650, -0.943354633432771930, -0.943371221560035610, -0.943387807328871290, -0.943404390739237320, +-0.943420971791092410, -0.943437550484395150, -0.943454126819103900, -0.943470700795177360, -0.943487272412574240, -0.943503841671252670, -0.943520408571171700, -0.943536973112289680, +-0.943553535294565200, -0.943570095117956860, -0.943586652582423250, -0.943603207687923160, -0.943619760434414870, -0.943636310821857280, -0.943652858850208890, -0.943669404519428380, +-0.943685947829474240, -0.943702488780305380, -0.943719027371880180, -0.943735563604157560, -0.943752097477095870, -0.943768628990654060, -0.943785158144790580, -0.943801684939464370, +-0.943818209374633790, -0.943834731450257760, -0.943851251166294760, -0.943867768522703820, -0.943884283519443310, -0.943900796156472270, -0.943917306433749050, -0.943933814351232690, +-0.943950319908881790, -0.943966823106655030, -0.943983323944511230, -0.943999822422409100, -0.944016318540307540, -0.944032812298165050, -0.944049303695940530, -0.944065792733592810, +-0.944082279411080580, -0.944098763728362660, -0.944115245685397840, -0.944131725282144840, -0.944148202518562680, -0.944164677394609850, -0.944181149910245380, -0.944197620065428070, +-0.944214087860116740, -0.944230553294270080, -0.944247016367847140, -0.944263477080806600, -0.944279935433107400, -0.944296391424708340, -0.944312845055568340, -0.944329296325646220, +-0.944345745234900780, -0.944362191783291060, -0.944378635970775760, -0.944395077797314020, -0.944411517262864430, -0.944427954367386250, -0.944444389110837950, -0.944460821493178890, +-0.944477251514367570, -0.944493679174363330, -0.944510104473124780, -0.944526527410610940, -0.944542947986780850, -0.944559366201593310, -0.944575782055007470, -0.944592195546982150, +-0.944608606677476260, -0.944625015446448950, -0.944641421853859020, -0.944657825899665520, -0.944674227583827570, -0.944690626906303900, -0.944707023867053850, -0.944723418466036140, +-0.944739810703209890, -0.944756200578534040, -0.944772588091967850, -0.944788973243470000, -0.944805356032999870, -0.944821736460516260, -0.944838114525978320, -0.944854490229345090, +-0.944870863570575700, -0.944887234549629080, -0.944903603166464490, -0.944919969421040730, -0.944936333313317170, -0.944952694843252840, -0.944969054010806550, -0.944985410815937790, +-0.945001765258605460, -0.945018117338768730, -0.945034467056386610, -0.945050814411418470, -0.945067159403823240, -0.945083502033560060, -0.945099842300588190, -0.945116180204866650, +-0.945132515746354710, -0.945148848925011500, -0.945165179740796170, -0.945181508193667860, -0.945197834283585720, -0.945214158010509120, -0.945230479374396970, -0.945246798375208750, +-0.945263115012903610, -0.945279429287440460, -0.945295741198778900, -0.945312050746877960, -0.945328357931696890, -0.945344662753194840, -0.945360965211331280, -0.945377265306065140, +-0.945393563037356000, -0.945409858405162780, -0.945426151409445080, -0.945442442050161920, -0.945458730327272680, -0.945475016240736600, -0.945491299790512940, -0.945507580976561070, +-0.945523859798840350, -0.945540136257309820, -0.945556410351929060, -0.945572682082657100, -0.945588951449453650, -0.945605218452277740, -0.945621483091088730, -0.945637745365846110, +-0.945654005276509110, -0.945670262823037120, -0.945686518005389280, -0.945702770823525380, -0.945719021277404370, -0.945735269366985930, -0.945751515092229320, -0.945767758453093910, +-0.945783999449539060, -0.945800238081524250, -0.945816474349008730, -0.945832708251952200, -0.945848939790313810, -0.945865168964053040, -0.945881395773129350, -0.945897620217502340, +-0.945913842297131160, -0.945930062011975270, -0.945946279361994380, -0.945962494347147740, -0.945978706967394830, -0.945994917222695240, -0.946011125113008330, -0.946027330638293470, +-0.946043533798510470, -0.946059734593618470, -0.946075933023577290, -0.946092129088346170, -0.946108322787884810, -0.946124514122152590, -0.946140703091109090, -0.946156889694713790, +-0.946173073932926380, -0.946189255805706120, -0.946205435313012930, -0.946221612454805960, -0.946237787231045120, -0.946253959641689790, -0.946270129686699430, -0.946286297366033870, +-0.946302462679652460, -0.946318625627515010, -0.946334786209580890, -0.946350944425809910, -0.946367100276161440, -0.946383253760595400, -0.946399404879071040, -0.946415553631548280, +-0.946431700017986600, -0.946447844038345700, -0.946463985692585160, -0.946480124980664690, -0.946496261902543770, -0.946512396458182410, -0.946528528647539890, -0.946544658470576120, +-0.946560785927250680, -0.946576911017523280, -0.946593033741353730, -0.946609154098701390, -0.946625272089526290, -0.946641387713788030, -0.946657500971446190, -0.946673611862460680, +-0.946689720386791110, -0.946705826544397280, -0.946721930335238880, -0.946738031759275510, -0.946754130816467310, -0.946770227506773530, -0.946786321830154430, -0.946802413786569260, +-0.946818503375978280, -0.946834590598340960, -0.946850675453617120, -0.946866757941766670, -0.946882838062749310, -0.946898915816524860, -0.946914991203053000, -0.946931064222293890, +-0.946947134874206900, -0.946963203158752150, -0.946979269075889360, -0.946995332625578560, -0.947011393807779210, -0.947027452622451580, -0.947043509069555140, -0.947059563149050040, +-0.947075614860895980, -0.947091664205052860, -0.947107711181480630, -0.947123755790139190, -0.947139798030988240, -0.947155837903987830, -0.947171875409097860, -0.947187910546278160, +-0.947203943315488630, -0.947219973716689420, -0.947236001749840130, -0.947252027414900890, -0.947268050711831620, -0.947284071640592140, -0.947300090201142480, -0.947316106393442660, +-0.947332120217452500, -0.947348131673132030, -0.947364140760441400, -0.947380147479340180, -0.947396151829788760, -0.947412153811746930, -0.947428153425174720, -0.947444150670032070, +-0.947460145546279110, -0.947476138053875760, -0.947492128192782060, -0.947508115962958030, -0.947524101364363710, -0.947540084396959250, -0.947556065060704440, -0.947572043355559450, +-0.947588019281484390, -0.947603992838439320, -0.947619964026384260, -0.947635932845279360, -0.947651899295084420, -0.947667863375759920, -0.947683825087265670, -0.947699784429561930, +-0.947715741402608720, -0.947731696006366090, -0.947747648240794270, -0.947763598105853310, -0.947779545601503350, -0.947795490727704530, -0.947811433484416990, -0.947827373871600880, +-0.947843311889216330, -0.947859247537223500, -0.947875180815582640, -0.947891111724253670, -0.947907040263197050, -0.947922966432372730, -0.947938890231741050, -0.947954811661262050, +-0.947970730720896100, -0.947986647410603340, -0.948002561730344030, -0.948018473680078190, -0.948034383259766190, -0.948050290469368170, -0.948066195308844620, -0.948082097778155440, +-0.948097997877261010, -0.948113895606121580, -0.948129790964697520, -0.948145683952948850, -0.948161574570836050, -0.948177462818319380, -0.948193348695358870, -0.948209232201915220, +-0.948225113337948230, -0.948240992103418610, -0.948256868498286500, -0.948272742522512260, -0.948288614176056030, -0.948304483458878410, -0.948320350370939420, -0.948336214912199770, +-0.948352077082619370, -0.948367936882158920, -0.948383794310778570, -0.948399649368438790, -0.948415502055099720, -0.948431352370722070, -0.948447200315265970, -0.948463045888691900, +-0.948478889090960230, -0.948494729922031320, -0.948510568381865650, -0.948526404470423360, -0.948542238187665250, -0.948558069533551480, -0.948573898508042520, -0.948589725111098850, +-0.948605549342680820, -0.948621371202748920, -0.948637190691263730, -0.948653007808185400, -0.948668822553474620, -0.948684634927091760, -0.948700444928997300, -0.948716252559151710, +-0.948732057817515570, -0.948747860704049260, -0.948763661218713250, -0.948779459361468120, -0.948795255132274360, -0.948811048531092440, -0.948826839557882940, -0.948842628212606340, +-0.948858414495223010, -0.948874198405693870, -0.948889979943979060, -0.948905759110039380, -0.948921535903835320, -0.948937310325327470, -0.948953082374476180, -0.948968852051242370, +-0.948984619355586200, -0.949000384287468690, -0.949016146846850090, -0.949031907033691220, -0.949047664847952550, -0.949063420289594780, -0.949079173358578280, -0.949094924054864060, +-0.949110672378412400, -0.949126418329184100, -0.949142161907139740, -0.949157903112240020, -0.949173641944445530, -0.949189378403716870, -0.949205112490014820, -0.949220844203299880, +-0.949236573543532970, -0.949252300510674550, -0.949268025104685440, -0.949283747325526230, -0.949299467173157720, -0.949315184647540390, -0.949330899748635270, -0.949346612476402730, +-0.949362322830803800, -0.949378030811798950, -0.949393736419349210, -0.949409439653414950, -0.949425140513957210, -0.949440839000936450, -0.949456535114313720, -0.949472228854049690, +-0.949487920220104980, -0.949503609212440590, -0.949519295831017130, -0.949534980075795400, -0.949550661946736210, -0.949566341443800370, -0.949582018566948680, -0.949597693316141970, +-0.949613365691341030, -0.949629035692506670, -0.949644703319599710, -0.949660368572580960, -0.949676031451411330, -0.949691691956051630, -0.949707350086462680, -0.949723005842605380, +-0.949738659224440450, -0.949754310231929020, -0.949769958865031790, -0.949785605123709690, -0.949801249007923510, -0.949816890517634180, -0.949832529652802740, -0.949848166413389870, +-0.949863800799356620, -0.949879432810663780, -0.949895062447272510, -0.949910689709143500, -0.949926314596237780, -0.949941937108516270, -0.949957557245940000, -0.949973175008469670, +-0.949988790396066540, -0.950004403408691410, -0.950020014046305320, -0.950035622308869070, -0.950051228196343800, -0.950066831708690440, -0.950082432845870130, -0.950098031607843670, +-0.950113627994572110, -0.950129222006016460, -0.950144813642137760, -0.950160402902897050, -0.950175989788255350, -0.950191574298173690, -0.950207156432613000, -0.950222736191534520, +-0.950238313574899180, -0.950253888582668020, -0.950269461214802160, -0.950285031471262640, -0.950300599352010500, -0.950316164857006980, -0.950331727986212900, -0.950347288739589620, +-0.950362847117098060, -0.950378403118699480, -0.950393956744354780, -0.950409507994025240, -0.950425056867671870, -0.950440603365255930, -0.950456147486738460, -0.950471689232080590, +-0.950487228601243570, -0.950502765594188340, -0.950518300210876350, -0.950533832451268430, -0.950549362315326160, -0.950564889803010350, -0.950580414914282360, -0.950595937649103220, +-0.950611458007434410, -0.950626975989236840, -0.950642491594471890, -0.950658004823100590, -0.950673515675084400, -0.950689024150384370, -0.950704530248961840, -0.950720033970777980, +-0.950735535315794020, -0.950751034283971230, -0.950766530875270740, -0.950782025089654040, -0.950797516927082250, -0.950813006387516650, -0.950828493470918580, -0.950843978177249300, +-0.950859460506469970, -0.950874940458542040, -0.950890418033426780, -0.950905893231085430, -0.950921366051479370, -0.950936836494569950, -0.950952304560318320, -0.950967770248686060, +-0.950983233559634320, -0.950998694493124460, -0.951014153049117850, -0.951029609227575960, -0.951045063028460040, -0.951060514451731340, -0.951075963497351460, -0.951091410165281650, +-0.951106854455483370, -0.951122296367917790, -0.951137735902546690, -0.951153173059331000, -0.951168607838232540, -0.951184040239212550, -0.951199470262232500, -0.951214897907253660, +-0.951230323174237610, -0.951245746063145830, -0.951261166573939550, -0.951276584706580500, -0.951292000461029910, -0.951307413837249260, -0.951322824835200250, -0.951338233454844030, +-0.951353639696142280, -0.951369043559056490, -0.951384445043547910, -0.951399844149578340, -0.951415240877109160, -0.951430635226101940, -0.951446027196518050, -0.951461416788319080, +-0.951476804001466610, -0.951492188835922130, -0.951507571291647090, -0.951522951368603210, -0.951538329066751950, -0.951553704386054910, -0.951569077326473440, -0.951584447887969480, +-0.951599816070504260, -0.951615181874039600, -0.951630545298536860, -0.951645906343957850, -0.951661265010264160, -0.951676621297417150, -0.951691975205378630, -0.951707326734110180, +-0.951722675883573510, -0.951738022653729980, -0.951753367044541500, -0.951768709055969550, -0.951784048687975950, -0.951799385940522050, -0.951814720813569770, -0.951830053307080700, +-0.951845383421016540, -0.951860711155338770, -0.951876036510009400, -0.951891359484989820, -0.951906680080241930, -0.951921998295727210, -0.951937314131407590, -0.951952627587244750, +-0.951967938663200290, -0.951983247359235900, -0.951998553675313500, -0.952013857611394680, -0.952029159167441130, -0.952044458343414780, -0.952059755139277210, -0.952075049554990340, +-0.952090341590515750, -0.952105631245815490, -0.952120918520850900, -0.952136203415584250, -0.952151485929976890, -0.952166766063990980, -0.952182043817588090, -0.952197319190730030, +-0.952212592183378730, -0.952227862795495980, -0.952243131027043500, -0.952258396877983300, -0.952273660348277100, -0.952288921437886680, -0.952304180146773980, -0.952319436474900800, +-0.952334690422229070, -0.952349941988720470, -0.952365191174337270, -0.952380437979040930, -0.952395682402793490, -0.952410924445556860, -0.952426164107292970, -0.952441401387963630, +-0.952456636287530860, -0.952471868805956360, -0.952487098943202270, -0.952502326699230410, -0.952517552074002790, -0.952532775067481240, -0.952547995679627780, -0.952563213910404330, +-0.952578429759772800, -0.952593643227695350, -0.952608854314133560, -0.952624063019049780, -0.952639269342405840, -0.952654473284163750, -0.952669674844285330, -0.952684874022732830, +-0.952700070819468170, -0.952715265234453270, -0.952730457267650270, -0.952745646919021080, -0.952760834188527750, -0.952776019076132410, -0.952791201581796980, -0.952806381705483480, +-0.952821559447154080, -0.952836734806770890, -0.952851907784295740, -0.952867078379690870, -0.952882246592918310, -0.952897412423940100, -0.952912575872718380, -0.952927736939215180, +-0.952942895623392740, -0.952958051925212880, -0.952973205844638070, -0.952988357381630120, -0.953003506536151400, -0.953018653308163820, -0.953033797697629640, -0.953048939704510990, +-0.953064079328769910, -0.953079216570368650, -0.953094351429269460, -0.953109483905434260, -0.953124613998825420, -0.953139741709405080, -0.953154867037135370, -0.953169989981978330, +-0.953185110543896540, -0.953200228722851930, -0.953215344518806630, -0.953230457931723120, -0.953245568961563320, -0.953260677608289700, -0.953275783871864290, -0.953290887752249460, +-0.953305989249407460, -0.953321088363300430, -0.953336185093890730, -0.953351279441140620, -0.953366371405012130, -0.953381460985467830, -0.953396548182469880, -0.953411632995980530, +-0.953426715425962130, -0.953441795472376950, -0.953456873135187230, -0.953471948414355340, -0.953487021309843640, -0.953502091821614380, -0.953517159949629820, -0.953532225693852430, +-0.953547289054244460, -0.953562350030768170, -0.953577408623386140, -0.953592464832060500, -0.953607518656753750, -0.953622570097428120, -0.953637619154046210, -0.953652665826570160, +-0.953667710114962430, -0.953682752019185510, -0.953697791539201640, -0.953712828674973310, -0.953727863426462870, -0.953742895793632810, -0.953757925776445580, -0.953772953374863340, +-0.953787978588848890, -0.953803001418364490, -0.953818021863372500, -0.953833039923835610, -0.953848055599715970, -0.953863068890976270, -0.953878079797578770, -0.953893088319486160, +-0.953908094456660800, -0.953923098209065290, -0.953938099576661980, -0.953953098559413460, -0.953968095157282090, -0.953983089370230570, -0.953998081198221270, -0.954013070641216880, +-0.954028057699179640, -0.954043042372072380, -0.954058024659857450, -0.954073004562497550, -0.954087982079955150, -0.954102957212192630, -0.954117929959172880, -0.954132900320858180, +-0.954147868297211430, -0.954162833888194780, -0.954177797093771150, -0.954192757913903010, -0.954207716348553060, -0.954222672397683660, -0.954237626061257730, -0.954252577339237630, +-0.954267526231586170, -0.954282472738265720, -0.954297416859239300, -0.954312358594469170, -0.954327297943918350, -0.954342234907549100, -0.954357169485324340, -0.954372101677206650, +-0.954387031483158730, -0.954401958903143170, -0.954416883937122760, -0.954431806585060110, -0.954446726846918000, -0.954461644722659040, -0.954476560212245920, -0.954491473315641440, +-0.954506384032808300, -0.954521292363709200, -0.954536198308306830, -0.954551101866564000, -0.954566003038443410, -0.954580901823907760, -0.954595798222919960, -0.954610692235442590, +-0.954625583861438480, -0.954640473100870410, -0.954655359953701210, -0.954670244419893570, -0.954685126499410290, -0.954700006192214290, -0.954714883498268270, -0.954729758417534930, +-0.954744630949977300, -0.954759501095558070, -0.954774368854240050, -0.954789234225986160, -0.954804097210759100, -0.954818957808521880, -0.954833816019237220, -0.954848671842868040, +-0.954863525279377230, -0.954878376328727520, -0.954893224990881920, -0.954908071265803240, -0.954922915153454400, -0.954937756653798210, -0.954952595766797700, -0.954967432492415670, +-0.954982266830615050, -0.954997098781358860, -0.955011928344609800, -0.955026755520331010, -0.955041580308485180, -0.955056402709035580, -0.955071222721944890, -0.955086040347176150, +-0.955100855584692270, -0.955115668434456390, -0.955130478896431100, -0.955145286970579880, -0.955160092656865300, -0.955174895955250510, -0.955189696865698430, -0.955204495388172200, +-0.955219291522634630, -0.955234085269048960, -0.955248876627377900, -0.955263665597584800, -0.955278452179632480, -0.955293236373484070, -0.955308018179102600, -0.955322797596451000, +-0.955337574625492400, -0.955352349266189950, -0.955367121518506560, -0.955381891382405370, -0.955396658857849520, -0.955411423944801940, -0.955426186643225870, -0.955440946953084240, +-0.955455704874340280, -0.955470460406957050, -0.955485213550897770, -0.955499964306125270, -0.955514712672603020, -0.955529458650293930, -0.955544202239161260, -0.955558943439167920, +-0.955573682250277390, -0.955588418672452590, -0.955603152705656770, -0.955617884349853060, -0.955632613605004620, -0.955647340471074690, -0.955662064948026300, -0.955676787035822930, +-0.955691506734427380, -0.955706224043803230, -0.955720938963913410, -0.955735651494721280, -0.955750361636189980, -0.955765069388282870, -0.955779774750963100, -0.955794477724193790, +-0.955809178307938320, -0.955823876502159940, -0.955838572306821900, -0.955853265721887340, -0.955867956747319610, -0.955882645383082100, -0.955897331629137930, -0.955912015485450350, +-0.955926696951982850, -0.955941376028698550, -0.955956052715560830, -0.955970727012532940, -0.955985398919578230, -0.956000068436660080, -0.956014735563741720, -0.956029400300786540, +-0.956044062647757880, -0.956058722604618990, -0.956073380171333360, -0.956088035347864240, -0.956102688134175090, -0.956117338530229070, -0.956131986535989850, -0.956146632151420590, +-0.956161275376484880, -0.956175916211145840, -0.956190554655367060, -0.956205190709111920, -0.956219824372343760, -0.956234455645026070, -0.956249084527122210, -0.956263711018595640, +-0.956278335119409850, -0.956292956829528200, -0.956307576148914150, -0.956322193077531190, -0.956336807615342680, -0.956351419762312190, -0.956366029518403100, -0.956380636883578990, +-0.956395241857803220, -0.956409844441039490, -0.956424444633250940, -0.956439042434401480, -0.956453637844454250, -0.956468230863373070, -0.956482821491121290, -0.956497409727662400, +-0.956511995572960070, -0.956526579026977570, -0.956541160089678820, -0.956555738761027060, -0.956570315040986000, -0.956584888929519090, -0.956599460426590050, -0.956614029532162350, +-0.956628596246199560, -0.956643160568665160, -0.956657722499523080, -0.956672282038736440, -0.956686839186269290, -0.956701393942084980, -0.956715946306147200, -0.956730496278419550, +-0.956745043858865610, -0.956759589047449180, -0.956774131844133620, -0.956788672248882870, -0.956803210261660380, -0.956817745882429850, -0.956832279111154980, -0.956846809947799470, +-0.956861338392326790, -0.956875864444700850, -0.956890388104885250, -0.956904909372843780, -0.956919428248539820, -0.956933944731937490, -0.956948458823000170, -0.956962970521691770, +-0.956977479827975870, -0.956991986741816400, -0.957006491263176830, -0.957020993392021070, -0.957035493128312820, -0.957049990472015890, -0.957064485423093970, -0.957078977981510870, +-0.957093468147230290, -0.957107955920216020, -0.957122441300431890, -0.957136924287841580, -0.957151404882409020, -0.957165883084097890, -0.957180358892872230, -0.957194832308695510, +-0.957209303331531760, -0.957223771961344670, -0.957238238198098280, -0.957252702041756160, -0.957267163492282470, -0.957281622549640670, -0.957296079213795000, -0.957310533484708960, +-0.957324985362346670, -0.957339434846671940, -0.957353881937648590, -0.957368326635240630, -0.957382768939411650, -0.957397208850125910, -0.957411646367347100, -0.957426081491039250, +-0.957440514221166050, -0.957454944557691650, -0.957469372500579840, -0.957483798049794670, -0.957498221205300040, -0.957512641967059760, -0.957527060335037870, -0.957541476309198390, +-0.957555889889505240, -0.957570301075922340, -0.957584709868413600, -0.957599116266943160, -0.957613520271474950, -0.957627921881972880, -0.957642321098401080, -0.957656717920723490, +-0.957671112348904010, -0.957685504382906780, -0.957699894022695840, -0.957714281268235100, -0.957728666119488700, -0.957743048576420560, -0.957757428638994930, -0.957771806307175620, +-0.957786181580926880, -0.957800554460212620, -0.957814924944996980, -0.957829293035244110, -0.957843658730917920, -0.957858022031982560, -0.957872382938402270, -0.957886741450140860, +-0.957901097567162680, -0.957915451289431790, -0.957929802616912300, -0.957944151549568250, -0.957958498087363770, -0.957972842230263130, -0.957987183978230350, -0.958001523331229570, +-0.958015860289225030, -0.958030194852180880, -0.958044527020061150, -0.958058856792830090, -0.958073184170451950, -0.958087509152890870, -0.958101831740110990, -0.958116151932076550, +-0.958130469728751710, -0.958144785130100710, -0.958159098136087680, -0.958173408746677000, -0.958187716961832690, -0.958202022781519220, -0.958216326205700630, -0.958230627234341270, +-0.958244925867405280, -0.958259222104857030, -0.958273515946660660, -0.958287807392780520, -0.958302096443180870, -0.958316383097825960, -0.958330667356680150, -0.958344949219707590, +-0.958359228686872730, -0.958373505758139730, -0.958387780433473060, -0.958402052712836850, -0.958416322596195580, -0.958430590083513500, -0.958444855174754970, -0.958459117869884140, +-0.958473378168865690, -0.958487636071663650, -0.958501891578242730, -0.958516144688566940, -0.958530395402600770, -0.958544643720308680, -0.958558889641654920, -0.958573133166603970, +-0.958587374295120200, -0.958601613027167950, -0.958615849362711710, -0.958630083301715840, -0.958644314844144700, -0.958658543989962860, -0.958672770739134590, -0.958686995091624470, +-0.958701217047396750, -0.958715436606416120, -0.958729653768646830, -0.958743868534053360, -0.958758080902600280, -0.958772290874251980, -0.958786498448973010, -0.958800703626727760, +-0.958814906407480790, -0.958829106791196480, -0.958843304777839410, -0.958857500367374050, -0.958871693559765090, -0.958885884354976680, -0.958900072752973730, -0.958914258753720490, +-0.958928442357181670, -0.958942623563321720, -0.958956802372105230, -0.958970978783496690, -0.958985152797460770, -0.958999324413961960, -0.959013493632964840, -0.959027660454433880, +-0.959041824878333890, -0.959055986904629340, -0.959070146533284820, -0.959084303764264900, -0.959098458597534180, -0.959112611033057340, -0.959126761070798970, -0.959140908710723770, +-0.959155053952796210, -0.959169196796981090, -0.959183337243242900, -0.959197475291546420, -0.959211610941856250, -0.959225744194137090, -0.959239875048353400, -0.959254003504470210, +-0.959268129562451890, -0.959282253222263350, -0.959296374483869060, -0.959310493347233950, -0.959324609812322590, -0.959338723879099690, -0.959352835547529930, -0.959366944817578120, +-0.959381051689208950, -0.959395156162387130, -0.959409258237077460, -0.959423357913244620, -0.959437455190853440, -0.959451550069868600, -0.959465642550254790, -0.959479732631976940, +-0.959493820314999860, -0.959507905599288000, -0.959521988484806520, -0.959536068971520110, -0.959550147059393450, -0.959564222748391480, -0.959578296038478880, -0.959592366929620580, +-0.959606435421781370, -0.959620501514926060, -0.959634565209019570, -0.959648626504026600, -0.959662685399912060, -0.959676741896640760, -0.959690795994177610, -0.959704847692487650, +-0.959718896991535340, -0.959732943891285940, -0.959746988391704140, -0.959761030492754850, -0.959775070194403000, -0.959789107496613390, -0.959803142399351160, -0.959817174902581010, +-0.959831205006267840, -0.959845232710376810, -0.959859258014872600, -0.959873280919720240, -0.959887301424884650, -0.959901319530330980, -0.959915335236023790, -0.959929348541928460, +-0.959943359448009680, -0.959957367954232480, -0.959971374060561880, -0.959985377766962800, -0.959999379073400270, -0.960013377979839320, -0.960027374486244980, -0.960041368592582160, +-0.960055360298816000, -0.960069349604911300, -0.960083336510833330, -0.960097321016546880, -0.960111303122017310, -0.960125282827209330, -0.960139260132088280, -0.960153235036618980, +-0.960167207540766680, -0.960181177644496180, -0.960195145347772950, -0.960209110650561800, -0.960223073552827770, -0.960237034054536200, -0.960250992155651910, -0.960264947856140250, +-0.960278901155966150, -0.960292852055094850, -0.960306800553491380, -0.960320746651120990, -0.960334690347948610, -0.960348631643939580, -0.960362570539058940, -0.960376507033271930, +-0.960390441126543590, -0.960404372818839170, -0.960418302110123800, -0.960432229000362740, -0.960446153489521000, -0.960460075577563970, -0.960473995264456650, -0.960487912550164410, +-0.960501827434652510, -0.960515739917885860, -0.960529649999829930, -0.960543557680449860, -0.960557462959710890, -0.960571365837578290, -0.960585266314017310, -0.960599164388993070, +-0.960613060062470940, -0.960626953334416170, -0.960640844204794120, -0.960654732673569820, -0.960668618740708750, -0.960682502406176140, -0.960696383669937260, -0.960710262531957350, +-0.960724138992201880, -0.960738013050636110, -0.960751884707225170, -0.960765753961934640, -0.960779620814729670, -0.960793485265575730, -0.960807347314437950, -0.960821206961281820, +-0.960835064206072680, -0.960848919048776010, -0.960862771489356840, -0.960876621527780860, -0.960890469164013330, -0.960904314398019600, -0.960918157229765040, -0.960931997659215220, +-0.960945835686335290, -0.960959671311090840, -0.960973504533447100, -0.960987335353369660, -0.961001163770823900, -0.961014989785775260, -0.961028813398189130, -0.961042634608030970, +-0.961056453415266130, -0.961070269819860210, -0.961084083821778680, -0.961097895420986890, -0.961111704617450440, -0.961125511411134560, -0.961139315802005070, -0.961153117790027210, +-0.961166917375166570, -0.961180714557388630, -0.961194509336658950, -0.961208301712942910, -0.961222091686206200, -0.961235879256414180, -0.961249664423532550, -0.961263447187526650, +-0.961277227548362200, -0.961291005506004660, -0.961304781060419720, -0.961318554211572640, -0.961332324959429330, -0.961346093303955150, -0.961359859245115690, -0.961373622782876640, +-0.961387383917203580, -0.961401142648061980, -0.961414898975417540, -0.961428652899235850, -0.961442404419482480, -0.961456153536123240, -0.961469900249123490, -0.961483644558449040, +-0.961497386464065460, -0.961511125965938460, -0.961524863064033620, -0.961538597758316630, -0.961552330048753070, -0.961566059935308750, -0.961579787417949250, -0.961593512496640380, +-0.961607235171347610, -0.961620955442036850, -0.961634673308673690, -0.961648388771223720, -0.961662101829652950, -0.961675812483926750, -0.961689520734011150, -0.961703226579871730, +-0.961716930021474180, -0.961730631058784420, -0.961744329691768040, -0.961758025920390720, -0.961771719744618500, -0.961785411164416850, -0.961799100179751790, -0.961812786790588900, +-0.961826470996894000, -0.961840152798633000, -0.961853832195771590, -0.961867509188275570, -0.961881183776110870, -0.961894855959243290, -0.961908525737638300, -0.961922193111262260, +-0.961935858080080530, -0.961949520644059250, -0.961963180803164120, -0.961976838557361160, -0.961990493906615950, -0.962004146850894640, -0.962017797390162910, -0.962031445524386690, +-0.962045091253531770, -0.962058734577564300, -0.962072375496449860, -0.962086014010154480, -0.962099650118644070, -0.962113283821884660, -0.962126915119841940, -0.962140544012481950, +-0.962154170499770590, -0.962167794581673790, -0.962181416258157560, -0.962195035529187730, -0.962208652394730300, -0.962222266854751320, -0.962235878909216580, -0.962249488558092110, +-0.962263095801344060, -0.962276700638938220, -0.962290303070840620, -0.962303903097017190, -0.962317500717434160, -0.962331095932057230, -0.962344688740852660, -0.962358279143786350, +-0.962371867140824340, -0.962385452731932540, -0.962399035917077320, -0.962412616696224350, -0.962426195069339910, -0.962439771036390000, -0.962453344597340550, -0.962466915752157930, +-0.962480484500807810, -0.962494050843256680, -0.962507614779470220, -0.962521176309414920, -0.962534735433056450, -0.962548292150361310, -0.962561846461295390, -0.962575398365824950, +-0.962588947863915910, -0.962602494955534520, -0.962616039640646900, -0.962629581919219210, -0.962643121791217470, -0.962656659256608040, -0.962670194315356830, -0.962683726967430320, +-0.962697257212794310, -0.962710785051415270, -0.962724310483259240, -0.962737833508292450, -0.962751354126481050, -0.962764872337791290, -0.962778388142189410, -0.962791901539641450, +-0.962805412530113760, -0.962818921113572480, -0.962832427289983970, -0.962845931059314370, -0.962859432421530050, -0.962872931376597020, -0.962886427924481760, -0.962899922065150290, +-0.962913413798569210, -0.962926903124704410, -0.962940390043522500, -0.962953874554989490, -0.962967356659071850, -0.962980836355735840, -0.962994313644947700, -0.963007788526673790, +-0.963021261000880370, -0.963034731067533900, -0.963048198726600520, -0.963061663978046710, -0.963075126821838600, -0.963088587257942890, -0.963102045286325480, -0.963115500906953190, +-0.963128954119791940, -0.963142404924808400, -0.963155853321968850, -0.963169299311239730, -0.963182742892587210, -0.963196184065977960, -0.963209622831378120, -0.963223059188754390, +-0.963236493138072910, -0.963249924679300260, -0.963263353812402800, -0.963276780537346890, -0.963290204854099000, -0.963303626762625600, -0.963317046262893270, -0.963330463354868160, +-0.963343878038517070, -0.963357290313806120, -0.963370700180702030, -0.963384107639171150, -0.963397512689180060, -0.963410915330695120, -0.963424315563682910, -0.963437713388109910, +-0.963451108803942690, -0.963464501811147620, -0.963477892409691390, -0.963491280599540370, -0.963504666380661120, -0.963518049753020240, -0.963531430716584200, -0.963544809271319690, +-0.963558185417193070, -0.963571559154170920, -0.963584930482219940, -0.963598299401306700, -0.963611665911397570, -0.963625030012459470, -0.963638391704458640, -0.963651750987361890, +-0.963665107861135680, -0.963678462325746830, -0.963691814381161690, -0.963705164027347180, -0.963718511264269660, -0.963731856091895820, -0.963745198510192360, -0.963758538519125960, +-0.963771876118663220, -0.963785211308770820, -0.963798544089415340, -0.963811874460563490, -0.963825202422181950, -0.963838527974237410, -0.963851851116696580, -0.963865171849526030, +-0.963878490172692670, -0.963891806086162980, -0.963905119589903880, -0.963918430683881830, -0.963931739368063870, -0.963945045642416450, -0.963958349506906510, -0.963971650961500610, +-0.963984950006165690, -0.963998246640868190, -0.964011540865575280, -0.964024832680253410, -0.964038122084869500, -0.964051409079390240, -0.964064693663782560, -0.964077975838013130, +-0.964091255602048670, -0.964104532955856190, -0.964117807899402270, -0.964131080432653830, -0.964144350555577790, -0.964157618268140840, -0.964170883570309780, -0.964184146462051530, +-0.964197406943332890, -0.964210665014120780, -0.964223920674382010, -0.964237173924083480, -0.964250424763191890, -0.964263673191674390, -0.964276919209497540, -0.964290162816628600, +-0.964303404013034050, -0.964316642798681120, -0.964329879173536630, -0.964343113137567260, -0.964356344690740270, -0.964369573833022240, -0.964382800564380420, -0.964396024884781600, +-0.964409246794192710, -0.964422466292580660, -0.964435683379912480, -0.964448898056155080, -0.964462110321275380, -0.964475320175240510, -0.964488527618017290, -0.964501732649572730, +-0.964514935269873860, -0.964528135478887600, -0.964541333276581090, -0.964554528662921130, -0.964567721637874960, -0.964580912201409510, -0.964594100353491690, -0.964607286094088750, +-0.964620469423167370, -0.964633650340695040, -0.964646828846638440, -0.964660004940964820, -0.964673178623641210, -0.964686349894634640, -0.964699518753912130, -0.964712685201440930, +-0.964725849237187960, -0.964739010861120350, -0.964752170073205240, -0.964765326873409770, -0.964778481261700850, -0.964791633238045840, -0.964804782802411660, -0.964817929954765560, +-0.964831074695074560, -0.964844217023306030, -0.964857356939426870, -0.964870494443404340, -0.964883629535205570, -0.964896762214797700, -0.964909892482147980, -0.964923020337223440, +-0.964936145779991430, -0.964949268810419090, -0.964962389428473570, -0.964975507634121990, -0.964988623427331600, -0.965001736808069780, -0.965014847776303530, -0.965027956332000230, +-0.965041062475127000, -0.965054166205651100, -0.965067267523539880, -0.965080366428760380, -0.965093462921279950, -0.965106557001065960, -0.965119648668085530, -0.965132737922306030, +-0.965145824763694590, -0.965158909192218690, -0.965171991207845470, -0.965185070810542280, -0.965198148000276370, -0.965211222777015100, -0.965224295140725830, -0.965237365091375810, +-0.965250432628932290, -0.965263497753362840, -0.965276560464634500, -0.965289620762714850, -0.965302678647571020, -0.965315734119170710, -0.965328787177480940, -0.965341837822469180, +-0.965354886054102800, -0.965367931872349370, -0.965380975277176030, -0.965394016268550150, -0.965407054846439290, -0.965420091010810830, -0.965433124761632120, -0.965446156098870630, +-0.965459185022493730, -0.965472211532468760, -0.965485235628763430, -0.965498257311344980, -0.965511276580180770, -0.965524293435238490, -0.965537307876485400, -0.965550319903889060, +-0.965563329517416970, -0.965576336717036470, -0.965589341502715250, -0.965602343874420570, -0.965615343832120110, -0.965628341375781240, -0.965641336505371540, -0.965654329220858480, +-0.965667319522209630, -0.965680307409392480, -0.965693292882374490, -0.965706275941123350, -0.965719256585606420, -0.965732234815791510, -0.965745210631645870, -0.965758184033137290, +-0.965771155020233140, -0.965784123592901220, -0.965797089751108890, -0.965810053494823960, -0.965823014824013780, -0.965835973738646160, -0.965848930238688560, -0.965861884324108690, +-0.965874835994874000, -0.965887785250952310, -0.965900732092311090, -0.965913676518918020, -0.965926618530740910, -0.965939558127747120, -0.965952495309904460, -0.965965430077180610, +-0.965978362429543160, -0.965991292366959800, -0.966004219889398220, -0.966017144996826000, -0.966030067689211070, -0.966042987966520770, -0.966055905828723250, -0.966068821275785750, +-0.966081734307676300, -0.966094644924362480, -0.966107553125812090, -0.966120458911992830, -0.966133362282872390, -0.966146263238418460, -0.966159161778599060, -0.966172057903381680, +-0.966184951612734100, -0.966197842906624140, -0.966210731785019590, -0.966223618247888270, -0.966236502295197860, -0.966249383926916170, -0.966262263143011000, -0.966275139943450270, +-0.966288014328201660, -0.966300886297232990, -0.966313755850512050, -0.966326622988006870, -0.966339487709685030, -0.966352350015514450, -0.966365209905463040, -0.966378067379498610, +-0.966390922437588950, -0.966403775079702100, -0.966416625305805630, -0.966429473115867800, -0.966442318509856180, -0.966455161487738800, -0.966468002049483580, -0.966480840195058200, +-0.966493675924430810, -0.966506509237569200, -0.966519340134441410, -0.966532168615015120, -0.966544994679258470, -0.966557818327139380, -0.966570639558625770, -0.966583458373685420, +-0.966596274772286490, -0.966609088754396880, -0.966621900319984630, -0.966634709469017530, -0.966647516201463720, -0.966660320517291010, -0.966673122416467630, -0.966685921898961410, +-0.966698718964740360, -0.966711513613772500, -0.966724305846025870, -0.966737095661468480, -0.966749883060068370, -0.966762668041793560, -0.966775450606611960, -0.966788230754491940, +-0.966801008485401180, -0.966813783799307940, -0.966826556696180230, -0.966839327175986200, -0.966852095238693750, -0.966864860884271150, -0.966877624112686410, -0.966890384923907550, +-0.966903143317902720, -0.966915899294640060, -0.966928652854087690, -0.966941403996213640, -0.966954152720986060, -0.966966899028373180, -0.966979642918343040, -0.966992384390863660, +-0.967005123445903500, -0.967017860083430380, -0.967030594303412650, -0.967043326105818450, -0.967056055490616020, -0.967068782457773280, -0.967081507007258700, -0.967094229139040310, +-0.967106948853086460, -0.967119666149365060, -0.967132381027844600, -0.967145093488493200, -0.967157803531279110, -0.967170511156170360, -0.967183216363135420, -0.967195919152142540, +-0.967208619523159620, -0.967221317476155360, -0.967234013011097680, -0.967246706127955050, -0.967259396826695590, -0.967272085107287790, -0.967284770969699560, -0.967297454413899580, +-0.967310135439855890, -0.967322814047536840, -0.967335490236910790, -0.967348164007945990, -0.967360835360610790, -0.967373504294873570, -0.967386170810702440, -0.967398834908066000, +-0.967411496586932370, -0.967424155847270150, -0.967436812689047470, -0.967449467112232670, -0.967462119116794360, -0.967474768702700660, -0.967487415869920040, -0.967500060618420870, +-0.967512702948171600, -0.967525342859140600, -0.967537980351296230, -0.967550615424606740, -0.967563248079040930, -0.967575878314566930, -0.967588506131153210, -0.967601131528768140, +-0.967613754507380410, -0.967626375066958140, -0.967638993207470040, -0.967651608928884470, -0.967664222231169880, -0.967676833114294640, -0.967689441578227340, -0.967702047622936550, +-0.967714651248390510, -0.967727252454557930, -0.967739851241407160, -0.967752447608906770, -0.967765041557025250, -0.967777633085731170, -0.967790222194993000, -0.967802808884779320, +-0.967815393155058490, -0.967827975005799310, -0.967840554436970040, -0.967853131448539570, -0.967865706040476170, -0.967878278212748520, -0.967890847965325100, -0.967903415298174700, +-0.967915980211265680, -0.967928542704566740, -0.967941102778046350, -0.967953660431673300, -0.967966215665416070, -0.967978768479243360, -0.967991318873123730, -0.968003866847025660, +-0.968016412400918070, -0.968028955534769310, -0.968041496248548290, -0.968054034542223500, -0.968066570415763610, -0.968079103869137310, -0.968091634902313200, -0.968104163515260070, +-0.968116689707946510, -0.968129213480341200, -0.968141734832412840, -0.968154253764130220, -0.968166770275461940, -0.968179284366376680, -0.968191796036843240, -0.968204305286830320, +-0.968216812116306610, -0.968229316525241020, -0.968241818513601920, -0.968254318081358420, -0.968266815228479020, -0.968279309954932720, -0.968291802260688010, -0.968304292145713900, +-0.968316779609978970, -0.968329264653452150, -0.968341747276102120, -0.968354227477897790, -0.968366705258807860, -0.968379180618801130, -0.968391653557846510, -0.968404124075912700, +-0.968416592172968600, -0.968429057848983030, -0.968441521103924790, -0.968453981937762780, -0.968466440350465810, -0.968478896342002790, -0.968491349912342430, -0.968503801061453730, +-0.968516249789305620, -0.968528696095866670, -0.968541139981106140, -0.968553581444992710, -0.968566020487495400, -0.968578457108583040, -0.968590891308224510, -0.968603323086388630, +-0.968615752443044540, -0.968628179378161150, -0.968640603891707250, -0.968653025983651770, -0.968665445653963840, -0.968677862902612150, -0.968690277729565950, -0.968702690134793930, +-0.968715100118265340, -0.968727507679948860, -0.968739912819813640, -0.968752315537828700, -0.968764715833962950, -0.968777113708185420, -0.968789509160465020, -0.968801902190771000, +-0.968814292799072050, -0.968826680985337530, -0.968839066749536130, -0.968851450091637200, -0.968863831011609560, -0.968876209509422440, -0.968888585585044760, -0.968900959238445660, +-0.968913330469594050, -0.968925699278459170, -0.968938065665010060, -0.968950429629215740, -0.968962791171045450, -0.968975150290468100, -0.968987506987452840, -0.968999861261968910, +-0.969012213113985220, -0.969024562543471020, -0.969036909550395560, -0.969049254134727640, -0.969061596296436730, -0.969073936035491750, -0.969086273351861930, -0.969098608245516410, +-0.969110940716424450, -0.969123270764554960, -0.969135598389877510, -0.969147923592360900, -0.969160246371974620, -0.969172566728687570, -0.969184884662469330, -0.969197200173288700, +-0.969209513261115040, -0.969221823925917710, -0.969234132167665740, -0.969246437986328590, -0.969258741381875180, -0.969271042354274970, -0.969283340903497100, -0.969295637029511050, +-0.969307930732285720, -0.969320222011790690, -0.969332510867994990, -0.969344797300868090, -0.969357081310379230, -0.969369362896497560, -0.969381642059192530, -0.969393918798433510, +-0.969406193114189520, -0.969418465006430140, -0.969430734475124510, -0.969443001520242210, -0.969455266141752260, -0.969467528339624240, -0.969479788113827400, -0.969492045464330990, +-0.969504300391104580, -0.969516552894117310, -0.969528802973338650, -0.969541050628738080, -0.969553295860284830, -0.969565538667948370, -0.969577779051698060, -0.969590017011503270, +-0.969602252547333450, -0.969614485659157980, -0.969626716346946420, -0.969638944610667910, -0.969651170450292140, -0.969663393865788370, -0.969675614857126170, -0.969687833424274890, +-0.969700049567204130, -0.969712263285883220, -0.969724474580281550, -0.969736683450368790, -0.969748889896114190, -0.969761093917487550, -0.969773295514458010, -0.969785494686995380, +-0.969797691435068890, -0.969809885758648240, -0.969822077657702790, -0.969834267132202220, -0.969846454182116010, -0.969858638807413630, -0.969870821008064650, -0.969883000784038660, +-0.969895178135305120, -0.969907353061833620, -0.969919525563593730, -0.969931695640555150, -0.969943863292687110, -0.969956028519959660, -0.969968191322342020, -0.969980351699803900, +-0.969992509652314870, -0.970004665179844630, -0.970016818282362750, -0.970028968959838700, -0.970041117212242290, -0.970053263039543090, -0.970065406441710800, -0.970077547418714880, +-0.970089685970525140, -0.970101822097111270, -0.970113955798442730, -0.970126087074489330, -0.970138215925220760, -0.970150342350606600, -0.970162466350616650, -0.970174587925220380, +-0.970186707074387810, -0.970198823798088420, -0.970210938096291890, -0.970223049968968130, -0.970235159416086730, -0.970247266437617380, -0.970259371033529880, -0.970271473203793920, +-0.970283572948379300, -0.970295670267255830, -0.970307765160393080, -0.970319857627760960, -0.970331947669329180, -0.970344035285067630, -0.970356120474945790, -0.970368203238933800, +-0.970380283577001230, -0.970392361489118120, -0.970404436975253910, -0.970416510035378650, -0.970428580669462140, -0.970440648877474170, -0.970452714659384650, -0.970464778015163290, +-0.970476838944779980, -0.970488897448204550, -0.970500953525406880, -0.970513007176356800, -0.970525058401024320, -0.970537107199379130, -0.970549153571391150, -0.970561197517030290, +-0.970573239036266470, -0.970585278129069470, -0.970597314795409340, -0.970609349035255970, -0.970621380848579180, -0.970633410235348880, -0.970645437195535090, -0.970657461729107720, +-0.970669483836036790, -0.970681503516292010, -0.970693520769843500, -0.970705535596661280, -0.970717547996715170, -0.970729557969975180, -0.970741565516411220, -0.970753570635993430, +-0.970765573328691730, -0.970777573594476140, -0.970789571433316460, -0.970801566845182930, -0.970813559830045470, -0.970825550387874210, -0.970837538518638970, -0.970849524222309970, +-0.970861507498857020, -0.970873488348250380, -0.970885466770460060, -0.970897442765455980, -0.970909416333208370, -0.970921387473687280, -0.970933356186862610, -0.970945322472704600, +-0.970957286331183280, -0.970969247762268670, -0.970981206765931030, -0.970993163342140360, -0.971005117490866710, -0.971017069212080310, -0.971029018505751300, -0.971040965371849700, +-0.971052909810345640, -0.971064851821209380, -0.971076791404410940, -0.971088728559920570, -0.971100663287708390, -0.971112595587744430, -0.971124525459999060, -0.971136452904442390, +-0.971148377921044580, -0.971160300509775860, -0.971172220670606380, -0.971184138403506260, -0.971196053708445860, -0.971207966585395430, -0.971219877034324890, -0.971231785055204800, +-0.971243690648005200, -0.971255593812696330, -0.971267494549248540, -0.971279392857631980, -0.971291288737816890, -0.971303182189773630, -0.971315073213472440, -0.971326961808883560, +-0.971338847975977250, -0.971350731714723860, -0.971362613025093640, -0.971374491907056830, -0.971386368360583790, -0.971398242385644870, -0.971410113982210440, -0.971421983150250520, +-0.971433849889735800, -0.971445714200636410, -0.971457576082922710, -0.971469435536565060, -0.971481292561533930, -0.971493147157799440, -0.971504999325332190, -0.971516849064102290, +-0.971528696374080350, -0.971540541255236700, -0.971552383707541710, -0.971564223730965740, -0.971576061325479130, -0.971587896491052480, -0.971599729227656030, -0.971611559535260240, +-0.971623387413835580, -0.971635212863352530, -0.971647035883781320, -0.971658856475092650, -0.971670674637256760, -0.971682490370244230, -0.971694303674025320, -0.971706114548570810, +-0.971717922993850960, -0.971729729009836340, -0.971741532596497310, -0.971753333753804570, -0.971765132481728470, -0.971776928780239470, -0.971788722649308160, -0.971800514088905110, +-0.971812303099000680, -0.971824089679565570, -0.971835873830570240, -0.971847655551985160, -0.971859434843781010, -0.971871211705928270, -0.971882986138397520, -0.971894758141159220, +-0.971906527714184070, -0.971918294857442520, -0.971930059570905390, -0.971941821854543030, -0.971953581708326130, -0.971965339132225160, -0.971977094126211030, -0.971988846690253980, +-0.972000596824324940, -0.972012344528394360, -0.972024089802433040, -0.972035832646411360, -0.972047573060300100, -0.972059311044069950, -0.972071046597691610, -0.972082779721135440, +-0.972094510414372560, -0.972106238677373220, -0.972117964510108350, -0.972129687912548610, -0.972141408884664600, -0.972153127426427120, -0.972164843537806740, -0.972176557218774270, +-0.972188268469300400, -0.972199977289355920, -0.972211683678911420, -0.972223387637937810, -0.972235089166405660, -0.972246788264285900, -0.972258484931548980, -0.972270179168166050, +-0.972281870974107450, -0.972293560349344330, -0.972305247293847260, -0.972316931807587160, -0.972328613890534600, -0.972340293542660610, -0.972351970763935760, -0.972363645554331080, +-0.972375317913817260, -0.972386987842365210, -0.972398655339945630, -0.972410320406529420, -0.972421983042087380, -0.972433643246590430, -0.972445301020009370, -0.972456956362314990, +-0.972468609273478330, -0.972480259753469970, -0.972491907802261140, -0.972503553419822420, -0.972515196606124950, -0.972526837361139320, -0.972538475684836760, -0.972550111577187960, +-0.972561745038163840, -0.972573376067735310, -0.972585004665873500, -0.972596630832549100, -0.972608254567733140, -0.972619875871396530, -0.972631494743510180, -0.972643111184045120, +-0.972654725192972250, -0.972666336770262710, -0.972677945915887190, -0.972689552629816820, -0.972701156912022640, -0.972712758762475540, -0.972724358181146440, -0.972735955168006590, +-0.972747549723026790, -0.972759141846178070, -0.972770731537431540, -0.972782318796758250, -0.972793903624129100, -0.972805486019515220, -0.972817065982887530, -0.972828643514217270, +-0.972840218613475360, -0.972851791280632930, -0.972863361515661110, -0.972874929318530700, -0.972886494689213070, -0.972898057627679220, -0.972909618133900200, -0.972921176207847130, +-0.972932731849491140, -0.972944285058803260, -0.972955835835754730, -0.972967384180316590, -0.972978930092459950, -0.972990473572156070, -0.973002014619375970, -0.973013553234090780, +-0.973025089416271750, -0.973036623165890010, -0.973048154482916710, -0.973059683367323070, -0.973071209819080130, -0.973082733838159240, -0.973094255424531430, -0.973105774578168050, +-0.973117291299040230, -0.973128805587119230, -0.973140317442376060, -0.973151826864782300, -0.973163333854308750, -0.973174838410927000, -0.973186340534608170, -0.973197840225323520, +-0.973209337483044170, -0.973220832307741480, -0.973232324699386700, -0.973243814657951180, -0.973255302183406170, -0.973266787275722800, -0.973278269934872430, -0.973289750160826530, +-0.973301227953556230, -0.973312703313032770, -0.973324176239227620, -0.973335646732111930, -0.973347114791657250, -0.973358580417834630, -0.973370043610615740, -0.973381504369971620, +-0.973392962695873830, -0.973404418588293520, -0.973415872047202260, -0.973427323072571180, -0.973438771664371980, -0.973450217822575680, -0.973461661547153970, -0.973473102838078090, +-0.973484541695319390, -0.973495978118849360, -0.973507412108639450, -0.973518843664661020, -0.973530272786885310, -0.973541699475284130, -0.973553123729828500, -0.973564545550490210, +-0.973575964937240410, -0.973587381890050900, -0.973598796408892800, -0.973610208493737690, -0.973621618144557170, -0.973633025361322570, -0.973644430144005260, -0.973655832492577030, +-0.973667232407009250, -0.973678629887273270, -0.973690024933340780, -0.973701417545183250, -0.973712807722772130, -0.973724195466079020, -0.973735580775075380, -0.973746963649732790, +-0.973758344090022820, -0.973769722095917060, -0.973781097667386850, -0.973792470804404010, -0.973803841506939990, -0.973815209774966270, -0.973826575608454650, -0.973837939007376470, +-0.973849299971703550, -0.973860658501407240, -0.973872014596459450, -0.973883368256831530, -0.973894719482495170, -0.973906068273422080, -0.973917414629583810, -0.973928758550951960, +-0.973940100037498200, -0.973951439089194240, -0.973962775706011750, -0.973974109887922210, -0.973985441634897420, -0.973996770946909060, -0.974008097823928720, -0.974019422265928190, +-0.974030744272879060, -0.974042063844753110, -0.974053380981521940, -0.974064695683157340, -0.974076007949631010, -0.974087317780914730, -0.974098625176980090, -0.974109930137798900, +-0.974121232663342830, -0.974132532753583800, -0.974143830408493280, -0.974155125628043290, -0.974166418412205530, -0.974177708760951670, -0.974188996674253520, -0.974200282152082870, +-0.974211565194411540, -0.974222845801211320, -0.974234123972453900, -0.974245399708111190, -0.974256673008155110, -0.974267943872557220, -0.974279212301289550, -0.974290478294323800, +-0.974301741851631880, -0.974313002973185570, -0.974324261658956800, -0.974335517908917260, -0.974346771723039070, -0.974358023101293820, -0.974369272043653640, -0.974380518550090220, +-0.974391762620575590, -0.974403004255081420, -0.974414243453579740, -0.974425480216042580, -0.974436714542441630, -0.974447946432748900, -0.974459175886936310, -0.974470402904975770, +-0.974481627486839310, -0.974492849632498710, -0.974504069341925900, -0.974515286615093120, -0.974526501451971950, -0.974537713852534630, -0.974548923816752950, -0.974560131344598960, +-0.974571336436044660, -0.974582539091062070, -0.974593739309623120, -0.974604937091699820, -0.974616132437264080, -0.974627325346288150, -0.974638515818743830, -0.974649703854603260, +-0.974660889453838440, -0.974672072616421300, -0.974683253342324090, -0.974694431631518700, -0.974705607483977170, -0.974716780899671730, -0.974727951878574310, -0.974739120420656910, +-0.974750286525891800, -0.974761450194250980, -0.974772611425706590, -0.974783770220230550, -0.974794926577795100, -0.974806080498372360, -0.974817231981934480, -0.974828381028453480, +-0.974839527637901490, -0.974850671810250760, -0.974861813545473300, -0.974872952843541250, -0.974884089704426860, -0.974895224128102370, -0.974906356114539690, -0.974917485663711170, +-0.974928612775588840, -0.974939737450145060, -0.974950859687351960, -0.974961979487181660, -0.974973096849606420, -0.974984211774598490, -0.974995324262129870, -0.975006434312173150, +-0.975017541924700250, -0.975028647099683510, -0.975039749837095070, -0.975050850136907400, -0.975061947999092520, -0.975073043423622780, -0.975084136410470430, -0.975095226959607710, +-0.975106315071006980, -0.975117400744640370, -0.975128483980480350, -0.975139564778499170, -0.975150643138668950, -0.975161719060962160, -0.975172792545351160, -0.975183863591808090, +-0.975194932200305400, -0.975205998370815340, -0.975217062103310270, -0.975228123397762660, -0.975239182254144630, -0.975250238672428660, -0.975261292652587100, -0.975272344194592300, +-0.975283393298416730, -0.975294439964032530, -0.975305484191412390, -0.975316525980528430, -0.975327565331353230, -0.975338602243859040, -0.975349636718018330, -0.975360668753803670, +-0.975371698351187200, -0.975382725510141600, -0.975393750230639010, -0.975404772512652230, -0.975415792356153390, -0.975426809761115180, -0.975437824727509840, -0.975448837255309950, +-0.975459847344487980, -0.975470854995016510, -0.975481860206867780, -0.975492862980014470, -0.975503863314428950, -0.975514861210083790, -0.975525856666951460, -0.975536849685004540, +-0.975547840264215370, -0.975558828404556650, -0.975569814106000970, -0.975580797368520660, -0.975591778192088420, -0.975602756576676610, -0.975613732522258030, -0.975624706028805130, +-0.975635677096290400, -0.975646645724686510, -0.975657611913965940, -0.975668575664101370, -0.975679536975065380, -0.975690495846830540, -0.975701452279369550, -0.975712406272654760, +-0.975723357826659090, -0.975734306941354990, -0.975745253616715160, -0.975756197852712060, -0.975767139649318600, -0.975778079006507260, -0.975789015924250710, -0.975799950402521650, +-0.975810882441292660, -0.975821812040536530, -0.975832739200225840, -0.975843663920333280, -0.975854586200831540, -0.975865506041693420, -0.975876423442891380, -0.975887338404398450, +-0.975898250926187090, -0.975909161008230220, -0.975920068650500290, -0.975930973852970230, -0.975941876615612710, -0.975952776938400660, -0.975963674821306530, -0.975974570264303230, +-0.975985463267363460, -0.975996353830460130, -0.976007241953565920, -0.976018127636653520, -0.976029010879695850, -0.976039891682665580, -0.976050770045535750, -0.976061645968278820, +-0.976072519450867810, -0.976083390493275530, -0.976094259095474870, -0.976105125257438420, -0.976115988979139200, -0.976126850260550020, -0.976137709101643770, -0.976148565502393150, +-0.976159419462771180, -0.976170270982750550, -0.976181120062304400, -0.976191966701405400, -0.976202810900026470, -0.976213652658140530, -0.976224491975720370, -0.976235328852739110, +-0.976246163289169470, -0.976256995284984440, -0.976267824840156840, -0.976278651954659790, -0.976289476628465990, -0.976300298861548680, -0.976311118653880430, -0.976321936005434490, +-0.976332750916183660, -0.976343563386101070, -0.976354373415159400, -0.976365181003331920, -0.976375986150591400, -0.976386788856910990, -0.976397589122263600, -0.976408386946622240, +-0.976419182329959830, -0.976429975272249510, -0.976440765773464390, -0.976451553833577180, -0.976462339452561110, -0.976473122630389210, -0.976483903367034610, -0.976494681662470110, +-0.976505457516668950, -0.976516230929604160, -0.976527001901248750, -0.976537770431575860, -0.976548536520558620, -0.976559300168169940, -0.976570061374383070, -0.976580820139171020, +-0.976591576462506940, -0.976602330344363830, -0.976613081784715060, -0.976623830783533430, -0.976634577340792290, -0.976645321456464770, -0.976656063130523780, -0.976666802362942790, +-0.976677539153694710, -0.976688273502752890, -0.976699005410090250, -0.976709734875680140, -0.976720461899495680, -0.976731186481510140, -0.976741908621696520, -0.976752628320028290, +-0.976763345576478370, -0.976774060391020100, -0.976784772763626740, -0.976795482694271410, -0.976806190182927250, -0.976816895229567830, -0.976827597834166060, -0.976838297996695300, +-0.976848995717128800, -0.976859690995439790, -0.976870383831601630, -0.976881074225587450, -0.976891762177370620, -0.976902447686924250, -0.976913130754221930, -0.976923811379236670, +-0.976934489561941950, -0.976945165302311010, -0.976955838600317210, -0.976966509455933660, -0.976977177869133960, -0.976987843839891230, -0.976998507368178950, -0.977009168453970340, +-0.977019827097238890, -0.977030483297957830, -0.977041137056100630, -0.977051788371640530, -0.977062437244551000, -0.977073083674805280, -0.977083727662376940, -0.977094369207239240, +-0.977105008309365640, -0.977115644968729490, -0.977126279185304260, -0.977136910959063300, -0.977147540289980080, -0.977158167178028060, -0.977168791623180490, -0.977179413625411050, +-0.977190033184693110, -0.977200650301000010, -0.977211264974305330, -0.977221877204582420, -0.977232486991804870, -0.977243094335946140, -0.977253699236979580, -0.977264301694878880, +-0.977274901709617280, -0.977285499281168590, -0.977296094409506040, -0.977306687094603330, -0.977317277336433810, -0.977327865134971160, -0.977338450490188860, -0.977349033402060360, +-0.977359613870559360, -0.977370191895659320, -0.977380767477333710, -0.977391340615556330, -0.977401911310300520, -0.977412479561539870, -0.977423045369248070, -0.977433608733398680, +-0.977444169653965300, -0.977454728130921380, -0.977465284164240720, -0.977475837753896790, -0.977486388899863390, -0.977496937602113980, -0.977507483860622140, -0.977518027675361670, +-0.977528569046306140, -0.977539107973429130, -0.977549644456704340, -0.977560178496105550, -0.977570710091606120, -0.977581239243180080, -0.977591765950800880, -0.977602290214442340, +-0.977612812034078020, -0.977623331409681610, -0.977633848341226910, -0.977644362828687610, -0.977654874872037390, -0.977665384471250070, -0.977675891626299200, -0.977686396337158590, +-0.977696898603802040, -0.977707398426203240, -0.977717895804335880, -0.977728390738173860, -0.977738883227690870, -0.977749373272860600, -0.977759860873656960, -0.977770346030053530, +-0.977780828742024430, -0.977791309009543140, -0.977801786832583560, -0.977812262211119610, -0.977822735145124970, -0.977833205634573430, -0.977843673679438920, -0.977854139279695220, +-0.977864602435316250, -0.977875063146275700, -0.977885521412547480, -0.977895977234105480, -0.977906430610923530, -0.977916881542975510, -0.977927330030235350, -0.977937776072676730, +-0.977948219670273790, -0.977958660823000200, -0.977969099530830000, -0.977979535793737090, -0.977989969611695380, -0.978000400984678660, -0.978010829912660860, -0.978021256395616210, +-0.978031680433518180, -0.978042102026341120, -0.978052521174058720, -0.978062937876645110, -0.978073352134074090, -0.978083763946319680, -0.978094173313355800, -0.978104580235156670, +-0.978114984711695890, -0.978125386742947800, -0.978135786328886090, -0.978146183469485120, -0.978156578164718570, -0.978166970414560580, -0.978177360218985160, -0.978187747577966340, +-0.978198132491478130, -0.978208514959494680, -0.978218894981989880, -0.978229272558937770, -0.978239647690312570, -0.978250020376088210, -0.978260390616238930, -0.978270758410738520, +-0.978281123759561220, -0.978291486662681180, -0.978301847120072400, -0.978312205131709020, -0.978322560697565070, -0.978332913817614780, -0.978343264491832180, -0.978353612720191500, +-0.978363958502666660, -0.978374301839232020, -0.978384642729861590, -0.978394981174529500, -0.978405317173210000, -0.978415650725877220, -0.978425981832505290, -0.978436310493068450, +-0.978446636707540840, -0.978456960475896590, -0.978467281798109930, -0.978477600674155120, -0.978487917104006180, -0.978498231087637560, -0.978508542625023400, -0.978518851716137840, +-0.978529158360955110, -0.978539462559449570, -0.978549764311595240, -0.978560063617366580, -0.978570360476737840, -0.978580654889683150, -0.978590946856176760, -0.978601236376193010, +-0.978611523449706260, -0.978621808076690640, -0.978632090257120500, -0.978642369990970100, -0.978652647278213880, -0.978662922118825880, -0.978673194512780680, -0.978683464460052500, +-0.978693731960615710, -0.978703997014444440, -0.978714259621513260, -0.978724519781796420, -0.978734777495268380, -0.978745032761903280, -0.978755285581675570, -0.978765535954559730, +-0.978775783880530100, -0.978786029359560940, -0.978796272391626700, -0.978806512976701740, -0.978816751114760520, -0.978826986805777510, -0.978837220049726950, -0.978847450846583310, +-0.978857679196321160, -0.978867905098914750, -0.978878128554338530, -0.978888349562566980, -0.978898568123574670, -0.978908784237335850, -0.978918997903825080, -0.978929209123016840, +-0.978939417894885590, -0.978949624219405790, -0.978959828096551910, -0.978970029526298520, -0.978980228508619990, -0.978990425043490880, -0.979000619130885760, -0.979010810770779010, +-0.979020999963145290, -0.979031186707959080, -0.979041371005194950, -0.979051552854827260, -0.979061732256830800, -0.979071909211179920, -0.979082083717849330, -0.979092255776813580, +-0.979102425388047150, -0.979112592551524610, -0.979122757267220640, -0.979132919535109720, -0.979143079355166530, -0.979153236727365650, -0.979163391651681760, -0.979173544128089320, +-0.979183694156562920, -0.979193841737077460, -0.979203986869607300, -0.979214129554127120, -0.979224269790611720, -0.979234407579035570, -0.979244542919373460, -0.979254675811599970, +-0.979264806255689790, -0.979274934251617600, -0.979285059799358090, -0.979295182898885950, -0.979305303550175750, -0.979315421753202410, -0.979325537507940380, -0.979335650814364690, +-0.979345761672449690, -0.979355870082170400, -0.979365976043501400, -0.979376079556417480, -0.979386180620893440, -0.979396279236903760, -0.979406375404423550, -0.979416469123427280, +-0.979426560393889870, -0.979436649215786100, -0.979446735589090680, -0.979456819513778500, -0.979466900989824140, -0.979476980017202630, -0.979487056595888640, -0.979497130725856980, +-0.979507202407082560, -0.979517271639540050, -0.979527338423204390, -0.979537402758050350, -0.979547464644052850, -0.979557524081186680, -0.979567581069426760, -0.979577635608747780, +-0.979587687699124740, -0.979597737340532570, -0.979607784532945950, -0.979617829276340000, -0.979627871570689310, -0.979637911415969010, -0.979647948812154000, -0.979657983759219090, +-0.979668016257139170, -0.979678046305889170, -0.979688073905444100, -0.979698099055778870, -0.979708121756868390, -0.979718142008687680, -0.979728159811211530, -0.979738175164414970, +-0.979748188068273020, -0.979758198522760580, -0.979768206527852570, -0.979778212083524110, -0.979788215189750120, -0.979798215846505620, -0.979808214053765610, -0.979818209811504910, +-0.979828203119698870, -0.979838193978322170, -0.979848182387350050, -0.979858168346757540, -0.979868151856519540, -0.979878132916611080, -0.979888111527007500, -0.979898087687683490, +-0.979908061398614310, -0.979918032659774840, -0.979928001471140450, -0.979937967832686050, -0.979947931744386660, -0.979957893206217510, -0.979967852218153520, -0.979977808780170050, +-0.979987762892241990, -0.979997714554344480, -0.980007663766452760, -0.980017610528541860, -0.980027554840586900, -0.980037496702563020, -0.980047436114445450, -0.980057373076209330, +-0.980067307587829670, -0.980077239649281840, -0.980087169260540850, -0.980097096421581940, -0.980107021132380350, -0.980116943392911220, -0.980126863203149570, -0.980136780563070960, +-0.980146695472650320, -0.980156607931862880, -0.980166517940683990, -0.980176425499088790, -0.980186330607052510, -0.980196233264550410, -0.980206133471557830, -0.980216031228049790, +-0.980225926534001760, -0.980235819389388750, -0.980245709794186350, -0.980255597748369680, -0.980265483251913980, -0.980275366304794500, -0.980285246906986710, -0.980295125058465720, +-0.980305000759207010, -0.980314874009185710, -0.980324744808377280, -0.980334613156756960, -0.980344479054300110, -0.980354342500982080, -0.980364203496778220, -0.980374062041663770, +-0.980383918135614210, -0.980393771778604870, -0.980403622970611120, -0.980413471711608200, -0.980423318001571680, -0.980433161840476910, -0.980443003228299140, -0.980452842165013940, +-0.980462678650596660, -0.980472512685022670, -0.980482344268267300, -0.980492173400306140, -0.980502000081114540, -0.980511824310667970, -0.980521646088941770, -0.980531465415911520, +-0.980541282291552570, -0.980551096715840400, -0.980560908688750570, -0.980570718210258430, -0.980580525280339450, -0.980590329898969220, -0.980600132066123060, -0.980609931781776690, +-0.980619729045905440, -0.980629523858484900, -0.980639316219490520, -0.980649106128897770, -0.980658893586682350, -0.980668678592819700, -0.980678461147285410, -0.980688241250054830, +-0.980698018901103750, -0.980707794100407540, -0.980717566847941870, -0.980727337143682320, -0.980737104987604470, -0.980746870379683780, -0.980756633319895930, -0.980766393808216510, +-0.980776151844621080, -0.980785907429085340, -0.980795660561584740, -0.980805411242095080, -0.980815159470591840, -0.980824905247050680, -0.980834648571447310, -0.980844389443757290, +-0.980854127863956200, -0.980863863832019960, -0.980873597347924010, -0.980883328411644050, -0.980893057023155770, -0.980902783182434850, -0.980912506889456860, -0.980922228144197830, +-0.980931946946632990, -0.980941663296738490, -0.980951377194489660, -0.980961088639862530, -0.980970797632832570, -0.980980504173375790, -0.980990208261467540, -0.980999909897083850, +-0.981009609080200410, -0.981019305810793000, -0.981029000088837200, -0.981038691914308920, -0.981048381287183970, -0.981058068207438130, -0.981067752675046980, -0.981077434689986540, +-0.981087114252232500, -0.981096791361760650, -0.981106466018546790, -0.981116138222566820, -0.981125807973796450, -0.981135475272211570, -0.981145140117788080, -0.981154802510501690, +-0.981164462450328290, -0.981174119937243790, -0.981183774971223890, -0.981193427552244590, -0.981203077680281700, -0.981212725355311230, -0.981222370577308880, -0.981232013346250540, +-0.981241653662112250, -0.981251291524869780, -0.981260926934499070, -0.981270559890976110, -0.981280190394276720, -0.981289818444376790, -0.981299444041252360, -0.981309067184879420, +-0.981318687875233690, -0.981328306112291270, -0.981337921896028090, -0.981347535226420040, -0.981357146103443270, -0.981366754527073560, -0.981376360497287050, -0.981385964014059530, +-0.981395565077367140, -0.981405163687185890, -0.981414759843491690, -0.981424353546260560, -0.981433944795468530, -0.981443533591091710, -0.981453119933106020, -0.981462703821487590, +-0.981472285256212330, -0.981481864237256360, -0.981491440764595710, -0.981501014838206510, -0.981510586458064770, -0.981520155624146520, -0.981529722336427990, -0.981539286594884990, +-0.981548848399493970, -0.981558407750230730, -0.981567964647071410, -0.981577519089992250, -0.981587071078969250, -0.981596620613978570, -0.981606167694996420, -0.981615712321998850, +-0.981625254494961850, -0.981634794213861910, -0.981644331478674800, -0.981653866289377010, -0.981663398645944430, -0.981672928548353420, -0.981682455996580110, -0.981691980990600620, +-0.981701503530391210, -0.981711023615927990, -0.981720541247187330, -0.981730056424145240, -0.981739569146777960, -0.981749079415061840, -0.981758587228973020, -0.981768092588487630, +-0.981777595493582120, -0.981787095944232520, -0.981796593940415300, -0.981806089482106460, -0.981815582569282470, -0.981825073201919580, -0.981834561379993920, -0.981844047103481940, +-0.981853530372359780, -0.981863011186603800, -0.981872489546190330, -0.981881965451095520, -0.981891438901295930, -0.981900909896767700, -0.981910378437487190, -0.981919844523430730, +-0.981929308154574690, -0.981938769330895410, -0.981948228052369140, -0.981957684318972230, -0.981967138130681260, -0.981976589487472350, -0.981986038389321970, -0.981995484836206580, +-0.982004928828102420, -0.982014370364985960, -0.982023809446833430, -0.982033246073621520, -0.982042680245326480, -0.982052111961924770, -0.982061541223392730, -0.982070968029706840, +-0.982080392380843550, -0.982089814276779330, -0.982099233717490420, -0.982108650702953610, -0.982118065233145040, -0.982127477308041400, -0.982136886927619020, -0.982146294091854390, +-0.982155698800724060, -0.982165101054204510, -0.982174500852272200, -0.982183898194903590, -0.982193293082075260, -0.982202685513763660, -0.982212075489945490, -0.982221463010596980, +-0.982230848075694830, -0.982240230685215600, -0.982249610839135870, -0.982258988537431990, -0.982268363780080640, -0.982277736567058410, -0.982287106898341870, -0.982296474773907580, +-0.982305840193732020, -0.982315203157791970, -0.982324563666063800, -0.982333921718524290, -0.982343277315149920, -0.982352630455917470, -0.982361981140803310, -0.982371329369784330, +-0.982380675142836890, -0.982390018459937900, -0.982399359321063700, -0.982408697726191220, -0.982418033675297010, -0.982427367168357660, -0.982436698205349850, -0.982446026786250370, +-0.982455352911035810, -0.982464676579682950, -0.982473997792168260, -0.982483316548468650, -0.982492632848560700, -0.982501946692421190, -0.982511258080026820, -0.982520567011354370, +-0.982529873486380430, -0.982539177505081800, -0.982548479067435250, -0.982557778173417500, -0.982567074823005320, -0.982576369016175400, -0.982585660752904650, -0.982594950033169660, +-0.982604236856947310, -0.982613521224214410, -0.982622803134947650, -0.982632082589123930, -0.982641359586719940, -0.982650634127712590, -0.982659906212078770, -0.982669175839794960, +-0.982678443010838400, -0.982687707725185660, -0.982696969982813640, -0.982706229783699260, -0.982715487127819200, -0.982724742015150590, -0.982733994445669890, -0.982743244419354460, +-0.982752491936180750, -0.982761736996125790, -0.982770979599166590, -0.982780219745279850, -0.982789457434442680, -0.982798692666631780, -0.982807925441824160, -0.982817155759996730, +-0.982826383621126400, -0.982835609025190180, -0.982844831972164880, -0.982854052462027510, -0.982863270494754970, -0.982872486070324290, -0.982881699188712380, -0.982890909849896240, +-0.982900118053852800, -0.982909323800559060, -0.982918527089992170, -0.982927727922128790, -0.982936926296946070, -0.982946122214421130, -0.982955315674530870, -0.982964506677252330, +-0.982973695222562500, -0.982982881310438430, -0.982992064940857110, -0.983001246113795690, -0.983010424829231180, -0.983019601087140480, -0.983028774887500960, -0.983037946230289390, +-0.983047115115482930, -0.983056281543058690, -0.983065445512993800, -0.983074607025265390, -0.983083766079850260, -0.983092922676725880, -0.983102076815869030, -0.983111228497257180, +-0.983120377720867130, -0.983129524486676120, -0.983138668794661390, -0.983147810644799950, -0.983156950037068930, -0.983166086971445590, -0.983175221447907030, -0.983184353466430410, +-0.983193483026992940, -0.983202610129571770, -0.983211734774144030, -0.983220856960686950, -0.983229976689177660, -0.983239093959593520, -0.983248208771911660, -0.983257321126109310, +-0.983266431022163600, -0.983275538460051780, -0.983284643439751190, -0.983293745961238860, -0.983302846024492360, -0.983311943629488590, -0.983321038776205030, -0.983330131464618780, +-0.983339221694707330, -0.983348309466447800, -0.983357394779817430, -0.983366477634793680, -0.983375558031353680, -0.983384635969474670, -0.983393711449134230, -0.983402784470309490, +-0.983411855032977790, -0.983420923137116380, -0.983429988782702710, -0.983439051969714040, -0.983448112698127820, -0.983457170967921290, -0.983466226779071690, -0.983475280131556720, +-0.983484331025353490, -0.983493379460439350, -0.983502425436791780, -0.983511468954388230, -0.983520510013205950, -0.983529548613222500, -0.983538584754415020, -0.983547618436761200, +-0.983556649660238260, -0.983565678424823790, -0.983574704730495020, -0.983583728577229530, -0.983592749965004680, -0.983601768893798020, -0.983610785363586930, -0.983619799374348850, +-0.983628810926061250, -0.983637820018701700, -0.983646826652247560, -0.983655830826676290, -0.983664832541965460, -0.983673831798092650, -0.983682828595035200, -0.983691822932770690, +-0.983700814811276580, -0.983709804230530450, -0.983718791190509870, -0.983727775691192190, -0.983736757732555200, -0.983745737314576260, -0.983754714437232950, -0.983763689100502940, +-0.983772661304363690, -0.983781631048792680, -0.983790598333767700, -0.983799563159266200, -0.983808525525265760, -0.983817485431744080, -0.983826442878678600, -0.983835397866047010, +-0.983844350393827010, -0.983853300461996040, -0.983862248070531910, -0.983871193219412080, -0.983880135908614340, -0.983889076138116270, -0.983898013907895440, -0.983906949217929540, +-0.983915882068196360, -0.983924812458673470, -0.983933740389338450, -0.983942665860169210, -0.983951588871143200, -0.983960509422238340, -0.983969427513432080, -0.983978343144702340, +-0.983987256316026790, -0.983996167027382910, -0.984005075278748810, -0.984013981070101850, -0.984022884401420050, -0.984031785272680980, -0.984040683683862550, -0.984049579634942330, +-0.984058473125898230, -0.984067364156707810, -0.984076252727349110, -0.984085138837799690, -0.984094022488037460, -0.984102903678040210, -0.984111782407785630, -0.984120658677251630, +-0.984129532486415990, -0.984138403835256530, -0.984147272723751020, -0.984156139151877380, -0.984165003119613410, -0.984173864626936900, -0.984182723673825640, -0.984191580260257660, +-0.984200434386210740, -0.984209286051662690, -0.984218135256591520, -0.984226982000974910, -0.984235826284790890, -0.984244668108017250, -0.984253507470632010, -0.984262344372612950, +-0.984271178813938110, -0.984280010794585270, -0.984288840314532340, -0.984297667373757460, -0.984306491972238300, -0.984315314109952880, -0.984324133786879220, -0.984332951002995230, +-0.984341765758278920, -0.984350578052708090, -0.984359387886260980, -0.984368195258915280, -0.984377000170649110, -0.984385802621440380, -0.984394602611267210, -0.984403400140107520, +-0.984412195207939320, -0.984420987814740630, -0.984429777960489470, -0.984438565645163850, -0.984447350868741910, -0.984456133631201550, -0.984464913932520780, -0.984473691772677850, +-0.984482467151650550, -0.984491240069417240, -0.984500010525955700, -0.984508778521244190, -0.984517544055260710, -0.984526307127983390, -0.984535067739390370, -0.984543825889459550, +-0.984552581578169270, -0.984561334805497460, -0.984570085571422340, -0.984578833875922040, -0.984587579718974590, -0.984596323100558220, -0.984605064020651070, -0.984613802479231250, +-0.984622538476276900, -0.984631272011766260, -0.984640003085677340, -0.984648731697988500, -0.984657457848677750, -0.984666181537723450, -0.984674902765103720, -0.984683621530796580, +-0.984692337834780610, -0.984701051677033590, -0.984709763057533990, -0.984718471976260060, -0.984727178433189910, -0.984735882428301790, -0.984744583961573940, -0.984753283032984710, +-0.984761979642512220, -0.984770673790134720, -0.984779365475830670, -0.984788054699578090, -0.984796741461355540, -0.984805425761140940, -0.984814107598912860, -0.984822786974649530, +-0.984831463888329210, -0.984840138339930230, -0.984848810329430950, -0.984857479856809600, -0.984866146922044550, -0.984874811525114140, -0.984883473665996710, -0.984892133344670630, +-0.984900790561114130, -0.984909445315305780, -0.984918097607223710, -0.984926747436846380, -0.984935394804152260, -0.984944039709119590, -0.984952682151726820, -0.984961322131952420, +-0.984969959649774630, -0.984978594705172020, -0.984987227298122820, -0.984995857428605740, -0.985004485096598770, -0.985013110302080830, -0.985021733045029930, -0.985030353325424770, +-0.985038971143243790, -0.985047586498465240, -0.985056199391067810, -0.985064809821029840, -0.985073417788329910, -0.985082023292946360, -0.985090626334857890, -0.985099226914042720, +-0.985107825030479560, -0.985116420684146730, -0.985125013875022940, -0.985133604603086630, -0.985142192868316280, -0.985150778670690450, -0.985159362010187610, -0.985167942886786440, +-0.985176521300465400, -0.985185097251203070, -0.985193670738978010, -0.985202241763768690, -0.985210810325553910, -0.985219376424312010, -0.985227940060021680, -0.985236501232661490, +-0.985245059942210010, -0.985253616188645930, -0.985262169971947820, -0.985270721292094250, -0.985279270149063910, -0.985287816542835370, -0.985296360473387310, -0.985304901940698310, +-0.985313440944747040, -0.985321977485512310, -0.985330511562972470, -0.985339043177106520, -0.985347572327892830, -0.985356099015310180, -0.985364623239337380, -0.985373144999952990, +-0.985381664297135810, -0.985390181130864300, -0.985398695501117470, -0.985407207407873910, -0.985415716851112290, -0.985424223830811300, -0.985432728346949840, -0.985441230399506600, +-0.985449729988460250, -0.985458227113789500, -0.985466721775473230, -0.985475213973490140, -0.985483703707819130, -0.985492190978438760, -0.985500675785327960, -0.985509158128465400, +-0.985517638007829990, -0.985526115423400410, -0.985534590375155670, -0.985543062863074360, -0.985551532887135480, -0.985560000447317730, -0.985568465543599890, -0.985576928175960990, +-0.985585388344379810, -0.985593846048835040, -0.985602301289305700, -0.985610754065770590, -0.985619204378208600, -0.985627652226598650, -0.985636097610919530, -0.985644540531150250, +-0.985652980987269500, -0.985661418979256410, -0.985669854507089660, -0.985678287570748380, -0.985686718170211250, -0.985695146305457400, -0.985703571976465630, -0.985711995183215060, +-0.985720415925684380, -0.985728834203852710, -0.985737250017698960, -0.985745663367202150, -0.985754074252341070, -0.985762482673094850, -0.985770888629442400, -0.985779292121362730, +-0.985787693148834850, -0.985796091711837800, -0.985804487810350460, -0.985812881444351860, -0.985821272613821130, -0.985829661318737170, -0.985838047559079000, -0.985846431334825860, +-0.985854812645956540, -0.985863191492450160, -0.985871567874285870, -0.985879941791442670, -0.985888313243899580, -0.985896682231635730, -0.985905048754630140, -0.985913412812862040, +-0.985921774406310240, -0.985930133534954070, -0.985938490198772670, -0.985946844397744940, -0.985955196131850120, -0.985963545401067230, -0.985971892205375620, -0.985980236544754200, +-0.985988578419182190, -0.985996917828638740, -0.986005254773102970, -0.986013589252554110, -0.986021921266971300, -0.986030250816333660, -0.986038577900620330, -0.986046902519810640, +-0.986055224673883620, -0.986063544362818620, -0.986071861586594770, -0.986080176345191180, -0.986088488638587220, -0.986096798466762010, -0.986105105829694790, -0.986113410727364800, +-0.986121713159751280, -0.986130013126833570, -0.986138310628590700, -0.986146605665002120, -0.986154898236047070, -0.986163188341704690, -0.986171475981954430, -0.986179761156775300, +-0.986188043866147000, -0.986196324110048430, -0.986204601888459150, -0.986212877201358310, -0.986221150048725240, -0.986229420430539410, -0.986237688346779940, -0.986245953797426300, +-0.986254216782457730, -0.986262477301853570, -0.986270735355593290, -0.986278990943656230, -0.986287244066021530, -0.986295494722668860, -0.986303742913577360, -0.986311988638726600, +-0.986320231898095810, -0.986328472691664460, -0.986336711019411890, -0.986344946881317690, -0.986353180277360960, -0.986361411207521300, -0.986369639671778150, -0.986377865670110880, +-0.986386089202498930, -0.986394310268921880, -0.986402528869358970, -0.986410745003789670, -0.986418958672193540, -0.986427169874550040, -0.986435378610838630, -0.986443584881038780, +-0.986451788685129950, -0.986459990023091590, -0.986468188894903400, -0.986476385300544600, -0.986484579239994890, -0.986492770713233710, -0.986500959720240660, -0.986509146260995170, +-0.986517330335476840, -0.986525511943665110, -0.986533691085539680, -0.986541867761079990, -0.986550041970265750, -0.986558213713076280, -0.986566382989491290, -0.986574549799490330, +-0.986582714143052990, -0.986590876020158940, -0.986599035430787640, -0.986607192374918780, -0.986615346852531830, -0.986623498863606670, -0.986631648408122670, -0.986639795486059620, +-0.986647940097396980, -0.986656082242114540, -0.986664221920191880, -0.986672359131608670, -0.986680493876344600, -0.986688626154379360, -0.986696755965692400, -0.986704883310263630, +-0.986713008188072620, -0.986721130599099160, -0.986729250543322830, -0.986737368020723320, -0.986745483031280510, -0.986753595574973890, -0.986761705651783340, -0.986769813261688440, +-0.986777918404669110, -0.986786021080704900, -0.986794121289775730, -0.986802219031861160, -0.986810314306941220, -0.986818407114995240, -0.986826497456003480, -0.986834585329945280, +-0.986842670736800760, -0.986850753676549510, -0.986858834149171420, -0.986866912154646170, -0.986874987692953680, -0.986883060764073620, -0.986891131367986010, -0.986899199504670640, +-0.986907265174107210, -0.986915328376275600, -0.986923389111155620, -0.986931447378727290, -0.986939503178970170, -0.986947556511864500, -0.986955607377389740, -0.986963655775526140, +-0.986971701706253260, -0.986979745169551230, -0.986987786165399730, -0.986995824693778890, -0.987003860754668390, -0.987011894348048260, -0.987019925473898390, -0.987027954132198790, +-0.987035980322929160, -0.987044004046069730, -0.987052025301600190, -0.987060044089500650, -0.987068060409750920, -0.987076074262331130, -0.987084085647221050, -0.987092094564400830, +-0.987100101013850370, -0.987108104995549680, -0.987116106509478670, -0.987124105555617360, -0.987132102133945870, -0.987140096244444100, -0.987148087887092180, -0.987156077061869920, +-0.987164063768757540, -0.987172048007734950, -0.987180029778782280, -0.987188009081879430, -0.987195985917006640, -0.987203960284143920, -0.987211932183271300, -0.987219901614368790, +-0.987227868577416510, -0.987235833072394600, -0.987243795099283170, -0.987251754658062140, -0.987259711748711740, -0.987267666371212100, -0.987275618525543350, -0.987283568211685500, +-0.987291515429618680, -0.987299460179323130, -0.987307402460778860, -0.987315342273966220, -0.987323279618865120, -0.987331214495455800, -0.987339146903718490, -0.987347076843633320, +-0.987355004315180420, -0.987362929318340130, -0.987370851853092370, -0.987378771919417590, -0.987386689517295800, -0.987394604646707360, -0.987402517307632400, -0.987410427500051040, +-0.987418335223943730, -0.987426240479290510, -0.987434143266071710, -0.987442043584267570, -0.987449941433858340, -0.987457836814824130, -0.987465729727145520, -0.987473620170802420, +-0.987481508145775400, -0.987489393652044580, -0.987497276689590200, -0.987505157258392720, -0.987513035358432270, -0.987520910989689300, -0.987528784152143960, -0.987536654845776800, +-0.987544523070567840, -0.987552388826497650, -0.987560252113546590, -0.987568112931694770, -0.987575971280922670, -0.987583827161210740, -0.987591680572539100, -0.987599531514888330, +-0.987607379988238780, -0.987615225992570790, -0.987623069527864610, -0.987630910594100910, -0.987638749191259820, -0.987646585319321920, -0.987654418978267450, -0.987662250168077070, +-0.987670078888730930, -0.987677905140209700, -0.987685728922493730, -0.987693550235563380, -0.987701369079399210, -0.987709185453981560, -0.987716999359290910, -0.987724810795307830, +-0.987732619762012650, -0.987740426259385960, -0.987748230287408320, -0.987756031846059980, -0.987763830935321610, -0.987771627555173560, -0.987779421705596520, -0.987787213386570940, +-0.987795002598077290, -0.987802789340096240, -0.987810573612608160, -0.987818355415593600, -0.987826134749033140, -0.987833911612907340, -0.987841686007196800, -0.987849457931882060, +-0.987857227386943700, -0.987864994372362190, -0.987872758888118210, -0.987880520934192430, -0.987888280510565210, -0.987896037617217450, -0.987903792254129390, -0.987911544421282040, +-0.987919294118655760, -0.987927041346231220, -0.987934786103989100, -0.987942528391909990, -0.987950268209974560, -0.987958005558163490, -0.987965740436457350, -0.987973472844836940, +-0.987981202783282830, -0.987988930251775700, -0.987996655250296230, -0.988004377778825100, -0.988012097837343120, -0.988019815425830840, -0.988027530544269060, -0.988035243192638360, +-0.988042953370919630, -0.988050661079093450, -0.988058366317140720, -0.988066069085042020, -0.988073769382778130, -0.988081467210329740, -0.988089162567677870, -0.988096855454802970, +-0.988104545871685950, -0.988112233818307590, -0.988119919294648600, -0.988127602300689860, -0.988135282836412050, -0.988142960901796100, -0.988150636496822780, -0.988158309621472770, +-0.988165980275727110, -0.988173648459566350, -0.988181314172971610, -0.988188977415923490, -0.988196638188402980, -0.988204296490390880, -0.988211952321867980, -0.988219605682815190, +-0.988227256573213420, -0.988234904993043560, -0.988242550942286300, -0.988250194420922770, -0.988257835428933750, -0.988265473966300160, -0.988273110033002890, -0.988280743629022850, +-0.988288374754340840, -0.988296003408937970, -0.988303629592795050, -0.988311253305893200, -0.988318874548213100, -0.988326493319735770, -0.988334109620442320, -0.988341723450313570, +-0.988349334809330400, -0.988356943697473960, -0.988364550114725240, -0.988372154061065040, -0.988379755536474500, -0.988387354540934630, -0.988394951074426320, -0.988402545136930600, +-0.988410136728428590, -0.988417725848901200, -0.988425312498329430, -0.988432896676694430, -0.988440478383977190, -0.988448057620158750, -0.988455634385220220, -0.988463208679142610, +-0.988470780501906840, -0.988478349853494250, -0.988485916733885750, -0.988493481143062460, -0.988501043081005500, -0.988508602547695900, -0.988516159543114780, -0.988523714067243260, +-0.988531266120062480, -0.988538815701553550, -0.988546362811697500, -0.988553907450475670, -0.988561449617868960, -0.988568989313858610, -0.988576526538425870, -0.988584061291551850, +-0.988591593573217580, -0.988599123383404390, -0.988606650722093310, -0.988614175589265680, -0.988621697984902630, -0.988629217908985280, -0.988636735361494880, -0.988644250342412660, +-0.988651762851719850, -0.988659272889397590, -0.988666780455427110, -0.988674285549789760, -0.988681788172466660, -0.988689288323439050, -0.988696786002688290, -0.988704281210195600, +-0.988711773945942120, -0.988719264209909190, -0.988726752002078160, -0.988734237322430260, -0.988741720170946750, -0.988749200547608950, -0.988756678452398120, -0.988764153885295590, +-0.988771626846282730, -0.988779097335340750, -0.988786565352451020, -0.988794030897594880, -0.988801493970753680, -0.988808954571908760, -0.988816412701041480, -0.988823868358133070, +-0.988831321543165110, -0.988838772256118710, -0.988846220496975460, -0.988853666265716690, -0.988861109562323760, -0.988868550386778010, -0.988875988739060910, -0.988883424619153790, +-0.988890858027038130, -0.988898288962695380, -0.988905717426106780, -0.988913143417254000, -0.988920566936118410, -0.988927987982681220, -0.988935406556924250, -0.988942822658828600, +-0.988950236288375970, -0.988957647445547820, -0.988965056130325480, -0.988972462342690430, -0.988979866082624340, -0.988987267350108560, -0.988994666145124550, -0.989002062467653990, +-0.989009456317678230, -0.989016847695178720, -0.989024236600137270, -0.989031623032535110, -0.989039006992353920, -0.989046388479575160, -0.989053767494180500, -0.989061144036151420, +-0.989068518105469470, -0.989075889702116240, -0.989083258826073290, -0.989090625477322180, -0.989097989655844390, -0.989105351361621810, -0.989112710594635790, -0.989120067354867900, +-0.989127421642299940, -0.989134773456913470, -0.989142122798689960, -0.989149469667611190, -0.989156814063658740, -0.989164155986814290, -0.989171495437059400, -0.989178832414375760, +-0.989186166918745060, -0.989193498950148960, -0.989200828508569160, -0.989208155593987230, -0.989215480206384950, -0.989222802345743890, -0.989230122012045850, -0.989237439205272520, +-0.989244753925405670, -0.989252066172426780, -0.989259375946317850, -0.989266683247060460, -0.989273988074636400, -0.989281290429027240, -0.989288590310214990, -0.989295887718181110, +-0.989303182652907620, -0.989310475114376200, -0.989317765102568520, -0.989325052617466500, -0.989332337659051820, -0.989339620227306260, -0.989346900322211730, -0.989354177943749800, +-0.989361453091902600, -0.989368725766651690, -0.989375995967978980, -0.989383263695866270, -0.989390528950295330, -0.989397791731248200, -0.989405052038706430, -0.989412309872652160, +-0.989419565233067070, -0.989426818119933160, -0.989434068533232010, -0.989441316472945860, -0.989448561939056390, -0.989455804931545500, -0.989463045450395100, -0.989470283495587080, +-0.989477519067103240, -0.989484752164925820, -0.989491982789036380, -0.989499210939416950, -0.989506436616049640, -0.989513659818916150, -0.989520880547998470, -0.989528098803278630, +-0.989535314584738530, -0.989542527892360190, -0.989549738726125510, -0.989556947086016490, -0.989564152972015050, -0.989571356384103320, -0.989578557322263070, -0.989585755786476560, +-0.989592951776725570, -0.989600145292992230, -0.989607336335258550, -0.989614524903506540, -0.989621710997718230, -0.989628894617875510, -0.989636075763960730, -0.989643254435955580, +-0.989650430633842500, -0.989657604357603190, -0.989664775607219880, -0.989671944382674700, -0.989679110683949650, -0.989686274511026750, -0.989693435863888250, -0.989700594742516150, +-0.989707751146892580, -0.989714905076999550, -0.989722056532819310, -0.989729205514333970, -0.989736352021525550, -0.989743496054376280, -0.989750637612868190, -0.989757776696983620, +-0.989764913306704460, -0.989772047442013190, -0.989779179102891700, -0.989786308289322350, -0.989793435001287140, -0.989800559238768420, -0.989807681001748210, -0.989814800290208850, +-0.989821917104132480, -0.989829031443501320, -0.989836143308297610, -0.989843252698503480, -0.989850359614101280, -0.989857464055073240, -0.989864566021401380, -0.989871665513068270, +-0.989878762530055910, -0.989885857072346550, -0.989892949139922760, -0.989900038732766440, -0.989907125850860050, -0.989914210494185820, -0.989921292662726100, -0.989928372356463250, +-0.989935449575379380, -0.989942524319456840, -0.989949596588677980, -0.989956666383025260, -0.989963733702480810, -0.989970798547026960, -0.989977860916646190, -0.989984920811320720, +-0.989991978231033020, -0.989999033175765320, -0.990006085645499970, -0.990013135640219530, -0.990020183159906140, -0.990027228204542480, -0.990034270774110550, -0.990041310868593040, +-0.990048348487972190, -0.990055383632230560, -0.990062416301350390, -0.990069446495314250, -0.990076474214104390, -0.990083499457703460, -0.990090522226093730, -0.990097542519257750, +-0.990104560337177860, -0.990111575679836540, -0.990118588547216350, -0.990125598939299630, -0.990132606856068960, -0.990139612297506690, -0.990146615263595490, -0.990153615754317710, +-0.990160613769655920, -0.990167609309592470, -0.990174602374110150, -0.990181592963191300, -0.990188581076818400, -0.990195566714974110, -0.990202549877640890, -0.990209530564801210, +-0.990216508776437850, -0.990223484512533170, -0.990230457773069730, -0.990237428558030210, -0.990244396867397070, -0.990251362701152880, -0.990258326059280440, -0.990265286941762080, +-0.990272245348580490, -0.990279201279718360, -0.990286154735158130, -0.990293105714882600, -0.990300054218874240, -0.990307000247115820, -0.990313943799589810, -0.990320884876279120, +-0.990327823477165970, -0.990334759602233490, -0.990341693251463930, -0.990348624424840280, -0.990355553122344910, -0.990362479343960820, -0.990369403089670470, -0.990376324359456550, +-0.990383243153301950, -0.990390159471189140, -0.990397073313101010, -0.990403984679020130, -0.990410893568929310, -0.990417799982811210, -0.990424703920648630, -0.990431605382424360, +-0.990438504368120980, -0.990445400877721370, -0.990452294911208340, -0.990459186468564460, -0.990466075549772730, -0.990472962154815730, -0.990479846283676360, -0.990486727936337300, +-0.990493607112781560, -0.990500483812991720, -0.990507358036950670, -0.990514229784641210, -0.990521099056046130, -0.990527965851148440, -0.990534830169930710, -0.990541692012375960, +-0.990548551378466980, -0.990555408268186670, -0.990562262681517700, -0.990569114618443210, -0.990575964078945880, -0.990582811063008720, -0.990589655570614400, -0.990596497601746060, +-0.990603337156386380, -0.990610174234518360, -0.990617008836124910, -0.990623840961189050, -0.990630670609693450, -0.990637497781621250, -0.990644322476955330, -0.990651144695678500, +-0.990657964437773870, -0.990664781703224360, -0.990671596492012860, -0.990678408804122390, -0.990685218639535960, -0.990692025998236360, -0.990698830880206720, -0.990705633285430040, +-0.990712433213889240, -0.990719230665567440, -0.990726025640447430, -0.990732818138512440, -0.990739608159745490, -0.990746395704129370, -0.990753180771647310, -0.990759963362282340, +-0.990766743476017450, -0.990773521112835680, -0.990780296272720020, -0.990787068955653720, -0.990793839161619780, -0.990800606890601230, -0.990807372142581080, -0.990814134917542550, +-0.990820895215468680, -0.990827653036342570, -0.990834408380147360, -0.990841161246866160, -0.990847911636482000, -0.990854659548978000, -0.990861404984337390, -0.990868147942543410, +-0.990874888423578850, -0.990881626427427160, -0.990888361954071480, -0.990895095003494820, -0.990901825575680410, -0.990908553670611480, -0.990915279288271170, -0.990922002428642590, +-0.990928723091709100, -0.990935441277453700, -0.990942156985859750, -0.990948870216910360, -0.990955580970588890, -0.990962289246878350, -0.990968995045762190, -0.990975698367223550, +-0.990982399211245650, -0.990989097577811620, -0.990995793466905030, -0.991002486878508890, -0.991009177812606450, -0.991015866269181140, -0.991022552248216230, -0.991029235749694810, +-0.991035916773600370, -0.991042595319916120, -0.991049271388625420, -0.991055944979711610, -0.991062616093157820, -0.991069284728947510, -0.991075950887064020, -0.991082614567490580, +-0.991089275770210660, -0.991095934495207500, -0.991102590742464540, -0.991109244511965140, -0.991115895803692640, -0.991122544617630390, -0.991129190953761730, -0.991135834812070130, +-0.991142476192538810, -0.991149115095151470, -0.991155751519891330, -0.991162385466741740, -0.991169016935686260, -0.991175645926708150, -0.991182272439790960, -0.991188896474918150, +-0.991195518032073060, -0.991202137111239170, -0.991208753712399910, -0.991215367835538760, -0.991221979480639280, -0.991228588647684710, -0.991235195336658830, -0.991241799547544880, +-0.991248401280326430, -0.991255000534986940, -0.991261597311509980, -0.991268191609879110, -0.991274783430077690, -0.991281372772089280, -0.991287959635897440, -0.991294544021485760, +-0.991301125928837680, -0.991307705357936770, -0.991314282308766730, -0.991320856781310880, -0.991327428775552800, -0.991333998291476280, -0.991340565329064670, -0.991347129888301760, +-0.991353691969171000, -0.991360251571655970, -0.991366808695740230, -0.991373363341407580, -0.991379915508641570, -0.991386465197425680, -0.991393012407743580, -0.991399557139579060, +-0.991406099392915570, -0.991412639167736920, -0.991419176464026550, -0.991425711281768370, -0.991432243620945840, -0.991438773481542750, -0.991445300863542660, -0.991451825766929360, +-0.991458348191686540, -0.991464868137797770, -0.991471385605246840, -0.991477900594017410, -0.991484413104093300, -0.991490923135458170, -0.991497430688095700, -0.991503935761989590, +-0.991510438357123820, -0.991516938473481770, -0.991523436111047430, -0.991529931269804490, -0.991536423949736840, -0.991542914150827960, -0.991549401873061950, -0.991555887116422290, +-0.991562369880892970, -0.991568850166457790, -0.991575327973100440, -0.991581803300804810, -0.991588276149554580, -0.991594746519333660, -0.991601214410125940, -0.991607679821915220, +-0.991614142754685180, -0.991620603208419830, -0.991627061183103060, -0.991633516678718570, -0.991639969695250260, -0.991646420232682010, -0.991652868290997750, -0.991659313870181360, +-0.991665756970216640, -0.991672197591087600, -0.991678635732777920, -0.991685071395271730, -0.991691504578552930, -0.991697935282605300, -0.991704363507412870, -0.991710789252959410, +-0.991717212519229170, -0.991723633306205720, -0.991730051613873290, -0.991736467442215660, -0.991742880791216970, -0.991749291660861010, -0.991755700051131780, -0.991762105962013420, +-0.991768509393489710, -0.991774910345544770, -0.991781308818162510, -0.991787704811326940, -0.991794098325022190, -0.991800489359232150, -0.991806877913940950, -0.991813263989132500, +-0.991819647584790910, -0.991826028700900200, -0.991832407337444380, -0.991838783494407570, -0.991845157171773790, -0.991851528369527170, -0.991857897087651710, -0.991864263326131420, +-0.991870627084950550, -0.991876988364093100, -0.991883347163543210, -0.991889703483284980, -0.991896057323302440, -0.991902408683579710, -0.991908757564101020, -0.991915103964850390, +-0.991921447885812050, -0.991927789326970120, -0.991934128288308630, -0.991940464769811900, -0.991946798771463860, -0.991953130293248940, -0.991959459335151170, -0.991965785897154780, +-0.991972109979244010, -0.991978431581402860, -0.991984750703615580, -0.991991067345866510, -0.991997381508139760, -0.992003693190419590, -0.992010002392690100, -0.992016309114935660, +-0.992022613357140370, -0.992028915119288700, -0.992035214401364660, -0.992041511203352490, -0.992047805525236640, -0.992054097367001340, -0.992060386728630730, -0.992066673610109140, +-0.992072958011420810, -0.992079239932550210, -0.992085519373481440, -0.992091796334198860, -0.992098070814686820, -0.992104342814929650, -0.992110612334911490, -0.992116879374616900, +-0.992123143934030120, -0.992129406013135480, -0.992135665611917240, -0.992141922730359950, -0.992148177368447740, -0.992154429526165170, -0.992160679203496490, -0.992166926400426140, +-0.992173171116938480, -0.992179413353017850, -0.992185653108648700, -0.992191890383815390, -0.992198125178502370, -0.992204357492694090, -0.992210587326374900, -0.992216814679529270, +-0.992223039552141530, -0.992229261944196250, -0.992235481855677780, -0.992241699286570580, -0.992247914236859210, -0.992254126706528020, -0.992260336695561460, -0.992266544203944110, +-0.992272749231660420, -0.992278951778694850, -0.992285151845031850, -0.992291349430656000, -0.992297544535551750, -0.992303737159703660, -0.992309927303096310, -0.992316114965714040, +-0.992322300147541530, -0.992328482848563230, -0.992334663068763720, -0.992340840808127570, -0.992347016066639330, -0.992353188844283580, -0.992359359141044890, -0.992365526956907720, +-0.992371692291856730, -0.992377855145876510, -0.992384015518951720, -0.992390173411066830, -0.992396328822206520, -0.992402481752355350, -0.992408632201498000, -0.992414780169619150, +-0.992420925656703260, -0.992427068662735110, -0.992433209187699280, -0.992439347231580450, -0.992445482794363180, -0.992451615876032260, -0.992457746476572260, -0.992463874595967850, +-0.992470000234203840, -0.992476123391264790, -0.992482244067135480, -0.992488362261800480, -0.992494477975244700, -0.992500591207452600, -0.992506701958409070, -0.992512810228098790, +-0.992518916016506550, -0.992525019323616920, -0.992531120149414800, -0.992537218493884770, -0.992543314357011820, -0.992549407738780530, -0.992555498639175800, -0.992561587058182200, +-0.992567672995784740, -0.992573756451967990, -0.992579837426716960, -0.992585915920016220, -0.992591991931850770, -0.992598065462205410, -0.992604136511064720, -0.992610205078413800, +-0.992616271164237340, -0.992622334768520240, -0.992628395891247180, -0.992634454532403290, -0.992640510691973120, -0.992646564369941810, -0.992652615566294030, -0.992658664281014680, +-0.992664710514088670, -0.992670754265501000, -0.992676795535236360, -0.992682834323279640, -0.992688870629615970, -0.992694904454230030, -0.992700935797106940, -0.992706964658231380, +-0.992712991037588590, -0.992719014935163120, -0.992725036350940230, -0.992731055284904680, -0.992737071737041620, -0.992743085707335720, -0.992749097195772200, -0.992755106202335870, +-0.992761112727011840, -0.992767116769785020, -0.992773118330640410, -0.992779117409563040, -0.992785114006537790, -0.992791108121549800, -0.992797099754584080, -0.992803088905625520, +-0.992809075574659360, -0.992815059761670390, -0.992821041466643850, -0.992827020689564630, -0.992832997430417970, -0.992838971689188780, -0.992844943465862050, -0.992850912760423030, +-0.992856879572856730, -0.992862843903148270, -0.992868805751282670, -0.992874765117245150, -0.992880722001020620, -0.992886676402594310, -0.992892628321951240, -0.992898577759076640, +-0.992904524713955630, -0.992910469186573330, -0.992916411176914760, -0.992922350684965260, -0.992928287710709840, -0.992934222254133750, -0.992940154315221980, -0.992946083893960000, +-0.992952010990332700, -0.992957935604325330, -0.992963857735923220, -0.992969777385111390, -0.992975694551875180, -0.992981609236199710, -0.992987521438070230, -0.992993431157471960, +-0.992999338394390030, -0.993005243148809780, -0.993011145420716450, -0.993017045210095260, -0.993022942516931460, -0.993028837341210280, -0.993034729682917060, -0.993040619542037040, +-0.993046506918555340, -0.993052391812457520, -0.993058274223728610, -0.993064154152354050, -0.993070031598319190, -0.993075906561609160, -0.993081779042209290, -0.993087649040105160, +-0.993093516555281770, -0.993099381587724590, -0.993105244137418960, -0.993111104204350340, -0.993116961788503840, -0.993122816889864920, -0.993128669508419050, -0.993134519644151450, +-0.993140367297047580, -0.993146212467092780, -0.993152055154272410, -0.993157895358572020, -0.993163733079976740, -0.993169568318472250, -0.993175401074043780, -0.993181231346676800, +-0.993187059136356740, -0.993192884443069080, -0.993198707266799150, -0.993204527607532530, -0.993210345465254550, -0.993216160839950680, -0.993221973731606480, -0.993227784140207290, +-0.993233592065738580, -0.993239397508186020, -0.993245200467534840, -0.993251000943770720, -0.993256798936879130, -0.993262594446845500, -0.993268387473655420, -0.993274178017294340, +-0.993279966077747820, -0.993285751655001440, -0.993291534749040640, -0.993297315359851000, -0.993303093487418080, -0.993308869131727330, -0.993314642292764560, -0.993320412970515100, +-0.993326181164964630, -0.993331946876098710, -0.993337710103902930, -0.993343470848362830, -0.993349229109464100, -0.993354984887192320, -0.993360738181533030, -0.993366488992471930, +-0.993372237319994580, -0.993377983164086650, -0.993383726524733720, -0.993389467401921470, -0.993395205795635560, -0.993400941705861680, -0.993406675132585510, -0.993412406075792510, +-0.993418134535468570, -0.993423860511599250, -0.993429584004170360, -0.993435305013167460, -0.993441023538576330, -0.993446739580382650, -0.993452453138572000, -0.993458164213130380, +-0.993463872804043250, -0.993469578911296500, -0.993475282534875710, -0.993480983674766780, -0.993486682330955380, -0.993492378503427310, -0.993498072192168240, -0.993503763397163950, +-0.993509452118400360, -0.993515138355863140, -0.993520822109537960, -0.993526503379410840, -0.993532182165467350, -0.993537858467693490, -0.993543532286074950, -0.993549203620597620, +-0.993554872471247300, -0.993560538838009770, -0.993566202720870820, -0.993571864119816460, -0.993577523034832380, -0.993583179465904460, -0.993588833413018730, -0.993594484876160760, +-0.993600133855316650, -0.993605780350472310, -0.993611424361613320, -0.993617065888725890, -0.993622704931795830, -0.993628341490808920, -0.993633975565751170, -0.993639607156608480, +-0.993645236263366760, -0.993650862886012010, -0.993656487024530130, -0.993662108678906920, -0.993667727849128600, -0.993673344535180750, -0.993678958737049700, -0.993684570454721140, +-0.993690179688181300, -0.993695786437415850, -0.993701390702411040, -0.993706992483152750, -0.993712591779627010, -0.993718188591819710, -0.993723782919716970, -0.993729374763304700, +-0.993734964122569120, -0.993740550997496030, -0.993746135388071660, -0.993751717294281800, -0.993757296716112790, -0.993762873653550540, -0.993768448106581050, -0.993774020075190450, +-0.993779589559364740, -0.993785156559090170, -0.993790721074352620, -0.993796283105138340, -0.993801842651433230, -0.993807399713223630, -0.993812954290495540, -0.993818506383234990, +-0.993824055991428200, -0.993829603115061300, -0.993835147754120410, -0.993840689908591650, -0.993846229578461030, -0.993851766763715010, -0.993857301464339480, -0.993862833680320690, +-0.993868363411644860, -0.993873890658298120, -0.993879415420266590, -0.993884937697536610, -0.993890457490094300, -0.993895974797925800, -0.993901489621017320, -0.993907001959355110, +-0.993912511812925500, -0.993918019181714520, -0.993923524065708500, -0.993929026464893670, -0.993934526379256390, -0.993940023808782660, -0.993945518753458930, -0.993951011213271340, +-0.993956501188206330, -0.993961988678249920, -0.993967473683388670, -0.993972956203608700, -0.993978436238896370, -0.993983913789237890, -0.993989388854619630, -0.993994861435027910, +-0.994000331530449090, -0.994005799140869390, -0.994011264266275170, -0.994016726906652880, -0.994022187061988640, -0.994027644732269010, -0.994033099917480230, -0.994038552617608760, +-0.994044002832640940, -0.994049450562563000, -0.994054895807361500, -0.994060338567022810, -0.994065778841533130, -0.994071216630879160, -0.994076651935047020, -0.994082084754023380, +-0.994087515087794360, -0.994092942936346760, -0.994098368299666690, -0.994103791177740610, -0.994109211570555210, -0.994114629478096700, -0.994120044900351660, -0.994125457837306440, +-0.994130868288947590, -0.994136276255261690, -0.994141681736234960, -0.994147084731854090, -0.994152485242105530, -0.994157883266975630, -0.994163278806451170, -0.994168671860518380, +-0.994174062429164060, -0.994179450512374440, -0.994184836110136310, -0.994190219222436000, -0.994195599849260200, -0.994200977990595370, -0.994206353646428180, -0.994211726816745080, +-0.994217097501532530, -0.994222465700777440, -0.994227831414466020, -0.994233194642585080, -0.994238555385121180, -0.994243913642060880, -0.994249269413390760, -0.994254622699097480, +-0.994259973499167620, -0.994265321813587840, -0.994270667642344840, -0.994276010985425060, -0.994281351842815300, -0.994286690214502220, -0.994292026100472290, -0.994297359500712410, +-0.994302690415209020, -0.994308018843949040, -0.994313344786918910, -0.994318668244105420, -0.994323989215495360, -0.994329307701075190, -0.994334623700831810, -0.994339937214751890, +-0.994345248242822110, -0.994350556785029260, -0.994355862841360020, -0.994361166411801060, -0.994366467496339170, -0.994371766094961140, -0.994377062207653650, -0.994382355834403600, +-0.994387646975197660, -0.994392935630022510, -0.994398221798865060, -0.994403505481712080, -0.994408786678550370, -0.994414065389366610, -0.994419341614147690, -0.994424615352880510, +-0.994429886605551760, -0.994435155372148220, -0.994440421652656780, -0.994445685447064350, -0.994450946755357720, -0.994456205577523790, -0.994461461913549230, -0.994466715763421050, +-0.994471967127126040, -0.994477216004651220, -0.994482462395983260, -0.994487706301109160, -0.994492947720015840, -0.994498186652690070, -0.994503423099118880, -0.994508657059289150, +-0.994513888533187780, -0.994519117520801690, -0.994524344022117760, -0.994529568037123000, -0.994534789565804320, -0.994540008608148730, -0.994545225164143010, -0.994550439233774290, +-0.994555650817029460, -0.994560859913895530, -0.994566066524359420, -0.994571270648408110, -0.994576472286028750, -0.994581671437208100, -0.994586868101933310, -0.994592062280191260, +-0.994597253971969190, -0.994602443177253880, -0.994607629896032570, -0.994612814128292060, -0.994617995874019560, -0.994623175133202090, -0.994628351905826660, -0.994633526191880390, +-0.994638697991350300, -0.994643867304223490, -0.994649034130487000, -0.994654198470127810, -0.994659360323133290, -0.994664519689490320, -0.994669676569185920, -0.994674830962207550, +-0.994679982868541980, -0.994685132288176450, -0.994690279221098090, -0.994695423667294020, -0.994700565626751350, -0.994705705099457440, -0.994710842085399060, -0.994715976584563680, +-0.994721108596938410, -0.994726238122510260, -0.994731365161266590, -0.994736489713194500, -0.994741611778281240, -0.994746731356513810, -0.994751848447879670, -0.994756963052365830, +-0.994762075169959630, -0.994767184800648190, -0.994772291944418850, -0.994777396601258750, -0.994782498771155210, -0.994787598454095370, -0.994792695650066560, -0.994797790359055910, +-0.994802882581050980, -0.994807972316038680, -0.994813059564006560, -0.994818144324941640, -0.994823226598831490, -0.994828306385663220, -0.994833383685424290, -0.994838458498101820, +-0.994843530823683150, -0.994848600662155750, -0.994853668013506720, -0.994858732877723640, -0.994863795254793740, -0.994868855144704240, -0.994873912547442730, -0.994878967462996310, +-0.994884019891352560, -0.994889069832498700, -0.994894117286422300, -0.994899162253110480, -0.994904204732550810, -0.994909244724730520, -0.994914282229637290, -0.994919317247258240, +-0.994924349777580930, -0.994929379820592710, -0.994934407376281140, -0.994939432444633450, -0.994944455025637220, -0.994949475119279780, -0.994954492725548810, -0.994959507844431430, +-0.994964520475915440, -0.994969530619988050, -0.994974538276636840, -0.994979543445849380, -0.994984546127613000, -0.994989546321915160, -0.994994544028743540, -0.994999539248085600, +-0.995004531979928770, -0.995009522224260650, -0.995014509981068660, -0.995019495250340390, -0.995024478032063510, -0.995029458326225250, -0.995034436132813500, -0.995039411451815630, +-0.995044384283219170, -0.995049354627011720, -0.995054322483180930, -0.995059287851714380, -0.995064250732599630, -0.995069211125824140, -0.995074169031375690, -0.995079124449241850, +-0.995084077379410180, -0.995089027821868250, -0.995093975776603860, -0.995098921243604440, -0.995103864222857680, -0.995108804714351370, -0.995113742718073070, -0.995118678234010350, +-0.995123611262150880, -0.995128541802482450, -0.995133469854992620, -0.995138395419669200, -0.995143318496499730, -0.995148239085472010, -0.995153157186573600, -0.995158072799792400, +-0.995162985925115980, -0.995167896562532020, -0.995172804712028400, -0.995177710373592820, -0.995182613547212940, -0.995187514232876440, -0.995192412430571220, -0.995197308140284950, +-0.995202201362005430, -0.995207092095720340, -0.995211980341417560, -0.995216866099084880, -0.995221749368710000, -0.995226630150280680, -0.995231508443784940, -0.995236384249210350, +-0.995241257566544690, -0.995246128395776090, -0.995250996736891990, -0.995255862589880520, -0.995260725954729360, -0.995265586831426300, -0.995270445219959330, -0.995275301120316370, +-0.995280154532484970, -0.995285005456453260, -0.995289853892209030, -0.995294699839740170, -0.995299543299034580, -0.995304384270080170, -0.995309222752864710, -0.995314058747376220, +-0.995318892253602590, -0.995323723271531850, -0.995328551801151650, -0.995333377842450130, -0.995338201395415180, -0.995343022460034590, -0.995347841036296590, -0.995352657124188970, +-0.995357470723699620, -0.995362281834816680, -0.995367090457528030, -0.995371896591821680, -0.995376700237685540, -0.995381501395107620, -0.995386300064076020, -0.995391096244578550, +-0.995395889936603440, -0.995400681140138580, -0.995405469855172090, -0.995410256081691870, -0.995415039819686040, -0.995419821069142510, -0.995424599830049490, -0.995429376102395010, +-0.995434149886167070, -0.995438921181353690, -0.995443689987943080, -0.995448456305923270, -0.995453220135282260, -0.995457981476008170, -0.995462740328089240, -0.995467496691513350, +-0.995472250566268760, -0.995477001952343570, -0.995481750849725790, -0.995486497258403770, -0.995491241178365400, -0.995495982609598930, -0.995500721552092570, -0.995505458005834340, +-0.995510191970812470, -0.995514923447015200, -0.995519652434430520, -0.995524378933046790, -0.995529102942852020, -0.995533824463834540, -0.995538543495982590, -0.995543260039284170, +-0.995547974093727640, -0.995552685659301110, -0.995557394735992920, -0.995562101323791300, -0.995566805422684390, -0.995571507032660400, -0.995576206153707680, -0.995580902785814460, +-0.995585596928969090, -0.995590288583159570, -0.995594977748374350, -0.995599664424601680, -0.995604348611830000, -0.995609030310047330, -0.995613709519242000, -0.995618386239402580, +-0.995623060470517070, -0.995627732212573950, -0.995632401465561420, -0.995637068229468070, -0.995641732504281900, -0.995646394289991470, -0.995651053586585010, -0.995655710394050870, +-0.995660364712377510, -0.995665016541553260, -0.995669665881566470, -0.995674312732405480, -0.995678957094058740, -0.995683598966514590, -0.995688238349761390, -0.995692875243787690, +-0.995697509648581720, -0.995702141564132060, -0.995706770990427040, -0.995711397927455000, -0.995716022375204620, -0.995720644333664030, -0.995725263802821890, -0.995729880782666550, +-0.995734495273186580, -0.995739107274370320, -0.995743716786206320, -0.995748323808683060, -0.995752928341788970, -0.995757530385512510, -0.995762129939842260, -0.995766727004766650, +-0.995771321580274260, -0.995775913666353650, -0.995780503262993170, -0.995785090370181370, -0.995789674987906940, -0.995794257116158320, -0.995798836754923980, -0.995803413904192580, +-0.995807988563952700, -0.995812560734192780, -0.995817130414901500, -0.995821697606067420, -0.995826262307679010, -0.995830824519725040, -0.995835384242193980, -0.995839941475074370, +-0.995844496218355020, -0.995849048472024380, -0.995853598236071110, -0.995858145510483910, -0.995862690295251320, -0.995867232590361920, -0.995871772395804490, -0.995876309711567710, +-0.995880844537640030, -0.995885376874010350, -0.995889906720667130, -0.995894434077599260, -0.995898958944795190, -0.995903481322243820, -0.995908001209933720, -0.995912518607853570, +-0.995917033515992140, -0.995921545934338130, -0.995926055862880300, -0.995930563301607230, -0.995935068250507820, -0.995939570709570730, -0.995944070678784770, -0.995948568158138590, +-0.995953063147621000, -0.995957555647220660, -0.995962045656926590, -0.995966533176727230, -0.995971018206611710, -0.995975500746568490, -0.995979980796586670, -0.995984458356654830, +-0.995988933426761760, -0.995993406006896450, -0.995997876097047600, -0.996002343697204080, -0.996006808807354700, -0.996011271427488350, -0.996015731557593710, -0.996020189197659780, +-0.996024644347675460, -0.996029097007629430, -0.996033547177510690, -0.996037994857308040, -0.996042440047010480, -0.996046882746606800, -0.996051322956085890, -0.996055760675436660, +-0.996060195904648000, -0.996064628643708930, -0.996069058892608330, -0.996073486651334990, -0.996077911919877930, -0.996082334698226160, -0.996086754986368450, -0.996091172784293930, +-0.996095588091991500, -0.996100000909450060, -0.996104411236658600, -0.996108819073606160, -0.996113224420281610, -0.996117627276674080, -0.996122027642772470, -0.996126425518565670, +-0.996130820904042920, -0.996135213799193120, -0.996139604204005270, -0.996143992118468380, -0.996148377542571570, -0.996152760476303740, -0.996157140919654130, -0.996161518872611510, +-0.996165894335165230, -0.996170267307304070, -0.996174637789017380, -0.996179005780294060, -0.996183371281123220, -0.996187734291493880, -0.996192094811395260, -0.996196452840816480, +-0.996200808379746450, -0.996205161428174500, -0.996209511986089540, -0.996213860053480890, -0.996218205630337470, -0.996222548716648730, -0.996226889312403440, -0.996231227417591070, +-0.996235563032200510, -0.996239896156221110, -0.996244226789641970, -0.996248554932452230, -0.996252880584641120, -0.996257203746197750, -0.996261524417111470, -0.996265842597371390, +-0.996270158286966630, -0.996274471485886440, -0.996278782194120140, -0.996283090411656860, -0.996287396138485940, -0.996291699374596380, -0.996296000119977650, -0.996300298374618980, +-0.996304594138509470, -0.996308887411638590, -0.996313178193995340, -0.996317466485569290, -0.996321752286349450, -0.996326035596325270, -0.996330316415486080, -0.996334594743821020, +-0.996338870581319420, -0.996343143927970740, -0.996347414783764210, -0.996351683148689050, -0.996355949022734720, -0.996360212405890570, -0.996364473298145930, -0.996368731699490030, +-0.996372987609912220, -0.996377241029402060, -0.996381491957948780, -0.996385740395541730, -0.996389986342170350, -0.996394229797823990, -0.996398470762492110, -0.996402709236164030, +-0.996406945218829110, -0.996411178710476910, -0.996415409711096770, -0.996419638220678030, -0.996423864239210260, -0.996428087766682790, -0.996432308803085200, -0.996436527348406710, +-0.996440743402637000, -0.996444956965765290, -0.996449168037781270, -0.996453376618674390, -0.996457582708433990, -0.996461786307049740, -0.996465987414510870, -0.996470186030807170, +-0.996474382155927870, -0.996478575789862760, -0.996482766932601070, -0.996486955584132580, -0.996491141744446640, -0.996495325413532920, -0.996499506591380760, -0.996503685277979940, +-0.996507861473319820, -0.996512035177390180, -0.996516206390180350, -0.996520375111680010, -0.996524541341878730, -0.996528705080766190, -0.996532866328331710, -0.996537025084565210, +-0.996541181349456130, -0.996545335122994040, -0.996549486405168610, -0.996553635195969510, -0.996557781495386320, -0.996561925303408700, -0.996566066620026230, -0.996570205445228560, +-0.996574341779005390, -0.996578475621346490, -0.996582606972241210, -0.996586735831679560, -0.996590862199650980, -0.996594986076145380, -0.996599107461152210, -0.996603226354661250, +-0.996607342756662300, -0.996611456667144900, -0.996615568086098860, -0.996619677013513950, -0.996623783449379850, -0.996627887393686350, -0.996631988846423010, -0.996636087807579840, +-0.996640184277146290, -0.996644278255112370, -0.996648369741467750, -0.996652458736202230, -0.996656545239305470, -0.996660629250767480, -0.996664710770577830, -0.996668789798726420, +-0.996672866335203020, -0.996676940379997430, -0.996681011933099550, -0.996685080994499150, -0.996689147564186030, -0.996693211642150080, -0.996697273228380980, -0.996701332322868840, +-0.996705388925603230, -0.996709443036574270, -0.996713494655771640, -0.996717543783185330, -0.996721590418805040, -0.996725634562620870, -0.996729676214622610, -0.996733715374800160, +-0.996737752043143410, -0.996741786219642270, -0.996745817904286620, -0.996749847097066490, -0.996753873797971760, -0.996757898006992330, -0.996761919724118210, -0.996765938949339180, +-0.996769955682645370, -0.996773969924026560, -0.996777981673472980, -0.996781990930974420, -0.996785997696520760, -0.996790001970102260, -0.996794003751708680, -0.996798003041330040, +-0.996801999838956450, -0.996805994144577930, -0.996809985958184370, -0.996813975279765780, -0.996817962109312280, -0.996821946446813880, -0.996825928292260690, -0.996829907645642610, +-0.996833884506949760, -0.996837858876172270, -0.996841830753300020, -0.996845800138323250, -0.996849767031231960, -0.996853731432016280, -0.996857693340666320, -0.996861652757172090, +-0.996865609681523710, -0.996869564113711300, -0.996873516053724980, -0.996877465501554870, -0.996881412457191090, -0.996885356920623860, -0.996889298891843080, -0.996893238370839210, +-0.996897175357602140, -0.996901109852122210, -0.996905041854389440, -0.996908971364394160, -0.996912898382126380, -0.996916822907576330, -0.996920744940734240, -0.996924664481590340, +-0.996928581530134750, -0.996932496086357700, -0.996936408150249420, -0.996940317721800030, -0.996944224800999980, -0.996948129387839280, -0.996952031482308270, -0.996955931084397280, +-0.996959828194096340, -0.996963722811395890, -0.996967614936286160, -0.996971504568757270, -0.996975391708799790, -0.996979276356403710, -0.996983158511559500, -0.996987038174257380, +-0.996990915344487580, -0.996994790022240560, -0.996998662207506550, -0.997002531900275990, -0.997006399100539010, -0.997010263808286060, -0.997014126023507360, -0.997017985746193490, +-0.997021842976334560, -0.997025697713921020, -0.997029549958943220, -0.997033399711391600, -0.997037246971256510, -0.997041091738528280, -0.997044934013197270, -0.997048773795253920, +-0.997052611084688680, -0.997056445881491890, -0.997060278185654010, -0.997064107997165490, -0.997067935316016560, -0.997071760142197890, -0.997075582475699830, -0.997079402316512820, +-0.997083219664627210, -0.997087034520033670, -0.997090846882722430, -0.997094656752684160, -0.997098464129909210, -0.997102269014388030, -0.997106071406111290, -0.997109871305069340, +-0.997113668711252730, -0.997117463624651920, -0.997121256045257480, -0.997125045973059840, -0.997128833408049700, -0.997132618350217380, -0.997136400799553460, -0.997140180756048710, +-0.997143958219693370, -0.997147733190478110, -0.997151505668393610, -0.997155275653430430, -0.997159043145578900, -0.997162808144829830, -0.997166570651173760, -0.997170330664601150, +-0.997174088185102780, -0.997177843212669220, -0.997181595747291040, -0.997185345788958900, -0.997189093337663370, -0.997192838393395120, -0.997196580956144720, -0.997200321025902950, +-0.997204058602660260, -0.997207793686407550, -0.997211526277135270, -0.997215256374834210, -0.997218983979495040, -0.997222709091108330, -0.997226431709664960, -0.997230151835155400, +-0.997233869467570530, -0.997237584606900930, -0.997241297253137370, -0.997245007406270640, -0.997248715066291310, -0.997252420233190270, -0.997256122906958200, -0.997259823087585760, +-0.997263520775063750, -0.997267215969382950, -0.997270908670534140, -0.997274598878508000, -0.997278286593295430, -0.997281971814887090, -0.997285654543273890, -0.997289334778446500, +-0.997293012520395820, -0.997296687769112510, -0.997300360524587590, -0.997304030786811730, -0.997307698555775720, -0.997311363831470570, -0.997315026613886930, -0.997318686903015840, +-0.997322344698847950, -0.997326000001374170, -0.997329652810585500, -0.997333303126472610, -0.997336950949026410, -0.997340596278238010, -0.997344239114097970, -0.997347879456597420, +-0.997351517305727020, -0.997355152661478010, -0.997358785523841050, -0.997362415892807050, -0.997366043768367130, -0.997369669150512060, -0.997373292039232750, -0.997376912434520310, +-0.997380530336365530, -0.997384145744759530, -0.997387758659693090, -0.997391369081157220, -0.997394977009142920, -0.997398582443641210, -0.997402185384643090, -0.997405785832139460, +-0.997409383786121320, -0.997412979246579790, -0.997416572213505770, -0.997420162686890380, -0.997423750666724510, -0.997427336152999280, -0.997430919145705810, -0.997434499644834880, +-0.997438077650377840, -0.997441653162325580, -0.997445226180669110, -0.997448796705399650, -0.997452364736508110, -0.997455930273985820, -0.997459493317823580, -0.997463053868012590, +-0.997466611924544000, -0.997470167487408910, -0.997473720556598440, -0.997477271132103600, -0.997480819213915510, -0.997484364802025510, -0.997487907896424500, -0.997491448497103810, +-0.997494986604054450, -0.997498522217267650, -0.997502055336734530, -0.997505585962446210, -0.997509114094394020, -0.997512639732568980, -0.997516162876962320, -0.997519683527565370, +-0.997523201684369140, -0.997526717347364870, -0.997530230516543880, -0.997533741191897310, -0.997537249373416370, -0.997540755061092300, -0.997544258254916330, -0.997547758954879680, +-0.997551257160973700, -0.997554752873189510, -0.997558246091518550, -0.997561736815951840, -0.997565225046480930, -0.997568710783096830, -0.997572194025791000, -0.997575674774554670, +-0.997579153029379160, -0.997582628790255830, -0.997586102057175910, -0.997589572830130720, -0.997593041109111510, -0.997596506894109840, -0.997599970185116810, -0.997603430982123900, +-0.997606889285122420, -0.997610345094103620, -0.997613798409059060, -0.997617249229979960, -0.997620697556857780, -0.997624143389683860, -0.997627586728449530, -0.997631027573146260, +-0.997634465923765370, -0.997637901780298430, -0.997641335142736560, -0.997644766011071550, -0.997648194385294510, -0.997651620265397000, -0.997655043651370480, -0.997658464543206280, +-0.997661882940895970, -0.997665298844431000, -0.997668712253802710, -0.997672123169002670, -0.997675531590022310, -0.997678937516853100, -0.997682340949486600, -0.997685741887914150, +-0.997689140332127410, -0.997692536282117850, -0.997695929737876910, -0.997699320699396150, -0.997702709166667150, -0.997706095139681340, -0.997709478618430180, -0.997712859602905460, +-0.997716238093098620, -0.997719614089001010, -0.997722987590604520, -0.997726358597900490, -0.997729727110880590, -0.997733093129536400, -0.997736456653859460, -0.997739817683841350, +-0.997743176219473730, -0.997746532260748160, -0.997749885807656220, -0.997753236860189570, -0.997756585418339890, -0.997759931482098740, -0.997763275051457680, -0.997766616126408600, +-0.997769954706942850, -0.997773290793052210, -0.997776624384728360, -0.997779955481962970, -0.997783284084747700, -0.997786610193074130, -0.997789933806934150, -0.997793254926319320, +-0.997796573551221310, -0.997799889681631800, -0.997803203317542690, -0.997806514458945530, -0.997809823105832110, -0.997813129258194100, -0.997816432916023290, -0.997819734079311350, +-0.997823032748050180, -0.997826328922231330, -0.997829622601846600, -0.997832913786887990, -0.997836202477346950, -0.997839488673215480, -0.997842772374485270, -0.997846053581148080, +-0.997849332293195830, -0.997852608510620190, -0.997855882233413150, -0.997859153461566280, -0.997862422195071600, -0.997865688433920760, -0.997868952178105780, -0.997872213427618450, +-0.997875472182450540, -0.997878728442593950, -0.997881982208040470, -0.997885233478782220, -0.997888482254810750, -0.997891728536118070, -0.997894972322696080, -0.997898213614536680, +-0.997901452411631750, -0.997904688713973200, -0.997907922521552910, -0.997911153834362800, -0.997914382652394850, -0.997917608975640970, -0.997920832804092940, -0.997924054137742990, +-0.997927272976582790, -0.997930489320604460, -0.997933703169799900, -0.997936914524161000, -0.997940123383679880, -0.997943329748348430, -0.997946533618158770, -0.997949734993102690, +-0.997952933873172190, -0.997956130258359500, -0.997959324148656400, -0.997962515544055020, -0.997965704444547350, -0.997968890850125410, -0.997972074760781200, -0.997975256176506840, +-0.997978435097294450, -0.997981611523135800, -0.997984785454023250, -0.997987956889948680, -0.997991125830904210, -0.997994292276881970, -0.997997456227873950, -0.998000617683872270, +-0.998003776644869060, -0.998006933110856420, -0.998010087081826480, -0.998013238557771350, -0.998016387538683050, -0.998019534024553790, -0.998022678015375700, -0.998025819511141000, +-0.998028958511841590, -0.998032095017469920, -0.998035229028018000, -0.998038360543477940, -0.998041489563841980, -0.998044616089102330, -0.998047740119251130, -0.998050861654280590, +-0.998053980694182940, -0.998057097238950310, -0.998060211288574920, -0.998063322843048990, -0.998066431902364770, -0.998069538466514470, -0.998072642535490330, -0.998075744109284570, +-0.998078843187889420, -0.998081939771297220, -0.998085033859500200, -0.998088125452490480, -0.998091214550260620, -0.998094301152802510, -0.998097385260108830, -0.998100466872171580, +-0.998103545988983210, -0.998106622610535950, -0.998109696736822150, -0.998112768367834140, -0.998115837503564140, -0.998118904144004620, -0.998121968289147790, -0.998125029938986110, +-0.998128089093511690, -0.998131145752717220, -0.998134199916594800, -0.998137251585136890, -0.998140300758335930, -0.998143347436184160, -0.998146391618673910, -0.998149433305797860, +-0.998152472497548130, -0.998155509193917270, -0.998158543394897620, -0.998161575100481540, -0.998164604310661560, -0.998167631025430160, -0.998170655244779550, -0.998173676968702410, +-0.998176696197191070, -0.998179712930237990, -0.998182727167835520, -0.998185738909976310, -0.998188748156652820, -0.998191754907857390, -0.998194759163582580, -0.998197760923820840, +-0.998200760188564740, -0.998203756957806720, -0.998206751231539350, -0.998209743009755070, -0.998212732292446340, -0.998215719079605930, -0.998218703371226090, -0.998221685167299590, +-0.998224664467818880, -0.998227641272776520, -0.998230615582164970, -0.998233587395976900, -0.998236556714204970, -0.998239523536841530, -0.998242487863879370, -0.998245449695310930, +-0.998248409031128880, -0.998251365871325790, -0.998254320215894330, -0.998257272064827060, -0.998260221418116540, -0.998263168275755560, -0.998266112637736570, -0.998269054504052340, +-0.998271993874695560, -0.998274930749658670, -0.998277865128934460, -0.998280797012515710, -0.998283726400394870, -0.998286653292564720, -0.998289577689017940, -0.998292499589747200, +-0.998295418994745280, -0.998298335904004740, -0.998301250317518480, -0.998304162235278960, -0.998307071657279050, -0.998309978583511560, -0.998312883013969030, -0.998315784948644370, +-0.998318684387530130, -0.998321581330619210, -0.998324475777904400, -0.998327367729378360, -0.998330257185033990, -0.998333144144863850, -0.998336028608860950, -0.998338910577017960, +-0.998341790049327660, -0.998344667025782840, -0.998347541506376390, -0.998350413491101100, -0.998353282979949850, -0.998356149972915330, -0.998359014469990420, -0.998361876471168030, +-0.998364735976440820, -0.998367592985801910, -0.998370447499243970, -0.998373299516759900, -0.998376149038342600, -0.998378996063984840, -0.998381840593679740, -0.998384682627419970, +-0.998387522165198440, -0.998390359207008140, -0.998393193752841970, -0.998396025802692820, -0.998398855356553590, -0.998401682414417180, -0.998404506976276580, -0.998407329042124810, +-0.998410148611954540, -0.998412965685759100, -0.998415780263531170, -0.998418592345263760, -0.998421401930949860, -0.998424209020582490, -0.998427013614154530, -0.998429815711659120, +-0.998432615313089130, -0.998435412418437580, -0.998438207027697590, -0.998440999140862040, -0.998443788757923940, -0.998446575878876420, -0.998449360503712470, -0.998452142632425100, +-0.998454922265007320, -0.998457699401452240, -0.998460474041752980, -0.998463246185902540, -0.998466015833893940, -0.998468782985720280, -0.998471547641374800, -0.998474309800850280, +-0.998477069464140050, -0.998479826631237240, -0.998482581302134740, -0.998485333476825780, -0.998488083155303570, -0.998490830337561140, -0.998493575023591600, -0.998496317213388160, +-0.998499056906943850, -0.998501794104251990, -0.998504528805305600, -0.998507261010097900, -0.998509990718622010, -0.998512717930871150, -0.998515442646838560, -0.998518164866517340, +-0.998520884589900630, -0.998523601816981850, -0.998526316547753920, -0.998529028782210280, -0.998531738520344050, -0.998534445762148560, -0.998537150507616820, -0.998539852756742290, +-0.998542552509518070, -0.998545249765937500, -0.998547944525993820, -0.998550636789680260, -0.998553326556990140, -0.998556013827916700, -0.998558698602453170, -0.998561380880592870, +-0.998564060662329170, -0.998566737947655380, -0.998569412736564630, -0.998572085029050480, -0.998574754825106050, -0.998577422124724670, -0.998580086927899790, -0.998582749234624760, +-0.998585409044892790, -0.998588066358697350, -0.998590721176031650, -0.998593373496889150, -0.998596023321263290, -0.998598670649147310, -0.998601315480534770, -0.998603957815418770, +-0.998606597653793000, -0.998609234995650690, -0.998611869840985380, -0.998614502189790310, -0.998617132042058930, -0.998619759397784800, -0.998622384256961260, -0.998625006619581760, +-0.998627626485639740, -0.998630243855128660, -0.998632858728041970, -0.998635471104373120, -0.998638080984115660, -0.998640688367262940, -0.998643293253808520, -0.998645895643745840, +-0.998648495537068360, -0.998651092933769750, -0.998653687833843340, -0.998656280237282810, -0.998658870144081500, -0.998661457554232970, -0.998664042467730880, -0.998666624884568700, +-0.998669204804739860, -0.998671782228238050, -0.998674357155056810, -0.998676929585189720, -0.998679499518630220, -0.998682066955371980, -0.998684631895408680, -0.998687194338733650, +-0.998689754285340680, -0.998692311735223440, -0.998694866688375260, -0.998697419144790040, -0.998699969104461240, -0.998702516567382400, -0.998705061533547430, -0.998707604002949670, +-0.998710143975583000, -0.998712681451440990, -0.998715216430517190, -0.998717748912805400, -0.998720278898299170, -0.998722806386992400, -0.998725331378878420, -0.998727853873951240, +-0.998730373872204420, -0.998732891373631640, -0.998735406378226550, -0.998737918885983070, -0.998740428896894740, -0.998742936410955350, -0.998745441428158690, -0.998747943948498310, +-0.998750443971968100, -0.998752941498561750, -0.998755436528273140, -0.998757929061095840, -0.998760419097023840, -0.998762906636050720, -0.998765391678170360, -0.998767874223376430, +-0.998770354271662940, -0.998772831823023450, -0.998775306877451970, -0.998777779434942170, -0.998780249495487940, -0.998782717059083060, -0.998785182125721430, -0.998787644695396830, +-0.998790104768103150, -0.998792562343834180, -0.998795017422583810, -0.998797470004345820, -0.998799920089114220, -0.998802367676882910, -0.998804812767645540, -0.998807255361396250, +-0.998809695458128700, -0.998812133057837000, -0.998814568160514950, -0.998817000766156540, -0.998819430874755550, -0.998821858486306000, -0.998824283600801780, -0.998826706218236880, +-0.998829126338605210, -0.998831543961900660, -0.998833959088117340, -0.998836371717249150, -0.998838781849289980, -0.998841189484233840, -0.998843594622074730, -0.998845997262806650, +-0.998848397406423620, -0.998850795052919520, -0.998853190202288470, -0.998855582854524470, -0.998857973009621420, -0.998860360667573550, -0.998862745828374640, -0.998865128492019030, +-0.998867508658500490, -0.998869886327813260, -0.998872261499951230, -0.998874634174908630, -0.998877004352679340, -0.998879372033257610, -0.998881737216637420, -0.998884099902812910, +-0.998886460091778170, -0.998888817783527230, -0.998891172978054300, -0.998893525675353390, -0.998895875875418730, -0.998898223578244320, -0.998900568783824380, -0.998902911492153050, +-0.998905251703224310, -0.998907589417032620, -0.998909924633571870, -0.998912257352836290, -0.998914587574820100, -0.998916915299517430, -0.998919240526922380, -0.998921563257029410, +-0.998923883489832410, -0.998926201225325720, -0.998928516463503560, -0.998930829204360050, -0.998933139447889530, -0.998935447194086110, -0.998937752442944140, -0.998940055194457720, +-0.998942355448621200, -0.998944653205428800, -0.998946948464874750, -0.998949241226953390, -0.998951531491658830, -0.998953819258985520, -0.998956104528927580, -0.998958387301479460, +-0.998960667576635260, -0.998962945354389450, -0.998965220634736360, -0.998967493417670100, -0.998969763703185240, -0.998972031491275890, -0.998974296781936390, -0.998976559575161290, +-0.998978819870944720, -0.998981077669281130, -0.998983332970164730, -0.998985585773590090, -0.998987836079551550, -0.998990083888043330, -0.998992329199059890, -0.998994572012595670, +-0.998996812328645010, -0.998999050147202360, -0.999001285468262060, -0.999003518291818550, -0.999005748617866170, -0.999007976446399490, -0.999010201777412840, -0.999012424610900780, +-0.999014644946857540, -0.999016862785277790, -0.999019078126155760, -0.999021290969486110, -0.999023501315263300, -0.999025709163481550, -0.999027914514135640, -0.999030117367220030, +-0.999032317722729050, -0.999034515580657260, -0.999036710940999110, -0.999038903803749270, -0.999041094168902190, -0.999043282036452320, -0.999045467406394330, -0.999047650278722550, +-0.999049830653431780, -0.999052008530516340, -0.999054183909970920, -0.999056356791789950, -0.999058527175968210, -0.999060695062500060, -0.999062860451380260, -0.999065023342603280, +-0.999067183736163770, -0.999069341632056180, -0.999071497030275310, -0.999073649930815710, -0.999075800333672050, -0.999077948238838780, -0.999080093646310670, -0.999082236556082300, +-0.999084376968148450, -0.999086514882503550, -0.999088650299142400, -0.999090783218059660, -0.999092913639249900, -0.999095041562707900, -0.999097166988428210, -0.999099289916405730, +-0.999101410346634910, -0.999103528279110640, -0.999105643713827480, -0.999107756650780330, -0.999109867089963740, -0.999111975031372390, -0.999114080475001280, -0.999116183420844850, +-0.999118283868897890, -0.999120381819155300, -0.999122477271611850, -0.999124570226262110, -0.999126660683100960, -0.999128748642123090, -0.999130834103323480, -0.999132917066696710, +-0.999134997532237670, -0.999137075499941130, -0.999139150969801880, -0.999141223941814700, -0.999143294415974600, -0.999145362392276140, -0.999147427870714310, -0.999149490851284020, +-0.999151551333979930, -0.999153609318796930, -0.999155664805729930, -0.999157717794773690, -0.999159768285923230, -0.999161816279173330, -0.999163861774518990, -0.999165904771954880, +-0.999167945271476010, -0.999169983273077380, -0.999172018776753660, -0.999174051782499960, -0.999176082290311070, -0.999178110300182110, -0.999180135812107740, -0.999182158826083080, +-0.999184179342103020, -0.999186197360162560, -0.999188212880256610, -0.999190225902380050, -0.999192236426527990, -0.999194244452695330, -0.999196249980876970, -0.999198253011068130, +-0.999200253543263580, -0.999202251577458340, -0.999204247113647530, -0.999206240151826130, -0.999208230691989160, -0.999210218734131520, -0.999212204278248420, -0.999214187324334760, +-0.999216167872385540, -0.999218145922395990, -0.999220121474361120, -0.999222094528275930, -0.999224065084135530, -0.999226033141934810, -0.999227998701669230, -0.999229961763333450, +-0.999231922326922930, -0.999233880392432550, -0.999235835959857430, -0.999237789029192690, -0.999239739600433550, -0.999241687673575020, -0.999243633248612320, -0.999245576325540560, +-0.999247516904354760, -0.999249454985050240, -0.999251390567622020, -0.999253323652065430, -0.999255254238375470, -0.999257182326547370, -0.999259107916576240, -0.999261031008457420, +-0.999262951602186030, -0.999264869697757300, -0.999266785295166330, -0.999268698394408460, -0.999270608995478820, -0.999272517098372610, -0.999274422703085090, -0.999276325809611570, +-0.999278226417947280, -0.999280124528087340, -0.999282020140027090, -0.999283913253761870, -0.999285803869286780, -0.999287691986597280, -0.999289577605688480, -0.999291460726555720, +-0.999293341349194340, -0.999295219473599560, -0.999297095099766830, -0.999298968227691260, -0.999300838857368310, -0.999302706988793310, -0.999304572621961480, -0.999306435756868280, +-0.999308296393508930, -0.999310154531878880, -0.999312010171973350, -0.999313863313787910, -0.999315713957317770, -0.999317562102558400, -0.999319407749505010, -0.999321250898153160, +-0.999323091548498190, -0.999324929700535550, -0.999326765354260460, -0.999328598509668600, -0.999330429166755190, -0.999332257325515670, -0.999334082985945500, -0.999335906148040130, +-0.999337726811795000, -0.999339544977205560, -0.999341360644267260, -0.999343173812975550, -0.999344984483325980, -0.999346792655313900, -0.999348598328934750, -0.999350401504184190, +-0.999352202181057690, -0.999354000359550580, -0.999355796039658520, -0.999357589221376960, -0.999359379904701360, -0.999361168089627380, -0.999362953776150480, -0.999364736964266200, +-0.999366517653970110, -0.999368295845257660, -0.999370071538124520, -0.999371844732566130, -0.999373615428578170, -0.999375383626156190, -0.999377149325295750, -0.999378912525992420, +-0.999380673228241760, -0.999382431432039530, -0.999384187137381090, -0.999385940344262310, -0.999387691052678660, -0.999389439262625690, -0.999391184974099180, -0.999392928187094690, +-0.999394668901607890, -0.999396407117634440, -0.999398142835170030, -0.999399876054210100, -0.999401606774750650, -0.999403334996787130, -0.999405060720315210, -0.999406783945330670, +-0.999408504671829180, -0.999410222899806410, -0.999411938629258150, -0.999413651860179940, -0.999415362592567690, -0.999417070826416950, -0.999418776561723620, -0.999420479798483250, +-0.999422180536691850, -0.999423878776344870, -0.999425574517438190, -0.999427267759967600, -0.999428958503928880, -0.999430646749317700, -0.999432332496129950, -0.999434015744361300, +-0.999435696494007650, -0.999437374745064780, -0.999439050497528460, -0.999440723751394590, -0.999442394506658840, -0.999444062763317100, -0.999445728521365150, -0.999447391780798890, +-0.999449052541614200, -0.999450710803806870, -0.999452366567372800, -0.999454019832307860, -0.999455670598607740, -0.999457318866268540, -0.999458964635285940, -0.999460607905656050, +-0.999462248677374540, -0.999463886950437420, -0.999465522724840680, -0.999467156000580000, -0.999468786777651500, -0.999470415056051050, -0.999472040835774570, -0.999473664116817930, +-0.999475284899177140, -0.999476903182848210, -0.999478518967826910, -0.999480132254109480, -0.999481743041691570, -0.999483351330569310, -0.999484957120738700, -0.999486560412195750, +-0.999488161204936330, -0.999489759498956580, -0.999491355294252370, -0.999492948590819830, -0.999494539388654850, -0.999496127687753530, -0.999497713488111890, -0.999499296789726040, +-0.999500877592591870, -0.999502455896705500, -0.999504031702063030, -0.999505605008660480, -0.999507175816493950, -0.999508744125559460, -0.999510309935853100, -0.999511873247371010, +-0.999513434060109170, -0.999514992374063720, -0.999516548189230860, -0.999518101505606600, -0.999519652323187070, -0.999521200641968480, -0.999522746461946830, -0.999524289783118250, +-0.999525830605479060, -0.999527368929025270, -0.999528904753753000, -0.999530438079658580, -0.999531968906737900, -0.999533497234987410, -0.999535023064403230, -0.999536546394981350, +-0.999538067226718230, -0.999539585559609870, -0.999541101393652600, -0.999542614728842540, -0.999544125565175910, -0.999545633902649060, -0.999547139741258080, -0.999548643080999220, +-0.999550143921868810, -0.999551642263862950, -0.999553138106978100, -0.999554631451210260, -0.999556122296555990, -0.999557610643011300, -0.999559096490572620, -0.999560579839236300, +-0.999562060688998440, -0.999563539039855400, -0.999565014891803600, -0.999566488244839180, -0.999567959098958570, -0.999569427454158000, -0.999570893310434030, -0.999572356667782660, +-0.999573817526200450, -0.999575275885683730, -0.999576731746228850, -0.999578185107832030, -0.999579635970489820, -0.999581084334198570, -0.999582530198954490, -0.999583973564754150, +-0.999585414431593880, -0.999586852799470020, -0.999588288668379120, -0.999589722038317420, -0.999591152909281470, -0.999592581281267600, -0.999594007154272270, -0.999595430528292030, +-0.999596851403323110, -0.999598269779362060, -0.999599685656405330, -0.999601099034449380, -0.999602509913490760, -0.999603918293525790, -0.999605324174551060, -0.999606727556563100, +-0.999608128439558150, -0.999609526823532990, -0.999610922708484060, -0.999612316094407700, -0.999613706981300590, -0.999615095369159270, -0.999616481257980190, -0.999617864647759920, +-0.999619245538494900, -0.999620623930181810, -0.999621999822817190, -0.999623373216397600, -0.999624744110919510, -0.999626112506379560, -0.999627478402774330, -0.999628841800100480, +-0.999630202698354450, -0.999631561097532930, -0.999632916997632570, -0.999634270398649830, -0.999635621300581480, -0.999636969703423970, -0.999638315607174200, -0.999639659011828500, +-0.999640999917383750, -0.999642338323836420, -0.999643674231183280, -0.999645007639420990, -0.999646338548546120, -0.999647666958555450, -0.999648992869445530, -0.999650316281213260, +-0.999651637193855080, -0.999652955607367890, -0.999654271521748240, -0.999655584936993020, -0.999656895853098800, -0.999658204270062250, -0.999659510187880240, -0.999660813606549460, +-0.999662114526066680, -0.999663412946428580, -0.999664708867632030, -0.999666002289673620, -0.999667293212550210, -0.999668581636258600, -0.999669867560795460, -0.999671150986157660, +-0.999672431912342120, -0.999673710339345380, -0.999674986267164440, -0.999676259695795990, -0.999677530625236900, -0.999678799055483960, -0.999680064986533940, -0.999681328418383860, +-0.999682589351030490, -0.999683847784470610, -0.999685103718701120, -0.999686357153718900, -0.999687608089520730, -0.999688856526103510, -0.999690102463464240, -0.999691345901599690, +-0.999692586840506770, -0.999693825280182360, -0.999695061220623350, -0.999696294661826750, -0.999697525603789440, -0.999698754046508320, -0.999699979989980280, -0.999701203434202210, +-0.999702424379171230, -0.999703642824884220, -0.999704858771337970, -0.999706072218529700, -0.999707283166456180, -0.999708491615114550, -0.999709697564501560, -0.999710901014614350, +-0.999712101965450020, -0.999713300417005240, -0.999714496369277340, -0.999715689822263220, -0.999716880775959770, -0.999718069230364210, -0.999719255185473440, -0.999720438641284570, +-0.999721619597794490, -0.999722798055000420, -0.999723974012899360, -0.999725147471488440, -0.999726318430764540, -0.999727486890724990, -0.999728652851366580, -0.999729816312686540, +-0.999730977274682080, -0.999732135737350090, -0.999733291700687810, -0.999734445164692230, -0.999735596129360580, -0.999736744594689860, -0.999737890560677410, -0.999739034027320230, +-0.999740174994615320, -0.999741313462560120, -0.999742449431151540, -0.999743582900386900, -0.999744713870263310, -0.999745842340777900, -0.999746968311927890, -0.999748091783710490, +-0.999749212756122830, -0.999750331229162130, -0.999751447202825600, -0.999752560677110490, -0.999753671652013900, -0.999754780127533270, -0.999755886103665500, -0.999756989580408150, +-0.999758090557758330, -0.999759189035713260, -0.999760285014270170, -0.999761378493426500, -0.999762469473179260, -0.999763557953525890, -0.999764643934463630, -0.999765727415989680, +-0.999766808398101500, -0.999767886880796320, -0.999768962864071350, -0.999770036347924050, -0.999771107332351530, -0.999772175817351340, -0.999773241802920710, -0.999774305289056970, +-0.999775366275757470, -0.999776424763019530, -0.999777480750840610, -0.999778534239217920, -0.999779585228148800, -0.999780633717630930, -0.999781679707661300, -0.999782723198237580, +-0.999783764189356990, -0.999784802681016990, -0.999785838673215020, -0.999786872165948410, -0.999787903159214620, -0.999788931653011080, -0.999789957647335250, -0.999790981142184560, +-0.999792002137556370, -0.999793020633448100, -0.999794036629857330, -0.999795050126781490, -0.999796061124218040, -0.999797069622164410, -0.999798075620618180, -0.999799079119576660, +-0.999800080119037430, -0.999801078618998140, -0.999802074619456030, -0.999803068120408760, -0.999804059121853770, -0.999805047623788750, -0.999806033626211010, -0.999807017129118240, +-0.999807998132507980, -0.999808976636377580, -0.999809952640724810, -0.999810926145547230, -0.999811897150842290, -0.999812865656607540, -0.999813831662840660, -0.999814795169539310, +-0.999815756176700820, -0.999816714684322980, -0.999817670692403460, -0.999818624200939590, -0.999819575209929260, -0.999820523719370020, -0.999821469729259450, -0.999822413239595200, +-0.999823354250374830, -0.999824292761596230, -0.999825228773256750, -0.999826162285354260, -0.999827093297886440, -0.999828021810850840, -0.999828947824245140, -0.999829871338067110, +-0.999830792352314310, -0.999831710866984640, -0.999832626882075640, -0.999833540397585100, -0.999834451413510790, -0.999835359929850180, -0.999836265946601240, -0.999837169463761670, +-0.999838070481329220, -0.999838968999301470, -0.999839865017676410, -0.999840758536451600, -0.999841649555624930, -0.999842538075194190, -0.999843424095157030, -0.999844307615511350, +-0.999845188636254930, -0.999846067157385440, -0.999846943178900880, -0.999847816700798920, -0.999848687723077440, -0.999849556245734240, -0.999850422268767080, -0.999851285792173970, +-0.999852146815952580, -0.999853005340100800, -0.999853861364616510, -0.999854714889497620, -0.999855565914742010, -0.999856414440347340, -0.999857260466311740, -0.999858103992632860, +-0.999858945019308830, -0.999859783546337420, -0.999860619573716520, -0.999861453101444140, -0.999862284129518050, -0.999863112657936370, -0.999863938686696760, -0.999864762215797340, +-0.999865583245236110, -0.999866401775010850, -0.999867217805119560, -0.999868031335560240, -0.999868842366330890, -0.999869650897429410, -0.999870456928853790, -0.999871260460602040, +-0.999872061492672160, -0.999872860025062040, -0.999873656057769900, -0.999874449590793520, -0.999875240624131020, -0.999876029157780510, -0.999876815191739880, -0.999877598726007120, +-0.999878379760580470, -0.999879158295457810, -0.999879934330637270, -0.999880707866116940, -0.999881478901894830, -0.999882247437969050, -0.999883013474337610, -0.999883777010998620, +-0.999884538047950190, -0.999885296585190430, -0.999886052622717350, -0.999886806160529270, -0.999887557198624100, -0.999888305737000050, -0.999889051775655240, -0.999889795314587880, +-0.999890536353795880, -0.999891274893277670, -0.999892010933031260, -0.999892744473054760, -0.999893475513346400, -0.999894204053904390, -0.999894930094726850, -0.999895653635812010, +-0.999896374677157970, -0.999897093218763080, -0.999897809260625440, -0.999898522802743160, -0.999899233845114700, -0.999899942387738160, -0.999900648430611770, -0.999901351973733640, +-0.999902053017102220, -0.999902751560715730, -0.999903447604572280, -0.999904141148670210, -0.999904832193007740, -0.999905520737583320, -0.999906206782394950, -0.999906890327441180, +-0.999907571372720130, -0.999908249918230130, -0.999908925963969630, -0.999909599509936740, -0.999910270556129800, -0.999910939102547250, -0.999911605149187310, -0.999912268696048320, +-0.999912929743128730, -0.999913588290426870, -0.999914244337940960, -0.999914897885669450, -0.999915548933610680, -0.999916197481763080, -0.999916843530124890, -0.999917487078694660, +-0.999918128127470720, -0.999918766676451520, -0.999919402725635290, -0.999920036275020570, -0.999920667324605830, -0.999921295874389380, -0.999921921924369680, -0.999922545474545180, +-0.999923166524914420, -0.999923785075475640, -0.999924401126227380, -0.999925014677168100, -0.999925625728296350, -0.999926234279610580, -0.999926840331109120, -0.999927443882790650, +-0.999928044934653480, -0.999928643486696300, -0.999929239538917440, -0.999929833091315450, -0.999930424143888890, -0.999931012696636310, -0.999931598749556280, -0.999932182302647130, +-0.999932763355907530, -0.999933341909336030, -0.999933917962931180, -0.999934491516691560, -0.999935062570615710, -0.999935631124702300, -0.999936197178949660, -0.999936760733356580, +-0.999937321787921610, -0.999937880342643300, -0.999938436397520340, -0.999938989952551260, -0.999939541007734740, -0.999940089563069350, -0.999940635618553620, -0.999941179174186460, +-0.999941720229966300, -0.999942258785891820, -0.999942794841961690, -0.999943328398174680, -0.999943859454529240, -0.999944388011024140, -0.999944914067658170, -0.999945437624429780, +-0.999945958681337840, -0.999946477238381040, -0.999946993295558140, -0.999947506852867600, -0.999948017910308410, -0.999948526467879020, -0.999949032525578430, -0.999949536083405310, +-0.999950037141358220, -0.999950535699436150, -0.999951031757637670, -0.999951525315961650, -0.999952016374406780, -0.999952504932971830, -0.999952990991655690, -0.999953474550457130, +-0.999953955609374720, -0.999954434168407570, -0.999954910227554230, -0.999955383786813700, -0.999955854846184660, -0.999956323405665980, -0.999956789465256570, -0.999957253024955080, +-0.999957714084760530, -0.999958172644671680, -0.999958628704687440, -0.999959082264806560, -0.999959533325027960, -0.999959981885350510, -0.999960427945773220, -0.999960871506294760, +-0.999961312566914230, -0.999961751127630310, -0.999962187188441990, -0.999962620749348270, -0.999963051810348060, -0.999963480371440120, -0.999963906432623560, -0.999964329993897170, +-0.999964751055259950, -0.999965169616710890, -0.999965585678248890, -0.999965999239872950, -0.999966410301581950, -0.999966818863375020, -0.999967224925250920, -0.999967628487208880, +-0.999968029549247680, -0.999968428111366440, -0.999968824173564140, -0.999969217735839800, -0.999969608798192410, -0.999969997360620980, -0.999970383423124500, -0.999970766985702090, +-0.999971148048352850, -0.999971526611075690, -0.999971902673869710, -0.999972276236733900, -0.999972647299667510, -0.999973015862669400, -0.999973381925738810, -0.999973745488874850, +-0.999974106552076410, -0.999974465115342710, -0.999974821178672870, -0.999975174742065990, -0.999975525805521180, -0.999975874369037570, -0.999976220432614250, -0.999976563996250340, +-0.999976905059945080, -0.999977243623697550, -0.999977579687506890, -0.999977913251372310, -0.999978244315292920, -0.999978572879267950, -0.999978898943296500, -0.999979222507377810, +-0.999979543571511090, -0.999979862135695450, -0.999980178199930240, -0.999980491764214550, -0.999980802828547620, -0.999981111392928670, -0.999981417457357020, -0.999981721021831800, +-0.999982022086352230, -0.999982320650917630, -0.999982616715527240, -0.999982910280180270, -0.999983201344876060, -0.999983489909613830, -0.999983775974392920, -0.999984059539212540, +-0.999984340604071930, -0.999984619168970630, -0.999984895233907660, -0.999985168798882550, -0.999985439863894430, -0.999985708428942740, -0.999985974494026710, -0.999986238059145880, +-0.999986499124299380, -0.999986757689486640, -0.999987013754707000, -0.999987267319959790, -0.999987518385244470, -0.999987766950560350, -0.999988013015906780, -0.999988256581283210, +-0.999988497646689070, -0.999988736212123590, -0.999988972277586320, -0.999989205843076490, -0.999989436908593770, -0.999989665474137480, -0.999989891539706970, -0.999990115105301780, +-0.999990336170921260, -0.999990554736564840, -0.999990770802232090, -0.999990984367922440, -0.999991195433635350, -0.999991403999370140, -0.999991610065126600, -0.999991813630903950, +-0.999992014696701740, -0.999992213262519520, -0.999992409328356760, -0.999992602894212990, -0.999992793960087670, -0.999992982525980460, -0.999993168591890690, -0.999993352157818040, +-0.999993533223762050, -0.999993711789722180, -0.999993887855698090, -0.999994061421689230, -0.999994232487695140, -0.999994401053715620, -0.999994567119749990, -0.999994730685798030, +-0.999994891751859180, -0.999995050317933120, -0.999995206384019400, -0.999995359950117680, -0.999995511016227630, -0.999995659582348710, -0.999995805648480670, -0.999995949214623090, +-0.999996090280775740, -0.999996228846938060, -0.999996364913109840, -0.999996498479290730, -0.999996629545480410, -0.999996758111678430, -0.999996884177884570, -0.999997007744098500, +-0.999997128810319990, -0.999997247376548600, -0.999997363442784120, -0.999997477009026190, -0.999997588075274610, -0.999997696641529040, -0.999997802707789150, -0.999997906274054830, +-0.999998007340325730, -0.999998105906601650, -0.999998201972882250, -0.999998295539167410, -0.999998386605456810, -0.999998475171750220, -0.999998561238047420, -0.999998644804348300, +-0.999998725870652530, -0.999998804436959880, -0.999998880503270350, -0.999998954069583500, -0.999999025135899330, -0.999999093702217620, -0.999999159768538040, -0.999999223334860690, +-0.999999284401185240, -0.999999342967511580, -0.999999399033839610, -0.999999452600169090, -0.999999503666499920, -0.999999552232832100, -0.999999598299165290, -0.999999641865499500, +-0.999999682931834610, -0.999999721498170510, -0.999999757564507100, -0.999999791130844360, -0.999999822197182090, -0.999999850763520270, -0.999999876829858910, -0.999999900396197680, +-0.999999921462536800, -0.999999940028876160, -0.999999956095215640, -0.999999969661555240, -0.999999980727894870, -0.999999989294234610, -0.999999995360574270, -0.999999998926914050, +-0.999999999993253730, -0.999999998559593540, -0.999999994625933250, -0.999999988192273090, -0.999999979258612840, -0.999999967824952710, -0.999999953891292590, -0.999999937457632600, +-0.999999918523972850, -0.999999897090313230, -0.999999873156653950, -0.999999846722994910, -0.999999817789336220, -0.999999786355678100, -0.999999752422020440, -0.999999715988363350, +-0.999999677054707050, -0.999999635621051540, -0.999999591687396940, -0.999999545253743350, -0.999999496320091000, -0.999999444886439770, -0.999999390952790000, -0.999999334519141690, +-0.999999275585495170, -0.999999214151850340, -0.999999150218207510, -0.999999083784566810, -0.999999014850928350, -0.999998943417292450, -0.999998869483659130, -0.999998793050028700, +-0.999998714116401180, -0.999998632682777000, -0.999998548749156170, -0.999998462315538910, -0.999998373381925540, -0.999998281948316300, -0.999998188014711300, -0.999998091581110860, +-0.999997992647515100, -0.999997891213924460, -0.999997787280339060, -0.999997680846759220, -0.999997571913185170, -0.999997460479617130, -0.999997346546055540, -0.999997230112500520, +-0.999997111178952400, -0.999996989745411510, -0.999996865811878190, -0.999996739378352760, -0.999996610444835340, -0.999996479011326490, -0.999996345077826420, -0.999996208644335470, +-0.999996069710853970, -0.999995928277382370, -0.999995784343920890, -0.999995637910470080, -0.999995488977030060, -0.999995337543601260, -0.999995183610184250, -0.999995027176779240, +-0.999994868243386570, -0.999994706810006790, -0.999994542876640360, -0.999994376443287370, -0.999994207509948610, -0.999994036076624290, -0.999993862143314760, -0.999993685710020670, +-0.999993506776742370, -0.999993325343480290, -0.999993141410234990, -0.999992954977006690, -0.999992766043796060, -0.999992574610603540, -0.999992380677429570, -0.999992184244274610, +-0.999991985311139310, -0.999991783878023900, -0.999991579944929150, -0.999991373511855300, -0.999991164578803100, -0.999990953145773020, -0.999990739212765600, -0.999990522779781290, +-0.999990303846820640, -0.999990082413884210, -0.999989858480972550, -0.999989632048086330, -0.999989403115225990, -0.999989171682392210, -0.999988937749585420, -0.999988701316806280, +-0.999988462384055480, -0.999988220951333440, -0.999987977018640840, -0.999987730585978340, -0.999987481653346500, -0.999987230220745980, -0.999986976288177340, -0.999986719855641360, +-0.999986460923138480, -0.999986199490669470, -0.999985935558234900, -0.999985669125835640, -0.999985400193472040, -0.999985128761145090, -0.999984854828855240, -0.999984578396603260, +-0.999984299464389830, -0.999984018032215700, -0.999983734100081460, -0.999983447667987970, -0.999983158735935800, -0.999982867303925720, -0.999982573371958510, -0.999982276940034830, +-0.999981978008155470, -0.999981676576321200, -0.999981372644532680, -0.999981066212790700, -0.999980757281096140, -0.999980445849449670, -0.999980131917852070, -0.999979815486304210, +-0.999979496554806670, -0.999979175123360540, -0.999978851191966390, -0.999978524760625100, -0.999978195829337560, -0.999977864398104430, -0.999977530466926720, -0.999977194035805210, +-0.999976855104740660, -0.999976513673733970, -0.999976169742786030, -0.999975823311897600, -0.999975474381069710, -0.999975122950303110, -0.999974769019598700, -0.999974412588957250, +-0.999974053658379880, -0.999973692227867360, -0.999973328297420690, -0.999972961867040540, -0.999972592936728130, -0.999972221506484130, -0.999971847576309640, -0.999971471146205550, +-0.999971092216172750, -0.999970710786212250, -0.999970326856324920, -0.999969940426511770, -0.999969551496773800, -0.999969160067111900, -0.999968766137527170, -0.999968369708020500, +-0.999967970778592900, -0.999967569349245360, -0.999967165419978990, -0.999966758990794570, -0.999966350061693320, -0.999965938632676240, -0.999965524703744220, -0.999965108274898480, +-0.999964689346139910, -0.999964267917469620, -0.999963843988888710, -0.999963417560398080, -0.999962988631999060, -0.999962557203692430, -0.999962123275479510, -0.999961686847361200, +-0.999961247919338710, -0.999960806491413170, -0.999960362563585560, -0.999959916135857000, -0.999959467208228700, -0.999959015780701680, -0.999958561853277140, -0.999958105425956200, +-0.999957646498740080, -0.999957185071629780, -0.999956721144626530, -0.999956254717731420, -0.999955785790945680, -0.999955314364270540, -0.999954840437707100, -0.999954364011256480, +-0.999953885084920000, -0.999953403658698890, -0.999952919732594150, -0.999952433306607210, -0.999951944380739090, -0.999951452954991220, -0.999950959029364590, -0.999950462603860670, +-0.999949963678480550, -0.999949462253225560, -0.999948958328096830, -0.999948451903095780, -0.999947942978223540, -0.999947431553481540, -0.999946917628870890, -0.999946401204392930, +-0.999945882280048990, -0.999945360855840400, -0.999944836931768390, -0.999944310507834170, -0.999943781584039290, -0.999943250160384990, -0.999942716236872480, -0.999942179813503200, +-0.999941640890278480, -0.999941099467199670, -0.999940555544268080, -0.999940009121485060, -0.999939460198852050, -0.999938908776370480, -0.999938354854041590, -0.999937798431866810, +-0.999937239509847480, -0.999936678087985030, -0.999936114166281030, -0.999935547744736590, -0.999934978823353360, -0.999934407402132690, -0.999933833481076010, -0.999933257060184770, +-0.999932678139460300, -0.999932096718904150, -0.999931512798517770, -0.999930926378302610, -0.999930337458260210, -0.999929746038391910, -0.999929152118699260, -0.999928555699183710, +-0.999927956779846800, -0.999927355360689880, -0.999926751441714720, -0.999926145022922650, -0.999925536104315120, -0.999924924685893890, -0.999924310767660310, -0.999923694349615920, +-0.999923075431762290, -0.999922454014100960, -0.999921830096633490, -0.999921203679361550, -0.999920574762286460, -0.999919943345410010, -0.999919309428733750, -0.999918673012259120, +-0.999918034095987780, -0.999917392679921520, -0.999916748764061670, -0.999916102348409890, -0.999915453432967950, -0.999914802017737410, -0.999914148102719720, -0.999913491687916770, +-0.999912832773330100, -0.999912171358961270, -0.999911507444812050, -0.999910841030884120, -0.999910172117179030, -0.999909500703698550, -0.999908826790444240, -0.999908150377417980, +-0.999907471464621220, -0.999906790052055850, -0.999906106139723530, -0.999905419727625810, -0.999904730815764700, -0.999904039404141740, -0.999903345492758610, -0.999902649081617190, +-0.999901950170719030, -0.999901248760066140, -0.999900544849660070, -0.999899838439502590, -0.999899129529595590, -0.999898418119940740, -0.999897704210539810, -0.999896987801394690, +-0.999896268892507050, -0.999895547483878660, -0.999894823575511520, -0.999894097167407290, -0.999893368259567870, -0.999892636851994920, -0.999891902944690440, -0.999891166537656200, +-0.999890427630894090, -0.999889686224405880, -0.999888942318193360, -0.999888195912258640, -0.999887447006603370, -0.999886695601229450, -0.999885941696138760, -0.999885185291333300, +-0.999884426386814850, -0.999883664982585300, -0.999882901078646640, -0.999882134675000640, -0.999881365771649430, -0.999880594368594780, -0.999879820465838560, -0.999879044063382790, +-0.999878265161229460, -0.999877483759380570, -0.999876699857837780, -0.999875913456603320, -0.999875124555679170, -0.999874333155067130, -0.999873539254769180, -0.999872742854787440, +-0.999871943955123910, -0.999871142555780470, -0.999870338656759120, -0.999869532258061970, -0.999868723359691010, -0.999867911961648260, -0.999867098063935700, -0.999866281666555450, +-0.999865462769509380, -0.999864641372799730, -0.999863817476428500, -0.999862991080397670, -0.999862162184709360, -0.999861330789365680, -0.999860496894368620, -0.999859660499720420, +-0.999858821605422940, -0.999857980211478540, -0.999857136317889080, -0.999856289924656800, -0.999855441031783810, -0.999854589639272210, -0.999853735747124220, -0.999852879355341840, +-0.999852020463927180, -0.999851159072882580, -0.999850295182210020, -0.999849428791911740, -0.999848559901989840, -0.999847688512446650, -0.999846814623284170, -0.999845938234504630, +-0.999845059346110340, -0.999844177958103320, -0.999843294070485890, -0.999842407683260160, -0.999841518796428460, -0.999840627409993020, -0.999839733523955940, -0.999838837138319560, +-0.999837938253086090, -0.999837036868257760, -0.999836132983836780, -0.999835226599825600, -0.999834317716226220, -0.999833406333041070, -0.999832492450272500, -0.999831576067922610, +-0.999830657185993840, -0.999829735804488420, -0.999828811923408560, -0.999827885542756810, -0.999826956662535290, -0.999826025282746330, -0.999825091403392370, -0.999824155024475640, +-0.999823216145998560, -0.999822274767963480, -0.999821330890372620, -0.999820384513228520, -0.999819435636533420, -0.999818484260289630, -0.999817530384499720, -0.999816574009166010, +-0.999815615134290850, -0.999814653759876660, -0.999813689885925780, -0.999812723512440770, -0.999811754639423840, -0.999810783266877670, -0.999809809394804460, -0.999808833023206670, +-0.999807854152086840, -0.999806872781447420, -0.999805888911290740, -0.999804902541619470, -0.999803913672435820, -0.999802922303742460, -0.999801928435541720, -0.999800932067836160, +-0.999799933200628320, -0.999798931833920660, -0.999797927967715610, -0.999796921602015830, -0.999795912736823670, -0.999794901372141780, -0.999793887507972600, -0.999792871144318700, +-0.999791852281182610, -0.999790830918566910, -0.999789807056474130, -0.999788780694906840, -0.999787751833867590, -0.999786720473359040, -0.999785686613383630, -0.999784650253943920, +-0.999783611395042680, -0.999782570036682360, -0.999781526178865730, -0.999780479821595120, -0.999779430964873430, -0.999778379608703190, -0.999777325753086870, -0.999776269398027330, +-0.999775210543527030, -0.999774149189588850, -0.999773085336215120, -0.999772018983408840, -0.999770950131172450, -0.999769878779508630, -0.999768804928420130, -0.999767728577909740, +-0.999766649727979910, -0.999765568378633510, -0.999764484529873100, -0.999763398181701570, -0.999762309334121470, -0.999761217987135690, -0.999760124140746780, -0.999759027794957620, +-0.999757928949770890, -0.999756827605189360, -0.999755723761215690, -0.999754617417852760, -0.999753508575103260, -0.999752397232969940, -0.999751283391455690, -0.999750167050563300, +-0.999749048210295420, -0.999747926870654830, -0.999746803031644540, -0.999745676693267190, -0.999744547855525690, -0.999743416518422800, -0.999742282681961410, -0.999741146346144300, +-0.999740007510974250, -0.999738866176454240, -0.999737722342587070, -0.999736576009375600, -0.999735427176822730, -0.999734275844931240, -0.999733122013704010, -0.999731965683144040, +-0.999730806853254110, -0.999729645524037200, -0.999728481695496220, -0.999727315367633930, -0.999726146540453440, -0.999724975213957530, -0.999723801388149200, -0.999722625063031440, +-0.999721446238607040, -0.999720264914878980, -0.999719081091850370, -0.999717894769524000, -0.999716705947902850, -0.999715514626990040, -0.999714320806788350, -0.999713124487300870, +-0.999711925668530620, -0.999710724350480580, -0.999709520533153650, -0.999708314216552930, -0.999707105400681530, -0.999705894085542220, -0.999704680271138240, -0.999703463957472670, +-0.999702245144548310, -0.999701023832368360, -0.999699800020935840, -0.999698573710253830, -0.999697344900325360, -0.999696113591153620, -0.999694879782741520, -0.999693643475092260, +-0.999692404668208860, -0.999691163362094400, -0.999689919556752130, -0.999688673252185020, -0.999687424448396200, -0.999686173145388880, -0.999684919343166060, -0.999683663041731060, +-0.999682404241086790, -0.999681142941236560, -0.999679879142183370, -0.999678612843930670, -0.999677344046481230, -0.999676072749838610, -0.999674798954005680, -0.999673522658985790, +-0.999672243864782150, -0.999670962571397870, -0.999669678778836170, -0.999668392487100270, -0.999667103696193380, -0.999665812406118850, -0.999664518616879660, -0.999663222328479150, +-0.999661923540920650, -0.999660622254207380, -0.999659318468342440, -0.999658012183329280, -0.999656703399171120, -0.999655392115871180, -0.999654078333432670, -0.999652762051859050, +-0.999651443271153520, -0.999650121991319420, -0.999648798212359970, -0.999647471934278500, -0.999646143157078340, -0.999644811880762930, -0.999643478105335380, -0.999642141830799140, +-0.999640803057157630, -0.999639461784414100, -0.999638118012571850, -0.999636771741634340, -0.999635422971604900, -0.999634071702486860, -0.999632717934283650, -0.999631361666998730, +-0.999630002900635310, -0.999628641635196940, -0.999627277870686950, -0.999625911607108790, -0.999624542844465780, -0.999623171582761480, -0.999621797821999230, -0.999620421562182560, +-0.999619042803314710, -0.999617661545399330, -0.999616277788439760, -0.999614891532439540, -0.999613502777402020, -0.999612111523330850, -0.999610717770229360, -0.999609321518101000, +-0.999607922766949430, -0.999606521516777980, -0.999605117767590310, -0.999603711519389760, -0.999602302772179980, -0.999600891525964430, -0.999599477780746650, -0.999598061536530190, +-0.999596642793318610, -0.999595221551115350, -0.999593797809924080, -0.999592371569748340, -0.999590942830591580, -0.999589511592457570, -0.999588077855349750, -0.999586641619271690, +-0.999585202884227030, -0.999583761650219450, -0.999582317917252380, -0.999580871685329500, -0.999579422954454460, -0.999577971724630920, -0.999576517995862450, -0.999575061768152580, +-0.999573603041505110, -0.999572141815923690, -0.999570678091411870, -0.999569211867973430, -0.999567743145611810, -0.999566271924330900, -0.999564798204134350, -0.999563321985025840, +-0.999561843267008920, -0.999560362050087470, -0.999558878334265040, -0.999557392119545530, -0.999555903405932370, -0.999554412193429550, -0.999552918482040750, -0.999551422271769630, +-0.999549923562619960, -0.999548422354595400, -0.999546918647699840, -0.999545412441936950, -0.999543903737310610, -0.999542392533824490, -0.999540878831482350, -0.999539362630287980, +-0.999537843930245250, -0.999536322731357950, -0.999534799033629740, -0.999533272837064610, -0.999531744141666230, -0.999530212947438600, -0.999528679254385380, -0.999527143062510450, +-0.999525604371817700, -0.999524063182310910, -0.999522519493993960, -0.999520973306870730, -0.999519424620945010, -0.999517873436220780, -0.999516319752701940, -0.999514763570392150, +-0.999513204889295510, -0.999511643709415920, -0.999510080030757140, -0.999508513853323290, -0.999506945177118020, -0.999505374002145450, -0.999503800328409350, -0.999502224155913830, +-0.999500645484662780, -0.999499064314660070, -0.999497480645909710, -0.999495894478415690, -0.999494305812181900, -0.999492714647212340, -0.999491120983511010, -0.999489524821081890, +-0.999487926159928870, -0.999486325000056080, -0.999484721341467490, -0.999483115184167100, -0.999481506528158930, -0.999479895373447060, -0.999478281720035390, -0.999476665567927910, +-0.999475046917128850, -0.999473425767642200, -0.999471802119472060, -0.999470175972622330, -0.999468547327097110, -0.999466916182900620, -0.999465282540036750, -0.999463646398509710, +-0.999462007758323610, -0.999460366619482340, -0.999458722981990340, -0.999457076845851390, -0.999455428211069810, -0.999453777077649710, -0.999452123445595090, -0.999450467314910160, +-0.999448808685599150, -0.999447147557666060, -0.999445483931115100, -0.999443817805950370, -0.999442149182176220, -0.999440478059796520, -0.999438804438815830, -0.999437128319238030, +-0.999435449701067350, -0.999433768584308100, -0.999432084968964520, -0.999430398855040590, -0.999428710242540760, -0.999427019131469140, -0.999425325521829940, -0.999423629413627390, +-0.999421930806865810, -0.999420229701549420, -0.999418526097682450, -0.999416819995269210, -0.999415111394313830, -0.999413400294820730, -0.999411686696794140, -0.999409970600238280, +-0.999408252005157480, -0.999406530911556180, -0.999404807319438370, -0.999403081228808720, -0.999401352639671230, -0.999399621552030440, -0.999397887965890570, -0.999396151881255970, +-0.999394413298131060, -0.999392672216520060, -0.999390928636427310, -0.999389182557857360, -0.999387433980814420, -0.999385682905302830, -0.999383929331327030, -0.999382173258891560, +-0.999380414688000540, -0.999378653618658410, -0.999376890050869830, -0.999375123984638900, -0.999373355419970190, -0.999371584356868130, -0.999369810795337040, -0.999368034735381380, +-0.999366256177005810, -0.999364475120214420, -0.999362691565012010, -0.999360905511402780, -0.999359116959391280, -0.999357325908981960, -0.999355532360179380, -0.999353736312987960, +-0.999351937767412160, -0.999350136723456520, -0.999348333181125590, -0.999346527140423820, -0.999344718601355760, -0.999342907563925850, -0.999341094028138640, -0.999339277993998800, +-0.999337459461510650, -0.999335638430678960, -0.999333814901508080, -0.999331988874002760, -0.999330160348167350, -0.999328329324006610, -0.999326495801525110, -0.999324659780727260, +-0.999322821261617760, -0.999320980244201240, -0.999319136728482270, -0.999317290714465510, -0.999315442202155510, -0.999313591191556830, -0.999311737682674230, -0.999309881675512270, +-0.999308023170075610, -0.999306162166368920, -0.999304298664396850, -0.999302432664163960, -0.999300564165675030, -0.999298693168934600, -0.999296819673947570, -0.999294943680718360, +-0.999293065189251870, -0.999291184199552760, -0.999289300711625690, -0.999287414725475220, -0.999285526241106340, -0.999283635258523590, -0.999281741777731880, -0.999279845798735630, +-0.999277947321539850, -0.999276046346149190, -0.999274142872568440, -0.999272236900802360, -0.999270328430855610, -0.999268417462733090, -0.999266503996439570, -0.999264588031979710, +-0.999262669569358390, -0.999260748608580500, -0.999258825149650590, -0.999256899192573660, -0.999254970737354590, -0.999253039783997930, -0.999251106332508800, -0.999249170382891850, +-0.999247231935151970, -0.999245290989294040, -0.999243347545322850, -0.999241401603243260, -0.999239453163060290, -0.999237502224778580, -0.999235548788403150, -0.999233592853938870, +-0.999231634421390510, -0.999229673490763190, -0.999227710062061570, -0.999225744135290750, -0.999223775710455510, -0.999221804787560950, -0.999219831366611740, -0.999217855447613100, +-0.999215877030569690, -0.999213896115486610, -0.999211912702368870, -0.999209926791221340, -0.999207938382048910, -0.999205947474856690, -0.999203954069649570, -0.999201958166432540, +-0.999199959765210700, -0.999197958865988940, -0.999195955468772270, -0.999193949573565670, -0.999191941180374240, -0.999189930289202890, -0.999187916900056820, -0.999185901012940910, +-0.999183882627860290, -0.999181861744819930, -0.999179838363824850, -0.999177812484880250, -0.999175784107991130, -0.999173753233162490, -0.999171719860399540, -0.999169683989707180, +-0.999167645621090730, -0.999165604754555070, -0.999163561390105540, -0.999161515527747010, -0.999159467167484610, -0.999157416309323640, -0.999155362953269120, -0.999153307099326260, +-0.999151248747500050, -0.999149187897795720, -0.999147124550218370, -0.999145058704773330, -0.999142990361465590, -0.999140919520300370, -0.999138846181282900, -0.999136770344418170, +-0.999134692009711610, -0.999132611177168340, -0.999130527846793570, -0.999128442018592410, -0.999126353692570190, -0.999124262868732020, -0.999122169547083330, -0.999120073727629120, +-0.999117975410374730, -0.999115874595325360, -0.999113771282486350, -0.999111665471862920, -0.999109557163460280, -0.999107446357283880, -0.999105333053338710, -0.999103217251630320, +-0.999101098952163810, -0.999098978154944530, -0.999096854859977900, -0.999094729067269150, -0.999092600776823490, -0.999090469988646370, -0.999088336702743000, -0.999086200919118930, +-0.999084062637779270, -0.999081921858729460, -0.999079778581974830, -0.999077632807520710, -0.999075484535372650, -0.999073333765535750, -0.999071180498015580, -0.999069024732817450, +-0.999066866469946690, -0.999064705709408860, -0.999062542451209290, -0.999060376695353300, -0.999058208441846340, -0.999056037690693950, -0.999053864441901360, -0.999051688695474120, +-0.999049510451417770, -0.999047329709737530, -0.999045146470439070, -0.999042960733527610, -0.999040772499008910, -0.999038581766888200, -0.999036388537171030, -0.999034192809862830, +-0.999031994584969270, -0.999029793862495570, -0.999027590642447500, -0.999025384924830510, -0.999023176709649910, -0.999020965996911480, -0.999018752786620560, -0.999016537078782800, +-0.999014318873403750, -0.999012098170488750, -0.999009874970043680, -0.999007649272073750, -0.999005421076584850, -0.999003190383582320, -0.999000957193071800, -0.998998721505058970, +-0.998996483319549270, -0.998994242636548350, -0.998991999456061870, -0.998989753778095400, -0.998987505602654480, -0.998985254929744880, -0.998983001759372050, -0.998980746091541860, +-0.998978487926259650, -0.998976227263531300, -0.998973964103362370, -0.998971698445758500, -0.998969430290725380, -0.998967159638268760, -0.998964886488394210, -0.998962610841107380, +-0.998960332696414150, -0.998958052054319980, -0.998955768914830730, -0.998953483277951970, -0.998951195143689570, -0.998948904512049210, -0.998946611383036640, -0.998944315756657430, +-0.998942017632917460, -0.998939717011822490, -0.998937413893378200, -0.998935108277590360, -0.998932800164464730, -0.998930489554007090, -0.998928176446223340, -0.998925860841119010, +-0.998923542738700100, -0.998921222138972280, -0.998918899041941530, -0.998916573447613420, -0.998914245355993930, -0.998911914767088850, -0.998909581680903940, -0.998907246097445080, +-0.998904908016718050, -0.998902567438728850, -0.998900224363483140, -0.998897878790986900, -0.998895530721246040, -0.998893180154266200, -0.998890827090053500, -0.998888471528613820, +-0.998886113469952820, -0.998883752914076610, -0.998881389860991060, -0.998879024310701970, -0.998876656263215310, -0.998874285718536980, -0.998871912676672970, -0.998869537137629270, +-0.998867159101411660, -0.998864778568026130, -0.998862395537478690, -0.998860010009775200, -0.998857621984921670, -0.998855231462924210, -0.998852838443788580, -0.998850442927520900, +-0.998848044914127040, -0.998845644403613120, -0.998843241395985130, -0.998840835891248950, -0.998838427889410800, -0.998836017390476450, -0.998833604394452120, -0.998831188901343810, +-0.998828770911157520, -0.998826350423899220, -0.998823927439575040, -0.998821501958191190, -0.998819073979753450, -0.998816643504268130, -0.998814210531741130, -0.998811775062178550, +-0.998809337095586610, -0.998806896631971310, -0.998804453671338850, -0.998802008213695140, -0.998799560259046480, -0.998797109807398890, -0.998794656858758460, -0.998792201413131520, +-0.998789743470523960, -0.998787283030942110, -0.998784820094392070, -0.998782354660879950, -0.998779886730411960, -0.998777416302994210, -0.998774943378632930, -0.998772467957334320, +-0.998769990039104600, -0.998767509623949780, -0.998765026711876280, -0.998762541302890110, -0.998760053396997690, -0.998757562994205150, -0.998755070094518580, -0.998752574697944430, +-0.998750076804488800, -0.998747576414158010, -0.998745073526958290, -0.998742568142895860, -0.998740060261977040, -0.998737549884208040, -0.998735037009595210, -0.998732521638144740, +-0.998730003769862980, -0.998727483404756140, -0.998724960542830660, -0.998722435184092760, -0.998719907328548870, -0.998717376976205110, -0.998714844127067900, -0.998712308781143590, +-0.998709770938438600, -0.998707230598959050, -0.998704687762711480, -0.998702142429702230, -0.998699594599937620, -0.998697044273423980, -0.998694491450167750, -0.998691936130175260, +-0.998689378313452950, -0.998686818000007250, -0.998684255189844490, -0.998681689882971010, -0.998679122079393360, -0.998676551779117960, -0.998673978982151040, -0.998671403688499270, +-0.998668825898168970, -0.998666245611166680, -0.998663662827498740, -0.998661077547171590, -0.998658489770191780, -0.998655899496565750, -0.998653306726299930, -0.998650711459400870, +-0.998648113695875030, -0.998645513435728940, -0.998642910678969040, -0.998640305425601780, -0.998637697675633930, -0.998635087429071700, -0.998632474685921760, -0.998629859446190760, +-0.998627241709884930, -0.998624621477011140, -0.998621998747575730, -0.998619373521585360, -0.998616745799046470, -0.998614115579965820, -0.998611482864349860, -0.998608847652205140, +-0.998606209943538330, -0.998603569738356070, -0.998600927036664810, -0.998598281838471210, -0.998595634143781940, -0.998592983952603650, -0.998590331264942790, -0.998587676080806120, +-0.998585018400200310, -0.998582358223131910, -0.998579695549607680, -0.998577030379634190, -0.998574362713218090, -0.998571692550366040, -0.998569019891084820, -0.998566344735381080, +-0.998563667083261500, -0.998560986934732610, -0.998558304289801410, -0.998555619148474350, -0.998552931510758300, -0.998550241376659820, -0.998547548746185900, -0.998544853619342980, +-0.998542155996137940, -0.998539455876577550, -0.998536753260668600, -0.998534048148417620, -0.998531340539831610, -0.998528630434917130, -0.998525917833681160, -0.998523202736130490, +-0.998520485142271650, -0.998517765052111650, -0.998515042465657250, -0.998512317382915350, -0.998509589803892480, -0.998506859728595760, -0.998504127157031850, -0.998501392089207630, +-0.998498654525129870, -0.998495914464805570, -0.998493171908241380, -0.998490426855444310, -0.998487679306421240, -0.998484929261178930, -0.998482176719724280, -0.998479421682064160, +-0.998476664148205460, -0.998473904118155180, -0.998471141591920070, -0.998468376569507270, -0.998465609050923300, -0.998462839036175500, -0.998460066525270530, -0.998457291518215380, +-0.998454514015016950, -0.998451734015682320, -0.998448951520218290, -0.998446166528631940, -0.998443379040930170, -0.998440589057119960, -0.998437796577208210, -0.998435001601202020, +-0.998432204129108380, -0.998429404160934180, -0.998426601696686400, -0.998423796736372160, -0.998420989279998450, -0.998418179327572260, -0.998415366879100710, -0.998412551934590550, +-0.998409734494049130, -0.998406914557483430, -0.998404092124900330, -0.998401267196307060, -0.998398439771710610, -0.998395609851118080, -0.998392777434536470, -0.998389942521973000, +-0.998387105113434650, -0.998384265208928530, -0.998381422808461650, -0.998378577912041320, -0.998375730519674540, -0.998372880631368420, -0.998370028247130060, -0.998367173366966680, +-0.998364315990885380, -0.998361456118893260, -0.998358593750997450, -0.998355728887205250, -0.998352861527523670, -0.998349991671960040, -0.998347119320521340, -0.998344244473214790, +-0.998341367130047730, -0.998338487291027140, -0.998335604956160470, -0.998332720125454710, -0.998329832798917180, -0.998326942976555000, -0.998324050658375480, -0.998321155844385970, +-0.998318258534593440, -0.998315358729005230, -0.998312456427628780, -0.998309551630471080, -0.998306644337539460, -0.998303734548841360, -0.998300822264383770, -0.998297907484174240, +-0.998294990208219880, -0.998292070436528120, -0.998289148169106080, -0.998286223405961290, -0.998283296147100870, -0.998280366392532150, -0.998277434142262670, -0.998274499396299530, +-0.998271562154650070, -0.998268622417321730, -0.998265680184321940, -0.998262735455657910, -0.998259788231336990, -0.998256838511366600, -0.998253886295754180, -0.998250931584506950, +-0.998247974377632460, -0.998245014675138040, -0.998242052477031020, -0.998239087783318930, -0.998236120594009120, -0.998233150909108910, -0.998230178728625960, -0.998227204052567480, +-0.998224226880941030, -0.998221247213754050, -0.998218265051013850, -0.998215280392728000, -0.998212293238904040, -0.998209303589549290, -0.998206311444671310, -0.998203316804277540, +-0.998200319668375410, -0.998197320036972590, -0.998194317910076400, -0.998191313287694500, -0.998188306169834230, -0.998185296556503230, -0.998182284447708960, -0.998179269843458950, +-0.998176252743760870, -0.998173233148622050, -0.998170211058050260, -0.998167186472052830, -0.998164159390637520, -0.998161129813811780, -0.998158097741583260, -0.998155063173959410, +-0.998152026110948000, -0.998148986552556460, -0.998145944498792460, -0.998142899949663540, -0.998139852905177480, -0.998136803365341720, -0.998133751330164020, -0.998130696799651830, +-0.998127639773813020, -0.998124580252655050, -0.998121518236185670, -0.998118453724412440, -0.998115386717343120, -0.998112317214985280, -0.998109245217346670, -0.998106170724434970, +-0.998103093736257830, -0.998100014252822910, -0.998096932274137980, -0.998093847800210820, -0.998090760831048970, -0.998087671366660210, -0.998084579407052200, -0.998081484952232810, +-0.998078388002209720, -0.998075288556990680, -0.998072186616583370, -0.998069082180995660, -0.998065975250235220, -0.998062865824309810, -0.998059753903227210, -0.998056639486995300, +-0.998053522575621740, -0.998050403169114420, -0.998047281267481100, -0.998044156870729450, -0.998041029978867570, -0.998037900591903000, -0.998034768709843760, -0.998031634332697480, +-0.998028497460472290, -0.998025358093175720, -0.998022216230815770, -0.998019071873400330, -0.998015925020937170, -0.998012775673434270, -0.998009623830899420, -0.998006469493340380, +-0.998003312660765250, -0.998000153333181930, -0.997996991510598060, -0.997993827193021880, -0.997990660380461030, -0.997987491072923500, -0.997984319270417310, -0.997981144972950320, +-0.997977968180530420, -0.997974788893165600, -0.997971607110863860, -0.997968422833633070, -0.997965236061481240, -0.997962046794416360, -0.997958855032446300, -0.997955660775579180, +-0.997952464023822760, -0.997949264777185260, -0.997946063035674680, -0.997942858799298890, -0.997939652068065900, -0.997936442841983800, -0.997933231121060690, -0.997930016905304360, +-0.997926800194723020, -0.997923580989324770, -0.997920359289117490, -0.997917135094109290, -0.997913908404308380, -0.997910679219722540, -0.997907447540360090, -0.997904213366229030, +-0.997900976697337460, -0.997897737533693370, -0.997894495875304990, -0.997891251722180290, -0.997888005074327510, -0.997884755931754740, -0.997881504294470090, -0.997878250162481660, +-0.997874993535797670, -0.997871734414426110, -0.997868472798375210, -0.997865208687653160, -0.997861942082268080, -0.997858672982228190, -0.997855401387541590, -0.997852127298216480, +-0.997848850714260990, -0.997845571635683440, -0.997842290062491920, -0.997839005994694770, -0.997835719432299980, -0.997832430375315990, -0.997829138823750910, -0.997825844777612940, +-0.997822548236910410, -0.997819249201651440, -0.997815947671844450, -0.997812643647497440, -0.997809337128618970, -0.997806028115217130, -0.997802716607300130, -0.997799402604876430, +-0.997796086107954230, -0.997792767116541750, -0.997789445630647310, -0.997786121650279360, -0.997782795175446100, -0.997779466206155760, -0.997776134742416890, -0.997772800784237580, +-0.997769464331626280, -0.997766125384591420, -0.997762783943141110, -0.997759440007283890, -0.997756093577028100, -0.997752744652382060, -0.997749393233354210, -0.997746039319952760, +-0.997742682912186260, -0.997739324010063160, -0.997735962613591650, -0.997732598722780200, -0.997729232337637330, -0.997725863458171380, -0.997722492084390680, -0.997719118216303770, +-0.997715741853919200, -0.997712362997245080, -0.997708981646290180, -0.997705597801062830, -0.997702211461571450, -0.997698822627824500, -0.997695431299830630, -0.997692037477598050, +-0.997688641161135430, -0.997685242350451200, -0.997681841045553910, -0.997678437246451890, -0.997675030953153910, -0.997671622165668290, -0.997668210884003590, -0.997664797108168470, +-0.997661380838171240, -0.997657962074020580, -0.997654540815725130, -0.997651117063293240, -0.997647690816733550, -0.997644262076054610, -0.997640830841264980, -0.997637397112373430, +-0.997633960889388270, -0.997630522172318180, -0.997627080961171920, -0.997623637255957820, -0.997620191056684760, -0.997616742363361060, -0.997613291175995620, -0.997609837494596970, +-0.997606381319173670, -0.997602922649734380, -0.997599461486287860, -0.997595997828842670, -0.997592531677407470, -0.997589063031991020, -0.997585591892601760, -0.997582118259248580, +-0.997578642131940140, -0.997575163510685090, -0.997571682395492100, -0.997568198786369930, -0.997564712683327360, -0.997561224086372820, -0.997557732995515310, -0.997554239410763490, +-0.997550743332126120, -0.997547244759611760, -0.997543743693229400, -0.997540240132987590, -0.997536734078895200, -0.997533225530961020, -0.997529714489193810, -0.997526200953602230, +-0.997522684924195160, -0.997519166400981370, -0.997515645383969750, -0.997512121873168960, -0.997508595868587870, -0.997505067370235250, -0.997501536378120000, -0.997498002892250880, +-0.997494466912636770, -0.997490928439286550, -0.997487387472209000, -0.997483844011412880, -0.997480298056907190, -0.997476749608700810, -0.997473198666802510, -0.997469645231221280, +-0.997466089301965900, -0.997462530879045240, -0.997458969962468300, -0.997455406552243960, -0.997451840648381110, -0.997448272250888610, -0.997444701359775480, -0.997441127975050470, +-0.997437552096722800, -0.997433973724801140, -0.997430392859294580, -0.997426809500212120, -0.997423223647562530, -0.997419635301354910, -0.997416044461598260, -0.997412451128301460, +-0.997408855301473500, -0.997405256981123370, -0.997401656167260180, -0.997398052859892800, -0.997394447059030350, -0.997390838764681710, -0.997387227976856080, -0.997383614695562250, +-0.997379998920809420, -0.997376380652606590, -0.997372759890962860, -0.997369136635887220, -0.997365510887388780, -0.997361882645476430, -0.997358251910159480, -0.997354618681446920, +-0.997350982959347760, -0.997347344743871100, -0.997343704035026150, -0.997340060832821900, -0.997336415137267560, -0.997332766948372140, -0.997329116266144730, -0.997325463090594670, +-0.997321807421730820, -0.997318149259562530, -0.997314488604098880, -0.997310825455348990, -0.997307159813321960, -0.997303491678027120, -0.997299821049473570, -0.997296147927670410, +-0.997292472312626970, -0.997288794204352240, -0.997285113602855540, -0.997281430508146110, -0.997277744920233020, -0.997274056839125620, -0.997270366264833120, -0.997266673197364620, +-0.997262977636729550, -0.997259279582936920, -0.997255579035996150, -0.997251875995916470, -0.997248170462707080, -0.997244462436377210, -0.997240751916936170, -0.997237038904393300, +-0.997233323398757920, -0.997229605400039130, -0.997225884908246260, -0.997222161923388750, -0.997218436445475920, -0.997214708474516880, -0.997210978010521170, -0.997207245053497890, +-0.997203509603456610, -0.997199771660406520, -0.997196031224356960, -0.997192288295317360, -0.997188542873297060, -0.997184794958305360, -0.997181044550351730, -0.997177291649445350, +-0.997173536255595900, -0.997169778368812600, -0.997166017989104760, -0.997162255116481930, -0.997158489750953450, -0.997154721892528740, -0.997150951541217250, -0.997147178697028400, +-0.997143403359971540, -0.997139625530056200, -0.997135845207291820, -0.997132062391687720, -0.997128277083253580, -0.997124489281998700, -0.997120698987932650, -0.997116906201064860, +-0.997113110921404750, -0.997109313148961900, -0.997105512883745710, -0.997101710125765760, -0.997097904875031580, -0.997094097131552610, -0.997090286895338410, -0.997086474166398510, +-0.997082658944742350, -0.997078841230379600, -0.997075021023319690, -0.997071198323572270, -0.997067373131146910, -0.997063545446053020, -0.997059715268300280, -0.997055882597898350, +-0.997052047434856650, -0.997048209779184850, -0.997044369630892490, -0.997040526989989240, -0.997036681856484640, -0.997032834230388350, -0.997028984111709930, -0.997025131500459130, +-0.997021276396645510, -0.997017418800278610, -0.997013558711368210, -0.997009696129923960, -0.997005831055955420, -0.997001963489472340, -0.996998093430484290, -0.996994220879001030, +-0.996990345835032210, -0.996986468298587500, -0.996982588269676670, -0.996978705748309380, -0.996974820734495280, -0.996970933228244150, -0.996967043229565750, -0.996963150738469640, +-0.996959255754965800, -0.996955358279063670, -0.996951458310773140, -0.996947555850104080, -0.996943650897066050, -0.996939743451668910, -0.996935833513922450, -0.996931921083836330, +-0.996928006161420520, -0.996924088746684590, -0.996920168839638520, -0.996916246440291980, -0.996912321548654830, -0.996908394164736870, -0.996904464288547840, -0.996900531920097750, +-0.996896597059396370, -0.996892659706453470, -0.996888719861278920, -0.996884777523882490, -0.996880832694274190, -0.996876885372463770, -0.996872935558461130, -0.996868983252276240, +-0.996865028453918780, -0.996861071163398840, -0.996857111380726190, -0.996853149105910830, -0.996849184338962520, -0.996845217079891270, -0.996841247328706940, -0.996837275085419530, +-0.996833300350038920, -0.996829323122575000, -0.996825343403037860, -0.996821361191437380, -0.996817376487783460, -0.996813389292086070, -0.996809399604355220, -0.996805407424600890, +-0.996801412752832960, -0.996797415589061650, -0.996793415933296730, -0.996789413785548200, -0.996785409145826250, -0.996781402014140670, -0.996777392390501670, -0.996773380274919130, +-0.996769365667403260, -0.996765348567963840, -0.996761328976611070, -0.996757306893355070, -0.996753282318205700, -0.996749255251173190, -0.996745225692267530, -0.996741193641498710, +-0.996737159098877060, -0.996733122064412450, -0.996729082538114990, -0.996725040519994890, -0.996720996010062140, -0.996716949008326970, -0.996712899514799360, -0.996708847529489520, +-0.996704793052407560, -0.996700736083563580, -0.996696676622967790, -0.996692614670630310, -0.996688550226561330, -0.996684483290770970, -0.996680413863269330, -0.996676341944066730, +-0.996672267533173280, -0.996668190630599080, -0.996664111236354460, -0.996660029350449620, -0.996655944972894670, -0.996651858103699830, -0.996647768742875310, -0.996643676890431430, +-0.996639582546378300, -0.996635485710726240, -0.996631386383485470, -0.996627284564666320, -0.996623180254278870, -0.996619073452333470, -0.996614964158840430, -0.996610852373809860, +-0.996606738097252310, -0.996602621329177870, -0.996598502069596880, -0.996594380318519550, -0.996590256075956420, -0.996586129341917480, -0.996582000116413290, -0.996577868399454170, +-0.996573734191050330, -0.996569597491212100, -0.996565458299949910, -0.996561316617274100, -0.996557172443194970, -0.996553025777722980, -0.996548876620868330, -0.996544724972641570, +-0.996540570833052920, -0.996536414202112920, -0.996532255079831900, -0.996528093466220180, -0.996523929361288200, -0.996519762765046500, -0.996515593677505310, -0.996511422098675160, +-0.996507248028566380, -0.996503071467189640, -0.996498892414555030, -0.996494710870673320, -0.996490526835554840, -0.996486340309210020, -0.996482151291649300, -0.996477959782883230, +-0.996473765782922350, -0.996469569291776880, -0.996465370309457700, -0.996461168835974910, -0.996456964871339280, -0.996452758415561250, -0.996448549468651250, -0.996444338030619940, +-0.996440124101477750, -0.996435907681235360, -0.996431688769903070, -0.996427467367491660, -0.996423243474011460, -0.996419017089473220, -0.996414788213887510, -0.996410556847264760, +-0.996406322989615510, -0.996402086640950650, -0.996397847801280490, -0.996393606470615700, -0.996389362648966830, -0.996385116336344630, -0.996380867532759670, -0.996376616238222490, +-0.996372362452743740, -0.996368106176334200, -0.996363847409004300, -0.996359586150764810, -0.996355322401626280, -0.996351056161599580, -0.996346787430695160, -0.996342516208923780, +-0.996338242496296100, -0.996333966292822890, -0.996329687598514700, -0.996325406413382300, -0.996321122737436340, -0.996316836570687590, -0.996312547913146830, -0.996308256764824600, +-0.996303963125731770, -0.996299666995879020, -0.996295368375277210, -0.996291067263936790, -0.996286763661868860, -0.996282457569083960, -0.996278148985592860, -0.996273837911406450, +-0.996269524346535480, -0.996265208290990630, -0.996260889744782880, -0.996256568707922780, -0.996252245180421330, -0.996247919162289160, -0.996243590653537290, -0.996239259654176480, +-0.996234926164217380, -0.996230590183671110, -0.996226251712548310, -0.996221910750859860, -0.996217567298616660, -0.996213221355829460, -0.996208872922509260, -0.996204521998666940, +-0.996200168584313260, -0.996195812679459220, -0.996191454284115600, -0.996187093398293370, -0.996182730022003300, -0.996178364155256510, -0.996173995798063760, -0.996169624950436040, +-0.996165251612384340, -0.996160875783919430, -0.996156497465052300, -0.996152116655793950, -0.996147733356155360, -0.996143347566147420, -0.996138959285781000, -0.996134568515067320, +-0.996130175254017150, -0.996125779502641580, -0.996121381260951620, -0.996116980528958030, -0.996112577306672130, -0.996108171594104810, -0.996103763391266940, -0.996099352698169740, +-0.996094939514824200, -0.996090523841241190, -0.996086105677431940, -0.996081685023407440, -0.996077261879178670, -0.996072836244756840, -0.996068408120152850, -0.996063977505377900, +-0.996059544400442860, -0.996055108805359080, -0.996050670720137530, -0.996046230144789320, -0.996041787079325450, -0.996037341523757220, -0.996032893478095540, -0.996028442942351710, +-0.996023989916536730, -0.996019534400661710, -0.996015076394737960, -0.996010615898776490, -0.996006152912788490, -0.996001687436785080, -0.995997219470777460, -0.995992749014776750, +-0.995988276068794250, -0.995983800632840980, -0.995979322706928240, -0.995974842291067250, -0.995970359385269120, -0.995965873989545060, -0.995961386103906390, -0.995956895728364100, +-0.995952402862929740, -0.995947907507614310, -0.995943409662429110, -0.995938909327385380, -0.995934406502494320, -0.995929901187767360, -0.995925393383215620, -0.995920883088850300, +-0.995916370304682830, -0.995911855030724440, -0.995907337266986440, -0.995902817013480160, -0.995898294270216700, -0.995893769037207610, -0.995889241314463990, -0.995884711101997390, +-0.995880178399818900, -0.995875643207939980, -0.995871105526372040, -0.995866565355126300, -0.995862022694214090, -0.995857477543646840, -0.995852929903435990, -0.995848379773592750, +-0.995843827154128450, -0.995839272045054740, -0.995834714446382830, -0.995830154358124050, -0.995825591780289950, -0.995821026712891850, -0.995816459155941190, -0.995811889109449400, +-0.995807316573427910, -0.995802741547888060, -0.995798164032841380, -0.995793584028299320, -0.995789001534273300, -0.995784416550774760, -0.995779829077815150, -0.995775239115406000, +-0.995770646663558750, -0.995766051722284830, -0.995761454291595900, -0.995756854371503300, -0.995752251962018440, -0.995747647063153110, -0.995743039674918620, -0.995738429797326410, +-0.995733817430388250, -0.995729202574115570, -0.995724585228519810, -0.995719965393612630, -0.995715343069405460, -0.995710718255910070, -0.995706090953137780, -0.995701461161100250, +-0.995696828879809150, -0.995692194109275900, -0.995687556849512160, -0.995682917100529590, -0.995678274862339730, -0.995673630134954140, -0.995668982918384460, -0.995664333212642470, +-0.995659681017739500, -0.995655026333687300, -0.995650369160497650, -0.995645709498181990, -0.995641047346752070, -0.995636382706219570, -0.995631715576596130, -0.995627045957893420, +-0.995622373850122980, -0.995617699253296680, -0.995613022167426090, -0.995608342592523070, -0.995603660528599050, -0.995598975975665930, -0.995594288933735360, -0.995589599402819100, +-0.995584907382928820, -0.995580212874076280, -0.995575515876273240, -0.995570816389531380, -0.995566114413862450, -0.995561409949278220, -0.995556702995790580, -0.995551993553411060, +-0.995547281622151560, -0.995542567202023940, -0.995537850293039870, -0.995533130895211120, -0.995528409008549660, -0.995523684633067060, -0.995518957768775300, -0.995514228415686150, +-0.995509496573811380, -0.995504762243162980, -0.995500025423752600, -0.995495286115592130, -0.995490544318693440, -0.995485800033068520, -0.995481053258728930, -0.995476303995686870, +-0.995471552243953890, -0.995466798003542100, -0.995462041274463360, -0.995457282056729450, -0.995452520350352370, -0.995447756155343980, -0.995442989471716280, -0.995438220299481040, +-0.995433448638650240, -0.995428674489235780, -0.995423897851249630, -0.995419118724703790, -0.995414337109610140, -0.995409553005980660, -0.995404766413827360, -0.995399977333161990, +-0.995395185763996770, -0.995390391706343580, -0.995385595160214410, -0.995380796125621250, -0.995375994602576090, -0.995371190591091030, -0.995366384091177950, -0.995361575102848840, +-0.995356763626115800, -0.995351949660990940, -0.995347133207486130, -0.995342314265613480, -0.995337492835385080, -0.995332668916812930, -0.995327842509909130, -0.995323013614685670, +-0.995318182231154760, -0.995313348359328390, -0.995308511999218550, -0.995303673150837560, -0.995298831814197320, -0.995293987989310010, -0.995289141676187650, -0.995284292874842550, +-0.995279441585286690, -0.995274587807532200, -0.995269731541591260, -0.995264872787476000, -0.995260011545198500, -0.995255147814771090, -0.995250281596205770, -0.995245412889514620, +-0.995240541694710100, -0.995235668011804190, -0.995230791840808980, -0.995225913181736920, -0.995221032034600110, -0.995216148399410640, -0.995211262276180840, -0.995206373664922820, +-0.995201482565648890, -0.995196588978371270, -0.995191692903102280, -0.995186794339853910, -0.995181893288638600, -0.995176989749468550, -0.995172083722356100, -0.995167175207313350, +-0.995162264204352720, -0.995157350713486320, -0.995152434734726700, -0.995147516268085840, -0.995142595313576290, -0.995137671871210270, -0.995132745940999990, -0.995127817522957980, +-0.995122886617096250, -0.995117953223427440, -0.995113017341963670, -0.995108078972717360, -0.995103138115700950, -0.995098194770926540, -0.995093248938406780, -0.995088300618153900, +-0.995083349810180100, -0.995078396514498140, -0.995073440731120030, -0.995068482460058410, -0.995063521701325500, -0.995058558454933850, -0.995053592720895770, -0.995048624499223820, +-0.995043653789930200, -0.995038680593027470, -0.995033704908528050, -0.995028726736444380, -0.995023746076788780, -0.995018762929573920, -0.995013777294812110, -0.995008789172515900, +-0.995003798562697720, -0.994998805465370010, -0.994993809880545310, -0.994988811808236060, -0.994983811248454810, -0.994978808201213980, -0.994973802666526240, -0.994968794644403910, +-0.994963784134859640, -0.994958771137905870, -0.994953755653555150, -0.994948737681820130, -0.994943717222713130, -0.994938694276246930, -0.994933668842434060, -0.994928640921286860, +-0.994923610512818190, -0.994918577617040390, -0.994913542233966220, -0.994908504363608230, -0.994903464005978840, -0.994898421161090950, -0.994893375828956870, -0.994888328009589480, +-0.994883277703001110, -0.994878224909204740, -0.994873169628212590, -0.994868111860037650, -0.994863051604692460, -0.994857988862189570, -0.994852923632541740, -0.994847855915761640, +-0.994842785711861800, -0.994837713020855110, -0.994832637842754110, -0.994827560177571460, -0.994822480025319920, -0.994817397386012160, -0.994812312259660940, -0.994807224646279020, +-0.994802134545878960, -0.994797041958473520, -0.994791946884075570, -0.994786849322697670, -0.994781749274352700, -0.994776646739053310, -0.994771541716812370, -0.994766434207642550, +-0.994761324211556610, -0.994756211728567430, -0.994751096758687670, -0.994745979301930090, -0.994740859358307690, -0.994735736927833130, -0.994730612010519160, -0.994725484606378770, +-0.994720354715424530, -0.994715222337669510, -0.994710087473126390, -0.994704950121808040, -0.994699810283727340, -0.994694667958897160, -0.994689523147330170, -0.994684375849039460, +-0.994679226064037800, -0.994674073792338190, -0.994668919033953270, -0.994663761788896040, -0.994658602057179490, -0.994653439838816380, -0.994648275133819700, -0.994643107942202230, +-0.994637938263977060, -0.994632766099157070, -0.994627591447755140, -0.994622414309784260, -0.994617234685257310, -0.994612052574187390, -0.994606867976587150, -0.994601680892469920, +-0.994596491321848350, -0.994591299264735660, -0.994586104721144610, -0.994580907691088310, -0.994575708174579850, -0.994570506171632010, -0.994565301682257990, -0.994560094706470670, +-0.994554885244283150, -0.994549673295708310, -0.994544458860759480, -0.994539241939449310, -0.994534022531791130, -0.994528800637797920, -0.994523576257482670, -0.994518349390858480, +-0.994513120037938350, -0.994507888198735480, -0.994502653873262870, -0.994497417061533720, -0.994492177763560910, -0.994486935979357780, -0.994481691708937190, -0.994476444952312470, +-0.994471195709496490, -0.994465943980502700, -0.994460689765343960, -0.994455433064033500, -0.994450173876584410, -0.994444912203010010, -0.994439648043323190, -0.994434381397537370, +-0.994429112265665550, -0.994423840647720940, -0.994418566543716740, -0.994413289953666070, -0.994408010877582240, -0.994402729315478350, -0.994397445267367620, -0.994392158733263360, +-0.994386869713178690, -0.994381578207126800, -0.994376284215120920, -0.994370987737174360, -0.994365688773300450, -0.994360387323512170, -0.994355083387822970, -0.994349776966246050, +-0.994344468058794730, -0.994339156665482230, -0.994333842786321860, -0.994328526421326850, -0.994323207570510510, -0.994317886233886170, -0.994312562411467040, -0.994307236103266660, +-0.994301907309298130, -0.994296576029574770, -0.994291242264109920, -0.994285906012917110, -0.994280567276009440, -0.994275226053400460, -0.994269882345103270, -0.994264536151131530, +-0.994259187471498330, -0.994253836306217220, -0.994248482655301520, -0.994243126518764560, -0.994237767896619880, -0.994232406788880700, -0.994227043195560540, -0.994221677116672750, +-0.994216308552230750, -0.994210937502247980, -0.994205563966737870, -0.994200187945713960, -0.994194809439189480, -0.994189428447177950, -0.994184044969692930, -0.994178659006747730, +-0.994173270558355910, -0.994167879624530900, -0.994162486205286240, -0.994157090300635260, -0.994151691910591720, -0.994146291035168830, -0.994140887674380250, -0.994135481828239410, +-0.994130073496759860, -0.994124662679955250, -0.994119249377838910, -0.994113833590424380, -0.994108415317725310, -0.994102994559755260, -0.994097571316527650, -0.994092145588056140, +-0.994086717374354280, -0.994081286675435600, -0.994075853491313670, -0.994070417822002230, -0.994064979667514610, -0.994059539027864590, -0.994054095903065700, -0.994048650293131720, +-0.994043202198075960, -0.994037751617912190, -0.994032298552654070, -0.994026843002315250, -0.994021384966909280, -0.994015924446449930, -0.994010461440950620, -0.994004995950425240, +-0.993999527974887440, -0.993994057514350770, -0.993988584568828880, -0.993983109138335540, -0.993977631222884520, -0.993972150822489350, -0.993966667937163820, -0.993961182566921670, +-0.993955694711776470, -0.993950204371742090, -0.993944711546832280, -0.993939216237060500, -0.993933718442440830, -0.993928218162986820, -0.993922715398712240, -0.993917210149630970, +-0.993911702415756550, -0.993906192197102970, -0.993900679493683880, -0.993895164305513060, -0.993889646632604370, -0.993884126474971490, -0.993878603832628380, -0.993873078705588720, +-0.993867551093866370, -0.993862020997475120, -0.993856488416428930, -0.993850953350741360, -0.993845415800426510, -0.993839875765498150, -0.993834333245969930, -0.993828788241856050, +-0.993823240753170080, -0.993817690779926100, -0.993812138322137880, -0.993806583379819310, -0.993801025952984250, -0.993795466041646700, -0.993789903645820430, -0.993784338765519410, +-0.993778771400757430, -0.993773201551548690, -0.993767629217906840, -0.993762054399846000, -0.993756477097380020, -0.993750897310522800, -0.993745315039288310, -0.993739730283690560, +-0.993734143043743520, -0.993728553319461080, -0.993722961110857340, -0.993717366417946060, -0.993711769240741450, -0.993706169579257390, -0.993700567433507990, -0.993694962803507110, +-0.993689355689268860, -0.993683746090807120, -0.993678134008136090, -0.993672519441269660, -0.993666902390222040, -0.993661282855007100, -0.993655660835638940, -0.993650036332131670, +-0.993644409344499270, -0.993638779872755950, -0.993633147916915590, -0.993627513476992300, -0.993621876553000270, -0.993616237144953620, -0.993610595252866320, -0.993604950876752600, +-0.993599304016626440, -0.993593654672502050, -0.993588002844393410, -0.993582348532314860, -0.993576691736280490, -0.993571032456304290, -0.993565370692400580, -0.993559706444583470, +-0.993554039712867040, -0.993548370497265520, -0.993542698797793000, -0.993537024614463800, -0.993531347947292030, -0.993525668796292010, -0.993519987161477600, -0.993514303042863370, +-0.993508616440463400, -0.993502927354291800, -0.993497235784362890, -0.993491541730690990, -0.993485845193290080, -0.993480146172174730, -0.993474444667358900, -0.993468740678856930, +-0.993463034206683250, -0.993457325250851840, -0.993451613811377250, -0.993445899888273480, -0.993440183481555050, -0.993434464591236190, -0.993428743217331100, -0.993423019359854220, +-0.993417293018819760, -0.993411564194242040, -0.993405832886135380, -0.993400099094514210, -0.993394362819392750, -0.993388624060785430, -0.993382882818706460, -0.993377139093170380, +-0.993371392884191410, -0.993365644191783970, -0.993359893015962390, -0.993354139356741220, -0.993348383214134540, -0.993342624588156920, -0.993336863478822770, -0.993331099886146540, +-0.993325333810142430, -0.993319565250824990, -0.993313794208208760, -0.993308020682307950, -0.993302244673137100, -0.993296466180710660, -0.993290685205043040, -0.993284901746148700, +-0.993279115804042160, -0.993273327378737750, -0.993267536470250010, -0.993261743078593500, -0.993255947203782630, -0.993250148845831850, -0.993244348004755810, -0.993238544680568710, +-0.993232738873285450, -0.993226930582920220, -0.993221119809487680, -0.993215306553002390, -0.993209490813478760, -0.993203672590931450, -0.993197851885374900, -0.993192028696823770, +-0.993186203025292590, -0.993180374870795910, -0.993174544233348280, -0.993168711112964230, -0.993162875509658430, -0.993157037423445520, -0.993151196854339950, -0.993145353802356360, +-0.993139508267509410, -0.993133660249813750, -0.993127809749283830, -0.993121956765934510, -0.993116101299780120, -0.993110243350835640, -0.993104382919115510, -0.993098520004634390, +-0.993092654607407030, -0.993086786727447990, -0.993080916364772030, -0.993075043519393690, -0.993069168191327840, -0.993063290380589050, -0.993057410087191950, -0.993051527311151430, +-0.993045642052482020, -0.993039754311198510, -0.993033864087315640, -0.993027971380848080, -0.993022076191810710, -0.993016178520218060, -0.993010278366084910, -0.993004375729426130, +-0.992998470610256370, -0.992992563008590510, -0.992986652924443210, -0.992980740357829240, -0.992974825308763460, -0.992968907777260550, -0.992962987763335470, -0.992957065267002890, +-0.992951140288277580, -0.992945212827174520, -0.992939282883708360, -0.992933350457893990, -0.992927415549746280, -0.992921478159280000, -0.992915538286510020, -0.992909595931451340, +-0.992903651094118490, -0.992897703774526570, -0.992891753972690360, -0.992885801688624840, -0.992879846922344770, -0.992873889673865140, -0.992867929943200720, -0.992861967730366500, +-0.992856003035377350, -0.992850035858248160, -0.992844066198993900, -0.992838094057629570, -0.992832119434169820, -0.992826142328629980, -0.992820162741024580, -0.992814180671368950, +-0.992808196119677740, -0.992802209085966170, -0.992796219570248990, -0.992790227572541210, -0.992784233092858020, -0.992778236131214080, -0.992772236687624600, -0.992766234762104570, +-0.992760230354668980, -0.992754223465332710, -0.992748214094110960, -0.992742202241018720, -0.992736187906070880, -0.992730171089282630, -0.992724151790668970, -0.992718130010244780, +-0.992712105748025490, -0.992706079004025740, -0.992700049778260870, -0.992694018070745860, -0.992687983881495930, -0.992681947210525830, -0.992675908057851000, -0.992669866423486420, +-0.992663822307447100, -0.992657775709748220, -0.992651726630404910, -0.992645675069432350, -0.992639621026845550, -0.992633564502659720, -0.992627505496889940, -0.992621444009551430, +-0.992615380040659300, -0.992609313590228750, -0.992603244658274870, -0.992597173244812890, -0.992591099349858010, -0.992585022973425320, -0.992578944115530050, -0.992572862776187500, +-0.992566778955412790, -0.992560692653221110, -0.992554603869627680, -0.992548512604647830, -0.992542418858296640, -0.992536322630589330, -0.992530223921541330, -0.992524122731167750, +-0.992518019059483780, -0.992511912906504870, -0.992505804272246110, -0.992499693156722820, -0.992493579559950320, -0.992487463481943940, -0.992481344922718890, -0.992475223882290370, +-0.992469100360673820, -0.992462974357884550, -0.992456845873937900, -0.992450714908849060, -0.992444581462633480, -0.992438445535306470, -0.992432307126883240, -0.992426166237379340, +-0.992420022866809970, -0.992413877015190570, -0.992407728682536460, -0.992401577868863070, -0.992395424574185720, -0.992389268798519740, -0.992383110541880660, -0.992376949804283810, +-0.992370786585744510, -0.992364620886278410, -0.992358452705900620, -0.992352282044626670, -0.992346108902472100, -0.992339933279452250, -0.992333755175582530, -0.992327574590878500, +-0.992321391525355370, -0.992315205979028890, -0.992309017951914400, -0.992302827444027310, -0.992296634455383190, -0.992290438985997450, -0.992284241035885640, -0.992278040605063190, +-0.992271837693545770, -0.992265632301348570, -0.992259424428487470, -0.992253214074977690, -0.992247001240834870, -0.992240785926074560, -0.992234568130712310, -0.992228347854763660, +-0.992222125098244150, -0.992215899861169310, -0.992209672143554710, -0.992203441945415880, -0.992197209266768580, -0.992190974107628130, -0.992184736468010200, -0.992178496347930540, +-0.992172253747404590, -0.992166008666448110, -0.992159761105076530, -0.992153511063305520, -0.992147258541150710, -0.992141003538627890, -0.992134746055752470, -0.992128486092540120, +-0.992122223649006710, -0.992115958725167670, -0.992109691321038660, -0.992103421436635550, -0.992097149071973770, -0.992090874227069210, -0.992084596901937400, -0.992078317096594110, +-0.992072034811054990, -0.992065750045335810, -0.992059462799452340, -0.992053173073420110, -0.992046880867255010, -0.992040586180972680, -0.992034289014588900, -0.992027989368119420, +-0.992021687241579910, -0.992015382634986230, -0.992009075548354050, -0.992002765981699230, -0.991996453935037440, -0.991990139408384540, -0.991983822401756310, -0.991977502915168510, +-0.991971180948637010, -0.991964856502177470, -0.991958529575805880, -0.991952200169537890, -0.991945868283389380, -0.991939533917376210, -0.991933197071514280, -0.991926857745819350, +-0.991920515940307170, -0.991914171654993850, -0.991907824889894930, -0.991901475645026620, -0.991895123920404460, -0.991888769716044670, -0.991882413031962780, -0.991876053868175010, +-0.991869692224697010, -0.991863328101544760, -0.991856961498734260, -0.991850592416281370, -0.991844220854201990, -0.991837846812511970, -0.991831470291227420, -0.991825091290364110, +-0.991818709809938140, -0.991812325849965370, -0.991805939410461800, -0.991799550491443420, -0.991793159092926090, -0.991786765214925920, -0.991780368857458790, -0.991773970020540800, +-0.991767568704187810, -0.991761164908415930, -0.991754758633241250, -0.991748349878679550, -0.991741938644747020, -0.991735524931459560, -0.991729108738833350, -0.991722690066884400, +-0.991716268915628700, -0.991709845285082330, -0.991703419175261280, -0.991696990586181770, -0.991690559517859780, -0.991684125970311300, -0.991677689943552650, -0.991671251437599710, +-0.991664810452468570, -0.991658366988175440, -0.991651921044736430, -0.991645472622167620, -0.991639021720485130, -0.991632568339705030, -0.991626112479843560, -0.991619654140916800, +-0.991613193322940960, -0.991606730025932030, -0.991600264249906330, -0.991593795994879960, -0.991587325260869120, -0.991580852047890040, -0.991574376355958690, -0.991567898185091500, +-0.991561417535304470, -0.991554934406614020, -0.991548448799036140, -0.991541960712587160, -0.991535470147283270, -0.991528977103140700, -0.991522481580175640, -0.991515983578404430, +-0.991509483097843370, -0.991502980138508460, -0.991496474700416130, -0.991489966783582590, -0.991483456388024260, -0.991476943513757150, -0.991470428160797780, -0.991463910329162260, +-0.991457390018867010, -0.991450867229928260, -0.991444341962362310, -0.991437814216185600, -0.991431283991414340, -0.991424751288064840, -0.991418216106153440, -0.991411678445696440, +-0.991405138306710400, -0.991398595689211400, -0.991392050593215890, -0.991385503018740400, -0.991378952965801030, -0.991372400434414320, -0.991365845424596600, -0.991359287936364300, +-0.991352727969733730, -0.991346165524721320, -0.991339600601343630, -0.991333033199616850, -0.991326463319557430, -0.991319890961181890, -0.991313316124506680, -0.991306738809548120, +-0.991300159016322740, -0.991293576744846970, -0.991286991995137260, -0.991280404767210020, -0.991273815061081810, -0.991267222876769050, -0.991260628214288290, -0.991254031073655840, +-0.991247431454888470, -0.991240829358002400, -0.991234224783014260, -0.991227617729940610, -0.991221008198797880, -0.991214396189602610, -0.991207781702371450, -0.991201164737120720, +-0.991194545293867190, -0.991187923372627180, -0.991181298973417450, -0.991174672096254430, -0.991168042741154780, -0.991161410908135030, -0.991154776597211630, -0.991148139808401440, +-0.991141500541720790, -0.991134858797186440, -0.991128214574814930, -0.991121567874622910, -0.991114918696626930, -0.991108267040843650, -0.991101612907289710, -0.991094956295981770, +-0.991088297206936470, -0.991081635640170380, -0.991074971595700130, -0.991068305073542600, -0.991061636073714220, -0.991054964596231770, -0.991048290641111880, -0.991041614208371340, +-0.991034935298026660, -0.991028253910094750, -0.991021570044592130, -0.991014883701535560, -0.991008194880941830, -0.991001503582827570, -0.990994809807209660, -0.990988113554104650, +-0.990981414823529310, -0.990974713615500490, -0.990968009930034870, -0.990961303767149300, -0.990954595126860350, -0.990947884009184990, -0.990941170414139980, -0.990934454341741880, +-0.990927735792007770, -0.990921014764954310, -0.990914291260598270, -0.990907565278956510, -0.990900836820045820, -0.990894105883883050, -0.990887372470485080, -0.990880636579868580, +-0.990873898212050520, -0.990867157367047780, -0.990860414044877120, -0.990853668245555430, -0.990846919969099460, -0.990840169215526310, -0.990833415984852750, -0.990826660277095540, +-0.990819902092271780, -0.990813141430398230, -0.990806378291491870, -0.990799612675569490, -0.990792844582648160, -0.990786074012744660, -0.990779300965875960, -0.990772525442059070, +-0.990765747441310740, -0.990758966963648180, -0.990752184009088150, -0.990745398577647650, -0.990738610669343660, -0.990731820284193150, -0.990725027422213130, -0.990718232083420470, +-0.990711434267832260, -0.990704633975465490, -0.990697831206337140, -0.990691025960464210, -0.990684218237863680, -0.990677408038552640, -0.990670595362547980, -0.990663780209866900, +-0.990656962580526490, -0.990650142474543530, -0.990643319891935210, -0.990636494832718650, -0.990629667296910820, -0.990622837284528820, -0.990616004795589760, -0.990609169830110710, +-0.990602332388108690, -0.990595492469600880, -0.990588650074604280, -0.990581805203136100, -0.990574957855213320, -0.990568108030853270, -0.990561255730072920, -0.990554400952889380, +-0.990547543699319850, -0.990540683969381440, -0.990533821763091350, -0.990526957080466790, -0.990520089921524740, -0.990513220286282530, -0.990506348174757130, -0.990499473586965990, +-0.990492596522926090, -0.990485716982654860, -0.990478834966169170, -0.990471950473486460, -0.990465063504623820, -0.990458174059598570, -0.990451282138427920, -0.990444387741128970, +-0.990437490867719150, -0.990430591518215550, -0.990423689692635500, -0.990416785390996090, -0.990409878613314860, -0.990402969359608920, -0.990396057629895580, -0.990389143424192040, +-0.990382226742515640, -0.990375307584883680, -0.990368385951313490, -0.990361461841822280, -0.990354535256427470, -0.990347606195146280, -0.990340674657996130, -0.990333740644994240, +-0.990326804156158040, -0.990319865191504830, -0.990312923751051840, -0.990305979834816720, -0.990299033442816560, -0.990292084575068790, -0.990285133231590840, -0.990278179412400040, +-0.990271223117513810, -0.990264264346949590, -0.990257303100724570, -0.990250339378856430, -0.990243373181362350, -0.990236404508259890, -0.990229433359566370, -0.990222459735299320, +-0.990215483635476070, -0.990208505060114150, -0.990201524009230890, -0.990194540482843940, -0.990187554480970620, -0.990180566003628360, -0.990173575050834700, -0.990166581622607070, +-0.990159585718963010, -0.990152587339920070, -0.990145586485495550, -0.990138583155707130, -0.990131577350572220, -0.990124569070108370, -0.990117558314333120, -0.990110545083263900, +-0.990103529376918370, -0.990096511195314060, -0.990089490538468400, -0.990082467406399050, -0.990075441799123550, -0.990068413716659430, -0.990061383159024260, -0.990054350126235660, +-0.990047314618311190, -0.990040276635268390, -0.990033236177124910, -0.990026193243898400, -0.990019147835606290, -0.990012099952266470, -0.990005049593896240, -0.989997996760513480, +-0.989990941452135730, -0.989983883668780650, -0.989976823410465780, -0.989969760677208880, -0.989962695469027600, -0.989955627785939600, -0.989948557627962410, -0.989941484995114030, +-0.989934409887411770, -0.989927332304873510, -0.989920252247517010, -0.989913169715359810, -0.989906084708419680, -0.989898997226714370, -0.989891907270261550, -0.989884814839078970, +-0.989877719933184300, -0.989870622552595390, -0.989863522697329910, -0.989856420367405620, -0.989849315562840280, -0.989842208283651660, -0.989835098529857520, -0.989827986301475620, +-0.989820871598523830, -0.989813754421019710, -0.989806634768981340, -0.989799512642426380, -0.989792388041372590, -0.989785260965837850, -0.989778131415839920, -0.989770999391396680, +-0.989763864892525880, -0.989756727919245520, -0.989749588471573350, -0.989742446549527140, -0.989735302153124770, -0.989728155282384340, -0.989721005937323370, -0.989713854117959870, +-0.989706699824311810, -0.989699543056396960, -0.989692383814233300, -0.989685222097838600, -0.989678057907230850, -0.989670891242428020, -0.989663722103448000, -0.989656550490308540, +-0.989649376403027750, -0.989642199841623600, -0.989635020806113870, -0.989627839296516650, -0.989620655312849820, -0.989613468855131240, -0.989606279923379130, -0.989599088517611250, +-0.989591894637845690, -0.989584698284100340, -0.989577499456393280, -0.989570298154742510, -0.989563094379165900, -0.989555888129681650, -0.989548679406307640, -0.989541468209061970, +-0.989534254537962510, -0.989527038393027580, -0.989519819774274940, -0.989512598681722810, -0.989505375115389160, -0.989498149075291990, -0.989490920561449610, -0.989483689573879780, +-0.989476456112600820, -0.989469220177630620, -0.989461981768987480, -0.989454740886689390, -0.989447497530754340, -0.989440251701200650, -0.989433003398046300, -0.989425752621309380, +-0.989418499371008120, -0.989411243647160710, -0.989403985449785030, -0.989396724778899510, -0.989389461634522130, -0.989382196016671100, -0.989374927925364520, -0.989367657360620710, +-0.989360384322457760, -0.989353108810893780, -0.989345830825947070, -0.989338550367635850, -0.989331267435978100, -0.989323982030992250, -0.989316694152696520, -0.989309403801108990, +-0.989302110976247980, -0.989294815678131600, -0.989287517906778270, -0.989280217662206200, -0.989272914944433480, -0.989265609753478550, -0.989258302089359500, -0.989250991952094760, +-0.989243679341702540, -0.989236364258201050, -0.989229046701608830, -0.989221726671943860, -0.989214404169224570, -0.989207079193469290, -0.989199751744696320, -0.989192421822923880, +-0.989185089428170520, -0.989177754560454430, -0.989170417219793820, -0.989163077406207350, -0.989155735119713000, -0.989148390360329420, -0.989141043128074830, -0.989133693422967750, +-0.989126341245026300, -0.989118986594269000, -0.989111629470714290, -0.989104269874380490, -0.989096907805286030, -0.989089543263449330, -0.989082176248888720, -0.989074806761622630, +-0.989067434801669590, -0.989060060369047920, -0.989052683463776170, -0.989045304085872660, -0.989037922235355920, -0.989030537912244270, -0.989023151116556360, -0.989015761848310640, +-0.989008370107525400, -0.989000975894219310, -0.988993579208410690, -0.988986180050118180, -0.988978778419360330, -0.988971374316155340, -0.988963967740522090, -0.988956558692478780, +-0.988949147172044190, -0.988941733179236620, -0.988934316714074830, -0.988926897776577160, -0.988919476366762250, -0.988912052484648640, -0.988904626130254980, -0.988897197303599710, +-0.988889766004701460, -0.988882332233578800, -0.988874895990250250, -0.988867457274734460, -0.988860016087050100, -0.988852572427215690, -0.988845126295249790, -0.988837677691171150, +-0.988830226614998200, -0.988822773066749820, -0.988815317046444430, -0.988807858554100800, -0.988800397589737480, -0.988792934153373220, -0.988785468245026560, -0.988777999864716260, +-0.988770529012460990, -0.988763055688279380, -0.988755579892190100, -0.988748101624211890, -0.988740620884363430, -0.988733137672663350, -0.988725651989130540, -0.988718163833783530, +-0.988710673206641080, -0.988703180107721960, -0.988695684537045040, -0.988688186494628750, -0.988680685980492080, -0.988673182994653570, -0.988665677537132190, -0.988658169607946610, +-0.988650659207115700, -0.988643146334658000, -0.988635630990592480, -0.988628113174937930, -0.988620592887713090, -0.988613070128936730, -0.988605544898627730, -0.988598017196804730, +-0.988590487023486840, -0.988582954378692700, -0.988575419262441190, -0.988567881674751070, -0.988560341615641320, -0.988552799085130610, -0.988545254083238010, -0.988537706609982300, +-0.988530156665382240, -0.988522604249456820, -0.988515049362224900, -0.988507492003705250, -0.988499932173916960, -0.988492369872878920, -0.988484805100609880, -0.988477237857128820, +-0.988469668142454630, -0.988462095956606280, -0.988454521299602760, -0.988446944171462950, -0.988439364572205710, -0.988431782501850040, -0.988424197960414920, -0.988416610947919330, +-0.988409021464382250, -0.988401429509822570, -0.988393835084259380, -0.988386238187711540, -0.988378638820198160, -0.988371036981738120, -0.988363432672350490, -0.988355825892054280, +-0.988348216640868580, -0.988340604918812260, -0.988332990725904410, -0.988325374062164140, -0.988317754927610430, -0.988310133322262360, -0.988302509246138940, -0.988294882699259250, +-0.988287253681642270, -0.988279622193307230, -0.988271988234273090, -0.988264351804559070, -0.988256712904184040, -0.988249071533167320, -0.988241427691527900, -0.988233781379284970, +-0.988226132596457530, -0.988218481343064780, -0.988210827619125820, -0.988203171424659740, -0.988195512759685760, -0.988187851624223070, -0.988180188018290660, -0.988172521941907860, +-0.988164853395093750, -0.988157182377867430, -0.988149508890248220, -0.988141832932255220, -0.988134154503907620, -0.988126473605224650, -0.988118790236225400, -0.988111104396929290, +-0.988103416087355410, -0.988095725307522990, -0.988088032057451220, -0.988080336337159420, -0.988072638146666790, -0.988064937485992440, -0.988057234355155910, -0.988049528754176180, +-0.988041820683072670, -0.988034110141864600, -0.988026397130571280, -0.988018681649211920, -0.988010963697805940, -0.988003243276372460, -0.987995520384930880, -0.987987795023500540, +-0.987980067192100740, -0.987972336890750700, -0.987964604119469850, -0.987956868878277490, -0.987949131167192960, -0.987941390986235680, -0.987933648335424740, -0.987925903214779800, +-0.987918155624320060, -0.987910405564065060, -0.987902653034033910, -0.987894898034246130, -0.987887140564721160, -0.987879380625478310, -0.987871618216537020, -0.987863853337916710, +-0.987856085989636700, -0.987848316171716530, -0.987840543884175530, -0.987832769127033220, -0.987824991900309040, -0.987817212204022300, -0.987809430038192550, -0.987801645402839100, +-0.987793858297981720, -0.987786068723639610, -0.987778276679832310, -0.987770482166579370, -0.987762685183900200, -0.987754885731814360, -0.987747083810341260, -0.987739279419500460, +-0.987731472559311490, -0.987723663229793770, -0.987715851430966960, -0.987708037162850490, -0.987700220425463900, -0.987692401218826840, -0.987684579542958740, -0.987676755397879140, +-0.987668928783607680, -0.987661099700163910, -0.987653268147567380, -0.987645434125837720, -0.987637597634994480, -0.987629758675057200, -0.987621917246045530, -0.987614073347979130, +-0.987606226980877410, -0.987598378144760260, -0.987590526839647100, -0.987582673065557580, -0.987574816822511470, -0.987566958110528300, -0.987559096929627730, -0.987551233279829410, +-0.987543367161152990, -0.987535498573618110, -0.987527627517244540, -0.987519753992051940, -0.987511877998059950, -0.987503999535288220, -0.987496118603756520, -0.987488235203484390, +-0.987480349334491910, -0.987472460996798420, -0.987464570190423770, -0.987456676915387740, -0.987448781171709980, -0.987440882959410240, -0.987432982278508400, -0.987425079129024000, +-0.987417173510977020, -0.987409265424387010, -0.987401354869273830, -0.987393441845657250, -0.987385526353557140, -0.987377608392993160, -0.987369687963985280, -0.987361765066553040, +-0.987353839700716440, -0.987345911866495230, -0.987337981563909170, -0.987330048792978250, -0.987322113553722240, -0.987314175846160880, -0.987306235670314060, -0.987298293026201760, +-0.987290347913843620, -0.987282400333259650, -0.987274450284469700, -0.987266497767493530, -0.987258542782351260, -0.987250585329062510, -0.987242625407647400, -0.987234663018125680, +-0.987226698160517220, -0.987218730834842130, -0.987210761041120160, -0.987202788779371400, -0.987194814049615510, -0.987186836851872700, -0.987178857186162720, -0.987170875052505560, +-0.987162890450921320, -0.987154903381429750, -0.987146913844051070, -0.987138921838805030, -0.987130927365711620, -0.987122930424790930, -0.987114931016062960, -0.987106929139547670, +-0.987098924795264950, -0.987090917983235010, -0.987082908703477810, -0.987074896956013250, -0.987066882740861520, -0.987058866058042490, -0.987050846907576380, -0.987042825289483170, +-0.987034801203782840, -0.987026774650495490, -0.987018745629641310, -0.987010714141240090, -0.987002680185312230, -0.986994643761877620, -0.986986604870956350, -0.986978563512568740, +-0.986970519686734550, -0.986962473393474090, -0.986954424632807470, -0.986946373404754880, -0.986938319709336210, -0.986930263546571870, -0.986922204916481750, -0.986914143819086150, +-0.986906080254405180, -0.986898014222459150, -0.986889945723267940, -0.986881874756851960, -0.986873801323231210, -0.986865725422426010, -0.986857647054456440, -0.986849566219342720, +-0.986841482917105160, -0.986833397147763860, -0.986825308911339130, -0.986817218207851070, -0.986809125037319990, -0.986801029399766110, -0.986792931295209620, -0.986784830723670850, +-0.986776727685170000, -0.986768622179727270, -0.986760514207362990, -0.986752403768097470, -0.986744290861950920, -0.986736175488943660, -0.986728057649095990, -0.986719937342428130, +-0.986711814568960510, -0.986703689328713220, -0.986695561621706800, -0.986687431447961450, -0.986679298807497500, -0.986671163700335250, -0.986663026126495150, -0.986654886085997610, +-0.986646743578862620, -0.986638598605110940, -0.986630451164762780, -0.986622301257838340, -0.986614148884358280, -0.986605994044342790, -0.986597836737812320, -0.986589676964787280, +-0.986581514725288100, -0.986573350019334990, -0.986565182846948610, -0.986557013208149260, -0.986548841102957370, -0.986540666531393380, -0.986532489493477720, -0.986524309989230800, +-0.986516128018673170, -0.986507943581825140, -0.986499756678707370, -0.986491567309340180, -0.986483375473743980, -0.986475181171939440, -0.986466984403946870, -0.986458785169786910, +-0.986450583469479890, -0.986442379303046460, -0.986434172670507150, -0.986425963571882390, -0.986417752007192620, -0.986409537976458580, -0.986401321479700610, -0.986393102516939350, +-0.986384881088195440, -0.986376657193489210, -0.986368430832841430, -0.986360202006272500, -0.986351970713803090, -0.986343736955453740, -0.986335500731244990, -0.986327262041197580, +-0.986319020885331970, -0.986310777263668890, -0.986302531176228790, -0.986294282623032430, -0.986286031604100330, -0.986277778119453160, -0.986269522169111460, -0.986261263753096080, +-0.986253002871427360, -0.986244739524126280, -0.986236473711213370, -0.986228205432709280, -0.986219934688634560, -0.986211661479010070, -0.986203385803856470, -0.986195107663194290, +-0.986186827057044410, -0.986178543985427480, -0.986170258448364260, -0.986161970445875280, -0.986153679977981420, -0.986145387044703340, -0.986137091646061780, -0.986128793782077520, +-0.986120493452771310, -0.986112190658163800, -0.986103885398275760, -0.986095577673128170, -0.986087267482741560, -0.986078954827136700, -0.986070639706334570, -0.986062322120355830, +-0.986054002069221220, -0.986045679552951640, -0.986037354571567830, -0.986029027125090660, -0.986020697213540910, -0.986012364836939440, -0.986004029995307120, -0.985995692688664600, +-0.985987352917032880, -0.985979010680432920, -0.985970665978885270, -0.985962318812411030, -0.985953969181030950, -0.985945617084765910, -0.985937262523636890, -0.985928905497664760, +-0.985920546006870290, -0.985912184051274450, -0.985903819630898240, -0.985895452745762400, -0.985887083395887930, -0.985878711581295810, -0.985870337302006900, -0.985861960558042090, +-0.985853581349422360, -0.985845199676168790, -0.985836815538302160, -0.985828428935843440, -0.985820039868813720, -0.985811648337233890, -0.985803254341124920, -0.985794857880507800, +-0.985786458955403620, -0.985778057565833250, -0.985769653711817680, -0.985761247393378000, -0.985752838610535200, -0.985744427363310360, -0.985736013651724470, -0.985727597475798410, +-0.985719178835553490, -0.985710757731010580, -0.985702334162190770, -0.985693908129115060, -0.985685479631804640, -0.985677048670280500, -0.985668615244563840, -0.985660179354675540, +-0.985651741000636790, -0.985643300182468710, -0.985634856900192370, -0.985626411153828990, -0.985617962943399430, -0.985609512268925010, -0.985601059130426840, -0.985592603527926100, +-0.985584145461443680, -0.985575684931001010, -0.985567221936619050, -0.985558756478319140, -0.985550288556122260, -0.985541818170049710, -0.985533345320122600, -0.985524870006362130, +-0.985516392228789400, -0.985507911987425820, -0.985499429282292390, -0.985490944113410320, -0.985482456480801020, -0.985473966384485480, -0.985465473824485130, -0.985456978800821060, +-0.985448481313514480, -0.985439981362586700, -0.985431478948059050, -0.985422974069952720, -0.985414466728288920, -0.985405956923088850, -0.985397444654373960, -0.985388929922165540, +-0.985380412726484690, -0.985371893067352840, -0.985363370944791210, -0.985354846358821200, -0.985346319309464040, -0.985337789796741140, -0.985329257820673820, -0.985320723381283290, +-0.985312186478590870, -0.985303647112618090, -0.985295105283386150, -0.985286560990916490, -0.985278014235230310, -0.985269465016349270, -0.985260913334294440, -0.985252359189087380, +-0.985243802580749390, -0.985235243509301920, -0.985226681974766370, -0.985218117977164080, -0.985209551516516460, -0.985200982592844940, -0.985192411206171070, -0.985183837356516160, +-0.985175261043901520, -0.985166682268348910, -0.985158101029879440, -0.985149517328514860, -0.985140931164276370, -0.985132342537185620, -0.985123751447264050, -0.985115157894532970, +-0.985106561879014130, -0.985097963400728750, -0.985089362459698580, -0.985080759055944940, -0.985072153189489490, -0.985063544860353520, -0.985054934068558820, -0.985046320814126690, +-0.985037705097078780, -0.985029086917436620, -0.985020466275221770, -0.985011843170455760, -0.985003217603160120, -0.984994589573356390, -0.984985959081066230, -0.984977326126311170, +-0.984968690709112750, -0.984960052829492730, -0.984951412487472420, -0.984942769683073700, -0.984934124416318000, -0.984925476687227070, -0.984916826495822350, -0.984908173842125590, +-0.984899518726158440, -0.984890861147942440, -0.984882201107499240, -0.984873538604850610, -0.984864873640018180, -0.984856206213023500, -0.984847536323888330, -0.984838863972634320, +-0.984830189159283110, -0.984821511883856470, -0.984812832146376050, -0.984804149946863490, -0.984795465285340570, -0.984786778161829020, -0.984778088576350520, -0.984769396528926810, +-0.984760702019579660, -0.984752005048330710, -0.984743305615201740, -0.984734603720214490, -0.984725899363390720, -0.984717192544752210, -0.984708483264320700, -0.984699771522118070, +-0.984691057318165970, -0.984682340652486170, -0.984673621525100630, -0.984664899936030900, -0.984656175885299080, -0.984647449372926700, -0.984638720398935630, -0.984629988963347970, +-0.984621255066185140, -0.984612518707469350, -0.984603779887222140, -0.984595038605465490, -0.984586294862221270, -0.984577548657511350, -0.984568799991357490, -0.984560048863781680, +-0.984551295274805670, -0.984542539224451560, -0.984533780712741000, -0.984525019739695970, -0.984516256305338460, -0.984507490409690320, -0.984498722052773330, -0.984489951234609690, +-0.984481177955221050, -0.984472402214629510, -0.984463624012857030, -0.984454843349925390, -0.984446060225856790, -0.984437274640672880, -0.984428486594395860, -0.984419696087047600, +-0.984410903118650090, -0.984402107689225310, -0.984393309798795360, -0.984384509447382090, -0.984375706635007510, -0.984366901361693690, -0.984358093627462630, -0.984349283432336300, +-0.984340470776336800, -0.984331655659485990, -0.984322838081806210, -0.984314018043319190, -0.984305195544047270, -0.984296370584012310, -0.984287543163236410, -0.984278713281741660, +-0.984269880939550150, -0.984261046136683860, -0.984252208873165000, -0.984243369149015670, -0.984234526964257840, -0.984225682318913720, -0.984216835213005400, -0.984207985646555090, +-0.984199133619584670, -0.984190279132116430, -0.984181422184172590, -0.984172562775775140, -0.984163700906946270, -0.984154836577708190, -0.984145969788082890, -0.984137100538092780, +-0.984128228827759970, -0.984119354657106430, -0.984110478026154590, -0.984101598934926550, -0.984092717383444620, -0.984083833371730780, -0.984074946899807350, -0.984066057967696530, +-0.984057166575420640, -0.984048272723001770, -0.984039376410462350, -0.984030477637824360, -0.984021576405110230, -0.984012672712342160, -0.984003766559542360, -0.983994857946733140, +-0.983985946873936920, -0.983977033341175700, -0.983968117348471890, -0.983959198895847820, -0.983950277983325790, -0.983941354610928020, -0.983932428778676820, -0.983923500486594600, +-0.983914569734703590, -0.983905636523026320, -0.983896700851584760, -0.983887762720401570, -0.983878822129498840, -0.983869879078899220, -0.983860933568624810, -0.983851985598698130, +-0.983843035169141400, -0.983834082279977150, -0.983825126931227590, -0.983816169122915360, -0.983807208855062560, -0.983798246127691840, -0.983789280940825520, -0.983780313294486010, +-0.983771343188695640, -0.983762370623476930, -0.983753395598852220, -0.983744418114844140, -0.983735438171475020, -0.983726455768767270, -0.983717470906743330, -0.983708483585425730, +-0.983699493804837010, -0.983690501564999490, -0.983681506865935700, -0.983672509707668170, -0.983663510090219350, -0.983654508013611760, -0.983645503477867940, -0.983636496483010330, +-0.983627487029061440, -0.983618475116043940, -0.983609460743980150, -0.983600443912892700, -0.983591424622804240, -0.983582402873737220, -0.983573378665714040, -0.983564351998757580, +-0.983555322872890160, -0.983546291288134420, -0.983537257244513020, -0.983528220742048380, -0.983519181780763250, -0.983510140360680190, -0.983501096481821710, -0.983492050144210590, +-0.983483001347869260, -0.983473950092820460, -0.983464896379086740, -0.983455840206690860, -0.983446781575655240, -0.983437720486002860, -0.983428656937756050, -0.983419590930937670, +-0.983410522465570260, -0.983401451541676570, -0.983392378159279160, -0.983383302318400880, -0.983374224019064380, -0.983365143261292320, -0.983356060045107340, -0.983346974370532200, +-0.983337886237589660, -0.983328795646302490, -0.983319702596693210, -0.983310607088784700, -0.983301509122599730, -0.983292408698160920, -0.983283305815491170, -0.983274200474613000, +-0.983265092675549510, -0.983255982418323130, -0.983246869702956940, -0.983237754529473480, -0.983228636897895750, -0.983219516808246260, -0.983210394260548020, -0.983201269254823870, +-0.983192141791096490, -0.983183011869388830, -0.983173879489723570, -0.983164744652123670, -0.983155607356611890, -0.983146467603211010, -0.983137325391943980, -0.983128180722833810, +-0.983119033595903020, -0.983109884011174720, -0.983100731968671650, -0.983091577468416800, -0.983082420510432930, -0.983073261094743130, -0.983064099221370060, -0.983054934890336800, +-0.983045768101666220, -0.983036598855381190, -0.983027427151504600, -0.983018252990059520, -0.983009076371068820, -0.982999897294555390, -0.982990715760542310, -0.982981531769052340, +-0.982972345320108580, -0.982963156413733890, -0.982953965049951470, -0.982944771228783990, -0.982935574950254630, -0.982926376214386280, -0.982917175021202130, -0.982907971370724940, +-0.982898765262977810, -0.982889556697983830, -0.982880345675765880, -0.982871132196347140, -0.982861916259750500, -0.982852697865999160, -0.982843477015115980, -0.982834253707124180, +-0.982825027942046630, -0.982815799719906620, -0.982806569040727160, -0.982797335904531220, -0.982788100311341890, -0.982778862261182380, -0.982769621754075670, -0.982760378790044960, +-0.982751133369113240, -0.982741885491303700, -0.982732635156639440, -0.982723382365143670, -0.982714127116839360, -0.982704869411749730, -0.982695609249897960, -0.982686346631307160, +-0.982677081556000530, -0.982667814024001160, -0.982658544035332260, -0.982649271590016920, -0.982639996688078550, -0.982630719329540050, -0.982621439514424820, -0.982612157242755970, +-0.982602872514556800, -0.982593585329850420, -0.982584295688660010, -0.982575003591008910, -0.982565709036920310, -0.982556412026417410, -0.982547112559523540, -0.982537810636261780, +-0.982528506256655660, -0.982519199420728070, -0.982509890128502650, -0.982500578380002490, -0.982491264175250790, -0.982481947514270980, -0.982472628397086270, -0.982463306823720070, +-0.982453982794195490, -0.982444656308536060, -0.982435327366764870, -0.982425995968905450, -0.982416662114981020, -0.982407325805015000, -0.982397987039030580, -0.982388645817051210, +-0.982379302139100300, -0.982369956005201050, -0.982360607415376900, -0.982351256369651260, -0.982341902868047570, -0.982332546910589020, -0.982323188497299050, -0.982313827628201190, +-0.982304464303318750, -0.982295098522675160, -0.982285730286293850, -0.982276359594198120, -0.982266986446411640, -0.982257610842957600, -0.982248232783859530, -0.982238852269140870, +-0.982229469298825150, -0.982220083872935690, -0.982210695991496020, -0.982201305654529570, -0.982191912862059980, -0.982182517614110460, -0.982173119910704770, -0.982163719751866230, +-0.982154317137618470, -0.982144912067984820, -0.982135504542988920, -0.982126094562654210, -0.982116682127004310, -0.982107267236062790, -0.982097849889852940, -0.982088430088398520, +-0.982079007831723080, -0.982069583119850150, -0.982060155952803160, -0.982050726330605860, -0.982041294253281680, -0.982031859720854270, -0.982022422733347280, -0.982012983290784240, +-0.982003541393188570, -0.981994097040584270, -0.981984650232994530, -0.981975200970443330, -0.981965749252953990, -0.981956295080550380, -0.981946838453256030, -0.981937379371094600, +-0.981927917834089610, -0.981918453842264950, -0.981908987395644030, -0.981899518494250720, -0.981890047138108570, -0.981880573327241320, -0.981871097061672750, -0.981861618341426270, +-0.981852137166525860, -0.981842653536995070, -0.981833167452857650, -0.981823678914137240, -0.981814187920857730, -0.981804694473042750, -0.981795198570715950, -0.981785700213901210, +-0.981776199402622280, -0.981766696136902710, -0.981757190416766570, -0.981747682242237300, -0.981738171613338870, -0.981728658530095060, -0.981719142992529600, -0.981709625000666160, +-0.981700104554528830, -0.981690581654141140, -0.981681056299526960, -0.981671528490710270, -0.981661998227714610, -0.981652465510564070, -0.981642930339282290, -0.981633392713893270, +-0.981623852634420760, -0.981614310100888510, -0.981604765113320620, -0.981595217671740740, -0.981585667776172840, -0.981576115426640810, -0.981566560623168380, -0.981557003365779670, +-0.981547443654498310, -0.981537881489348510, -0.981528316870353910, -0.981518749797538500, -0.981509180270926260, -0.981499608290541060, -0.981490033856406760, -0.981480456968547470, +-0.981470877626987040, -0.981461295831749460, -0.981451711582858490, -0.981442124880338330, -0.981432535724212960, -0.981422944114506040, -0.981413350051241970, -0.981403753534444420, +-0.981394154564137480, -0.981384553140345120, -0.981374949263091430, -0.981365342932400410, -0.981355734148295910, -0.981346122910802140, -0.981336509219943090, -0.981326893075742830, +-0.981317274478225140, -0.981307653427414440, -0.981298029923334590, -0.981288403966009580, -0.981278775555463610, -0.981269144691720660, -0.981259511374804940, -0.981249875604740420, +-0.981240237381551080, -0.981230596705261360, -0.981220953575895010, -0.981211307993476330, -0.981201659958029330, -0.981192009469578190, -0.981182356528147000, -0.981172701133759980, +-0.981163043286441220, -0.981153382986214790, -0.981143720233104920, -0.981134055027135800, -0.981124387368331520, -0.981114717256716170, -0.981105044692314190, -0.981095369675149430, +-0.981085692205246440, -0.981076012282629080, -0.981066329907321680, -0.981056645079348530, -0.981046957798733740, -0.981037268065501510, -0.981027575879676260, -0.981017881241281970, +-0.981008184150342970, -0.980998484606883440, -0.980988782610927810, -0.980979078162500180, -0.980969371261624870, -0.980959661908326170, -0.980949950102628310, -0.980940235844555470, +-0.980930519134132100, -0.980920799971382480, -0.980911078356330850, -0.980901354289001490, -0.980891627769418740, -0.980881898797606900, -0.980872167373590400, -0.980862433497393440, +-0.980852697169040330, -0.980842958388555510, -0.980833217155963390, -0.980823473471288180, -0.980813727334554190, -0.980803978745785950, -0.980794227705007790, -0.980784474212244020, +-0.980774718267519050, -0.980764959870857430, -0.980755199022283250, -0.980745435721821160, -0.980735669969495350, -0.980725901765330480, -0.980716131109350850, -0.980706358001580900, +-0.980696582442045050, -0.980686804430767720, -0.980677023967773340, -0.980667241053086450, -0.980657455686731460, -0.980647667868732810, -0.980637877599115030, -0.980628084877902540, +-0.980618289705119880, -0.980608492080791370, -0.980598692004941760, -0.980588889477595370, -0.980579084498776730, -0.980569277068510380, -0.980559467186820970, -0.980549654853732690, +-0.980539840069270420, -0.980530022833458470, -0.980520203146321490, -0.980510381007884010, -0.980500556418170580, -0.980490729377205830, -0.980480899885014080, -0.980471067941620200, +-0.980461233547048620, -0.980451396701323970, -0.980441557404470920, -0.980431715656513880, -0.980421871457477500, -0.980412024807386540, -0.980402175706265420, -0.980392324154139020, +-0.980382470151031640, -0.980372613696968150, -0.980362754791973100, -0.980352893436071240, -0.980343029629287100, -0.980333163371645330, -0.980323294663170810, -0.980313423503887840, +-0.980303549893821510, -0.980293673832996150, -0.980283795321436720, -0.980273914359167780, -0.980264030946214060, -0.980254145082600110, -0.980244256768351030, -0.980234366003491120, +-0.980224472788045480, -0.980214577122038520, -0.980204679005495130, -0.980194778438440050, -0.980184875420898050, -0.980174969952893880, -0.980165062034452310, -0.980155151665597970, +-0.980145238846355850, -0.980135323576750590, -0.980125405856806960, -0.980115485686549940, -0.980105563066004160, -0.980095637995194500, -0.980085710474145610, -0.980075780502882580, +-0.980065848081430050, -0.980055913209813000, -0.980045975888055980, -0.980036036116184170, -0.980026093894222240, -0.980016149222195040, -0.980006202100127450, -0.979996252528044450, +-0.979986300505970800, -0.979976346033931360, -0.979966389111951000, -0.979956429740054700, -0.979946467918267340, -0.979936503646613890, -0.979926536925119110, -0.979916567753807980, +-0.979906596132705480, -0.979896622061836360, -0.979886645541225840, -0.979876666570898560, -0.979866685150879710, -0.979856701281194180, -0.979846714961866820, -0.979836726192922720, +-0.979826734974386770, -0.979816741306284040, -0.979806745188639420, -0.979796746621477980, -0.979786745604824590, -0.979776742138704360, -0.979766736223142360, -0.979756727858163370, +-0.979746717043792680, -0.979736703780055170, -0.979726688066975940, -0.979716669904579950, -0.979706649292892200, -0.979696626231937980, -0.979686600721742070, -0.979676572762329780, +-0.979666542353725970, -0.979656509495955840, -0.979646474189044380, -0.979636436433016790, -0.979626396227898040, -0.979616353573713460, -0.979606308470487800, -0.979596260918246480, +-0.979586210917014480, -0.979576158466817000, -0.979566103567679040, -0.979556046219625890, -0.979545986422682650, -0.979535924176874300, -0.979525859482226260, -0.979515792338763510, +-0.979505722746511380, -0.979495650705494820, -0.979485576215739280, -0.979475499277269730, -0.979465419890111380, -0.979455338054289530, -0.979445253769829380, -0.979435167036756040, +-0.979425077855094810, -0.979414986224870780, -0.979404892146109370, -0.979394795618835690, -0.979384696643075150, -0.979374595218852730, -0.979364491346193860, -0.979354385025123730, +-0.979344276255667780, -0.979334165037850980, -0.979324051371698760, -0.979313935257236530, -0.979303816694489400, -0.979293695683482790, -0.979283572224241890, -0.979273446316792030, +-0.979263317961158620, -0.979253187157366870, -0.979243053905442080, -0.979232918205409810, -0.979222780057295130, -0.979212639461123580, -0.979202496416920360, -0.979192350924711020, +-0.979182202984520630, -0.979172052596374850, -0.979161899760298880, -0.979151744476318250, -0.979141586744458170, -0.979131426564744170, -0.979121263937201560, -0.979111098861855880, +-0.979100931338732330, -0.979090761367856550, -0.979080588949253870, -0.979070414082949590, -0.979060236768969470, -0.979050057007338600, -0.979039874798082630, -0.979029690141226980, +-0.979019503036797190, -0.979009313484818570, -0.978999121485316650, -0.978988927038316860, -0.978978730143844840, -0.978968530801926030, -0.978958329012585840, -0.978948124775849800, +-0.978937918091743580, -0.978927708960292460, -0.978917497381522010, -0.978907283355457960, -0.978897066882125520, -0.978886847961550570, -0.978876626593758400, -0.978866402778774790, +-0.978856176516625040, -0.978845947807334920, -0.978835716650929940, -0.978825483047435660, -0.978815246996877610, -0.978805008499281540, -0.978794767554672870, -0.978784524163077370, +-0.978774278324520460, -0.978764030039028010, -0.978753779306625330, -0.978743526127338280, -0.978733270501192300, -0.978723012428213250, -0.978712751908426660, -0.978702488941858180, +-0.978692223528533470, -0.978681955668478150, -0.978671685361718110, -0.978661412608278660, -0.978651137408185770, -0.978640859761465090, -0.978630579668142150, -0.978620297128242830, +-0.978610012141792770, -0.978599724708817620, -0.978589434829343240, -0.978579142503395170, -0.978568847730999390, -0.978558550512181440, -0.978548250846967060, -0.978537948735382020, +-0.978527644177452190, -0.978517337173203220, -0.978507027722660960, -0.978496715825851070, -0.978486401482799420, -0.978476084693531760, -0.978465765458073840, -0.978455443776451550, +-0.978445119648690630, -0.978434793074816960, -0.978424464054856280, -0.978414132588834470, -0.978403798676777290, -0.978393462318710600, -0.978383123514660280, -0.978372782264652190, +-0.978362438568712080, -0.978352092426865940, -0.978341743839139410, -0.978331392805558700, -0.978321039326149440, -0.978310683400937630, -0.978300325029949010, -0.978289964213209680, +-0.978279600950745400, -0.978269235242582020, -0.978258867088745760, -0.978248496489262150, -0.978238123444157390, -0.978227747953457350, -0.978217370017187890, -0.978206989635375000, +-0.978196606808044660, -0.978186221535222720, -0.978175833816935290, -0.978165443653208340, -0.978155051044067750, -0.978144655989539480, -0.978134258489649630, -0.978123858544424070, +-0.978113456153888890, -0.978103051318070070, -0.978092644036993590, -0.978082234310685530, -0.978071822139171880, -0.978061407522478720, -0.978050990460632040, -0.978040570953657820, +-0.978030149001582250, -0.978019724604431210, -0.978009297762230890, -0.977998868475007390, -0.977988436742786680, -0.977978002565594860, -0.977967565943458130, -0.977957126876402350, +-0.977946685364453840, -0.977936241407638570, -0.977925795005982760, -0.977915346159512370, -0.977904894868253720, -0.977894441132232780, -0.977883984951475660, -0.977873526326008660, +-0.977863065255857870, -0.977852601741049380, -0.977842135781609390, -0.977831667377564000, -0.977821196528939510, -0.977810723235762010, -0.977800247498057830, -0.977789769315852820, +-0.977779288689173520, -0.977768805618045910, -0.977758320102496410, -0.977747832142551010, -0.977737341738236120, -0.977726848889577730, -0.977716353596602360, -0.977705855859336000, +-0.977695355677805080, -0.977684853052035780, -0.977674347982054210, -0.977663840467886900, -0.977653330509559940, -0.977642818107099740, -0.977632303260532410, -0.977621785969884360, +-0.977611266235181800, -0.977600744056451140, -0.977590219433718600, -0.977579692367010480, -0.977569162856353090, -0.977558630901772860, -0.977548096503296100, -0.977537559660949020, +-0.977527020374758030, -0.977516478644749550, -0.977505934470949800, -0.977495387853385300, -0.977484838792082260, -0.977474287287067200, -0.977463733338366340, -0.977453176946006200, +-0.977442618110013100, -0.977432056830413450, -0.977421493107233700, -0.977410926940500140, -0.977400358330239310, -0.977389787276477630, -0.977379213779241420, -0.977368637838557210, +-0.977358059454451420, -0.977347478626950370, -0.977336895356080700, -0.977326309641868840, -0.977315721484341200, -0.977305130883524110, -0.977294537839444310, -0.977283942352128230, +-0.977273344421602190, -0.977262744047892820, -0.977252141231026660, -0.977241535971030030, -0.977230928267929570, -0.977220318121751810, -0.977209705532523290, -0.977199090500270540, +-0.977188473025019990, -0.977177853106798280, -0.977167230745631940, -0.977156605941547520, -0.977145978694571540, -0.977135349004730760, -0.977124716872051490, -0.977114082296560380, +-0.977103445278284190, -0.977092805817249330, -0.977082163913482460, -0.977071519567010220, -0.977060872777859020, -0.977050223546055860, -0.977039571871627040, -0.977028917754599210, +-0.977018261194999240, -0.977007602192853540, -0.976996940748188770, -0.976986276861031790, -0.976975610531409020, -0.976964941759347230, -0.976954270544873160, -0.976943596888013350, +-0.976932920788794570, -0.976922242247243440, -0.976911561263386740, -0.976900877837251100, -0.976890191968863400, -0.976879503658250050, -0.976868812905438030, -0.976858119710454000, +-0.976847424073324590, -0.976836725994076670, -0.976826025472737000, -0.976815322509332120, -0.976804617103888990, -0.976793909256434390, -0.976783198966994950, -0.976772486235597540, +-0.976761771062268910, -0.976751053447035830, -0.976740333389925160, -0.976729610890963660, -0.976718885950178080, -0.976708158567595410, -0.976697428743242170, -0.976686696477145460, +-0.976675961769331910, -0.976665224619828630, -0.976654485028662140, -0.976643742995859540, -0.976632998521447470, -0.976622251605453020, -0.976611502247902830, -0.976600750448824000, +-0.976589996208243160, -0.976579239526187410, -0.976568480402683630, -0.976557718837758550, -0.976546954831439160, -0.976536188383752450, -0.976525419494725270, -0.976514648164384490, +-0.976503874392757100, -0.976493098179870070, -0.976482319525750260, -0.976471538430424670, -0.976460754893920260, -0.976449968916263900, -0.976439180497482680, -0.976428389637603370, +-0.976417596336653260, -0.976406800594659010, -0.976396002411647920, -0.976385201787646650, -0.976374398722682500, -0.976363593216782340, -0.976352785269973160, -0.976341974882282030, +-0.976331162053735930, -0.976320346784362080, -0.976309529074187220, -0.976298708923238560, -0.976287886331543060, -0.976277061299127950, -0.976266233826020180, -0.976255403912246860, +-0.976244571557834950, -0.976233736762811670, -0.976222899527203980, -0.976212059851039090, -0.976201217734343980, -0.976190373177145960, -0.976179526179471900, -0.976168676741349000, +-0.976157824862804450, -0.976146970543865340, -0.976136113784558890, -0.976125254584912060, -0.976114392944952170, -0.976103528864706190, -0.976092662344201440, -0.976081793383465010, +-0.976070921982524210, -0.976060048141405900, -0.976049171860137620, -0.976038293138746350, -0.976027411977259400, -0.976016528375703960, -0.976005642334107140, -0.975994753852496230, +-0.975983862930898450, -0.975972969569340880, -0.975962073767851050, -0.975951175526455940, -0.975940274845182860, -0.975929371724059250, -0.975918466163112060, -0.975907558162368850, +-0.975896647721856580, -0.975885734841602790, -0.975874819521634680, -0.975863901761979460, -0.975852981562664530, -0.975842058923717110, -0.975831133845164620, -0.975820206327034260, +-0.975809276369353330, -0.975798343972149260, -0.975787409135449260, -0.975776471859280850, -0.975765532143671120, -0.975754589988647720, -0.975743645394237750, -0.975732698360468720, +-0.975721748887367850, -0.975710796974962660, -0.975699842623280470, -0.975688885832348700, -0.975677926602194770, -0.975666964932845880, -0.975656000824329680, -0.975645034276673480, +-0.975634065289904710, -0.975623093864050660, -0.975612119999138990, -0.975601143695197020, -0.975590164952252150, -0.975579183770331810, -0.975568200149463660, -0.975557214089674880, +-0.975546225590993130, -0.975535234653445830, -0.975524241277060390, -0.975513245461864350, -0.975502247207885140, -0.975491246515150510, -0.975480243383687550, -0.975469237813524130, +-0.975458229804687550, -0.975447219357205460, -0.975436206471105180, -0.975425191146414460, -0.975414173383160830, -0.975403153181371720, -0.975392130541074650, -0.975381105462297390, +-0.975370077945067250, -0.975359047989411980, -0.975348015595359110, -0.975336980762936180, -0.975325943492170720, -0.975314903783090490, -0.975303861635723020, -0.975292817050095850, +-0.975281770026236620, -0.975270720564172970, -0.975259668663932540, -0.975248614325543000, -0.975237557549031850, -0.975226498334426760, -0.975215436681755590, -0.975204372591045640, +-0.975193306062324900, -0.975182237095620800, -0.975171165690961180, -0.975160091848373600, -0.975149015567885800, -0.975137936849525430, -0.975126855693320250, -0.975115772099298010, +-0.975104686067486240, -0.975093597597912810, -0.975082506690605370, -0.975071413345591550, -0.975060317562899350, -0.975049219342556280, -0.975038118684590120, -0.975027015589028820, +-0.975015910055899830, -0.975004802085231210, -0.974993691677050410, -0.974982578831385500, -0.974971463548264140, -0.974960345827714070, -0.974949225669763160, -0.974938103074439290, +-0.974926978041769980, -0.974915850571783320, -0.974904720664507060, -0.974893588319968970, -0.974882453538196800, -0.974871316319218640, -0.974860176663062130, -0.974849034569755250, +-0.974837890039325750, -0.974826743071801390, -0.974815593667210380, -0.974804441825580240, -0.974793287546939060, -0.974782130831314710, -0.974770971678734940, -0.974759810089227740, +-0.974748646062821080, -0.974737479599542820, -0.974726310699420840, -0.974715139362483000, -0.974703965588757380, -0.974692789378271860, -0.974681610731054300, -0.974670429647132800, +-0.974659246126535210, -0.974648060169289510, -0.974636871775423570, -0.974625680944965490, -0.974614487677943230, -0.974603291974384780, -0.974592093834318110, -0.974580893257771200, +-0.974569690244771910, -0.974558484795348570, -0.974547276909528910, -0.974536066587341150, -0.974524853828813150, -0.974513638633973110, -0.974502421002848900, -0.974491200935468700, +-0.974479978431860410, -0.974468753492052200, -0.974457526116072170, -0.974446296303948300, -0.974435064055708570, -0.974423829371381390, -0.974412592250994410, -0.974401352694576170, +-0.974390110702154420, -0.974378866273757360, -0.974367619409413190, -0.974356370109149990, -0.974345118372995870, -0.974333864200978890, -0.974322607593127280, -0.974311348549469210, +-0.974300087070032680, -0.974288823154846000, -0.974277556803937240, -0.974266288017334610, -0.974255016795066210, -0.974243743137160330, -0.974232467043645080, -0.974221188514548640, +-0.974209907549899220, -0.974198624149725020, -0.974187338314054350, -0.974176050042915190, -0.974164759336336060, -0.974153466194344950, -0.974142170616970060, -0.974130872604239920, +-0.974119572156182500, -0.974108269272826230, -0.974096963954199200, -0.974085656200329940, -0.974074346011246320, -0.974063033386976970, -0.974051718327550000, -0.974040400832993700, +-0.974029080903336400, -0.974017758538606500, -0.974006433738832110, -0.973995106504041640, -0.973983776834263400, -0.973972444729525820, -0.973961110189856980, -0.973949773215285420, +-0.973938433805839440, -0.973927091961547360, -0.973915747682437600, -0.973904400968538360, -0.973893051819878290, -0.973881700236485460, -0.973870346218388420, -0.973858989765615470, +-0.973847630878195150, -0.973836269556155650, -0.973824905799525520, -0.973813539608333170, -0.973802170982606910, -0.973790799922375270, -0.973779426427666570, -0.973768050498509340, +-0.973756672134932000, -0.973745291336962860, -0.973733908104630670, -0.973722522437963640, -0.973711134336990300, -0.973699743801739070, -0.973688350832238480, -0.973676955428517180, +-0.973665557590603250, -0.973654157318525670, -0.973642754612312530, -0.973631349471992590, -0.973619941897594150, -0.973608531889145980, -0.973597119446676480, -0.973585704570214090, +-0.973574287259787560, -0.973562867515425200, -0.973551445337155760, -0.973540020725007670, -0.973528593679009460, -0.973517164199189880, -0.973505732285577350, -0.973494297938200530, +-0.973482861157087820, -0.973471421942268100, -0.973459980293769790, -0.973448536211621530, -0.973437089695851960, -0.973425640746489520, -0.973414189363563160, -0.973402735547101220, +-0.973391279297132540, -0.973379820613685550, -0.973368359496789130, -0.973356895946471680, -0.973345429962762080, -0.973333961545688850, -0.973322490695280760, -0.973311017411566450, +-0.973299541694574550, -0.973288063544333840, -0.973276582960872940, -0.973265099944220500, -0.973253614494405510, -0.973242126611456370, -0.973230636295401850, -0.973219143546270820, +-0.973207648364091900, -0.973196150748893980, -0.973184650700705480, -0.973173148219555470, -0.973161643305472610, -0.973150135958485650, -0.973138626178623230, -0.973127113965914450, +-0.973115599320387710, -0.973104082242072010, -0.973092562730996090, -0.973081040787188820, -0.973069516410678960, -0.973057989601495250, -0.973046460359666580, -0.973034928685221790, +-0.973023394578189650, -0.973011858038599020, -0.973000319066478770, -0.972988777661857650, -0.972977233824764750, -0.972965687555228610, -0.972954138853278310, -0.972942587718942600, +-0.972931034152250570, -0.972919478153230770, -0.972907919721912480, -0.972896358858324260, -0.972884795562495190, -0.972873229834454010, -0.972861661674229940, -0.972850091081851610, +-0.972838518057348000, -0.972826942600748200, -0.972815364712081080, -0.972803784391375380, -0.972792201638660430, -0.972780616453964740, -0.972769028837317640, -0.972757438788747990, +-0.972745846308284760, -0.972734251395956820, -0.972722654051793260, -0.972711054275823160, -0.972699452068075400, -0.972687847428578940, -0.972676240357362890, -0.972664630854456310, +-0.972653018919888090, -0.972641404553687310, -0.972629787755883050, -0.972618168526504290, -0.972606546865580120, -0.972594922773139640, -0.972583296249211800, -0.972571667293825710, +-0.972560035907010460, -0.972548402088795120, -0.972536765839208780, -0.972525127158280540, -0.972513486046039490, -0.972501842502514700, -0.972490196527735380, -0.972478548121730400, +-0.972466897284529170, -0.972455244016160680, -0.972443588316654120, -0.972431930186038570, -0.972420269624343140, -0.972408606631597120, -0.972396941207829490, -0.972385273353069570, +-0.972373603067346440, -0.972361930350689300, -0.972350255203127340, -0.972338577624689780, -0.972326897615405810, -0.972315215175304500, -0.972303530304415080, -0.972291843002767050, +-0.972280153270389190, -0.972268461107311130, -0.972256766513561850, -0.972245069489170670, -0.972233370034166770, -0.972221668148579470, -0.972209963832437960, -0.972198257085771680, +-0.972186547908609590, -0.972174836300981230, -0.972163122262915790, -0.972151405794442480, -0.972139686895590720, -0.972127965566389700, -0.972116241806868730, -0.972104515617057240, +-0.972092786996984430, -0.972081055946679710, -0.972069322466172170, -0.972057586555491460, -0.972045848214666770, -0.972034107443727420, -0.972022364242702940, -0.972010618611622410, +-0.971998870550515370, -0.971987120059411120, -0.971975367138339100, -0.971963611787328710, -0.971951854006409270, -0.971940093795610080, -0.971928331154960800, -0.971916566084490620, +-0.971904798584229070, -0.971893028654205460, -0.971881256294449440, -0.971869481504990080, -0.971857704285857160, -0.971845924637079860, -0.971834142558687830, -0.971822358050710380, +-0.971810571113177040, -0.971798781746117330, -0.971786989949560700, -0.971775195723536540, -0.971763399068074300, -0.971751599983203710, -0.971739798468954090, -0.971727994525354970, +-0.971716188152435770, -0.971704379350226240, -0.971692568118755710, -0.971680754458053690, -0.971668938368149830, -0.971657119849073660, -0.971645298900854600, -0.971633475523522420, +-0.971621649717106520, -0.971609821481636440, -0.971597990817141820, -0.971586157723652200, -0.971574322201197330, -0.971562484249806510, -0.971550643869509510, -0.971538801060335850, +-0.971526955822315300, -0.971515108155477260, -0.971503258059851600, -0.971491405535467640, -0.971479550582355240, -0.971467693200543940, -0.971455833390063360, -0.971443971150943280, +-0.971432106483213210, -0.971420239386902920, -0.971408369862042040, -0.971396497908660230, -0.971384623526787120, -0.971372746716452460, -0.971360867477686020, -0.971348985810517320, +-0.971337101714976230, -0.971325215191092380, -0.971313326238895440, -0.971301434858415250, -0.971289541049681350, -0.971277644812723720, -0.971265746147571880, -0.971253845054255830, +-0.971241941532804960, -0.971230035583249380, -0.971218127205618620, -0.971206216399942650, -0.971194303166251100, -0.971182387504573750, -0.971170469414940450, -0.971158548897381070, +-0.971146625951925250, -0.971134700578602850, -0.971122772777443630, -0.971110842548477570, -0.971098909891734420, -0.971086974807243930, -0.971075037295036080, -0.971063097355140510, +-0.971051154987587320, -0.971039210192406130, -0.971027262969627050, -0.971015313319279700, -0.971003361241394190, -0.970991406736000150, -0.970979449803127670, -0.970967490442806500, +-0.970955528655066740, -0.970943564439938010, -0.970931597797450530, -0.970919628727633930, -0.970907657230518310, -0.970895683306133410, -0.970883706954509430, -0.970871728175676240, +-0.970859746969663600, -0.970847763336501690, -0.970835777276220280, -0.970823788788849450, -0.970811797874419180, -0.970799804532959440, -0.970787808764500100, -0.970775810569071360, +-0.970763809946703080, -0.970751806897425240, -0.970739801421267810, -0.970727793518261000, -0.970715783188434540, -0.970703770431818770, -0.970691755248443530, -0.970679737638338920, +-0.970667717601534920, -0.970655695138061710, -0.970643670247949180, -0.970631642931227500, -0.970619613187926780, -0.970607581018076870, -0.970595546421708200, -0.970583509398850520, +-0.970571469949534140, -0.970559428073789030, -0.970547383771645400, -0.970535337043133330, -0.970523287888282900, -0.970511236307124210, -0.970499182299687460, -0.970487125866002720, +-0.970475067006100200, -0.970463005720009990, -0.970450942007762270, -0.970438875869387260, -0.970426807304915040, -0.970414736314375690, -0.970402662897799640, -0.970390587055216860, +-0.970378508786657550, -0.970366428092152120, -0.970354344971730450, -0.970342259425423070, -0.970330171453259950, -0.970318081055271510, -0.970305988231487730, -0.970293892981939130, +-0.970281795306655590, -0.970269695205667750, -0.970257592679005580, -0.970245487726699500, -0.970233380348779590, -0.970221270545276400, -0.970209158316219900, -0.970197043661640500, +-0.970184926581568520, -0.970172807076034260, -0.970160685145067920, -0.970148560788699930, -0.970136434006960480, -0.970124304799879990, -0.970112173167488770, -0.970100039109817010, +-0.970087902626895260, -0.970075763718753700, -0.970063622385422760, -0.970051478626932750, -0.970039332443313970, -0.970027183834596960, -0.970015032800811920, -0.970002879341989370, +-0.969990723458159620, -0.969978565149352990, -0.969966404415600000, -0.969954241256930970, -0.969942075673376420, -0.969929907664966560, -0.969917737231732020, -0.969905564373703120, +-0.969893389090910270, -0.969881211383384010, -0.969869031251154650, -0.969856848694252700, -0.969844663712708720, -0.969832476306553000, -0.969820286475816080, -0.969808094220528600, +-0.969795899540720760, -0.969783702436423200, -0.969771502907666340, -0.969759300954480820, -0.969747096576896950, -0.969734889774945370, -0.969722680548656510, -0.969710468898061120, +-0.969698254823189390, -0.969686038324072070, -0.969673819400739600, -0.969661598053222720, -0.969649374281551730, -0.969637148085757290, -0.969624919465870150, -0.969612688421920500, +-0.969600454953939320, -0.969588219061956910, -0.969575980746003930, -0.969563740006111010, -0.969551496842308790, -0.969539251254627700, -0.969527003243098710, -0.969514752807752010, +-0.969502499948618480, -0.969490244665728750, -0.969477986959113360, -0.969465726828802940, -0.969453464274828370, -0.969441199297220060, -0.969428931896008760, -0.969416662071225010, +-0.969404389822899780, -0.969392115151063490, -0.969379838055746900, -0.969367558536980760, -0.969355276594795700, -0.969342992229222490, -0.969330705440291760, -0.969318416228034270, +-0.969306124592480670, -0.969293830533661920, -0.969281534051608440, -0.969269235146351220, -0.969256933817920880, -0.969244630066348200, -0.969232323891664030, -0.969220015293898900, +-0.969207704273083780, -0.969195390829249550, -0.969183074962426620, -0.969170756672646180, -0.969158435959938780, -0.969146112824335160, -0.969133787265866410, -0.969121459284563170, +-0.969109128880456310, -0.969096796053576570, -0.969084460803954940, -0.969072123131622050, -0.969059783036608890, -0.969047440518946200, -0.969035095578665070, -0.969022748215796040, +-0.969010398430370290, -0.968998046222418470, -0.968985691591971570, -0.968973334539060320, -0.968960975063715810, -0.968948613165968920, -0.968936248845850390, -0.968923882103391310, +-0.968911512938622430, -0.968899141351574960, -0.968886767342279520, -0.968874390910767100, -0.968862012057068790, -0.968849630781215440, -0.968837247083238040, -0.968824860963167440, +-0.968812472421034740, -0.968800081456870910, -0.968787688070706810, -0.968775292262573530, -0.968762894032501930, -0.968750493380523210, -0.968738090306668130, -0.968725684810967990, +-0.968713276893453430, -0.968700866554155880, -0.968688453793106090, -0.968676038610335130, -0.968663621005874110, -0.968651200979753990, -0.968638778532005970, -0.968626353662660920, +-0.968613926371750030, -0.968601496659304280, -0.968589064525354760, -0.968576629969932660, -0.968564192993068950, -0.968551753594794730, -0.968539311775141190, -0.968526867534139300, +-0.968514420871820380, -0.968501971788215290, -0.968489520283355220, -0.968477066357271490, -0.968464610009994950, -0.968452151241557040, -0.968439690051988710, -0.968427226441321070, +-0.968414760409585410, -0.968402291956812820, -0.968389821083034510, -0.968377347788281660, -0.968364872072585480, -0.968352393935977160, -0.968339913378487680, -0.968327430400148570, +-0.968314945000990800, -0.968302457181045790, -0.968289966940344530, -0.968277474278918420, -0.968264979196798550, -0.968252481694016230, -0.968239981770602780, -0.968227479426589380, +-0.968214974662007230, -0.968202467476887650, -0.968189957871261830, -0.968177445845161300, -0.968164931398616920, -0.968152414531660340, -0.968139895244322760, -0.968127373536635360, +-0.968114849408629690, -0.968102322860336710, -0.968089793891788060, -0.968077262503014730, -0.968064728694048470, -0.968052192464920250, -0.968039653815661590, -0.968027112746303820, +-0.968014569256878230, -0.968002023347416250, -0.967989475017949190, -0.967976924268508450, -0.967964371099125480, -0.967951815509831450, -0.967939257500657900, -0.967926697071636260, +-0.967914134222797820, -0.967901568954174120, -0.967889001265796470, -0.967876431157696280, -0.967863858629904980, -0.967851283682454210, -0.967838706315375050, -0.967826126528699260, +-0.967813544322458030, -0.967800959696683010, -0.967788372651405490, -0.967775783186657250, -0.967763191302469350, -0.967750596998873560, -0.967738000275901290, -0.967725401133583960, +-0.967712799571953220, -0.967700195591040370, -0.967687589190877160, -0.967674980371494910, -0.967662369132925140, -0.967649755475199490, -0.967637139398349500, -0.967624520902406580, +-0.967611899987402490, -0.967599276653368530, -0.967586650900336460, -0.967574022728337700, -0.967561392137404000, -0.967548759127566660, -0.967536123698857550, -0.967523485851307980, +-0.967510845584949820, -0.967498202899814470, -0.967485557795933700, -0.967472910273339040, -0.967460260332062120, -0.967447607972134360, -0.967434953193587740, -0.967422295996453680, +-0.967409636380763940, -0.967396974346550140, -0.967384309893843830, -0.967371643022676750, -0.967358973733080550, -0.967346302025086980, -0.967333627898727570, -0.967320951354034180, +-0.967308272391038340, -0.967295591009771800, -0.967282907210266330, -0.967270220992553660, -0.967257532356665340, -0.967244841302633220, -0.967232147830488940, -0.967219451940264370, +-0.967206753631991160, -0.967194052905701150, -0.967181349761425890, -0.967168644199197240, -0.967155936219047050, -0.967143225821006870, -0.967130513005108880, -0.967117797771384400, +-0.967105080119865510, -0.967092360050583850, -0.967079637563571400, -0.967066912658859800, -0.967054185336480910, -0.967041455596466590, -0.967028723438848600, -0.967015988863658800, +-0.967003251870929060, -0.966990512460691230, -0.966977770632977070, -0.966965026387818450, -0.966952279725247330, -0.966939530645295480, -0.966926779147994740, -0.966914025233377110, +-0.966901268901474430, -0.966888510152318580, -0.966875748985941420, -0.966862985402374920, -0.966850219401650950, -0.966837450983801470, -0.966824680148858250, -0.966811906896853480, +-0.966799131227818800, -0.966786353141786400, -0.966773572638788050, -0.966760789718855820, -0.966748004382021580, -0.966735216628317300, -0.966722426457775060, -0.966709633870426740, +-0.966696838866304200, -0.966684041445439730, -0.966671241607865110, -0.966658439353612400, -0.966645634682713580, -0.966632827595200640, -0.966620018091105650, -0.966607206170460590, +-0.966594391833297540, -0.966581575079648480, -0.966568755909545610, -0.966555934323020670, -0.966543110320105980, -0.966530283900833510, -0.966517455065235340, -0.966504623813343570, +-0.966491790145190270, -0.966478954060807420, -0.966466115560227210, -0.966453274643481630, -0.966440431310602980, -0.966427585561623110, -0.966414737396574460, -0.966401886815488780, +-0.966389033818398580, -0.966376178405335630, -0.966363320576332230, -0.966350460331420690, -0.966337597670632880, -0.966324732594001090, -0.966311865101557420, -0.966298995193334180, +-0.966286122869363440, -0.966273248129677410, -0.966260370974308170, -0.966247491403288140, -0.966234609416649180, -0.966221725014423940, -0.966208838196644160, -0.966195948963342490, +-0.966183057314550790, -0.966170163250301580, -0.966157266770626850, -0.966144367875559020, -0.966131466565130160, -0.966118562839372810, -0.966105656698318940, -0.966092748142000860, +-0.966079837170451090, -0.966066923783701510, -0.966054007981784870, -0.966041089764733020, -0.966028169132578500, -0.966015246085353610, -0.966002320623090550, -0.965989392745821740, +-0.965976462453579380, -0.965963529746395880, -0.965950594624303660, -0.965937657087334810, -0.965924717135521860, -0.965911774768897110, -0.965898829987492990, -0.965885882791341800, +-0.965872933180475850, -0.965859981154927550, -0.965847026714729330, -0.965834069859913490, -0.965821110590512570, -0.965808148906558860, -0.965795184808084680, -0.965782218295122670, +-0.965769249367705030, -0.965756278025864280, -0.965743304269632840, -0.965730328099043130, -0.965717349514127580, -0.965704368514918700, -0.965691385101448920, -0.965678399273750650, +-0.965665411031856320, -0.965652420375798570, -0.965639427305609700, -0.965626431821322240, -0.965613433922968720, -0.965600433610581680, -0.965587430884193520, -0.965574425743836780, +-0.965561418189544000, -0.965548408221347580, -0.965535395839280270, -0.965522381043374400, -0.965509363833662590, -0.965496344210177380, -0.965483322172951300, -0.965470297722016870, +-0.965457270857406740, -0.965444241579153430, -0.965431209887289590, -0.965418175781847630, -0.965405139262860200, -0.965392100330359940, -0.965379058984379590, -0.965366015224951360, +-0.965352969052108320, -0.965339920465882680, -0.965326869466307300, -0.965313816053414710, -0.965300760227237650, -0.965287701987808670, -0.965274641335160390, -0.965261578269325570, +-0.965248512790336740, -0.965235444898226660, -0.965222374593027950, -0.965209301874773380, -0.965196226743495480, -0.965183149199227100, -0.965170069242000770, -0.965156986871849250, +-0.965143902088805290, -0.965130814892901650, -0.965117725284170840, -0.965104633262645840, -0.965091538828359070, -0.965078441981343630, -0.965065342721632020, -0.965052241049257020, +-0.965039136964251590, -0.965026030466648140, -0.965012921556479660, -0.964999810233778900, -0.964986696498578600, -0.964973580350911520, -0.964960461790810630, -0.964947340818308460, +-0.964934217433437990, -0.964921091636231850, -0.964907963426723140, -0.964894832804944480, -0.964881699770928750, -0.964868564324708690, -0.964855426466317280, -0.964842286195787270, +-0.964829143513151630, -0.964815998418443010, -0.964802850911694490, -0.964789700992938810, -0.964776548662208850, -0.964763393919537580, -0.964750236764957750, -0.964737077198502440, +-0.964723915220204290, -0.964710750830096500, -0.964697584028211710, -0.964684414814583110, -0.964671243189243350, -0.964658069152225520, -0.964644892703562460, -0.964631713843287280, +-0.964618532571432710, -0.964605348888031950, -0.964592162793117660, -0.964578974286723010, -0.964565783368880990, -0.964552590039624460, -0.964539394298986390, -0.964526196146999970, +-0.964512995583697960, -0.964499792609113450, -0.964486587223279510, -0.964473379426229130, -0.964460169217995270, -0.964446956598611020, -0.964433741568109350, -0.964420524126523240, +-0.964407304273885990, -0.964394082010230360, -0.964380857335589540, -0.964367630249996610, -0.964354400753484660, -0.964341168846086560, -0.964327934527835720, -0.964314697798764890, +-0.964301458658907370, -0.964288217108296150, -0.964274973146964530, -0.964261726774945260, -0.964248477992271870, -0.964235226798977220, -0.964221973195094510, -0.964208717180656820, +-0.964195458755697340, -0.964182197920249280, -0.964168934674345720, -0.964155669018019750, -0.964142400951304660, -0.964129130474233540, -0.964115857586839600, -0.964102582289156130, +-0.964089304581216110, -0.964076024463052850, -0.964062741934699430, -0.964049456996189270, -0.964036169647555450, -0.964022879888831170, -0.964009587720049630, -0.963996293141244240, +-0.963982996152448090, -0.963969696753694370, -0.963956394945016500, -0.963943090726447680, -0.963929784098021100, -0.963916475059769960, -0.963903163611727790, -0.963889849753927550, +-0.963876533486402790, -0.963863214809186690, -0.963849893722312560, -0.963836570225813590, -0.963823244319723330, -0.963809916004074840, -0.963796585278901660, -0.963783252144236990, +-0.963769916600114240, -0.963756578646566610, -0.963743238283627510, -0.963729895511330370, -0.963716550329708490, -0.963703202738795280, -0.963689852738623950, -0.963676500329228140, +-0.963663145510640920, -0.963649788282895940, -0.963636428646026500, -0.963623066600065910, -0.963609702145047710, -0.963596335281005300, -0.963582966007972000, -0.963569594325981220, +-0.963556220235066490, -0.963542843735261330, -0.963529464826598850, -0.963516083509112890, -0.963502699782836650, -0.963489313647803660, -0.963475925104047450, -0.963462534151601320, +-0.963449140790498930, -0.963435745020773560, -0.963422346842458980, -0.963408946255588480, -0.963395543260195720, -0.963382137856313880, -0.963368730043976940, -0.963355319823217980, +-0.963341907194070870, -0.963328492156568910, -0.963315074710745730, -0.963301654856634770, -0.963288232594269880, -0.963274807923684250, -0.963261380844911640, -0.963247951357985580, +-0.963234519462939700, -0.963221085159807420, -0.963207648448622500, -0.963194209329418350, -0.963180767802228830, -0.963167323867087250, -0.963153877524027480, -0.963140428773082920, +-0.963126977614287340, -0.963113524047674360, -0.963100068073277530, -0.963086609691130580, -0.963073148901266940, -0.963059685703720580, -0.963046220098525030, -0.963032752085713820, +-0.963019281665320800, -0.963005808837379520, -0.962992333601923710, -0.962978855958987130, -0.962965375908603430, -0.962951893450806230, -0.962938408585629290, -0.962924921313106470, +-0.962911431633271200, -0.962897939546157320, -0.962884445051798710, -0.962870948150228890, -0.962857448841481720, -0.962843947125590960, -0.962830443002590350, -0.962816936472513650, +-0.962803427535394500, -0.962789916191266860, -0.962776402440164490, -0.962762886282121030, -0.962749367717170350, -0.962735846745346290, -0.962722323366682620, -0.962708797581213080, +-0.962695269388971540, -0.962681738789991860, -0.962668205784307900, -0.962654670371953290, -0.962641132552962130, -0.962627592327368050, -0.962614049695205030, -0.962600504656506930, +-0.962586957211307490, -0.962573407359640700, -0.962559855101540410, -0.962546300437040480, -0.962532743366174780, -0.962519183888977280, -0.962505622005481730, -0.962492057715722100, +-0.962478491019732370, -0.962464921917546510, -0.962451350409198270, -0.962437776494721620, -0.962424200174150530, -0.962410621447518990, -0.962397040314860840, -0.962383456776210180, +-0.962369870831600750, -0.962356282481066750, -0.962342691724642040, -0.962329098562360490, -0.962315502994256280, -0.962301905020363280, -0.962288304640715570, -0.962274701855347140, +-0.962261096664291830, -0.962247489067583840, -0.962233879065257150, -0.962220266657345720, -0.962206651843883650, -0.962193034624904910, -0.962179415000443680, -0.962165792970533840, +-0.962152168535209570, -0.962138541694504750, -0.962124912448453770, -0.962111280797090300, -0.962097646740448730, -0.962084010278563050, -0.962070371411467340, -0.962056730139195790, +-0.962043086461782270, -0.962029440379261080, -0.962015791891666310, -0.962002140999032030, -0.961988487701392450, -0.961974831998781640, -0.961961173891233700, -0.961947513378782930, +-0.961933850461463290, -0.961920185139308990, -0.961906517412354330, -0.961892847280633290, -0.961879174744180170, -0.961865499803029160, -0.961851822457214340, -0.961838142706769930, +-0.961824460551730210, -0.961810775992129270, -0.961797089028001540, -0.961783399659380980, -0.961769707886302010, -0.961756013708798600, -0.961742317126905280, -0.961728618140656130, +-0.961714916750085580, -0.961701212955227590, -0.961687506756116580, -0.961673798152786750, -0.961660087145272510, -0.961646373733608060, -0.961632657917827700, -0.961618939697965640, +-0.961605219074056270, -0.961591496046133810, -0.961577770614232550, -0.961564042778386920, -0.961550312538631210, -0.961536579894999740, -0.961522844847526810, -0.961509107396246730, +-0.961495367541193910, -0.961481625282402660, -0.961467880619907290, -0.961454133553742320, -0.961440384083941950, -0.961426632210540700, -0.961412877933572770, -0.961399121253072700, +-0.961385362169074780, -0.961371600681613540, -0.961357836790723290, -0.961344070496438440, -0.961330301798793310, -0.961316530697822520, -0.961302757193560400, -0.961288981286041340, +-0.961275202975299890, -0.961261422261370350, -0.961247639144287350, -0.961233853624085200, -0.961220065700798430, -0.961206275374461460, -0.961192482645108930, -0.961178687512775020, +-0.961164889977494500, -0.961151090039301660, -0.961137287698231260, -0.961123482954317490, -0.961109675807595100, -0.961095866258098400, -0.961082054305862240, -0.961068239950920720, +-0.961054423193308800, -0.961040604033060690, -0.961026782470211120, -0.961012958504794510, -0.960999132136845620, -0.960985303366398870, -0.960971472193488770, -0.960957638618150200, +-0.960943802640417340, -0.960929964260325060, -0.960916123477907780, -0.960902280293200350, -0.960888434706237080, -0.960874586717052840, -0.960860736325682030, -0.960846883532159410, +-0.960833028336519620, -0.960819170738797190, -0.960805310739026860, -0.960791448337243280, -0.960777583533481080, -0.960763716327774910, -0.960749846720159400, -0.960735974710669400, +-0.960722100299339350, -0.960708223486203990, -0.960694344271298300, -0.960680462654656560, -0.960666578636313770, -0.960652692216304450, -0.960638803394663450, -0.960624912171425430, +-0.960611018546625120, -0.960597122520297160, -0.960583224092476540, -0.960569323263197880, -0.960555420032495830, -0.960541514400405250, -0.960527606366960880, -0.960513695932197490, +-0.960499783096149920, -0.960485867858852820, -0.960471950220341150, -0.960458030180649460, -0.960444107739812810, -0.960430182897865860, -0.960416255654843450, -0.960402326010780350, +-0.960388393965711520, -0.960374459519671710, -0.960360522672695670, -0.960346583424818380, -0.960332641776074580, -0.960318697726499250, -0.960304751276127020, -0.960290802424993100, +-0.960276851173132110, -0.960262897520579030, -0.960248941467368610, -0.960234983013535940, -0.960221022159115760, -0.960207058904143040, -0.960193093248652540, -0.960179125192679560, +-0.960165154736258520, -0.960151181879424720, -0.960137206622213020, -0.960123228964658180, -0.960109248906795390, -0.960095266448659390, -0.960081281590285270, -0.960067294331707900, +-0.960053304672962350, -0.960039312614083480, -0.960025318155106390, -0.960011321296065920, -0.959997322036997280, -0.959983320377935210, -0.959969316318914910, -0.959955309859971240, +-0.959941301001139390, -0.959927289742454230, -0.959913276083950830, -0.959899260025664280, -0.959885241567629670, -0.959871220709881840, -0.959857197452455900, -0.959843171795387030, +-0.959829143738710310, -0.959815113282460720, -0.959801080426673230, -0.959787045171383140, -0.959773007516625310, -0.959758967462435160, -0.959744925008847450, -0.959730880155897470, +-0.959716832903620310, -0.959702783252051050, -0.959688731201224780, -0.959674676751176790, -0.959660619901941960, -0.959646560653555800, -0.959632499006052960, -0.959618434959469080, +-0.959604368513839010, -0.959590299669198070, -0.959576228425581430, -0.959562154783024090, -0.959548078741561560, -0.959534000301228600, -0.959519919462060830, -0.959505836224093130, +-0.959491750587360910, -0.959477662551899260, -0.959463572117743580, -0.959449479284928850, -0.959435384053490490, -0.959421286423463580, -0.959407186394883540, -0.959393083967785440, +-0.959378979142204710, -0.959364871918176540, -0.959350762295736240, -0.959336650274918880, -0.959322535855759990, -0.959308419038294780, -0.959294299822558430, -0.959280178208586460, +-0.959266054196413860, -0.959251927786076260, -0.959237798977608860, -0.959223667771046950, -0.959209534166425850, -0.959195398163780850, -0.959181259763147390, -0.959167118964560860, +-0.959152975768056470, -0.959138830173669740, -0.959124682181435760, -0.959110531791390160, -0.959096379003568260, -0.959082223818005450, -0.959068066234736950, -0.959053906253798380, +-0.959039743875224950, -0.959025579099052280, -0.959011411925315580, -0.958997242354050370, -0.958983070385292070, -0.958968896019076090, -0.958954719255437850, -0.958940540094412870, +-0.958926358536036470, -0.958912174580344170, -0.958897988227371600, -0.958883799477153850, -0.958869608329726670, -0.958855414785125480, -0.958841218843385800, -0.958827020504543050, +-0.958812819768632750, -0.958798616635690330, -0.958784411105751410, -0.958770203178851420, -0.958755992855026110, -0.958741780134310550, -0.958727565016740720, -0.958713347502351930, +-0.958699127591179700, -0.958684905283259780, -0.958670680578627590, -0.958656453477318650, -0.958642223979368490, -0.958627992084812970, -0.958613757793687290, -0.958599521106027310, +-0.958585282021868430, -0.958571040541246530, -0.958556796664196800, -0.958542550390755310, -0.958528301720957270, -0.958514050654838520, -0.958499797192434720, -0.958485541333781390, +-0.958471283078914160, -0.958457022427868790, -0.958442759380680690, -0.958428493937385830, -0.958414226098019740, -0.958399955862618060, -0.958385683231216530, -0.958371408203850810, +-0.958357130780556510, -0.958342850961369400, -0.958328568746325220, -0.958314284135459490, -0.958299997128808200, -0.958285707726406750, -0.958271415928291130, -0.958257121734496950, +-0.958242825145059980, -0.958228526160015970, -0.958214224779400660, -0.958199921003249690, -0.958185614831599030, -0.958171306264484210, -0.958156995301941210, -0.958142681944005760, +-0.958128366190713510, -0.958114048042100430, -0.958099727498202160, -0.958085404559054670, -0.958071079224693480, -0.958056751495154790, -0.958042421370474130, -0.958028088850687460, +-0.958013753935830550, -0.957999416625939240, -0.957985076921049390, -0.957970734821196880, -0.957956390326417440, -0.957942043436747160, -0.957927694152221680, -0.957913342472876960, +-0.957898988398748870, -0.957884631929873390, -0.957870273066286250, -0.957855911808023430, -0.957841548155121010, -0.957827182107614530, -0.957812813665540160, -0.957798442828933670, +-0.957784069597831240, -0.957769693972268520, -0.957755315952281580, -0.957740935537906290, -0.957726552729178840, -0.957712167526134860, -0.957697779928810560, -0.957683389937241670, +-0.957668997551464400, -0.957654602771514600, -0.957640205597428350, -0.957625806029241520, -0.957611404066990300, -0.957596999710710440, -0.957582592960438130, -0.957568183816209340, +-0.957553772278060040, -0.957539358346026330, -0.957524942020144270, -0.957510523300449830, -0.957496102186979000, -0.957481678679768080, -0.957467252778852810, -0.957452824484269490, +-0.957438393796054110, -0.957423960714242740, -0.957409525238871460, -0.957395087369976470, -0.957380647107593630, -0.957366204451759240, -0.957351759402509270, -0.957337311959879920, +-0.957322862123907270, -0.957308409894627510, -0.957293955272076720, -0.957279498256290990, -0.957265038847306630, -0.957250577045159590, -0.957236112849886190, -0.957221646261522400, +-0.957207177280104520, -0.957192705905668740, -0.957178232138251150, -0.957163755977888050, -0.957149277424615530, -0.957134796478469770, -0.957120313139487090, -0.957105827407703560, +-0.957091339283155480, -0.957076848765879060, -0.957062355855910600, -0.957047860553286060, -0.957033362858042080, -0.957018862770214530, -0.957004360289839930, -0.956989855416954360, +-0.956975348151594130, -0.956960838493795650, -0.956946326443594900, -0.956931812001028500, -0.956917295166132440, -0.956902775938943240, -0.956888254319497090, -0.956873730307830290, +-0.956859203903979160, -0.956844675107980100, -0.956830143919869200, -0.956815610339683100, -0.956801074367457760, -0.956786536003229940, -0.956771995247035710, -0.956757452098911500, +-0.956742906558893600, -0.956728358627018550, -0.956713808303322530, -0.956699255587841970, -0.956684700480613270, -0.956670142981672860, -0.956655583091057030, -0.956641020808802310, +-0.956626456134945010, -0.956611889069521550, -0.956597319612568440, -0.956582747764122000, -0.956568173524218750, -0.956553596892894880, -0.956539017870187250, -0.956524436456131940, +-0.956509852650765600, -0.956495266454124530, -0.956480677866245350, -0.956466086887164500, -0.956451493516918380, -0.956436897755543520, -0.956422299603076560, -0.956407699059553700, +-0.956393096125011550, -0.956378490799486890, -0.956363883083015790, -0.956349272975635100, -0.956334660477381140, -0.956320045588290650, -0.956305428308399930, -0.956290808637745740, +-0.956276186576364370, -0.956261562124292700, -0.956246935281567010, -0.956232306048224070, -0.956217674424300280, -0.956203040409832390, -0.956188404004856830, -0.956173765209410330, +-0.956159124023529320, -0.956144480447250640, -0.956129834480610620, -0.956115186123646100, -0.956100535376393610, -0.956085882238889680, -0.956071226711171170, -0.956056568793274500, +-0.956041908485236510, -0.956027245787093640, -0.956012580698882840, -0.955997913220640430, -0.955983243352403260, -0.955968571094207960, -0.955953896446091300, -0.955939219408089790, +-0.955924539980240410, -0.955909858162579450, -0.955895173955144010, -0.955880487357970600, -0.955865798371095980, -0.955851106994556890, -0.955836413228389970, -0.955821717072631970, +-0.955807018527319750, -0.955792317592490060, -0.955777614268179420, -0.955762908554424920, -0.955748200451262960, -0.955733489958730640, -0.955718777076864590, -0.955704061805701550, +-0.955689344145278400, -0.955674624095631860, -0.955659901656798700, -0.955645176828815890, -0.955630449611720060, -0.955615720005548170, -0.955600988010336880, -0.955586253626123260, +-0.955571516852943840, -0.955556777690835800, -0.955542036139835680, -0.955527292199980560, -0.955512545871307180, -0.955497797153852410, -0.955483046047653220, -0.955468292552746350, +-0.955453536669168770, -0.955438778396957340, -0.955424017736148930, -0.955409254686780510, -0.955394489248889030, -0.955379721422511260, -0.955364951207684170, -0.955350178604444710, +-0.955335403612829760, -0.955320626232876390, -0.955305846464621470, -0.955291064308101840, -0.955276279763354610, -0.955261492830416610, -0.955246703509324950, -0.955231911800116460, +-0.955217117702828240, -0.955202321217497260, -0.955187522344160490, -0.955172721082854890, -0.955157917433617440, -0.955143111396485220, -0.955128302971495200, -0.955113492158684460, +-0.955098678958089970, -0.955083863369748820, -0.955069045393697970, -0.955054225029974500, -0.955039402278615500, -0.955024577139658050, -0.955009749613139000, -0.954994919699095780, +-0.954980087397565120, -0.954965252708584230, -0.954950415632190300, -0.954935576168420290, -0.954920734317311280, -0.954905890078900480, -0.954891043453224950, -0.954876194440321790, +-0.954861343040228290, -0.954846489252981320, -0.954831633078618070, -0.954816774517175840, -0.954801913568691600, -0.954787050233202650, -0.954772184510746080, -0.954757316401358970, +-0.954742445905078620, -0.954727573021942110, -0.954712697751986750, -0.954697820095249510, -0.954682940051767790, -0.954668057621578800, -0.954653172804719620, -0.954638285601227430, +-0.954623396011139550, -0.954608504034493270, -0.954593609671325670, -0.954578712921674070, -0.954563813785575640, -0.954548912263067710, -0.954534008354187450, -0.954519102058972280, +-0.954504193377459290, -0.954489282309685770, -0.954474368855689040, -0.954459453015506500, -0.954444534789175240, -0.954429614176732780, -0.954414691178216090, -0.954399765793662810, +-0.954384838023110030, -0.954369907866595260, -0.954354975324155590, -0.954340040395828540, -0.954325103081651420, -0.954310163381661410, -0.954295221295896170, -0.954280276824392760, +-0.954265329967188710, -0.954250380724321330, -0.954235429095828040, -0.954220475081746120, -0.954205518682113010, -0.954190559896966110, -0.954175598726342940, -0.954160635170280600, +-0.954145669228816720, -0.954130700901988700, -0.954115730189833870, -0.954100757092389730, -0.954085781609693820, -0.954070803741783320, -0.954055823488695890, -0.954040840850468810, +-0.954025855827139610, -0.954010868418745830, -0.953995878625324870, -0.953980886446914260, -0.953965891883551410, -0.953950894935273850, -0.953935895602119000, -0.953920893884124490, +-0.953905889781327620, -0.953890883293766150, -0.953875874421477370, -0.953860863164499030, -0.953845849522868440, -0.953830833496623230, -0.953815815085800930, -0.953800794290439180, +-0.953785771110575390, -0.953770745546247190, -0.953755717597492000, -0.953740687264347690, -0.953725654546851540, -0.953710619445041320, -0.953695581958954540, -0.953680542088628850, +-0.953665499834101760, -0.953650455195410810, -0.953635408172593960, -0.953620358765688400, -0.953605306974732000, -0.953590252799762280, -0.953575196240817100, -0.953560137297933760, +-0.953545075971150120, -0.953530012260503820, -0.953514946166032500, -0.953499877687773780, -0.953484806825765420, -0.953469733580044940, -0.953454657950650210, -0.953439579937618740, +-0.953424499540988510, -0.953409416760796820, -0.953394331597081650, -0.953379244049880730, -0.953364154119231590, -0.953349061805172200, -0.953333967107740100, -0.953318870026973020, +-0.953303770562908830, -0.953288668715585260, -0.953273564485039860, -0.953258457871310690, -0.953243348874435290, -0.953228237494451620, -0.953213123731397220, -0.953198007585310150, +-0.953182889056227940, -0.953167768144188690, -0.953152644849229790, -0.953137519171389450, -0.953122391110705180, -0.953107260667214960, -0.953092127840956760, -0.953076992631967990, +-0.953061855040286950, -0.953046715065951180, -0.953031572708998630, -0.953016427969467060, -0.953001280847394550, -0.952986131342818730, -0.952970979455777690, -0.952955825186309170, +-0.952940668534451140, -0.952925509500241350, -0.952910348083717770, -0.952895184284918370, -0.952880018103881010, -0.952864849540643540, -0.952849678595244050, -0.952834505267720290, +-0.952819329558110330, -0.952804151466452030, -0.952788970992783260, -0.952773788137142200, -0.952758602899566490, -0.952743415280094430, -0.952728225278763770, -0.952713032895612600, +-0.952697838130678760, -0.952682640984000460, -0.952667441455615440, -0.952652239545561890, -0.952637035253877660, -0.952621828580600960, -0.952606619525769640, -0.952591408089421780, +-0.952576194271595340, -0.952560978072328420, -0.952545759491659090, -0.952530538529625330, -0.952515315186265200, -0.952500089461616790, -0.952484861355718300, -0.952469630868607480, +-0.952454398000322720, -0.952439162750901900, -0.952423925120383210, -0.952408685108804610, -0.952393442716204410, -0.952378197942620460, -0.952362950788091190, -0.952347701252654440, +-0.952332449336348530, -0.952317195039211310, -0.952301938361281300, -0.952286679302596360, -0.952271417863194690, -0.952256154043114480, -0.952240887842394020, -0.952225619261071190, +-0.952210348299184380, -0.952195074956771690, -0.952179799233871300, -0.952164521130521410, -0.952149240646760210, -0.952133957782625990, -0.952118672538156740, -0.952103384913390860, +-0.952088094908366540, -0.952072802523121990, -0.952057507757695380, -0.952042210612125130, -0.952026911086449210, -0.952011609180706150, -0.951996304894933920, -0.951980998229171040, +-0.951965689183455590, -0.951950377757825980, -0.951935063952320410, -0.951919747766977190, -0.951904429201834600, -0.951889108256930850, -0.951873784932304460, -0.951858459227993500, +-0.951843131144036400, -0.951827800680471460, -0.951812467837337190, -0.951797132614671580, -0.951781795012513250, -0.951766455030900290, -0.951751112669871340, -0.951735767929464460, +-0.951720420809718300, -0.951705071310671060, -0.951689719432361140, -0.951674365174826840, -0.951659008538106700, -0.951643649522239010, -0.951628288127262190, -0.951612924353214650, +-0.951597558200134920, -0.951582189668061070, -0.951566818757031860, -0.951551445467085700, -0.951536069798260780, -0.951520691750595840, -0.951505311324128970, -0.951489928518899020, +-0.951474543334944080, -0.951459155772302890, -0.951443765831013750, -0.951428373511115310, -0.951412978812645750, -0.951397581735643930, -0.951382182280148040, -0.951366780446196820, +-0.951351376233828480, -0.951335969643081870, -0.951320560673995170, -0.951305149326607150, -0.951289735600956200, -0.951274319497081080, -0.951258901015019980, -0.951243480154811640, +-0.951228056916494700, -0.951212631300107580, -0.951197203305688910, -0.951181772933277100, -0.951166340182911020, -0.951150905054628960, -0.951135467548469780, -0.951120027664471790, +-0.951104585402673840, -0.951089140763114350, -0.951073693745832060, -0.951058244350865500, -0.951042792578253420, -0.951027338428034220, -0.951011881900246770, -0.950996422994929590, +-0.950980961712121320, -0.950965498051860700, -0.950950032014186260, -0.950934563599136860, -0.950919092806750910, -0.950903619637067380, -0.950888144090124680, -0.950872666165961670, +-0.950857185864616980, -0.950841703186129370, -0.950826218130537360, -0.950810730697880020, -0.950795240888195670, -0.950779748701523380, -0.950764254137901550, -0.950748757197369180, +-0.950733257879964880, -0.950717756185727510, -0.950702252114695720, -0.950686745666908250, -0.950671236842403950, -0.950655725641221580, -0.950640212063399880, -0.950624696108977600, +-0.950609177777993590, -0.950593657070486710, -0.950578133986495600, -0.950562608526059230, -0.950547080689216340, -0.950531550476005680, -0.950516017886466220, -0.950500482920636600, +-0.950484945578555900, -0.950469405860262740, -0.950453863765796210, -0.950438319295194840, -0.950422772448497820, -0.950407223225743780, -0.950391671626971690, -0.950376117652220410, +-0.950360561301528910, -0.950345002574935930, -0.950329441472480440, -0.950313877994201420, -0.950298312140137710, -0.950282743910328190, -0.950267173304811810, -0.950251600323627540, +-0.950236024966814140, -0.950220447234410790, -0.950204867126456240, -0.950189284642989570, -0.950173699784049750, -0.950158112549675640, -0.950142522939906200, -0.950126930954780510, +-0.950111336594337440, -0.950095739858616060, -0.950080140747655340, -0.950064539261494260, -0.950048935400171770, -0.950033329163727070, -0.950017720552198910, -0.950002109565626470, +-0.949986496204048850, -0.949970880467505000, -0.949955262356033890, -0.949939641869674610, -0.949924019008466240, -0.949908393772447850, -0.949892766161658410, -0.949877136176137120, +-0.949861503815922940, -0.949845869081055060, -0.949830231971572460, -0.949814592487514320, -0.949798950628919720, -0.949783306395827640, -0.949767659788277370, -0.949752010806307890, +-0.949736359449958490, -0.949720705719268140, -0.949705049614275930, -0.949689391135021270, -0.949673730281543000, -0.949658067053880450, -0.949642401452072680, -0.949626733476159000, +-0.949611063126178490, -0.949595390402170230, -0.949579715304173510, -0.949564037832227650, -0.949548357986371490, -0.949532675766644570, -0.949516991173085860, -0.949501304205734860, +-0.949485614864630350, -0.949469923149812050, -0.949454229061318710, -0.949438532599189980, -0.949422833763464810, -0.949407132554182630, -0.949391428971382510, -0.949375723015103870, +-0.949360014685386000, -0.949344303982267990, -0.949328590905789360, -0.949312875455989080, -0.949297157632906670, -0.949281437436581440, -0.949265714867052580, -0.949249989924359380, +-0.949234262608541270, -0.949218532919637430, -0.949202800857687380, -0.949187066422730210, -0.949171329614805440, -0.949155590433952260, -0.949139848880210190, -0.949124104953618430, +-0.949108358654216500, -0.949092609982043590, -0.949076858937139220, -0.949061105519542700, -0.949045349729293330, -0.949029591566430740, -0.949013831030994020, -0.948998068123022790, +-0.948982302842556360, -0.948966535189634250, -0.948950765164295770, -0.948934992766580330, -0.948919217996527450, -0.948903440854176550, -0.948887661339566920, -0.948871879452738320, +-0.948856095193729930, -0.948840308562581280, -0.948824519559331890, -0.948808728184021180, -0.948792934436688660, -0.948777138317373870, -0.948761339826116100, -0.948745538962954990, +-0.948729735727930180, -0.948713930121080850, -0.948698122142446860, -0.948682311792067520, -0.948666499069982350, -0.948650683976230980, -0.948634866510852940, -0.948619046673887630, +-0.948603224465374820, -0.948587399885353790, -0.948571572933864400, -0.948555743610945970, -0.948539911916638330, -0.948524077850980700, -0.948508241414013130, -0.948492402605774720, +-0.948476561426305430, -0.948460717875644680, -0.948444871953832200, -0.948429023660907530, -0.948413172996910190, -0.948397319961880040, -0.948381464555856590, -0.948365606778879490, +-0.948349746630988260, -0.948333884112222750, -0.948318019222622490, -0.948302151962227340, -0.948286282331076590, -0.948270410329210220, -0.948254535956667870, -0.948238659213489150, +-0.948222780099713720, -0.948206898615381430, -0.948191014760531800, -0.948175128535204800, -0.948159239939439850, -0.948143348973276790, -0.948127455636755380, -0.948111559929915360, +-0.948095661852796370, -0.948079761405438260, -0.948063858587880780, -0.948047953400163680, -0.948032045842326700, -0.948016135914409470, -0.948000223616452090, -0.947984308948493950, +-0.947968391910575250, -0.947952472502735400, -0.947936550725014480, -0.947920626577452020, -0.947904700060088200, -0.947888771172962440, -0.947872839916114930, -0.947856906289585190, +-0.947840970293413300, -0.947825031927638890, -0.947809091192301940, -0.947793148087442190, -0.947777202613099610, -0.947761254769314170, -0.947745304556125380, -0.947729351973573440, +-0.947713397021698100, -0.947697439700539320, -0.947681480010136860, -0.947665517950530780, -0.947649553521760830, -0.947633586723866990, -0.947617617556889220, -0.947601646020867490, +-0.947585672115841550, -0.947569695841851470, -0.947553717198937000, -0.947537736187138440, -0.947521752806495420, -0.947505767057048140, -0.947489778938836240, -0.947473788451900110, +-0.947457795596279410, -0.947441800372014090, -0.947425802779144450, -0.947409802817710260, -0.947393800487751570, -0.947377795789308360, -0.947361788722420720, -0.947345779287128490, +-0.947329767483471970, -0.947313753311490920, -0.947297736771225530, -0.947281717862715760, -0.947265696586001680, -0.947249672941123390, -0.947233646928120950, -0.947217618547034350, +-0.947201587797903750, -0.947185554680769150, -0.947169519195670720, -0.947153481342648320, -0.947137441121742360, -0.947121398532992820, -0.947105353576439660, -0.947089306252123290, +-0.947073256560083450, -0.947057204500360680, -0.947041150072994720, -0.947025093278025980, -0.947009034115494530, -0.946992972585440460, -0.946976908687903850, -0.946960842422925110, +-0.946944773790544200, -0.946928702790801440, -0.946912629423736880, -0.946896553689390740, -0.946880475587803190, -0.946864395119014430, -0.946848312283064760, -0.946832227079994260, +-0.946816139509843220, -0.946800049572651740, -0.946783957268460320, -0.946767862597308830, -0.946751765559237790, -0.946735666154287280, -0.946719564382497600, -0.946703460243909060, +-0.946687353738561830, -0.946671244866496230, -0.946655133627752550, -0.946639020022370990, -0.946622904050391960, -0.946606785711855530, -0.946590665006802220, -0.946574541935272240, +-0.946558416497305990, -0.946542288692943550, -0.946526158522225550, -0.946510025985191960, -0.946493891081883420, -0.946477753812340120, -0.946461614176602460, -0.946445472174710760, +-0.946429327806705410, -0.946413181072626730, -0.946397031972515010, -0.946380880506410780, -0.946364726674354340, -0.946348570476386100, -0.946332411912546470, -0.946316250982875750, +-0.946300087687414360, -0.946283922026202930, -0.946267753999281540, -0.946251583606690820, -0.946235410848471070, -0.946219235724662930, -0.946203058235306590, -0.946186878380442580, +-0.946170696160111400, -0.946154511574353490, -0.946138324623209350, -0.946122135306719400, -0.946105943624924060, -0.946089749577863850, -0.946073553165579400, -0.946057354388110890, +-0.946041153245499090, -0.946024949737784390, -0.946008743865007330, -0.945992535627208310, -0.945976325024428080, -0.945960112056706940, -0.945943896724085630, -0.945927679026604570, +-0.945911458964304290, -0.945895236537225290, -0.945879011745408230, -0.945862784588893610, -0.945846555067722080, -0.945830323181934160, -0.945814088931570480, -0.945797852316671570, +-0.945781613337277950, -0.945765371993430360, -0.945749128285169330, -0.945732882212535490, -0.945716633775569360, -0.945700382974311690, -0.945684129808803120, -0.945667874279084160, +-0.945651616385195570, -0.945635356127177970, -0.945619093505071890, -0.945602828518918080, -0.945586561168757280, -0.945570291454630010, -0.945554019376577020, -0.945537744934639050, +-0.945521468128856620, -0.945505188959270490, -0.945488907425921510, -0.945472623528850200, -0.945456337268097300, -0.945440048643703570, -0.945423757655709850, -0.945407464304156560, +-0.945391168589084670, -0.945374870510534930, -0.945358570068547950, -0.945342267263164500, -0.945325962094425540, -0.945309654562371480, -0.945293344667043400, -0.945277032408481930, +-0.945260717786727930, -0.945244400801822040, -0.945228081453805210, -0.945211759742718090, -0.945195435668601760, -0.945179109231496620, -0.945162780431443860, -0.945146449268484120, +-0.945130115742658150, -0.945113779854007020, -0.945097441602571360, -0.945081100988392260, -0.945064758011510240, -0.945048412671966380, -0.945032064969801410, -0.945015714905056430, +-0.944999362477772050, -0.944983007687989370, -0.944966650535749020, -0.944950291021092180, -0.944933929144059490, -0.944917564904692140, -0.944901198303030650, -0.944884829339116330, +-0.944868458012989910, -0.944852084324692250, -0.944835708274264550, -0.944819329861747440, -0.944802949087182100, -0.944786565950609390, -0.944770180452070170, -0.944753792591605520, +-0.944737402369256520, -0.944721009785063900, -0.944704614839068760, -0.944688217531312050, -0.944671817861834960, -0.944655415830678140, -0.944639011437882870, -0.944622604683490020, +-0.944606195567540770, -0.944589784090075880, -0.944573370251136630, -0.944556954050763900, -0.944540535488998860, -0.944524114565882480, -0.944507691281455730, -0.944491265635759800, +-0.944474837628835660, -0.944458407260724500, -0.944441974531467280, -0.944425539441105190, -0.944409101989679090, -0.944392662177230390, -0.944376220003799950, -0.944359775469429060, +-0.944343328574158590, -0.944326879318029940, -0.944310427701083980, -0.944293973723361990, -0.944277517384905060, -0.944261058685754380, -0.944244597625951030, -0.944228134205536200, +-0.944211668424551060, -0.944195200283036610, -0.944178729781034340, -0.944162256918585130, -0.944145781695730270, -0.944129304112511060, -0.944112824168968470, -0.944096341865143910, +-0.944079857201078450, -0.944063370176813410, -0.944046880792389850, -0.944030389047849080, -0.944013894943232510, -0.943997398478581000, -0.943980899653936170, -0.943964398469338880, +-0.943947894924830780, -0.943931389020452930, -0.943914880756246520, -0.943898370132252970, -0.943881857148513470, -0.943865341805069310, -0.943848824101961800, -0.943832304039232240, +-0.943815781616921920, -0.943799256835072150, -0.943782729693724230, -0.943766200192919570, -0.943749668332699240, -0.943733134113104890, -0.943716597534177580, -0.943700058595958960, +-0.943683517298489980, -0.943666973641812400, -0.943650427625967180, -0.943633879250996070, -0.943617328516940250, -0.943600775423841020, -0.943584219971739910, -0.943567662160678220, +-0.943551101990697360, -0.943534539461838740, -0.943517974574143880, -0.943501407327653970, -0.943484837722410540, -0.943468265758455100, -0.943451691435828970, -0.943435114754573530, +-0.943418535714730440, -0.943401954316340880, -0.943385370559446490, -0.943368784444088670, -0.943352195970308950, -0.943335605138148630, -0.943319011947649440, -0.943302416398852590, +-0.943285818491799710, -0.943269218226532310, -0.943252615603091930, -0.943236010621519960, -0.943219403281857940, -0.943202793584147380, -0.943186181528429920, -0.943169567114746980, +-0.943152950343140060, -0.943136331213650920, -0.943119709726320750, -0.943103085881191520, -0.943086459678304400, -0.943069831117701260, -0.943053200199423400, -0.943036566923512680, +-0.943019931290010490, -0.943003293298958490, -0.942986652950398190, -0.942970010244371330, -0.942953365180919430, -0.942936717760084140, -0.942920067981906970, -0.942903415846429670, +-0.942886761353693870, -0.942870104503741090, -0.942853445296613080, -0.942836783732351470, -0.942820119810997890, -0.942803453532593980, -0.942786784897181600, -0.942770113904802140, +-0.942753440555497370, -0.942736764849309020, -0.942720086786278830, -0.942703406366448230, -0.942686723589859280, -0.942670038456553510, -0.942653350966572660, -0.942636661119958360, +-0.942619968916752480, -0.942603274356996530, -0.942586577440732600, -0.942569878168002080, -0.942553176538846960, -0.942536472553308860, -0.942519766211429520, -0.942503057513250810, +-0.942486346458814460, -0.942469633048162340, -0.942452917281335960, -0.942436199158377400, -0.942419478679328290, -0.942402755844230500, -0.942386030653125870, -0.942369303106056160, +-0.942352573203063090, -0.942335840944188650, -0.942319106329474690, -0.942302369358962830, -0.942285630032695170, -0.942268888350713320, -0.942252144313059260, -0.942235397919774950, +-0.942218649170902030, -0.942201898066482580, -0.942185144606558330, -0.942168388791171150, -0.942151630620363110, -0.942134870094175960, -0.942118107212651660, -0.942101341975832060, +-0.942084574383759140, -0.942067804436474750, -0.942051032134020860, -0.942034257476439320, -0.942017480463772320, -0.942000701096061380, -0.941983919373348910, -0.941967135295676440, +-0.941950348863086370, -0.941933560075620240, -0.941916768933320330, -0.941899975436228390, -0.941883179584386500, -0.941866381377836740, -0.941849580816620960, -0.941832777900781350, +-0.941815972630359650, -0.941799165005398060, -0.941782355025938540, -0.941765542692023280, -0.941748728003694020, -0.941731910960993070, -0.941715091563962160, -0.941698269812643710, +-0.941681445707079460, -0.941664619247311600, -0.941647790433382200, -0.941630959265333360, -0.941614125743207130, -0.941597289867045610, -0.941580451636890750, -0.941563611052784850, +-0.941546768114769890, -0.941529922822888050, -0.941513075177181300, -0.941496225177691940, -0.941479372824462040, -0.941462518117533680, -0.941445661056949050, -0.941428801642750220, +-0.941411939874979400, -0.941395075753678760, -0.941378209278890490, -0.941361340450656560, -0.941344469269019380, -0.941327595734020920, -0.941310719845703580, -0.941293841604109450, +-0.941276961009280710, -0.941260078061259440, -0.941243192760088050, -0.941226305105808740, -0.941209415098463680, -0.941192522738094950, -0.941175628024744970, -0.941158730958455920, +-0.941141831539270000, -0.941124929767229610, -0.941108025642376830, -0.941091119164754080, -0.941074210334403420, -0.941057299151367270, -0.941040385615687810, -0.941023469727407580, +-0.941006551486568420, -0.940989630893213080, -0.940972707947383520, -0.940955782649122390, -0.940938854998471630, -0.940921924995473780, -0.940904992640171020, -0.940888057932605990, +-0.940871120872820650, -0.940854181460857640, -0.940837239696759030, -0.940820295580567350, -0.940803349112324990, -0.940786400292074170, -0.940769449119857490, -0.940752495595717050, +-0.940735539719695480, -0.940718581491834960, -0.940701620912178130, -0.940684657980767060, -0.940667692697644500, -0.940650725062852630, -0.940633755076434100, -0.940616782738430970, +-0.940599808048885990, -0.940582831007841460, -0.940565851615339900, -0.940548869871423610, -0.940531885776135220, -0.940514899329517150, -0.940497910531611800, -0.940480919382461590, +-0.940463925882109140, -0.940446930030596980, -0.940429931827967300, -0.940412931274262950, -0.940395928369526240, -0.940378923113799670, -0.940361915507125780, -0.940344905549547190, +-0.940327893241106220, -0.940310878581845590, -0.940293861571807720, -0.940276842211035360, -0.940259820499570690, -0.940242796437456560, -0.940225770024735400, -0.940208741261449820, +-0.940191710147642470, -0.940174676683355750, -0.940157640868632290, -0.940140602703514850, -0.940123562188045820, -0.940106519322267960, -0.940089474106223790, -0.940072426539955820, +-0.940055376623507020, -0.940038324356919590, -0.940021269740236360, -0.940004212773499990, -0.939987153456753100, -0.939970091790038320, -0.939953027773398290, -0.939935961406875740, +-0.939918892690513320, -0.939901821624353540, -0.939884748208439260, -0.939867672442813110, -0.939850594327517830, -0.939833513862595950, -0.939816431048090430, -0.939799345884043790, +-0.939782258370498670, -0.939765168507498030, -0.939748076295084390, -0.939730981733300720, -0.939713884822189430, -0.939696785561793480, -0.939679683952155510, -0.939662579993318480, +-0.939645473685324810, -0.939628365028217560, -0.939611254022039380, -0.939594140666833110, -0.939577024962641390, -0.939559906909507300, -0.939542786507473250, -0.939525663756582310, +-0.939508538656877220, -0.939491411208400740, -0.939474281411195710, -0.939457149265304990, -0.939440014770771550, -0.939422877927637900, -0.939405738735947130, -0.939388597195741970, +-0.939371453307065400, -0.939354307069960040, -0.939337158484469080, -0.939320007550635160, -0.939302854268501240, -0.939285698638110070, -0.939268540659504820, -0.939251380332728150, +-0.939234217657823000, -0.939217052634832350, -0.939199885263799050, -0.939182715544765960, -0.939165543477776250, -0.939148369062872580, -0.939131192300098010, -0.939114013189495390, +-0.939096831731107810, -0.939079647924978110, -0.939062461771149270, -0.939045273269664360, -0.939028082420566230, -0.939010889223897970, -0.938993693679702310, -0.938976495788022560, +-0.938959295548901560, -0.938942092962382290, -0.938924888028507710, -0.938907680747321120, -0.938890471118865140, -0.938873259143183090, -0.938856044820317810, -0.938838828150312500, +-0.938821609133210000, -0.938804387769053620, -0.938787164057886090, -0.938769937999750840, -0.938752709594690590, -0.938735478842748660, -0.938718245743968010, -0.938701010298391810, +-0.938683772506063050, -0.938666532367024800, -0.938649289881320240, -0.938632045048992450, -0.938614797870084620, -0.938597548344639710, -0.938580296472701030, -0.938563042254311530, +-0.938545785689514410, -0.938528526778352860, -0.938511265520870050, -0.938494001917108970, -0.938476735967112900, -0.938459467670925030, -0.938442197028588550, -0.938424924040146440, +-0.938407648705642080, -0.938390371025118690, -0.938373090998619210, -0.938355808626187170, -0.938338523907865430, -0.938321236843697500, -0.938303947433726470, -0.938286655677995630, +-0.938269361576547940, -0.938252065129427050, -0.938234766336675910, -0.938217465198337930, -0.938200161714456190, -0.938182855885074110, -0.938165547710234860, -0.938148237189981750, +-0.938130924324358070, -0.938113609113407130, -0.938096291557172000, -0.938078971655696310, -0.938061649409023040, -0.938044324817195680, -0.938026997880257670, -0.938009668598251970, +-0.937992336971222200, -0.937975002999211550, -0.937957666682263440, -0.937940328020421150, -0.937922987013728000, -0.937905643662227400, -0.937888297965962740, -0.937870949924977330, +-0.937853599539314460, -0.937836246809017670, -0.937818891734130240, -0.937801534314695480, -0.937784174550757130, -0.937766812442358160, -0.937749447989542180, -0.937732081192352520, +-0.937714712050832790, -0.937697340565026180, -0.937679966734976220, -0.937662590560726540, -0.937645212042320100, -0.937627831179800860, -0.937610447973211910, -0.937593062422596880, +-0.937575674527999170, -0.937558284289462310, -0.937540891707029700, -0.937523496780744870, -0.937506099510651340, -0.937488699896792620, -0.937471297939212020, -0.937453893637953170, +-0.937436486993059590, -0.937419078004574910, -0.937401666672542430, -0.937384252997005900, -0.937366836978008600, -0.937349418615594290, -0.937331997909806370, -0.937314574860688480, +-0.937297149468284240, -0.937279721732636960, -0.937262291653790490, -0.937244859231788240, -0.937227424466673950, -0.937209987358491040, -0.937192547907283120, -0.937175106113093850, +-0.937157661975966840, -0.937140215495945620, -0.937122766673073930, -0.937105315507395290, -0.937087861998953440, -0.937070406147791800, -0.937052947953954220, -0.937035487417484210, +-0.937018024538425530, -0.937000559316821800, -0.936983091752716660, -0.936965621846153840, -0.936948149597176870, -0.936930675005829610, -0.936913198072155560, -0.936895718796198600, +-0.936878237178002340, -0.936860753217610530, -0.936843266915066700, -0.936825778270414800, -0.936808287283698470, -0.936790793954961340, -0.936773298284247270, -0.936755800271599990, +-0.936738299917063140, -0.936720797220680690, -0.936703292182496040, -0.936685784802553380, -0.936668275080896010, -0.936650763017568110, -0.936633248612613320, -0.936615731866075270, +-0.936598212777998040, -0.936580691348425140, -0.936563167577400660, -0.936545641464968210, -0.936528113011171670, -0.936510582216054770, -0.936493049079661470, -0.936475513602035510, +-0.936457975783220880, -0.936440435623261180, -0.936422893122200510, -0.936405348280082480, -0.936387801096951190, -0.936370251572850250, -0.936352699707823870, -0.936335145501915660, +-0.936317588955169590, -0.936300030067629520, -0.936282468839339300, -0.936264905270343010, -0.936247339360684490, -0.936229771110407620, -0.936212200519556230, -0.936194627588174400, +-0.936177052316305990, -0.936159474703994960, -0.936141894751285180, -0.936124312458220810, -0.936106727824845500, -0.936089140851203430, -0.936071551537338560, -0.936053959883294760, +-0.936036365889115980, -0.936018769554846420, -0.936001170880529920, -0.935983569866210450, -0.935965966511932090, -0.935948360817738690, -0.935930752783674550, -0.935913142409783520, +-0.935895529696109560, -0.935877914642696760, -0.935860297249589300, -0.935842677516830920, -0.935825055444466040, -0.935807431032538380, -0.935789804281092150, -0.935772175190171420, +-0.935754543759820370, -0.935736909990082850, -0.935719273881003070, -0.935701635432625080, -0.935683994644993080, -0.935666351518151030, -0.935648706052143120, -0.935631058247013430, +-0.935613408102806130, -0.935595755619565210, -0.935578100797334940, -0.935560443636159530, -0.935542784136082940, -0.935525122297149460, -0.935507458119403060, -0.935489791602888030, +-0.935472122747648570, -0.935454451553728750, -0.935436778021172870, -0.935419102150024990, -0.935401423940329320, -0.935383743392130260, -0.935366060505471660, -0.935348375280398050, +-0.935330687716953380, -0.935312997815182070, -0.935295305575128190, -0.935277610996836150, -0.935259914080350030, -0.935242214825714010, -0.935224513232972620, -0.935206809302169930, +-0.935189103033350120, -0.935171394426557610, -0.935153683481836700, -0.935135970199231450, -0.935118254578786390, -0.935100536620545600, -0.935082816324553480, -0.935065093690854330, +-0.935047368719492460, -0.935029641410512150, -0.935011911763957810, -0.934994179779873540, -0.934976445458303940, -0.934958708799293210, -0.934940969802885770, -0.934923228469125790, +-0.934905484798057800, -0.934887738789726090, -0.934869990444174960, -0.934852239761448930, -0.934834486741592310, -0.934816731384649380, -0.934798973690664670, -0.934781213659682590, +-0.934763451291747430, -0.934745686586903710, -0.934727919545195630, -0.934710150166667920, -0.934692378451364660, -0.934674604399330590, -0.934656828010610010, -0.934639049285247330, +-0.934621268223286950, -0.934603484824773510, -0.934585699089751310, -0.934567911018264860, -0.934550120610358580, -0.934532327866077090, -0.934514532785464700, -0.934496735368566030, +-0.934478935615425610, -0.934461133526087620, -0.934443329100597020, -0.934425522338998000, -0.934407713241335200, -0.934389901807653130, -0.934372088037996210, -0.934354271932409160, +-0.934336453490936410, -0.934318632713622590, -0.934300809600512090, -0.934282984151649560, -0.934265156367079630, -0.934247326246846810, -0.934229493790995740, -0.934211658999570820, +-0.934193821872616790, -0.934175982410178190, -0.934158140612299630, -0.934140296479025740, -0.934122450010401060, -0.934104601206470320, -0.934086750067278040, -0.934068896592868960, +-0.934051040783287490, -0.934033182638578600, -0.934015322158786580, -0.933997459343956390, -0.933979594194132460, -0.933961726709359620, -0.933943856889682400, -0.933925984735145650, +-0.933908110245793790, -0.933890233421671770, -0.933872354262824110, -0.933854472769295560, -0.933836588941130860, -0.933818702778374750, -0.933800814281071760, -0.933782923449266720, +-0.933765030283004500, -0.933747134782329510, -0.933729236947286930, -0.933711336777921060, -0.933693434274276980, -0.933675529436399200, -0.933657622264332690, -0.933639712758122080, +-0.933621800917812220, -0.933603886743447850, -0.933585970235073730, -0.933568051392734690, -0.933550130216475590, -0.933532206706341070, -0.933514280862376090, -0.933496352684625390, +-0.933478422173133930, -0.933460489327946230, -0.933442554149107370, -0.933424616636662100, -0.933406676790655250, -0.933388734611131920, -0.933370790098136500, -0.933352843251714300, +-0.933334894071909840, -0.933316942558768290, -0.933298988712334300, -0.933281032532652820, -0.933263074019768820, -0.933245113173727160, -0.933227149994572570, -0.933209184482350240, +-0.933191216637104910, -0.933173246458881560, -0.933155273947725020, -0.933137299103680370, -0.933119321926792480, -0.933101342417106290, -0.933083360574666680, -0.933065376399518590, +-0.933047389891707210, -0.933029401051277300, -0.933011409878273910, -0.932993416372742020, -0.932975420534726600, -0.932957422364272480, -0.932939421861424980, -0.932921419026228830, +-0.932903413858729210, -0.932885406358970990, -0.932867396526999240, -0.932849384362859020, -0.932831369866595430, -0.932813353038253300, -0.932795333877877830, -0.932777312385513980, +-0.932759288561206930, -0.932741262405001550, -0.932723233916943010, -0.932705203097076500, -0.932687169945446980, -0.932669134462099540, -0.932651096647079130, -0.932633056500431160, +-0.932615014022200370, -0.932596969212432180, -0.932578922071171550, -0.932560872598463540, -0.932542820794353360, -0.932524766658886280, -0.932506710192107070, -0.932488651394061230, +-0.932470590264793620, -0.932452526804349760, -0.932434461012774380, -0.932416392890112910, -0.932398322436410520, -0.932380249651712290, -0.932362174536063400, -0.932344097089509050, +-0.932326017312094520, -0.932307935203864900, -0.932289850764865480, -0.932271763995141440, -0.932253674894737980, -0.932235583463700280, -0.932217489702073740, -0.932199393609903340, +-0.932181295187234580, -0.932163194434112440, -0.932145091350582430, -0.932126985936689630, -0.932108878192479450, -0.932090768117996960, -0.932072655713287680, -0.932054540978396680, +-0.932036423913369380, -0.932018304518250960, -0.932000182793086720, -0.931982058737922170, -0.931963932352802390, -0.931945803637772800, -0.931927672592878680, -0.931909539218165440, +-0.931891403513678270, -0.931873265479462700, -0.931855125115563900, -0.931836982422027280, -0.931818837398898150, -0.931800690046222010, -0.931782540364044180, -0.931764388352409930, +-0.931746234011364690, -0.931728077340953980, -0.931709918341222960, -0.931691757012217180, -0.931673593353981920, -0.931655427366562820, -0.931637259050005050, -0.931619088404354150, +-0.931600915429655620, -0.931582740125954770, -0.931564562493297000, -0.931546382531727830, -0.931528200241292790, -0.931510015622037170, -0.931491828674006590, -0.931473639397246370, +-0.931455447791802120, -0.931437253857719140, -0.931419057595043180, -0.931400859003819410, -0.931382658084093600, -0.931364454835911130, -0.931346249259317530, -0.931328041354358200, +-0.931309831121078900, -0.931291618559524910, -0.931273403669741980, -0.931255186451775520, -0.931236966905671040, -0.931218745031474170, -0.931200520829230440, -0.931182294298985470, +-0.931164065440784670, -0.931145834254673790, -0.931127600740698220, -0.931109364898903720, -0.931091126729335810, -0.931072886232040100, -0.931054643407062120, -0.931036398254447620, +-0.931018150774241990, -0.930999900966491100, -0.930981648831240350, -0.930963394368535590, -0.930945137578422340, -0.930926878460946240, -0.930908617016152800, -0.930890353244087860, +-0.930872087144797190, -0.930853818718326180, -0.930835547964720680, -0.930817274884026320, -0.930798999476288750, -0.930780721741553570, -0.930762441679866770, -0.930744159291273740, +-0.930725874575820460, -0.930707587533552320, -0.930689298164515290, -0.930671006468755000, -0.930652712446317310, -0.930634416097247620, -0.930616117421592120, -0.930597816419396100, +-0.930579513090705750, -0.930561207435566470, -0.930542899454024240, -0.930524589146124680, -0.930506276511913640, -0.930487961551437090, -0.930469644264740440, -0.930451324651869860, +-0.930433002712870880, -0.930414678447789360, -0.930396351856671130, -0.930378022939562180, -0.930359691696508010, -0.930341358127554700, -0.930323022232747880, -0.930304684012133620, +-0.930286343465757560, -0.930268000593665770, -0.930249655395903870, -0.930231307872517840, -0.930212958023553530, -0.930194605849056890, -0.930176251349073670, -0.930157894523649830, +-0.930139535372831340, -0.930121173896663930, -0.930102810095193580, -0.930084443968466230, -0.930066075516527760, -0.930047704739424110, -0.930029331637201250, -0.930010956209905040, +-0.929992578457581430, -0.929974198380276280, -0.929955815978035780, -0.929937431250905670, -0.929919044198932010, -0.929900654822160670, -0.929882263120637820, -0.929863869094409100, +-0.929845472743520920, -0.929827074068019010, -0.929808673067949340, -0.929790269743357990, -0.929771864094291020, -0.929753456120794410, -0.929735045822914110, -0.929716633200696200, +-0.929698218254186750, -0.929679800983431730, -0.929661381388477200, -0.929642959469369260, -0.929624535226153850, -0.929606108658877160, -0.929587679767585160, -0.929569248552324030, +-0.929550815013139630, -0.929532379150078360, -0.929513940963186070, -0.929495500452508950, -0.929477057618092960, -0.929458612459984510, -0.929440164978229340, -0.929421715172873860, +-0.929403263043964150, -0.929384808591546150, -0.929366351815666290, -0.929347892716370420, -0.929329431293704930, -0.929310967547715690, -0.929292501478449220, -0.929274033085951360, +-0.929255562370268520, -0.929237089331446780, -0.929218613969532200, -0.929200136284571210, -0.929181656276609870, -0.929163173945694250, -0.929144689291870880, -0.929126202315185610, +-0.929107713015684960, -0.929089221393414990, -0.929070727448422010, -0.929052231180752090, -0.929033732590451630, -0.929015231677566940, -0.928996728442144090, -0.928978222884229380, +-0.928959715003869200, -0.928941204801109750, -0.928922692275997220, -0.928904177428578000, -0.928885660258898290, -0.928867140767004500, -0.928848618952942790, -0.928830094816759600, +-0.928811568358501090, -0.928793039578213690, -0.928774508475943670, -0.928755975051737460, -0.928737439305641230, -0.928718901237701510, -0.928700360847964480, -0.928681818136476540, +-0.928663273103284000, -0.928644725748433260, -0.928626176071970840, -0.928607624073942930, -0.928589069754395920, -0.928570513113376240, -0.928551954150930390, -0.928533392867104460, +-0.928514829261945170, -0.928496263335498840, -0.928477695087811860, -0.928459124518930530, -0.928440551628901490, -0.928421976417770910, -0.928403398885585540, -0.928384819032391670, +-0.928366236858235720, -0.928347652363164190, -0.928329065547223500, -0.928310476410460160, -0.928291884952920590, -0.928273291174651400, -0.928254695075698910, -0.928236096656109730, +-0.928217495915930280, -0.928198892855207070, -0.928180287473986620, -0.928161679772315560, -0.928143069750240190, -0.928124457407807250, -0.928105842745063030, -0.928087225762054380, +-0.928068606458827490, -0.928049984835429220, -0.928031360891905850, -0.928012734628304250, -0.927994106044670590, -0.927975475141051830, -0.927956841917494390, -0.927938206374044780, +-0.927919568510749640, -0.927900928327655580, -0.927882285824809250, -0.927863641002257160, -0.927844993860046040, -0.927826344398222420, -0.927807692616832940, -0.927789038515924090, +-0.927770382095542860, -0.927751723355735520, -0.927733062296548950, -0.927714398918029650, -0.927695733220224470, -0.927677065203179830, -0.927658394866942680, -0.927639722211559440, +-0.927621047237076950, -0.927602369943541730, -0.927583690331000630, -0.927565008399500290, -0.927546324149087440, -0.927527637579808830, -0.927508948691711080, -0.927490257484841040, +-0.927471563959245240, -0.927452868114970630, -0.927434169952063850, -0.927415469470571630, -0.927396766670540610, -0.927378061552017850, -0.927359354115049880, -0.927340644359683550, +-0.927321932285965490, -0.927303217893942770, -0.927284501183661790, -0.927265782155169750, -0.927247060808513160, -0.927228337143738980, -0.927209611160893840, -0.927190882860024820, +-0.927172152241178550, -0.927153419304401760, -0.927134684049741640, -0.927115946477244600, -0.927097206586957930, -0.927078464378928050, -0.927059719853202120, -0.927040973009826800, +-0.927022223848849140, -0.927003472370315880, -0.926984718574273890, -0.926965962460770120, -0.926947204029851530, -0.926928443281564870, -0.926909680215957100, -0.926890914833075170, +-0.926872147132965950, -0.926853377115676280, -0.926834604781253240, -0.926815830129743670, -0.926797053161194540, -0.926778273875652700, -0.926759492273165230, -0.926740708353779090, +-0.926721922117541120, -0.926703133564498400, -0.926684342694697680, -0.926665549508186360, -0.926646754005010950, -0.926627956185218760, -0.926609156048856630, -0.926590353595971640, +-0.926571548826610750, -0.926552741740821030, -0.926533932338649450, -0.926515120620143070, -0.926496306585348760, -0.926477490234313810, -0.926458671567085060, -0.926439850583709700, +-0.926421027284234590, -0.926402201668707010, -0.926383373737173940, -0.926364543489682330, -0.926345710926279490, -0.926326876047012250, -0.926308038851927920, -0.926289199341073450, +-0.926270357514496050, -0.926251513372242650, -0.926232666914360570, -0.926213818140896760, -0.926194967051898410, -0.926176113647412700, -0.926157257927486600, -0.926138399892167400, +-0.926119539541502280, -0.926100676875538210, -0.926081811894322480, -0.926062944597902280, -0.926044074986324680, -0.926025203059636760, -0.926006328817885920, -0.925987452261119340, +-0.925968573389384100, -0.925949692202727380, -0.925930808701196480, -0.925911922884838590, -0.925893034753700770, -0.925874144307830440, -0.925855251547274770, -0.925836356472080960, +-0.925817459082296180, -0.925798559377967840, -0.925779657359143030, -0.925760753025869130, -0.925741846378193340, -0.925722937416162960, -0.925704026139825160, -0.925685112549227470, +-0.925666196644416850, -0.925647278425440700, -0.925628357892346430, -0.925609435045181230, -0.925590509883992500, -0.925571582408827420, -0.925552652619733520, -0.925533720516757860, +-0.925514786099947970, -0.925495849369351030, -0.925476910325014560, -0.925457968966985730, -0.925439025295312080, -0.925420079310040780, -0.925401131011219350, -0.925382180398894970, +-0.925363227473115280, -0.925344272233927460, -0.925325314681379020, -0.925306354815517150, -0.925287392636389480, -0.925268428144043310, -0.925249461338526040, -0.925230492219885290, +-0.925211520788168150, -0.925192547043422240, -0.925173570985694970, -0.925154592615033740, -0.925135611931486080, -0.925116628935099380, -0.925097643625921060, -0.925078656003998740, +-0.925059666069379730, -0.925040673822111530, -0.925021679262241660, -0.925002682389817530, -0.924983683204886780, -0.924964681707496790, -0.924945677897695110, -0.924926671775529230, +-0.924907663341046680, -0.924888652594294870, -0.924869639535321530, -0.924850624164174070, -0.924831606480900130, -0.924812586485547090, -0.924793564178162610, -0.924774539558794180, +-0.924755512627489450, -0.924736483384295930, -0.924717451829261240, -0.924698417962432790, -0.924679381783858450, -0.924660343293585480, -0.924641302491661770, -0.924622259378134800, +-0.924603213953052230, -0.924584166216461560, -0.924565116168410530, -0.924546063808946550, -0.924527009138117580, -0.924507952155971040, -0.924488892862554530, -0.924469831257915930, +-0.924450767342102630, -0.924431701115162490, -0.924412632577143010, -0.924393561728092060, -0.924374488568057150, -0.924355413097086130, -0.924336335315226410, -0.924317255222525950, +-0.924298172819032260, -0.924279088104793310, -0.924260001079856510, -0.924240911744269810, -0.924221820098080630, -0.924202726141337140, -0.924183629874086640, -0.924164531296377210, +-0.924145430408256360, -0.924126327209771950, -0.924107221700971700, -0.924088113881903370, -0.924069003752614910, -0.924049891313153850, -0.924030776563568020, -0.924011659503905290, +-0.923992540134213500, -0.923973418454540170, -0.923954294464933490, -0.923935168165440860, -0.923916039556110570, -0.923896908636989920, -0.923877775408127210, -0.923858639869569950, +-0.923839502021366110, -0.923820361863563530, -0.923801219396210070, -0.923782074619353470, -0.923762927533041790, -0.923743778137322670, -0.923724626432244180, -0.923705472417854170, +-0.923686316094200380, -0.923667157461330880, -0.923647996519293410, -0.923628833268136050, -0.923609667707906530, -0.923590499838652930, -0.923571329660422990, -0.923552157173264780, +-0.923532982377226030, -0.923513805272355050, -0.923494625858699350, -0.923475444136307330, -0.923456260105226520, -0.923437073765505100, -0.923417885117190920, -0.923398694160332160, +-0.923379500894976560, -0.923360305321172300, -0.923341107438967250, -0.923321907248409350, -0.923302704749546790, -0.923283499942427310, -0.923264292827099320, -0.923245083403610440, +-0.923225871672008870, -0.923206657632342660, -0.923187441284659790, -0.923168222629008330, -0.923149001665436340, -0.923129778393991680, -0.923110552814722760, -0.923091324927677430, +-0.923072094732903750, -0.923052862230449800, -0.923033627420363770, -0.923014390302693610, -0.922995150877487510, -0.922975909144793550, -0.922956665104659680, -0.922937418757134310, +-0.922918170102265290, -0.922898919140100920, -0.922879665870689260, -0.922860410294078390, -0.922841152410316500, -0.922821892219451770, -0.922802629721532260, -0.922783364916606170, +-0.922764097804721680, -0.922744828385926970, -0.922725556660270230, -0.922706282627799520, -0.922687006288563150, -0.922667727642609290, -0.922648446689986020, -0.922629163430741750, +-0.922609877864924430, -0.922590589992582480, -0.922571299813764070, -0.922552007328517390, -0.922532712536890730, -0.922513415438932170, -0.922494116034690230, -0.922474814324212970, +-0.922455510307548690, -0.922436203984745460, -0.922416895355851920, -0.922397584420916020, -0.922378271179986280, -0.922358955633110770, -0.922339637780337900, -0.922320317621715960, +-0.922300995157293250, -0.922281670387117950, -0.922262343311238570, -0.922243013929703200, -0.922223682242560460, -0.922204348249858310, -0.922185011951645370, -0.922165673347970060, +-0.922146332438880450, -0.922126989224425040, -0.922107643704652040, -0.922088295879610050, -0.922068945749347280, -0.922049593313912230, -0.922030238573353090, -0.922010881527718370, +-0.921991522177056490, -0.921972160521415840, -0.921952796560844610, -0.921933430295391540, -0.921914061725104820, -0.921894690850033060, -0.921875317670224460, -0.921855942185727750, +-0.921836564396590900, -0.921817184302862860, -0.921797801904591820, -0.921778417201826180, -0.921759030194614580, -0.921739640883005310, -0.921720249267047100, -0.921700855346788140, +-0.921681459122277060, -0.921662060593562370, -0.921642659760692480, -0.921623256623716030, -0.921603851182681400, -0.921584443437637010, -0.921565033388631720, -0.921545621035713690, +-0.921526206378931790, -0.921506789418334190, -0.921487370153969750, -0.921467948585886760, -0.921448524714133970, -0.921429098538759870, -0.921409670059813000, -0.921390239277341980, +-0.921370806191395220, -0.921351370802021670, -0.921331933109269530, -0.921312493113187640, -0.921293050813824510, -0.921273606211228780, -0.921254159305448960, -0.921234710096533790, +-0.921215258584531790, -0.921195804769491810, -0.921176348651462140, -0.921156890230491740, -0.921137429506628910, -0.921117966479922720, -0.921098501150421470, -0.921079033518174110, +-0.921059563583229050, -0.921040091345635140, -0.921020616805440890, -0.921001139962695170, -0.920981660817446590, -0.920962179369743890, -0.920942695619635820, -0.920923209567170890, +-0.920903721212397940, -0.920884230555365720, -0.920864737596122970, -0.920845242334718210, -0.920825744771200600, -0.920806244905618350, -0.920786742738020750, -0.920767238268456080, +-0.920747731496973530, -0.920728222423621400, -0.920708711048448980, -0.920689197371504560, -0.920669681392837220, -0.920650163112495700, -0.920630642530528840, -0.920611119646985280, +-0.920591594461913850, -0.920572066975363530, -0.920552537187383060, -0.920533005098021270, -0.920513470707326810, -0.920493934015348850, -0.920474395022136020, -0.920454853727737170, +-0.920435310132201150, -0.920415764235576920, -0.920396216037913220, -0.920376665539259120, -0.920357112739663140, -0.920337557639174570, -0.920318000237841940, -0.920298440535714520, +-0.920278878532840850, -0.920259314229269990, -0.920239747625050790, -0.920220178720232320, -0.920200607514863430, -0.920181034008992870, -0.920161458202669920, -0.920141880095943220, +-0.920122299688861830, -0.920102716981474720, -0.920083131973830740, -0.920063544665978950, -0.920043955057968430, -0.920024363149847810, -0.920004768941666500, -0.919985172433473110, +-0.919965573625316950, -0.919945972517246640, -0.919926369109311580, -0.919906763401560520, -0.919887155394042530, -0.919867545086806680, -0.919847932479902040, -0.919828317573377460, +-0.919808700367282020, -0.919789080861665000, -0.919769459056575140, -0.919749834952061750, -0.919730208548173780, -0.919710579844960300, -0.919690948842470160, -0.919671315540752880, +-0.919651679939857190, -0.919632042039832400, -0.919612401840727340, -0.919592759342591440, -0.919573114545473520, -0.919553467449423010, -0.919533818054488640, -0.919514166360719810, +-0.919494512368165480, -0.919474856076874960, -0.919455197486897300, -0.919435536598281590, -0.919415873411077110, -0.919396207925332830, -0.919376540141098150, -0.919356870058422040, +-0.919337197677353780, -0.919317522997942560, -0.919297846020237560, -0.919278166744287750, -0.919258485170142750, -0.919238801297851400, -0.919219115127463130, -0.919199426659027100, +-0.919179735892592390, -0.919160042828208400, -0.919140347465924320, -0.919120649805789340, -0.919100949847852840, -0.919081247592163810, -0.919061543038771740, -0.919041836187725720, +-0.919022127039075150, -0.919002415592869440, -0.918982701849157420, -0.918962985807988850, -0.918943267469412680, -0.918923546833478540, -0.918903823900235280, -0.918884098669732640, +-0.918864371142019690, -0.918844641317145830, -0.918824909195160360, -0.918805174776112680, -0.918785438060051860, -0.918765699047027650, -0.918745957737089110, -0.918726214130285770, +-0.918706468226666790, -0.918686720026281600, -0.918666969529179700, -0.918647216735410390, -0.918627461645022960, -0.918607704258066930, -0.918587944574591590, -0.918568182594646450, +-0.918548418318280820, -0.918528651745544100, -0.918508882876485910, -0.918489111711155330, -0.918469338249602090, -0.918449562491875480, -0.918429784438024920, -0.918410004088099920, +-0.918390221442149990, -0.918370436500224430, -0.918350649262372750, -0.918330859728644480, -0.918311067899089120, -0.918291273773755970, -0.918271477352694760, -0.918251678635954690, +-0.918231877623585490, -0.918212074315636780, -0.918192268712157640, -0.918172460813198030, -0.918152650618807130, -0.918132838129034680, -0.918113023343930080, -0.918093206263542960, +-0.918073386887922730, -0.918053565217119120, -0.918033741251181650, -0.918013914990159720, -0.917994086434103070, -0.917974255583061230, -0.917954422437083580, -0.917934586996220100, +-0.917914749260519970, -0.917894909230033140, -0.917875066904808910, -0.917855222284897020, -0.917835375370347100, -0.917815526161208760, -0.917795674657531650, -0.917775820859365150, +-0.917755964766759360, -0.917736106379763440, -0.917716245698427470, -0.917696382722800740, -0.917676517452933100, -0.917656649888874080, -0.917636780030673620, -0.917616907878381020, +-0.917597033432046240, -0.917577156691718800, -0.917557277657448660, -0.917537396329285100, -0.917517512707278220, -0.917497626791477510, -0.917477738581932710, -0.917457848078693460, +-0.917437955281809710, -0.917418060191331100, -0.917398162807307240, -0.917378263129788100, -0.917358361158823190, -0.917338456894462470, -0.917318550336755580, -0.917298641485752240, +-0.917278730341502310, -0.917258816904055640, -0.917238901173461850, -0.917218983149770910, -0.917199062833032430, -0.917179140223296390, -0.917159215320612290, -0.917139288125030430, +-0.917119358636600100, -0.917099426855371490, -0.917079492781394330, -0.917059556414718370, -0.917039617755393550, -0.917019676803469630, -0.916999733558996670, -0.916979788022024290, +-0.916959840192602460, -0.916939890070780920, -0.916919937656609840, -0.916899982950138750, -0.916880025951417820, -0.916860066660496690, -0.916840105077425530, -0.916820141202254080, +-0.916800175035032310, -0.916780206575809940, -0.916760235824637280, -0.916740262781563840, -0.916720287446639910, -0.916700309819915130, -0.916680329901439660, -0.916660347691263260, +-0.916640363189436090, -0.916620376396007910, -0.916600387311028890, -0.916580395934548870, -0.916560402266617840, -0.916540406307285840, -0.916520408056602730, -0.916500407514618700, +-0.916480404681383700, -0.916460399556947580, -0.916440392141360530, -0.916420382434672500, -0.916400370436933450, -0.916380356148193580, -0.916360339568502600, -0.916340320697911050, +-0.916320299536468540, -0.916300276084225370, -0.916280250341231390, -0.916260222307536900, -0.916240191983191730, -0.916220159368246080, -0.916200124462750120, -0.916180087266753820, +-0.916160047780307350, -0.916140006003460680, -0.916119961936264100, -0.916099915578767580, -0.916079866931021280, -0.916059815993075180, -0.916039762764979670, -0.916019707246784720, +-0.915999649438540620, -0.915979589340297220, -0.915959526952104920, -0.915939462274013790, -0.915919395306074020, -0.915899326048335680, -0.915879254500849170, -0.915859180663664450, +-0.915839104536831820, -0.915819026120401340, -0.915798945414423300, -0.915778862418948010, -0.915758777134025430, -0.915738689559706050, -0.915718599696039750, -0.915698507543077130, +-0.915678413100868170, -0.915658316369463270, -0.915638217348912490, -0.915618116039266130, -0.915598012440574480, -0.915577906552887950, -0.915557798376256500, -0.915537687910730650, +-0.915517575156360450, -0.915497460113196440, -0.915477342781288780, -0.915457223160687780, -0.915437101251443620, -0.915416977053606700, -0.915396850567227420, -0.915376721792355960, +-0.915356590729042740, -0.915336457377337930, -0.915316321737292160, -0.915296183808955500, -0.915276043592378350, -0.915255901087611120, -0.915235756294704220, -0.915215609213707810, +-0.915195459844672430, -0.915175308187648360, -0.915155154242686120, -0.915134998009835780, -0.915114839489148180, -0.915094678680673400, -0.915074515584461960, -0.915054350200564140, +-0.915034182529030460, -0.915014012569911330, -0.914993840323257150, -0.914973665789118430, -0.914953488967545470, -0.914933309858588890, -0.914913128462299000, -0.914892944778726290, +-0.914872758807921180, -0.914852570549934300, -0.914832380004815810, -0.914812187172616590, -0.914791992053386680, -0.914771794647176950, -0.914751594954037570, -0.914731392974019400, +-0.914711188707172610, -0.914690982153547940, -0.914670773313195680, -0.914650562186166580, -0.914630348772511040, -0.914610133072279560, -0.914589915085522900, -0.914569694812291330, +-0.914549472252635720, -0.914529247406606240, -0.914509020274253740, -0.914488790855628620, -0.914468559150781510, -0.914448325159763040, -0.914428088882623840, -0.914407850319414290, +-0.914387609470185160, -0.914367366334986940, -0.914347120913870490, -0.914326873206886100, -0.914306623214084510, -0.914286370935516350, -0.914266116371232450, -0.914245859521283010, +-0.914225600385719090, -0.914205338964591110, -0.914185075257949680, -0.914164809265845760, -0.914144540988329650, -0.914124270425452300, -0.914103997577264240, -0.914083722443816190, +-0.914063445025158790, -0.914043165321342890, -0.914022883332418990, -0.914002599058437950, -0.913982312499450280, -0.913962023655507050, -0.913941732526658560, -0.913921439112955870, +-0.913901143414449390, -0.913880845431190300, -0.913860545163228900, -0.913840242610616250, -0.913819937773402870, -0.913799630651639830, -0.913779321245377530, -0.913759009554666930, +-0.913738695579559000, -0.913718379320104130, -0.913698060776353520, -0.913677739948357550, -0.913657416836167410, -0.913637091439833520, -0.913616763759407150, -0.913596433794938710, +-0.913576101546479170, -0.913555767014079480, -0.913535430197790270, -0.913515091097662490, -0.913494749713747110, -0.913474406046094760, -0.913454060094756380, -0.913433711859782840, +-0.913413361341225190, -0.913393008539133970, -0.913372653453560220, -0.913352296084554930, -0.913331936432168810, -0.913311574496452840, -0.913291210277457970, -0.913270843775235150, +-0.913250474989835140, -0.913230103921308990, -0.913209730569707560, -0.913189354935081800, -0.913168977017482560, -0.913148596816961030, -0.913128214333567940, -0.913107829567354370, +-0.913087442518371150, -0.913067053186669360, -0.913046661572299970, -0.913026267675313920, -0.913005871495762070, -0.912985473033695700, -0.912965072289165570, -0.912944669262222730, +-0.912924263952918260, -0.912903856361303110, -0.912883446487428360, -0.912863034331344970, -0.912842619893104110, -0.912822203172756530, -0.912801784170353510, -0.912781362885946020, +-0.912760939319585130, -0.912740513471321900, -0.912720085341207410, -0.912699654929292610, -0.912679222235628810, -0.912658787260266830, -0.912638350003257990, -0.912617910464653240, +-0.912597468644503750, -0.912577024542860490, -0.912556578159774650, -0.912536129495297500, -0.912515678549479900, -0.912495225322373150, -0.912474769814028310, -0.912454312024496670, +-0.912433851953829090, -0.912413389602077070, -0.912392924969291360, -0.912372458055523470, -0.912351988860824360, -0.912331517385245430, -0.912311043628837530, -0.912290567591652170, +-0.912270089273740200, -0.912249608675153260, -0.912229125795942060, -0.912208640636158250, -0.912188153195852670, -0.912167663475076830, -0.912147171473881690, -0.912126677192318660, +-0.912106180630439020, -0.912085681788293860, -0.912065180665934560, -0.912044677263412320, -0.912024171580778310, -0.912003663618083940, -0.911983153375380380, -0.911962640852718830, +-0.911942126050150900, -0.911921608967727450, -0.911901089605500090, -0.911880567963520020, -0.911860044041838510, -0.911839517840506870, -0.911818989359576390, -0.911798458599098470, +-0.911777925559124510, -0.911757390239705590, -0.911736852640893210, -0.911716312762738790, -0.911695770605293500, -0.911675226168608850, -0.911654679452736040, -0.911634130457726680, +-0.911613579183631840, -0.911593025630503150, -0.911572469798391900, -0.911551911687349500, -0.911531351297427240, -0.911510788628676630, -0.911490223681149070, -0.911469656454895970, +-0.911449086949968620, -0.911428515166418650, -0.911407941104297350, -0.911387364763656230, -0.911366786144546690, -0.911346205247020260, -0.911325622071128110, -0.911305036616921970, +-0.911284448884453370, -0.911263858873773590, -0.911243266584934150, -0.911222672017986570, -0.911202075172982240, -0.911181476049972790, -0.911160874649009630, -0.911140270970144270, +-0.911119665013428340, -0.911099056778913010, -0.911078446266650240, -0.911057833476691340, -0.911037218409087800, -0.911016601063891260, -0.910995981441153240, -0.910975359540925120, +-0.910954735363258770, -0.910934108908205480, -0.910913480175816970, -0.910892849166144660, -0.910872215879240280, -0.910851580315155450, -0.910830942473941470, -0.910810302355650410, +-0.910789659960333340, -0.910769015288042330, -0.910748368338828660, -0.910727719112744080, -0.910707067609840220, -0.910686413830168680, -0.910665757773781110, -0.910645099440729240, +-0.910624438831064480, -0.910603775944838660, -0.910583110782103410, -0.910562443342910480, -0.910541773627311260, -0.910521101635357710, -0.910500427367101350, -0.910479750822593910, +-0.910459072001887250, -0.910438390905032760, -0.910417707532082400, -0.910397021883087690, -0.910376333958100470, -0.910355643757172370, -0.910334951280355240, -0.910314256527700590, +-0.910293559499260500, -0.910272860195086350, -0.910252158615230120, -0.910231454759743430, -0.910210748628678230, -0.910190040222086050, -0.910169329540018830, -0.910148616582528210, +-0.910127901349666150, -0.910107183841484260, -0.910086464058034390, -0.910065741999368400, -0.910045017665538030, -0.910024291056595210, -0.910003562172591480, -0.909982831013579020, +-0.909962097579609440, -0.909941361870734600, -0.909920623887006340, -0.909899883628476620, -0.909879141095197070, -0.909858396287219760, -0.909837649204596310, -0.909816899847378900, +-0.909796148215619160, -0.909775394309369050, -0.909754638128680520, -0.909733879673605310, -0.909713118944195380, -0.909692355940502790, -0.909671590662579190, -0.909650823110476630, +-0.909630053284247060, -0.909609281183942240, -0.909588506809614450, -0.909567730161315200, -0.909546951239096680, -0.909526170043010730, -0.909505386573109530, -0.909484600829444600, +-0.909463812812068450, -0.909443022521032480, -0.909422229956389220, -0.909401435118190270, -0.909380638006487720, -0.909359838621333520, -0.909339036962779850, -0.909318233030878440, +-0.909297426825681600, -0.909276618347241270, -0.909255807595609090, -0.909234994570837560, -0.909214179272978650, -0.909193361702083980, -0.909172541858206170, -0.909151719741396970, +-0.909130895351708550, -0.909110068689192640, -0.909089239753901770, -0.909068408545887770, -0.909047575065202730, -0.909026739311898590, -0.909005901286027870, -0.908985060987642310, +-0.908964218416794090, -0.908943373573535160, -0.908922526457918050, -0.908901677069994470, -0.908880825409816850, -0.908859971477436910, -0.908839115272907170, -0.908818256796279810, +-0.908797396047606450, -0.908776533026939840, -0.908755667734331920, -0.908734800169834880, -0.908713930333500560, -0.908693058225381710, -0.908672183845530060, -0.908651307193998110, +-0.908630428270837620, -0.908609547076101200, -0.908588663609841030, -0.908567777872109070, -0.908546889862957620, -0.908525999582439070, -0.908505107030605500, -0.908484212207509190, +-0.908463315113202110, -0.908442415747736990, -0.908421514111165780, -0.908400610203540900, -0.908379704024914190, -0.908358795575338500, -0.908337884854865770, -0.908316971863548090, +-0.908296056601438200, -0.908275139068588140, -0.908254219265050340, -0.908233297190876750, -0.908212372846120110, -0.908191446230832480, -0.908170517345066260, -0.908149586188873650, +-0.908128652762307140, -0.908107717065419040, -0.908086779098261740, -0.908065838860887210, -0.908044896353348290, -0.908023951575697040, -0.908003004527985990, -0.907982055210267310, +-0.907961103622593630, -0.907940149765017130, -0.907919193637590110, -0.907898235240365390, -0.907877274573394950, -0.907856311636731310, -0.907835346430426850, -0.907814378954534100, +-0.907793409209105450, -0.907772437194193200, -0.907751462909849760, -0.907730486356127740, -0.907709507533079660, -0.907688526440757700, -0.907667543079214270, -0.907646557448502200, +-0.907625569548673680, -0.907604579379781230, -0.907583586941877240, -0.907562592235014340, -0.907541595259245050, -0.907520596014621540, -0.907499594501196770, -0.907478590719023040, +-0.907457584668152740, -0.907436576348638390, -0.907415565760532730, -0.907394552903888150, -0.907373537778757180, -0.907352520385192210, -0.907331500723246090, -0.907310478792971220, +-0.907289454594420230, -0.907268428127645300, -0.907247399392699600, -0.907226368389635330, -0.907205335118505210, -0.907184299579361530, -0.907163261772257260, -0.907142221697244790, +-0.907121179354376640, -0.907100134743705770, -0.907079087865284570, -0.907058038719165570, -0.907036987305401280, -0.907015933624044760, -0.906994877675148410, -0.906973819458764870, +-0.906952758974946540, -0.906931696223746590, -0.906910631205217310, -0.906889563919411560, -0.906868494366381620, -0.906847422546180670, -0.906826348458861120, -0.906805272104475700, +-0.906784193483077040, -0.906763112594717980, -0.906742029439451150, -0.906720944017329170, -0.906699856328404770, -0.906678766372730820, -0.906657674150360030, -0.906636579661344810, +-0.906615482905738350, -0.906594383883593260, -0.906573282594962060, -0.906552179039897600, -0.906531073218452830, -0.906509965130680270, -0.906488854776632990, -0.906467742156363280, +-0.906446627269924420, -0.906425510117368940, -0.906404390698749780, -0.906383269014119360, -0.906362145063531080, -0.906341018847037330, -0.906319890364691070, -0.906298759616544940, +-0.906277626602651990, -0.906256491323065070, -0.906235353777836710, -0.906214213967020180, -0.906193071890668000, -0.906171927548833240, -0.906150780941568530, -0.906129632068926940, +-0.906108480930961300, -0.906087327527724470, -0.906066171859269190, -0.906045013925648620, -0.906023853726915410, -0.906002691263122720, -0.905981526534323070, -0.905960359540569750, +-0.905939190281915610, -0.905918018758413380, -0.905896844970116020, -0.905875668917076720, -0.905854490599348190, -0.905833310016983310, -0.905812127170035340, -0.905790942058557040, +-0.905769754682601350, -0.905748565042221120, -0.905727373137469650, -0.905706178968399780, -0.905684982535064460, -0.905663783837516450, -0.905642582875809230, -0.905621379649995450, +-0.905600174160128280, -0.905578966406260570, -0.905557756388445490, -0.905536544106736120, -0.905515329561185300, -0.905494112751846100, -0.905472893678771710, -0.905451672342015070, +-0.905430448741629370, -0.905409222877667230, -0.905387994750182280, -0.905366764359227360, -0.905345531704855320, -0.905324296787119560, -0.905303059606073160, -0.905281820161769060, +-0.905260578454260220, -0.905239334483600170, -0.905218088249841850, -0.905196839753038220, -0.905175588993242240, -0.905154335970507540, -0.905133080684887070, -0.905111823136433790, +-0.905090563325200770, -0.905069301251241630, -0.905048036914609110, -0.905026770315356610, -0.905005501453536980, -0.904984230329203720, -0.904962956942409910, -0.904941681293208510, +-0.904920403381653140, -0.904899123207796750, -0.904877840771692530, -0.904856556073393550, -0.904835269112953310, -0.904813979890424890, -0.904792688405861580, -0.904771394659316330, +-0.904750098650842880, -0.904728800380494080, -0.904707499848323330, -0.904686197054383580, -0.904664891998728570, -0.904643584681411260, -0.904622275102485050, -0.904600963262003010, +-0.904579649160018650, -0.904558332796585260, -0.904537014171755800, -0.904515693285584010, -0.904494370138123060, -0.904473044729426020, -0.904451717059546300, -0.904430387128537410, +-0.904409054936452630, -0.904387720483345150, -0.904366383769268260, -0.904345044794275470, -0.904323703558420180, -0.904302360061755570, -0.904281014304334940, -0.904259666286211910, +-0.904238316007439650, -0.904216963468071680, -0.904195608668161180, -0.904174251607761770, -0.904152892286926750, -0.904131530705709290, -0.904110166864163120, -0.904088800762341660, +-0.904067432400298080, -0.904046061778085890, -0.904024688895758600, -0.904003313753369620, -0.903981936350972350, -0.903960556688620080, -0.903939174766366650, -0.903917790584265250, +-0.903896404142369270, -0.903875015440732230, -0.903853624479407760, -0.903832231258449250, -0.903810835777910220, -0.903789438037843840, -0.903768038038304080, -0.903746635779344220, +-0.903725231261017780, -0.903703824483378050, -0.903682415446478980, -0.903661004150373870, -0.903639590595116000, -0.903618174780759340, -0.903596756707357280, -0.903575336374963340, +-0.903553913783630920, -0.903532488933413870, -0.903511061824365580, -0.903489632456539680, -0.903468200829989470, -0.903446766944768890, -0.903425330800931460, -0.903403892398530690, +-0.903382451737620000, -0.903361008818253430, -0.903339563640484290, -0.903318116204366190, -0.903296666509952660, -0.903275214557297650, -0.903253760346454550, -0.903232303877476990, +-0.903210845150418720, -0.903189384165333450, -0.903167920922274710, -0.903146455421295900, -0.903124987662451200, -0.903103517645794000, -0.903082045371378040, -0.903060570839256730, +-0.903039094049484240, -0.903017615002113970, -0.902996133697199670, -0.902974650134794830, -0.902953164314953540, -0.902931676237729410, -0.902910185903176070, -0.902888693311347020, +-0.902867198462296460, -0.902845701356078000, -0.902824201992744930, -0.902802700372351660, -0.902781196494951590, -0.902759690360598550, -0.902738181969346080, -0.902716671321248440, +-0.902695158416359060, -0.902673643254731760, -0.902652125836420070, -0.902630606161478390, -0.902609084229960220, -0.902587560041919200, -0.902566033597409170, -0.902544504896484300, +-0.902522973939198110, -0.902501440725604450, -0.902479905255757050, -0.902458367529710090, -0.902436827547517200, -0.902415285309232210, -0.902393740814908860, -0.902372194064601230, +-0.902350645058363270, -0.902329093796248370, -0.902307540278311060, -0.902285984504604840, -0.902264426475183680, -0.902242866190101190, -0.902221303649411780, -0.902199738853169180, +-0.902178171801427120, -0.902156602494239460, -0.902135030931660590, -0.902113457113744020, -0.902091881040543830, -0.902070302712113750, -0.902048722128508170, -0.902027139289780730, +-0.902005554195985490, -0.901983966847176080, -0.901962377243407000, -0.901940785384731990, -0.901919191271204790, -0.901897594902879800, -0.901875996279810850, -0.901854395402051920, +-0.901832792269656850, -0.901811186882679920, -0.901789579241175090, -0.901767969345196210, -0.901746357194797230, -0.901724742790032670, -0.901703126130956160, -0.901681507217621860, +-0.901659886050083630, -0.901638262628395750, -0.901616636952612290, -0.901595009022787330, -0.901573378838974480, -0.901551746401228480, -0.901530111709603180, -0.901508474764152300, +-0.901486835564930480, -0.901465194111991550, -0.901443550405389590, -0.901421904445178670, -0.901400256231413070, -0.901378605764146860, -0.901356953043434220, -0.901335298069328880, +-0.901313640841885590, -0.901291981361158180, -0.901270319627200720, -0.901248655640067400, -0.901226989399812610, -0.901205320906490300, -0.901183650160154670, -0.901161977160859770, +-0.901140301908660120, -0.901118624403609680, -0.901096944645762510, -0.901075262635173120, -0.901053578371895700, -0.901031891855984200, -0.901010203087492910, -0.900988512066476120, +-0.900966818792988230, -0.900945123267083200, -0.900923425488815210, -0.900901725458238770, -0.900880023175408160, -0.900858318640377350, -0.900836611853200630, -0.900814902813932620, +-0.900793191522627270, -0.900771477979338990, -0.900749762184121730, -0.900728044137030340, -0.900706323838118880, -0.900684601287441540, -0.900662876485052500, -0.900641149431006480, +-0.900619420125357560, -0.900597688568159920, -0.900575954759468280, -0.900554218699336720, -0.900532480387819630, -0.900510739824971100, -0.900488997010845950, -0.900467251945498370, +-0.900445504628982650, -0.900423755061352860, -0.900402003242663950, -0.900380249172969990, -0.900358492852325500, -0.900336734280784530, -0.900314973458401950, -0.900293210385231910, +-0.900271445061328830, -0.900249677486746890, -0.900227907661541040, -0.900206135585765450, -0.900184361259474210, -0.900162584682722370, -0.900140805855564000, -0.900119024778053610, +-0.900097241450245500, -0.900075455872194510, -0.900053668043954810, -0.900031877965581040, -0.900010085637127260, -0.899988291058648530, -0.899966494230199030, -0.899944695151833400, +-0.899922893823605690, -0.899901090245571080, -0.899879284417783640, -0.899857476340298000, -0.899835666013168560, -0.899813853436450040, -0.899792038610196960, -0.899770221534463620, +-0.899748402209304850, -0.899726580634775060, -0.899704756810928870, -0.899682930737820570, -0.899661102415505120, -0.899639271844037030, -0.899617439023470580, -0.899595603953860510, +-0.899573766635261450, -0.899551927067728130, -0.899530085251314950, -0.899508241186076310, -0.899486394872067270, -0.899464546309342360, -0.899442695497955970, -0.899420842437962610, +-0.899398987129417460, -0.899377129572374810, -0.899355269766889290, -0.899333407713015400, -0.899311543410808210, -0.899289676860322130, -0.899267808061611660, -0.899245937014731990, +-0.899224063719737400, -0.899202188176682630, -0.899180310385622180, -0.899158430346611140, -0.899136548059704110, -0.899114663524955620, -0.899092776742420270, -0.899070887712153270, +-0.899048996434208990, -0.899027102908642180, -0.899005207135507470, -0.898983309114860020, -0.898961408846754130, -0.898939506331244860, -0.898917601568386520, -0.898895694558234480, +-0.898873785300843050, -0.898851873796267080, -0.898829960044561620, -0.898808044045781300, -0.898786125799980740, -0.898764205307214790, -0.898742282567538410, -0.898720357581006430, +-0.898698430347673490, -0.898676500867594320, -0.898654569140824090, -0.898632635167417430, -0.898610698947429180, -0.898588760480913960, -0.898566819767927070, -0.898544876808523130, +-0.898522931602756980, -0.898500984150683250, -0.898479034452357330, -0.898457082507833850, -0.898435128317167430, -0.898413171880413360, -0.898391213197626380, -0.898369252268861440, +-0.898347289094173050, -0.898325323673616730, -0.898303356007247090, -0.898281386095118980, -0.898259413937287250, -0.898237439533807190, -0.898215462884733530, -0.898193483990121220, +-0.898171502850025010, -0.898149519464500280, -0.898127533833601670, -0.898105545957384340, -0.898083555835902820, -0.898061563469212620, -0.898039568857368580, -0.898017572000425420, +-0.897995572898438450, -0.897973571551462620, -0.897951567959552890, -0.897929562122763980, -0.897907554041151300, -0.897885543714769810, -0.897863531143674450, -0.897841516327920090, +-0.897819499267562100, -0.897797479962655460, -0.897775458413255010, -0.897753434619415810, -0.897731408581193160, -0.897709380298642000, -0.897687349771817300, -0.897665317000774120, +-0.897643281985567860, -0.897621244726253380, -0.897599205222885830, -0.897577163475519970, -0.897555119484211520, -0.897533073249015210, -0.897511024769986010, -0.897488974047179420, +-0.897466921080650400, -0.897444865870454130, -0.897422808416645460, -0.897400748719279990, -0.897378686778412590, -0.897356622594098540, -0.897334556166392680, -0.897312487495350640, +-0.897290416581027480, -0.897268343423478170, -0.897246268022757860, -0.897224190378922090, -0.897202110492025810, -0.897180028362124180, -0.897157943989272400, -0.897135857373525860, +-0.897113768514939740, -0.897091677413568990, -0.897069584069469240, -0.897047488482695550, -0.897025390653303110, -0.897003290581347090, -0.896981188266883000, -0.896959083709965800, +-0.896936976910651000, -0.896914867868993660, -0.896892756585049190, -0.896870643058872870, -0.896848527290520000, -0.896826409280045530, -0.896804289027505310, -0.896782166532954280, +-0.896760041796447970, -0.896737914818041220, -0.896715785597789970, -0.896693654135749200, -0.896671520431974180, -0.896649384486520430, -0.896627246299443350, -0.896605105870798000, +-0.896582963200639790, -0.896560818289024450, -0.896538671136006940, -0.896516521741642760, -0.896494370105987090, -0.896472216229095790, -0.896450060111023790, -0.896427901751826740, +-0.896405741151559800, -0.896383578310278590, -0.896361413228038420, -0.896339245904894780, -0.896317076340902850, -0.896294904536118380, -0.896272730490596640, -0.896250554204393150, +-0.896228375677562970, -0.896206194910162070, -0.896184011902245730, -0.896161826653869120, -0.896139639165088210, -0.896117449435958170, -0.896095257466534510, -0.896073063256872530, +-0.896050866807028060, -0.896028668117056390, -0.896006467187013040, -0.895984264016953410, -0.895962058606933230, -0.895939850957008010, -0.895917641067233040, -0.895895428937663830, +-0.895873214568356220, -0.895850997959365620, -0.895828779110747540, -0.895806558022557260, -0.895784334694850860, -0.895762109127683500, -0.895739881321110820, -0.895717651275188540, +-0.895695418989972070, -0.895673184465517140, -0.895650947701879030, -0.895628708699113820, -0.895606467457276790, -0.895584223976423570, -0.895561978256609550, -0.895539730297890910, +-0.895517480100322840, -0.895495227663961060, -0.895472972988861080, -0.895450716075078870, -0.895428456922669810, -0.895406195531689650, -0.895383931902193790, -0.895361666034238280, +-0.895339397927878640, -0.895317127583170280, -0.895294855000169370, -0.895272580178931190, -0.895250303119511700, -0.895228023821966200, -0.895205742286350750, -0.895183458512721080, +-0.895161172501132700, -0.895138884251641230, -0.895116593764302640, -0.895094301039172650, -0.895072006076306880, -0.895049708875760960, -0.895027409437590960, -0.895005107761852380, +-0.894982803848601070, -0.894960497697892540, -0.894938189309782970, -0.894915878684327870, -0.894893565821582970, -0.894871250721604230, -0.894848933384447490, -0.894826613810168370, +-0.894804291998822500, -0.894781967950466160, -0.894759641665154760, -0.894737313142944360, -0.894714982383890470, -0.894692649388049380, -0.894670314155476600, -0.894647976686227970, +-0.894625636980359350, -0.894603295037926790, -0.894580950858985920, -0.894558604443592700, -0.894536255791802850, -0.894513904903672440, -0.894491551779257320, -0.894469196418613330, +-0.894446838821796210, -0.894424478988862130, -0.894402116919866820, -0.894379752614866020, -0.894357386073916130, -0.894335017297072650, -0.894312646284391780, -0.894290273035928900, +-0.894267897551740740, -0.894245519831882720, -0.894223139876410890, -0.894200757685381100, -0.894178373258849520, -0.894155986596872010, -0.894133597699504620, -0.894111206566802990, +-0.894088813198823500, -0.894066417595622000, -0.894044019757254560, -0.894021619683776800, -0.893999217375245130, -0.893976812831715480, -0.893954406053243610, -0.893931997039885800, +-0.893909585791698100, -0.893887172308736490, -0.893864756591056690, -0.893842338638715210, -0.893819918451767890, -0.893797496030270700, -0.893775071374279690, -0.893752644483851060, +-0.893730215359040960, -0.893707783999905250, -0.893685350406499880, -0.893662914578881360, -0.893640476517105540, -0.893618036221228600, -0.893595593691306260, -0.893573148927395140, +-0.893550701929551220, -0.893528252697830320, -0.893505801232288950, -0.893483347532983090, -0.893460891599968890, -0.893438433433302310, -0.893415973033039770, -0.893393510399237310, +-0.893371045531951010, -0.893348578431237050, -0.893326109097151710, -0.893303637529751170, -0.893281163729091500, -0.893258687695228760, -0.893236209428219460, -0.893213728928119680, +-0.893191246194985580, -0.893168761228873120, -0.893146274029838930, -0.893123784597939060, -0.893101292933229820, -0.893078799035767150, -0.893056302905607560, -0.893033804542807340, +-0.893011303947422340, -0.892988801119509290, -0.892966296059124250, -0.892943788766323410, -0.892921279241162940, -0.892898767483699560, -0.892876253493989140, -0.892853737272088170, +-0.892831218818052610, -0.892808698131939190, -0.892786175213803990, -0.892763650063703510, -0.892741122681693590, -0.892718593067831080, -0.892696061222172040, -0.892673527144772880, +-0.892650990835689770, -0.892628452294979220, -0.892605911522697750, -0.892583368518901190, -0.892560823283646390, -0.892538275816989520, -0.892515726118987110, -0.892493174189694980, +-0.892470620029170210, -0.892448063637468980, -0.892425505014647460, -0.892402944160762050, -0.892380381075869480, -0.892357815760025820, -0.892335248213287800, -0.892312678435711380, +-0.892290106427353510, -0.892267532188270260, -0.892244955718518360, -0.892222377018153770, -0.892199796087233430, -0.892177212925813530, -0.892154627533950470, -0.892132039911701090, +-0.892109450059121570, -0.892086857976268410, -0.892064263663197910, -0.892041667119967020, -0.892019068346631920, -0.891996467343249110, -0.891973864109874890, -0.891951258646566330, +-0.891928650953379590, -0.891906041030371190, -0.891883428877597530, -0.891860814495115450, -0.891838197882981350, -0.891815579041251750, -0.891792957969983040, -0.891770334669232060, +-0.891747709139055320, -0.891725081379509120, -0.891702451390650300, -0.891679819172535470, -0.891657184725221040, -0.891634548048763410, -0.891611909143219750, -0.891589268008646130, +-0.891566624645099500, -0.891543979052636050, -0.891521331231312830, -0.891498681181186360, -0.891476028902313030, -0.891453374394749590, -0.891430717658552860, -0.891408058693779260, +-0.891385397500485620, -0.891362734078728240, -0.891340068428564280, -0.891317400550050040, -0.891294730443242370, -0.891272058108197650, -0.891249383544973070, -0.891226706753624920, +-0.891204027734209920, -0.891181346486784930, -0.891158663011406670, -0.891135977308131650, -0.891113289377016500, -0.891090599218118400, -0.891067906831493840, -0.891045212217199340, +-0.891022515375291760, -0.890999816305828030, -0.890977115008864780, -0.890954411484458750, -0.890931705732666450, -0.890908997753545150, -0.890886287547151380, -0.890863575113541860, +-0.890840860452773110, -0.890818143564902520, -0.890795424449986490, -0.890772703108081760, -0.890749979539245400, -0.890727253743534230, -0.890704525721004780, -0.890681795471713890, +-0.890659062995718730, -0.890636328293075820, -0.890613591363842220, -0.890590852208074320, -0.890568110825829540, -0.890545367217164490, -0.890522621382136000, -0.890499873320800830, +-0.890477123033216130, -0.890454370519438540, -0.890431615779525120, -0.890408858813532490, -0.890386099621517820, -0.890363338203537970, -0.890340574559649540, -0.890317808689909840, +-0.890295040594375700, -0.890272270273103960, -0.890249497726151250, -0.890226722953575080, -0.890203945955432060, -0.890181166731779160, -0.890158385282673210, -0.890135601608171510, +-0.890112815708330670, -0.890090027583207990, -0.890067237232859850, -0.890044444657343890, -0.890021649856716830, -0.889998852831035640, -0.889976053580357140, -0.889953252104738750, +-0.889930448404237180, -0.889907642478909410, -0.889884834328812380, -0.889862023954003490, -0.889839211354539580, -0.889816396530477390, -0.889793579481874430, -0.889770760208787540, +-0.889747938711273670, -0.889725114989389780, -0.889702289043193370, -0.889679460872741190, -0.889656630478090400, -0.889633797859297750, -0.889610963016420840, -0.889588125949516530, +-0.889565286658641980, -0.889542445143853940, -0.889519601405209910, -0.889496755442766960, -0.889473907256582150, -0.889451056846712330, -0.889428204213215110, -0.889405349356147350, +-0.889382492275565980, -0.889359632971528650, -0.889336771444092180, -0.889313907693313870, -0.889291041719250550, -0.889268173521959750, -0.889245303101498630, -0.889222430457924150, +-0.889199555591293490, -0.889176678501664040, -0.889153799189092990, -0.889130917653637390, -0.889108033895354310, -0.889085147914301270, -0.889062259710535430, -0.889039369284113980, +-0.889016476635093870, -0.888993581763532830, -0.888970684669487700, -0.888947785353015770, -0.888924883814174560, -0.888901980053021120, -0.888879074069612640, -0.888856165864006400, +-0.888833255436259910, -0.888810342786430340, -0.888787427914574880, -0.888764510820750590, -0.888741591505015300, -0.888718669967425990, -0.888695746208039930, -0.888672820226914410, +-0.888649892024107050, -0.888626961599674910, -0.888604028953675410, -0.888581094086165590, -0.888558156997203200, -0.888535217686845510, -0.888512276155149490, -0.888489332402173090, +-0.888466386427973260, -0.888443438232607520, -0.888420487816133030, -0.888397535178607420, -0.888374580320087980, -0.888351623240632100, -0.888328663940296970, -0.888305702419140420, +-0.888282738677219630, -0.888259772714591890, -0.888236804531314590, -0.888213834127445480, -0.888190861503041830, -0.888167886658160930, -0.888144909592860190, -0.888121930307197330, +-0.888098948801229640, -0.888075965075014630, -0.888052979128609480, -0.888029990962072020, -0.888007000575459670, -0.887984007968829590, -0.887961013142239630, -0.887938016095747300, +-0.887915016829409760, -0.887892015343284550, -0.887869011637429480, -0.887846005711901980, -0.887822997566759310, -0.887799987202058990, -0.887776974617858980, -0.887753959814216450, +-0.887730942791189140, -0.887707923548834100, -0.887684902087209630, -0.887661878406372780, -0.887638852506381300, -0.887615824387292470, -0.887592794049164250, -0.887569761492054020, +-0.887546726716019310, -0.887523689721117840, -0.887500650507407230, -0.887477609074945000, -0.887454565423788530, -0.887431519553995800, -0.887408471465624290, -0.887385421158731650, +-0.887362368633375250, -0.887339313889613070, -0.887316256927502710, -0.887293197747101580, -0.887270136348467410, -0.887247072731657930, -0.887224006896730870, -0.887200938843743850, +-0.887177868572754160, -0.887154796083819970, -0.887131721376998920, -0.887108644452348270, -0.887085565309926330, -0.887062483949790370, -0.887039400371998240, -0.887016314576607350, +-0.886993226563675960, -0.886970136333261490, -0.886947043885421670, -0.886923949220214000, -0.886900852337696670, -0.886877753237927280, -0.886854651920963470, -0.886831548386862730, +-0.886808442635683370, -0.886785334667482990, -0.886762224482319230, -0.886739112080249690, -0.886715997461332560, -0.886692880625625460, -0.886669761573186220, -0.886646640304072250, +-0.886623516818341950, -0.886600391116052820, -0.886577263197262600, -0.886554133062029350, -0.886531000710410800, -0.886507866142464680, -0.886484729358248740, -0.886461590357821240, +-0.886438449141239700, -0.886415305708562080, -0.886392160059845890, -0.886369012195149630, -0.886345862114530700, -0.886322709818047280, -0.886299555305756770, -0.886276398577717560, +-0.886253239633987500, -0.886230078474624210, -0.886206915099685520, -0.886183749509229850, -0.886160581703314690, -0.886137411681997890, -0.886114239445337850, -0.886091064993392070, +-0.886067888326218740, -0.886044709443875480, -0.886021528346420670, -0.885998345033911950, -0.885975159506407480, -0.885951971763964790, -0.885928781806642470, -0.885905589634498170, +-0.885882395247589830, -0.885859198645975400, -0.885835999829713060, -0.885812798798860770, -0.885789595553476580, -0.885766390093618130, -0.885743182419343910, -0.885719972530711660, +-0.885696760427779340, -0.885673546110605340, -0.885650329579247500, -0.885627110833763780, -0.885603889874212010, -0.885580666700650830, -0.885557441313137960, -0.885534213711731470, +-0.885510983896489300, -0.885487751867469860, -0.885464517624731000, -0.885441281168330870, -0.885418042498327230, -0.885394801614778790, -0.885371558517743410, -0.885348313207279030, +-0.885325065683443710, -0.885301815946295870, -0.885278563995893550, -0.885255309832294610, -0.885232053455557550, -0.885208794865740440, -0.885185534062901350, -0.885162271047098100, +-0.885139005818389450, -0.885115738376833330, -0.885092468722487810, -0.885069196855410970, -0.885045922775661300, -0.885022646483296760, -0.884999367978375640, -0.884976087260956000, +-0.884952804331096240, -0.884929519188854430, -0.884906231834288960, -0.884882942267457560, -0.884859650488419190, -0.884836356497231580, -0.884813060293953010, -0.884789761878641670, +-0.884766461251356160, -0.884743158412154450, -0.884719853361094710, -0.884696546098235450, -0.884673236623634840, -0.884649924937351170, -0.884626611039442510, -0.884603294929967480, +-0.884579976608984240, -0.884556656076550980, -0.884533333332725990, -0.884510008377567770, -0.884486681211134610, -0.884463351833484680, -0.884440020244676160, -0.884416686444767900, +-0.884393350433817840, -0.884370012211884380, -0.884346671779025820, -0.884323329135300650, -0.884299984280767170, -0.884276637215483550, -0.884253287939508640, -0.884229936452900380, +-0.884206582755717290, -0.884183226848017530, -0.884159868729859970, -0.884136508401302760, -0.884113145862404190, -0.884089781113222670, -0.884066414153816820, -0.884043044984244910, +-0.884019673604565460, -0.883996300014836530, -0.883972924215117080, -0.883949546205465400, -0.883926165985939760, -0.883902783556598570, -0.883879398917500670, -0.883856012068704120, +-0.883832623010267440, -0.883809231742249460, -0.883785838264708250, -0.883762442577702530, -0.883739044681290500, -0.883715644575531090, -0.883692242260482490, -0.883668837736203310, +-0.883645431002751840, -0.883622022060187030, -0.883598610908567170, -0.883575197547950770, -0.883551781978396120, -0.883528364199962280, -0.883504944212707530, -0.883481522016690390, +-0.883458097611969250, -0.883434670998603070, -0.883411242176650240, -0.883387811146169270, -0.883364377907218560, -0.883340942459857060, -0.883317504804143280, -0.883294064940135510, +-0.883270622867892820, -0.883247178587473590, -0.883223732098936340, -0.883200283402339580, -0.883176832497742370, -0.883153379385203000, -0.883129924064780300, -0.883106466536532460, +-0.883083006800518660, -0.883059544856797380, -0.883036080705427270, -0.883012614346466720, -0.882989145779974890, -0.882965675006010200, -0.882942202024631250, -0.882918726835896560, +-0.882895249439865300, -0.882871769836595990, -0.882848288026147010, -0.882824804008577440, -0.882801317783945990, -0.882777829352311190, -0.882754338713731550, -0.882730845868266330, +-0.882707350815973960, -0.882683853556913260, -0.882660354091142630, -0.882636852418721470, -0.882613348539708080, -0.882589842454161280, -0.882566334162139810, -0.882542823663702620, +-0.882519310958908340, -0.882495796047815810, -0.882472278930483630, -0.882448759606970890, -0.882425238077336300, -0.882401714341638390, -0.882378188399936430, -0.882354660252288920, +-0.882331129898754840, -0.882307597339392680, -0.882284062574261730, -0.882260525603420720, -0.882236986426928270, -0.882213445044843230, -0.882189901457224760, -0.882166355664131490, +-0.882142807665622470, -0.882119257461756120, -0.882095705052591830, -0.882072150438188320, -0.882048593618604330, -0.882025034593898800, -0.882001473364130820, -0.881977909929359090, +-0.881954344289642700, -0.881930776445040140, -0.881907206395610930, -0.881883634141413690, -0.881860059682507140, -0.881836483018950680, -0.881812904150802930, -0.881789323078122970, +-0.881765739800969510, -0.881742154319401950, -0.881718566633478920, -0.881694976743259470, -0.881671384648802460, -0.881647790350167160, -0.881624193847412310, -0.881600595140597080, +-0.881576994229780090, -0.881553391115020850, -0.881529785796378080, -0.881506178273910870, -0.881482568547678040, -0.881458956617738990, -0.881435342484152560, -0.881411726146977600, +-0.881388107606273510, -0.881364486862099120, -0.881340863914513490, -0.881317238763575480, -0.881293611409344590, -0.881269981851879770, -0.881246350091239860, -0.881222716127483930, +-0.881199079960671480, -0.881175441590861250, -0.881151801018112410, -0.881128158242483920, -0.881104513264035270, -0.881080866082825210, -0.881057216698913130, -0.881033565112357640, +-0.881009911323218600, -0.880986255331554720, -0.880962597137424970, -0.880938936740888970, -0.880915274142005660, -0.880891609340834100, -0.880867942337433260, -0.880844273131862860, +-0.880820601724181750, -0.880796928114449210, -0.880773252302724070, -0.880749574289065970, -0.880725894073533970, -0.880702211656187230, -0.880678527037084820, -0.880654840216286260, +-0.880631151193850600, -0.880607459969837030, -0.880583766544304590, -0.880560070917313030, -0.880536373088921190, -0.880512673059188230, -0.880488970828173900, -0.880465266395937030, +-0.880441559762537020, -0.880417850928032930, -0.880394139892484380, -0.880370426655950560, -0.880346711218490620, -0.880322993580163640, -0.880299273741029450, -0.880275551701147130, +-0.880251827460575840, -0.880228101019374760, -0.880204372377603740, -0.880180641535321720, -0.880156908492588100, -0.880133173249461940, -0.880109435806003200, -0.880085696162270730, +-0.880061954318324120, -0.880038210274222350, -0.880014464030025260, -0.879990715585792120, -0.879966964941581890, -0.879943212097454410, -0.879919457053468970, -0.879895699809684850, +-0.879871940366161340, -0.879848178722958170, -0.879824414880134520, -0.879800648837749890, -0.879776880595863340, -0.879753110154534830, -0.879729337513823540, -0.879705562673788970, +-0.879681785634490180, -0.879658006395987240, -0.879634224958339210, -0.879610441321605710, -0.879586655485845800, -0.879562867451119450, -0.879539077217486030, -0.879515284785004630, +-0.879491490153735290, -0.879467693323737200, -0.879443894295069860, -0.879420093067792560, -0.879396289641965260, -0.879372484017647230, -0.879348676194897980, -0.879324866173776920, +-0.879301053954343770, -0.879277239536658040, -0.879253422920779240, -0.879229604106766650, -0.879205783094680230, -0.879181959884579370, -0.879158134476523690, -0.879134306870572370, +-0.879110477066785580, -0.879086645065222490, -0.879062810865942620, -0.879038974469005920, -0.879015135874471890, -0.878991295082399930, -0.878967452092849430, -0.878943606905880690, +-0.878919759521552770, -0.878895909939925610, -0.878872058161058400, -0.878848204185011190, -0.878824348011843500, -0.878800489641615060, -0.878776629074385030, -0.878752766310213710, +-0.878728901349160480, -0.878705034191284980, -0.878681164836646710, -0.878657293285305620, -0.878633419537321440, -0.878609543592753670, -0.878585665451661830, -0.878561785114105990, +-0.878537902580145750, -0.878514017849840510, -0.878490130923250460, -0.878466241800435090, -0.878442350481454140, -0.878418456966367000, -0.878394561255233960, -0.878370663348114640, +-0.878346763245068550, -0.878322860946155300, -0.878298956451435190, -0.878275049760967710, -0.878251140874812600, -0.878227229793029360, -0.878203316515678290, -0.878179401042818890, +-0.878155483374511100, -0.878131563510814230, -0.878107641451788770, -0.878083717197494230, -0.878059790747990120, -0.878035862103336730, -0.878011931263593780, -0.877987998228820900, +-0.877964062999077920, -0.877940125574424910, -0.877916185954921600, -0.877892244140627830, -0.877868300131603220, -0.877844353927908160, -0.877820405529602170, -0.877796454936745070, +-0.877772502149396730, -0.877748547167617300, -0.877724589991466520, -0.877700630621004340, -0.877676669056290270, -0.877652705297384710, -0.877628739344347490, -0.877604771197238120, +-0.877580800856117120, -0.877556828321044090, -0.877532853592079000, -0.877508876669281460, -0.877484897552712080, -0.877460916242430390, -0.877436932738496430, -0.877412947040969840, +-0.877388959149911220, -0.877364969065380200, -0.877340976787436720, -0.877316982316140530, -0.877292985651552120, -0.877268986793731330, -0.877244985742737900, -0.877220982498632010, +-0.877196977061473700, -0.877172969431323060, -0.877148959608239800, -0.877124947592284210, -0.877100933383516360, -0.877076916981996190, -0.877052898387783440, -0.877028877600938730, +-0.877004854621521780, -0.876980829449592770, -0.876956802085211320, -0.876932772528438260, -0.876908740779333120, -0.876884706837956270, -0.876860670704367350, -0.876836632378626970, +-0.876812591860794970, -0.876788549150931520, -0.876764504249096580, -0.876740457155350540, -0.876716407869753240, -0.876692356392365090, -0.876668302723245700, -0.876644246862455790, +-0.876620188810055320, -0.876596128566104140, -0.876572066130662850, -0.876548001503791420, -0.876523934685550010, -0.876499865675998470, -0.876475794475197520, -0.876451721083207120, +-0.876427645500087340, -0.876403567725898340, -0.876379487760700520, -0.876355405604554050, -0.876331321257519000, -0.876307234719655550, -0.876283145991024190, -0.876259055071684890, +-0.876234961961698030, -0.876210866661123470, -0.876186769170022030, -0.876162669488453670, -0.876138567616478350, -0.876114463554156900, -0.876090357301549270, -0.876066248858715760, +-0.876042138225716300, -0.876018025402611870, -0.875993910389462280, -0.875969793186327950, -0.875945673793268930, -0.875921552210345960, -0.875897428437619090, -0.875873302475148610, +-0.875849174322994690, -0.875825043981217970, -0.875800911449878820, -0.875776776729037200, -0.875752639818753510, -0.875728500719088480, -0.875704359430102160, -0.875680215951854750, +-0.875656070284406950, -0.875631922427819060, -0.875607772382151260, -0.875583620147463940, -0.875559465723817710, -0.875535309111272750, -0.875511150309889690, -0.875486989319728350, +-0.875462826140849910, -0.875438660773314340, -0.875414493217182120, -0.875390323472513440, -0.875366151539369140, -0.875341977417809500, -0.875317801107894920, -0.875293622609685680, +-0.875269441923242520, -0.875245259048625710, -0.875221073985895880, -0.875196886735113090, -0.875172697296338290, -0.875148505669631760, -0.875124311855053680, -0.875100115852665120, +-0.875075917662526240, -0.875051717284697660, -0.875027514719239450, -0.875003309966212670, -0.874979103025677720, -0.874954893897694870, -0.874930682582324650, -0.874906469079627990, +-0.874882253389665080, -0.874858035512496520, -0.874833815448182730, -0.874809593196784530, -0.874785368758362440, -0.874761142132976950, -0.874736913320688260, -0.874712682321557630, +-0.874688449135645250, -0.874664213763011510, -0.874639976203717360, -0.874615736457823420, -0.874591494525390090, -0.874567250406477760, -0.874543004101147600, -0.874518755609459910, +-0.874494504931475400, -0.874470252067254260, -0.874445997016857770, -0.874421739780346320, -0.874397480357780530, -0.874373218749220800, -0.874348954954728200, -0.874324688974363220, +-0.874300420808186600, -0.874276150456258620, -0.874251877918640450, -0.874227603195392720, -0.874203326286575710, -0.874179047192250590, -0.874154765912477760, -0.874130482447318170, +-0.874106196796832100, -0.874081908961080730, -0.874057618940124570, -0.874033326734024450, -0.874009032342840770, -0.873984735766634710, -0.873960437005466770, -0.873936136059397790, +-0.873911832928488170, -0.873887527612799310, -0.873863220112391590, -0.873838910427325750, -0.873814598557662410, -0.873790284503462970, -0.873765968264787700, -0.873741649841697220, +-0.873717329234252940, -0.873693006442515240, -0.873668681466545080, -0.873644354306403080, -0.873620024962150300, -0.873595693433847460, -0.873571359721555530, -0.873547023825334780, +-0.873522685745246830, -0.873498345481352080, -0.873474003033711590, -0.873449658402385750, -0.873425311587436080, -0.873400962588923080, -0.873376611406907590, -0.873352258041450450, +-0.873327902492612940, -0.873303544760455570, -0.873279184845039300, -0.873254822746424960, -0.873230458464673730, -0.873206091999846330, -0.873181723352003610, -0.873157352521206740, +-0.873132979507516340, -0.873108604310993690, -0.873084226931699180, -0.873059847369694440, -0.873035465625039970, -0.873011081697796950, -0.872986695588025880, -0.872962307295788390, +-0.872937916821145080, -0.872913524164157020, -0.872889129324884830, -0.872864732303390120, -0.872840333099733630, -0.872815931713976200, -0.872791528146178770, -0.872767122396402750, +-0.872742714464708860, -0.872718304351158050, -0.872693892055811720, -0.872669477578730590, -0.872645060919975730, -0.872620642079608100, -0.872596221057688970, -0.872571797854279410, +-0.872547372469440250, -0.872522944903232570, -0.872498515155717640, -0.872474083226956410, -0.872449649117010060, -0.872425212825939320, -0.872400774353805700, -0.872376333700670250, +-0.872351890866593930, -0.872327445851637680, -0.872302998655862920, -0.872278549279330790, -0.872254097722102050, -0.872229643984238300, -0.872205188065800390, -0.872180729966849590, +-0.872156269687446640, -0.872131807227653270, -0.872107342587530420, -0.872082875767139170, -0.872058406766540560, -0.872033935585796120, -0.872009462224966890, -0.871984986684113950, +-0.871960508963298350, -0.871936029062581720, -0.871911546982024890, -0.871887062721689370, -0.871862576281635880, -0.871838087661926160, -0.871813596862621280, -0.871789103883782280, +-0.871764608725470460, -0.871740111387747210, -0.871715611870673810, -0.871691110174311110, -0.871666606298720730, -0.871642100243963940, -0.871617592010101920, -0.871593081597195730, +-0.871568569005306990, -0.871544054234496880, -0.871519537284826560, -0.871495018156357220, -0.871470496849150570, -0.871445973363267680, -0.871421447698769840, -0.871396919855718100, +-0.871372389834174420, -0.871347857634199640, -0.871323323255855260, -0.871298786699202350, -0.871274247964302750, -0.871249707051217400, -0.871225163960007710, -0.871200618690735280, +-0.871176071243461190, -0.871151521618247050, -0.871126969815153920, -0.871102415834243530, -0.871077859675577050, -0.871053301339215990, -0.871028740825221410, -0.871004178133655160, +-0.870979613264578620, -0.870955046218052860, -0.870930476994139390, -0.870905905592899930, -0.870881332014395660, -0.870856756258688080, -0.870832178325838480, -0.870807598215908580, +-0.870783015928959680, -0.870758431465052940, -0.870733844824250420, -0.870709256006613310, -0.870684665012203100, -0.870660071841080960, -0.870635476493308860, -0.870610878968947950, +-0.870586279268059980, -0.870561677390706110, -0.870537073336948190, -0.870512467106847600, -0.870487858700465860, -0.870463248117864350, -0.870438635359104820, -0.870414020424248760, +-0.870389403313357570, -0.870364784026492640, -0.870340162563716050, -0.870315538925089060, -0.870290913110672970, -0.870266285120529840, -0.870241654954720940, -0.870217022613308020, +-0.870192388096352240, -0.870167751403915670, -0.870143112536059800, -0.870118471492846160, -0.870093828274336010, -0.870069182880591650, -0.870044535311674250, -0.870019885567645530, +-0.869995233648566790, -0.869970579554500300, -0.869945923285507350, -0.869921264841649560, -0.869896604222988420, -0.869871941429586020, -0.869847276461503730, -0.869822609318803170, +-0.869797940001545980, -0.869773268509794080, -0.869748594843609110, -0.869723919003052350, -0.869699240988185960, -0.869674560799071570, -0.869649878435770800, -0.869625193898345030, +-0.869600507186856550, -0.869575818301366770, -0.869551127241937500, -0.869526434008630060, -0.869501738601506920, -0.869477041020629280, -0.869452341266059080, -0.869427639337857940, +-0.869402935236087800, -0.869378228960810300, -0.869353520512087250, -0.869328809889980290, -0.869304097094551360, -0.869279382125862310, -0.869254664983974520, -0.869229945668950400, +-0.869205224180851220, -0.869180500519739160, -0.869155774685675510, -0.869131046678722760, -0.869106316498942320, -0.869081584146396020, -0.869056849621145600, -0.869032112923253330, +-0.869007374052780720, -0.868982633009789730, -0.868957889794341850, -0.868933144406499600, -0.868908396846324370, -0.868883647113878220, -0.868858895209222660, -0.868834141132420080, +-0.868809384883532210, -0.868784626462620670, -0.868759865869747740, -0.868735103104975150, -0.868710338168364850, -0.868685571059978460, -0.868660801779878260, -0.868636030328126200, +-0.868611256704784010, -0.868586480909913420, -0.868561702943576930, -0.868536922805836050, -0.868512140496752960, -0.868487356016389270, -0.868462569364807480, -0.868437780542069220, +-0.868412989548236540, -0.868388196383371060, -0.868363401047535400, -0.868338603540791290, -0.868313803863200560, -0.868289002014825170, -0.868264197995727400, -0.868239391805969210, +-0.868214583445612310, -0.868189772914719220, -0.868164960213351660, -0.868140145341571690, -0.868115328299441160, -0.868090509087022450, -0.868065687704377530, -0.868040864151568450, +-0.868016038428656930, -0.867991210535705490, -0.867966380472776080, -0.867941548239930750, -0.867916713837231240, -0.867891877264740260, -0.867867038522519450, -0.867842197610631190, +-0.867817354529137110, -0.867792509278099920, -0.867767661857581470, -0.867742812267643600, -0.867717960508349040, -0.867693106579759400, -0.867668250481937080, -0.867643392214943910, +-0.867618531778842520, -0.867593669173694740, -0.867568804399562850, -0.867543937456508710, -0.867519068344594910, -0.867494197063883420, -0.867469323614436520, -0.867444447996316040, +-0.867419570209584710, -0.867394690254304380, -0.867369808130537320, -0.867344923838345610, -0.867320037377791730, -0.867295148748937760, -0.867270257951845760, -0.867245364986578340, +-0.867220469853197450, -0.867195572551765380, -0.867170673082344190, -0.867145771444996490, -0.867120867639784470, -0.867095961666770170, -0.867071053526015770, -0.867046143217584000, +-0.867021230741536920, -0.866996316097936700, -0.866971399286845410, -0.866946480308325880, -0.866921559162440180, -0.866896635849250590, -0.866871710368819160, -0.866846782721208630, +-0.866821852906481280, -0.866796920924698950, -0.866771986775924600, -0.866747050460220270, -0.866722111977648370, -0.866697171328270840, -0.866672228512150640, -0.866647283529349940, +-0.866622336379931020, -0.866597387063956060, -0.866572435581487780, -0.866547481932588460, -0.866522526117320390, -0.866497568135745740, -0.866472607987927470, -0.866447645673927740, +-0.866422681193808830, -0.866397714547632920, -0.866372745735463080, -0.866347774757361360, -0.866322801613390150, -0.866297826303611630, -0.866272848828088860, -0.866247869186884010, +-0.866222887380059260, -0.866197903407677440, -0.866172917269800950, -0.866147928966492060, -0.866122938497813190, -0.866097945863827160, -0.866072951064596360, -0.866047954100183090, +-0.866022954970649740, -0.865997953676059250, -0.865972950216473800, -0.865947944591956010, -0.865922936802568160, -0.865897926848373190, -0.865872914729433400, -0.865847900445811390, +-0.865822883997569240, -0.865797865384770220, -0.865772844607476610, -0.865747821665750480, -0.865722796559655120, -0.865697769289252790, -0.865672739854606020, -0.865647708255777190, +-0.865622674492829260, -0.865597638565824720, -0.865572600474825980, -0.865547560219895540, -0.865522517801096460, -0.865497473218491130, -0.865472426472142060, -0.865447377562111760, +-0.865422326488463180, -0.865397273251258810, -0.865372217850561180, -0.865347160286432880, -0.865322100558936880, -0.865297038668135570, -0.865271974614091550, -0.865246908396867690, +-0.865221840016526690, -0.865196769473130960, -0.865171696766743210, -0.865146621897426420, -0.865121544865242950, -0.865096465670255780, -0.865071384312527060, -0.865046300792120190, +-0.865021215109097570, -0.864996127263521930, -0.864971037255455770, -0.864945945084962140, -0.864920850752103790, -0.864895754256943210, -0.864870655599543010, -0.864845554779966500, +-0.864820451798275940, -0.864795346654534390, -0.864770239348804150, -0.864745129881148600, -0.864720018251630250, -0.864694904460311610, -0.864669788507255950, -0.864644670392525790, +-0.864619550116183970, -0.864594427678292980, -0.864569303078916220, -0.864544176318116200, -0.864519047395955640, -0.864493916312497390, -0.864468783067804500, -0.864443647661939600, +-0.864418510094965730, -0.864393370366945190, -0.864368228477941590, -0.864343084428017330, -0.864317938217235350, -0.864292789845658380, -0.864267639313349600, -0.864242486620371730, +-0.864217331766787390, -0.864192174752660080, -0.864167015578052200, -0.864141854243026810, -0.864116690747646520, -0.864091525091974840, -0.864066357276074280, -0.864041187300007780, +-0.864016015163838190, -0.863990840867628670, -0.863965664411442180, -0.863940485795341440, -0.863915305019389290, -0.863890122083649130, -0.863864936988183670, -0.863839749733055770, +-0.863814560318328370, -0.863789368744064760, -0.863764175010327650, -0.863738979117180010, -0.863713781064685100, -0.863688580852905790, -0.863663378481904890, -0.863638173951745470, +-0.863612967262490700, -0.863587758414203540, -0.863562547406947050, -0.863537334240783940, -0.863512118915777730, -0.863486901431991250, -0.863461681789487460, -0.863436459988329300, +-0.863411236028580160, -0.863386009910302900, -0.863360781633560670, -0.863335551198416320, -0.863310318604933240, -0.863285083853174370, -0.863259846943202570, -0.863234607875081330, +-0.863209366648873600, -0.863184123264642560, -0.863158877722450920, -0.863133630022362320, -0.863108380164439580, -0.863083128148745880, -0.863057873975344170, -0.863032617644298060, +-0.863007359155670390, -0.862982098509524230, -0.862956835705922630, -0.862931570744929210, -0.862906303626606920, -0.862881034351018820, -0.862855762918227850, -0.862830489328297760, +-0.862805213581291470, -0.862779935677272070, -0.862754655616302600, -0.862729373398446800, -0.862704089023767500, -0.862678802492327760, -0.862653513804191310, -0.862628222959420990, +-0.862602929958080190, -0.862577634800231750, -0.862552337485939510, -0.862527038015266420, -0.862501736388275760, -0.862476432605030490, -0.862451126665594310, -0.862425818570030420, +-0.862400508318401980, -0.862375195910771940, -0.862349881347204250, -0.862324564627761750, -0.862299245752507940, -0.862273924721505770, -0.862248601534818970, -0.862223276192510710, +-0.862197948694644060, -0.862172619041282730, -0.862147287232489790, -0.862121953268328740, -0.862096617148862430, -0.862071278874154910, -0.862045938444269240, -0.862020595859268600, +-0.861995251119216380, -0.861969904224176190, -0.861944555174211200, -0.861919203969384930, -0.861893850609760310, -0.861868495095401310, -0.861843137426371090, -0.861817777602733040, +-0.861792415624550330, -0.861767051491886820, -0.861741685204805650, -0.861716316763370130, -0.861690946167643860, -0.861665573417690340, -0.861640198513572870, -0.861614821455354730, +-0.861589442243099750, -0.861564060876871100, -0.861538677356732290, -0.861513291682746600, -0.861487903854977870, -0.861462513873489490, -0.861437121738344750, -0.861411727449607030, +-0.861386331007340080, -0.861360932411607380, -0.861335531662472450, -0.861310128759998350, -0.861284723704249130, -0.861259316495288200, -0.861233907133178930, -0.861208495617984630, +-0.861183081949769450, -0.861157666128596460, -0.861132248154529050, -0.861106828027631280, -0.861081405747966430, -0.861055981315598130, -0.861030554730589650, -0.861005125993004940, +-0.860979695102907390, -0.860954262060360740, -0.860928826865428040, -0.860903389518173580, -0.860877950018660740, -0.860852508366952930, -0.860827064563113640, -0.860801618607206830, +-0.860776170499296110, -0.860750720239444880, -0.860725267827716630, -0.860699813264175440, -0.860674356548884690, -0.860648897681907890, -0.860623436663309090, -0.860597973493151590, +-0.860572508171499220, -0.860547040698415370, -0.860521571073964210, -0.860496099298209030, -0.860470625371213550, -0.860445149293041390, -0.860419671063756500, -0.860394190683422490, +-0.860368708152102980, -0.860343223469861470, -0.860317736636762140, -0.860292247652868490, -0.860266756518244250, -0.860241263232952800, -0.860215767797058440, -0.860190270210624660, +-0.860164770473714980, -0.860139268586393670, -0.860113764548724120, -0.860088258360770190, -0.860062750022595360, -0.860037239534263920, -0.860011726895839380, -0.859986212107385460, +-0.859960695168965890, -0.859935176080644740, -0.859909654842485600, -0.859884131454552340, -0.859858605916908660, -0.859833078229618520, -0.859807548392745760, -0.859782016406354210, +-0.859756482270507270, -0.859730945985269450, -0.859705407550704130, -0.859679866966875150, -0.859654324233846800, -0.859628779351682470, -0.859603232320446330, -0.859577683140201780, +-0.859552131811013310, -0.859526578332944550, -0.859501022706059330, -0.859475464930421260, -0.859449905006094860, -0.859424342933143630, -0.859398778711631510, -0.859373212341622230, +-0.859347643823180190, -0.859322073156368990, -0.859296500341252710, -0.859270925377894850, -0.859245348266359900, -0.859219769006711600, -0.859194187599014000, -0.859168604043330510, +-0.859143018339725840, -0.859117430488263610, -0.859091840489007550, -0.859066248342022170, -0.859040654047371180, -0.859015057605118540, -0.858989459015327970, -0.858963858278063990, +-0.858938255393390420, -0.858912650361371210, -0.858887043182070100, -0.858861433855551580, -0.858835822381879610, -0.858810208761118020, -0.858784592993330540, -0.858758975078582010, +-0.858733355016935930, -0.858707732808456470, -0.858682108453207470, -0.858656481951253440, -0.858630853302658200, -0.858605222507485610, -0.858579589565800160, -0.858553954477665800, +-0.858528317243146490, -0.858502677862306160, -0.858477036335209440, -0.858451392661920050, -0.858425746842502170, -0.858400098877019730, -0.858374448765537260, -0.858348796508118680, +-0.858323142104828070, -0.858297485555729490, -0.858271826860887320, -0.858246166020365630, -0.858220503034228480, -0.858194837902539920, -0.858169170625364350, -0.858143501202766060, +-0.858117829634808650, -0.858092155921556850, -0.858066480063074730, -0.858040802059426460, -0.858015121910675860, -0.857989439616887780, -0.857963755178126060, -0.857938068594454980, +-0.857912379865938380, -0.857886688992641200, -0.857860995974627280, -0.857835300811960800, -0.857809603504705920, -0.857783904052927150, -0.857758202456688770, -0.857732498716054730, +-0.857706792831089300, -0.857681084801857120, -0.857655374628422230, -0.857629662310848810, -0.857603947849201130, -0.857578231243543710, -0.857552512493940820, -0.857526791600456420, +-0.857501068563155110, -0.857475343382101300, -0.857449616057359030, -0.857423886588992490, -0.857398154977066510, -0.857372421221645140, -0.857346685322792680, -0.857320947280573400, +-0.857295207095051800, -0.857269464766292290, -0.857243720294359140, -0.857217973679316400, -0.857192224921229040, -0.857166474020161000, -0.857140720976176770, -0.857114965789340650, +-0.857089208459717260, -0.857063448987370860, -0.857037687372365520, -0.857011923614766300, -0.856986157714637260, -0.856960389672042800, -0.856934619487047190, -0.856908847159715160, +-0.856883072690111100, -0.856857296078299300, -0.856831517324344150, -0.856805736428310260, -0.856779953390262140, -0.856754168210264070, -0.856728380888380440, -0.856702591424676090, +-0.856676799819215180, -0.856651006072062350, -0.856625210183281640, -0.856599412152938220, -0.856573611981096270, -0.856547809667820070, -0.856522005213174680, -0.856496198617224150, +-0.856470389880033100, -0.856444579001665930, -0.856418765982187470, -0.856392950821662110, -0.856367133520154370, -0.856341314077728620, -0.856315492494449830, -0.856289668770382150, +-0.856263842905590430, -0.856238014900138960, -0.856212184754092550, -0.856186352467515730, -0.856160518040472880, -0.856134681473028740, -0.856108842765248010, -0.856083001917195110, +-0.856057158928934530, -0.856031313800531320, -0.856005466532049790, -0.855979617123554640, -0.855953765575110160, -0.855927911886781520, -0.855902056058633120, -0.855876198090729570, +-0.855850337983135260, -0.855824475735915470, -0.855798611349134370, -0.855772744822856700, -0.855746876157146950, -0.855721005352070410, -0.855695132407691130, -0.855669257324074170, +-0.855643380101283820, -0.855617500739385140, -0.855591619238442850, -0.855565735598521450, -0.855539849819685450, -0.855513961902000130, -0.855488071845529880, -0.855462179650339220, +-0.855436285316493290, -0.855410388844056620, -0.855384490233094040, -0.855358589483670050, -0.855332686595849820, -0.855306781569697750, -0.855280874405278890, -0.855254965102657420, +-0.855229053661898940, -0.855203140083067750, -0.855177224366228780, -0.855151306511446440, -0.855125386518786110, -0.855099464388312190, -0.855073540120089740, -0.855047613714183140, +-0.855021685170657800, -0.854995754489578320, -0.854969821671009100, -0.854943886715015530, -0.854917949621662340, -0.854892010391014150, -0.854866069023135890, -0.854840125518092520, +-0.854814179875948990, -0.854788232096769800, -0.854762282180620000, -0.854736330127564670, -0.854710375937668410, -0.854684419610996390, -0.854658461147612900, -0.854632500547583660, +-0.854606537810973070, -0.854580572937846170, -0.854554605928267600, -0.854528636782302730, -0.854502665500016300, -0.854476692081472920, -0.854450716526738100, -0.854424738835876440, +-0.854398759008953010, -0.854372777046032320, -0.854346792947180080, -0.854320806712460690, -0.854294818341939430, -0.854268827835680810, -0.854242835193750440, -0.854216840416212930, +-0.854190843503133230, -0.854164844454576300, -0.854138843270607520, -0.854112839951291500, -0.854086834496693430, -0.854060826906878120, -0.854034817181910990, -0.854008805321856750, +-0.853982791326780450, -0.853956775196746950, -0.853930756931821740, -0.853904736532069770, -0.853878713997555660, -0.853852689328344900, -0.853826662524502570, -0.853800633586093480, +-0.853774602513182600, -0.853748569305835430, -0.853722533964116790, -0.853696496488091870, -0.853670456877825500, -0.853644415133383290, -0.853618371254829870, -0.853592325242230610, +-0.853566277095650360, -0.853540226815154620, -0.853514174400808230, -0.853488119852676470, -0.853462063170824180, -0.853436004355316970, -0.853409943406219780, -0.853383880323597350, +-0.853357815107515630, -0.853331747758039330, -0.853305678275233630, -0.853279606659163470, -0.853253532909894590, -0.853227457027491810, -0.853201379012020420, -0.853175298863545370, +-0.853149216582132270, -0.853123132167846190, -0.853097045620752280, -0.853070956940915390, -0.853044866128401470, -0.853018773183275350, -0.852992678105602310, -0.852966580895447300, +-0.852940481552876160, -0.852914380077953730, -0.852888276470745170, -0.852862170731316090, -0.852836062859731680, -0.852809952856056990, -0.852783840720357290, -0.852757726452698210, +-0.852731610053144800, -0.852705491521762340, -0.852679370858615890, -0.852653248063771300, -0.852627123137293610, -0.852600996079248000, -0.852574866889699750, -0.852548735568714580, +-0.852522602116357550, -0.852496466532694060, -0.852470328817789060, -0.852444188971708590, -0.852418046994517620, -0.852391902886281530, -0.852365756647065380, -0.852339608276935110, +-0.852313457775955910, -0.852287305144192710, -0.852261150381711570, -0.852234993488577450, -0.852208834464855960, -0.852182673310612150, -0.852156510025911750, -0.852130344610820160, +-0.852104177065402760, -0.852078007389724610, -0.852051835583851780, -0.852025661647849210, -0.851999485581782620, -0.851973307385716970, -0.851947127059718420, -0.851920944603851930, +-0.851894760018183090, -0.851868573302777210, -0.851842384457700000, -0.851816193483016960, -0.851790000378793160, -0.851763805145094530, -0.851737607781986480, -0.851711408289534290, +-0.851685206667803450, -0.851659002916859810, -0.851632797036768640, -0.851606589027595450, -0.851580378889405630, -0.851554166622265130, -0.851527952226239120, -0.851501735701393200, +-0.851475517047792780, -0.851449296265503810, -0.851423073354591550, -0.851396848315121630, -0.851370621147159330, -0.851344391850770820, -0.851318160426021150, -0.851291926872976060, +-0.851265691191701260, -0.851239453382262260, -0.851213213444724560, -0.851186971379153670, -0.851160727185615530, -0.851134480864175650, -0.851108232414899520, -0.851081981837852550, +-0.851055729133100900, -0.851029474300709850, -0.851003217340745240, -0.850976958253272240, -0.850950697038357130, -0.850924433696065300, -0.850898168226462360, -0.850871900629613820, +-0.850845630905585630, -0.850819359054443500, -0.850793085076252620, -0.850766808971079370, -0.850740530738989030, -0.850714250380047440, -0.850687967894319890, -0.850661683281872750, +-0.850635396542771320, -0.850609107677081420, -0.850582816684868570, -0.850556523566198820, -0.850530228321137890, -0.850503930949751300, -0.850477631452104640, -0.850451329828264210, +-0.850425026078295400, -0.850398720202264040, -0.850372412200235630, -0.850346102072276340, -0.850319789818451910, -0.850293475438828050, -0.850267158933470160, -0.850240840302444620, +-0.850214519545817060, -0.850188196663652860, -0.850161871656018530, -0.850135544522979460, -0.850109215264601480, -0.850082883880950320, -0.850056550372092050, -0.850030214738092480, +-0.850003876979017470, -0.849977537094932400, -0.849951195085903780, -0.849924850951997100, -0.849898504693278320, -0.849872156309813160, -0.849845805801667690, -0.849819453168907830, +-0.849793098411599220, -0.849766741529807800, -0.849740382523599620, -0.849714021393040530, -0.849687658138196130, -0.849661292759132820, -0.849634925255916330, -0.849608555628612480, +-0.849582183877287010, -0.849555810002006310, -0.849529434002836090, -0.849503055879842320, -0.849476675633090590, -0.849450293262647430, -0.849423908768578650, -0.849397522150949990, +-0.849371133409827280, -0.849344742545277030, -0.849318349557364850, -0.849291954446156900, -0.849265557211718810, -0.849239157854116970, -0.849212756373417310, -0.849186352769685460, +-0.849159947042988030, -0.849133539193390740, -0.849107129220959660, -0.849080717125760390, -0.849054302907859660, -0.849027886567323090, -0.849001468104216840, -0.848975047518606640, +-0.848948624810559100, -0.848922199980140070, -0.848895773027415480, -0.848869343952451170, -0.848842912755313760, -0.848816479436069080, -0.848790043994783310, -0.848763606431522040, +-0.848737166746352020, -0.848710724939339190, -0.848684281010549380, -0.848657834960048760, -0.848631386787903730, -0.848604936494180230, -0.848578484078944210, -0.848552029542262170, +-0.848525572884200050, -0.848499114104824040, -0.848472653204199960, -0.848446190182394530, -0.848419725039473600, -0.848393257775503340, -0.848366788390549800, -0.848340316884679480, +-0.848313843257958330, -0.848287367510452530, -0.848260889642228120, -0.848234409653351730, -0.848207927543889300, -0.848181443313907100, -0.848154956963470990, -0.848128468492647780, +-0.848101977901503430, -0.848075485190103780, -0.848048990358515780, -0.848022493406805240, -0.847995994335038470, -0.847969493143281410, -0.847942989831600990, -0.847916484400062950, +-0.847889976848733800, -0.847863467177679460, -0.847836955386966680, -0.847810441476661510, -0.847783925446830230, -0.847757407297538900, -0.847730887028854350, -0.847704364640842530, +-0.847677840133569730, -0.847651313507102210, -0.847624784761506600, -0.847598253896848950, -0.847571720913195550, -0.847545185810613000, -0.847518648589167590, -0.847492109248925480, +-0.847465567789952860, -0.847439024212316540, -0.847412478516082700, -0.847385930701317620, -0.847359380768087480, -0.847332828716459210, -0.847306274546498760, -0.847279718258272750, +-0.847253159851847130, -0.847226599327288830, -0.847200036684664040, -0.847173471924039250, -0.847146905045480400, -0.847120336049054570, -0.847093764934828020, -0.847067191702866710, +-0.847040616353237690, -0.847014038886007010, -0.846987459301241420, -0.846960877599006840, -0.846934293779370350, -0.846907707842398110, -0.846881119788156500, -0.846854529616712040, +-0.846827937328131330, -0.846801342922480880, -0.846774746399826970, -0.846748147760236100, -0.846721547003775000, -0.846694944130510050, -0.846668339140507760, -0.846641732033834420, +-0.846615122810556840, -0.846588511470741660, -0.846561898014455030, -0.846535282441763460, -0.846508664752734010, -0.846482044947432840, -0.846455423025926250, -0.846428798988281380, +-0.846402172834564540, -0.846375544564842320, -0.846348914179180900, -0.846322281677647560, -0.846295647060308460, -0.846269010327230120, -0.846242371478479140, -0.846215730514122470, +-0.846189087434226490, -0.846162442238857730, -0.846135794928082660, -0.846109145501968250, -0.846082493960581110, -0.846055840303987730, -0.846029184532254400, -0.846002526645448390, +-0.845975866643636110, -0.845949204526883940, -0.845922540295258930, -0.845895873948827590, -0.845869205487656540, -0.845842534911812270, -0.845815862221361960, -0.845789187416371880, +-0.845762510496908870, -0.845735831463039430, -0.845709150314830630, -0.845682467052348840, -0.845655781675661020, -0.845629094184833340, -0.845602404579933300, -0.845575712861027280, +-0.845549019028181800, -0.845522323081463690, -0.845495625020940000, -0.845468924846677240, -0.845442222558741910, -0.845415518157201170, -0.845388811642121760, -0.845362103013570290, +-0.845335392271613360, -0.845308679416318150, -0.845281964447751170, -0.845255247365979350, -0.845228528171069190, -0.845201806863087990, -0.845175083442102130, -0.845148357908178660, +-0.845121630261384090, -0.845094900501785600, -0.845068168629449890, -0.845041434644443810, -0.845014698546833750, -0.844987960336687330, -0.844961220014071030, -0.844934477579051600, +-0.844907733031695750, -0.844880986372070760, -0.844854237600243470, -0.844827486716280160, -0.844800733720248440, -0.844773978612214930, -0.844747221392246450, -0.844720462060409630, +-0.844693700616771960, -0.844666937061399950, -0.844640171394360650, -0.844613403615720790, -0.844586633725547540, -0.844559861723907730, -0.844533087610868320, -0.844506311386495790, +-0.844479533050857880, -0.844452752604021080, -0.844425970046052350, -0.844399185377018520, -0.844372398596986980, -0.844345609706024460, -0.844318818704197670, -0.844292025591574010, +-0.844265230368220320, -0.844238433034203540, -0.844211633589590390, -0.844184832034448500, -0.844158028368844460, -0.844131222592845450, -0.844104414706517980, -0.844077604709929870, +-0.844050792603147640, -0.844023978386238550, -0.843997162059269110, -0.843970343622307160, -0.843943523075419310, -0.843916700418672620, -0.843889875652133910, -0.843863048775870820, +-0.843836219789950050, -0.843809388694438440, -0.843782555489403730, -0.843755720174912520, -0.843728882751032080, -0.843702043217829270, -0.843675201575371460, -0.843648357823725710, +-0.843621511962958980, -0.843594663993138320, -0.843567813914331220, -0.843540961726604640, -0.843514107430025530, -0.843487251024661040, -0.843460392510578580, -0.843433531887845090, +-0.843406669156527840, -0.843379804316693680, -0.843352937368410330, -0.843326068311744500, -0.843299197146763380, -0.843272323873534460, -0.843245448492124680, -0.843218571002601340, +-0.843191691405031250, -0.843164809699482260, -0.843137925886021210, -0.843111039964715370, -0.843084151935631580, -0.843057261798837780, -0.843030369554400800, -0.843003475202387940, +-0.842976578742866020, -0.842949680175902990, -0.842922779501565690, -0.842895876719921610, -0.842868971831037370, -0.842842064834981140, -0.842815155731819640, -0.842788244521620270, +-0.842761331204450070, -0.842734415780376670, -0.842707498249467330, -0.842680578611789020, -0.842653656867409450, -0.842626733016395790, -0.842599807058815320, -0.842572878994734990, +-0.842545948824222850, -0.842519016547345730, -0.842492082164171040, -0.842465145674766050, -0.842438207079198250, -0.842411266377535050, -0.842384323569843610, -0.842357378656191200, +-0.842330431636645560, -0.842303482511273850, -0.842276531280143460, -0.842249577943321450, -0.842222622500875760, -0.842195664952873460, -0.842168705299381810, -0.842141743540468670, +-0.842114779676201080, -0.842087813706646650, -0.842060845631872330, -0.842033875451946190, -0.842006903166935380, -0.841979928776907300, -0.841952952281929120, -0.841925973682068900, +-0.841898992977393680, -0.841872010167970970, -0.841845025253867950, -0.841818038235152670, -0.841791049111892290, -0.841764057884154320, -0.841737064552005920, -0.841710069115515160, +-0.841683071574749090, -0.841656071929775210, -0.841629070180661350, -0.841602066327474920, -0.841575060370283180, -0.841548052309153640, -0.841521042144154130, -0.841494029875352050, +-0.841467015502815000, -0.841439999026610040, -0.841412980446805350, -0.841385959763468190, -0.841358936976666190, -0.841331912086466630, -0.841304885092937440, -0.841277855996146130, +-0.841250824796160090, -0.841223791493046820, -0.841196756086874280, -0.841169718577709840, -0.841142678965621120, -0.841115637250675400, -0.841088593432940960, -0.841061547512484960, +-0.841034499489374810, -0.841007449363678660, -0.840980397135463910, -0.840953342804798280, -0.840926286371748930, -0.840899227836384040, -0.840872167198771230, -0.840845104458977980, +-0.840818039617071690, -0.840790972673120530, -0.840763903627191890, -0.840736832479353600, -0.840709759229672950, -0.840682683878218100, -0.840655606425056550, -0.840628526870256020, +-0.840601445213883910, -0.840574361456008500, -0.840547275596697060, -0.840520187636017320, -0.840493097574037230, -0.840466005410824500, -0.840438911146446750, -0.840411814780971380, +-0.840384716314466760, -0.840357615747000410, -0.840330513078639930, -0.840303408309453050, -0.840276301439507820, -0.840249192468871750, -0.840222081397612790, -0.840194968225798420, +-0.840167852953496830, -0.840140735580775620, -0.840113616107702520, -0.840086494534345140, -0.840059370860771870, -0.840032245087050100, -0.840005117213247440, -0.839977987239432290, +-0.839950855165672140, -0.839923720992034940, -0.839896584718588080, -0.839869446345400060, -0.839842305872538390, -0.839815163300071000, -0.839788018628065400, -0.839760871856590100, +-0.839733722985712470, -0.839706572015500700, -0.839679418946022160, -0.839652263777345250, -0.839625106509537810, -0.839597947142667560, -0.839570785676802210, -0.839543622112010060, +-0.839516456448358930, -0.839489288685916430, -0.839462118824750860, -0.839434946864930140, -0.839407772806521900, -0.839380596649594080, -0.839353418394214960, -0.839326238040452370, +-0.839299055588374140, -0.839271871038048010, -0.839244684389542470, -0.839217495642925250, -0.839190304798264290, -0.839163111855627200, -0.839135916815082710, -0.839108719676698310, +-0.839081520440542180, -0.839054319106682040, -0.839027115675186290, -0.838999910146122850, -0.838972702519559580, -0.838945492795564180, -0.838918280974205510, -0.838891067055550940, +-0.838863851039668540, -0.838836632926626800, -0.838809412716493450, -0.838782190409336550, -0.838754966005223920, -0.838727739504224190, -0.838700510906405070, -0.838673280211834630, +-0.838646047420580800, -0.838618812532712090, -0.838591575548296330, -0.838564336467401690, -0.838537095290095900, -0.838509852016447680, -0.838482606646524740, -0.838455359180395380, +-0.838428109618127190, -0.838400857959789140, -0.838373604205448930, -0.838346348355174410, -0.838319090409034300, -0.838291830367096540, -0.838264568229429070, -0.838237303996099970, +-0.838210037667177940, -0.838182769242730720, -0.838155498722826690, -0.838128226107533570, -0.838100951396920090, -0.838073674591054310, -0.838046395690004390, -0.838019114693838160, +-0.837991831602624360, -0.837964546416431030, -0.837937259135326350, -0.837909969759378260, -0.837882678288655480, -0.837855384723225960, -0.837828089063157870, -0.837800791308519700, +-0.837773491459379520, -0.837746189515805710, -0.837718885477866100, -0.837691579345629540, -0.837664271119164080, -0.837636960798537890, -0.837609648383819130, -0.837582333875076410, +-0.837555017272377910, -0.837527698575791790, -0.837500377785386220, -0.837473054901230030, -0.837445729923391060, -0.837418402851937920, -0.837391073686938440, -0.837363742428461450, +-0.837336409076575250, -0.837309073631347990, -0.837281736092847730, -0.837254396461143410, -0.837227054736303100, -0.837199710918394960, -0.837172365007487710, -0.837145017003649630, +-0.837117666906948890, -0.837090314717453880, -0.837062960435233210, -0.837035604060355260, -0.837008245592888220, -0.836980885032900250, -0.836953522380460390, -0.836926157635636820, +-0.836898790798497720, -0.836871421869111450, -0.836844050847546870, -0.836816677733872140, -0.836789302528155750, -0.836761925230465780, -0.836734545840871370, -0.836707164359440480, +-0.836679780786241500, -0.836652395121343260, -0.836625007364814040, -0.836597617516722350, -0.836570225577136340, -0.836542831546125080, -0.836515435423756730, -0.836488037210099680, +-0.836460636905222430, -0.836433234509193710, -0.836405830022081910, -0.836378423443955630, -0.836351014774883050, -0.836323604014933110, -0.836296191164174090, -0.836268776222674700, +-0.836241359190503130, -0.836213940067728420, -0.836186518854418750, -0.836159095550642610, -0.836131670156469050, -0.836104242671966260, -0.836076813097202830, -0.836049381432247050, +-0.836021947677168200, -0.835994511832034440, -0.835967073896914380, -0.835939633871876420, -0.835912191756989610, -0.835884747552322340, -0.835857301257943110, -0.835829852873920530, +-0.835802402400323440, -0.835774949837220450, -0.835747495184679940, -0.835720038442770540, -0.835692579611561290, -0.835665118691120590, -0.835637655681516820, -0.835610190582819270, +-0.835582723395096090, -0.835555254118416140, -0.835527782752847890, -0.835500309298460310, -0.835472833755322000, -0.835445356123501680, -0.835417876403067640, -0.835390394594089150, +-0.835362910696634710, -0.835335424710773040, -0.835307936636572550, -0.835280446474102380, -0.835252954223431150, -0.835225459884627490, -0.835197963457759980, -0.835170464942897820, +-0.835142964340109480, -0.835115461649463710, -0.835087956871029100, -0.835060450004874830, -0.835032941051069400, -0.835005430009681300, -0.834977916880780050, -0.834950401664433910, +-0.834922884360711710, -0.834895364969682090, -0.834867843491414300, -0.834840319925976960, -0.834812794273438800, -0.834785266533868420, -0.834757736707335110, -0.834730204793907470, +-0.834702670793654230, -0.834675134706644120, -0.834647596532946510, -0.834620056272629810, -0.834592513925762950, -0.834564969492414650, -0.834537422972654100, -0.834509874366550000, +-0.834482323674170970, -0.834454770895586400, -0.834427216030864890, -0.834399659080075300, -0.834372100043286320, -0.834344538920567480, -0.834316975711987150, -0.834289410417614400, +-0.834261843037517940, -0.834234273571767050, -0.834206702020430460, -0.834179128383577220, -0.834151552661275830, -0.834123974853595800, -0.834096394960605950, -0.834068812982375010, +-0.834041228918971810, -0.834013642770465750, -0.833986054536925540, -0.833958464218420130, -0.833930871815018680, -0.833903277326790040, -0.833875680753803250, -0.833848082096127040, +-0.833820481353830800, -0.833792878526983360, -0.833765273615653780, -0.833737666619910670, -0.833710057539823750, -0.833682446375461630, -0.833654833126893480, -0.833627217794187910, +-0.833599600377414540, -0.833571980876642190, -0.833544359291939930, -0.833516735623376470, -0.833489109871021430, -0.833461482034943630, -0.833433852115212150, -0.833406220111895690, +-0.833378586025063980, -0.833350949854785860, -0.833323311601130160, -0.833295671264166260, -0.833268028843963340, -0.833240384340590220, -0.833212737754115970, -0.833185089084610090, +-0.833157438332141510, -0.833129785496779300, -0.833102130578592500, -0.833074473577650520, -0.833046814494022290, -0.833019153327777100, -0.832991490078983880, -0.832963824747712020, +-0.832936157334030700, -0.832908487838008970, -0.832880816259715660, -0.832853142599220720, -0.832825466856592870, -0.832797789031901050, -0.832770109125215100, -0.832742427136603740, +-0.832714743066136460, -0.832687056913882010, -0.832659368679910080, -0.832631678364289860, -0.832603985967090400, -0.832576291488380750, -0.832548594928230630, -0.832520896286708890, +-0.832493195563885010, -0.832465492759827950, -0.832437787874607320, -0.832410080908292270, -0.832382371860951990, -0.832354660732655520, -0.832326947523472690, -0.832299232233472460, +-0.832271514862723880, -0.832243795411296780, -0.832216073879260220, -0.832188350266683470, -0.832160624573635600, -0.832132896800186430, -0.832105166946405020, -0.832077435012360640, +-0.832049700998122480, -0.832021964903760240, -0.831994226729343200, -0.831966486474940430, -0.831938744140621300, -0.831910999726455550, -0.831883253232512330, -0.831855504658860930, +-0.831827754005570630, -0.831800001272711030, -0.831772246460351530, -0.831744489568561170, -0.831716730597409800, -0.831688969546966580, -0.831661206417300900, -0.831633441208482040, +-0.831605673920579820, -0.831577904553663430, -0.831550133107802240, -0.831522359583065530, -0.831494583979523030, -0.831466806297244230, -0.831439026536298310, -0.831411244696754650, +-0.831383460778683080, -0.831355674782152780, -0.831327886707233450, -0.831300096553994060, -0.831272304322504760, -0.831244510012834610, -0.831216713625053230, -0.831188915159229770, +-0.831161114615434290, -0.831133311993736080, -0.831105507294204290, -0.831077700516908990, -0.831049891661919450, -0.831022080729305170, -0.830994267719135430, -0.830966452631480280, +-0.830938635466409000, -0.830910816223991100, -0.830882994904295960, -0.830855171507393630, -0.830827346033353290, -0.830799518482244650, -0.830771688854136880, -0.830743857149100150, +-0.830716023367203740, -0.830688187508517360, -0.830660349573110300, -0.830632509561052500, -0.830604667472413460, -0.830576823307262570, -0.830548977065669770, -0.830521128747704670, +-0.830493278353436670, -0.830465425882935150, -0.830437571336270390, -0.830409714713511770, -0.830381856014728690, -0.830353995239990870, -0.830326132389368250, -0.830298267462930340, +-0.830270400460746740, -0.830242531382886840, -0.830214660229420920, -0.830186787000418260, -0.830158911695948800, -0.830131034316081710, -0.830103154860887260, -0.830075273330434960, +-0.830047389724794190, -0.830019504044035240, -0.829991616288227490, -0.829963726457440760, -0.829935834551744470, -0.829907940571208760, -0.829880044515903250, -0.829852146385897660, +-0.829824246181261380, -0.829796343902064800, -0.829768439548377310, -0.829740533120268740, -0.829712624617808590, -0.829684714041067140, -0.829656801390113880, -0.829628886665018660, +-0.829600969865850970, -0.829573050992681080, -0.829545130045578500, -0.829517207024613180, -0.829489281929854600, -0.829461354761373060, -0.829433425519238040, -0.829405494203519390, +-0.829377560814287040, -0.829349625351610940, -0.829321687815560700, -0.829293748206206050, -0.829265806523617250, -0.829237862767863930, -0.829209916939016020, -0.829181969037142920, +-0.829154019062315230, -0.829126067014602560, -0.829098112894074650, -0.829070156700801200, -0.829042198434852610, -0.829014238096298590, -0.828986275685208880, -0.828958311201653310, +-0.828930344645702140, -0.828902376017425220, -0.828874405316892050, -0.828846432544173120, -0.828818457699338040, -0.828790480782456870, -0.828762501793599230, -0.828734520732835600, +-0.828706537600235720, -0.828678552395869410, -0.828650565119806500, -0.828622575772117510, -0.828594584352872030, -0.828566590862140020, -0.828538595299991300, -0.828510597666496370, +-0.828482597961724960, -0.828454596185747130, -0.828426592338632470, -0.828398586420451500, -0.828370578431274150, -0.828342568371170150, -0.828314556240209890, -0.828286542038463300, +-0.828258525766000340, -0.828230507422890840, -0.828202487009205290, -0.828174464525013530, -0.828146439970385620, -0.828118413345391380, -0.828090384650101320, -0.828062353884585270, +-0.828034321048913390, -0.828006286143155410, -0.827978249167382050, -0.827950210121662920, -0.827922169006068410, -0.827894125820668240, -0.827866080565532900, -0.827838033240732350, +-0.827809983846336530, -0.827781932382416040, -0.827753878849040610, -0.827725823246280520, -0.827697765574205710, -0.827669705832886680, -0.827641644022393370, -0.827613580142795960, +-0.827585514194164370, -0.827557446176569230, -0.827529376090080370, -0.827501303934768170, -0.827473229710702470, -0.827445153417953990, -0.827417075056592570, -0.827388994626688470, +-0.827360912128311640, -0.827332827561532700, -0.827304740926421810, -0.827276652223049020, -0.827248561451484290, -0.827220468611798430, -0.827192373704061510, -0.827164276728343360, +-0.827136177684714700, -0.827108076573245590, -0.827079973394006410, -0.827051868147066880, -0.827023760832498070, -0.826995651450369800, -0.826967540000752450, -0.826939426483715880, +-0.826911310899331120, -0.826883193247668010, -0.826855073528796950, -0.826826951742787970, -0.826798827889711820, -0.826770701969638640, -0.826742573982638620, -0.826714443928782020, +-0.826686311808139560, -0.826658177620781310, -0.826630041366777310, -0.826601903046198520, -0.826573762659114860, -0.826545620205596960, -0.826517475685714650, -0.826489329099538870, +-0.826461180447139900, -0.826433029728587900, -0.826404876943953040, -0.826376722093306260, -0.826348565176717730, -0.826320406194257730, -0.826292245145996530, -0.826264082032004850, +-0.826235916852353090, -0.826207749607111520, -0.826179580296350300, -0.826151408920140270, -0.826123235478551820, -0.826095059971655110, -0.826066882399520860, -0.826038702762219470, +-0.826010521059821310, -0.825982337292396670, -0.825954151460016380, -0.825925963562750720, -0.825897773600670070, -0.825869581573844820, -0.825841387482345920, -0.825813191326243420, +-0.825784993105608050, -0.825756792820509840, -0.825728590471019990, -0.825700386057208640, -0.825672179579146290, -0.825643971036903350, -0.825615760430550630, -0.825587547760158520, +-0.825559333025797540, -0.825531116227538050, -0.825502897365450910, -0.825474676439606590, -0.825446453450075390, -0.825418228396928130, -0.825390001280235430, -0.825361772100067670, +-0.825333540856495350, -0.825305307549589310, -0.825277072179420030, -0.825248834746058040, -0.825220595249573810, -0.825192353690038290, -0.825164110067521880, -0.825135864382095190, +-0.825107616633828590, -0.825079366822793150, -0.825051114949059360, -0.825022861012697730, -0.824994605013778750, -0.824966346952373470, -0.824938086828552410, -0.824909824642385820, +-0.824881560393944890, -0.824853294083300100, -0.824825025710522080, -0.824796755275681190, -0.824768482778848730, -0.824740208220094970, -0.824711931599490740, -0.824683652917106550, +-0.824655372173013320, -0.824627089367281680, -0.824598804499982350, -0.824570517571185820, -0.824542228580963150, -0.824513937529384950, -0.824485644416521830, -0.824457349242444510, +-0.824429052007223940, -0.824400752710930830, -0.824372451353635460, -0.824344147935409330, -0.824315842456322830, -0.824287534916446680, -0.824259225315851380, -0.824230913654608320, +-0.824202599932787990, -0.824174284150461230, -0.824145966307698430, -0.824117646404570970, -0.824089324441149350, -0.824061000417504520, -0.824032674333706860, -0.824004346189827760, +-0.823976015985937840, -0.823947683722107920, -0.823919349398408500, -0.823891013014910970, -0.823862674571685830, -0.823834334068803800, -0.823805991506336150, -0.823777646884353620, +-0.823749300202926920, -0.823720951462126760, -0.823692600662024430, -0.823664247802690540, -0.823635892884196140, -0.823607535906611730, -0.823579176870008700, -0.823550815774457770, +-0.823522452620029770, -0.823494087406795310, -0.823465720134826000, -0.823437350804192340, -0.823408979414965270, -0.823380605967215520, -0.823352230461014580, -0.823323852896433060, +-0.823295473273541800, -0.823267091592411630, -0.823238707853114040, -0.823210322055719650, -0.823181934200299280, -0.823153544286924220, -0.823125152315665410, -0.823096758286593570, +-0.823068362199779750, -0.823039964055295110, -0.823011563853210730, -0.822983161593597300, -0.822954757276525780, -0.822926350902067560, -0.822897942470293580, -0.822869531981274660, +-0.822841119435081650, -0.822812704831786150, -0.822784288171458880, -0.822755869454170790, -0.822727448679992920, -0.822699025848996570, -0.822670600961252660, -0.822642174016832040, +-0.822613745015806200, -0.822585313958246080, -0.822556880844222630, -0.822528445673806670, -0.822500008447069940, -0.822471569164083150, -0.822443127824917460, -0.822414684429643610, +-0.822386238978333410, -0.822357791471057590, -0.822329341907887200, -0.822300890288893300, -0.822272436614147400, -0.822243980883720420, -0.822215523097683420, -0.822187063256107460, +-0.822158601359064050, -0.822130137406624110, -0.822101671398858700, -0.822073203335839220, -0.822044733217636820, -0.822016261044322460, -0.821987786815967290, -0.821959310532642930, +-0.821930832194420310, -0.821902351801370500, -0.821873869353564660, -0.821845384851074390, -0.821816898293970640, -0.821788409682324580, -0.821759919016207260, -0.821731426295690400, +-0.821702931520845060, -0.821674434691742280, -0.821645935808453240, -0.821617434871049660, -0.821588931879602360, -0.821560426834182840, -0.821531919734861950, -0.821503410581711500, +-0.821474899374802560, -0.821446386114206060, -0.821417870799993950, -0.821389353432237180, -0.821360834011006900, -0.821332312536374290, -0.821303789008411280, -0.821275263427188710, +-0.821246735792777960, -0.821218206105250090, -0.821189674364677050, -0.821161140571129770, -0.821132604724679640, -0.821104066825397830, -0.821075526873356050, -0.821046984868625370, +-0.821018440811277280, -0.820989894701382950, -0.820961346539013980, -0.820932796324241760, -0.820904244057137240, -0.820875689737772360, -0.820847133366218170, -0.820818574942546290, +-0.820790014466827640, -0.820761451939134300, -0.820732887359537310, -0.820704320728107950, -0.820675752044917720, -0.820647181310038220, -0.820618608523540850, -0.820590033685496990, +-0.820561456795977700, -0.820532877855055130, -0.820504296862800240, -0.820475713819284750, -0.820447128724579590, -0.820418541578756930, -0.820389952381887940, -0.820361361134043790, +-0.820332767835296410, -0.820304172485717190, -0.820275575085377520, -0.820246975634348670, -0.820218374132702710, -0.820189770580510680, -0.820161164977844300, -0.820132557324774750, +-0.820103947621374060, -0.820075335867713530, -0.820046722063864530, -0.820018106209898570, -0.819989488305887580, -0.819960868351902960, -0.819932246348016090, -0.819903622294298360, +-0.819874996190821830, -0.819846368037657760, -0.819817737834877770, -0.819789105582553250, -0.819760471280756240, -0.819731834929557920, -0.819703196529029900, -0.819674556079244110, +-0.819645913580271830, -0.819617269032184900, -0.819588622435054480, -0.819559973788952730, -0.819531323093951160, -0.819502670350121140, -0.819474015557534300, -0.819445358716262670, +-0.819416699826377550, -0.819388038887950750, -0.819359375901053570, -0.819330710865758260, -0.819302043782136110, -0.819273374650258850, -0.819244703470197950, -0.819216030242025490, +-0.819187354965812960, -0.819158677641631860, -0.819129998269554240, -0.819101316849651710, -0.819072633381995760, -0.819043947866658130, -0.819015260303710750, -0.818986570693225340, +-0.818957879035273400, -0.818929185329926530, -0.818900489577257030, -0.818871791777336160, -0.818843091930235970, -0.818814390036027740, -0.818785686094783750, -0.818756980106575490, +-0.818728272071474920, -0.818699561989553400, -0.818670849860883120, -0.818642135685535790, -0.818613419463582900, -0.818584701195096630, -0.818555980880148580, -0.818527258518810700, +-0.818498534111154360, -0.818469807657251970, -0.818441079157175010, -0.818412348610995430, -0.818383616018784620, -0.818354881380615070, -0.818326144696558400, -0.818297405966686210, +-0.818268665191070330, -0.818239922369783050, -0.818211177502895960, -0.818182430590481010, -0.818153681632609600, -0.818124930629354320, -0.818096177580786680, -0.818067422486978390, +-0.818038665348001740, -0.818009906163928440, -0.817981144934830320, -0.817952381660779220, -0.817923616341847290, -0.817894848978106380, -0.817866079569628310, -0.817837308116484810, +-0.817808534618748360, -0.817779759076490480, -0.817750981489783200, -0.817722201858698260, -0.817693420183308040, -0.817664636463684370, -0.817635850699898970, -0.817607062892023780, +-0.817578273040131090, -0.817549481144292820, -0.817520687204580820, -0.817491891221066800, -0.817463093193823380, -0.817434293122922150, -0.817405491008434960, -0.817376686850434410, +-0.817347880648992000, -0.817319072404179890, -0.817290262116069920, -0.817261449784734580, -0.817232635410245490, -0.817203818992674910, -0.817175000532094460, -0.817146180028576860, +-0.817117357482193720, -0.817088532893017190, -0.817059706261119120, -0.817030877586572000, -0.817002046869447770, -0.816973214109818380, -0.816944379307755650, -0.816915542463332200, +-0.816886703576619970, -0.816857862647690670, -0.816829019676617030, -0.816800174663470770, -0.816771327608324160, -0.816742478511248930, -0.816713627372317790, -0.816684774191602570, +-0.816655918969175440, -0.816627061705108130, -0.816598202399473560, -0.816569341052343470, -0.816540477663790010, -0.816511612233885020, -0.816482744762701330, -0.816453875250310770, +-0.816425003696785500, -0.816396130102197470, -0.816367254466619400, -0.816338376790123220, -0.816309497072780780, -0.816280615314664890, -0.816251731515847510, -0.816222845676400690, +-0.816193957796396590, -0.816165067875907810, -0.816136175915006310, -0.816107281913764470, -0.816078385872254120, -0.816049487790548090, -0.816020587668718320, -0.815991685506837090, +-0.815962781304976350, -0.815933875063208910, -0.815904966781606840, -0.815876056460242300, -0.815847144099187460, -0.815818229698514920, -0.815789313258296840, -0.815760394778605510, +-0.815731474259512870, -0.815702551701091850, -0.815673627103414400, -0.815644700466552690, -0.815615771790579420, -0.815586841075566780, -0.815557908321587030, -0.815528973528712230, +-0.815500036697015210, -0.815471097826568130, -0.815442156917443370, -0.815413213969712890, -0.815384268983449730, -0.815355321958725730, -0.815326372895613600, -0.815297421794185180, +-0.815268468654513520, -0.815239513476670560, -0.815210556260728910, -0.815181597006760630, -0.815152635714838650, -0.815123672385035030, -0.815094707017421930, -0.815065739612072400, +-0.815036770169058510, -0.815007798688452630, -0.814978825170327050, -0.814949849614754700, -0.814920872021807630, -0.814891892391558350, -0.814862910724079240, -0.814833927019443020, +-0.814804941277721960, -0.814775953498988570, -0.814746963683315120, -0.814717971830774430, -0.814688977941438800, -0.814659982015380810, -0.814630984052672540, -0.814601984053387020, +-0.814572982017596650, -0.814543977945373480, -0.814514971836790670, -0.814485963691920390, -0.814456953510835250, -0.814427941293607520, -0.814398927040310030, -0.814369910751015390, +-0.814340892425795880, -0.814311872064723890, -0.814282849667872570, -0.814253825235313980, -0.814224798767120950, -0.814195770263365540, -0.814166739724121010, -0.814137707149459660, +-0.814108672539454070, -0.814079635894176530, -0.814050597213700100, -0.814021556498097270, -0.813992513747440190, -0.813963468961802160, -0.813934422141255440, -0.813905373285872650, +-0.813876322395726160, -0.813847269470889150, -0.813818214511433880, -0.813789157517433190, -0.813760098488959360, -0.813731037426085440, -0.813701974328884030, -0.813672909197427520, +-0.813643842031788630, -0.813614772832040420, -0.813585701598255160, -0.813556628330505680, -0.813527553028864370, -0.813498475693404500, -0.813469396324198350, -0.813440314921318740, +-0.813411231484838180, -0.813382146014829720, -0.813353058511365860, -0.813323968974519080, -0.813294877404362680, -0.813265783800969140, -0.813236688164411080, -0.813207590494761100, +-0.813178490792092370, -0.813149389056477380, -0.813120285287988960, -0.813091179486699510, -0.813062071652682410, -0.813032961786010140, -0.813003849886755450, -0.812974735954990920, +-0.812945619990789740, -0.812916501994224490, -0.812887381965368140, -0.812858259904292950, -0.812829135811072410, -0.812800009685778920, -0.812770881528485310, -0.812741751339264630, +-0.812712619118189710, -0.812683484865333150, -0.812654348580767570, -0.812625210264566470, -0.812596069916802330, -0.812566927537548000, -0.812537783126876080, -0.812508636684859950, +-0.812479488211572340, -0.812450337707085860, -0.812421185171473330, -0.812392030604808140, -0.812362874007162890, -0.812333715378610320, -0.812304554719223360, -0.812275392029075170, +-0.812246227308238590, -0.812217060556786110, -0.812187891774791230, -0.812158720962326660, -0.812129548119465250, -0.812100373246279710, -0.812071196342843530, -0.812042017409229320, +-0.812012836445510140, -0.811983653451758600, -0.811954468428048080, -0.811925281374451520, -0.811896092291041650, -0.811866901177891400, -0.811837708035074050, -0.811808512862662530, +-0.811779315660729580, -0.811750116429348250, -0.811720915168591790, -0.811691711878533060, -0.811662506559245100, -0.811633299210800520, -0.811604089833273030, -0.811574878426735260, +-0.811545664991260130, -0.811516449526921040, -0.811487232033790810, -0.811458012511942490, -0.811428790961448930, -0.811399567382383610, -0.811370341774819370, -0.811341114138829260, +-0.811311884474486210, -0.811282652781863620, -0.811253419061034430, -0.811224183312071580, -0.811194945535048120, -0.811165705730037550, -0.811136463897112690, -0.811107220036346720, +-0.811077974147812460, -0.811048726231583420, -0.811019476287732630, -0.810990224316332940, -0.810960970317457840, -0.810931714291180380, -0.810902456237573620, -0.810873196156710500, +-0.810843934048664620, -0.810814669913508810, -0.810785403751316470, -0.810756135562160310, -0.810726865346114050, -0.810697593103250620, -0.810668318833643210, -0.810639042537364850, +-0.810609764214488940, -0.810580483865088740, -0.810551201489237320, -0.810521917087007710, -0.810492630658473430, -0.810463342203707750, -0.810434051722783270, -0.810404759215774040, +-0.810375464682752900, -0.810346168123793010, -0.810316869538967530, -0.810287568928350080, -0.810258266292013700, -0.810228961630031770, -0.810199654942477030, -0.810170346229423520, +-0.810141035490944070, -0.810111722727112180, -0.810082407938000570, -0.810053091123683180, -0.810023772284233170, -0.809994451419723700, -0.809965128530227840, -0.809935803615819410, +-0.809906476676571450, -0.809877147712557030, -0.809847816723849980, -0.809818483710523450, -0.809789148672650730, -0.809759811610304860, -0.809730472523559670, -0.809701131412488340, +-0.809671788277164240, -0.809642443117660320, -0.809613095934050620, -0.809583746726408090, -0.809554395494806230, -0.809525042239318090, -0.809495686960017720, -0.809466329656978070, +-0.809436970330272510, -0.809407608979974440, -0.809378245606157450, -0.809348880208894950, -0.809319512788260200, -0.809290143344326360, -0.809260771877167500, -0.809231398386856650, +-0.809202022873467100, -0.809172645337072780, -0.809143265777746760, -0.809113884195562630, -0.809084500590593560, -0.809055114962913490, -0.809025727312595590, -0.808996337639713350, +-0.808966945944340040, -0.808937552226549620, -0.808908156486415340, -0.808878758724010720, -0.808849358939408790, -0.808819957132683840, -0.808790553303909030, -0.808761147453157750, +-0.808731739580503370, -0.808702329686019850, -0.808672917769780560, -0.808643503831858680, -0.808614087872328360, -0.808584669891262760, -0.808555249888735620, -0.808525827864819970, +-0.808496403819589980, -0.808466977753119040, -0.808437549665480650, -0.808408119556748180, -0.808378687426995590, -0.808349253276296360, -0.808319817104723890, -0.808290378912351670, +-0.808260938699253860, -0.808231496465503520, -0.808202052211174580, -0.808172605936340220, -0.808143157641074580, -0.808113707325451070, -0.808084254989542950, -0.808054800633424500, +-0.808025344257169100, -0.807995885860850360, -0.807966425444541560, -0.807936963008316970, -0.807907498552249970, -0.807878032076414290, -0.807848563580883190, -0.807819093065731080, +-0.807789620531031090, -0.807760145976857080, -0.807730669403282530, -0.807701190810381500, -0.807671710198227480, -0.807642227566894190, -0.807612742916455020, -0.807583256246984350, +-0.807553767558555460, -0.807524276851242170, -0.807494784125117990, -0.807465289380257080, -0.807435792616732930, -0.807406293834619040, -0.807376793033989680, -0.807347290214918360, +-0.807317785377478780, -0.807288278521744560, -0.807258769647789750, -0.807229258755688180, -0.807199745845513350, -0.807170230917338970, -0.807140713971239210, -0.807111195007287670, +-0.807081674025558190, -0.807052151026124260, -0.807022626009060160, -0.806993098974439490, -0.806963569922336200, -0.806934038852823550, -0.806904505765976170, -0.806874970661867530, +-0.806845433540571140, -0.806815894402161500, -0.806786353246712110, -0.806756810074296780, -0.806727264884989250, -0.806697717678863780, -0.806668168455993980, -0.806638617216453800, +-0.806609063960316730, -0.806579508687657380, -0.806549951398549240, -0.806520392093066140, -0.806490830771281920, -0.806461267433270850, -0.806431702079106530, -0.806402134708863020, +-0.806372565322613920, -0.806342993920433630, -0.806313420502395850, -0.806283845068574310, -0.806254267619043400, -0.806224688153876820, -0.806195106673148420, -0.806165523176932130, +-0.806135937665302230, -0.806106350138332540, -0.806076760596096900, -0.806047169038669130, -0.806017575466123740, -0.805987979878534320, -0.805958382275975050, -0.805928782658519530, +-0.805899181026242360, -0.805869577379217160, -0.805839971717517980, -0.805810364041218750, -0.805780754350393760, -0.805751142645116940, -0.805721528925462000, -0.805691913191503460, +-0.805662295443315140, -0.805632675680971080, -0.805603053904545120, -0.805573430114111750, -0.805543804309744820, -0.805514176491518350, -0.805484546659506200, -0.805454914813782950, +-0.805425280954422340, -0.805395645081498630, -0.805366007195085550, -0.805336367295257590, -0.805306725382088810, -0.805277081455653240, -0.805247435516024730, -0.805217787563277780, +-0.805188137597486420, -0.805158485618724720, -0.805128831627066500, -0.805099175622586480, -0.805069517605358610, -0.805039857575456600, -0.805010195532955160, -0.804980531477928360, +-0.804950865410450130, -0.804921197330594530, -0.804891527238436160, -0.804861855134048950, -0.804832181017507200, -0.804802504888884720, -0.804772826748256230, -0.804743146595695570, +-0.804713464431277110, -0.804683780255074810, -0.804654094067163150, -0.804624405867616410, -0.804594715656508640, -0.804565023433913670, -0.804535329199906560, -0.804505632954561120, +-0.804475934697951310, -0.804446234430151840, -0.804416532151236870, -0.804386827861280570, -0.804357121560356880, -0.804327413248540730, -0.804297702925905970, -0.804267990592527070, +-0.804238276248477880, -0.804208559893833220, -0.804178841528667140, -0.804149121153054040, -0.804119398767067730, -0.804089674370783380, -0.804059947964274710, -0.804030219547616220, +-0.804000489120881840, -0.803970756684146640, -0.803941022237484430, -0.803911285780969490, -0.803881547314676540, -0.803851806838679740, -0.803822064353053370, -0.803792319857871700, +-0.803762573353209440, -0.803732824839140660, -0.803703074315739950, -0.803673321783081150, -0.803643567241239420, -0.803613810690288810, -0.803584052130303590, -0.803554291561357940, +-0.803524528983526890, -0.803494764396884500, -0.803464997801505270, -0.803435229197463130, -0.803405458584833370, -0.803375685963689800, -0.803345911334107150, -0.803316134696159370, +-0.803286356049921490, -0.803256575395467800, -0.803226792732872340, -0.803197008062210170, -0.803167221383555560, -0.803137432696982790, -0.803107642002566240, -0.803077849300380840, +-0.803048054590500770, -0.803018257873000630, -0.802988459147954580, -0.802958658415437570, -0.802928855675524080, -0.802899050928288280, -0.802869244173804670, -0.802839435412148190, +-0.802809624643393120, -0.802779811867614050, -0.802749997084885040, -0.802720180295281470, -0.802690361498877400, -0.802660540695747100, -0.802630717885965740, -0.802600893069607580, +-0.802571066246747230, -0.802541237417458860, -0.802511406581817740, -0.802481573739898150, -0.802451738891774570, -0.802421902037521280, -0.802392063177213680, -0.802362222310925800, +-0.802332379438732370, -0.802302534560707770, -0.802272687676927050, -0.802242838787464720, -0.802212987892395150, -0.802183134991792950, -0.802153280085733170, -0.802123423174290200, +-0.802093564257538310, -0.802063703335552880, -0.802033840408408080, -0.802003975476178740, -0.801974108538939250, -0.801944239596764640, -0.801914368649729540, -0.801884495697908540, +-0.801854620741375920, -0.801824743780207070, -0.801794864814476370, -0.801764983844258540, -0.801735100869627960, -0.801705215890659790, -0.801675328907428650, -0.801645439920009250, +-0.801615548928475970, -0.801585655932903980, -0.801555760933368000, -0.801525863929942290, -0.801495964922702140, -0.801466063911722150, -0.801436160897076920, -0.801406255878841070, +-0.801376348857089860, -0.801346439831897790, -0.801316528803339480, -0.801286615771489740, -0.801256700736423740, -0.801226783698215870, -0.801196864656941070, -0.801166943612673930, +-0.801137020565489630, -0.801107095515462770, -0.801077168462668190, -0.801047239407180480, -0.801017308349074810, -0.800987375288426010, -0.800957440225308680, -0.800927503159797440, +-0.800897564091967880, -0.800867623021894290, -0.800837679949651380, -0.800807734875314540, -0.800777787798958360, -0.800747838720657690, -0.800717887640487240, -0.800687934558522270, +-0.800657979474837520, -0.800628022389507700, -0.800598063302607740, -0.800568102214212820, -0.800538139124397530, -0.800508174033236930, -0.800478206940805740, -0.800448237847179220, +-0.800418266752432110, -0.800388293656639330, -0.800358318559875600, -0.800328341462216320, -0.800298362363736190, -0.800268381264509830, -0.800238398164612840, -0.800208413064119830, +-0.800178425963105840, -0.800148436861645500, -0.800118445759814280, -0.800088452657686910, -0.800058457555338550, -0.800028460452843700, -0.799998461350277970, -0.799968460247716060, +-0.799938457145233040, -0.799908452042903620, -0.799878444940803290, -0.799848435839006890, -0.799818424737589350, -0.799788411636625510, -0.799758396536190960, -0.799728379436360330, +-0.799698360337208540, -0.799668339238811090, -0.799638316141242810, -0.799608291044578760, -0.799578263948893750, -0.799548234854263300, -0.799518203760762210, -0.799488170668465670, +-0.799458135577448380, -0.799428098487786070, -0.799398059399553550, -0.799368018312825780, -0.799337975227677800, -0.799307930144185110, -0.799277883062422530, -0.799247833982465350, +-0.799217782904388270, -0.799187729828267020, -0.799157674754176430, -0.799127617682191650, -0.799097558612387520, -0.799067497544839860, -0.799037434479623390, -0.799007369416813050, +-0.798977302356484560, -0.798947233298712870, -0.798917162243573010, -0.798887089191140040, -0.798857014141489570, -0.798826937094696650, -0.798796858050836330, -0.798766777009983550, +-0.798736693972214250, -0.798706608937603040, -0.798676521906225400, -0.798646432878156180, -0.798616341853471080, -0.798586248832245270, -0.798556153814553690, -0.798526056800471510, +-0.798495957790074540, -0.798465856783437510, -0.798435753780635690, -0.798405648781744800, -0.798375541786839670, -0.798345432795995680, -0.798315321809287880, -0.798285208826792100, +-0.798255093848583290, -0.798224976874736700, -0.798194857905327400, -0.798164736940431220, -0.798134613980123200, -0.798104489024478610, -0.798074362073572630, -0.798044233127480960, +-0.798014102186278660, -0.797983969250041230, -0.797953834318843480, -0.797923697392761480, -0.797893558471870160, -0.797863417556244790, -0.797833274645961100, -0.797803129741094240, +-0.797772982841719490, -0.797742833947912010, -0.797712683059747850, -0.797682530177301840, -0.797652375300649590, -0.797622218429866030, -0.797592059565027320, -0.797561898706208420, +-0.797531735853484690, -0.797501571006931420, -0.797471404166624540, -0.797441235332639110, -0.797411064505050620, -0.797380891683934110, -0.797350716869365650, -0.797320540061420500, +-0.797290361260173610, -0.797260180465701240, -0.797229997678078340, -0.797199812897380400, -0.797169626123682700, -0.797139437357061160, -0.797109246597591080, -0.797079053845347830, +-0.797048859100406790, -0.797018662362843800, -0.796988463632734120, -0.796958262910153260, -0.796928060195176590, -0.796897855487879950, -0.796867648788338710, -0.796837440096628380, +-0.796807229412824110, -0.796777016737002080, -0.796746802069237430, -0.796716585409605880, -0.796686366758182610, -0.796656146115043650, -0.796625923480264290, -0.796595698853919900, +-0.796565472236086420, -0.796535243626839360, -0.796505013026254200, -0.796474780434406230, -0.796444545851371590, -0.796414309277225560, -0.796384070712043760, -0.796353830155901440, +-0.796323587608874890, -0.796293343071039380, -0.796263096542470520, -0.796232848023243680, -0.796202597513434920, -0.796172345013119730, -0.796142090522373610, -0.796111834041271950, +-0.796081575569891120, -0.796051315108306290, -0.796021052656592840, -0.795990788214827050, -0.795960521783084410, -0.795930253361440300, -0.795899982949970440, -0.795869710548750780, +-0.795839436157856910, -0.795809159777364330, -0.795778881407348760, -0.795748601047886140, -0.795718318699051960, -0.795688034360922170, -0.795657748033571920, -0.795627459717077600, +-0.795597169411514590, -0.795566877116958620, -0.795536582833485270, -0.795506286561170730, -0.795475988300090360, -0.795445688050319900, -0.795415385811935380, -0.795385081585012530, +-0.795354775369626840, -0.795324467165854030, -0.795294156973770260, -0.795263844793451140, -0.795233530624972370, -0.795203214468409470, -0.795172896323838920, -0.795142576191335990, +-0.795112254070976740, -0.795081929962836550, -0.795051603866991810, -0.795021275783518000, -0.794990945712491070, -0.794960613653986510, -0.794930279608080600, -0.794899943574849050, +-0.794869605554367700, -0.794839265546712030, -0.794808923551958420, -0.794778579570182500, -0.794748233601459960, -0.794717885645866980, -0.794687535703479390, -0.794657183774372890, +-0.794626829858623210, -0.794596473956306730, -0.794566116067499050, -0.794535756192276010, -0.794505394330713320, -0.794475030482887480, -0.794444664648874090, -0.794414296828748980, +-0.794383927022587870, -0.794353555230467250, -0.794323181452462720, -0.794292805688650240, -0.794262427939105400, -0.794232048203904810, -0.794201666483124180, -0.794171282776839020, +-0.794140897085125920, -0.794110509408060610, -0.794080119745719020, -0.794049728098176870, -0.794019334465510650, -0.793988938847796090, -0.793958541245109230, -0.793928141657525790, +-0.793897740085122150, -0.793867336527974250, -0.793836930986157930, -0.793806523459749000, -0.793776113948824080, -0.793745702453458880, -0.793715288973729450, -0.793684873509711510, +-0.793654456061481660, -0.793624036629115630, -0.793593615212689230, -0.793563191812279190, -0.793532766427961000, -0.793502339059811050, -0.793471909707904820, -0.793441478372319150, +-0.793411045053129870, -0.793380609750412910, -0.793350172464244110, -0.793319733194700280, -0.793289291941856930, -0.793258848705790550, -0.793228403486576640, -0.793197956284292020, +-0.793167507099012510, -0.793137055930814290, -0.793106602779773180, -0.793076147645965680, -0.793045690529467940, -0.793015231430355680, -0.792984770348705630, -0.792954307284593600, +-0.792923842238095870, -0.792893375209288150, -0.792862906198247400, -0.792832435205049310, -0.792801962229770170, -0.792771487272485810, -0.792741010333272930, -0.792710531412207600, +-0.792680050509366070, -0.792649567624823970, -0.792619082758658330, -0.792588595910944880, -0.792558107081760000, -0.792527616271179620, -0.792497123479280360, -0.792466628706138380, +-0.792436131951829830, -0.792405633216430650, -0.792375132500017680, -0.792344629802666840, -0.792314125124454200, -0.792283618465456470, -0.792253109825749700, -0.792222599205410160, +-0.792192086604513900, -0.792161572023137640, -0.792131055461357540, -0.792100536919249750, -0.792070016396890340, -0.792039493894356130, -0.792008969411723160, -0.791978442949067830, +-0.791947914506466180, -0.791917384083994920, -0.791886851681730230, -0.791856317299748370, -0.791825780938125500, -0.791795242596938450, -0.791764702276263280, -0.791734159976176020, +-0.791703615696753740, -0.791673069438072360, -0.791642521200208280, -0.791611970983237660, -0.791581418787237420, -0.791550864612283630, -0.791520308458452670, -0.791489750325820580, +-0.791459190214464540, -0.791428628124460350, -0.791398064055884750, -0.791367498008813560, -0.791336929983324060, -0.791306359979492170, -0.791275787997394290, -0.791245214037106790, +-0.791214638098706510, -0.791184060182269610, -0.791153480287872250, -0.791122898415591580, -0.791092314565503550, -0.791061728737684770, -0.791031140932211390, -0.791000551149160460, +-0.790969959388608030, -0.790939365650630830, -0.790908769935305010, -0.790878172242707400, -0.790847572572914380, -0.790816970926002450, -0.790786367302047880, -0.790755761701127600, +-0.790725154123317900, -0.790694544568695370, -0.790663933037336180, -0.790633319529317370, -0.790602704044715330, -0.790572086583606560, -0.790541467146067210, -0.790510845732174560, +-0.790480222342004660, -0.790449596975634110, -0.790418969633139730, -0.790388340314597930, -0.790357709020085290, -0.790327075749678090, -0.790296440503453490, -0.790265803281487880, +-0.790235164083857630, -0.790204522910639250, -0.790173879761909780, -0.790143234637745720, -0.790112587538223550, -0.790081938463419560, -0.790051287413411020, -0.790020634388274300, +-0.789989979388086020, -0.789959322412922440, -0.789928663462860840, -0.789898002537977590, -0.789867339638349100, -0.789836674764052500, -0.789806007915164310, -0.789775339091761010, +-0.789744668293919090, -0.789713995521715730, -0.789683320775227400, -0.789652644054530840, -0.789621965359702300, -0.789591284690819300, -0.789560602047957970, -0.789529917431195050, +-0.789499230840607140, -0.789468542276271500, -0.789437851738264420, -0.789407159226662710, -0.789376464741542880, -0.789345768282982090, -0.789315069851056930, -0.789284369445843790, +-0.789253667067420060, -0.789222962715862120, -0.789192256391246790, -0.789161548093650470, -0.789130837823150630, -0.789100125579823670, -0.789069411363746420, -0.789038695174995360, +-0.789007977013647780, -0.788977256879780380, -0.788946534773469770, -0.788915810694792550, -0.788885084643826010, -0.788854356620646850, -0.788823626625331790, -0.788792894657957430, +-0.788762160718600950, -0.788731424807339150, -0.788700686924248550, -0.788669947069406520, -0.788639205242889660, -0.788608461444774700, -0.788577715675138350, -0.788546967934057990, +-0.788516218221610110, -0.788485466537871770, -0.788454712882919460, -0.788423957256830680, -0.788393199659682020, -0.788362440091550320, -0.788331678552512290, -0.788300915042645320, +-0.788270149562026010, -0.788239382110731410, -0.788208612688838020, -0.788177841296423430, -0.788147067933564150, -0.788116292600337220, -0.788085515296819360, -0.788054736023087950, +-0.788023954779219720, -0.787993171565291250, -0.787962386381380160, -0.787931599227563170, -0.787900810103917100, -0.787870019010518790, -0.787839225947445710, -0.787808430914774480, +-0.787777633912582260, -0.787746834940945660, -0.787716033999942280, -0.787685231089648720, -0.787654426210142140, -0.787623619361499160, -0.787592810543797480, -0.787561999757113830, +-0.787531187001525020, -0.787500372277108120, -0.787469555583940490, -0.787438736922098980, -0.787407916291660400, -0.787377093692702260, -0.787346269125301370, -0.787315442589534790, +-0.787284614085479340, -0.787253783613212740, -0.787222951172811490, -0.787192116764353080, -0.787161280387914000, -0.787130442043571970, -0.787099601731403810, -0.787068759451486690, +-0.787037915203897430, -0.787007068988713530, -0.786976220806012150, -0.786945370655870110, -0.786914518538364360, -0.786883664453572610, -0.786852808401571680, -0.786821950382438520, +-0.786791090396250610, -0.786760228443085130, -0.786729364523019000, -0.786698498636129170, -0.786667630782493470, -0.786636760962188600, -0.786605889175291840, -0.786575015421880130, +-0.786544139702031080, -0.786513262015821720, -0.786482382363329240, -0.786451500744630550, -0.786420617159803270, -0.786389731608924560, -0.786358844092071460, -0.786327954609321030, +-0.786297063160750880, -0.786266169746438150, -0.786235274366460010, -0.786204377020893410, -0.786173477709816050, -0.786142576433305100, -0.786111673191437380, -0.786080767984290830, +-0.786049860811942280, -0.786018951674469110, -0.785988040571948270, -0.785957127504457560, -0.785926212472074170, -0.785895295474875130, -0.785864376512937610, -0.785833455586339440, +-0.785802532695157650, -0.785771607839469420, -0.785740681019352020, -0.785709752234883150, -0.785678821486139880, -0.785647888773199580, -0.785616954096139190, -0.785586017455036870, +-0.785555078849969330, -0.785524138281013970, -0.785493195748248390, -0.785462251251749950, -0.785431304791595840, -0.785400356367863210, -0.785369405980629880, -0.785338453629973120, +-0.785307499315970210, -0.785276543038698200, -0.785245584798235250, -0.785214624594658180, -0.785183662428044720, -0.785152698298471670, -0.785121732206017220, -0.785090764150758510, +-0.785059794132772830, -0.785028822152137320, -0.784997848208930150, -0.784966872303228260, -0.784935894435108920, -0.784904914604650170, -0.784873932811929190, -0.784842949057023230, +-0.784811963340009690, -0.784780975660966610, -0.784749986019970920, -0.784718994417100360, -0.784688000852432070, -0.784657005326043990, -0.784626007838013400, -0.784595008388417890, +-0.784564006977334530, -0.784533003604841350, -0.784501998271015740, -0.784470990975935090, -0.784439981719676770, -0.784408970502318610, -0.784377957323938220, -0.784346942184612760, +-0.784315925084419830, -0.784284906023437260, -0.784253885001742420, -0.784222862019412600, -0.784191837076525950, -0.784160810173159750, -0.784129781309391370, -0.784098750485298420, +-0.784067717700958730, -0.784036682956449900, -0.784005646251849210, -0.783974607587234250, -0.783943566962682970, -0.783912524378272750, -0.783881479834081300, -0.783850433330185890, +-0.783819384866664580, -0.783788334443594860, -0.783757282061054330, -0.783726227719120260, -0.783695171417870930, -0.783664113157383600, -0.783633052937735890, -0.783601990759005720, +-0.783570926621270480, -0.783539860524608000, -0.783508792469095660, -0.783477722454811510, -0.783446650481833150, -0.783415576550238080, -0.783384500660103790, -0.783353422811508660, +-0.783322343004529850, -0.783291261239245200, -0.783260177515732070, -0.783229091834068860, -0.783198004194332940, -0.783166914596601930, -0.783135823040953420, -0.783104729527465570, +-0.783073634056215990, -0.783042536627281960, -0.783011437240741850, -0.782980335896673150, -0.782949232595153700, -0.782918127336260870, -0.782887020120072940, -0.782855910946667510, +-0.782824799816122300, -0.782793686728514790, -0.782762571683923270, -0.782731454682425440, -0.782700335724098920, -0.782669214809021300, -0.782638091937270960, -0.782606967108925300, +-0.782575840324062360, -0.782544711582759400, -0.782513580885095040, -0.782482448231146650, -0.782451313620991850, -0.782420177054709120, -0.782389038532375960, -0.782357898054070080, +-0.782326755619869310, -0.782295611229851810, -0.782264464884095400, -0.782233316582677810, -0.782202166325676520, -0.782171014113170250, -0.782139859945236380, -0.782108703821952860, +-0.782077545743397270, -0.782046385709648130, -0.782015223720783030, -0.781984059776879900, -0.781952893878016250, -0.781921726024270790, -0.781890556215720900, -0.781859384452444630, +-0.781828210734519690, -0.781797035062024470, -0.781765857435036570, -0.781734677853633820, -0.781703496317894710, -0.781672312827896840, -0.781641127383718160, -0.781609939985436370, +-0.781578750633129980, -0.781547559326876810, -0.781516366066754680, -0.781485170852841300, -0.781453973685215300, -0.781422774563954480, -0.781391573489136570, -0.781360370460839610, +-0.781329165479141880, -0.781297958544121320, -0.781266749655855740, -0.781235538814423090, -0.781204326019901860, -0.781173111272369880, -0.781141894571904750, -0.781110675918585180, +-0.781079455312488900, -0.781048232753694060, -0.781017008242278380, -0.780985781778320340, -0.780954553361897900, -0.780923322993089090, -0.780892090671971740, -0.780860856398624350, +-0.780829620173124850, -0.780798381995551290, -0.780767141865981510, -0.780735899784494200, -0.780704655751167100, -0.780673409766078350, -0.780642161829305790, -0.780610911940928130, +-0.780579660101023200, -0.780548406309668820, -0.780517150566943710, -0.780485892872925690, -0.780454633227692930, -0.780423371631323360, -0.780392108083895700, -0.780360842585487660, +-0.780329575136177510, -0.780298305736043200, -0.780267034385163430, -0.780235761083616030, -0.780204485831479280, -0.780173208628830990, -0.780141929475749900, -0.780110648372314030, +-0.780079365318601560, -0.780048080314690420, -0.780016793360659320, -0.779985504456586210, -0.779954213602549460, -0.779922920798626800, -0.779891626044897150, -0.779860329341438340, +-0.779829030688328540, -0.779797730085646460, -0.779766427533469920, -0.779735123031877420, -0.779703816580946780, -0.779672508180756950, -0.779641197831385860, -0.779609885532911660, +-0.779578571285412520, -0.779547255088967270, -0.779515936943653840, -0.779484616849550620, -0.779453294806735530, -0.779421970815287410, -0.779390644875284530, -0.779359316986804940, +-0.779327987149926790, -0.779296655364728920, -0.779265321631289480, -0.779233985949686400, -0.779202648319998640, -0.779171308742304340, -0.779139967216681660, -0.779108623743208880, +-0.779077278321964720, -0.779045930953027430, -0.779014581636475300, -0.778983230372386480, -0.778951877160839800, -0.778920522001913420, -0.778889164895685830, -0.778857805842234960, +-0.778826444841639880, -0.778795081893978610, -0.778763716999329780, -0.778732350157771310, -0.778700981369382150, -0.778669610634240670, -0.778638237952424930, -0.778606863324013740, +-0.778575486749085390, -0.778544108227718470, -0.778512727759990810, -0.778481345345981790, -0.778449960985769240, -0.778418574679431870, -0.778387186427047850, -0.778355796228696000, +-0.778324404084454800, -0.778293009994402540, -0.778261613958617480, -0.778230215977178560, -0.778198816050164280, -0.778167414177652890, -0.778136010359722570, -0.778104604596452700, +-0.778073196887921200, -0.778041787234206470, -0.778010375635387440, -0.777978962091542600, -0.777947546602750340, -0.777916129169088920, -0.777884709790637400, -0.777853288467474150, +-0.777821865199677660, -0.777790439987326330, -0.777759012830499090, -0.777727583729274310, -0.777696152683730600, -0.777664719693946240, -0.777633284760000270, -0.777601847881971180, +-0.777570409059937460, -0.777538968293977390, -0.777507525584170240, -0.777476080930594280, -0.777444634333328110, -0.777413185792450000, -0.777381735308039220, -0.777350282880174160, +-0.777318828508933190, -0.777287372194395250, -0.777255913936638950, -0.777224453735742890, -0.777192991591785450, -0.777161527504845790, -0.777130061475002300, -0.777098593502333570, +-0.777067123586918210, -0.777035651728835260, -0.777004177928163120, -0.776972702184980710, -0.776941224499366090, -0.776909744871398740, -0.776878263301157060, -0.776846779788719740, +-0.776815294334165190, -0.776783806937572650, -0.776752317599020530, -0.776720826318587410, -0.776689333096352460, -0.776657837932394290, -0.776626340826791380, -0.776594841779622460, +-0.776563340790966670, -0.776531837860902520, -0.776500332989508710, -0.776468826176863970, -0.776437317423047220, -0.776405806728137300, -0.776374294092212920, -0.776342779515352470, +-0.776311262997635310, -0.776279744539140060, -0.776248224139945320, -0.776216701800129920, -0.776185177519772900, -0.776153651298952970, -0.776122123137748640, -0.776090593036239400, +-0.776059060994503500, -0.776027527012620010, -0.775995991090667530, -0.775964453228725200, -0.775932913426871760, -0.775901371685186140, -0.775869828003746710, -0.775838282382632970, +-0.775806734821923640, -0.775775185321697420, -0.775743633882032930, -0.775712080503009660, -0.775680525184706200, -0.775648967927201390, -0.775617408730573940, -0.775585847594903120, +-0.775554284520267870, -0.775522719506746780, -0.775491152554418580, -0.775459583663362870, -0.775428012833658140, -0.775396440065383220, -0.775364865358617370, -0.775333288713439320, +-0.775301710129928210, -0.775270129608162440, -0.775238547148221600, -0.775206962750184410, -0.775175376414129810, -0.775143788140136510, -0.775112197928284010, -0.775080605778651010, +-0.775049011691316570, -0.775017415666359180, -0.774985817703858660, -0.774954217803893510, -0.774922615966542880, -0.774891012191885390, -0.774859406480000620, -0.774827798830967420, +-0.774796189244864380, -0.774764577721771210, -0.774732964261766520, -0.774701348864929470, -0.774669731531338780, -0.774638112261073930, -0.774606491054213860, -0.774574867910837630, +-0.774543242831023940, -0.774511615814852390, -0.774479986862401710, -0.774448355973751170, -0.774416723148979470, -0.774385088388166220, -0.774353451691390250, -0.774321813058730600, +-0.774290172490266220, -0.774258529986076690, -0.774226885546240750, -0.774195239170837320, -0.774163590859946240, -0.774131940613645990, -0.774100288432015950, -0.774068634315134950, +-0.774036978263082600, -0.774005320275937820, -0.773973660353779680, -0.773941998496687210, -0.773910334704740020, -0.773878668978016940, -0.773847001316597230, -0.773815331720559610, +-0.773783660189984120, -0.773751986724949380, -0.773720311325534650, -0.773688633991818970, -0.773656954723881850, -0.773625273521802440, -0.773593590385659560, -0.773561905315532930, +-0.773530218311501590, -0.773498529373644720, -0.773466838502041230, -0.773435145696770850, -0.773403450957912630, -0.773371754285545940, -0.773340055679749390, -0.773308355140603030, +-0.773276652668185790, -0.773244948262577060, -0.773213241923855540, -0.773181533652101180, -0.773149823447393030, -0.773118111309810230, -0.773086397239431950, -0.773054681236338030, +-0.773022963300607380, -0.772991243432319170, -0.772959521631552680, -0.772927797898387730, -0.772896072232903240, -0.772864344635178280, -0.772832615105292660, -0.772800883643325550, +-0.772769150249356330, -0.772737414923463820, -0.772705677665728170, -0.772673938476228230, -0.772642197355043470, -0.772610454302252950, -0.772578709317936600, -0.772546962402173460, +-0.772515213555042930, -0.772483462776624050, -0.772451710066996760, -0.772419955426240310, -0.772388198854433880, -0.772356440351656740, -0.772324679917988700, -0.772292917553508930, +-0.772261153258296700, -0.772229387032431820, -0.772197618875993470, -0.772165848789061030, -0.772134076771713750, -0.772102302824031580, -0.772070526946093570, -0.772038749137979320, +-0.772006969399767870, -0.771975187731539280, -0.771943404133372810, -0.771911618605347740, -0.771879831147543330, -0.771848041760039630, -0.771816250442915910, -0.771784457196251440, +-0.771752662020125600, -0.771720864914618440, -0.771689065879809010, -0.771657264915776690, -0.771625462022601520, -0.771593657200362770, -0.771561850449139720, -0.771530041769011850, +-0.771498231160059110, -0.771466418622360760, -0.771434604155996410, -0.771402787761045320, -0.771370969437587430, -0.771339149185702230, -0.771307327005469110, -0.771275502896967450, +-0.771243676860277170, -0.771211848895477780, -0.771180019002648760, -0.771148187181869500, -0.771116353433219940, -0.771084517756779550, -0.771052680152627850, -0.771020840620844190, +-0.770988999161508650, -0.770957155774700700, -0.770925310460499500, -0.770893463218985330, -0.770861614050237560, -0.770829762954335700, -0.770797909931359100, -0.770766054981388060, +-0.770734198104501940, -0.770702339300780250, -0.770670478570302460, -0.770638615913148750, -0.770606751329398490, -0.770574884819131390, -0.770543016382426730, -0.770511146019364880, +-0.770479273730025120, -0.770447399514487150, -0.770415523372830480, -0.770383645305135260, -0.770351765311480970, -0.770319883391946900, -0.770287999546613420, -0.770256113775559910, +-0.770224226078866200, -0.770192336456611560, -0.770160444908876470, -0.770128551435740220, -0.770096656037282500, -0.770064758713582930, -0.770032859464721780, -0.770000958290778410, +-0.769969055191832670, -0.769937150167964050, -0.769905243219252800, -0.769873334345778430, -0.769841423547620750, -0.769809510824859270, -0.769777596177574240, -0.769745679605845280, +-0.769713761109751760, -0.769681840689374170, -0.769649918344791910, -0.769617994076085000, -0.769586067883332610, -0.769554139766615460, -0.769522209726013040, -0.769490277761604950, +-0.769458343873470900, -0.769426408061691380, -0.769394470326345780, -0.769362530667513920, -0.769330589085275520, -0.769298645579711060, -0.769266700150899820, -0.769234752798921840, +-0.769202803523856730, -0.769170852325784970, -0.769138899204785950, -0.769106944160939500, -0.769074987194325880, -0.769043028305024910, -0.769011067493116210, -0.768979104758679700, +-0.768947140101795660, -0.768915173522543790, -0.768883205021003930, -0.768851234597255790, -0.768819262251379860, -0.768787287983455860, -0.768755311793563490, -0.768723333681782690, +-0.768691353648193740, -0.768659371692876460, -0.768627387815910780, -0.768595402017376310, -0.768563414297353640, -0.768531424655922390, -0.768499433093162600, -0.768467439609153870, +-0.768435444203976910, -0.768403446877711340, -0.768371447630436850, -0.768339446462234070, -0.768307443373182570, -0.768275438363362540, -0.768243431432853670, -0.768211422581736470, +-0.768179411810090640, -0.768147399117996340, -0.768115384505533290, -0.768083367972781980, -0.768051349519822350, -0.768019329146734320, -0.767987306853597620, -0.767955282640493060, +-0.767923256507500150, -0.767891228454699150, -0.767859198482169880, -0.767827166589992840, -0.767795132778247850, -0.767763097047014730, -0.767731059396374200, -0.767699019826405980, +-0.767666978337190220, -0.767634934928806740, -0.767602889601336270, -0.767570842354858510, -0.767538793189453620, -0.767506742105201530, -0.767474689102182860, -0.767442634180477420, +-0.767410577340165490, -0.767378518581326660, -0.767346457904041990, -0.767314395308391070, -0.767282330794454290, -0.767250264362311250, -0.767218196012042890, -0.767186125743729020, +-0.767154053557449590, -0.767121979453285310, -0.767089903431316110, -0.767057825491622050, -0.767025745634283270, -0.766993663859380280, -0.766961580166993230, -0.766929494557202160, +-0.766897407030087130, -0.766865317585728850, -0.766833226224207240, -0.766801132945602590, -0.766769037749994830, -0.766736940637464780, -0.766704841608092380, -0.766672740661957790, +-0.766640637799141160, -0.766608533019723200, -0.766576426323783870, -0.766544317711403520, -0.766512207182662110, -0.766480094737640340, -0.766447980376418480, -0.766415864099076360, +-0.766383745905694800, -0.766351625796353850, -0.766319503771133890, -0.766287379830114970, -0.766255253973377790, -0.766223126201002410, -0.766190996513069320, -0.766158864909658450, +-0.766126731390850630, -0.766094595956726130, -0.766062458607364990, -0.766030319342847490, -0.765998178163254440, -0.765966035068666010, -0.765933890059162460, -0.765901743134823840, +-0.765869594295731200, -0.765837443541964590, -0.765805290873604050, -0.765773136290730630, -0.765740979793424260, -0.765708821381765550, -0.765676661055834430, -0.765644498815711950, +-0.765612334661478270, -0.765580168593213760, -0.765548000610998480, -0.765515830714913470, -0.765483658905039000, -0.765451485181455340, -0.765419309544242640, -0.765387131993481960, +-0.765354952529253450, -0.765322771151637490, -0.765290587860714470, -0.765258402656565200, -0.765226215539269840, -0.765194026508908780, -0.765161835565562940, -0.765129642709312390, +-0.765097447940237820, -0.765065251258419290, -0.765033052663937950, -0.765000852156874080, -0.764968649737307940, -0.764936445405319910, -0.764904239160991150, -0.764872031004401710, +-0.764839820935632190, -0.764807608954762850, -0.764775395061874750, -0.764743179257048160, -0.764710961540363670, -0.764678741911901440, -0.764646520371742630, -0.764614296919967630, +-0.764582071556656470, -0.764549844281890540, -0.764517615095749890, -0.764485383998315230, -0.764453150989666930, -0.764420916069885940, -0.764388679239052630, -0.764356440497247710, +-0.764324199844551360, -0.764291957281044710, -0.764259712806808270, -0.764227466421922520, -0.764195218126467850, -0.764162967920525400, -0.764130715804175580, -0.764098461777498850, +-0.764066205840575720, -0.764033947993487450, -0.764001688236314200, -0.763969426569136800, -0.763937162992035510, -0.763904897505091610, -0.763872630108385580, -0.763840360801997580, +-0.763808089586008990, -0.763775816460500080, -0.763743541425551790, -0.763711264481244270, -0.763678985627658790, -0.763646704864875960, -0.763614422192976370, -0.763582137612040410, +-0.763549851122149350, -0.763517562723383780, -0.763485272415824200, -0.763452980199551210, -0.763420686074645970, -0.763388390041189080, -0.763356092099261250, -0.763323792248942870, +-0.763291490490315310, -0.763259186823458950, -0.763226881248454390, -0.763194573765382910, -0.763162264374325110, -0.763129953075361470, -0.763097639868572710, -0.763065324754040210, +-0.763033007731844350, -0.763000688802065950, -0.762968367964785620, -0.762936045220084620, -0.762903720568043450, -0.762871394008743040, -0.762839065542263770, -0.762806735168687240, +-0.762774402888093840, -0.762742068700564380, -0.762709732606179470, -0.762677394605020600, -0.762645054697168150, -0.762612712882702830, -0.762580369161705910, -0.762548023534258210, +-0.762515676000440350, -0.762483326560333130, -0.762450975214017830, -0.762418621961575060, -0.762386266803085740, -0.762353909738630490, -0.762321550768290670, -0.762289189892147110, +-0.762256827110280530, -0.762224462422771530, -0.762192095829701710, -0.762159727331151670, -0.762127356927202240, -0.762094984617934120, -0.762062610403428930, -0.762030234283767150, +-0.761997856259029830, -0.761965476329297560, -0.761933094494651850, -0.761900710755173520, -0.761868325110943050, -0.761835937562042040, -0.761803548108551110, -0.761771156750551400, +-0.761738763488123530, -0.761706368321349080, -0.761673971250308560, -0.761641572275083220, -0.761609171395753680, -0.761576768612401420, -0.761544363925107270, -0.761511957333952270, +-0.761479548839017030, -0.761447138440383140, -0.761414726138131550, -0.761382311932343070, -0.761349895823098530, -0.761317477810479540, -0.761285057894566800, -0.761252636075441250, +-0.761220212353184270, -0.761187786727876790, -0.761155359199599870, -0.761122929768434320, -0.761090498434461640, -0.761058065197762760, -0.761025630058418720, -0.760993193016510250, +-0.760960754072119160, -0.760928313225326170, -0.760895870476212430, -0.760863425824858660, -0.760830979271346690, -0.760798530815757210, -0.760766080458171400, -0.760733628198670080, +-0.760701174037335060, -0.760668717974247070, -0.760636260009487030, -0.760603800143136550, -0.760571338375276570, -0.760538874705988350, -0.760506409135352610, -0.760473941663451060, +-0.760441472290364740, -0.760409001016174700, -0.760376527840961880, -0.760344052764807990, -0.760311575787794070, -0.760279096910001170, -0.760246616131510230, -0.760214133452402960, +-0.760181648872760410, -0.760149162392663840, -0.760116674012193960, -0.760084183731432720, -0.760051691550461040, -0.760019197469359750, -0.759986701488210900, -0.759954203607095200, +-0.759921703826093920, -0.759889202145288210, -0.759856698564759790, -0.759824193084589590, -0.759791685704858890, -0.759759176425648720, -0.759726665247040910, -0.759694152169116400, +-0.759661637191956450, -0.759629120315642230, -0.759596601540255430, -0.759564080865877230, -0.759531558292588670, -0.759499033820471010, -0.759466507449606090, -0.759433979180074940, +-0.759401449011958720, -0.759368916945338590, -0.759336382980296490, -0.759303847116913460, -0.759271309355270540, -0.759238769695449680, -0.759206228137531800, -0.759173684681598290, +-0.759141139327730310, -0.759108592076009890, -0.759076042926517980, -0.759043491879335840, -0.759010938934544740, -0.758978384092226620, -0.758945827352462520, -0.758913268715333820, +-0.758880708180921680, -0.758848145749308150, -0.758815581420574150, -0.758783015194801180, -0.758750447072070400, -0.758717877052463850, -0.758685305136062470, -0.758652731322947640, +-0.758620155613201290, -0.758587578006904570, -0.758554998504138880, -0.758522417104985360, -0.758489833809526060, -0.758457248617842250, -0.758424661530015310, -0.758392072546126390, +-0.758359481666257660, -0.758326888890490160, -0.758294294218905480, -0.758261697651584690, -0.758229099188610030, -0.758196498830062570, -0.758163896576023900, -0.758131292426575180, +-0.758098686381798450, -0.758066078441775200, -0.758033468606586270, -0.758000856876314020, -0.757968243251039730, -0.757935627730844660, -0.757903010315810310, -0.757870391006018720, +-0.757837769801551260, -0.757805146702489220, -0.757772521708914070, -0.757739894820907980, -0.757707266038552100, -0.757674635361928030, -0.757642002791117040, -0.757609368326201400, +-0.757576731967262380, -0.757544093714381470, -0.757511453567640050, -0.757478811527120270, -0.757446167592903400, -0.757413521765071260, -0.757380874043704910, -0.757348224428886720, +-0.757315572920697950, -0.757282919519220000, -0.757250264224535010, -0.757217607036724360, -0.757184947955869660, -0.757152286982052390, -0.757119624115354610, -0.757086959355857790, +-0.757054292703643550, -0.757021624158793260, -0.756988953721389300, -0.756956281391512940, -0.756923607169245780, -0.756890931054669420, -0.756858253047866030, -0.756825573148916850, +-0.756792891357903950, -0.756760207674908370, -0.756727522100012600, -0.756694834633298120, -0.756662145274846100, -0.756629454024739130, -0.756596760883058490, -0.756564065849886000, +-0.756531368925303040, -0.756498670109391870, -0.756465969402234100, -0.756433266803911320, -0.756400562314505140, -0.756367855934097830, -0.756335147662770990, -0.756302437500606110, +-0.756269725447684890, -0.756237011504089730, -0.756204295669901990, -0.756171577945203510, -0.756138858330075880, -0.756106136824601260, -0.756073413428861360, -0.756040688142937570, +-0.756007960966912470, -0.755975231900867350, -0.755942500944884130, -0.755909768099044530, -0.755877033363430710, -0.755844296738124250, -0.755811558223207220, -0.755778817818760880, +-0.755746075524867830, -0.755713331341609560, -0.755680585269067890, -0.755647837307324540, -0.755615087456461890, -0.755582335716561530, -0.755549582087705400, -0.755516826569974880, +-0.755484069163452680, -0.755451309868220290, -0.755418548684359310, -0.755385785611952240, -0.755353020651080680, -0.755320253801826660, -0.755287485064271680, -0.755254714438498230, +-0.755221941924588020, -0.755189167522622990, -0.755156391232684740, -0.755123613054855760, -0.755090832989217860, -0.755058051035852770, -0.755025267194842310, -0.754992481466268960, +-0.754959693850214440, -0.754926904346760570, -0.754894112955989180, -0.754861319677982980, -0.754828524512823230, -0.754795727460592310, -0.754762928521371830, -0.754730127695244170, +-0.754697324982291360, -0.754664520382594790, -0.754631713896237290, -0.754598905523300440, -0.754566095263866420, -0.754533283118016820, -0.754500469085834350, -0.754467653167400610, +-0.754434835362797870, -0.754402015672107630, -0.754369194095412700, -0.754336370632794790, -0.754303545284335960, -0.754270718050117920, -0.754237888930223480, -0.754205057924734130, +-0.754172225033732270, -0.754139390257299590, -0.754106553595518700, -0.754073715048471430, -0.754040874616239480, -0.754008032298905780, -0.753975188096551950, -0.753942342009260140, +-0.753909494037112160, -0.753876644180190740, -0.753843792438577690, -0.753810938812355170, -0.753778083301605120, -0.753745225906410020, -0.753712366626851930, -0.753679505463012880, +-0.753646642414974810, -0.753613777482820320, -0.753580910666631460, -0.753548041966490390, -0.753515171382478920, -0.753482298914679770, -0.753449424563174870, -0.753416548328046050, +-0.753383670209376240, -0.753350790207247160, -0.753317908321741170, -0.753285024552940220, -0.753252138900926900, -0.753219251365783160, -0.753186361947591370, -0.753153470646433450, +-0.753120577462392030, -0.753087682395549240, -0.753054785445987250, -0.753021886613787990, -0.752988985899034290, -0.752956083301808080, -0.752923178822191730, -0.752890272460267070, +-0.752857364216117150, -0.752824454089823680, -0.752791542081469260, -0.752758628191135480, -0.752725712418905510, -0.752692794764861280, -0.752659875229084730, -0.752626953811658890, +-0.752594030512665490, -0.752561105332187120, -0.752528178270305710, -0.752495249327104100, -0.752462318502664430, -0.752429385797068860, -0.752396451210399660, -0.752363514742739550, +-0.752330576394170670, -0.752297636164775300, -0.752264694054635590, -0.752231750063834470, -0.752198804192453880, -0.752165856440576430, -0.752132906808283930, -0.752099955295659430, +-0.752067001902785080, -0.752034046629743050, -0.752001089476616040, -0.751968130443486320, -0.751935169530436380, -0.751902206737548150, -0.751869242064904690, -0.751836275512588140, +-0.751803307080680880, -0.751770336769265080, -0.751737364578423770, -0.751704390508239010, -0.751671414558793270, -0.751638436730168720, -0.751605457022448410, -0.751572475435714370, +-0.751539491970049210, -0.751506506625534980, -0.751473519402254820, -0.751440530300290790, -0.751407539319725260, -0.751374546460641060, -0.751341551723120560, -0.751308555107246150, +-0.751275556613100080, -0.751242556240765410, -0.751209553990324300, -0.751176549861859330, -0.751143543855452680, -0.751110535971187600, -0.751077526209146030, -0.751044514569410680, +-0.751011501052063710, -0.750978485657188390, -0.750945468384866750, -0.750912449235181520, -0.750879428208214850, -0.750846405304049780, -0.750813380522768910, -0.750780353864454190, +-0.750747325329188860, -0.750714294917055210, -0.750681262628135840, -0.750648228462513110, -0.750615192420269970, -0.750582154501489020, -0.750549114706252520, -0.750516073034642960, +-0.750483029486743500, -0.750449984062636520, -0.750416936762404620, -0.750383887586129950, -0.750350836533896000, -0.750317783605784940, -0.750284728801879350, -0.750251672122261630, +-0.750218613567015140, -0.750185553136222040, -0.750152490829965050, -0.750119426648326540, -0.750086360591389780, -0.750053292659237150, -0.750020222851950910, -0.749987151169614450, +-0.749954077612310140, -0.749921002180120590, -0.749887924873128280, -0.749854845691416360, -0.749821764635067440, -0.749788681704164130, -0.749755596898788680, -0.749722510219024580, +-0.749689421664954340, -0.749656331236660420, -0.749623238934225330, -0.749590144757732560, -0.749557048707264360, -0.749523950782903570, -0.749490850984732560, -0.749457749312834820, +-0.749424645767292620, -0.749391540348188560, -0.749358433055605900, -0.749325323889627140, -0.749292212850335090, -0.749259099937812260, -0.749225985152141890, -0.749192868493406610, +-0.749159749961689210, -0.749126629557072100, -0.749093507279638640, -0.749060383129471430, -0.749027257106653410, -0.748994129211266850, -0.748960999443395230, -0.748927867803121150, +-0.748894734290527330, -0.748861598905696480, -0.748828461648711860, -0.748795322519656080, -0.748762181518611850, -0.748729038645662200, -0.748695893900890200, -0.748662747284378320, +-0.748629598796209380, -0.748596448436466670, -0.748563296205232880, -0.748530142102590830, -0.748496986128623030, -0.748463828283413180, -0.748430668567043770, -0.748397506979597620, +-0.748364343521157440, -0.748331178191806720, -0.748298010991627960, -0.748264841920704300, -0.748231670979118140, -0.748198498166953160, -0.748165323484291880, -0.748132146931217320, +-0.748098968507812100, -0.748065788214159810, -0.748032606050343050, -0.747999422016444430, -0.747966236112547530, -0.747933048338734970, -0.747899858695089900, -0.747866667181694920, +-0.747833473798633520, -0.747800278545988410, -0.747767081423842630, -0.747733882432278900, -0.747700681571380700, -0.747667478841230750, -0.747634274241912200, -0.747601067773507650, +-0.747567859436100710, -0.747534649229774080, -0.747501437154610810, -0.747468223210693730, -0.747435007398106420, -0.747401789716931500, -0.747368570167251890, -0.747335348749151080, +-0.747302125462711910, -0.747268900308017400, -0.747235673285150390, -0.747202444394194480, -0.747169213635232480, -0.747135981008347440, -0.747102746513622180, -0.747069510151140310, +-0.747036271920984650, -0.747003031823238350, -0.746969789857984120, -0.746936546025305680, -0.746903300325286070, -0.746870052758008110, -0.746836803323554620, -0.746803552022009540, +-0.746770298853455470, -0.746737043817975450, -0.746703786915653090, -0.746670528146571200, -0.746637267510813050, -0.746604005008461470, -0.746570740639600160, -0.746537474404311950, +-0.746504206302680110, -0.746470936334787450, -0.746437664500717690, -0.746404390800553870, -0.746371115234378930, -0.746337837802276030, -0.746304558504328750, -0.746271277340620150, +-0.746237994311233280, -0.746204709416251170, -0.746171422655757640, -0.746138134029835420, -0.746104843538567990, -0.746071551182038050, -0.746038256960329660, -0.746004960873525520, +-0.745971662921708690, -0.745938363104962980, -0.745905061423371430, -0.745871757877017210, -0.745838452465983350, -0.745805145190353570, -0.745771836050210910, -0.745738525045638760, +-0.745705212176719920, -0.745671897443538350, -0.745638580846177070, -0.745605262384719360, -0.745571942059248150, -0.745538619869847370, -0.745505295816600080, -0.745471969899589530, +-0.745438642118898760, -0.745405312474611730, -0.745371980966811340, -0.745338647595580770, -0.745305312361003840, -0.745271975263163580, -0.745238636302143490, -0.745205295478026500, +-0.745171952790896540, -0.745138608240836660, -0.745105261827930240, -0.745071913552260430, -0.745038563413911170, -0.745005211412965500, -0.744971857549506680, -0.744938501823617980, +-0.744905144235383340, -0.744871784784885800, -0.744838423472208970, -0.744805060297435540, -0.744771695260649900, -0.744738328361934990, -0.744704959601373950, -0.744671588979050840, +-0.744638216495048690, -0.744604842149451110, -0.744571465942341030, -0.744538087873802600, -0.744504707943918990, -0.744471326152773560, -0.744437942500449590, -0.744404556987031010, +-0.744371169612601080, -0.744337780377243190, -0.744304389281040480, -0.744270996324077230, -0.744237601506436360, -0.744204204828201600, -0.744170806289455980, -0.744137405890283650, +-0.744104003630767790, -0.744070599510991640, -0.744037193531039250, -0.744003785690994010, -0.743970375990939180, -0.743936964430958140, -0.743903551011135030, -0.743870135731553030, +-0.743836718592295610, -0.743803299593446150, -0.743769878735088710, -0.743736456017306650, -0.743703031440183350, -0.743669605003802190, -0.743636176708247440, -0.743602746553602150, +-0.743569314539950010, -0.743535880667374300, -0.743502444935959180, -0.743469007345787910, -0.743435567896944090, -0.743402126589511210, -0.743368683423573100, -0.743335238399213450, +-0.743301791516515320, -0.743268342775563080, -0.743234892176439900, -0.743201439719229580, -0.743167985404015300, -0.743134529230881300, -0.743101071199911090, -0.743067611311188150, +-0.743034149564795960, -0.743000685960818590, -0.742967220499339610, -0.742933753180442520, -0.742900284004210710, -0.742866812970728540, -0.742833340080079290, -0.742799865332346650, +-0.742766388727614140, -0.742732910265966000, -0.742699429947485500, -0.742665947772256140, -0.742632463740362180, -0.742598977851887110, -0.742565490106914640, -0.742532000505528030, +-0.742498509047811780, -0.742465015733849270, -0.742431520563724190, -0.742398023537520050, -0.742364524655321210, -0.742331023917210950, -0.742297521323273090, -0.742264016873591230, +-0.742230510568249620, -0.742197002407331660, -0.742163492390921280, -0.742129980519101840, -0.742096466791957620, -0.742062951209572440, -0.742029433772029570, -0.741995914479413270, +-0.741962393331807250, -0.741928870329295220, -0.741895345471960790, -0.741861818759888210, -0.741828290193161210, -0.741794759771863380, -0.741761227496078310, -0.741727693365890620, +-0.741694157381383560, -0.741660619542641180, -0.741627079849746960, -0.741593538302785290, -0.741559994901839770, -0.741526449646994320, -0.741492902538332330, -0.741459353575938510, +-0.741425802759896220, -0.741392250090289530, -0.741358695567201800, -0.741325139190717740, -0.741291580960920740, -0.741258020877894610, -0.741224458941723620, -0.741190895152491480, +-0.741157329510282130, -0.741123762015179150, -0.741090192667267060, -0.741056621466629540, -0.741023048413350430, -0.740989473507513320, -0.740955896749202920, -0.740922318138502730, +-0.740888737675496900, -0.740855155360268690, -0.740821571192903040, -0.740787985173483430, -0.740754397302093800, -0.740720807578818090, -0.740687216003740430, -0.740653622576944780, +-0.740620027298514840, -0.740586430168535090, -0.740552831187089260, -0.740519230354261370, -0.740485627670135040, -0.740452023134794970, -0.740418416748324870, -0.740384808510808680, +-0.740351198422330330, -0.740317586482974190, -0.740283972692823980, -0.740250357051963960, -0.740216739560477730, -0.740183120218449900, -0.740149499025964270, -0.740115875983104910, +-0.740082251089955620, -0.740048624346600900, -0.740014995753124680, -0.739981365309610780, -0.739947733016143580, -0.739914098872807120, -0.739880462879685340, -0.739846825036862280, +-0.739813185344422310, -0.739779543802449480, -0.739745900411027720, -0.739712255170240860, -0.739678608080173830, -0.739644959140910110, -0.739611308352533970, -0.739577655715129460, +-0.739544001228780950, -0.739510344893572480, -0.739476686709588100, -0.739443026676911860, -0.739409364795628240, -0.739375701065821180, -0.739342035487574600, -0.739308368060973220, +-0.739274698786100970, -0.739241027663041890, -0.739207354691880040, -0.739173679872700000, -0.739140003205585930, -0.739106324690621760, -0.739072644327891440, -0.739038962117479770, +-0.739005278059470690, -0.738971592153948590, -0.738937904400997050, -0.738904214800701120, -0.738870523353144630, -0.738836830058411830, -0.738803134916586670, -0.738769437927753960, +-0.738735739091997630, -0.738702038409401960, -0.738668335880050990, -0.738634631504029420, -0.738600925281421180, -0.738567217212310450, -0.738533507296781910, -0.738499795534919620, +-0.738466081926807850, -0.738432366472530520, -0.738398649172172680, -0.738364930025818160, -0.738331209033551320, -0.738297486195456100, -0.738263761511617540, -0.738230034982119590, +-0.738196306607046490, -0.738162576386482420, -0.738128844320512070, -0.738095110409219710, -0.738061374652689620, -0.738027637051005710, -0.737993897604252940, -0.737960156312515550, +-0.737926413175877370, -0.737892668194423560, -0.737858921368238050, -0.737825172697405220, -0.737791422182009100, -0.737757669822134750, -0.737723915617866320, -0.737690159569288070, +-0.737656401676484050, -0.737622641939539300, -0.737588880358538090, -0.737555116933564570, -0.737521351664703010, -0.737487584552038330, -0.737453815595654700, -0.737420044795636500, +-0.737386272152068090, -0.737352497665034080, -0.737318721334618840, -0.737284943160906540, -0.737251163143982200, -0.737217381283930000, -0.737183597580834180, -0.737149812034779250, +-0.737116024645849910, -0.737082235414130650, -0.737048444339705840, -0.737014651422659430, -0.736980856663076890, -0.736947060061042160, -0.736913261616639730, -0.736879461329953860, +-0.736845659201069590, -0.736811855230071200, -0.736778049417043170, -0.736744241762069760, -0.736710432265236030, -0.736676620926626220, -0.736642807746324850, -0.736608992724416160, +-0.736575175860985310, -0.736541357156116570, -0.736507536609893990, -0.736473714222402930, -0.736439889993727670, -0.736406063923952580, -0.736372236013162040, -0.736338406261441310, +-0.736304574668874450, -0.736270741235546260, -0.736236905961540790, -0.736203068846943420, -0.736169229891838420, -0.736135389096310270, -0.736101546460443350, -0.736067701984322920, +-0.736033855668033250, -0.736000007511658950, -0.735966157515284270, -0.735932305678994480, -0.735898452002873960, -0.735864596487006970, -0.735830739131478890, -0.735796879936373880, +-0.735763018901776640, -0.735729156027771670, -0.735695291314444000, -0.735661424761878120, -0.735627556370158750, -0.735593686139370150, -0.735559814069597580, -0.735525940160925540, +-0.735492064413438620, -0.735458186827221310, -0.735424307402358760, -0.735390426138935460, -0.735356543037036130, -0.735322658096745130, -0.735288771318147740, -0.735254882701328330, +-0.735220992246371610, -0.735187099953362620, -0.735153205822385860, -0.735119309853526140, -0.735085412046867840, -0.735051512402496220, -0.735017610920496000, -0.734983707600951550, +-0.734949802443947700, -0.734915895449569480, -0.734881986617901720, -0.734848075949028790, -0.734814163443035520, -0.734780249100007050, -0.734746332920028000, -0.734712414903183060, +-0.734678495049556850, -0.734644573359234720, -0.734610649832301180, -0.734576724468840590, -0.734542797268938560, -0.734508868232679580, -0.734474937360148350, -0.734441004651429470, +-0.734407070106608440, -0.734373133725769730, -0.734339195508998180, -0.734305255456378370, -0.734271313567995690, -0.734237369843934730, -0.734203424284280310, -0.734169476889117050, +-0.734135527658530410, -0.734101576592604890, -0.734067623691425530, -0.734033668955076820, -0.733999712383644140, -0.733965753977212200, -0.733931793735865920, -0.733897831659689800, +-0.733863867748769440, -0.733829902003189430, -0.733795934423034370, -0.733761965008389750, -0.733727993759340170, -0.733694020675970670, -0.733660045758365850, -0.733626069006611090, +-0.733592090420791320, -0.733558110000991250, -0.733524127747295580, -0.733490143659789820, -0.733456157738558880, -0.733422169983687370, -0.733388180395260210, -0.733354188973362910, +-0.733320195718080160, -0.733286200629496900, -0.733252203707697840, -0.733218204952768570, -0.733184204364793810, -0.733150201943858270, -0.733116197690047430, -0.733082191603446120, +-0.733048183684139380, -0.733014173932211800, -0.732980162347749100, -0.732946148930836090, -0.732912133681557610, -0.732878116599998570, -0.732844097686244480, -0.732810076940380140, +-0.732776054362490600, -0.732742029952660690, -0.732708003710976000, -0.732673975637521240, -0.732639945732381670, -0.732605913995641790, -0.732571880427387520, -0.732537845027703470, +-0.732503807796674570, -0.732469768734386410, -0.732435727840923810, -0.732401685116371940, -0.732367640560815490, -0.732333594174340410, -0.732299545957031170, -0.732265495908973160, +-0.732231444030251090, -0.732197390320950660, -0.732163334781156800, -0.732129277410954570, -0.732095218210428890, -0.732061157179665470, -0.732027094318749130, -0.731993029627765020, +-0.731958963106798090, -0.731924894755934030, -0.731890824575257780, -0.731856752564854380, -0.731822678724808770, -0.731788603055206880, -0.731754525556133520, -0.731720446227673400, +-0.731686365069912580, -0.731652282082935760, -0.731618197266828310, -0.731584110621675050, -0.731550022147561820, -0.731515931844573420, -0.731481839712795350, -0.731447745752312310, +-0.731413649963210230, -0.731379552345573950, -0.731345452899488820, -0.731311351625039910, -0.731277248522312680, -0.731243143591392530, -0.731209036832364380, -0.731174928245313380, +-0.731140817830325360, -0.731106705587485360, -0.731072591516878310, -0.731038475618589920, -0.731004357892705460, -0.730970238339310190, -0.730936116958488810, -0.730901993750327610, +-0.730867868714911270, -0.730833741852325410, -0.730799613162654850, -0.730765482645985510, -0.730731350302402440, -0.730697216131991120, -0.730663080134836380, -0.730628942311024270, +-0.730594802660639810, -0.730560661183768280, -0.730526517880494830, -0.730492372750905390, -0.730458225795085010, -0.730424077013118840, -0.730389926405092700, -0.730355773971091750, +-0.730321619711201350, -0.730287463625506670, -0.730253305714093640, -0.730219145977047290, -0.730184984414453010, -0.730150821026396060, -0.730116655812962370, -0.730082488774236980, +-0.730048319910305390, -0.730014149221252740, -0.729979976707164970, -0.729945802368127340, -0.729911626204225120, -0.729877448215543570, -0.729843268402168620, -0.729809086764185540, +-0.729774903301679490, -0.729740718014736500, -0.729706530903441620, -0.729672341967880440, -0.729638151208138130, -0.729603958624300830, -0.729569764216453590, -0.729535567984681890, +-0.729501369929070890, -0.729467170049706850, -0.729432968346674930, -0.729398764820060500, -0.729364559469948940, -0.729330352296426290, -0.729296143299577700, -0.729261932479488780, +-0.729227719836244680, -0.729193505369931660, -0.729159289080634760, -0.729125070968439810, -0.729090851033431740, -0.729056629275696920, -0.729022405695320510, -0.728988180292387770, +-0.728953953066984850, -0.728919724019197020, -0.728885493149110000, -0.728851260456808920, -0.728817025942379960, -0.728782789605908370, -0.728748551447479960, -0.728714311467179690, +-0.728680069665094130, -0.728645826041308230, -0.728611580595907920, -0.728577333328978230, -0.728543084240605540, -0.728508833330875130, -0.728474580599872690, -0.728440326047683500, +-0.728406069674393700, -0.728371811480088780, -0.728337551464854020, -0.728303289628775770, -0.728269025971939210, -0.728234760494430140, -0.728200493196333840, -0.728166224077736570, +-0.728131953138723700, -0.728097680379381050, -0.728063405799793890, -0.728029129400048490, -0.727994851180230330, -0.727960571140425010, -0.727926289280717900, -0.727892005601195380, +-0.727857720101942830, -0.727823432783046060, -0.727789143644590350, -0.727754852686662070, -0.727720559909346700, -0.727686265312729620, -0.727651968896897210, -0.727617670661934830, +-0.727583370607928330, -0.727549068734962940, -0.727514765043125400, -0.727480459532500840, -0.727446152203175100, -0.727411843055233760, -0.727377532088762990, -0.727343219303848490, +-0.727308904700575960, -0.727274588279030800, -0.727240270039299470, -0.727205949981467590, -0.727171628105620750, -0.727137304411844540, -0.727102978900225240, -0.727068651570848660, +-0.727034322423800510, -0.726999991459166050, -0.726965658677032000, -0.726931324077483950, -0.726896987660607060, -0.726862649426488150, -0.726828309375212480, -0.726793967506866200, +-0.726759623821534580, -0.726725278319304220, -0.726690931000260720, -0.726656581864489890, -0.726622230912077230, -0.726587878143109320, -0.726553523557671780, -0.726519167155850410, +-0.726484808937730710, -0.726450448903399490, -0.726416087052942030, -0.726381723386444240, -0.726347357903992070, -0.726312990605671670, -0.726278621491568850, -0.726244250561769110, +-0.726209877816359040, -0.726175503255424350, -0.726141126879050860, -0.726106748687324280, -0.726072368680331090, -0.726037986858157010, -0.726003603220887970, -0.725969217768609560, +-0.725934830501408500, -0.725900441419370270, -0.725866050522581020, -0.725831657811126350, -0.725797263285092750, -0.725762866944566040, -0.725728468789632150, -0.725694068820376790, +-0.725659667036886560, -0.725625263439247160, -0.725590858027544310, -0.725556450801864590, -0.725522041762293850, -0.725487630908917880, -0.725453218241822520, -0.725418803761094470, +-0.725384387466819440, -0.725349969359083470, -0.725315549437972160, -0.725281127703572340, -0.725246704155969700, -0.725212278795250300, -0.725177851621499950, -0.725143422634805250, +-0.725108991835251900, -0.725074559222926180, -0.725040124797913690, -0.725005688560301230, -0.724971250510174530, -0.724936810647619390, -0.724902368972722530, -0.724867925485569780, +-0.724833480186247160, -0.724799033074840620, -0.724764584151436740, -0.724730133416121360, -0.724695680868980840, -0.724661226510100680, -0.724626770339567680, -0.724592312357467790, +-0.724557852563887160, -0.724523390958911720, -0.724488927542627950, -0.724454462315121890, -0.724419995276479600, -0.724385526426787110, -0.724351055766131120, -0.724316583294597470, +-0.724282109012272410, -0.724247632919241660, -0.724213155015592250, -0.724178675301409890, -0.724144193776780520, -0.724109710441790950, -0.724075225296527240, -0.724040738341075300, +-0.724006249575521290, -0.723971758999951920, -0.723937266614453230, -0.723902772419111380, -0.723868276414012190, -0.723833778599242690, -0.723799278974888830, -0.723764777541036630, +-0.723730274297772150, -0.723695769245182420, -0.723661262383353150, -0.723626753712370840, -0.723592243232321300, -0.723557730943291460, -0.723523216845367250, -0.723488700938634710, +-0.723454183223180670, -0.723419663699091280, -0.723385142366452680, -0.723350619225350930, -0.723316094275872960, -0.723281567518104680, -0.723247038952132600, -0.723212508578042420, +-0.723177976395921520, -0.723143442405855490, -0.723108906607930920, -0.723074369002233870, -0.723039829588851050, -0.723005288367868700, -0.722970745339373110, -0.722936200503450420, +-0.722901653860187570, -0.722867105409670470, -0.722832555151985410, -0.722798003087219200, -0.722763449215457990, -0.722728893536788150, -0.722694336051295740, -0.722659776759067900, +-0.722625215660190560, -0.722590652754750210, -0.722556088042832780, -0.722521521524525650, -0.722486953199914520, -0.722452383069086100, -0.722417811132126440, -0.722383237389122580, +-0.722348661840160560, -0.722314084485326970, -0.722279505324707750, -0.722244924358390160, -0.722210341586460250, -0.722175757009004380, -0.722141170626108940, -0.722106582437860740, +-0.722071992444346280, -0.722037400645651360, -0.722002807041863370, -0.721968211633068240, -0.721933614419352660, -0.721899015400802810, -0.721864414577505610, -0.721829811949547430, +-0.721795207517014650, -0.721760601279993640, -0.721725993238571340, -0.721691383392834120, -0.721656771742868460, -0.721622158288760530, -0.721587543030597470, -0.721552925968465650, +-0.721518307102451460, -0.721483686432641160, -0.721449063959122010, -0.721414439681980160, -0.721379813601301880, -0.721345185717174430, -0.721310556029684080, -0.721275924538917200, +-0.721241291244960280, -0.721206656147900470, -0.721172019247823930, -0.721137380544817350, -0.721102740038967130, -0.721068097730360290, -0.721033453619083110, -0.720998807705222510, +-0.720964159988864430, -0.720929510470096350, -0.720894859149004310, -0.720860206025675240, -0.720825551100195420, -0.720790894372651980, -0.720756235843131310, -0.720721575511719670, +-0.720686913378504430, -0.720652249443571980, -0.720617583707008790, -0.720582916168901470, -0.720548246829337050, -0.720513575688402130, -0.720478902746183090, -0.720444228002766640, +-0.720409551458239930, -0.720374873112689220, -0.720340192966201440, -0.720305511018862870, -0.720270827270760750, -0.720236141721981580, -0.720201454372612180, -0.720166765222738700, +-0.720132074272448630, -0.720097381521828450, -0.720062686970964430, -0.720027990619944050, -0.719993292468853690, -0.719958592517780050, -0.719923890766809630, -0.719889187216029900, +-0.719854481865527030, -0.719819774715388050, -0.719785065765699340, -0.719750355016548270, -0.719715642468021330, -0.719680928120205230, -0.719646211973186460, -0.719611494027052600, +-0.719576774281889930, -0.719542052737785260, -0.719507329394825310, -0.719472604253097230, -0.719437877312687600, -0.719403148573683370, -0.719368418036170910, -0.719333685700237810, +-0.719298951565970460, -0.719264215633455330, -0.719229477902780020, -0.719194738374031030, -0.719159997047295160, -0.719125253922659020, -0.719090509000209990, -0.719055762280034760, +-0.719021013762220160, -0.718986263446852680, -0.718951511334019800, -0.718916757423808230, -0.718882001716304670, -0.718847244211595850, -0.718812484909769230, -0.718777723810911430, +-0.718742960915109250, -0.718708196222449410, -0.718673429733019290, -0.718638661446905800, -0.718603891364195220, -0.718569119484975150, -0.718534345809332400, -0.718499570337353680, +-0.718464793069125810, -0.718430014004736270, -0.718395233144271670, -0.718360450487819050, -0.718325666035464880, -0.718290879787296890, -0.718256091743401770, -0.718221301903866350, +-0.718186510268777330, -0.718151716838222430, -0.718116921612288240, -0.718082124591061690, -0.718047325774629600, -0.718012525163079340, -0.717977722756497960, -0.717942918554971830, +-0.717908112558588770, -0.717873304767435490, -0.717838495181598810, -0.717803683801165660, -0.717768870626223630, -0.717734055656859440, -0.717699238893160010, -0.717664420335212270, +-0.717629599983103720, -0.717594777836921270, -0.717559953896751760, -0.717525128162682100, -0.717490300634799900, -0.717455471313191980, -0.717420640197945380, -0.717385807289146920, +-0.717350972586884180, -0.717316136091244120, -0.717281297802313640, -0.717246457720179590, -0.717211615844929650, -0.717176772176650770, -0.717141926715429650, -0.717107079461353990, +-0.717072230414510630, -0.717037379574986700, -0.717002526942868920, -0.716967672518245340, -0.716932816301202420, -0.716897958291827450, -0.716863098490207350, -0.716828236896429830, +-0.716793373510581700, -0.716758508332750010, -0.716723641363021910, -0.716688772601485000, -0.716653902048226100, -0.716619029703332470, -0.716584155566890920, -0.716549279638989290, +-0.716514401919714490, -0.716479522409153360, -0.716444641107393700, -0.716409758014522560, -0.716374873130626980, -0.716339986455793780, -0.716305097990111110, -0.716270207733665560, +-0.716235315686544530, -0.716200421848834920, -0.716165526220624570, -0.716130628802000400, -0.716095729593049680, -0.716060828593859220, -0.716025925804517070, -0.715991021225110160, +-0.715956114855725630, -0.715921206696450430, -0.715886296747372700, -0.715851385008579140, -0.715816471480156810, -0.715781556162193630, -0.715746639054776530, -0.715711720157992780, +-0.715676799471929530, -0.715641876996674590, -0.715606952732314780, -0.715572026678937820, -0.715537098836630300, -0.715502169205480490, -0.715467237785575190, -0.715432304577001800, +-0.715397369579847340, -0.715362432794199750, -0.715327494220146080, -0.715292553857773680, -0.715257611707169620, -0.715222667768421800, -0.715187722041617400, -0.715152774526843340, +-0.715117825224187540, -0.715082874133737280, -0.715047921255579810, -0.715012966589802180, -0.714978010136492540, -0.714943051895737810, -0.714908091867625490, -0.714873130052242620, +-0.714838166449677240, -0.714803201060016490, -0.714768233883347650, -0.714733264919757970, -0.714698294169335390, -0.714663321632167060, -0.714628347308340460, -0.714593371197942750, +-0.714558393301061860, -0.714523413617784930, -0.714488432148199570, -0.714453448892392820, -0.714418463850452710, -0.714383477022466410, -0.714348488408521170, -0.714313498008705030, +-0.714278505823105040, -0.714243511851808900, -0.714208516094903540, -0.714173518552477350, -0.714138519224617240, -0.714103518111410930, -0.714068515212945450, -0.714033510529309080, +-0.713998504060588850, -0.713963495806872350, -0.713928485768246860, -0.713893473944800410, -0.713858460336620370, -0.713823444943794130, -0.713788427766408830, -0.713753408804552960, +-0.713718388058313450, -0.713683365527777780, -0.713648341213033890, -0.713613315114169260, -0.713578287231271260, -0.713543257564427270, -0.713508226113725440, -0.713473192879253040, +-0.713438157861097650, -0.713403121059346560, -0.713368082474087890, -0.713333042105409150, -0.713297999953397710, -0.713262956018141050, -0.713227910299727320, -0.713192862798243680, +-0.713157813513777940, -0.713122762446417370, -0.713087709596250230, -0.713052654963363790, -0.713017598547845410, -0.712982540349783370, -0.712947480369264920, -0.712912418606377880, +-0.712877355061209420, -0.712842289733847780, -0.712807222624380570, -0.712772153732895260, -0.712737083059479250, -0.712702010604220780, -0.712666936367207350, -0.712631860348526550, +-0.712596782548265860, -0.712561702966513440, -0.712526621603356780, -0.712491538458883580, -0.712456453533181210, -0.712421366826338050, -0.712386278338441370, -0.712351188069579200, +-0.712316096019838580, -0.712281002189308010, -0.712245906578075070, -0.712210809186226920, -0.712175710013852160, -0.712140609061038040, -0.712105506327872510, -0.712070401814442810, +-0.712035295520837440, -0.712000187447143770, -0.711965077593449850, -0.711929965959842700, -0.711894852546411050, -0.711859737353242260, -0.711824620380424040, -0.711789501628044110, +-0.711754381096190600, -0.711719258784951240, -0.711684134694413610, -0.711649008824665420, -0.711613881175795050, -0.711578751747889870, -0.711543620541037590, -0.711508487555326590, +-0.711473352790844230, -0.711438216247678670, -0.711403077925917170, -0.711367937825648220, -0.711332795946959530, -0.711297652289938800, -0.711262506854673630, -0.711227359641252500, +-0.711192210649763010, -0.711157059880292990, -0.711121907332930010, -0.711086753007762580, -0.711051596904878180, -0.711016439024364840, -0.710981279366310170, -0.710946117930802530, +-0.710910954717929530, -0.710875789727778980, -0.710840622960439150, -0.710805454415997850, -0.710770284094542900, -0.710735111996161910, -0.710699938120943450, -0.710664762468975140, +-0.710629585040344900, -0.710594405835140440, -0.710559224853450240, -0.710524042095362020, -0.710488857560963690, -0.710453671250342870, -0.710418483163588130, -0.710383293300787310, +-0.710348101662028110, -0.710312908247398460, -0.710277713056986840, -0.710242516090880960, -0.710207317349168310, -0.710172116831937930, -0.710136914539277080, -0.710101710471274020, +-0.710066504628016350, -0.710031297009592670, -0.709996087616090790, -0.709960876447598750, -0.709925663504204160, -0.709890448785995720, -0.709855232293061240, -0.709820014025488550, +-0.709784793983365580, -0.709749572166780920, -0.709714348575822380, -0.709679123210577910, -0.709643896071135320, -0.709608667157583310, -0.709573436470009700, -0.709538204008502430, +-0.709502969773149310, -0.709467733764039150, -0.709432495981259570, -0.709397256424898480, -0.709362015095044600, -0.709326771991785730, -0.709291527115209820, -0.709256280465404790, +-0.709221032042459450, -0.709185781846461420, -0.709150529877499050, -0.709115276135659940, -0.709080020621033040, -0.709044763333706030, -0.709009504273767190, -0.708974243441304110, +-0.708938980836405830, -0.708903716459160170, -0.708868450309655170, -0.708833182387978660, -0.708797912694219660, -0.708762641228465770, -0.708727367990804940, -0.708692092981326070, +-0.708656816200117000, -0.708621537647265760, -0.708586257322860400, -0.708550975226989730, -0.708515691359741680, -0.708480405721204410, -0.708445118311465730, -0.708409829130614680, +-0.708374538178738970, -0.708339245455926860, -0.708303950962266390, -0.708268654697846390, -0.708233356662754670, -0.708198056857079590, -0.708162755280909110, -0.708127451934332020, +-0.708092146817436260, -0.708056839930309880, -0.708021531273041680, -0.707986220845719720, -0.707950908648432130, -0.707915594681266970, -0.707880278944313050, -0.707844961437658630, +-0.707809642161391750, -0.707774321115600350, -0.707738998300373460, -0.707703673715799120, -0.707668347361965600, -0.707633019238960940, -0.707597689346874060, -0.707562357685792900, +-0.707527024255805830, -0.707491689057000880, -0.707456352089467110, -0.707421013353292330, -0.707385672848565130, -0.707350330575373440, -0.707314986533806200, -0.707279640723951440, +-0.707244293145897320, -0.707208943799732760, -0.707173592685545800, -0.707138239803424940, -0.707102885153458200, -0.707067528735734420, -0.707032170550341950, -0.706996810597368960, +-0.706961448876903710, -0.706926085389035120, -0.706890720133851240, -0.706855353111440650, -0.706819984321891410, -0.706784613765292450, -0.706749241441731900, -0.706713867351298370, +-0.706678491494079800, -0.706643113870165320, -0.706607734479642980, -0.706572353322601040, -0.706536970399128660, -0.706501585709313650, -0.706466199253244830, -0.706430811031010130, +-0.706395421042698700, -0.706360029288398810, -0.706324635768198710, -0.706289240482186780, -0.706253843430452060, -0.706218444613082810, -0.706183044030167300, -0.706147641681794000, +-0.706112237568051750, -0.706076831689029020, -0.706041424044814180, -0.706006014635495500, -0.705970603461162140, -0.705935190521902230, -0.705899775817803940, -0.705864359348956640, +-0.705828941115448360, -0.705793521117367820, -0.705758099354803050, -0.705722675827843430, -0.705687250536577100, -0.705651823481092680, -0.705616394661478300, -0.705580964077823340, +-0.705545531730215950, -0.705510097618744610, -0.705474661743497820, -0.705439224104564720, -0.705403784702033580, -0.705368343535992870, -0.705332900606530980, -0.705297455913737270, +-0.705262009457699790, -0.705226561238507350, -0.705191111256248230, -0.705155659511011670, -0.705120206002885830, -0.705084750731959310, -0.705049293698321140, -0.705013834902059710, +-0.704978374343263820, -0.704942912022021530, -0.704907447938422300, -0.704871982092554530, -0.704836514484506790, -0.704801045114367360, -0.704765573982225720, -0.704730101088170140, +-0.704694626432289310, -0.704659150014671610, -0.704623671835406310, -0.704588191894581770, -0.704552710192286820, -0.704517226728609840, -0.704481741503640070, -0.704446254517465900, +-0.704410765770175810, -0.704375275261859170, -0.704339782992604250, -0.704304288962499860, -0.704268793171634490, -0.704233295620097510, -0.704197796307977190, -0.704162295235362450, +-0.704126792402341550, -0.704091287809004100, -0.704055781455438350, -0.704020273341733230, -0.703984763467977110, -0.703949251834259270, -0.703913738440668400, -0.703878223287293210, +-0.703842706374222080, -0.703807187701544600, -0.703771667269349030, -0.703736145077724080, -0.703700621126759020, -0.703665095416542430, -0.703629567947163030, -0.703594038718709400, +-0.703558507731271150, -0.703522974984936430, -0.703487440479794390, -0.703451904215933400, -0.703416366193443050, -0.703380826412411730, -0.703345284872928240, -0.703309741575081300, +-0.703274196518960390, -0.703238649704653880, -0.703203101132250820, -0.703167550801839680, -0.703131998713509950, -0.703096444867350230, -0.703060889263449120, -0.703025331901896090, +-0.702989772782779630, -0.702954211906188900, -0.702918649272212150, -0.702883084880939310, -0.702847518732458540, -0.702811950826859100, -0.702776381164229470, -0.702740809744659130, +-0.702705236568236800, -0.702669661635051400, -0.702634084945191530, -0.702598506498746780, -0.702562926295805750, -0.702527344336457360, -0.702491760620790330, -0.702456175148894250, +-0.702420587920857710, -0.702384998936769640, -0.702349408196718760, -0.702313815700794760, -0.702278221449086140, -0.702242625441681700, -0.702207027678671050, -0.702171428160142770, +-0.702135826886185920, -0.702100223856889190, -0.702064619072342190, -0.702029012532633720, -0.701993404237852610, -0.701957794188087790, -0.701922182383428740, -0.701886568823964270, +-0.701850953509783330, -0.701815336440974710, -0.701779717617628140, -0.701744097039832200, -0.701708474707675940, -0.701672850621248290, -0.701637224780638840, -0.701601597185936290, +-0.701565967837229460, -0.701530336734607960, -0.701494703878160710, -0.701459069267976630, -0.701423432904144550, -0.701387794786754170, -0.701352154915894420, -0.701316513291654230, +-0.701280869914122420, -0.701245224783388800, -0.701209577899542080, -0.701173929262671410, -0.701138278872865620, -0.701102626730214510, -0.701066972834806680, -0.701031317186731510, +-0.700995659786077810, -0.700960000632935180, -0.700924339727392540, -0.700888677069538720, -0.700853012659463650, -0.700817346497255910, -0.700781678583004890, -0.700746008916799280, +-0.700710337498729020, -0.700674664328882920, -0.700638989407350140, -0.700603312734219610, -0.700567634309581020, -0.700531954133523430, -0.700496272206135970, -0.700460588527507480, +-0.700424903097727760, -0.700389215916885850, -0.700353526985070920, -0.700317836302371880, -0.700282143868878440, -0.700246449684679750, -0.700210753749864970, -0.700175056064522900, +-0.700139356628743490, -0.700103655442615770, -0.700067952506228550, -0.700032247819671770, -0.699996541383034470, -0.699960833196405670, -0.699925123259874550, -0.699889411573530910, +-0.699853698137463680, -0.699817982951762340, -0.699782266016515610, -0.699746547331813630, -0.699710826897745220, -0.699675104714399750, -0.699639380781866160, -0.699603655100234480, +-0.699567927669593750, -0.699532198490033120, -0.699496467561641630, -0.699460734884509330, -0.699425000458725240, -0.699389264284378200, -0.699353526361558450, -0.699317786690354830, +-0.699282045270856800, -0.699246302103153190, -0.699210557187334270, -0.699174810523488950, -0.699139062111706620, -0.699103311952076200, -0.699067560044687950, -0.699031806389630810, +-0.698996050986994020, -0.698960293836866860, -0.698924534939339260, -0.698888774294500360, -0.698853011902439540, -0.698817247763245830, -0.698781481877009390, -0.698745714243819150, +-0.698709944863764370, -0.698674173736934970, -0.698638400863420220, -0.698602626243309490, -0.698566849876691710, -0.698531071763657250, -0.698495291904295160, -0.698459510298694800, +-0.698423726946945320, -0.698387941849136770, -0.698352155005358520, -0.698316366415699830, -0.698280576080249850, -0.698244783999098730, -0.698208990172335730, -0.698173194600050230, +-0.698137397282331370, -0.698101598219269430, -0.698065797410953430, -0.698029994857472640, -0.697994190558917200, -0.697958384515376280, -0.697922576726939360, -0.697886767193695690, +-0.697850955915735430, -0.697815142893147830, -0.697779328126022280, -0.697743511614448140, -0.697707693358515570, -0.697671873358313710, -0.697636051613932270, -0.697600228125460300, +-0.697564402892988040, -0.697528575916604780, -0.697492747196400200, -0.697456916732463350, -0.697421084524884490, -0.697385250573753000, -0.697349414879158250, -0.697313577441189820, +-0.697277738259937660, -0.697241897335491130, -0.697206054667939610, -0.697170210257373250, -0.697134364103881410, -0.697098516207553590, -0.697062666568479150, -0.697026815186748470, +-0.696990962062450590, -0.696955107195675440, -0.696919250586512160, -0.696883392235051020, -0.696847532141381510, -0.696811670305593100, -0.696775806727775170, -0.696739941408018090, +-0.696704074346411130, -0.696668205543043980, -0.696632334998006030, -0.696596462711387530, -0.696560588683277970, -0.696524712913766500, -0.696488835402943600, -0.696452956150898640, +-0.696417075157721220, -0.696381192423500940, -0.696345307948327830, -0.696309421732291600, -0.696273533775481730, -0.696237644077987720, -0.696201752639899920, -0.696165859461307710, +-0.696129964542300920, -0.696094067882968790, -0.696058169483401820, -0.696022269343689490, -0.695986367463921510, -0.695950463844187240, -0.695914558484577170, -0.695878651385180680, +-0.695842742546087250, -0.695806831967387350, -0.695770919649170260, -0.695735005591525900, -0.695699089794543760, -0.695663172258314200, -0.695627252982926600, -0.695591331968471000, +-0.695555409215036670, -0.695519484722714190, -0.695483558491593050, -0.695447630521762950, -0.695411700813313380, -0.695375769366334940, -0.695339836180917100, -0.695303901257149690, +-0.695267964595122080, -0.695232026194924970, -0.695196086056647840, -0.695160144180380520, -0.695124200566212380, -0.695088255214234120, -0.695052308124535220, -0.695016359297205290, +-0.694980408732334690, -0.694944456430013120, -0.694908502390330420, -0.694872546613376050, -0.694836589099240730, -0.694800629848013940, -0.694764668859785610, -0.694728706134645210, +-0.694692741672683360, -0.694656775473989740, -0.694620807538654070, -0.694584837866766060, -0.694548866458416400, -0.694512893313694480, -0.694476918432690330, -0.694440941815493650, +-0.694404963462194820, -0.694368983372883660, -0.694333001547649650, -0.694297017986583500, -0.694261032689774900, -0.694225045657313580, -0.694189056889289340, -0.694153066385792880, +-0.694117074146913590, -0.694081080172741730, -0.694045084463366880, -0.694009087018879530, -0.693973087839369620, -0.693937086924926840, -0.693901084275641120, -0.693865079891602950, +-0.693829073772902040, -0.693793065919628530, -0.693757056331872010, -0.693721045009723200, -0.693685031953271690, -0.693649017162607300, -0.693613000637820720, -0.693576982379001670, +-0.693540962386240190, -0.693504940659625870, -0.693468917199249630, -0.693432892005201080, -0.693396865077570260, -0.693360836416446970, -0.693324806021921810, -0.693288773894084830, +-0.693252740033025730, -0.693216704438834540, -0.693180667111601980, -0.693144628051417630, -0.693108587258371770, -0.693072544732554200, -0.693036500474055520, -0.693000454482965540, +-0.692964406759374100, -0.692928357303371990, -0.692892306115049040, -0.692856253194495290, -0.692820198541800550, -0.692784142157055640, -0.692748084040350490, -0.692712024191775020, +-0.692675962611419170, -0.692639899299373750, -0.692603834255728580, -0.692567767480573800, -0.692531698973999350, -0.692495628736095940, -0.692459556766953480, -0.692423483066662130, +-0.692387407635311700, -0.692351330472993130, -0.692315251579796120, -0.692279170955811150, -0.692243088601127820, -0.692207004515837170, -0.692170918700028890, -0.692134831153793040, +-0.692098741877220420, -0.692062650870401090, -0.692026558133424950, -0.691990463666382170, -0.691954367469363560, -0.691918269542459050, -0.691882169885758790, -0.691846068499352820, +-0.691809965383332060, -0.691773860537786330, -0.691737753962805900, -0.691701645658480910, -0.691665535624901960, -0.691629423862159310, -0.691593310370343000, -0.691557195149543170, +-0.691521078199850650, -0.691484959521355360, -0.691448839114147450, -0.691412716978317740, -0.691376593113956160, -0.691340467521153190, -0.691304340199998760, -0.691268211150583680, +-0.691232080372998100, -0.691195947867332410, -0.691159813633676510, -0.691123677672121350, -0.691087539982756960, -0.691051400565673820, -0.691015259420961760, -0.690979116548711910, +-0.690942971949014330, -0.690906825621959260, -0.690870677567636760, -0.690834527786137960, -0.690798376277552810, -0.690762223041971430, -0.690726068079484780, -0.690689911390182990, +-0.690653752974156430, -0.690617592831495150, -0.690581430962290190, -0.690545267366631690, -0.690509102044609910, -0.690472934996315240, -0.690436766221838360, -0.690400595721269660, +-0.690364423494699510, -0.690328249542217940, -0.690292073863916110, -0.690255896459884060, -0.690219717330212260, -0.690183536474990870, -0.690147353894310920, -0.690111169588262570, +-0.690074983556936310, -0.690038795800422380, -0.690002606318811610, -0.689966415112194480, -0.689930222180660910, -0.689894027524302070, -0.689857831143208200, -0.689821633037469790, +-0.689785433207176890, -0.689749231652420860, -0.689713028373291630, -0.689676823369879900, -0.689640616642275830, -0.689604408190570450, -0.689568198014854030, -0.689531986115217150, +-0.689495772491750090, -0.689459557144543770, -0.689423340073688660, -0.689387121279275150, -0.689350900761393490, -0.689314678520134950, -0.689278454555589670, -0.689242228867847920, +-0.689206001457000950, -0.689169772323139030, -0.689133541466352640, -0.689097308886732040, -0.689061074584368600, -0.689024838559352370, -0.688988600811774040, -0.688952361341723880, +-0.688916120149293150, -0.688879877234572220, -0.688843632597651470, -0.688807386238621370, -0.688771138157573180, -0.688734888354597060, -0.688698636829783720, -0.688662383583223510, +-0.688626128615007600, -0.688589871925226470, -0.688553613513970260, -0.688517353381330350, -0.688481091527397120, -0.688444827952261030, -0.688408562656012690, -0.688372295638743140, +-0.688336026900542960, -0.688299756441502650, -0.688263484261712690, -0.688227210361264220, -0.688190934740247840, -0.688154657398754140, -0.688118378336873390, -0.688082097554697070, +-0.688045815052315430, -0.688009530829819300, -0.687973244887299050, -0.687936957224845940, -0.687900667842550550, -0.687864376740503050, -0.687828083918795020, -0.687791789377516730, +-0.687755493116758990, -0.687719195136612170, -0.687682895437167760, -0.687646594018516020, -0.687610290880747880, -0.687573986023953590, -0.687537679448224750, -0.687501371153651620, +-0.687465061140325130, -0.687428749408335650, -0.687392435957774550, -0.687356120788732540, -0.687319803901300100, -0.687283485295567820, -0.687247164971627190, -0.687210842929568580, +-0.687174519169482910, -0.687138193691460670, -0.687101866495593240, -0.687065537581971090, -0.687029206950684810, -0.686992874601825900, -0.686956540535484720, -0.686920204751752190, +-0.686883867250718820, -0.686847528032476170, -0.686811187097114640, -0.686774844444725140, -0.686738500075398270, -0.686702153989225410, -0.686665806186297130, -0.686629456666704390, +-0.686593105430537750, -0.686556752477888610, -0.686520397808847550, -0.686484041423505500, -0.686447683321953050, -0.686411323504281800, -0.686374961970582120, -0.686338598720944710, +-0.686302233755461290, -0.686265867074222100, -0.686229498677318310, -0.686193128564840490, -0.686156756736880150, -0.686120383193527860, -0.686084007934874670, -0.686047630961011070, +-0.686011252272028860, -0.685974871868018420, -0.685938489749070790, -0.685902105915276560, -0.685865720366727550, -0.685829333103514130, -0.685792944125727330, -0.685756553433457980, +-0.685720161026797450, -0.685683766905836660, -0.685647371070665980, -0.685610973521377230, -0.685574574258061120, -0.685538173280808570, -0.685501770589710180, -0.685465366184857760, +-0.685428960066341910, -0.685392552234253550, -0.685356142688683610, -0.685319731429723580, -0.685283318457464260, -0.685246903771996710, -0.685210487373411500, -0.685174069261800360, +-0.685137649437254080, -0.685101227899863720, -0.685064804649719860, -0.685028379686914430, -0.684991953011538040, -0.684955524623681700, -0.684919094523436240, -0.684882662710893380, +-0.684846229186143800, -0.684809793949278430, -0.684773357000388880, -0.684736918339565960, -0.684700477966900700, -0.684664035882483810, -0.684627592086407330, -0.684591146578761740, +-0.684554699359638420, -0.684518250429127950, -0.684481799787322150, -0.684445347434311960, -0.684408893370188290, -0.684372437595042070, -0.684335980108965130, -0.684299520912048260, +-0.684263060004382530, -0.684226597386058840, -0.684190133057169030, -0.684153667017803780, -0.684117199268054140, -0.684080729808011820, -0.684044258637767630, -0.684007785757412830, +-0.683971311167038240, -0.683934834866735670, -0.683898356856595950, -0.683861877136710430, -0.683825395707169940, -0.683788912568066180, -0.683752427719490190, -0.683715941161533110, +-0.683679452894285890, -0.683642962917840320, -0.683606471232287350, -0.683569977837718220, -0.683533482734223760, -0.683496985921896010, -0.683460487400825770, -0.683423987171103970, +-0.683387485232822560, -0.683350981586072330, -0.683314476230944770, -0.683277969167530590, -0.683241460395921930, -0.683204949916209500, -0.683168437728484790, -0.683131923832838610, +-0.683095408229362990, -0.683058890918148750, -0.683022371899287380, -0.682985851172869700, -0.682949328738987840, -0.682912804597732510, -0.682876278749195210, -0.682839751193466960, +-0.682803221930639580, -0.682766690960804220, -0.682730158284051700, -0.682693623900474170, -0.682657087810162540, -0.682620550013208320, -0.682584010509702300, -0.682547469299736530, +-0.682510926383402160, -0.682474381760790450, -0.682437835431992430, -0.682401287397100260, -0.682364737656204760, -0.682328186209397500, -0.682291633056769320, -0.682255078198412470, +-0.682218521634417980, -0.682181963364877130, -0.682145403389881060, -0.682108841709521800, -0.682072278323890390, -0.682035713233078320, -0.681999146437176630, -0.681962577936277460, +-0.681926007730471740, -0.681889435819850730, -0.681852862204506470, -0.681816286884530110, -0.681779709860012910, -0.681743131131046230, -0.681706550697721900, -0.681669968560131290, +-0.681633384718365760, -0.681596799172516480, -0.681560211922675460, -0.681523622968933870, -0.681487032311383300, -0.681450439950114780, -0.681413845885220580, -0.681377250116791620, +-0.681340652644919720, -0.681304053469695690, -0.681267452591211910, -0.681230850009559520, -0.681194245724829670, -0.681157639737114520, -0.681121032046505310, -0.681084422653093440, +-0.681047811556970250, -0.681011198758227910, -0.680974584256957450, -0.680937968053250580, -0.680901350147198550, -0.680864730538893290, -0.680828109228426400, -0.680791486215889140, +-0.680754861501372770, -0.680718235084969650, -0.680681606966770940, -0.680644977146868340, -0.680608345625352770, -0.680571712402316730, -0.680535077477851470, -0.680498440852048030, +-0.680461802524998990, -0.680425162496795410, -0.680388520767528870, -0.680351877337290740, -0.680315232206173180, -0.680278585374267550, -0.680241936841665560, -0.680205286608458250, +-0.680168634674738200, -0.680131981040596470, -0.680095325706124850, -0.680058668671414510, -0.680022009936557930, -0.679985349501646240, -0.679948687366771170, -0.679912023532024070, +-0.679875357997497320, -0.679838690763282070, -0.679802021829470140, -0.679765351196152780, -0.679728678863422480, -0.679692004831370380, -0.679655329100087970, -0.679618651669667620, +-0.679581972540200590, -0.679545291711778580, -0.679508609184493070, -0.679471924958436340, -0.679435239033699840, -0.679398551410375200, -0.679361862088553870, -0.679325171068328240, +-0.679288478349789670, -0.679251783933029870, -0.679215087818140330, -0.679178390005213410, -0.679141690494340480, -0.679104989285613360, -0.679068286379123310, -0.679031581774963030, +-0.678994875473223680, -0.678958167473996950, -0.678921457777375000, -0.678884746383449420, -0.678848033292312030, -0.678811318504054180, -0.678774602018768380, -0.678737883836546100, +-0.678701163957479150, -0.678664442381658910, -0.678627719109177850, -0.678590994140127580, -0.678554267474599680, -0.678517539112685970, -0.678480809054478610, -0.678444077300069280, +-0.678407343849549700, -0.678370608703011470, -0.678333871860547170, -0.678297133322248060, -0.678260393088205740, -0.678223651158512910, -0.678186907533260830, -0.678150162212541540, +-0.678113415196446410, -0.678076666485068260, -0.678039916078498340, -0.678003163976828580, -0.677966410180150690, -0.677929654688557040, -0.677892897502139210, -0.677856138620989260, +-0.677819378045198540, -0.677782615774859760, -0.677745851810064410, -0.677709086150904420, -0.677672318797471360, -0.677635549749857850, -0.677598779008155570, -0.677562006572455910, +-0.677525232442851570, -0.677488456619434130, -0.677451679102295650, -0.677414899891527480, -0.677378118987222550, -0.677341336389472250, -0.677304552098368600, -0.677267766114003300, +-0.677230978436468840, -0.677194189065856930, -0.677157398002259600, -0.677120605245768450, -0.677083810796476060, -0.677047014654474260, -0.677010216819854850, -0.676973417292709550, +-0.676936616073131050, -0.676899813161210950, -0.676863008557041400, -0.676826202260713990, -0.676789394272321320, -0.676752584591955310, -0.676715773219707440, -0.676678960155670420, +-0.676642145399936060, -0.676605328952596290, -0.676568510813742920, -0.676531690983468550, -0.676494869461864990, -0.676458046249024280, -0.676421221345038130, -0.676384394749999230, +-0.676347566463999290, -0.676310736487130470, -0.676273904819484460, -0.676237071461154080, -0.676200236412231040, -0.676163399672807360, -0.676126561242974770, -0.676089721122826170, +-0.676052879312453280, -0.676016035811947910, -0.675979190621402770, -0.675942343740909560, -0.675905495170560530, -0.675868644910447510, -0.675831792960663200, -0.675794939321299300, +-0.675758083992448080, -0.675721226974201450, -0.675684368266651900, -0.675647507869891580, -0.675610645784012420, -0.675573782009106340, -0.675536916545266040, -0.675500049392583570, +-0.675463180551150840, -0.675426310021060020, -0.675389437802403680, -0.675352563895273650, -0.675315688299761960, -0.675278811015961430, -0.675241932043963770, -0.675205051383861330, +-0.675168169035745950, -0.675131284999710420, -0.675094399275846690, -0.675057511864247010, -0.675020622765003190, -0.674983731978208160, -0.674946839503953730, -0.674909945342332280, +-0.674873049493435630, -0.674836151957356690, -0.674799252734187390, -0.674762351824019890, -0.674725449226946220, -0.674688544943059300, -0.674651638972450950, -0.674614731315213540, +-0.674577821971438900, -0.674540910941220150, -0.674503998224649020, -0.674467083821817640, -0.674430167732818830, -0.674393249957744630, -0.674356330496687310, -0.674319409349738770, +-0.674282486516992070, -0.674245561998539240, -0.674208635794472430, -0.674171707904883680, -0.674134778329866010, -0.674097847069511370, -0.674060914123912220, -0.674023979493160400, +-0.673987043177348920, -0.673950105176569840, -0.673913165490915510, -0.673876224120477870, -0.673839281065350070, -0.673802336325624030, -0.673765389901391900, -0.673728441792746600, +-0.673691491999780180, -0.673654540522585000, -0.673617587361253210, -0.673580632515877740, -0.673543675986550630, -0.673506717773364460, -0.673469757876411060, -0.673432796295783560, +-0.673395833031574240, -0.673358868083875240, -0.673321901452778700, -0.673284933138377780, -0.673247963140764520, -0.673210991460031380, -0.673174018096270420, -0.673137043049574670, +-0.673100066320036380, -0.673063087907747600, -0.673026107812801480, -0.672989126035289930, -0.672952142575305670, -0.672915157432940720, -0.672878170608288250, -0.672841182101440280, +-0.672804191912489410, -0.672767200041527680, -0.672730206488648340, -0.672693211253943430, -0.672656214337505440, -0.672619215739426730, -0.672582215459800240, -0.672545213498718210, +-0.672508209856273130, -0.672471204532557150, -0.672434197527663650, -0.672397188841684530, -0.672360178474712080, -0.672323166426839650, -0.672286152698159170, -0.672249137288763340, +-0.672212120198744320, -0.672175101428195370, -0.672138080977208730, -0.672101058845876790, -0.672064035034291910, -0.672027009542547350, -0.671989982370735150, -0.671952953518948020, +-0.671915922987278200, -0.671878890775818860, -0.671841856884662360, -0.671804821313901180, -0.671767784063627580, -0.671730745133934830, -0.671693704524915390, -0.671656662236661540, +-0.671619618269265750, -0.671582572622821170, -0.671545525297420290, -0.671508476293155130, -0.671471425610119190, -0.671434373248404710, -0.671397319208104190, -0.671360263489310220, +-0.671323206092115820, -0.671286147016613380, -0.671249086262895590, -0.671212023831054720, -0.671174959721184130, -0.671137893933376200, -0.671100826467723510, -0.671063757324318440, +-0.671026686503254250, -0.670989614004623420, -0.670952539828518550, -0.670915463975031880, -0.670878386444257010, -0.670841307236286100, -0.670804226351211730, -0.670767143789126940, +-0.670730059550124440, -0.670692973634296700, -0.670655886041736200, -0.670618796772536330, -0.670581705826789440, -0.670544613204588360, -0.670507518906025330, -0.670470422931193850, +-0.670433325280186400, -0.670396225953095560, -0.670359124950013820, -0.670322022271034660, -0.670284917916250440, -0.670247811885753890, -0.670210704179637460, -0.670173594797994650, +-0.670136483740917830, -0.670099371008499480, -0.670062256600832960, -0.670025140518010880, -0.669988022760125920, -0.669950903327270590, -0.669913782219538230, -0.669876659437021570, +-0.669839534979813190, -0.669802408848005680, -0.669765281041692420, -0.669728151560965990, -0.669691020405919210, -0.669653887576644460, -0.669616753073235430, -0.669579616895784490, +-0.669542479044384460, -0.669505339519127940, -0.669468198320108400, -0.669431055447418320, -0.669393910901150630, -0.669356764681397820, -0.669319616788253470, -0.669282467221810060, +-0.669245315982160190, -0.669208163069397340, -0.669171008483613990, -0.669133852224903180, -0.669096694293357500, -0.669059534689070310, -0.669022373412134330, -0.668985210462642370, +-0.668948045840687120, -0.668910879546361970, -0.668873711579759720, -0.668836541940973190, -0.668799370630094980, -0.668762197647218670, -0.668725022992436750, -0.668687846665842360, +-0.668650668667528090, -0.668613488997587440, -0.668576307656112980, -0.668539124643197540, -0.668501939958934590, -0.668464753603416730, -0.668427565576736990, -0.668390375878988090, +-0.668353184510263490, -0.668315991470656010, -0.668278796760258480, -0.668241600379163690, -0.668204402327465250, -0.668167202605255750, -0.668130001212628220, -0.668092798149675370, +-0.668055593416490900, -0.668018387013167400, -0.667981178939797910, -0.667943969196475250, -0.667906757783292890, -0.667869544700343650, -0.667832329947720240, -0.667795113525516350, +-0.667757895433824690, -0.667720675672738300, -0.667683454242349870, -0.667646231142753120, -0.667609006374040750, -0.667571779936305900, -0.667534551829641280, -0.667497322054140700, +-0.667460090609896640, -0.667422857497002480, -0.667385622715550800, -0.667348386265635420, -0.667311148147349040, -0.667273908360784820, -0.667236666906035450, -0.667199423783194740, +-0.667162178992355530, -0.667124932533610600, -0.667087684407053570, -0.667050434612777350, -0.667013183150874990, -0.666975930021439400, -0.666938675224564290, -0.666901418760342590, +-0.666864160628867220, -0.666826900830231220, -0.666789639364528290, -0.666752376231851130, -0.666715111432293120, -0.666677844965947060, -0.666640576832906670, -0.666603307033264760, +-0.666566035567114690, -0.666528762434549170, -0.666491487635662020, -0.666454211170546260, -0.666416933039294830, -0.666379653242000880, -0.666342371778757990, -0.666305088649659320, +-0.666267803854797450, -0.666230517394266530, -0.666193229268159270, -0.666155939476568930, -0.666118648019588420, -0.666081354897311570, -0.666044060109831420, -0.666006763657240990, +-0.665969465539633430, -0.665932165757102460, -0.665894864309741210, -0.665857561197642720, -0.665820256420899930, -0.665782949979606960, -0.665745641873856540, -0.665708332103742030, +-0.665671020669356350, -0.665633707570793430, -0.665596392808146310, -0.665559076381507800, -0.665521758290971930, -0.665484438536631750, -0.665447117118580400, -0.665409794036910920, +-0.665372469291717340, -0.665335142883092480, -0.665297814811129930, -0.665260485075922390, -0.665223153677564020, -0.665185820616147730, -0.665148485891766890, -0.665111149504514550, +-0.665073811454484630, -0.665036471741770160, -0.664999130366464630, -0.664961787328660850, -0.664924442628452850, -0.664887096265933900, -0.664849748241196800, -0.664812398554335720, +-0.664775047205443560, -0.664737694194613820, -0.664700339521939520, -0.664662983187514710, -0.664625625191432420, -0.664588265533786030, -0.664550904214668670, -0.664513541234174500, +-0.664476176592396330, -0.664438810289427750, -0.664401442325361800, -0.664364072700292630, -0.664326701414313270, -0.664289328467517090, -0.664251953859997360, -0.664214577591847990, +-0.664177199663162240, -0.664139820074033490, -0.664102438824554890, -0.664065055914820460, -0.664027671344923350, -0.663990285114956840, -0.663952897225014830, -0.663915507675190590, +-0.663878116465577710, -0.663840723596269110, -0.663803329067359060, -0.663765932878940700, -0.663728535031107400, -0.663691135523952540, -0.663653734357570140, -0.663616331532053460, +-0.663578927047495880, -0.663541520903990660, -0.663504113101632040, -0.663466703640513080, -0.663429292520727350, -0.663391879742368020, -0.663354465305529440, -0.663317049210304540, +-0.663279631456786810, -0.663242212045070280, -0.663204790975248320, -0.663167368247414290, -0.663129943861661460, -0.663092517818084200, -0.663055090116775550, -0.663017660757829310, +-0.662980229741338520, -0.662942797067397450, -0.662905362736099460, -0.662867926747538030, -0.662830489101806420, -0.662793049798998890, -0.662755608839208810, -0.662718166222529660, +-0.662680721949054810, -0.662643276018878510, -0.662605828432093920, -0.662568379188794520, -0.662530928289074450, -0.662493475733027080, -0.662456021520746010, -0.662418565652324600, +-0.662381108127857000, -0.662343648947436690, -0.662306188111157270, -0.662268725619112100, -0.662231261471395330, -0.662193795668100550, -0.662156328209321130, -0.662118859095150670, +-0.662081388325683310, -0.662043915901012530, -0.662006441821232030, -0.661968966086434960, -0.661931488696715920, -0.661894009652168050, -0.661856528952885270, -0.661819046598960740, +-0.661781562590489040, -0.661744076927563320, -0.661706589610277060, -0.661669100638724750, -0.661631610012999640, -0.661594117733195540, -0.661556623799405720, -0.661519128211724760, +-0.661481630970246040, -0.661444132075063140, -0.661406631526269550, -0.661369129323959860, -0.661331625468227210, -0.661294119959165540, -0.661256612796868200, -0.661219103981429690, +-0.661181593512943480, -0.661144081391503160, -0.661106567617202430, -0.661069052190135560, -0.661031535110396030, -0.660994016378077420, -0.660956495993274000, -0.660918973956079460, +-0.660881450266587400, -0.660843924924891410, -0.660806397931085860, -0.660768869285264350, -0.660731338987520790, -0.660693807037948440, -0.660656273436641910, -0.660618738183694650, +-0.660581201279200610, -0.660543662723253270, -0.660506122515947090, -0.660468580657375570, -0.660431037147632630, -0.660393491986811740, -0.660355945175007400, -0.660318396712313290, +-0.660280846598822800, -0.660243294834630510, -0.660205741419830130, -0.660168186354515240, -0.660130629638779550, -0.660093071272717660, -0.660055511256423140, -0.660017949589989830, +-0.659980386273511300, -0.659942821307082040, -0.659905254690795860, -0.659867686424746470, -0.659830116509027560, -0.659792544943733740, -0.659754971728958470, -0.659717396864795800, +-0.659679820351339320, -0.659642242188683610, -0.659604662376922280, -0.659567080916149020, -0.659529497806458310, -0.659491913047943860, -0.659454326640699700, -0.659416738584819310, +-0.659379148880397500, -0.659341557527527770, -0.659303964526304130, -0.659266369876820300, -0.659228773579170870, -0.659191175633449420, -0.659153576039750110, -0.659115974798166530, +-0.659078371908793260, -0.659040767371724120, -0.659003161187053040, -0.658965553354873830, -0.658927943875280970, -0.658890332748368280, -0.658852719974229670, -0.658815105552959080, +-0.658777489484650980, -0.658739871769399080, -0.658702252407297300, -0.658664631398440230, -0.658627008742921460, -0.658589384440835260, -0.658551758492275210, -0.658514130897336130, +-0.658476501656111710, -0.658438870768696120, -0.658401238235182930, -0.658363604055666960, -0.658325968230242030, -0.658288330759002170, -0.658250691642041090, -0.658213050879453700, +-0.658175408471333600, -0.658137764417775050, -0.658100118718871750, -0.658062471374718520, -0.658024822385409050, -0.657987171751037160, -0.657949519471697770, -0.657911865547484490, +-0.657874209978491550, -0.657836552764812790, -0.657798893906543000, -0.657761233403776010, -0.657723571256605850, -0.657685907465126450, -0.657648242029432620, -0.657610574949618280, +-0.657572906225777350, -0.657535235858003890, -0.657497563846392690, -0.657459890191037570, -0.657422214892032670, -0.657384537949471940, -0.657346859363450280, -0.657309179134061390, +-0.657271497261399220, -0.657233813745558670, -0.657196128586633570, -0.657158441784718050, -0.657120753339906270, -0.657083063252292820, -0.657045371521971730, -0.657007678149037270, +-0.656969983133583240, -0.656932286475704560, -0.656894588175495180, -0.656856888233049330, -0.656819186648460950, -0.656781483421824960, -0.656743778553235180, -0.656706072042785970, +-0.656668363890571370, -0.656630654096686080, -0.656592942661224140, -0.656555229584279920, -0.656517514865947230, -0.656479798506321100, -0.656442080505495460, -0.656404360863564350, +-0.656366639580622580, -0.656328916656764290, -0.656291192092083750, -0.656253465886674770, -0.656215738040632490, -0.656178008554050950, -0.656140277427024300, -0.656102544659646680, +-0.656064810252013020, -0.656027074204217240, -0.655989336516353940, -0.655951597188516810, -0.655913856220801120, -0.655876113613300780, -0.655838369366110060, -0.655800623479323220, +-0.655762875953035060, -0.655725126787339740, -0.655687375982331290, -0.655649623538104740, -0.655611869454754140, -0.655574113732373840, -0.655536356371057890, -0.655498597370901440, +-0.655460836731998510, -0.655423074454443370, -0.655385310538330270, -0.655347544983754250, -0.655309777790809460, -0.655272008959590040, -0.655234238490190360, -0.655196466382705460, +-0.655158692637229370, -0.655120917253856460, -0.655083140232680990, -0.655045361573798000, -0.655007581277301630, -0.654969799343285920, -0.654932015771846120, -0.654894230563076270, +-0.654856443717070860, -0.654818655233923910, -0.654780865113730680, -0.654743073356585330, -0.654705279962582320, -0.654667484931815700, -0.654629688264380730, -0.654591889960371540, +-0.654554090019882630, -0.654516288443008240, -0.654478485229843420, -0.654440680380482310, -0.654402873895019500, -0.654365065773549250, -0.654327256016166590, -0.654289444622965900, +-0.654251631594041210, -0.654213816929487770, -0.654176000629399730, -0.654138182693871810, -0.654100363122998020, -0.654062541916873630, -0.654024719075593010, -0.653986894599250410, +-0.653949068487940430, -0.653911240741757990, -0.653873411360797460, -0.653835580345153430, -0.653797747694920160, -0.653759913410192790, -0.653722077491065590, -0.653684239937633250, +-0.653646400749990030, -0.653608559928231080, -0.653570717472450770, -0.653532873382743680, -0.653495027659203980, -0.653457180301927120, -0.653419331311007270, -0.653381480686538780, +-0.653343628428616930, -0.653305774537335960, -0.653267919012790690, -0.653230061855075150, -0.653192203064284830, -0.653154342640513970, -0.653116480583857300, -0.653078616894409160, +-0.653040751572264710, -0.653002884617518430, -0.652965016030264910, -0.652927145810598520, -0.652889273958614620, -0.652851400474407480, -0.652813525358071910, -0.652775648609702160, +-0.652737770229393610, -0.652699890217240620, -0.652662008573337560, -0.652624125297779910, -0.652586240390661930, -0.652548353852078210, -0.652510465682123450, -0.652472575880892800, +-0.652434684448480630, -0.652396791384981860, -0.652358896690490740, -0.652321000365102650, -0.652283102408912070, -0.652245202822013810, -0.652207301604502130, -0.652169398756472620, +-0.652131494278019530, -0.652093588169237790, -0.652055680430221660, -0.652017771061066730, -0.651979860061867370, -0.651941947432717940, -0.651904033173714040, -0.651866117284950140, +-0.651828199766520840, -0.651790280618520730, -0.651752359841045180, -0.651714437434188890, -0.651676513398046330, -0.651638587732712220, -0.651600660438282020, -0.651562731514850220, +-0.651524800962511420, -0.651486868781360420, -0.651448934971492590, -0.651410999533002300, -0.651373062465984590, -0.651335123770533930, -0.651297183446745700, -0.651259241494714590, +-0.651221297914535420, -0.651183352706302570, -0.651145405870111720, -0.651107457406057350, -0.651069507314233960, -0.651031555594737130, -0.650993602247661450, -0.650955647273101850, +-0.650917690671152680, -0.650879732441909660, -0.650841772585467270, -0.650803811101920540, -0.650765847991363830, -0.650727883253892860, -0.650689916889602200, -0.650651948898586800, +-0.650613979280941110, -0.650576008036760970, -0.650538035166140620, -0.650500060669175320, -0.650462084545959440, -0.650424106796588690, -0.650386127421157760, -0.650348146419761020, +-0.650310163792494400, -0.650272179539452270, -0.650234193660729760, -0.650196206156421370, -0.650158217026622910, -0.650120226271428850, -0.650082233890934110, -0.650044239885233630, +-0.650006244254422770, -0.649968246998596340, -0.649930248117849270, -0.649892247612276260, -0.649854245481973010, -0.649816241727034120, -0.649778236347554610, -0.649740229343629180, +-0.649702220715353440, -0.649664210462822190, -0.649626198586130130, -0.649588185085372860, -0.649550169960645190, -0.649512153212042030, -0.649474134839658210, -0.649436114843589430, +-0.649398093223930270, -0.649360069980775890, -0.649322045114220980, -0.649284018624361360, -0.649245990511291620, -0.649207960775106900, -0.649169929415902010, -0.649131896433772560, +-0.649093861828813460, -0.649055825601119630, -0.649017787750786000, -0.648979748277908160, -0.648941707182580930, -0.648903664464899110, -0.648865620124958520, -0.648827574162853860, +-0.648789526578680160, -0.648751477372532470, -0.648713426544506260, -0.648675374094696670, -0.648637320023198520, -0.648599264330106730, -0.648561207015517120, -0.648523148079524490, +-0.648485087522224110, -0.648447025343710570, -0.648408961544079790, -0.648370896123426580, -0.648332829081846200, -0.648294760419433460, -0.648256690136284060, -0.648218618232492940, +-0.648180544708155340, -0.648142469563365960, -0.648104392798220740, -0.648066314412814590, -0.648028234407242330, -0.647990152781599770, -0.647952069535981940, -0.647913984670483780, +-0.647875898185200420, -0.647837810080227670, -0.647799720355660360, -0.647761629011593730, -0.647723536048122720, -0.647685441465343130, -0.647647345263349990, -0.647609247442238580, +-0.647571148002103580, -0.647533046943041150, -0.647494944265145980, -0.647456839968513550, -0.647418734053238690, -0.647380626519417300, -0.647342517367144320, -0.647304406596514670, +-0.647266294207624380, -0.647228180200568380, -0.647190064575441930, -0.647151947332340050, -0.647113828471358570, -0.647075707992592510, -0.647037585896137140, -0.646999462182087480, +-0.646961336850539580, -0.646923209901588250, -0.646885081335328960, -0.646846951151856640, -0.646808819351267220, -0.646770685933655830, -0.646732550899117630, -0.646694414247747760, +-0.646656275979642260, -0.646618136094895930, -0.646579994593604050, -0.646541851475862410, -0.646503706741766270, -0.646465560391410790, -0.646427412424890990, -0.646389262842303140, +-0.646351111643742040, -0.646312958829303290, -0.646274804399081690, -0.646236648353173400, -0.646198490691673570, -0.646160331414677440, -0.646122170522280160, -0.646084008014577770, +-0.646045843891665420, -0.646007678153638460, -0.645969510800591950, -0.645931341832622020, -0.645893171249823710, -0.645854999052292490, -0.645816825240123400, -0.645778649813412600, +-0.645740472772255210, -0.645702294116746290, -0.645664113846981860, -0.645625931963057290, -0.645587748465067830, -0.645549563353108650, -0.645511376627275980, -0.645473188287664760, +-0.645434998334370680, -0.645396806767488670, -0.645358613587114990, -0.645320418793344790, -0.645282222386273640, -0.645244024365996480, -0.645205824732609680, -0.645167623486208260, +-0.645129420626887720, -0.645091216154743410, -0.645053010069871370, -0.645014802372366750, -0.644976593062324800, -0.644938382139841780, -0.644900169605012730, -0.644861955457933230, +-0.644823739698698550, -0.644785522327404940, -0.644747303344147430, -0.644709082749021610, -0.644670860542122860, -0.644632636723547310, -0.644594411293390010, -0.644556184251746880, +-0.644517955598712830, -0.644479725334384250, -0.644441493458856370, -0.644403259972224700, -0.644365024874584580, -0.644326788166032280, -0.644288549846662950, -0.644250309916571950, +-0.644212068375855430, -0.644173825224608860, -0.644135580462927630, -0.644097334090907190, -0.644059086108643710, -0.644020836516232540, -0.643982585313769280, -0.643944332501349190, +-0.643906078079068630, -0.643867822047022860, -0.643829564405307480, -0.643791305154017950, -0.643753044293250420, -0.643714781823100380, -0.643676517743663300, -0.643638252055034550, +-0.643599984757310620, -0.643561715850586640, -0.643523445334958090, -0.643485173210521230, -0.643446899477371440, -0.643408624135604400, -0.643370347185315490, -0.643332068626601080, +-0.643293788459556430, -0.643255506684277330, -0.643217223300859060, -0.643178938309398210, -0.643140651709989910, -0.643102363502729980, -0.643064073687713900, -0.643025782265037930, +-0.642987489234797430, -0.642949194597088320, -0.642910898352005770, -0.642872600499646450, -0.642834301040105530, -0.642795999973478800, -0.642757697299861870, -0.642719393019350990, +-0.642681087132041640, -0.642642779638029180, -0.642604470537410100, -0.642566159830279870, -0.642527847516734310, -0.642489533596868670, -0.642451218070779650, -0.642412900938562510, +-0.642374582200313180, -0.642336261856127020, -0.642297939906100510, -0.642259616350329130, -0.642221291188908800, -0.642182964421934900, -0.642144636049503890, -0.642106306071711260, +-0.642067974488652940, -0.642029641300424280, -0.641991306507121880, -0.641952970108841230, -0.641914632105677780, -0.641876292497728150, -0.641837951285087690, -0.641799608467852440, +-0.641761264046117770, -0.641722918019980380, -0.641684570389535640, -0.641646221154879460, -0.641607870316107330, -0.641569517873315950, -0.641531163826600690, -0.641492808176057580, +-0.641454450921782100, -0.641416092063870850, -0.641377731602419400, -0.641339369537523570, -0.641301005869278960, -0.641262640597782260, -0.641224273723128960, -0.641185905245414520, +-0.641147535164735770, -0.641109163481188070, -0.641070790194867570, -0.641032415305869630, -0.640994038814291070, -0.640955660720227470, -0.640917281023774650, -0.640878899725028320, +-0.640840516824085050, -0.640802132321040440, -0.640763746215990640, -0.640725358509031010, -0.640686969200258360, -0.640648578289768290, -0.640610185777656830, -0.640571791664019450, +-0.640533395948952980, -0.640494998632553100, -0.640456599714915640, -0.640418199196136410, -0.640379797076311870, -0.640341393355537970, -0.640302988033910280, -0.640264581111525400, +-0.640226172588479030, -0.640187762464867300, -0.640149350740785720, -0.640110937416331180, -0.640072522491599290, -0.640034105966686080, -0.639995687841687260, -0.639957268116699620, +-0.639918846791818760, -0.639880423867140840, -0.639841999342761420, -0.639803573218777450, -0.639765145495284400, -0.639726716172378640, -0.639688285250155640, -0.639649852728712330, +-0.639611418608144410, -0.639572982888547580, -0.639534545570018540, -0.639496106652653330, -0.639457666136547640, -0.639419224021797630, -0.639380780308499760, -0.639342334996749970, +-0.639303888086644400, -0.639265439578278750, -0.639226989471749830, -0.639188537767153450, -0.639150084464585650, -0.639111629564142470, -0.639073173065920370, -0.639034714970015410, +-0.638996255276523710, -0.638957793985540980, -0.638919331097164140, -0.638880866611488910, -0.638842400528611190, -0.638803932848627910, -0.638765463571634660, -0.638726992697727810, +-0.638688520227003180, -0.638650046159557560, -0.638611570495486780, -0.638573093234887090, -0.638534614377854410, -0.638496133924485450, -0.638457651874876130, -0.638419168229122810, +-0.638380682987321090, -0.638342196149568110, -0.638303707715959570, -0.638265217686591720, -0.638226726061560610, -0.638188232840962930, -0.638149738024894720, -0.638111241613451790, +-0.638072743606731160, -0.638034244004828550, -0.637995742807840440, -0.637957240015862630, -0.637918735628992040, -0.637880229647324490, -0.637841722070956570, -0.637803212899983870, +-0.637764702134503540, -0.637726189774611370, -0.637687675820403870, -0.637649160271976710, -0.637610643129427060, -0.637572124392850830, -0.637533604062344160, -0.637495082138003210, +-0.637456558619924900, -0.637418033508205250, -0.637379506802940420, -0.637340978504226550, -0.637302448612160570, -0.637263917126838500, -0.637225384048356160, -0.637186849376810800, +-0.637148313112298360, -0.637109775254915080, -0.637071235804757000, -0.637032694761921260, -0.636994152126503680, -0.636955607898600730, -0.636917062078308450, -0.636878514665723870, +-0.636839965660943030, -0.636801415064062180, -0.636762862875177580, -0.636724309094386040, -0.636685753721783820, -0.636647196757467170, -0.636608638201532130, -0.636570078054075950, +-0.636531516315194560, -0.636492952984983980, -0.636454388063541380, -0.636415821550962770, -0.636377253447344640, -0.636338683752783130, -0.636300112467375170, -0.636261539591216900, +-0.636222965124404790, -0.636184389067034890, -0.636145811419204450, -0.636107232181009510, -0.636068651352546420, -0.636030068933911340, -0.635991484925201410, -0.635952899326512890, +-0.635914312137942030, -0.635875723359584980, -0.635837132991539100, -0.635798541033900320, -0.635759947486764900, -0.635721352350229860, -0.635682755624391470, -0.635644157309346200, +-0.635605557405190200, -0.635566955912020730, -0.635528352829933810, -0.635489748159025920, -0.635451141899393450, -0.635412534051133400, -0.635373924614342060, -0.635335313589115880, +-0.635296700975551020, -0.635258086773744850, -0.635219470983793390, -0.635180853605793240, -0.635142234639840650, -0.635103614086032890, -0.635064991944465970, -0.635026368215236610, +-0.634987742898441070, -0.634949115994176360, -0.634910487502538980, -0.634871857423625060, -0.634833225757531760, -0.634794592504355440, -0.634755957664192570, -0.634717321237139530, +-0.634678683223293460, -0.634640043622750840, -0.634601402435607920, -0.634562759661961300, -0.634524115301908000, -0.634485469355544510, -0.634446821822967300, -0.634408172704272740, +-0.634369521999557980, -0.634330869708919500, -0.634292215832453880, -0.634253560370257260, -0.634214903322427250, -0.634176244689059860, -0.634137584470251590, -0.634098922666099570, +-0.634060259276700400, -0.634021594302150440, -0.633982927742546280, -0.633944259597985060, -0.633905589868563270, -0.633866918554377380, -0.633828245655523980, -0.633789571172100220, +-0.633750895104202570, -0.633712217451927740, -0.633673538215371870, -0.633634857394632660, -0.633596174989806250, -0.633557491000989350, -0.633518805428278430, -0.633480118271770860, +-0.633441429531562910, -0.633402739207751140, -0.633364047300432830, -0.633325353809704340, -0.633286658735662590, -0.633247962078403730, -0.633209263838025340, -0.633170564014623900, +-0.633131862608295900, -0.633093159619138040, -0.633054455047247440, -0.633015748892720830, -0.632977041155654900, -0.632938331836145900, -0.632899620934291420, -0.632860908450187940, +-0.632822194383932280, -0.632783478735620690, -0.632744761505350750, -0.632706042693218840, -0.632667322299321540, -0.632628600323756340, -0.632589876766619600, -0.632551151628008120, +-0.632512424908018400, -0.632473696606748010, -0.632434966724293450, -0.632396235260751390, -0.632357502216218450, -0.632318767590791970, -0.632280031384568670, -0.632241293597645360, +-0.632202554230118400, -0.632163813282085370, -0.632125070753642880, -0.632086326644887620, -0.632047580955916290, -0.632008833686826250, -0.631970084837714220, -0.631931334408676880, +-0.631892582399810940, -0.631853828811213880, -0.631815073642982280, -0.631776316895212630, -0.631737558568002510, -0.631698798661448510, -0.631660037175647450, -0.631621274110696020, +-0.631582509466691700, -0.631543743243731190, -0.631504975441911200, -0.631466206061328530, -0.631427435102080660, -0.631388662564264180, -0.631349888447976130, -0.631311112753312980, +-0.631272335480372320, -0.631233556629250850, -0.631194776200045490, -0.631155994192852840, -0.631117210607770600, -0.631078425444895340, -0.631039638704323560, -0.631000850386153170, +-0.630962060490480540, -0.630923269017402810, -0.630884475967016580, -0.630845681339419540, -0.630806885134708170, -0.630768087352979730, -0.630729287994330590, -0.630690487058858660, +-0.630651684546660540, -0.630612880457833150, -0.630574074792473180, -0.630535267550678460, -0.630496458732545560, -0.630457648338171420, -0.630418836367652840, -0.630380022821087630, +-0.630341207698572270, -0.630302391000203580, -0.630263572726079250, -0.630224752876295870, -0.630185931450950810, -0.630147108450140440, -0.630108283873962670, -0.630069457722514210, +-0.630030629995892100, -0.629991800694193140, -0.629952969817514920, -0.629914137365954250, -0.629875303339608280, -0.629836467738573820, -0.629797630562948350, -0.629758791812828900, +-0.629719951488312500, -0.629681109589495860, -0.629642266116476780, -0.629603421069352080, -0.629564574448218670, -0.629525726253173600, -0.629486876484314560, -0.629448025141738370, +-0.629409172225541710, -0.629370317735822420, -0.629331461672677390, -0.629292604036203680, -0.629253744826498210, -0.629214884043658660, -0.629176021687781860, -0.629137157758965060, +-0.629098292257304960, -0.629059425182899590, -0.629020556535845540, -0.628981686316240070, -0.628942814524180220, -0.628903941159763560, -0.628865066223087020, -0.628826189714247860, +-0.628787311633342890, -0.628748431980469920, -0.628709550755725880, -0.628670667959207670, -0.628631783591013130, -0.628592897651239160, -0.628554010139982910, -0.628515121057341310, +-0.628476230403412270, -0.628437338178292610, -0.628398444382079590, -0.628359549014870120, -0.628320652076762130, -0.628281753567852540, -0.628242853488238500, -0.628203951838017030, +-0.628165048617286060, -0.628126143826142400, -0.628087237464683420, -0.628048329533006040, -0.628009420031208080, -0.627970508959386660, -0.627931596317638620, -0.627892682106061860, +-0.627853766324753430, -0.627814848973810570, -0.627775930053330320, -0.627737009563410500, -0.627698087504148240, -0.627659163875640690, -0.627620238677984890, -0.627581311911278860, +-0.627542383575619530, -0.627503453671104270, -0.627464522197830110, -0.627425589155894860, -0.627386654545395660, -0.627347718366429890, -0.627308780619094340, -0.627269841303487290, +-0.627230900419705640, -0.627191957967846440, -0.627153013948007600, -0.627114068360286270, -0.627075121204779710, -0.627036172481585050, -0.626997222190800340, -0.626958270332522490, +-0.626919316906848990, -0.626880361913876860, -0.626841405353704250, -0.626802447226428080, -0.626763487532145720, -0.626724526270954320, -0.626685563442952010, -0.626646599048235720, +-0.626607633086903040, -0.626568665559050890, -0.626529696464777300, -0.626490725804179640, -0.626451753577355050, -0.626412779784400800, -0.626373804425414900, -0.626334827500494520, +-0.626295849009736670, -0.626256868953239620, -0.626217887331100400, -0.626178904143416370, -0.626139919390284790, -0.626100933071803810, -0.626061945188070460, -0.626022955739182210, +-0.625983964725236210, -0.625944972146330710, -0.625905978002562760, -0.625866982294029820, -0.625827985020829150, -0.625788986183058780, -0.625749985780816090, -0.625710983814198320, +-0.625671980283302730, -0.625632975188227580, -0.625593968529070010, -0.625554960305927170, -0.625515950518897190, -0.625476939168077450, -0.625437926253565310, -0.625398911775458030, +-0.625359895733853750, -0.625320878128849730, -0.625281858960543560, -0.625242838229032480, -0.625203815934414540, -0.625164792076787100, -0.625125766656247640, -0.625086739672893410, +-0.625047711126822780, -0.625008681018132780, -0.624969649346921120, -0.624930616113284930, -0.624891581317322590, -0.624852544959131340, -0.624813507038808340, -0.624774467556451940, +-0.624735426512159300, -0.624696383906028220, -0.624657339738155740, -0.624618294008640220, -0.624579246717579030, -0.624540197865069760, -0.624501147451209550, -0.624462095476096880, +-0.624423041939829000, -0.624383986842503510, -0.624344930184217660, -0.624305871965069810, -0.624266812185157340, -0.624227750844577820, -0.624188687943428630, -0.624149623481807910, +-0.624110557459813250, -0.624071489877542240, -0.624032420735092020, -0.623993350032561180, -0.623954277770046970, -0.623915203947646770, -0.623876128565458820, -0.623837051623580610, +-0.623797973122109720, -0.623758893061143520, -0.623719811440780480, -0.623680728261117980, -0.623641643522253600, -0.623602557224284700, -0.623563469367309780, -0.623524379951426290, +-0.623485288976731720, -0.623446196443323660, -0.623407102351300480, -0.623368006700759420, -0.623328909491798420, -0.623289810724514840, -0.623250710399007040, -0.623211608515372490, +-0.623172505073708580, -0.623133400074113660, -0.623094293516685330, -0.623055185401521270, -0.623016075728718870, -0.622976964498376580, -0.622937851710591910, -0.622898737365462640, +-0.622859621463086150, -0.622820504003561040, -0.622781384986984540, -0.622742264413454700, -0.622703142283068780, -0.622664018595925350, -0.622624893352121900, -0.622585766551756240, +-0.622546638194925730, -0.622507508281729070, -0.622468376812263640, -0.622429243786626780, -0.622390109204917330, -0.622350973067232530, -0.622311835373670300, -0.622272696124328120, +-0.622233555319304580, -0.622194412958697150, -0.622155269042603650, -0.622116123571121670, -0.622076976544349680, -0.622037827962385270, -0.621998677825326250, -0.621959526133270320, +-0.621920372886315740, -0.621881218084560430, -0.621842061728101970, -0.621802903817037960, -0.621763744351467080, -0.621724583331486840, -0.621685420757194800, -0.621646256628689550, +-0.621607090946068700, -0.621567923709430150, -0.621528754918871380, -0.621489584574490990, -0.621450412676386790, -0.621411239224656460, -0.621372064219397720, -0.621332887660709150, +-0.621293709548688340, -0.621254529883433330, -0.621215348665041580, -0.621176165893611910, -0.621136981569241690, -0.621097795692029160, -0.621058608262071710, -0.621019419279468020, +-0.620980228744315910, -0.620941036656713190, -0.620901843016757440, -0.620862647824547590, -0.620823451080181000, -0.620784252783755490, -0.620745052935369630, -0.620705851535121140, +-0.620666648583108050, -0.620627444079428050, -0.620588238024179730, -0.620549030417460790, -0.620509821259369380, -0.620470610550002970, -0.620431398289460480, -0.620392184477839390, +-0.620352969115237850, -0.620313752201753550, -0.620274533737485310, -0.620235313722530600, -0.620196092156987680, -0.620156869040954130, -0.620117644374528880, -0.620078418157809400, +-0.620039190390893500, -0.619999961073880110, -0.619960730206866710, -0.619921497789951540, -0.619882263823232190, -0.619843028306807600, -0.619803791240775450, -0.619764552625233780, +-0.619725312460280400, -0.619686070746014120, -0.619646827482532640, -0.619607582669934100, -0.619568336308316200, -0.619529088397777870, -0.619489838938416800, -0.619450587930331140, +-0.619411335373618700, -0.619372081268378170, -0.619332825614707480, -0.619293568412704440, -0.619254309662467750, -0.619215049364095330, -0.619175787517685210, -0.619136524123335420, +-0.619097259181144550, -0.619057992691210530, -0.619018724653631610, -0.618979455068505490, -0.618940183935931090, -0.618900911256006210, -0.618861637028829010, -0.618822361254497410, +-0.618783083933110320, -0.618743805064765450, -0.618704524649561050, -0.618665242687595040, -0.618625959178966230, -0.618586674123772550, -0.618547387522112140, -0.618508099374083020, +-0.618468809679783900, -0.618429518439312820, -0.618390225652767580, -0.618350931320247100, -0.618311635441849190, -0.618272338017672340, -0.618233039047814240, -0.618193738532373920, +-0.618154436471449300, -0.618115132865138530, -0.618075827713539530, -0.618036521016751440, -0.617997212774871960, -0.617957902987999460, -0.617918591656231860, -0.617879278779668080, +-0.617839964358406160, -0.617800648392544340, -0.617761330882180550, -0.617722011827413710, -0.617682691228341850, -0.617643369085063010, -0.617604045397675990, -0.617564720166278950, +-0.617525393390970010, -0.617486065071847330, -0.617446735209009830, -0.617407403802555430, -0.617368070852582610, -0.617328736359189170, -0.617289400322474260, -0.617250062742535910, +-0.617210723619472380, -0.617171382953381590, -0.617132040744362790, -0.617092696992513900, -0.617053351697933180, -0.617014004860718890, -0.616974656480969830, -0.616935306558784150, +-0.616895955094259760, -0.616856602087495930, -0.616817247538590570, -0.616777891447642170, -0.616738533814748520, -0.616699174640009010, -0.616659813923521540, -0.616620451665384590, +-0.616581087865696100, -0.616541722524555300, -0.616502355642060130, -0.616462987218309060, -0.616423617253400220, -0.616384245747432670, -0.616344872700504420, -0.616305498112714070, +-0.616266121984159640, -0.616226744314940290, -0.616187365105154040, -0.616147984354899370, -0.616108602064274310, -0.616069218233378240, -0.616029832862309060, -0.615990445951164920, +-0.615951057500044970, -0.615911667509047470, -0.615872275978270770, -0.615832882907813130, -0.615793488297773470, -0.615754092148250170, -0.615714694459341680, -0.615675295231146060, +-0.615635894463762550, -0.615596492157289290, -0.615557088311824760, -0.615517682927467220, -0.615478276004315820, -0.615438867542468680, -0.615399457542024520, -0.615360046003081250, +-0.615320632925738130, -0.615281218310093530, -0.615241802156245580, -0.615202384464293430, -0.615162965234335330, -0.615123544466469770, -0.615084122160795000, -0.615044698317410380, +-0.615005272936413940, -0.614965846017904270, -0.614926417561979740, -0.614886987568739380, -0.614847556038281670, -0.614808122970704970, -0.614768688366107760, -0.614729252224589070, +-0.614689814546247270, -0.614650375331180940, -0.614610934579488340, -0.614571492291268730, -0.614532048466620350, -0.614492603105641580, -0.614453156208431550, -0.614413707775088750, +-0.614374257805711640, -0.614334806300398490, -0.614295353259248670, -0.614255898682360520, -0.614216442569832650, -0.614176984921763310, -0.614137525738251750, -0.614098065019396460, +-0.614058602765296000, -0.614019138976048760, -0.613979673651753880, -0.613940206792509930, -0.613900738398415410, -0.613861268469568680, -0.613821797006069200, -0.613782324008015130, +-0.613742849475504950, -0.613703373408638010, -0.613663895807512570, -0.613624416672227450, -0.613584936002881000, -0.613545453799572480, -0.613505970062400370, -0.613466484791463260, +-0.613426997986859620, -0.613387509648688820, -0.613348019777049340, -0.613308528372039750, -0.613269035433758440, -0.613229540962304980, -0.613190044957777620, -0.613150547420275080, +-0.613111048349895940, -0.613071547746739440, -0.613032045610904190, -0.612992541942488760, -0.612953036741591520, -0.612913530008312170, -0.612874021742748960, -0.612834511945000380, +-0.612795000615165790, -0.612755487753343760, -0.612715973359633010, -0.612676457434131900, -0.612636939976940130, -0.612597420988155950, -0.612557900467878170, -0.612518378416205380, +-0.612478854833236940, -0.612439329719071330, -0.612399803073807370, -0.612360274897543630, -0.612320745190379600, -0.612281213952413640, -0.612241681183744670, -0.612202146884471050, +-0.612162611054692500, -0.612123073694507470, -0.612083534804014340, -0.612043994383312700, -0.612004452432501120, -0.611964908951678320, -0.611925363940942990, -0.611885817400394600, +-0.611846269330131640, -0.611806719730253020, -0.611767168600857230, -0.611727615942043950, -0.611688061753911550, -0.611648506036558960, -0.611608948790084870, -0.611569390014588650, +-0.611529829710169000, -0.611490267876924840, -0.611450704514954540, -0.611411139624357890, -0.611371573205233390, -0.611332005257679610, -0.611292435781796150, -0.611252864777681590, +-0.611213292245434970, -0.611173718185154650, -0.611134142596940430, -0.611094565480890810, -0.611054986837104910, -0.611015406665681100, -0.610975824966719090, -0.610936241740317580, +-0.610896656986575360, -0.610857070705591250, -0.610817482897464850, -0.610777893562294620, -0.610738302700179700, -0.610698710311218700, -0.610659116395511290, -0.610619520953156080, +-0.610579923984252090, -0.610540325488897920, -0.610500725467193250, -0.610461123919236790, -0.610421520845127130, -0.610381916244964070, -0.610342310118846210, -0.610302702466872570, +-0.610263093289141860, -0.610223482585753650, -0.610183870356806880, -0.610144256602400350, -0.610104641322632870, -0.610065024517604030, -0.610025406187412740, -0.609985786332157940, +-0.609946164951938320, -0.609906542046853570, -0.609866917617002510, -0.609827291662484170, -0.609787664183397250, -0.609748035179841440, -0.609708404651915670, -0.609668772599718410, +-0.609629139023349700, -0.609589503922908120, -0.609549867298492700, -0.609510229150202250, -0.609470589478136700, -0.609430948282394520, -0.609391305563075080, -0.609351661320277070, +-0.609312015554100080, -0.609272368264643260, -0.609232719452005410, -0.609193069116285350, -0.609153417257583100, -0.609113763875997250, -0.609074108971626950, -0.609034452544571110, +-0.608994794594929440, -0.608955135122800750, -0.608915474128283950, -0.608875811611478750, -0.608836147572484050, -0.608796482011398910, -0.608756814928322340, -0.608717146323354050, +-0.608677476196592850, -0.608637804548137980, -0.608598131378088270, -0.608558456686543510, -0.608518780473602640, -0.608479102739364900, -0.608439423483928990, -0.608399742707394830, +-0.608360060409861350, -0.608320376591427790, -0.608280691252192860, -0.608241004392256590, -0.608201316011717790, -0.608161626110675260, -0.608121934689229150, -0.608082241747478160, +-0.608042547285521540, -0.608002851303458210, -0.607963153801388100, -0.607923454779410120, -0.607883754237623530, -0.607844052176127140, -0.607804348595021080, -0.607764643494404070, +-0.607724936874375450, -0.607685228735034170, -0.607645519076480120, -0.607605807898812240, -0.607566095202130010, -0.607526380986532000, -0.607486665252118470, -0.607446947998988350, +-0.607407229227240770, -0.607367508936974780, -0.607327787128290390, -0.607288063801286530, -0.607248338956062120, -0.607208612592717190, -0.607168884711350780, -0.607129155312062130, +-0.607089424394950280, -0.607049691960115270, -0.607009958007655890, -0.606970222537671740, -0.606930485550261630, -0.606890747045525700, -0.606851007023562870, -0.606811265484472510, +-0.606771522428353640, -0.606731777855306300, -0.606692031765429520, -0.606652284158822660, -0.606612535035584770, -0.606572784395815860, -0.606533032239615080, -0.606493278567081240, +-0.606453523378314600, -0.606413766673414180, -0.606374008452479350, -0.606334248715609150, -0.606294487462903600, -0.606254724694461840, -0.606214960410383360, -0.606175194610767080, +-0.606135427295713240, -0.606095658465320760, -0.606055888119689130, -0.606016116258917380, -0.605976342883105760, -0.605936567992353290, -0.605896791586759350, -0.605857013666423080, +-0.605817234231444730, -0.605777453281923120, -0.605737670817957710, -0.605697886839648310, -0.605658101347094300, -0.605618314340395040, -0.605578525819649550, -0.605538735784958200, +-0.605498944236420030, -0.605459151174134400, -0.605419356598200560, -0.605379560508718770, -0.605339762905787950, -0.605299963789507790, -0.605260163159977330, -0.605220361017296930, +-0.605180557361565510, -0.605140752192882770, -0.605100945511347740, -0.605061137317060680, -0.605021327610120840, -0.604981516390627690, -0.604941703658680390, -0.604901889414379060, +-0.604862073657823180, -0.604822256389111690, -0.604782437608344830, -0.604742617315621960, -0.604702795511042560, -0.604662972194705770, -0.604623147366711970, -0.604583321027160280, +-0.604543493176150300, -0.604503663813781180, -0.604463832940153270, -0.604424000555365830, -0.604384166659518330, -0.604344331252710030, -0.604304494335041410, -0.604264655906611380, +-0.604224815967519760, -0.604184974517865790, -0.604145131557749740, -0.604105287087270850, -0.604065441106528380, -0.604025593615622690, -0.603985744614652930, -0.603945894103718910, +-0.603906042082919760, -0.603866188552355740, -0.603826333512126450, -0.603786476962331230, -0.603746618903069470, -0.603706759334441510, -0.603666898256546620, -0.603627035669484500, +-0.603587171573354510, -0.603547305968256900, -0.603507438854291030, -0.603467570231556620, -0.603427700100152790, -0.603387828460180130, -0.603347955311737900, -0.603308080654925470, +-0.603268204489843200, -0.603228326816590330, -0.603188447635266690, -0.603148566945971630, -0.603108684748805410, -0.603068801043867510, -0.603028915831257620, -0.602989029111075100, +-0.602949140883420330, -0.602909251148392780, -0.602869359906092030, -0.602829467156617560, -0.602789572900069740, -0.602749677136548030, -0.602709779866152150, -0.602669881088981450, +-0.602629980805136300, -0.602590079014716280, -0.602550175717820770, -0.602510270914550120, -0.602470364605003810, -0.602430456789281530, -0.602390547467482770, -0.602350636639708000, +-0.602310724306056700, -0.602270810466628450, -0.602230895121522950, -0.602190978270840560, -0.602151059914680650, -0.602111140053143150, -0.602071218686327400, -0.602031295814334010, +-0.601991371437262330, -0.601951445555212290, -0.601911518168283250, -0.601871589276575800, -0.601831658880189300, -0.601791726979223670, -0.601751793573778390, -0.601711858663954050, +-0.601671922249849890, -0.601631984331565730, -0.601592044909201930, -0.601552103982857970, -0.601512161552633760, -0.601472217618628790, -0.601432272180943640, -0.601392325239677890, +-0.601352376794931250, -0.601312426846803310, -0.601272475395394630, -0.601232522440804830, -0.601192567983133700, -0.601152612022480830, -0.601112654558946690, -0.601072695592630990, +-0.601032735123633530, -0.600992773152053910, -0.600952809677992580, -0.600912844701549380, -0.600872878222823650, -0.600832910241916100, -0.600792940758926310, -0.600752969773954090, +-0.600712997287099150, -0.600673023298462060, -0.600633047808142310, -0.600593070816240030, -0.600553092322854810, -0.600513112328087020, -0.600473130832036570, -0.600433147834803280, +-0.600393163336486730, -0.600353177337187740, -0.600313189837005660, -0.600273200836040740, -0.600233210334392360, -0.600193218332161330, -0.600153224829447220, -0.600113229826349740, +-0.600073233322969580, -0.600033235319406330, -0.599993235815759920, -0.599953234812130140, -0.599913232308617590, -0.599873228305321970, -0.599833222802343300, -0.599793215799781180, +-0.599753207297736290, -0.599713197296308560, -0.599673185795597700, -0.599633172795703610, -0.599593158296726880, -0.599553142298767330, -0.599513124801924870, -0.599473105806299200, +-0.599433085311991240, -0.599393063319100470, -0.599353039827727030, -0.599313014837970730, -0.599272988349932150, -0.599232960363711210, -0.599192930879407390, -0.599152899897121730, +-0.599112867416953690, -0.599072833439003530, -0.599032797963370940, -0.598992760990156750, -0.598952722519460630, -0.598912682551382640, -0.598872641086022670, -0.598832598123481440, +-0.598792553663858750, -0.598752507707254630, -0.598712460253768790, -0.598672411303502350, -0.598632360856554690, -0.598592308913026280, -0.598552255473016710, -0.598512200536626790, +-0.598472144103956440, -0.598432086175105350, -0.598392026750174330, -0.598351965829263310, -0.598311903412472420, -0.598271839499901370, -0.598231774091651070, -0.598191707187821330, +-0.598151638788512300, -0.598111568893823890, -0.598071497503856800, -0.598031424618711060, -0.597991350238486710, -0.597951274363283660, -0.597911196993202830, -0.597871118128343930, +-0.597831037768807310, -0.597790955914692670, -0.597750872566101040, -0.597710787723132130, -0.597670701385885960, -0.597630613554463450, -0.597590524228964410, -0.597550433409488990, +-0.597510341096137100, -0.597470247289009770, -0.597430151988206810, -0.597390055193828480, -0.597349956905974700, -0.597309857124746270, -0.597269755850243330, -0.597229653082565930, +-0.597189548821814080, -0.597149443068088590, -0.597109335821489620, -0.597069227082117290, -0.597029116850071540, -0.596989005125453280, -0.596948891908362530, -0.596908777198899230, +-0.596868660997164400, -0.596828543303257850, -0.596788424117279950, -0.596748303439330610, -0.596708181269510970, -0.596668057607920740, -0.596627932454660390, -0.596587805809829950, +-0.596547677673530230, -0.596507548045861480, -0.596467416926923730, -0.596427284316817020, -0.596387150215642590, -0.596347014623500260, -0.596306877540490390, -0.596266738966712890, +-0.596226598902269030, -0.596186457347258610, -0.596146314301782000, -0.596106169765939330, -0.596066023739831530, -0.596025876223558740, -0.595985727217220760, -0.595945576720918970, +-0.595905424734753160, -0.595865271258823830, -0.595825116293230980, -0.595784959838075670, -0.595744801893457910, -0.595704642459478180, -0.595664481536236520, -0.595624319123833960, +-0.595584155222370630, -0.595543989831947010, -0.595503822952662910, -0.595463654584619690, -0.595423484727917280, -0.595383313382656150, -0.595343140548936440, -0.595302966226859190, +-0.595262790416524630, -0.595222613118032600, -0.595182434331484430, -0.595142254056980180, -0.595102072294620310, -0.595061889044504970, -0.595021704306735180, -0.594981518081411090, +-0.594941330368633280, -0.594901141168501790, -0.594860950481117760, -0.594820758306581430, -0.594780564644993180, -0.594740369496453040, -0.594700172861062470, -0.594659974738921400, +-0.594619775130130420, -0.594579574034789670, -0.594539371453000290, -0.594499167384862530, -0.594458961830476530, -0.594418754789943330, -0.594378546263363390, -0.594338336250836980, +-0.594298124752464460, -0.594257911768346970, -0.594217697298584650, -0.594177481343278190, -0.594137263902527520, -0.594097044976434230, -0.594056824565098120, -0.594016602668620110, +-0.593976379287100120, -0.593936154420639630, -0.593895928069338770, -0.593855700233298030, -0.593815470912617660, -0.593775240107399020, -0.593735007817742240, -0.593694774043748040, +-0.593654538785516440, -0.593614302043148910, -0.593574063816745600, -0.593533824106406760, -0.593493582912233750, -0.593453340234326720, -0.593413096072786360, -0.593372850427712930, +-0.593332603299207780, -0.593292354687371070, -0.593252104592303490, -0.593211853014105280, -0.593171599952877720, -0.593131345408721260, -0.593091089381736380, -0.593050831872023450, +-0.593010572879683840, -0.592970312404817790, -0.592930050447525890, -0.592889787007908510, -0.592849522086067120, -0.592809255682101850, -0.592768987796113090, -0.592728718428202180, +-0.592688447578469500, -0.592648175247015740, -0.592607901433941150, -0.592567626139347210, -0.592527349363334180, -0.592487071106002740, -0.592446791367453260, -0.592406510147787220, +-0.592366227447104880, -0.592325943265506920, -0.592285657603093820, -0.592245370459966840, -0.592205081836226550, -0.592164791731973450, -0.592124500147308110, -0.592084207082331890, +-0.592043912537145060, -0.592003616511848070, -0.591963319006542530, -0.591923020021328570, -0.591882719556307110, -0.591842417611578520, -0.591802114187244150, -0.591761809283404610, +-0.591721502900160460, -0.591681195037612300, -0.591640885695861370, -0.591600574875008390, -0.591560262575153820, -0.591519948796398350, -0.591479633538843250, -0.591439316802589210, +-0.591398998587736810, -0.591358678894386540, -0.591318357722639850, -0.591278035072597350, -0.591237710944359510, -0.591197385338027570, -0.591157058253702240, -0.591116729691484320, +-0.591076399651474180, -0.591036068133773410, -0.590995735138482360, -0.590955400665702070, -0.590915064715532900, -0.590874727288076440, -0.590834388383433160, -0.590794048001703990, +-0.590753706142989170, -0.590713362807390620, -0.590673017995008490, -0.590632671705943910, -0.590592323940297260, -0.590551974698170220, -0.590511623979663170, -0.590471271784877130, +-0.590430918113912570, -0.590390562966870980, -0.590350206343853050, -0.590309848244959250, -0.590269488670291160, -0.590229127619949280, -0.590188765094034730, -0.590148401092647770, +-0.590108035615890200, -0.590067668663862620, -0.590027300236665830, -0.589986930334400420, -0.589946558957167970, -0.589906186105069290, -0.589865811778204960, -0.589825435976675800, +-0.589785058700583510, -0.589744679950028550, -0.589704299725111740, -0.589663918025933990, -0.589623534852596660, -0.589583150205200580, -0.589542764083846320, -0.589502376488635460, +-0.589461987419668600, -0.589421596877046870, -0.589381204860870760, -0.589340811371241950, -0.589300416408261140, -0.589260019972029260, -0.589219622062647000, -0.589179222680216050, +-0.589138821824837010, -0.589098419496610900, -0.589058015695638430, -0.589017610422021280, -0.588977203675860150, -0.588936795457255970, -0.588896385766309430, -0.588855974603122220, +-0.588815561967795160, -0.588775147860428840, -0.588734732281124940, -0.588694315229984280, -0.588653896707107770, -0.588613476712596230, -0.588573055246551350, -0.588532632309073820, +-0.588492207900264690, -0.588451782020224630, -0.588411354669055590, -0.588370925846858130, -0.588330495553733290, -0.588290063789781880, -0.588249630555105710, -0.588209195849805470, +-0.588168759673982190, -0.588128322027736680, -0.588087882911170650, -0.588047442324384990, -0.588007000267480760, -0.587966556740558640, -0.587926111743720450, -0.587885665277066980, +-0.587845217340699060, -0.587804767934718360, -0.587764317059225830, -0.587723864714322360, -0.587683410900109000, -0.587642955616687450, -0.587602498864158500, -0.587562040642623300, +-0.587521580952182650, -0.587481119792938490, -0.587440657164991390, -0.587400193068442710, -0.587359727503393160, -0.587319260469944760, -0.587278791968198100, -0.587238321998254430, +-0.587197850560214670, -0.587157377654180630, -0.587116903280253120, -0.587076427438533060, -0.587035950129122240, -0.586995471352121490, -0.586954991107632160, -0.586914509395754960, +-0.586874026216591790, -0.586833541570243590, -0.586793055456811600, -0.586752567876396510, -0.586712078829100480, -0.586671588315024200, -0.586631096334268910, -0.586590602886935540, +-0.586550107973126010, -0.586509611592941240, -0.586469113746482470, -0.586428614433850410, -0.586388113655147310, -0.586347611410473980, -0.586307107699931110, -0.586266602523620950, +-0.586226095881644200, -0.586185587774102230, -0.586145078201095960, -0.586104567162727300, -0.586064054659097280, -0.586023540690307150, -0.585983025256457730, -0.585942508357651160, +-0.585901989993988240, -0.585861470165570440, -0.585820948872498580, -0.585780426114874690, -0.585739901892799790, -0.585699376206375020, -0.585658849055701540, -0.585618320440881250, +-0.585577790362015180, -0.585537258819204260, -0.585496725812550630, -0.585456191342155100, -0.585415655408119130, -0.585375118010543650, -0.585334579149530800, -0.585294038825181380, +-0.585253497037596990, -0.585212953786878430, -0.585172409073127840, -0.585131862896446140, -0.585091315256934920, -0.585050766154694980, -0.585010215589828570, -0.584969663562436510, +-0.584929110072620380, -0.584888555120481100, -0.584847998706120810, -0.584807440829640420, -0.584766881491141530, -0.584726320690725050, -0.584685758428493130, -0.584645194704546790, +-0.584604629518987170, -0.584564062871916200, -0.584523494763435240, -0.584482925193645420, -0.584442354162648000, -0.584401781670545020, -0.584361207717437600, -0.584320632303427120, +-0.584280055428614720, -0.584239477093102530, -0.584198897296991700, -0.584158316040383600, -0.584117733323379350, -0.584077149146081110, -0.584036563508590010, -0.583995976411007530, +-0.583955387853434700, -0.583914797835973780, -0.583874206358725890, -0.583833613421792070, -0.583793019025274700, -0.583752423169274670, -0.583711825853893580, -0.583671227079232580, +-0.583630626845393910, -0.583590025152478600, -0.583549422000588350, -0.583508817389824070, -0.583468211320288140, -0.583427603792081690, -0.583386994805306200, -0.583346384360062920, +-0.583305772456453990, -0.583265159094580650, -0.583224544274544400, -0.583183927996446470, -0.583143310260389120, -0.583102691066473390, -0.583062070414800630, -0.583021448305472980, +-0.582980824738591810, -0.582940199714258480, -0.582899573232574350, -0.582858945293641680, -0.582818315897561610, -0.582777685044435720, -0.582737052734365270, -0.582696418967452610, +-0.582655783743798890, -0.582615147063505700, -0.582574508926674170, -0.582533869333406900, -0.582493228283804900, -0.582452585777969770, -0.582411941816002860, -0.582371296398006440, +-0.582330649524081760, -0.582290001194330500, -0.582249351408853810, -0.582208700167754170, -0.582168047471132820, -0.582127393319090910, -0.582086737711730920, -0.582046080649154090, +-0.582005422131462000, -0.581964762158756030, -0.581924100731138540, -0.581883437848710770, -0.581842773511574430, -0.581802107719830760, -0.581761440473582140, -0.581720771772930020, +-0.581680101617975900, -0.581639430008821230, -0.581598756945568280, -0.581558082428318520, -0.581517406457173420, -0.581476729032234570, -0.581436050153604220, -0.581395369821383730, +-0.581354688035674470, -0.581314004796578910, -0.581273320104198190, -0.581232633958634230, -0.581191946359988390, -0.581151257308363030, -0.581110566803859530, -0.581069874846579570, +-0.581029181436624520, -0.580988486574096960, -0.580947790259098150, -0.580907092491729890, -0.580866393272093550, -0.580825692600291490, -0.580784990476425290, -0.580744286900596540, +-0.580703581872906830, -0.580662875393458400, -0.580622167462352850, -0.580581458079691530, -0.580540747245576920, -0.580500034960110490, -0.580459321223393830, -0.580418606035528640, +-0.580377889396617270, -0.580337171306761100, -0.580296451766062040, -0.580255730774621560, -0.580215008332542030, -0.580174284439925030, -0.580133559096872250, -0.580092832303485300, +-0.580052104059866620, -0.580011374366117600, -0.579970643222340150, -0.579929910628635860, -0.579889176585107080, -0.579848441091855290, -0.579807704148982080, -0.579766965756590040, +-0.579726225914780510, -0.579685484623655430, -0.579644741883316270, -0.579603997693865610, -0.579563252055405040, -0.579522504968036260, -0.579481756431860840, -0.579441006446981490, +-0.579400255013499570, -0.579359502131516990, -0.579318747801135240, -0.579277992022457110, -0.579237234795583980, -0.579196476120617640, -0.579155715997659910, -0.579114954426813160, +-0.579074191408178950, -0.579033426941859440, -0.578992661027955880, -0.578951893666571070, -0.578911124857806490, -0.578870354601763730, -0.578829582898545470, -0.578788809748253310, +-0.578748035150989050, -0.578707259106854390, -0.578666481615951910, -0.578625702678383200, -0.578584922294250290, -0.578544140463654770, -0.578503357186699100, -0.578462572463485200, +-0.578421786294114780, -0.578380998678689530, -0.578340209617312140, -0.578299419110084310, -0.578258627157107850, -0.578217833758484460, -0.578177038914316820, -0.578136242624706640, +-0.578095444889755510, -0.578054645709566110, -0.578013845084240030, -0.577973043013879420, -0.577932239498585850, -0.577891434538462030, -0.577850628133609550, -0.577809820284130530, +-0.577769010990126670, -0.577728200251700570, -0.577687388068954030, -0.577646574441988970, -0.577605759370907080, -0.577564942855811280, -0.577524124896803050, -0.577483305493984410, +-0.577442484647457290, -0.577401662357324260, -0.577360838623687030, -0.577320013446647410, -0.577279186826308190, -0.577238358762770850, -0.577197529256137650, -0.577156698306510400, +-0.577115865913991670, -0.577075032078683270, -0.577034196800687240, -0.576993360080105380, -0.576952521917040500, -0.576911682311594290, -0.576870841263869010, -0.576829998773966120, +-0.576789154841988560, -0.576748309468038230, -0.576707462652217060, -0.576666614394626960, -0.576625764695370640, -0.576584913554549880, -0.576544060972266850, -0.576503206948623340, +-0.576462351483722050, -0.576421494577665010, -0.576380636230553800, -0.576339776442491460, -0.576298915213579570, -0.576258052543920480, -0.576217188433615800, -0.576176322882768540, +-0.576135455891480520, -0.576094587459853870, -0.576053717587990290, -0.576012846275992920, -0.575971973523963340, -0.575931099332003820, -0.575890223700216250, -0.575849346628703460, +-0.575808468117567250, -0.575767588166909980, -0.575726706776833240, -0.575685823947440170, -0.575644939678832570, -0.575604053971112250, -0.575563166824382130, -0.575522278238744130, +-0.575481388214300390, -0.575440496751152830, -0.575399603849404360, -0.575358709509156910, -0.575317813730512720, -0.575276916513573600, -0.575236017858442470, -0.575195117765221480, +-0.575154216234012530, -0.575113313264917770, -0.575072408858040010, -0.575031503013481270, -0.574990595731343810, -0.574949687011729440, -0.574908776854741290, -0.574867865260481170, +-0.574826952229051000, -0.574786037760553810, -0.574745121855091520, -0.574704204512766490, -0.574663285733680530, -0.574622365517936660, -0.574581443865637030, -0.574540520776883670, +-0.574499596251778710, -0.574458670290425080, -0.574417742892924800, -0.574376814059380130, -0.574335883789893090, -0.574294952084566710, -0.574254018943502920, -0.574213084366804070, +-0.574172148354572200, -0.574131210906910330, -0.574090272023920380, -0.574049331705704380, -0.574008389952365470, -0.573967446764005460, -0.573926502140726940, -0.573885556082631810, +-0.573844608589823110, -0.573803659662402990, -0.573762709300473570, -0.573721757504137120, -0.573680804273496660, -0.573639849608654110, -0.573598893509711940, -0.573557935976772180, +-0.573516977009937980, -0.573476016609311360, -0.573435054774994680, -0.573394091507089980, -0.573353126805700390, -0.573312160670928050, -0.573271193102875220, -0.573230224101644040, +-0.573189253667337750, -0.573148281800058280, -0.573107308499907760, -0.573066333766989340, -0.573025357601405050, -0.572984380003257350, -0.572943400972648400, -0.572902420509681320, +-0.572861438614458150, -0.572820455287081360, -0.572779470527653100, -0.572738484336276500, -0.572697496713053810, -0.572656507658087180, -0.572615517171479070, -0.572574525253332520, +-0.572533531903749560, -0.572492537122832880, -0.572451540910684400, -0.572410543267407480, -0.572369544193104150, -0.572328543687876670, -0.572287541751828170, -0.572246538385060790, +-0.572205533587677120, -0.572164527359779180, -0.572123519701470350, -0.572082510612852760, -0.572041500094028770, -0.572000488145100740, -0.571959474766171820, -0.571918459957344250, +-0.571877443718720510, -0.571836426050402750, -0.571795406952494420, -0.571754386425097460, -0.571713364468314560, -0.571672341082247960, -0.571631316267000700, -0.571590290022675250, +-0.571549262349373750, -0.571508233247199460, -0.571467202716254510, -0.571426170756641590, -0.571385137368462860, -0.571344102551821780, -0.571303066306820260, -0.571262028633561130, +-0.571220989532146620, -0.571179949002679990, -0.571138907045263490, -0.571097863659999700, -0.571056818846990890, -0.571015772606340290, -0.570974724938150380, -0.570933675842523640, +-0.570892625319562420, -0.570851573369369870, -0.570810519992048460, -0.570769465187700780, -0.570728408956428960, -0.570687351298336590, -0.570646292213525810, -0.570605231702098870, +-0.570564169764159250, -0.570523106399809300, -0.570482041609151500, -0.570440975392288220, -0.570399907749322920, -0.570358838680357750, -0.570317768185495620, -0.570276696264838680, +-0.570235622918490280, -0.570194548146552900, -0.570153471949129020, -0.570112394326321210, -0.570071315278232850, -0.570030234804966060, -0.569989152906623770, -0.569948069583308130, +-0.569906984835122810, -0.569865898662169970, -0.569824811064551960, -0.569783722042372380, -0.569742631595733460, -0.569701539724738030, -0.569660446429488320, -0.569619351710087820, +-0.569578255566638990, -0.569537157999244540, -0.569496059008006710, -0.569454958593029190, -0.569413856754414250, -0.569372753492264790, -0.569331648806682970, -0.569290542697772350, +-0.569249435165635420, -0.569208326210374980, -0.569167215832093290, -0.569126104030893920, -0.569084990806879240, -0.569043876160151840, -0.569002760090814960, -0.568961642598971310, +-0.568920523684723570, -0.568879403348174110, -0.568838281589426400, -0.568797158408583140, -0.568756033805746910, -0.568714907781020300, -0.568673780334506660, -0.568632651466308700, +-0.568591521176529000, -0.568550389465270260, -0.568509256332635830, -0.568468121778728190, -0.568426985803650360, -0.568385848407504720, -0.568344709590394740, -0.568303569352422990, +-0.568262427693692400, -0.568221284614305320, -0.568180140114365350, -0.568138994193975070, -0.568097846853236940, -0.568056698092254560, -0.568015547911130400, -0.567974396309967490, +-0.567933243288868070, -0.567892088847935960, -0.567850932987273740, -0.567809775706984100, -0.567768617007169630, -0.567727456887934020, -0.567686295349379750, -0.567645132391609740, +-0.567603968014726460, -0.567562802218833710, -0.567521635004033960, -0.567480466370430150, -0.567439296318124730, -0.567398124847221520, -0.567356951957822990, -0.567315777650031610, +-0.567274601923951180, -0.567233424779684300, -0.567192246217333880, -0.567151066237002400, -0.567109884838793650, -0.567068702022810230, -0.567027517789155060, -0.566986332137930700, +-0.566945145069240870, -0.566903956583188150, -0.566862766679875560, -0.566821575359405690, -0.566780382621882240, -0.566739188467407900, -0.566697992896085580, -0.566656795908017760, +-0.566615597503308480, -0.566574397682060190, -0.566533196444375500, -0.566491993790358190, -0.566450789720110870, -0.566409584233736550, -0.566368377331337940, -0.566327169013018830, +-0.566285959278881700, -0.566244748129029700, -0.566203535563565510, -0.566162321582592830, -0.566121106186214250, -0.566079889374533020, -0.566038671147651610, -0.565997451505673930, +-0.565956230448702690, -0.565915007976840800, -0.565873784090191070, -0.565832558788857190, -0.565791332072941970, -0.565750103942547990, -0.565708874397779170, -0.565667643438738100, +-0.565626411065527910, -0.565585177278251420, -0.565543942077012310, -0.565502705461913390, -0.565461467433057590, -0.565420227990547920, -0.565378987134487860, -0.565337744864980450, +-0.565296501182128710, -0.565255256086035330, -0.565214009576804120, -0.565172761654537890, -0.565131512319339780, -0.565090261571312480, -0.565049009410559910, -0.565007755837184880, +-0.564966500851290410, -0.564925244452979310, -0.564883986642355510, -0.564842727419521680, -0.564801466784580760, -0.564760204737636550, -0.564718941278791740, -0.564677676408149590, +-0.564636410125812890, -0.564595142431885580, -0.564553873326470330, -0.564512602809670420, -0.564471330881588630, -0.564430057542328890, -0.564388782791994110, -0.564347506630687220, +-0.564306229058511240, -0.564264950075570090, -0.564223669681966580, -0.564182387877803840, -0.564141104663184790, -0.564099820038213350, -0.564058534002992330, -0.564017246557624640, +-0.563975957702214200, -0.563934667436863930, -0.563893375761676860, -0.563852082676756130, -0.563810788182205420, -0.563769492278127780, -0.563728194964626450, -0.563686896241804240, +-0.563645596109765170, -0.563604294568612050, -0.563562991618448250, -0.563521687259376680, -0.563480381491501150, -0.563439074314924680, -0.563397765729750530, -0.563356455736081620, +-0.563315144334021860, -0.563273831523674380, -0.563232517305141790, -0.563191201678528430, -0.563149884643937000, -0.563108566201470870, -0.563067246351232950, -0.563025925093327270, +-0.562984602427856750, -0.562943278354924750, -0.562901952874634180, -0.562860625987089190, -0.562819297692392470, -0.562777967990647610, -0.562736636881957520, -0.562695304366426120, +-0.562653970444156440, -0.562612635115251840, -0.562571298379815340, -0.562529960237950880, -0.562488620689761580, -0.562447279735350690, -0.562405937374821360, -0.562364593608277400, +-0.562323248435822040, -0.562281901857558110, -0.562240553873589840, -0.562199204484020280, -0.562157853688952550, -0.562116501488489910, -0.562075147882736380, -0.562033792871795000, +-0.561992436455769130, -0.561951078634761680, -0.561909719408877020, -0.561868358778218060, -0.561826996742888160, -0.561785633302990470, -0.561744268458629010, -0.561702902209906820, +-0.561661534556927470, -0.561620165499793880, -0.561578795038610300, -0.561537423173479660, -0.561496049904505080, -0.561454675231790820, -0.561413299155439800, -0.561371921675555610, +-0.561330542792241150, -0.561289162505600790, -0.561247780815737450, -0.561206397722754710, -0.561165013226755600, -0.561123627327844380, -0.561082240026124060, -0.561040851321698120, +-0.560999461214669590, -0.560958069705142950, -0.560916676793220990, -0.560875282479007420, -0.560833886762605260, -0.560792489644118760, -0.560751091123650960, -0.560709691201305200, +-0.560668289877185530, -0.560626887151395080, -0.560585483024037430, -0.560544077495215730, -0.560502670565034220, -0.560461262233595940, -0.560419852501004570, -0.560378441367363260, +-0.560337028832776140, -0.560295614897346470, -0.560254199561177720, -0.560212782824373150, -0.560171364687036990, -0.560129945149272390, -0.560088524211182940, -0.560047101872871880, +-0.560005678134443350, -0.559964252996000610, -0.559922826457647020, -0.559881398519486590, -0.559839969181622710, -0.559798538444158830, -0.559757106307198330, -0.559715672770845440, +-0.559674237835203310, -0.559632801500375530, -0.559591363766465570, -0.559549924633577440, -0.559508484101814420, -0.559467042171280290, -0.559425598842078210, -0.559384154114312530, +-0.559342707988086390, -0.559301260463503480, -0.559259811540667060, -0.559218361219681490, -0.559176909500650020, -0.559135456383676230, -0.559094001868863490, -0.559052545956316150, +-0.559011088646137360, -0.558969629938430470, -0.558928169833299960, -0.558886708330848970, -0.558845245431181190, -0.558803781134399990, -0.558762315440609610, -0.558720848349913530, +-0.558679379862415340, -0.558637909978218270, -0.558596438697426810, -0.558554966020144320, -0.558513491946474370, -0.558472016476520230, -0.558430539610386580, -0.558389061348176450, +-0.558347581689993770, -0.558306100635941660, -0.558264618186124720, -0.558223134340646300, -0.558181649099609540, -0.558140162463119150, -0.558098674431278250, -0.558057185004190770, +-0.558015694181959840, -0.557974201964690160, -0.557932708352484990, -0.557891213345447890, -0.557849716943682570, -0.557808219147293170, -0.557766719956383270, -0.557725219371056680, +-0.557683717391416530, -0.557642214017567530, -0.557600709249613020, -0.557559203087656610, -0.557517695531801970, -0.557476186582153370, -0.557434676238814380, -0.557393164501888250, +-0.557351651371479570, -0.557310136847691820, -0.557268620930628680, -0.557227103620393740, -0.557185584917091250, -0.557144064820824900, -0.557102543331698400, -0.557061020449815090, +-0.557019496175279680, -0.556977970508195420, -0.556936443448666330, -0.556894914996795660, -0.556853385152688230, -0.556811853916447270, -0.556770321288176610, -0.556728787267979810, +-0.556687251855961460, -0.556645715052224930, -0.556604176856874130, -0.556562637270012540, -0.556521096291744730, -0.556479553922174070, -0.556438010161404260, -0.556396465009539760, +-0.556354918466684170, -0.556313370532941280, -0.556271821208414450, -0.556230270493208610, -0.556188718387427010, -0.556147164891173550, -0.556105610004551940, -0.556064053727666540, +-0.556022496060621150, -0.555980937003519360, -0.555939376556464970, -0.555897814719562570, -0.555856251492915510, -0.555814686876627830, -0.555773120870803110, -0.555731553475545930, +-0.555689984690959870, -0.555648414517148530, -0.555606842954216470, -0.555565270002267300, -0.555523695661404910, -0.555482119931733020, -0.555440542813356200, -0.555398964306377920, +-0.555357384410902320, -0.555315803127032770, -0.555274220454874180, -0.555232636394530020, -0.555191050946104330, -0.555149464109700560, -0.555107875885423540, -0.555066286273376840, +-0.555024695273664380, -0.554983102886389860, -0.554941509111657850, -0.554899913949572170, -0.554858317400236280, -0.554816719463754990, -0.554775120140231890, -0.554733519429771120, +-0.554691917332476030, -0.554650313848451540, -0.554608708977801230, -0.554567102720629260, -0.554525495077039080, -0.554483886047135610, -0.554442275631022330, -0.554400663828803380, +-0.554359050640582440, -0.554317436066464220, -0.554275820106552410, -0.554234202760951030, -0.554192584029763790, -0.554150963913095480, -0.554109342411049810, -0.554067719523730350, +-0.554026095251241910, -0.553984469593688300, -0.553942842551173540, -0.553901214123801220, -0.553859584311676370, -0.553817953114902450, -0.553776320533583610, -0.553734686567823650, +-0.553693051217727380, -0.553651414483398500, -0.553609776364941020, -0.553568136862458760, -0.553526495976056520, -0.553484853705838000, -0.553443210051907440, -0.553401565014368440, +-0.553359918593325780, -0.553318270788883520, -0.553276621601145440, -0.553234971030215460, -0.553193319076198510, -0.553151665739198160, -0.553110011019318340, -0.553068354916663840, +-0.553026697431338480, -0.552985038563446380, -0.552943378313091260, -0.552901716680378130, -0.552860053665410580, -0.552818389268293080, -0.552776723489129100, -0.552735056328023780, +-0.552693387785080700, -0.552651717860404230, -0.552610046554098070, -0.552568373866267230, -0.552526699797015410, -0.552485024346446750, -0.552443347514665280, -0.552401669301775810, +-0.552359989707882140, -0.552318308733088070, -0.552276626377498640, -0.552234942641217640, -0.552193257524349330, -0.552151571026997410, -0.552109883149267010, -0.552068193891261830, +-0.552026503253086220, -0.551984811234844000, -0.551943117836640180, -0.551901423058578480, -0.551859726900763240, -0.551818029363298270, -0.551776330446288600, -0.551734630149838150, +-0.551692928474051160, -0.551651225419031330, -0.551609520984883920, -0.551567815171712720, -0.551526107979621650, -0.551484399408715520, -0.551442689459098580, -0.551400978130874740, +-0.551359265424148260, -0.551317551339023830, -0.551275835875605580, -0.551234119033997770, -0.551192400814304320, -0.551150681216630130, -0.551108960241079360, -0.551067237887756130, +-0.551025514156764370, -0.550983789048209330, -0.550942062562194690, -0.550900334698824930, -0.550858605458203980, -0.550816874840436950, -0.550775142845627670, -0.550733409473880500, +-0.550691674725299450, -0.550649938599989670, -0.550608201098054970, -0.550566462219599370, -0.550524721964728010, -0.550482980333544920, -0.550441237326154240, -0.550399492942660220, +-0.550357747183167770, -0.550316000047781030, -0.550274251536604250, -0.550232501649741360, -0.550190750387297700, -0.550148997749377200, -0.550107243736084110, -0.550065488347522560, +-0.550023731583797690, -0.549981973445013540, -0.549940213931274350, -0.549898453042684370, -0.549856690779348510, -0.549814927141371030, -0.549773162128855740, -0.549731395741907990, +-0.549689627980631810, -0.549647858845131450, -0.549606088335511170, -0.549564316451875980, -0.549522543194330030, -0.549480768562977670, -0.549438992557923060, -0.549397215179271310, +-0.549355436427126590, -0.549313656301593120, -0.549271874802775280, -0.549230091930778100, -0.549188307685705700, -0.549146522067662460, -0.549104735076752610, -0.549062946713081310, +-0.549021156976752580, -0.548979365867870660, -0.548937573386540700, -0.548895779532866720, -0.548853984306953310, -0.548812187708904610, -0.548770389738825860, -0.548728590396820980, +-0.548686789682994780, -0.548644987597451170, -0.548603184140295410, -0.548561379311631850, -0.548519573111564630, -0.548477765540198230, -0.548435956597637770, -0.548394146283987420, +-0.548352334599351730, -0.548310521543834860, -0.548268707117541940, -0.548226891320577340, -0.548185074153045070, -0.548143255615050620, -0.548101435706697890, -0.548059614428091590, +-0.548017791779335960, -0.547975967760536140, -0.547934142371796500, -0.547892315613221380, -0.547850487484915270, -0.547808657986983190, -0.547766827119529510, -0.547724994882658690, +-0.547683161276475090, -0.547641326301083860, -0.547599489956589470, -0.547557652243096270, -0.547515813160708520, -0.547473972709531690, -0.547432130889669800, -0.547390287701227770, +-0.547348443144309530, -0.547306597219020530, -0.547264749925465140, -0.547222901263747400, -0.547181051233972870, -0.547139199836245700, -0.547097347070670480, -0.547055492937351560, +-0.547013637436394200, -0.546971780567902850, -0.546929922331982010, -0.546888062728736020, -0.546846201758270150, -0.546804339420688850, -0.546762475716096710, -0.546720610644597980, +-0.546678744206298140, -0.546636876401301430, -0.546595007229712440, -0.546553136691635630, -0.546511264787176380, -0.546469391516438920, -0.546427516879527620, -0.546385640876547950, +-0.546343763507604050, -0.546301884772800840, -0.546260004672242560, -0.546218123206034580, -0.546176240374281360, -0.546134356177087500, -0.546092470614557350, -0.546050583686796490, +-0.546008695393909060, -0.545966805735999980, -0.545924914713173500, -0.545883022325535090, -0.545841128573189120, -0.545799233456240260, -0.545757336974793010, -0.545715439128952820, +-0.545673539918823950, -0.545631639344510980, -0.545589737406119160, -0.545547834103753070, -0.545505929437517410, -0.545464023407516540, -0.545422116013855930, -0.545380207256640050, +-0.545338297135973700, -0.545296385651961150, -0.545254472804708070, -0.545212558594318830, -0.545170643020898130, -0.545128726084550430, -0.545086807785381430, -0.545044888123495270, +-0.545002967098996980, -0.544961044711990810, -0.544919120962582440, -0.544877195850876350, -0.544835269376977130, -0.544793341540989460, -0.544751412343018830, -0.544709481783169580, +-0.544667549861546310, -0.544625616578254480, -0.544583681933398680, -0.544541745927083600, -0.544499808559413930, -0.544457869830494930, -0.544415929740431400, -0.544373988289327930, +-0.544332045477289190, -0.544290101304420680, -0.544248155770826970, -0.544206208876612750, -0.544164260621882720, -0.544122311006742470, -0.544080360031296340, -0.544038407695649370, +-0.543996453999906040, -0.543954498944171800, -0.543912542528551480, -0.543870584753149310, -0.543828625618071100, -0.543786665123421330, -0.543744703269304910, -0.543702740055826310, +-0.543660775483091330, -0.543618809551204340, -0.543576842260270250, -0.543534873610393770, -0.543492903601680570, -0.543450932234235020, -0.543408959508162040, -0.543366985423566430, +-0.543325009980553660, -0.543283033179228440, -0.543241055019695550, -0.543199075502059700, -0.543157094626426470, -0.543115112392900560, -0.543073128801586540, -0.543031143852589990, +-0.542989157546015620, -0.542947169881968340, -0.542905180860552840, -0.542863190481874590, -0.542821198746038510, -0.542779205653149410, -0.542737211203311860, -0.542695215396631790, +-0.542653218233213550, -0.542611219713162280, -0.542569219836582570, -0.542527218603580330, -0.542485216014259920, -0.542443212068726480, -0.542401206767084590, -0.542359200109440160, +-0.542317192095897680, -0.542275182726561830, -0.542233172001538420, -0.542191159920932140, -0.542149146484847800, -0.542107131693390420, -0.542065115546665480, -0.542023098044777660, +-0.541981079187832230, -0.541939058975933750, -0.541897037409187930, -0.541855014487699460, -0.541812990211573590, -0.541770964580914780, -0.541728937595828960, -0.541686909256420710, +-0.541644879562795280, -0.541602848515057240, -0.541560816113312530, -0.541518782357665710, -0.541476747248221920, -0.541434710785085980, -0.541392672968363580, -0.541350633798159400, +-0.541308593274578360, -0.541266551397726280, -0.541224508167707730, -0.541182463584627960, -0.541140417648591550, -0.541098370359704540, -0.541056321718071610, -0.541014271723797900, +-0.540972220376988110, -0.540930167677748150, -0.540888113626182720, -0.540846058222397060, -0.540804001466495880, -0.540761943358585070, -0.540719883898769460, -0.540677823087154060, +-0.540635760923843690, -0.540593697408944360, -0.540551632542560780, -0.540509566324797740, -0.540467498755761170, -0.540425429835555860, -0.540383359564286960, -0.540341287942059270, +-0.540299214968978700, -0.540257140645150180, -0.540215064970678730, -0.540172987945669260, -0.540130909570227800, -0.540088829844458940, -0.540046748768468030, -0.540004666342359880, +-0.539962582566240520, -0.539920497440214640, -0.539878410964387490, -0.539836323138863980, -0.539794233963749930, -0.539752143439150460, -0.539710051565170160, -0.539667958341915170, +-0.539625863769490180, -0.539583767848000550, -0.539541670577551200, -0.539499571958248050, -0.539457471990195890, -0.539415370673500090, -0.539373268008265570, -0.539331163994598130, +-0.539289058632602790, -0.539246951922384920, -0.539204843864049210, -0.539162734457701800, -0.539120623703447490, -0.539078511601391640, -0.539036398151639170, -0.538994283354296110, +-0.538952167209467260, -0.538910049717258090, -0.538867930877773290, -0.538825810691119120, -0.538783689157400380, -0.538741566276722090, -0.538699442049190290, -0.538657316474909780, +-0.538615189553986130, -0.538573061286524050, -0.538530931672629660, -0.538488800712407900, -0.538446668405964220, -0.538404534753403440, -0.538362399754831800, -0.538320263410354110, +-0.538278125720075720, -0.538235986684101660, -0.538193846302537970, -0.538151704575489780, -0.538109561503062220, -0.538067417085360430, -0.538025271322490450, -0.537983124214557300, +-0.537940975761666000, -0.537898825963922580, -0.537856674821432180, -0.537814522334300050, -0.537772368502631220, -0.537730213326531810, -0.537688056806106870, -0.537645898941461860, +-0.537603739732701700, -0.537561579179932520, -0.537519417283259470, -0.537477254042787900, -0.537435089458622730, -0.537392923530870200, -0.537350756259635460, -0.537308587645023760, +-0.537266417687140230, -0.537224246386091010, -0.537182073741981240, -0.537139899754915830, -0.537097724425001030, -0.537055547752341990, -0.537013369737044060, -0.536971190379212370, +-0.536929009678952960, -0.536886827636371190, -0.536844644251572190, -0.536802459524661320, -0.536760273455744620, -0.536718086044927320, -0.536675897292314690, -0.536633707198011960, +-0.536591515762125380, -0.536549322984759990, -0.536507128866021370, -0.536464933406014420, -0.536422736604845630, -0.536380538462619900, -0.536338338979442500, -0.536296138155419650, +-0.536253935990656410, -0.536211732485258330, -0.536169527639330570, -0.536127321452979370, -0.536085113926309860, -0.536042905059427640, -0.536000694852437620, -0.535958483305446380, +-0.535916270418558830, -0.535874056191880670, -0.535831840625516920, -0.535789623719574060, -0.535747405474157110, -0.535705185889371550, -0.535662964965322730, -0.535620742702116900, +-0.535578519099859100, -0.535536294158655110, -0.535494067878609980, -0.535451840259830060, -0.535409611302420490, -0.535367381006486620, -0.535325149372134600, -0.535282916399469680, +-0.535240682088597540, -0.535198446439623220, -0.535156209452653300, -0.535113971127792690, -0.535071731465147300, -0.535029490464822180, -0.534987248126923660, -0.534945004451557020, +-0.534902759438827920, -0.534860513088841530, -0.534818265401704180, -0.534776016377521150, -0.534733766016398220, -0.534691514318440420, -0.534649261283754120, -0.534607006912444780, +-0.534564751204617550, -0.534522494160378780, -0.534480235779833720, -0.534437976063088180, -0.534395715010247300, -0.534353452621417420, -0.534311188896704040, -0.534268923836212610, +-0.534226657440048490, -0.534184389708318160, -0.534142120641126760, -0.534099850238580090, -0.534057578500783500, -0.534015305427843260, -0.533973031019864820, -0.533930755276953770, +-0.533888478199215370, -0.533846199786756290, -0.533803920039681580, -0.533761638958096810, -0.533719356542108230, -0.533677072791821310, -0.533634787707341740, -0.533592501288774780, +-0.533550213536226890, -0.533507924449803550, -0.533465634029610340, -0.533423342275752720, -0.533381049188337180, -0.533338754767468840, -0.533296459013253730, -0.533254161925797110, +-0.533211863505205440, -0.533169563751584090, -0.533127262665038850, -0.533084960245675090, -0.533042656493599280, -0.533000351408916770, -0.532958044991733490, -0.532915737242154690, +-0.532873428160286930, -0.532831117746235590, -0.532788806000106030, -0.532746492922004930, -0.532704178512037550, -0.532661862770309690, -0.532619545696926820, -0.532577227291995410, +-0.532534907555621050, -0.532492586487909310, -0.532450264088965790, -0.532407940358897050, -0.532365615297808350, -0.532323288905805600, -0.532280961182994280, -0.532238632129480970, +-0.532196301745371030, -0.532153970030770360, -0.532111636985784450, -0.532069302610519770, -0.532026966905081890, -0.531984629869576060, -0.531942291504109210, -0.531899951808786460, +-0.531857610783713960, -0.531815268428997070, -0.531772924744742360, -0.531730579731055310, -0.531688233388041720, -0.531645885715807290, -0.531603536714458480, -0.531561186384100880, +-0.531518834724840290, -0.531476481736782190, -0.531434127420033380, -0.531391771774699100, -0.531349414800885490, -0.531307056498697920, -0.531264696868243070, -0.531222335909626530, +-0.531179973622953770, -0.531137610008331480, -0.531095245065865140, -0.531052878795660650, -0.531010511197823610, -0.530968142272460700, -0.530925772019677390, -0.530883400439579600, +-0.530841027532273020, -0.530798653297864240, -0.530756277736458840, -0.530713900848162720, -0.530671522633081480, -0.530629143091321810, -0.530586762222989170, -0.530544380028189820, +-0.530501996507029010, -0.530459611659613640, -0.530417225486049190, -0.530374837986441360, -0.530332449160896720, -0.530290059009521090, -0.530247667532420250, -0.530205274729699920, +-0.530162880601466660, -0.530120485147826280, -0.530078088368884700, -0.530035690264747390, -0.529993290835521380, -0.529950890081312130, -0.529908488002225560, -0.529866084598367480, +-0.529823679869844580, -0.529781273816762430, -0.529738866439227070, -0.529696457737344200, -0.529654047711220600, -0.529611636360961870, -0.529569223686674030, -0.529526809688462770, +-0.529484394366434800, -0.529441977720695900, -0.529399559751351670, -0.529357140458508900, -0.529314719842273300, -0.529272297902750880, -0.529229874640047340, -0.529187450054269480, +-0.529145024145523110, -0.529102596913914040, -0.529060168359548170, -0.529017738482532200, -0.528975307282971930, -0.528932874760973390, -0.528890440916642280, -0.528848005750085500, +-0.528805569261408650, -0.528763131450717850, -0.528720692318118910, -0.528678251863718530, -0.528635810087622620, -0.528593366989936750, -0.528550922570767860, -0.528508476830221620, +-0.528466029768404180, -0.528423581385421340, -0.528381131681379900, -0.528338680656385670, -0.528296228310544680, -0.528253774643962840, -0.528211319656746840, -0.528168863349002590, +-0.528126405720836130, -0.528083946772353370, -0.528041486503661010, -0.527999024914865060, -0.527956562006071440, -0.527914097777386070, -0.527871632228915870, -0.527829165360766520, +-0.527786697173043940, -0.527744227665854940, -0.527701756839305420, -0.527659284693501540, -0.527616811228548980, -0.527574336444554870, -0.527531860341624800, -0.527489382919865140, +-0.527446904179381670, -0.527404424120281320, -0.527361942742669900, -0.527319460046653530, -0.527276976032338250, -0.527234490699830860, -0.527192004049237270, -0.527149516080663630, +-0.527107026794215840, -0.527064536190000930, -0.527022044268124600, -0.526979551028693200, -0.526937056471812440, -0.526894560597589550, -0.526852063406130220, -0.526809564897540270, +-0.526767065071926940, -0.526724563929395820, -0.526682061470053360, -0.526639557694005280, -0.526597052601358810, -0.526554546192219640, -0.526512038466694140, -0.526469529424888120, +-0.526427019066908700, -0.526384507392861690, -0.526341994402853340, -0.526299480096989790, -0.526256964475377840, -0.526214447538123410, -0.526171929285332960, -0.526129409717112310, +-0.526086888833568470, -0.526044366634807470, -0.526001843120935120, -0.525959318292058550, -0.525916792148283680, -0.525874264689716760, -0.525831735916463930, -0.525789205828632090, +-0.525746674426327170, -0.525704141709655630, -0.525661607678723390, -0.525619072333637470, -0.525576535674503910, -0.525533997701428950, -0.525491458414518610, -0.525448917813880030, +-0.525406375899619140, -0.525363832671842280, -0.525321288130655590, -0.525278742276165890, -0.525236195108479410, -0.525193646627702180, -0.525151096833941010, -0.525108545727302260, +-0.525065993307892050, -0.525023439575816540, -0.524980884531182750, -0.524938328174096800, -0.524895770504664960, -0.524853211522993360, -0.524810651229189130, -0.524768089623358300, +-0.524725526705607130, -0.524682962476041850, -0.524640396934769600, -0.524597830081896200, -0.524555261917528330, -0.524512692441771900, -0.524470121654734170, -0.524427549556521040, +-0.524384976147238780, -0.524342401426994400, -0.524299825395893930, -0.524257248054044060, -0.524214669401550590, -0.524172089438520780, -0.524129508165060880, -0.524086925581277120, +-0.524044341687275650, -0.524001756483163720, -0.523959169969047460, -0.523916582145033230, -0.523873993011227170, -0.523831402567736410, -0.523788810814667330, -0.523746217752126150, +-0.523703623380219030, -0.523661027699053210, -0.523618430708734820, -0.523575832409370330, -0.523533232801066010, -0.523490631883928860, -0.523448029658065140, -0.523405426123580990, +-0.523362821280583650, -0.523320215129179370, -0.523277607669474400, -0.523234998901575100, -0.523192388825588610, -0.523149777441621280, -0.523107164749779360, -0.523064550750169220, +-0.523021935442898100, -0.522979318828072140, -0.522936700905797910, -0.522894081676181450, -0.522851461139330230, -0.522808839295350380, -0.522766216144348370, -0.522723591686430460, +-0.522680965921703990, -0.522638338850275110, -0.522595710472249950, -0.522553080787735880, -0.522510449796839140, -0.522467817499666310, -0.522425183896323530, -0.522382548986918160, +-0.522339912771556450, -0.522297275250344860, -0.522254636423389870, -0.522211996290798510, -0.522169354852677240, -0.522126712109132530, -0.522084068060270750, -0.522041422706199130, +-0.521998776047023940, -0.521956128082851860, -0.521913478813789020, -0.521870828239942910, -0.521828176361419650, -0.521785523178325610, -0.521742868690768140, -0.521700212898853600, +-0.521657555802688360, -0.521614897402378990, -0.521572237698032740, -0.521529576689755750, -0.521486914377654930, -0.521444250761836540, -0.521401585842407700, -0.521358919619475000, +-0.521316252093145030, -0.521273583263524020, -0.521230913130719450, -0.521188241694837570, -0.521145568955985070, -0.521102894914268310, -0.521060219569794650, -0.521017542922670550, +-0.520974864973002490, -0.520932185720896830, -0.520889505166461260, -0.520846823309801810, -0.520804140151024940, -0.520761455690238020, -0.520718769927547620, -0.520676082863060220, +-0.520633394496882170, -0.520590704829121180, -0.520548013859883250, -0.520505321589275430, -0.520462628017403840, -0.520419933144376070, -0.520377236970298470, -0.520334539495277750, +-0.520291840719420360, -0.520249140642833670, -0.520206439265624150, -0.520163736587898610, -0.520121032609763280, -0.520078327331325860, -0.520035620752692500, -0.519992912873969760, +-0.519950203695265010, -0.519907493216684950, -0.519864781438336030, -0.519822068360324740, -0.519779353982758760, -0.519736638305744350, -0.519693921329388300, -0.519651203053797080, +-0.519608483479078290, -0.519565762605338270, -0.519523040432683820, -0.519480316961221430, -0.519437592191058560, -0.519394866122301790, -0.519352138755057810, -0.519309410089433100, +-0.519266680125535230, -0.519223948863470790, -0.519181216303345900, -0.519138482445268500, -0.519095747289344820, -0.519053010835681780, -0.519010273084385850, -0.518967534035564610, +-0.518924793689324540, -0.518882052045772530, -0.518839309105014970, -0.518796564867159530, -0.518753819332312570, -0.518711072500581240, -0.518668324372071670, -0.518625574946891770, +-0.518582824225148010, -0.518540072206947090, -0.518497318892395590, -0.518454564281601190, -0.518411808374670380, -0.518369051171710060, -0.518326292672826710, -0.518283532878128120, +-0.518240771787720540, -0.518198009401710790, -0.518155245720206330, -0.518112480743313730, -0.518069714471139920, -0.518026946903791470, -0.517984178041376090, -0.517941407884000230, +-0.517898636431770810, -0.517855863684794420, -0.517813089643178850, -0.517770314307030470, -0.517727537676456300, -0.517684759751562920, -0.517641980532458020, -0.517599200019248200, +-0.517556418212040350, -0.517513635110941060, -0.517470850716058140, -0.517428065027498050, -0.517385278045367380, -0.517342489769773930, -0.517299700200824160, -0.517256909338625230, +-0.517214117183283690, -0.517171323734907150, -0.517128528993602400, -0.517085732959476240, -0.517042935632635370, -0.517000137013187590, -0.516957337101239480, -0.516914535896897950, +-0.516871733400269710, -0.516828929611462540, -0.516786124530583150, -0.516743318157738330, -0.516700510493034780, -0.516657701536580420, -0.516614891288481810, -0.516572079748845560, +-0.516529266917779560, -0.516486452795390290, -0.516443637381785000, -0.516400820677070160, -0.516358002681353680, -0.516315183394742140, -0.516272362817342790, -0.516229540949261990, +-0.516186717790607760, -0.516143893341486800, -0.516101067602006030, -0.516058240572272230, -0.516015412252393220, -0.515972582642475700, -0.515929751742626670, -0.515886919552952960, +-0.515844086073562250, -0.515801251304561340, -0.515758415246056920, -0.515715577898156920, -0.515672739260967910, -0.515629899334597020, -0.515587058119151060, -0.515544215614737840, +-0.515501371821464050, -0.515458526739436820, -0.515415680368762950, -0.515372832709550250, -0.515329983761905420, -0.515287133525935580, -0.515244282001747660, -0.515201429189449330, +-0.515158575089147420, -0.515115719700949160, -0.515072863024961140, -0.515030005061291370, -0.514987145810046560, -0.514944285271333960, -0.514901423445260240, -0.514858560331933330, +-0.514815695931459930, -0.514772830243947040, -0.514729963269502380, -0.514687095008232840, -0.514644225460245570, -0.514601354625647380, -0.514558482504546060, -0.514515609097048630, +-0.514472734403262240, -0.514429858423293580, -0.514386981157250570, -0.514344102605240220, -0.514301222767369560, -0.514258341643745400, -0.514215459234475870, -0.514172575539667660, +-0.514129690559428030, -0.514086804293863770, -0.514043916743082920, -0.514001027907192260, -0.513958137786298620, -0.513915246380510000, -0.513872353689933340, -0.513829459714675750, +-0.513786564454844050, -0.513743667910546490, -0.513700770081889630, -0.513657870968980860, -0.513614970571927070, -0.513572068890836290, -0.513529165925815210, -0.513486261676971310, +-0.513443356144411280, -0.513400449328243360, -0.513357541228574240, -0.513314631845511290, -0.513271721179161420, -0.513228809229632540, -0.513185895997031680, -0.513142981481465750, +-0.513100065683042670, -0.513057148601869460, -0.513014230238053370, -0.512971310591701310, -0.512928389662921420, -0.512885467451820510, -0.512842543958505930, -0.512799619183084590, +-0.512756693125664630, -0.512713765786352860, -0.512670837165256740, -0.512627907262483080, -0.512584976078140130, -0.512542043612334690, -0.512499109865174220, -0.512456174836765420, +-0.512413238527216760, -0.512370300936634830, -0.512327362065127300, -0.512284421912800880, -0.512241480479763810, -0.512198537766123010, -0.512155593771985610, -0.512112648497459520, +-0.512069701942651780, -0.512026754107669850, -0.511983804992620530, -0.511940854597612180, -0.511897902922751720, -0.511854949968146400, -0.511811995733903460, -0.511769040220130810, +-0.511726083426935600, -0.511683125354425170, -0.511640166002706560, -0.511597205371887910, -0.511554243462076230, -0.511511280273378890, -0.511468315805903020, -0.511425350059756760, +-0.511382383035047130, -0.511339414731881160, -0.511296445150366980, -0.511253474290611740, -0.511210502152722900, -0.511167528736807260, -0.511124554042973300, -0.511081578071327920, +-0.511038600821978490, -0.510995622295032260, -0.510952642490597460, -0.510909661408780910, -0.510866679049690300, -0.510823695413432530, -0.510780710500115980, -0.510737724309847540, +-0.510694736842734920, -0.510651748098885030, -0.510608758078406110, -0.510565766781405310, -0.510522774207989750, -0.510479780358267580, -0.510436785232345920, -0.510393788830332480, +-0.510350791152334060, -0.510307792198459010, -0.510264791968814580, -0.510221790463508130, -0.510178787682646790, -0.510135783626338820, -0.510092778294691460, -0.510049771687812180, +-0.510006763805808010, -0.509963754648787400, -0.509920744216857400, -0.509877732510125470, -0.509834719528698850, -0.509791705272685800, -0.509748689742193560, -0.509705672937329160, +-0.509662654858200950, -0.509619635504916180, -0.509576614877582210, -0.509533592976306400, -0.509490569801197000, -0.509447545352361030, -0.509404519629906400, -0.509361492633939930, +-0.509318464364570180, -0.509275434821904290, -0.509232404006049740, -0.509189371917113890, -0.509146338555204970, -0.509103303920430130, -0.509060268012897050, -0.509017230832713000, +-0.508974192379986200, -0.508931152654823920, -0.508888111657333830, -0.508845069387622970, -0.508802025845799810, -0.508758981031971700, -0.508715934946245670, -0.508672887588730190, +-0.508629838959532510, -0.508586789058760200, -0.508543737886520630, -0.508500685442922040, -0.508457631728071680, -0.508414576742077350, -0.508371520485046080, -0.508328462957086450, +-0.508285404158305700, -0.508242344088811420, -0.508199282748710850, -0.508156220138112460, -0.508113156257123610, -0.508070091105851770, -0.508027024684404420, -0.507983956992889780, +-0.507940888031415240, -0.507897817800088250, -0.507854746299016950, -0.507811673528308800, -0.507768599488071510, -0.507725524178412320, -0.507682447599439700, -0.507639369751261000, +-0.507596290633983930, -0.507553210247715600, -0.507510128592564720, -0.507467045668638540, -0.507423961476044630, -0.507380876014890570, -0.507337789285284610, -0.507294701287334230, +-0.507251612021146990, -0.507208521486830490, -0.507165429684492960, -0.507122336614241890, -0.507079242276184620, -0.507036146670429620, -0.506993049797084260, -0.506949951656256230, +-0.506906852248052990, -0.506863751572583010, -0.506820649629953550, -0.506777546420272620, -0.506734441943647360, -0.506691336200186360, -0.506648229189996970, -0.506605120913187100, +-0.506562011369864010, -0.506518900560136260, -0.506475788484111340, -0.506432675141896940, -0.506389560533600400, -0.506346444659330320, -0.506303327519194160, -0.506260209113299720, +-0.506217089441754360, -0.506173968504666670, -0.506130846302144000, -0.506087722834293820, -0.506044598101224820, -0.506001472103044250, -0.505958344839860020, -0.505915216311779600, +-0.505872086518911470, -0.505828955461363080, -0.505785823139242360, -0.505742689552656670, -0.505699554701714680, -0.505656418586523770, -0.505613281207191730, -0.505570142563826260, +-0.505527002656535720, -0.505483861485427680, -0.505440719050610050, -0.505397575352190210, -0.505354430390276830, -0.505311284164977280, -0.505268136676399250, -0.505224987924651200, +-0.505181837909840730, -0.505138686632075620, -0.505095534091463460, -0.505052380288112720, -0.505009225222131210, -0.504966068893626500, -0.504922911302706280, -0.504879752449479140, +-0.504836592334052650, -0.504793430956534730, -0.504750268317032740, -0.504707104415655580, -0.504663939252510630, -0.504620772827705790, -0.504577605141348640, -0.504534436193547870, +-0.504491265984410960, -0.504448094514045600, -0.504404921782560360, -0.504361747790062710, -0.504318572536660790, -0.504275396022462070, -0.504232218247575140, -0.504189039212107780, +-0.504145858916167810, -0.504102677359862690, -0.504059494543301460, -0.504016310466591340, -0.503973125129840490, -0.503929938533156370, -0.503886750676647900, -0.503843561560422540, +-0.503800371184588200, -0.503757179549252590, -0.503713986654524490, -0.503670792500511280, -0.503627597087320860, -0.503584400415061690, -0.503541202483841600, -0.503498003293768480, +-0.503454802844950030, -0.503411601137494840, -0.503368398171510690, -0.503325193947105620, -0.503281988464387100, -0.503238781723464030, -0.503195573724444010, -0.503152364467435050, +-0.503109153952544740, -0.503065942179881990, -0.503022729149554370, -0.502979514861669920, -0.502936299316336320, -0.502893082513662270, -0.502849864453755680, -0.502806645136724240, +-0.502763424562675980, -0.502720202731719470, -0.502676979643962410, -0.502633755299512490, -0.502590529698478730, -0.502547302840968490, -0.502504074727090020, -0.502460845356951010, +-0.502417614730660270, -0.502374382848325470, -0.502331149710054770, -0.502287915315955740, -0.502244679666137390, -0.502201442760707330, -0.502158204599773560, -0.502114965183444010, +-0.502071724511827360, -0.502028482585031410, -0.501985239403164310, -0.501941994966333630, -0.501898749274648390, -0.501855502328216300, -0.501812254127145030, -0.501769004671543510, +-0.501725753961519530, -0.501682501997181120, -0.501639248778636080, -0.501595994305993330, -0.501552738579360560, -0.501509481598846010, -0.501466223364557260, -0.501422963876603460, +-0.501379703135092170, -0.501336441140131650, -0.501293177891829590, -0.501249913390295010, -0.501206647635635720, -0.501163380627959730, -0.501120112367374970, -0.501076842853990230, +-0.501033572087913440, -0.500990300069252270, -0.500947026798115760, -0.500903752274611700, -0.500860476498848240, -0.500817199470933280, -0.500773921190975630, -0.500730641659083210, +-0.500687360875364140, -0.500644078839926340, -0.500600795552878620, -0.500557511014328990, -0.500514225224385600, -0.500470938183156240, -0.500427649890749950, -0.500384360347274510, +-0.500341069552838190, -0.500297777507548780, -0.500254484211515300, -0.500211189664845680, -0.500167893867648040, -0.500124596820030300, -0.500081298522101480, -0.500037998973969280, +-0.499994698175741830, -0.499951396127527980, -0.499908092829435660, -0.499864788281573050, -0.499821482484048120, -0.499778175436969900, -0.499734867140446180, -0.499691557594585330, +-0.499648246799495210, -0.499604934755284840, -0.499561621462062120, -0.499518306919935370, -0.499474991129012450, -0.499431674089402480, -0.499388355801213270, -0.499345036264553180, +-0.499301715479530170, -0.499258393446253170, -0.499215070164830240, -0.499171745635369260, -0.499128419857979290, -0.499085092832768250, -0.499041764559844500, -0.498998435039315960, +-0.498955104271291690, -0.498911772255879680, -0.498868438993188220, -0.498825104483325290, -0.498781768726400010, -0.498738431722520250, -0.498695093471794470, -0.498651753974330540, +-0.498608413230237580, -0.498565071239623630, -0.498521728002597030, -0.498478383519265660, -0.498435037789738740, -0.498391690814124270, -0.498348342592530140, -0.498304993125065540, +-0.498261642411838460, -0.498218290452957290, -0.498174937248530010, -0.498131582798665760, -0.498088227103472560, -0.498044870163058760, -0.498001511977532450, -0.497958152547002710, +-0.497914791871577610, -0.497871429951365520, -0.497828066786474450, -0.497784702377013670, -0.497741336723091070, -0.497697969824815120, -0.497654601682293920, -0.497611232295636530, +-0.497567861664951090, -0.497524489790345640, -0.497481116671929350, -0.497437742309810190, -0.497394366704096760, -0.497350989854897010, -0.497307611762320130, -0.497264232426474270, +-0.497220851847467840, -0.497177470025408850, -0.497134086960406560, -0.497090702652569110, -0.497047317102004840, -0.497003930308821950, -0.496960542273129580, -0.496917152995035860, +-0.496873762474649260, -0.496830370712077920, -0.496786977707430970, -0.496743583460816600, -0.496700187972343280, -0.496656791242119090, -0.496613393270253280, -0.496569994056854040, +-0.496526593602029440, -0.496483191905888690, -0.496439788968539960, -0.496396384790091790, -0.496352979370652260, -0.496309572710330660, -0.496266164809235130, -0.496222755667474260, +-0.496179345285156000, -0.496135933662389840, -0.496092520799283840, -0.496049106695946480, -0.496005691352486010, -0.495962274769011720, -0.495918856945631700, -0.495875437882454580, +-0.495832017579588450, -0.495788596037142650, -0.495745173255225380, -0.495701749233944830, -0.495658323973410250, -0.495614897473729830, -0.495571469735012200, -0.495528040757365510, +-0.495484610540899100, -0.495441179085721160, -0.495397746391940290, -0.495354312459664660, -0.495310877289003640, -0.495267440880065410, -0.495224003232958620, -0.495180564347791400, +-0.495137124224673150, -0.495093682863712080, -0.495050240265016870, -0.495006796428695610, -0.494963351354857750, -0.494919905043611550, -0.494876457495065150, -0.494833008709328000, +-0.494789558686508370, -0.494746107426714820, -0.494702654930055610, -0.494659201196640200, -0.494615746226576720, -0.494572290019973880, -0.494528832576939970, -0.494485373897584350, +-0.494441913982015260, -0.494398452830341400, -0.494354990442671060, -0.494311526819113610, -0.494268061959777350, -0.494224595864770910, -0.494181128534202600, -0.494137659968181870, +-0.494094190166816990, -0.494050719130216590, -0.494007246858489070, -0.493963773351743800, -0.493920298610089070, -0.493876822633633250, -0.493833345422485690, -0.493789866976754870, +-0.493746387296549290, -0.493702906381977390, -0.493659424233148620, -0.493615940850171300, -0.493572456233154100, -0.493528970382205390, -0.493485483297434640, -0.493441994978950140, +-0.493398505426860700, -0.493355014641274630, -0.493311522622301380, -0.493268029370049320, -0.493224534884627200, -0.493181039166143310, -0.493137542214707240, -0.493094044030427340, +-0.493050544613411910, -0.493007043963770540, -0.492963542081611530, -0.492920038967043670, -0.492876534620175330, -0.492833029041116030, -0.492789522229974190, -0.492746014186858540, +-0.492702504911877450, -0.492658994405140490, -0.492615482666756030, -0.492571969696832870, -0.492528455495479410, -0.492484940062805190, -0.492441423398918610, -0.492397905503928480, +-0.492354386377943210, -0.492310866021072380, -0.492267344433424350, -0.492223821615107580, -0.492180297566231660, -0.492136772286904940, -0.492093245777236340, -0.492049718037334270, +-0.492006189067308250, -0.491962658867266760, -0.491919127437318580, -0.491875594777572260, -0.491832060888137300, -0.491788525769122240, -0.491744989420635830, -0.491701451842786570, +-0.491657913035684010, -0.491614372999436720, -0.491570831734153500, -0.491527289239942820, -0.491483745516914320, -0.491440200565176400, -0.491396654384837650, -0.491353106976007590, +-0.491309558338794810, -0.491266008473308150, -0.491222457379656030, -0.491178905057948150, -0.491135351508293070, -0.491091796730799560, -0.491048240725576180, -0.491004683492732570, +-0.490961125032377320, -0.490917565344619170, -0.490874004429566800, -0.490830442287329750, -0.490786878918016590, -0.490743314321736290, -0.490699748498597270, -0.490656181448709260, +-0.490612613172180800, -0.490569043669120850, -0.490525472939637890, -0.490481900983841590, -0.490438327801840600, -0.490394753393743330, -0.490351177759659640, -0.490307600899697940, +-0.490264022813967300, -0.490220443502576150, -0.490176862965634340, -0.490133281203250340, -0.490089698215533160, -0.490046114002591350, -0.490002528564534580, -0.489958941901471550, +-0.489915354013511160, -0.489871764900761950, -0.489828174563333770, -0.489784583001335150, -0.489740990214875050, -0.489697396204062110, -0.489653800969006070, -0.489610204509815460, +-0.489566606826599030, -0.489523007919466460, -0.489479407788526330, -0.489435806433887730, -0.489392203855659180, -0.489348600053950530, -0.489304995028870370, -0.489261388780527720, +-0.489217781309031260, -0.489174172614490700, -0.489130562697014710, -0.489086951556712280, -0.489043339193692140, -0.488999725608063980, -0.488956110799936560, -0.488912494769418840, +-0.488868877516619500, -0.488825259041648360, -0.488781639344614050, -0.488738018425625250, -0.488694396284791830, -0.488650772922222420, -0.488607148338026040, -0.488563522532311450, +-0.488519895505188370, -0.488476267256765630, -0.488432637787152180, -0.488389007096456720, -0.488345375184789150, -0.488301742052258180, -0.488258107698972820, -0.488214472125041820, +-0.488170835330575040, -0.488127197315681160, -0.488083558080469270, -0.488039917625048110, -0.487996275949527550, -0.487952633054016320, -0.487908988938623440, -0.487865343603457740, +-0.487821697048629100, -0.487778049274246170, -0.487734400280417760, -0.487690750067253710, -0.487647098634862770, -0.487603445983354140, -0.487559792112836510, -0.487516137023419730, +-0.487472480715212650, -0.487428823188324370, -0.487385164442863620, -0.487341504478940310, -0.487297843296663310, -0.487254180896141700, -0.487210517277484210, -0.487166852440800820, +-0.487123186386200340, -0.487079519113791830, -0.487035850623684210, -0.486992180915987280, -0.486948509990809960, -0.486904837848260940, -0.486861164488450180, -0.486817489911486550, +-0.486773814117479220, -0.486730137106536950, -0.486686458878769710, -0.486642779434286350, -0.486599098773196010, -0.486555416895607550, -0.486511733801630930, -0.486468049491374950, +-0.486424363964948870, -0.486380677222461530, -0.486336989264022860, -0.486293300089741700, -0.486249609699727300, -0.486205918094088470, -0.486162225272935290, -0.486118531236376490, +-0.486074835984521000, -0.486031139517478780, -0.485987441835358750, -0.485943742938270080, -0.485900042826321710, -0.485856341499623590, -0.485812638958284580, -0.485768935202414040, +-0.485725230232120770, -0.485681524047514750, -0.485637816648704980, -0.485594108035800660, -0.485550398208910660, -0.485506687168145050, -0.485462974913612730, -0.485419261445423020, +-0.485375546763684720, -0.485331830868507950, -0.485288113760001580, -0.485244395438274580, -0.485200675903436960, -0.485156955155597650, -0.485113233194865930, -0.485069510021350790, +-0.485025785635162240, -0.484982060036409200, -0.484938333225201020, -0.484894605201646620, -0.484850875965856130, -0.484807145517938410, -0.484763413858002870, -0.484719680986158360, +-0.484675946902515090, -0.484632211607181900, -0.484588475100268200, -0.484544737381882920, -0.484500998452136180, -0.484457258311136950, -0.484413516958994590, -0.484369774395818020, +-0.484326030621717420, -0.484282285636801760, -0.484238539441180000, -0.484194792034962240, -0.484151043418257540, -0.484107293591175210, -0.484063542553824280, -0.484019790306314810, +-0.483976036848755950, -0.483932282181256950, -0.483888526303926870, -0.483844769216875860, -0.483801010920212940, -0.483757251414047520, -0.483713490698488510, -0.483669728773646220, +-0.483625965639629560, -0.483582201296548050, -0.483538435744510610, -0.483494668983627470, -0.483450901014007670, -0.483407131835760230, -0.483363361448995330, -0.483319589853822060, +-0.483275817050349780, -0.483232043038687550, -0.483188267818945640, -0.483144491391233060, -0.483100713755659270, -0.483056934912333260, -0.483013154861365310, -0.482969373602864520, +-0.482925591136940220, -0.482881807463701630, -0.482838022583258860, -0.482794236495721060, -0.482750449201197640, -0.482706660699797730, -0.482662870991631580, -0.482619080076808200, +-0.482575287955436800, -0.482531494627627510, -0.482487700093489510, -0.482443904353132220, -0.482400107406664840, -0.482356309254197540, -0.482312509895839510, -0.482268709331700180, +-0.482224907561888680, -0.482181104586515310, -0.482137300405689140, -0.482093495019519760, -0.482049688428116240, -0.482005880631588890, -0.481962071630046840, -0.481918261423599610, +-0.481874450012356350, -0.481830637396427400, -0.481786823575921790, -0.481743008550949090, -0.481699192321618560, -0.481655374888040390, -0.481611556250323810, -0.481567736408577920, +-0.481523915362913110, -0.481480093113438480, -0.481436269660263650, -0.481392445003497700, -0.481348619143251110, -0.481304792079632890, -0.481260963812752740, -0.481217134342719790, +-0.481173303669644390, -0.481129471793635740, -0.481085638714803370, -0.481041804433256560, -0.480997968949105630, -0.480954132262459750, -0.480910294373428530, -0.480866455282121190, +-0.480822614988648140, -0.480778773493118540, -0.480734930795641560, -0.480691086896327720, -0.480647241795286120, -0.480603395492626430, -0.480559547988457850, -0.480515699282890780, +-0.480471849376034490, -0.480427998267998590, -0.480384145958892230, -0.480340292448825980, -0.480296437737908980, -0.480252581826250860, -0.480208724713960920, -0.480164866401149530, +-0.480121006887925970, -0.480077146174399950, -0.480033284260680590, -0.479989421146878480, -0.479945556833102800, -0.479901691319462810, -0.479857824606069020, -0.479813956693030620, +-0.479770087580457420, -0.479726217268458540, -0.479682345757144520, -0.479638473046624600, -0.479594599137008530, -0.479550724028405590, -0.479506847720926220, -0.479462970214679710, +-0.479419091509775800, -0.479375211606323790, -0.479331330504434110, -0.479287448204216090, -0.479243564705779500, -0.479199680009233580, -0.479155794114688840, -0.479111907022254590, +-0.479068018732040250, -0.479024129244156220, -0.478980238558711860, -0.478936346675816860, -0.478892453595580690, -0.478848559318113710, -0.478804663843525380, -0.478760767171925390, +-0.478716869303423050, -0.478672970238128940, -0.478629069976152450, -0.478585168517603240, -0.478541265862590710, -0.478497362011225450, -0.478453456963616740, -0.478409550719874400, +-0.478365643280107830, -0.478321734644427510, -0.478277824812942840, -0.478233913785763630, -0.478190001562999230, -0.478146088144760230, -0.478102173531156030, -0.478058257722295990, +-0.478014340718290690, -0.477970422519249540, -0.477926503125282290, -0.477882582536498460, -0.477838660753008520, -0.477794737774921980, -0.477750813602348560, -0.477706888235397700, +-0.477662961674180040, -0.477619033918804950, -0.477575104969382270, -0.477531174826021480, -0.477487243488833150, -0.477443310957926640, -0.477399377233411910, -0.477355442315398340, +-0.477311506203996540, -0.477267568899315990, -0.477223630401466090, -0.477179690710557550, -0.477135749826699760, -0.477091807750002590, -0.477047864480575570, -0.477003920018529200, +-0.476959974363973080, -0.476916027517017000, -0.476872079477770490, -0.476828130246344130, -0.476784179822847490, -0.476740228207390370, -0.476696275400082300, -0.476652321401033920, +-0.476608366210354740, -0.476564409828154620, -0.476520452254543150, -0.476476493489630890, -0.476432533533527440, -0.476388572386342250, -0.476344610048185960, -0.476300646519168200, +-0.476256681799398840, -0.476212715888987340, -0.476168748788044440, -0.476124780496679720, -0.476080811015002990, -0.476036840343123880, -0.475992868481153080, -0.475948895429200050, +-0.475904921187374820, -0.475860945755786910, -0.475816969134547020, -0.475772991323764660, -0.475729012323549860, -0.475685032134012140, -0.475641050755262200, -0.475597068187409660, +-0.475553084430564430, -0.475509099484836160, -0.475465113350335480, -0.475421126027172010, -0.475377137515455350, -0.475333147815296230, -0.475289156926804290, -0.475245164850089390, +-0.475201171585261210, -0.475157177132430500, -0.475113181491706840, -0.475069184663200250, -0.475025186647020260, -0.474981187443277720, -0.474937187052082210, -0.474893185473543760, +-0.474849182707771930, -0.474805178754877490, -0.474761173614970170, -0.474717167288159880, -0.474673159774556320, -0.474629151074270230, -0.474585141187411240, -0.474541130114089050, +-0.474497117854414400, -0.474453104408496970, -0.474409089776446750, -0.474365073958373410, -0.474321056954387810, -0.474277038764599530, -0.474233019389118720, -0.474188998828054930, +-0.474144977081519040, -0.474100954149620670, -0.474056930032469960, -0.474012904730176540, -0.473968878242851220, -0.473924850570603680, -0.473880821713544060, -0.473836791671782000, +-0.473792760445428340, -0.473748728034592780, -0.473704694439385010, -0.473660659659915880, -0.473616623696295090, -0.473572586548632770, -0.473528548217038600, -0.473484508701623400, +-0.473440468002497010, -0.473396426119769400, -0.473352383053550320, -0.473308338803950680, -0.473264293371080220, -0.473220246755049030, -0.473176198955966800, -0.473132149973944480, +-0.473088099809091780, -0.473044048461518820, -0.472999995931335350, -0.472955942218652340, -0.472911887323579420, -0.472867831246226390, -0.472823773986704170, -0.472779715545122550, +-0.472735655921591610, -0.472691595116221110, -0.472647533129122050, -0.472603469960404200, -0.472559405610177620, -0.472515340078552120, -0.472471273365638710, -0.472427205471547100, +-0.472383136396387460, -0.472339066140269600, -0.472294994703304490, -0.472250922085601880, -0.472206848287271940, -0.472162773308424490, -0.472118697149170540, -0.472074619809619790, +-0.472030541289882530, -0.471986461590068520, -0.471942380710288770, -0.471898298650653030, -0.471854215411271150, -0.471810130992254160, -0.471766045393711810, -0.471721958615754390, +-0.471677870658491650, -0.471633781522034610, -0.471589691206493130, -0.471545599711977400, -0.471501507038597330, -0.471457413186463840, -0.471413318155686820, -0.471369221946376540, +-0.471325124558642780, -0.471281025992596640, -0.471236926248347900, -0.471192825326006870, -0.471148723225683350, -0.471104619947488420, -0.471060515491531940, -0.471016409857923810, +-0.470972303046775010, -0.470928195058195500, -0.470884085892295470, -0.470839975549184830, -0.470795864028974660, -0.470751751331774830, -0.470707637457695620, -0.470663522406846890, +-0.470619406179339780, -0.470575288775284150, -0.470531170194790290, -0.470487050437968120, -0.470442929504928720, -0.470398807395781990, -0.470354684110638300, -0.470310559649607440, +-0.470266434012800550, -0.470222307200327650, -0.470178179212298540, -0.470134050048824360, -0.470089919710015120, -0.470045788195981030, -0.470001655506832090, -0.469957521642679400, +-0.469913386603632910, -0.469869250389802980, -0.469825113001299480, -0.469780974438233630, -0.469736834700715310, -0.469692693788854920, -0.469648551702762430, -0.469604408442548920, +-0.469560264008324400, -0.469516118400199240, -0.469471971618283360, -0.469427823662687930, -0.469383674533522980, -0.469339524230898810, -0.469295372754925500, -0.469251220105714070, +-0.469207066283374660, -0.469162911288017130, -0.469118755119752760, -0.469074597778691480, -0.469030439264943700, -0.468986279578619440, -0.468942118719829880, -0.468897956688685060, +-0.468853793485295270, -0.468809629109770640, -0.468765463562222370, -0.468721296842760370, -0.468677128951495160, -0.468632959888536760, -0.468588789653996310, -0.468544618247983930, +-0.468500445670609940, -0.468456271921984520, -0.468412097002218750, -0.468367920911422760, -0.468323743649706580, -0.468279565217181450, -0.468235385613957390, -0.468191204840144870, +-0.468147022895853970, -0.468102839781195880, -0.468058655496280670, -0.468014470041218820, -0.467970283416120460, -0.467926095621096720, -0.467881906656257780, -0.467837716521714080, +-0.467793525217575670, -0.467749332743953860, -0.467705139100958680, -0.467660944288700700, -0.467616748307289940, -0.467572551156837710, -0.467528352837454090, -0.467484153349249200, +-0.467439952692334350, -0.467395750866819560, -0.467351547872815460, -0.467307343710432030, -0.467263138379780670, -0.467218931880971470, -0.467174724214114930, -0.467130515379321210, +-0.467086305376701590, -0.467042094206366170, -0.466997881868425560, -0.466953668362989790, -0.466909453690170280, -0.466865237850077160, -0.466821020842820960, -0.466776802668511740, +-0.466732583327260970, -0.466688362819178690, -0.466644141144375520, -0.466599918302961660, -0.466555694295048340, -0.466511469120745760, -0.466467242780164160, -0.466423015273414840, +-0.466378786600608000, -0.466334556761854150, -0.466290325757263540, -0.466246093586947520, -0.466201860251016230, -0.466157625749580360, -0.466113390082749990, -0.466069153250636530, +-0.466024915253350160, -0.465980676091001520, -0.465936435763700860, -0.465892194271559420, -0.465847951614687560, -0.465803707793195800, -0.465759462807194320, -0.465715216656794660, +-0.465670969342106890, -0.465626720863241360, -0.465582471220309380, -0.465538220413421240, -0.465493968442687530, -0.465449715308218550, -0.465405461010125640, -0.465361205548519120, +-0.465316948923509550, -0.465272691135207190, -0.465228432183723560, -0.465184172069168790, -0.465139910791653620, -0.465095648351288250, -0.465051384748184190, -0.465007119982451640, +-0.464962854054201350, -0.464918586963543490, -0.464874318710589540, -0.464830049295449800, -0.464785778718234570, -0.464741506979055250, -0.464697234078022160, -0.464652960015246030, +-0.464608684790837060, -0.464564408404906810, -0.464520130857565550, -0.464475852148923900, -0.464431572279092260, -0.464387291248182120, -0.464343009056303710, -0.464298725703567780, +-0.464254441190084630, -0.464210155515965780, -0.464165868681321590, -0.464121580686262690, -0.464077291530899440, -0.464033001215343350, -0.463988709739704740, -0.463944417104094010, +-0.463900123308622630, -0.463855828353400890, -0.463811532238539600, -0.463767234964149120, -0.463722936530340910, -0.463678636937225390, -0.463634336184913230, -0.463590034273514860, +-0.463545731203141850, -0.463501426973904450, -0.463457121585913510, -0.463412815039279340, -0.463368507334113560, -0.463324198470526470, -0.463279888448628940, -0.463235577268531260, +-0.463191264930345070, -0.463146951434180660, -0.463102636780148900, -0.463058320968360190, -0.463014003998926000, -0.462969685871956860, -0.462925366587563060, -0.462881046145856290, +-0.462836724546946850, -0.462792401790945660, -0.462748077877963020, -0.462703752808110600, -0.462659426581498830, -0.462615099198238460, -0.462570770658439930, -0.462526440962214900, +-0.462482110109673770, -0.462437778100927340, -0.462393444936086080, -0.462349110615261630, -0.462304775138564330, -0.462260438506105150, -0.462216100717994460, -0.462171761774343940, +-0.462127421675263990, -0.462083080420865100, -0.462038738011258940, -0.461994394446555880, -0.461950049726866820, -0.461905703852302290, -0.461861356822973910, -0.461817008638992110, +-0.461772659300467790, -0.461728308807511420, -0.461683957160234640, -0.461639604358748010, -0.461595250403162400, -0.461550895293588230, -0.461506539030137220, -0.461462181612919850, +-0.461417823042047040, -0.461373463317629300, -0.461329102439778260, -0.461284740408604450, -0.461240377224218460, -0.461196012886731840, -0.461151647396255250, -0.461107280752899530, +-0.461062912956775210, -0.461018544007993970, -0.460974173906666400, -0.460929802652903400, -0.460885430246815500, -0.460841056688514440, -0.460796681978110690, -0.460752306115715270, +-0.460707929101438650, -0.460663550935392630, -0.460619171617687730, -0.460574791148434910, -0.460530409527744710, -0.460486026755728920, -0.460441642832498000, -0.460397257758163040, +-0.460352871532834500, -0.460308484156624120, -0.460264095629642600, -0.460219705952000460, -0.460175315123809440, -0.460130923145180060, -0.460086530016223460, -0.460042135737050110, +-0.459997740307771800, -0.459953343728499160, -0.459908945999343180, -0.459864547120414410, -0.459820147091824670, -0.459775745913684530, -0.459731343586105070, -0.459686940109196860, +-0.459642535483071660, -0.459598129707840140, -0.459553722783613340, -0.459509314710501770, -0.459464905488617350, -0.459420495118070650, -0.459376083598972310, -0.459331670931434180, +-0.459287257115566840, -0.459242842151481370, -0.459198426039288400, -0.459154008779099790, -0.459109590371026110, -0.459065170815178500, -0.459020750111667540, -0.458976328260605080, +-0.458931905262101870, -0.458887481116268810, -0.458843055823216720, -0.458798629383057380, -0.458754201795901430, -0.458709773061860000, -0.458665343181043740, -0.458620912153564490, +-0.458576479979532990, -0.458532046659059890, -0.458487612192257090, -0.458443176579235220, -0.458398739820105430, -0.458354301914978390, -0.458309862863966020, -0.458265422667178960, +-0.458220981324728330, -0.458176538836724880, -0.458132095203280460, -0.458087650424505830, -0.458043204500512060, -0.457998757431409890, -0.457954309217311170, -0.457909859858326720, +-0.457865409354567650, -0.457820957706144620, -0.457776504913169620, -0.457732050975753310, -0.457687595894006540, -0.457643139668041100, -0.457598682297967850, -0.457554223783897930, +-0.457509764125942020, -0.457465303324212090, -0.457420841378818890, -0.457376378289873650, -0.457331914057487020, -0.457287448681771010, -0.457242982162836380, -0.457198514500794300, +-0.457154045695755520, -0.457109575747832010, -0.457065104657134570, -0.457020632423774390, -0.456976159047862260, -0.456931684529510050, -0.456887208868828660, -0.456842732065929290, +-0.456798254120922680, -0.456753775033920780, -0.456709294805034470, -0.456664813434374540, -0.456620330922053010, -0.456575847268180570, -0.456531362472868570, -0.456486876536227770, +-0.456442389458370120, -0.456397901239406540, -0.456353411879448220, -0.456308921378605960, -0.456264429736991770, -0.456219936954716520, -0.456175443031891450, -0.456130947968627350, +-0.456086451765036260, -0.456041954421229080, -0.455997455937317000, -0.455952956313410870, -0.455908455549622780, -0.455863953646063520, -0.455819450602843960, -0.455774946420076210, +-0.455730441097871090, -0.455685934636339880, -0.455641427035593400, -0.455596918295743780, -0.455552408416901810, -0.455507897399178910, -0.455463385242685810, -0.455418871947534660, +-0.455374357513836310, -0.455329841941702060, -0.455285325231242880, -0.455240807382570720, -0.455196288395796570, -0.455151768271031650, -0.455107247008386950, -0.455062724607974530, +-0.455018201069905310, -0.454973676394290150, -0.454929150581241230, -0.454884623630869460, -0.454840095543286080, -0.454795566318602070, -0.454751035956929560, -0.454706504458379460, +-0.454661971823063060, -0.454617438051091390, -0.454572903142576480, -0.454528367097629340, -0.454483829916361270, -0.454439291598883240, -0.454394752145307390, -0.454350211555744620, +-0.454305669830306350, -0.454261126969103480, -0.454216582972248260, -0.454172037839851490, -0.454127491572024700, -0.454082944168878730, -0.454038395630525840, -0.453993845957076920, +-0.453949295148643020, -0.453904743205336250, -0.453860190127267640, -0.453815635914548600, -0.453771080567289990, -0.453726524085604150, -0.453681966469601960, -0.453637407719394870, +-0.453592847835093850, -0.453548286816811090, -0.453503724664657600, -0.453459161378744870, -0.453414596959183790, -0.453370031406086620, -0.453325464719564420, -0.453280896899728500, +-0.453236327946689940, -0.453191757860560980, -0.453147186641452650, -0.453102614289475900, -0.453058040804743050, -0.453013466187365100, -0.452968890437453480, -0.452924313555119200, +-0.452879735540474560, -0.452835156393630590, -0.452790576114698750, -0.452745994703790010, -0.452701412161016730, -0.452656828486489910, -0.452612243680320990, -0.452567657742621090, +-0.452523070673502450, -0.452478482473076150, -0.452433893141453600, -0.452389302678745940, -0.452344711085065410, -0.452300118360523140, -0.452255524505230160, -0.452210929519298750, +-0.452166333402840010, -0.452121736155965460, -0.452077137778786160, -0.452032538271414430, -0.451987937633961330, -0.451943335866538400, -0.451898732969256700, -0.451854128942228590, +-0.451809523785565210, -0.451764917499377970, -0.451720310083778000, -0.451675701538877710, -0.451631091864788170, -0.451586481061620860, -0.451541869129486960, -0.451497256068498830, +-0.451452641878767550, -0.451408026560404240, -0.451363410113521270, -0.451318792538229760, -0.451274173834641250, -0.451229554002866960, -0.451184933043019150, -0.451140310955209010, +-0.451095687739548110, -0.451051063396147590, -0.451006437925119800, -0.450961811326575920, -0.450917183600627490, -0.450872554747385750, -0.450827924766962980, -0.450783293659470450, +-0.450738661425019620, -0.450694028063721770, -0.450649393575689280, -0.450604757961033280, -0.450560121219865330, -0.450515483352296740, -0.450470844358439870, -0.450426204238405850, +-0.450381562992305920, -0.450336920620252430, -0.450292277122356700, -0.450247632498730290, -0.450202986749484390, -0.450158339874731360, -0.450113691874582560, -0.450069042749149490, +-0.450024392498543420, -0.449979741122876750, -0.449935088622260780, -0.449890434996807030, -0.449845780246626860, -0.449801124371832620, -0.449756467372535500, -0.449711809248847290, +-0.449667150000879150, -0.449622489628743460, -0.449577828132551650, -0.449533165512414790, -0.449488501768445460, -0.449443836900754850, -0.449399170909454690, -0.449354503794656130, +-0.449309835556471750, -0.449265166195012830, -0.449220495710390910, -0.449175824102717390, -0.449131151372104740, -0.449086477518664150, -0.449041802542507420, -0.448997126443745790, +-0.448952449222491720, -0.448907770878856530, -0.448863091412951890, -0.448818410824889160, -0.448773729114780750, -0.448729046282738080, -0.448684362328872320, -0.448639677253296120, +-0.448594991056120720, -0.448550303737457800, -0.448505615297418780, -0.448460925736116070, -0.448416235053661070, -0.448371543250165480, -0.448326850325740660, -0.448282156280499060, +-0.448237461114552090, -0.448192764828011460, -0.448148067420988560, -0.448103368893595870, -0.448058669245944730, -0.448013968478146950, -0.447969266590313830, -0.447924563582557940, +-0.447879859454990650, -0.447835154207723740, -0.447790447840868520, -0.447745740354537570, -0.447701031748842290, -0.447656322023893990, -0.447611611179805360, -0.447566899216687630, +-0.447522186134652670, -0.447477471933811880, -0.447432756614277780, -0.447388040176161790, -0.447343322619575710, -0.447298603944630890, -0.447253884151440020, -0.447209163240114390, +-0.447164441210765870, -0.447119718063505870, -0.447074993798446950, -0.447030268415700540, -0.446985541915378480, -0.446940814297592140, -0.446896085562454190, -0.446851355710076000, +-0.446806624740569040, -0.446761892654045870, -0.446717159450618020, -0.446672425130397290, -0.446627689693495030, -0.446582953140024000, -0.446538215470095590, -0.446493476683821610, +-0.446448736781313580, -0.446403995762684080, -0.446359253628044570, -0.446314510377506970, -0.446269766011182680, -0.446225020529184340, -0.446180273931623460, -0.446135526218611910, +-0.446090777390261150, -0.446046027446683870, -0.446001276387991470, -0.445956524214295550, -0.445911770925708660, -0.445867016522342340, -0.445822261004308500, -0.445777504371718590, +-0.445732746624685370, -0.445687987763320250, -0.445643227787735130, -0.445598466698041600, -0.445553704494352280, -0.445508941176778640, -0.445464176745432710, -0.445419411200425940, +-0.445374644541871030, -0.445329876769879510, -0.445285107884563270, -0.445240337886033900, -0.445195566774404080, -0.445150794549785340, -0.445106021212289200, -0.445061246762028410, +-0.445016471199114530, -0.444971694523659420, -0.444926916735774720, -0.444882137835573120, -0.444837357823166190, -0.444792576698665840, -0.444747794462183650, -0.444703011113832370, +-0.444658226653723570, -0.444613441081969210, -0.444568654398680820, -0.444523866603971250, -0.444479077697951970, -0.444434287680735010, -0.444389496552431930, -0.444344704313155480, +-0.444299910963017300, -0.444255116502129340, -0.444210320930603200, -0.444165524248551660, -0.444120726456086250, -0.444075927553318710, -0.444031127540361670, -0.443986326417326880, +-0.443941524184326250, -0.443896720841471360, -0.443851916388875170, -0.443807110826649090, -0.443762304154905310, -0.443717496373755290, -0.443672687483312010, -0.443627877483686980, +-0.443583066374992230, -0.443538254157339440, -0.443493440830841410, -0.443448626395609780, -0.443403810851756620, -0.443358994199393450, -0.443314176438633250, -0.443269357569587630, +-0.443224537592368180, -0.443179716507087760, -0.443134894313858110, -0.443090071012791190, -0.443045246603998690, -0.443000421087593520, -0.442955594463687260, -0.442910766732391990, +-0.442865937893819450, -0.442821107948082440, -0.442776276895292640, -0.442731444735562200, -0.442686611469002730, -0.442641777095727110, -0.442596941615847060, -0.442552105029474670, +-0.442507267336721580, -0.442462428537700740, -0.442417588632523840, -0.442372747621302580, -0.442327905504149800, -0.442283062281177310, -0.442238217952497130, -0.442193372518221050, +-0.442148525978461880, -0.442103678333331420, -0.442058829582941790, -0.442013979727404640, -0.441969128766832970, -0.441924276701338490, -0.441879423531033320, -0.441834569256029150, +-0.441789713876439010, -0.441744857392374570, -0.441699999803947970, -0.441655141111270970, -0.441610281314456510, -0.441565420413616350, -0.441520558408862670, -0.441475695300307170, +-0.441430831088062800, -0.441385965772241430, -0.441341099352954680, -0.441296231830315630, -0.441251363204435980, -0.441206493475427900, -0.441161622643403200, -0.441116750708474840, +-0.441071877670754620, -0.441027003530354680, -0.440982128287386870, -0.440937251941964090, -0.440892374494198210, -0.440847495944201420, -0.440802616292085450, -0.440757735537963380, +-0.440712853681946900, -0.440667970724148370, -0.440623086664679480, -0.440578201503653230, -0.440533315241181500, -0.440488427877376130, -0.440443539412350040, -0.440398649846215130, +-0.440353759179083590, -0.440308867411067230, -0.440263974542279110, -0.440219080572831100, -0.440174185502835320, -0.440129289332403690, -0.440084392061649290, -0.440039493690683850, +-0.439994594219619730, -0.439949693648568670, -0.439904791977643820, -0.439859889206956960, -0.439814985336620390, -0.439770080366745920, -0.439725174297446730, -0.439680267128834510, +-0.439635358861021290, -0.439590449494120070, -0.439545539028242730, -0.439500627463501490, -0.439455714800008330, -0.439410801037876280, -0.439365886177217170, -0.439320970218143430, +-0.439276053160766790, -0.439231135005200450, -0.439186215751556310, -0.439141295399946560, -0.439096373950483230, -0.439051451403279340, -0.439006527758446840, -0.438961603016097990, +-0.438916677176344750, -0.438871750239300200, -0.438826822205076290, -0.438781893073784960, -0.438736962845539260, -0.438692031520451160, -0.438647099098632980, -0.438602165580196600, +-0.438557230965255280, -0.438512295253920880, -0.438467358446305690, -0.438422420542521730, -0.438377481542682130, -0.438332541446898820, -0.438287600255284180, -0.438242657967950090, +-0.438197714585009780, -0.438152770106575220, -0.438107824532758650, -0.438062877863672210, -0.438017930099428910, -0.437972981240140840, -0.437928031285920280, -0.437883080236879220, +-0.437838128093130880, -0.437793174854787250, -0.437748220521960270, -0.437703265094763150, -0.437658308573307840, -0.437613350957706760, -0.437568392248071920, -0.437523432444516470, +-0.437478471547152470, -0.437433509556092280, -0.437388546471447930, -0.437343582293332590, -0.437298617021858290, -0.437253650657137450, -0.437208683199282130, -0.437163714648405420, +-0.437118745004619500, -0.437073774268036670, -0.437028802438769020, -0.436983829516929770, -0.436938855502630950, -0.436893880395984590, -0.436848904197103930, -0.436803926906101040, +-0.436758948523088280, -0.436713969048177770, -0.436668988481482720, -0.436624006823115200, -0.436579024073187720, -0.436534040231812190, -0.436489055299102040, -0.436444069275169210, +-0.436399082160126180, -0.436354093954085090, -0.436309104657159160, -0.436264114269460490, -0.436219122791101480, -0.436174130222194310, -0.436129136562852180, -0.436084141813187220, +-0.436039145973311500, -0.435994149043338330, -0.435949151023379830, -0.435904151913548370, -0.435859151713956170, -0.435814150424716500, -0.435769148045941470, -0.435724144577743500, +-0.435679140020234830, -0.435634134373528710, -0.435589127637737220, -0.435544119812972920, -0.435499110899347950, -0.435454100896975560, -0.435409089805967930, -0.435364077626437580, +-0.435319064358496650, -0.435274050002258440, -0.435229034557835130, -0.435184018025339240, -0.435139000404882850, -0.435093981696579420, -0.435048961900540990, -0.435003941016879780, +-0.434958919045709100, -0.434913895987141140, -0.434868871841288420, -0.434823846608263180, -0.434778820288178660, -0.434733792881147110, -0.434688764387281050, -0.434643734806692720, +-0.434598704139495420, -0.434553672385801390, -0.434508639545723160, -0.434463605619372970, -0.434418570606864120, -0.434373534508308850, -0.434328497323819780, -0.434283459053509010, +-0.434238419697490050, -0.434193379255874980, -0.434148337728776150, -0.434103295116306800, -0.434058251418579230, -0.434013206635706030, -0.433968160767799430, -0.433923113814972840, +-0.433878065777338400, -0.433833016655008840, -0.433787966448096360, -0.433742915156714310, -0.433697862780975050, -0.433652809320991100, -0.433607754776874690, -0.433562699148739290, +-0.433517642436697210, -0.433472584640860970, -0.433427525761342860, -0.433382465798256400, -0.433337404751713730, -0.433292342621827140, -0.433247279408710110, -0.433202215112474860, +-0.433157149733234100, -0.433112083271100070, -0.433067015726186220, -0.433021947098604810, -0.432976877388468570, -0.432931806595889700, -0.432886734720981770, -0.432841661763856970, +-0.432796587724627980, -0.432751512603407160, -0.432706436400307930, -0.432661359115442680, -0.432616280748923940, -0.432571201300864130, -0.432526120771376750, -0.432481039160574070, +-0.432435956468568360, -0.432390872695473160, -0.432345787841400760, -0.432300701906463970, -0.432255614890774960, -0.432210526794447330, -0.432165437617593350, -0.432120347360325840, +-0.432075256022756980, -0.432030163605000460, -0.431985070107168470, -0.431939975529373850, -0.431894879871728870, -0.431849783134347130, -0.431804685317340900, -0.431759586420822910, +-0.431714486444905620, -0.431669385389702510, -0.431624283255325920, -0.431579180041888610, -0.431534075749502980, -0.431488970378282490, -0.431443863928339670, -0.431398756399786750, +-0.431353647792737330, -0.431308538107303800, -0.431263427343598900, -0.431218315501735060, -0.431173202581825840, -0.431128088583983600, -0.431082973508321140, -0.431037857354950820, +-0.430992740123986310, -0.430947621815539920, -0.430902502429724440, -0.430857381966652350, -0.430812260426437220, -0.430767137809191400, -0.430722014115027750, -0.430676889344058680, +-0.430631763496397760, -0.430586636572157460, -0.430541508571450130, -0.430496379494389460, -0.430451249341087860, -0.430406118111658080, -0.430360985806212630, -0.430315852424865140, +-0.430270717967727980, -0.430225582434914040, -0.430180445826535750, -0.430135308142706780, -0.430090169383539500, -0.430045029549146810, -0.429999888639641110, -0.429954746655136110, +-0.429909603595744260, -0.429864459461578420, -0.429819314252750990, -0.429774167969375680, -0.429729020611564980, -0.429683872179431270, -0.429638722673088340, -0.429593572092648590, +-0.429548420438224890, -0.429503267709929750, -0.429458113907876860, -0.429412959032178630, -0.429367803082948090, -0.429322646060297570, -0.429277487964340840, -0.429232328795190410, +-0.429187168552959190, -0.429142007237759580, -0.429096844849705390, -0.429051681388909090, -0.429006516855483580, -0.428961351249541380, -0.428916184571196180, -0.428871016820560560, +-0.428825847997747370, -0.428780678102869180, -0.428735507136039700, -0.428690335097371420, -0.428645161986976890, -0.428599987804969880, -0.428554812551462940, -0.428509636226568900, +-0.428464458830400410, -0.428419280363071200, -0.428374100824693740, -0.428328920215381050, -0.428283738535245650, -0.428238555784401290, -0.428193371962960530, -0.428148187071036410, +-0.428103001108741390, -0.428057814076189260, -0.428012625973492540, -0.427967436800764320, -0.427922246558117110, -0.427877055245664660, -0.427831862863519600, -0.427786669411794440, +-0.427741474890603050, -0.427696279300057940, -0.427651082640272180, -0.427605884911358260, -0.427560686113430070, -0.427515486246600130, -0.427470285310981470, -0.427425083306686720, +-0.427379880233829670, -0.427334676092522900, -0.427289470882879440, -0.427244264605011910, -0.427199057259034120, -0.427153848845058690, -0.427108639363198650, -0.427063428813566570, +-0.427018217196276360, -0.426973004511440600, -0.426927790759171920, -0.426882575939584120, -0.426837360052789940, -0.426792143098902340, -0.426746925078034020, -0.426701705990298720, +-0.426656485835809170, -0.426611264614678460, -0.426566042327019170, -0.426520818972945140, -0.426475594552569060, -0.426430369066004010, -0.426385142513362680, -0.426339914894758860, +-0.426294686210305250, -0.426249456460114920, -0.426204225644300550, -0.426158993762976000, -0.426113760816253960, -0.426068526804247170, -0.426023291727069430, -0.425978055584833480, +-0.425932818377652340, -0.425887580105638820, -0.425842340768906700, -0.425797100367568790, -0.425751858901738060, -0.425706616371527350, -0.425661372777050410, -0.425616128118420090, +-0.425570882395749470, -0.425525635609151240, -0.425480387758739310, -0.425435138844626410, -0.425389888866925640, -0.425344637825749770, -0.425299385721212670, -0.425254132553427140, +-0.425208878322506310, -0.425163623028562860, -0.425118366671710710, -0.425073109252062710, -0.425027850769731490, -0.424982591224831060, -0.424937330617474180, -0.424892068947773930, +-0.424846806215843140, -0.424801542421795690, -0.424756277565744410, -0.424711011647802450, -0.424665744668082550, -0.424620476626698660, -0.424575207523763600, -0.424529937359390540, +-0.424484666133692230, -0.424439393846782640, -0.424394120498774560, -0.424348846089781240, -0.424303570619915360, -0.424258294089290940, -0.424213016498020790, -0.424167737846217700, +-0.424122458133995680, -0.424077177361467490, -0.424031895528746370, -0.423986612635945110, -0.423941328683177740, -0.423896043670557050, -0.423850757598196240, -0.423805470466208090, +-0.423760182274706740, -0.423714893023804880, -0.423669602713615810, -0.423624311344252320, -0.423579018915828500, -0.423533725428457080, -0.423488430882251350, -0.423443135277324130, +-0.423397838613789490, -0.423352540891760280, -0.423307242111349290, -0.423261942272670610, -0.423216641375837090, -0.423171339420961910, -0.423126036408158050, -0.423080732337539460, +-0.423035427209219050, -0.422990121023310070, -0.422944813779925380, -0.422899505479179040, -0.422854196121183970, -0.422808885706053410, -0.422763574233900210, -0.422718261704838450, +-0.422672948118981100, -0.422627633476441330, -0.422582317777332130, -0.422537001021767500, -0.422491683209860360, -0.422446364341724000, -0.422401044417471390, -0.422355723437216500, +-0.422310401401072340, -0.422265078309151780, -0.422219754161568930, -0.422174428958436650, -0.422129102699868360, -0.422083775385976860, -0.422038447016876370, -0.421993117592679710, +-0.421947787113500280, -0.421902455579451000, -0.421857122990645980, -0.421811789347198150, -0.421766454649220800, -0.421721118896826950, -0.421675782090130740, -0.421630444229245000, +-0.421585105314283230, -0.421539765345358200, -0.421494424322584220, -0.421449082246074190, -0.421403739115941030, -0.421358394932298930, -0.421313049695260840, -0.421267703404940130, +-0.421222356061449750, -0.421177007664903900, -0.421131658215415540, -0.421086307713097960, -0.421040956158064310, -0.420995603550428590, -0.420950249890303880, -0.420904895177803610, +-0.420859539413040660, -0.420814182596129240, -0.420768824727182360, -0.420723465806313420, -0.420678105833635460, -0.420632744809262600, -0.420587382733307870, -0.420542019605884330, +-0.420496655427106130, -0.420451290197086270, -0.420405923915938170, -0.420360556583774860, -0.420315188200710620, -0.420269818766858320, -0.420224448282331520, -0.420179076747243200, +-0.420133704161707590, -0.420088330525837720, -0.420042955839747050, -0.419997580103548540, -0.419952203317356500, -0.419906825481284000, -0.419861446595444390, -0.419816066659950750, +-0.419770685674917320, -0.419725303640457240, -0.419679920556683460, -0.419634536423710290, -0.419589151241650800, -0.419543765010618410, -0.419498377730726240, -0.419452989402088470, +-0.419407600024818250, -0.419362209599029030, -0.419316818124833900, -0.419271425602347150, -0.419226032031681790, -0.419180637412951360, -0.419135241746268930, -0.419089845031748790, +-0.419044447269504070, -0.418999048459648190, -0.418953648602294340, -0.418908247697556750, -0.418862845745548550, -0.418817442746383220, -0.418772038700173880, -0.418726633607034830, +-0.418681227467079200, -0.418635820280420120, -0.418590412047171900, -0.418545002767447600, -0.418499592441360870, -0.418454181069024710, -0.418408768650553490, -0.418363355186060380, +-0.418317940675658860, -0.418272525119462110, -0.418227108517584380, -0.418181690870138960, -0.418136272177239250, -0.418090852438998520, -0.418045431655531040, -0.418000009826949960, +-0.417954586953368900, -0.417909163034900940, -0.417863738071660440, -0.417818312063760630, -0.417772885011314650, -0.417727456914436860, -0.417682027773240430, -0.417636597587838890, +-0.417591166358345480, -0.417545734084874550, -0.417500300767539300, -0.417454866406453300, -0.417409431001729720, -0.417363994553482940, -0.417318557061826250, -0.417273118526873100, +-0.417227678948736750, -0.417182238327531650, -0.417136796663370890, -0.417091353956368200, -0.417045910206636730, -0.417000465414290810, -0.416955019579443810, -0.416909572702208800, +-0.416864124782700300, -0.416818675821031490, -0.416773225817315960, -0.416727774771666950, -0.416682322684198970, -0.416636869555025100, -0.416591415384259140, -0.416545960172014170, +-0.416500503918404760, -0.416455046623544050, -0.416409588287545760, -0.416364128910523050, -0.416318668492590470, -0.416273207033861170, -0.416227744534448880, -0.416182280994466800, +-0.416136816414029500, -0.416091350793250050, -0.416045884132242310, -0.416000416431119400, -0.415954947689995910, -0.415909477908984970, -0.415864007088199980, -0.415818535227755410, +-0.415773062327764450, -0.415727588388340840, -0.415682113409597880, -0.415636637391650020, -0.415591160334610580, -0.415545682238593230, -0.415500203103711270, -0.415454722930079230, +-0.415409241717810350, -0.415363759467018370, -0.415318276177816580, -0.415272791850319570, -0.415227306484640510, -0.415181820080893220, -0.415136332639190920, -0.415090844159648250, +-0.415045354642378460, -0.414999864087494900, -0.414954372495112020, -0.414908879865343250, -0.414863386198302260, -0.414817891494102420, -0.414772395752858290, -0.414726898974683120, +-0.414681401159690710, -0.414635902307994410, -0.414590402419708740, -0.414544901494947050, -0.414499399533823140, -0.414453896536450320, -0.414408392502943150, -0.414362887433415040, +-0.414317381327979680, -0.414271874186750430, -0.414226366009841920, -0.414180856797367550, -0.414135346549440560, -0.414089835266175650, -0.414044322947686120, -0.413998809594085800, +-0.413953295205488070, -0.413907779782007490, -0.413862263323757470, -0.413816745830851760, -0.413771227303403820, -0.413725707741528230, -0.413680187145338330, -0.413634665514947990, +-0.413589142850470550, -0.413543619152020650, -0.413498094419711750, -0.413452568653657590, -0.413407041853971590, -0.413361514020768430, -0.413315985154161460, -0.413270455254264530, +-0.413224924321191070, -0.413179392355055690, -0.413133859355971800, -0.413088325324052870, -0.413042790259413590, -0.412997254162167260, -0.412951717032427830, -0.412906178870308730, +-0.412860639675924510, -0.412815099449388770, -0.412769558190815230, -0.412724015900317430, -0.412678472578009990, -0.412632928224006320, -0.412587382838420390, -0.412541836421365550, +-0.412496288972956540, -0.412450740493306820, -0.412405190982530260, -0.412359640440740300, -0.412314088868051650, -0.412268536264577770, -0.412222982630432170, -0.412177427965729480, +-0.412131872270583230, -0.412086315545107270, -0.412040757789415180, -0.411995199003621580, -0.411949639187839940, -0.411904078342184290, -0.411858516466767970, -0.411812953561705770, +-0.411767389627111180, -0.411721824663098150, -0.411676258669780140, -0.411630691647271900, -0.411585123595686890, -0.411539554515139130, -0.411493984405742030, -0.411448413267610390, +-0.411402841100857730, -0.411357267905597570, -0.411311693681944590, -0.411266118430012430, -0.411220542149914940, -0.411174964841765690, -0.411129386505679480, -0.411083807141769790, +-0.411038226750150560, -0.410992645330935320, -0.410947062884238930, -0.410901479410174850, -0.410855894908857100, -0.410810309380399200, -0.410764722824915940, -0.410719135242520850, +-0.410673546633327950, -0.410627956997450750, -0.410582366335004110, -0.410536774646101500, -0.410491181930856600, -0.410445588189384090, -0.410399993421797670, -0.410354397628211240, +-0.410308800808738380, -0.410263202963493940, -0.410217604092591500, -0.410172004196145080, -0.410126403274268190, -0.410080801327075750, -0.410035198354681270, -0.409989594357198840, +-0.409943989334741970, -0.409898383287425560, -0.409852776215363150, -0.409807168118668850, -0.409761558997456200, -0.409715948851840040, -0.409670337681934060, -0.409624725487852230, +-0.409579112269708110, -0.409533498027616680, -0.409487882761691510, -0.409442266472046180, -0.409396649158795590, -0.409351030822053430, -0.409305411461933670, -0.409259791078549980, +-0.409214169672017180, -0.409168547242449000, -0.409122923789959460, -0.409077299314662190, -0.409031673816672050, -0.408986047296102720, -0.408940419753068330, -0.408894791187682460, +-0.408849161600060020, -0.408803530990314630, -0.408757899358560440, -0.408712266704911120, -0.408666633029481530, -0.408620998332385350, -0.408575362613736280, -0.408529725873649220, +-0.408484088112237800, -0.408438449329616200, -0.408392809525898070, -0.408347168701198300, -0.408301526855630590, -0.408255883989309120, -0.408210240102347520, -0.408164595194860700, +-0.408118949266962410, -0.408073302318766710, -0.408027654350387400, -0.407982005361939350, -0.407936355353536230, -0.407890704325292290, -0.407845052277321150, -0.407799399209737790, +-0.407753745122655940, -0.407708090016189350, -0.407662433890452920, -0.407616776745560410, -0.407571118581625920, -0.407525459398763280, -0.407479799197087320, -0.407434137976711960, +-0.407388475737751170, -0.407342812480318840, -0.407297148204529890, -0.407251482910498010, -0.407205816598337490, -0.407160149268161960, -0.407114480920086510, -0.407068811554224860, +-0.407023141170691160, -0.406977469769599200, -0.406931797351064000, -0.406886123915199290, -0.406840449462119280, -0.406794773991937700, -0.406749097504769620, -0.406703420000728790, +-0.406657741479929000, -0.406612061942485280, -0.406566381388511420, -0.406520699818121560, -0.406475017231429590, -0.406429333628550440, -0.406383649009598000, -0.406337963374686420, +-0.406292276723929480, -0.406246589057442320, -0.406200900375338620, -0.406155210677732750, -0.406109519964738430, -0.406063828236470690, -0.406018135493043390, -0.405972441734570700, +-0.405926746961166600, -0.405881051172945980, -0.405835354370022720, -0.405789656552510700, -0.405743957720524910, -0.405698257874179240, -0.405652557013587930, -0.405606855138864850, +-0.405561152250125010, -0.405515448347482270, -0.405469743431050970, -0.405424037500944860, -0.405378330557279070, -0.405332622600167450, -0.405286913629724240, -0.405241203646063420, +-0.405195492649299940, -0.405149780639547760, -0.405104067616921080, -0.405058353581533860, -0.405012638533501170, -0.404966922472936860, -0.404921205399954850, -0.404875487314670270, +-0.404829768217196910, -0.404784048107649170, -0.404738326986140870, -0.404692604852787190, -0.404646881707701970, -0.404601157550999570, -0.404555432382793840, -0.404509706203199980, +-0.404463979012331830, -0.404418250810303750, -0.404372521597229640, -0.404326791373224580, -0.404281060138402590, -0.404235327892877920, -0.404189594636764570, -0.404143860370177580, +-0.404098125093230950, -0.404052388806038660, -0.404006651508715730, -0.403960913201376230, -0.403915173884134450, -0.403869433557104310, -0.403823692220400930, -0.403777949874138400, +-0.403732206518430950, -0.403686462153392600, -0.403640716779138540, -0.403594970395782630, -0.403549223003439320, -0.403503474602222520, -0.403457725192247480, -0.403411974773628110, +-0.403366223346478760, -0.403320470910913500, -0.403274717467047460, -0.403228963014994610, -0.403183207554869360, -0.403137451086785730, -0.403091693610858840, -0.403045935127202660, +-0.403000175635931320, -0.402954415137159900, -0.402908653631002480, -0.402862891117573400, -0.402817127596986680, -0.402771363069357570, -0.402725597534800030, -0.402679830993428520, +-0.402634063445357020, -0.402588294890700750, -0.402542525329573740, -0.402496754762090460, -0.402450983188364860, -0.402405210608512200, -0.402359437022646540, -0.402313662430882240, +-0.402267886833333420, -0.402222110230115280, -0.402176332621341840, -0.402130554007127160, -0.402084774387586550, -0.402038993762833970, -0.401993212132983950, -0.401947429498150430, +-0.401901645858448790, -0.401855861213992970, -0.401810075564897560, -0.401764288911276580, -0.401718501253245210, -0.401672712590917640, -0.401626922924408270, -0.401581132253831190, +-0.401535340579301680, -0.401489547900933770, -0.401443754218842040, -0.401397959533140560, -0.401352163843944510, -0.401306367151368140, -0.401260569455525350, -0.401214770756531610, +-0.401168971054500890, -0.401123170349547810, -0.401077368641786340, -0.401031565931331880, -0.400985762218298510, -0.400939957502800700, -0.400894151784952630, -0.400848345064869550, +-0.400802537342665630, -0.400756728618455400, -0.400710918892352890, -0.400665108164473480, -0.400619296434931380, -0.400573483703840940, -0.400527669971316450, -0.400481855237473150, +-0.400436039502425290, -0.400390222766287270, -0.400344405029173290, -0.400298586291198690, -0.400252766552477660, -0.400206945813124270, -0.400161124073253940, -0.400115301332980790, +-0.400069477592419400, -0.400023652851683900, -0.399977827110889690, -0.399932000370150920, -0.399886172629582150, -0.399840343889297510, -0.399794514149412420, -0.399748683410041050, +-0.399702851671297990, -0.399657018933297410, -0.399611185196154680, -0.399565350459983930, -0.399519514724899880, -0.399473677991016570, -0.399427840258449520, -0.399382001527312850, +-0.399336161797720750, -0.399290321069788680, -0.399244479343630830, -0.399198636619361720, -0.399152792897095650, -0.399106948176948030, -0.399061102459033030, -0.399015255743465250, +-0.398969408030358910, -0.398923559319829480, -0.398877709611991150, -0.398831858906958550, -0.398786007204845860, -0.398740154505768610, -0.398694300809840970, -0.398648446117177540, +-0.398602590427892640, -0.398556733742101600, -0.398510876059918810, -0.398465017381458340, -0.398419157706835780, -0.398373297036165310, -0.398327435369561610, -0.398281572707138930, +-0.398235709049012730, -0.398189844395297200, -0.398143978746107070, -0.398098112101556660, -0.398052244461761300, -0.398006375826835350, -0.397960506196893490, -0.397914635572049920, +-0.397868763952420210, -0.397822891338118540, -0.397777017729259660, -0.397731143125957860, -0.397685267528328560, -0.397639390936486150, -0.397593513350544770, -0.397547634770620110, +-0.397501755196826290, -0.397455874629278120, -0.397409993068089830, -0.397364110513377000, -0.397318226965253870, -0.397272342423835190, -0.397226456889235250, -0.397180570361569560, +-0.397134682840952440, -0.397088794327498610, -0.397042904821322370, -0.396997014322539310, -0.396951122831263710, -0.396905230347610270, -0.396859336871693390, -0.396813442403628590, +-0.396767546943530110, -0.396721650491512810, -0.396675753047690980, -0.396629854612180200, -0.396583955185094760, -0.396538054766549020, -0.396492153356658550, -0.396446250955537650, +-0.396400347563301170, -0.396354443180063410, -0.396308537805940000, -0.396262631441045180, -0.396216724085493800, -0.396170815739400160, -0.396124906402879950, -0.396078996076047460, +-0.396033084759017500, -0.395987172451904350, -0.395941259154823750, -0.395895344867889960, -0.395849429591217830, -0.395803513324921700, -0.395757596069117200, -0.395711677823918750, +-0.395665758589440640, -0.395619838365798560, -0.395573917153106910, -0.395527994951480440, -0.395482071761033560, -0.395436147581881950, -0.395390222414139960, -0.395344296257922390, +-0.395298369113343650, -0.395252440980519480, -0.395206511859564120, -0.395160581750592540, -0.395114650653719090, -0.395068718569059400, -0.395022785496727920, -0.394976851436839470, +-0.394930916389508500, -0.394884980354850650, -0.394839043332980310, -0.394793105324012020, -0.394747166328061340, -0.394701226345242740, -0.394655285375671070, -0.394609343419460800, +-0.394563400476727550, -0.394517456547585800, -0.394471511632150440, -0.394425565730535890, -0.394379618842857830, -0.394333670969230670, -0.394287722109769370, -0.394241772264588400, +-0.394195821433803330, -0.394149869617528790, -0.394103916815879530, -0.394057963028970060, -0.394012008256916120, -0.393966052499832130, -0.393920095757833040, -0.393874138031033270, +-0.393828179319548550, -0.393782219623493410, -0.393736258942982360, -0.393690297278130990, -0.393644334629053900, -0.393598370995866030, -0.393552406378681770, -0.393506440777616930, +-0.393460474192785960, -0.393414506624303830, -0.393368538072285000, -0.393322568536845220, -0.393276598018099060, -0.393230626516161360, -0.393184654031146720, -0.393138680563170860, +-0.393092706112348310, -0.393046730678793920, -0.393000754262622380, -0.392954776863949310, -0.392908798482889340, -0.392862819119556950, -0.392816838774067920, -0.392770857446536780, +-0.392724875137078490, -0.392678891845807620, -0.392632907572839920, -0.392586922318289950, -0.392540936082272700, -0.392494948864902660, -0.392448960666295700, -0.392402971486566330, +-0.392356981325829520, -0.392310990184199850, -0.392264998061793100, -0.392219004958723860, -0.392173010875107090, -0.392127015811057410, -0.392081019766690630, -0.392035022742121260, +-0.391989024737463940, -0.391943025752834460, -0.391897025788347400, -0.391851024844117820, -0.391805022920260200, -0.391759020016890500, -0.391713016134123240, -0.391667011272073430, +-0.391621005430855650, -0.391574998610585810, -0.391528990811378430, -0.391482982033348580, -0.391436972276610890, -0.391390961541281220, -0.391344949827474090, -0.391298937135304560, +-0.391252923464887330, -0.391206908816338180, -0.391160893189771760, -0.391114876585302700, -0.391068859003046890, -0.391022840443118860, -0.390976820905633790, -0.390930800390706270, +-0.390884778898452080, -0.390838756428986020, -0.390792732982423010, -0.390746708558877830, -0.390700683158466230, -0.390654656781302960, -0.390608629427503020, -0.390562601097181110, +-0.390516571790453070, -0.390470541507433650, -0.390424510248237820, -0.390378478012980370, -0.390332444801777090, -0.390286410614742730, -0.390240375451992360, -0.390194339313640610, +-0.390148302199803400, -0.390102264110595450, -0.390056225046131470, -0.390010185006527290, -0.389964143991897660, -0.389918102002357660, -0.389872059038022020, -0.389826015099006610, +-0.389779970185426210, -0.389733924297395840, -0.389687877435030310, -0.389641829598445400, -0.389595780787755970, -0.389549731003077100, -0.389503680244523480, -0.389457628512211110, +-0.389411575806254630, -0.389365522126769170, -0.389319467473869530, -0.389273411847671670, -0.389227355248290220, -0.389181297675840030, -0.389135239130436960, -0.389089179612195800, +-0.389043119121231740, -0.388997057657659410, -0.388950995221594880, -0.388904931813152830, -0.388858867432448460, -0.388812802079596560, -0.388766735754712990, -0.388720668457912640, +-0.388674600189310600, -0.388628530949021610, -0.388582460737161790, -0.388536389553845730, -0.388490317399188770, -0.388444244273305540, -0.388398170176312170, -0.388352095108323300, +-0.388306019069453830, -0.388259942059819730, -0.388213864079535790, -0.388167785128717140, -0.388121705207478680, -0.388075624315936340, -0.388029542454204900, -0.387983459622399660, +-0.387937375820635310, -0.387891291049027980, -0.387845205307692400, -0.387799118596743760, -0.387753030916296980, -0.387706942266468010, -0.387660852647371710, -0.387614762059123210, +-0.387568670501837460, -0.387522577975630440, -0.387476484480616950, -0.387430390016912260, -0.387384294584631190, -0.387338198183889760, -0.387292100814802860, -0.387246002477485310, +-0.387199903172053160, -0.387153802898621220, -0.387107701657304850, -0.387061599448218720, -0.387015496271479080, -0.386969392127200660, -0.386923287015498770, -0.386877180936488260, +-0.386831073890285150, -0.386784965877004390, -0.386738856896761240, -0.386692746949670540, -0.386646636035848370, -0.386600524155409630, -0.386554411308469570, -0.386508297495143040, +-0.386462182715546170, -0.386416066969793910, -0.386369950258001030, -0.386323832580283690, -0.386277713936756750, -0.386231594327535510, -0.386185473752734930, -0.386139352212471030, +-0.386093229706858780, -0.386047106236013460, -0.386000981800049940, -0.385954856399084390, -0.385908730033231730, -0.385862602702607190, -0.385816474407325750, -0.385770345147503520, +-0.385724214923255480, -0.385678083734696860, -0.385631951581942630, -0.385585818465108920, -0.385539684384310690, -0.385493549339662840, -0.385447413331281520, -0.385401276359281620, +-0.385355138423778610, -0.385308999524887290, -0.385262859662723890, -0.385216718837403330, -0.385170577049041010, -0.385124434297751780, -0.385078290583651950, -0.385032145906856360, +-0.384986000267480370, -0.384939853665638990, -0.384893706101448410, -0.384847557575023540, -0.384801408086479780, -0.384755257635932100, -0.384709106223496690, -0.384662953849288500, +-0.384616800513422510, -0.384570646216014940, -0.384524490957180780, -0.384478334737035350, -0.384432177555693700, -0.384386019413272000, -0.384339860309885260, -0.384293700245648910, +-0.384247539220677840, -0.384201377235088350, -0.384155214288995410, -0.384109050382514470, -0.384062885515760450, -0.384016719688849650, -0.383970552901897020, -0.383924385155018030, +-0.383878216448327700, -0.383832046781942220, -0.383785876155976590, -0.383739704570546290, -0.383693532025766340, -0.383647358521752910, -0.383601184058621150, -0.383555008636486010, +-0.383508832255463730, -0.383462654915669390, -0.383416476617218390, -0.383370297360225820, -0.383324117144807910, -0.383277935971079680, -0.383231753839156640, -0.383185570749153770, +-0.383139386701187410, -0.383093201695372590, -0.383047015731824760, -0.383000828810658940, -0.382954640931991550, -0.382908452095937490, -0.382862262302612280, -0.382816071552131040, +-0.382769879844610030, -0.382723687180164360, -0.382677493558909010, -0.382631298980960320, -0.382585103446433430, -0.382538906955443790, -0.382492709508106430, -0.382446511104537700, +-0.382400311744852730, -0.382354111429166980, -0.382307910157595520, -0.382261707930254710, -0.382215504747259630, -0.382169300608725780, -0.382123095514768250, -0.382076889465503390, +-0.382030682461046320, -0.381984474501512570, -0.381938265587017210, -0.381892055717676590, -0.381845844893605850, -0.381799633114920050, -0.381753420381735600, -0.381707206694167580, +-0.381660992052331560, -0.381614776456342670, -0.381568559906317220, -0.381522342402370370, -0.381476123944617720, -0.381429904533174270, -0.381383684168156490, -0.381337462849679560, +-0.381291240577858900, -0.381245017352809750, -0.381198793174648500, -0.381152568043490240, -0.381106341959450530, -0.381060114922644580, -0.381013886933188770, -0.380967657991198250, +-0.380921428096788530, -0.380875197250074900, -0.380828965451173620, -0.380782732700199970, -0.380736498997269080, -0.380690264342497360, -0.380644028735999950, -0.380597792177892470, +-0.380551554668290100, -0.380505316207309260, -0.380459076795065130, -0.380412836431673340, -0.380366595117249020, -0.380320352851908570, -0.380274109635767300, -0.380227865468940770, +-0.380181620351544130, -0.380135374283693870, -0.380089127265505140, -0.380042879297093630, -0.379996630378574510, -0.379950380510064190, -0.379904129691677970, -0.379857877923530980, +-0.379811625205739690, -0.379765371538419380, -0.379719116921685640, -0.379672861355653650, -0.379626604840439970, -0.379580347376159750, -0.379534088962928670, -0.379487829600861970, +-0.379441569290076050, -0.379395308030686270, -0.379349045822808210, -0.379302782666557090, -0.379256518562049450, -0.379210253509400520, -0.379163987508725930, -0.379117720560140980, +-0.379071452663762130, -0.379025183819704680, -0.378978914028083810, -0.378932643289016100, -0.378886371602616790, -0.378840098969001560, -0.378793825388285600, -0.378747550860585540, +-0.378701275386016610, -0.378654998964694510, -0.378608721596734420, -0.378562443282253020, -0.378516164021365450, -0.378469883814187500, -0.378423602660834470, -0.378377320561422810, +-0.378331037516067840, -0.378284753524885280, -0.378238468587990430, -0.378192182705499810, -0.378145895877528730, -0.378099608104192520, -0.378053319385607660, -0.378007029721889540, +-0.377960739113153870, -0.377914447559515860, -0.377868155061092230, -0.377821861617998130, -0.377775567230349440, -0.377729271898261390, -0.377682975621850600, -0.377636678401232330, +-0.377590380236522420, -0.377544081127836110, -0.377497781075290030, -0.377451480078999480, -0.377405178139080200, -0.377358875255647600, -0.377312571428818240, -0.377266266658707440, +-0.377219960945430920, -0.377173654289104150, -0.377127346689843660, -0.377081038147764720, -0.377034728662982880, -0.376988418235614580, -0.376942106865775230, -0.376895794553580630, +-0.376849481299146080, -0.376803167102588320, -0.376756851964022590, -0.376710535883564730, -0.376664218861330170, -0.376617900897435410, -0.376571581991995920, -0.376525262145127490, +-0.376478941356945480, -0.376432619627566520, -0.376386296957106070, -0.376339973345679810, -0.376293648793403210, -0.376247323300392960, -0.376200996866764340, -0.376154669492632820, +-0.376108341178115040, -0.376062011923326440, -0.376015681728382790, -0.375969350593399530, -0.375923018518493300, -0.375876685503779510, -0.375830351549374050, -0.375784016655392240, +-0.375737680821950860, -0.375691344049165210, -0.375645006337151250, -0.375598667686024350, -0.375552328095901220, -0.375505987566897240, -0.375459646099128300, -0.375413303692709810, +-0.375366960347758460, -0.375320616064389770, -0.375274270842719080, -0.375227924682863150, -0.375181577584937420, -0.375135229549057700, -0.375088880575339570, -0.375042530663899590, +-0.374996179814853280, -0.374949828028316560, -0.374903475304404820, -0.374857121643234810, -0.374810767044922000, -0.374764411509582280, -0.374718055037331130, -0.374671697628285230, +-0.374625339282560090, -0.374578980000271620, -0.374532619781535290, -0.374486258626467780, -0.374439896535184670, -0.374393533507801800, -0.374347169544434700, -0.374300804645200100, +-0.374254438810213470, -0.374208072039590280, -0.374161704333447360, -0.374115335691900200, -0.374068966115064680, -0.374022595603056400, -0.373976224155991970, -0.373929851773986970, +-0.373883478457157360, -0.373837104205618660, -0.373790729019487620, -0.373744352898879690, -0.373697975843910960, -0.373651597854696820, -0.373605218931354120, -0.373558839073998390, +-0.373512458282745540, -0.373466076557711140, -0.373419693899011970, -0.373373310306763570, -0.373326925781081450, -0.373280540322082470, -0.373234153929882070, -0.373187766604596350, +-0.373141378346340760, -0.373094989155232200, -0.373048599031386100, -0.373002207974918510, -0.372955815985945020, -0.372909423064582410, -0.372863029210946220, -0.372816634425152450, +-0.372770238707316680, -0.372723842057555770, -0.372677444475985160, -0.372631045962721010, -0.372584646517878810, -0.372538246141575440, -0.372491844833926440, -0.372445442595047420, +-0.372399039425055200, -0.372352635324065370, -0.372306230292193950, -0.372259824329556570, -0.372213417436270010, -0.372167009612449920, -0.372120600858212300, -0.372074191173672800, +-0.372027780558948200, -0.371981369014154130, -0.371934956539406670, -0.371888543134821390, -0.371842128800515200, -0.371795713536603620, -0.371749297343202830, -0.371702880220428360, +-0.371656462168397090, -0.371610043187224680, -0.371563623277026740, -0.371517202437920140, -0.371470780670020540, -0.371424357973443970, -0.371377934348306130, -0.371331509794723850, +-0.371285084312812820, -0.371238657902689060, -0.371192230564468260, -0.371145802298267270, -0.371099373104201770, -0.371052942982387890, -0.371006511932941150, -0.370960079955978630, +-0.370913647051615890, -0.370867213219969020, -0.370820778461153690, -0.370774342775286810, -0.370727906162484130, -0.370681468622861670, -0.370635030156535090, -0.370588590763621380, +-0.370542150444236160, -0.370495709198495170, -0.370449267026515370, -0.370402823928412340, -0.370356379904302260, -0.370309934954300810, -0.370263489078524970, -0.370217042277090400, +-0.370170594550113200, -0.370124145897709140, -0.370077696319995100, -0.370031245817086800, -0.369984794389100420, -0.369938342036151610, -0.369891888758357380, -0.369845434555833410, +-0.369798979428695880, -0.369752523377060490, -0.369706066401044200, -0.369659608500762740, -0.369613149676331850, -0.369566689927868450, -0.369520229255488390, -0.369473767659307730, +-0.369427305139442270, -0.369380841696008930, -0.369334377329123500, -0.369287912038902100, -0.369241445825460530, -0.369194978688915710, -0.369148510629383530, -0.369102041646980020, +-0.369055571741820960, -0.369009100914023450, -0.368962629163703150, -0.368916156490976310, -0.368869682895958670, -0.368823208378767200, -0.368776732939517680, -0.368730256578325980, +-0.368683779295309040, -0.368637301090582630, -0.368590821964262960, -0.368544341916465850, -0.368497860947308300, -0.368451379056906060, -0.368404896245375420, -0.368358412512832130, +-0.368311927859393150, -0.368265442285174440, -0.368218955790292070, -0.368172468374861890, -0.368125980039000990, -0.368079490782825090, -0.368033000606450500, -0.367986509509993010, +-0.367940017493569640, -0.367893524557296240, -0.367847030701288990, -0.367800535925663810, -0.367754040230537650, -0.367707543616026420, -0.367661046082245920, -0.367614547629313170, +-0.367568048257344130, -0.367521547966454920, -0.367475046756761400, -0.367428544628380700, -0.367382041581428680, -0.367335537616021500, -0.367289032732275090, -0.367242526930306510, +-0.367196020210231620, -0.367149512572166660, -0.367103004016227530, -0.367056494542531310, -0.367009984151193790, -0.366963472842331380, -0.366916960616059830, -0.366870447472496310, +-0.366823933411756680, -0.366777418433956840, -0.366730902539213810, -0.366684385727643500, -0.366637867999362270, -0.366591349354485950, -0.366544829793131690, -0.366498309315415330, +-0.366451787921453220, -0.366405265611361220, -0.366358742385256450, -0.366312218243254830, -0.366265693185472640, -0.366219167212025850, -0.366172640323031540, -0.366126112518605610, +-0.366079583798864410, -0.366033054163923840, -0.365986523613901050, -0.365939992148911990, -0.365893459769072500, -0.365846926474499730, -0.365800392265309690, -0.365753857141618680, +-0.365707321103542590, -0.365660784151198630, -0.365614246284702680, -0.365567707504171170, -0.365521167809719940, -0.365474627201466230, -0.365428085679525890, -0.365381543244015390, +-0.365334999895050580, -0.365288455632748750, -0.365241910457225700, -0.365195364368597950, -0.365148817366981350, -0.365102269452493080, -0.365055720625249160, -0.365009170885365550, +-0.364962620232959390, -0.364916068668146690, -0.364869516191043850, -0.364822962801766790, -0.364776408500432690, -0.364729853287157620, -0.364683297162057940, -0.364636740125249550, +-0.364590182176849740, -0.364543623316974490, -0.364497063545740130, -0.364450502863262750, -0.364403941269659530, -0.364357378765046420, -0.364310815349539910, -0.364264251023255880, +-0.364217685786311700, -0.364171119638823260, -0.364124552580907090, -0.364077984612679040, -0.364031415734256510, -0.363984845945755420, -0.363938275247291780, -0.363891703638982880, +-0.363845131120944740, -0.363798557693293720, -0.363751983356145950, -0.363705408109618600, -0.363658831953827750, -0.363612254888889820, -0.363565676914920810, -0.363519098032038020, +-0.363472518240357530, -0.363425937539995750, -0.363379355931068680, -0.363332773413693630, -0.363286189987986620, -0.363239605654064210, -0.363193020412042320, -0.363146434262038300, +-0.363099847204168210, -0.363053259238548090, -0.363006670365295210, -0.362960080584525670, -0.362913489896355910, -0.362866898300902020, -0.362820305798281340, -0.362773712388609840, +-0.362727118072004080, -0.362680522848580100, -0.362633926718455290, -0.362587329681745560, -0.362540731738567600, -0.362494132889037370, -0.362447533133272160, -0.362400932471388220, +-0.362354330903501890, -0.362307728429729300, -0.362261125050187820, -0.362214520764993550, -0.362167915574262530, -0.362121309478112160, -0.362074702476658520, -0.362028094570018110, +-0.361981485758307080, -0.361934876041642710, -0.361888265420141130, -0.361841653893918920, -0.361795041463092160, -0.361748428127778240, -0.361701813888093250, -0.361655198744153690, +-0.361608582696075710, -0.361561965743976700, -0.361515347887972790, -0.361468729128180510, -0.361422109464715980, -0.361375488897696610, -0.361328867427238460, -0.361282245053458180, +-0.361235621776471890, -0.361188997596396940, -0.361142372513349520, -0.361095746527445750, -0.361049119638803040, -0.361002491847537470, -0.360955863153765710, -0.360909233557603900, +-0.360862603059169400, -0.360815971658578370, -0.360769339355947460, -0.360722706151392740, -0.360676072045031660, -0.360629437036980470, -0.360582801127355630, -0.360536164316273390, +-0.360489526603851140, -0.360442887990205070, -0.360396248475451820, -0.360349608059707500, -0.360302966743089590, -0.360256324525714270, -0.360209681407697710, -0.360163037389157340, +-0.360116392470209430, -0.360069746650970470, -0.360023099931556790, -0.359976452312085750, -0.359929803792673590, -0.359883154373436930, -0.359836504054491910, -0.359789852835956100, +-0.359743200717945690, -0.359696547700577180, -0.359649893783966950, -0.359603238968232430, -0.359556583253489770, -0.359509926639855650, -0.359463269127446310, -0.359416610716379200, +-0.359369951406770580, -0.359323291198736630, -0.359276630092394910, -0.359229968087861620, -0.359183305185253380, -0.359136641384686430, -0.359089976686278340, -0.359043311090145310, +-0.358996644596404010, -0.358949977205170630, -0.358903308916562800, -0.358856639730696650, -0.358809969647688910, -0.358763298667655830, -0.358716626790714920, -0.358669954016982430, +-0.358623280346575090, -0.358576605779609090, -0.358529930316202010, -0.358483253956470130, -0.358436576700530090, -0.358389898548498180, -0.358343219500491970, -0.358296539556627660, +-0.358249858717021640, -0.358203176981791380, -0.358156494351053180, -0.358109810824923710, -0.358063126403519340, -0.358016441086957520, -0.357969754875354650, -0.357923067768827370, +-0.357876379767491980, -0.357829690871466100, -0.357783001080865970, -0.357736310395808330, -0.357689618816409540, -0.357642926342787050, -0.357596232975057330, -0.357549538713336950, +-0.357502843557742370, -0.357456147508391050, -0.357409450565399360, -0.357362752728883630, -0.357316053998961490, -0.357269354375749140, -0.357222653859363470, -0.357175952449920680, +-0.357129250147538490, -0.357082546952333160, -0.357035842864421420, -0.356989137883919730, -0.356942432010945550, -0.356895725245615300, -0.356849017588045770, -0.356802309038353250, +-0.356755599596655370, -0.356708889263068480, -0.356662178037709390, -0.356615465920694430, -0.356568752912141240, -0.356522039012166170, -0.356475324220885570, -0.356428608538417070, +-0.356381891964877070, -0.356335174500382320, -0.356288456145049230, -0.356241736898995410, -0.356195016762337280, -0.356148295735191580, -0.356101573817674710, -0.356054851009904310, +-0.356008127311996820, -0.355961402724069010, -0.355914677246237270, -0.355867950878619220, -0.355821223621331340, -0.355774495474490420, -0.355727766438212800, -0.355681036512616180, +-0.355634305697816950, -0.355587573993931590, -0.355540841401077670, -0.355494107919371690, -0.355447373548930410, -0.355400638289870290, -0.355353902142309000, -0.355307165106362950, +-0.355260427182148950, -0.355213688369783510, -0.355166948669384250, -0.355120208081067650, -0.355073466604950480, -0.355026724241149230, -0.354979980989781620, -0.354933236850964010, +-0.354886491824813350, -0.354839745911446070, -0.354792999110979780, -0.354746251423531000, -0.354699502849216640, -0.354652753388153050, -0.354606003040458030, -0.354559251806247980, +-0.354512499685639420, -0.354465746678749970, -0.354418992785696220, -0.354372238006594950, -0.354325482341562690, -0.354278725790717120, -0.354231968354174700, -0.354185210032052440, +-0.354138450824466710, -0.354091690731535240, -0.354044929753374540, -0.353998167890101520, -0.353951405141832710, -0.353904641508685780, -0.353857876990777250, -0.353811111588223980, +-0.353764345301142590, -0.353717578129650710, -0.353670810073864860, -0.353624041133901610, -0.353577271309878700, -0.353530500601912550, -0.353483729010120210, -0.353436956534618040, +-0.353390183175523950, -0.353343408932954410, -0.353296633807026360, -0.353249857797856280, -0.353203080905562020, -0.353156303130259970, -0.353109524472067230, -0.353062744931100240, +-0.353015964507476800, -0.352969183201313490, -0.352922401012727200, -0.352875617941834470, -0.352828833988753140, -0.352782049153599670, -0.352735263436490700, -0.352688476837544010, +-0.352641689356876120, -0.352594900994604000, -0.352548111750844160, -0.352501321625714510, -0.352454530619331570, -0.352407738731812250, -0.352360945963273220, -0.352314152313832230, +-0.352267357783605850, -0.352220562372711040, -0.352173766081264440, -0.352126968909383890, -0.352080170857185850, -0.352033371924787400, -0.351986572112305110, -0.351939771419856830, +-0.351892969847559080, -0.351846167395528930, -0.351799364063882900, -0.351752559852738960, -0.351705754762213550, -0.351658948792423380, -0.351612141943486220, -0.351565334215518720, +-0.351518525608637890, -0.351471716122960350, -0.351424905758603910, -0.351378094515685190, -0.351331282394321260, -0.351284469394628710, -0.351237655516725370, -0.351190840760727930, +-0.351144025126753360, -0.351097208614918330, -0.351050391225340710, -0.351003572958137060, -0.350956753813424500, -0.350909933791319680, -0.350863112891940390, -0.350816291115403360, +-0.350769468461825160, -0.350722644931323710, -0.350675820524015640, -0.350628995240018000, -0.350582169079447500, -0.350535342042421980, -0.350488514129058070, -0.350441685339472950, +-0.350394855673783150, -0.350348025132106610, -0.350301193714560030, -0.350254361421260480, -0.350207528252324600, -0.350160694207870330, -0.350113859288014310, -0.350067023492873610, +-0.350020186822564970, -0.349973349277206250, -0.349926510856914170, -0.349879671561805440, -0.349832831391997890, -0.349785990347608320, -0.349739148428753750, -0.349692305635550870, +-0.349645461968117630, -0.349598617426570780, -0.349551772011027380, -0.349504925721604130, -0.349458078558418930, -0.349411230521588620, -0.349364381611230180, -0.349317531827460390, +-0.349270681170397170, -0.349223829640157250, -0.349176977236857760, -0.349130123960615430, -0.349083269811548190, -0.349036414789772760, -0.348989558895405890, -0.348942702128565540, +-0.348895844489368450, -0.348848985977931740, -0.348802126594372150, -0.348755266338807660, -0.348708405211354990, -0.348661543212131280, -0.348614680341253370, -0.348567816598839120, +-0.348520951985005320, -0.348474086499869160, -0.348427220143547380, -0.348380352916157990, -0.348333484817817670, -0.348286615848643680, -0.348239746008752680, -0.348192875298262760, +-0.348146003717290650, -0.348099131265953540, -0.348052257944368170, -0.348005383752652610, -0.347958508690923540, -0.347911632759297820, -0.347864755957893400, -0.347817878286827140, +-0.347770999746216170, -0.347724120336177220, -0.347677240056828430, -0.347630358908286590, -0.347583476890668760, -0.347536594004091870, -0.347489710248673920, -0.347442825624531710, +-0.347395940131782380, -0.347349053770542810, -0.347302166540931050, -0.347255278443063860, -0.347208389477058450, -0.347161499643031670, -0.347114608941101580, -0.347067717371384920, +-0.347020824933998550, -0.346973931629060540, -0.346927037456687740, -0.346880142416997330, -0.346833246510106110, -0.346786349736132260, -0.346739452095192470, -0.346692553587404080, +-0.346645654212883900, -0.346598753971750000, -0.346551852864119160, -0.346504950890108740, -0.346458048049835540, -0.346411144343417580, -0.346364239770971800, -0.346317334332615410, +-0.346270428028465300, -0.346223520858639500, -0.346176612823254900, -0.346129703922428370, -0.346082794156277960, -0.346035883524920600, -0.345988972028473510, -0.345942059667053600, +-0.345895146440778960, -0.345848232349766420, -0.345801317394133280, -0.345754401573996510, -0.345707484889474060, -0.345660567340682960, -0.345613648927740440, -0.345566729650763350, +-0.345519809509869880, -0.345472888505176880, -0.345425966636801640, -0.345379043904861130, -0.345332120309473360, -0.345285195850755290, -0.345238270528824280, -0.345191344343797110, +-0.345144417295792040, -0.345097489384925960, -0.345050560611315670, -0.345003630975079410, -0.344956700476334090, -0.344909769115197050, -0.344862836891785150, -0.344815903806216520, +-0.344768969858608220, -0.344722035049077450, -0.344675099377741160, -0.344628162844717530, -0.344581225450123540, -0.344534287194076470, -0.344487348076693230, -0.344440408098092070, +-0.344393467258389870, -0.344346525557704060, -0.344299582996151430, -0.344252639573850330, -0.344205695290917600, -0.344158750147470220, -0.344111804143626410, -0.344064857279503030, +-0.344017909555217550, -0.343970960970886860, -0.343924011526629210, -0.343877061222561510, -0.343830110058801150, -0.343783158035465160, -0.343736205152671610, -0.343689251410537580, +-0.343642296809180460, -0.343595341348717110, -0.343548385029265880, -0.343501427850943670, -0.343454469813867850, -0.343407510918155520, -0.343360551163924780, -0.343313590551292620, +-0.343266629080376140, -0.343219666751293510, -0.343172703564161630, -0.343125739519098080, -0.343078774616219720, -0.343031808855644830, -0.342984842237490430, -0.342937874761873930, +-0.342890906428912350, -0.342843937238723860, -0.342796967191425610, -0.342749996287134870, -0.342703024525968740, -0.342656051908045490, -0.342609078433482090, -0.342562104102396010, +-0.342515128914904270, -0.342468152871125090, -0.342421175971175500, -0.342374198215172620, -0.342327219603234590, -0.342280240135478590, -0.342233259812021960, -0.342186278632981730, +-0.342139296598476250, -0.342092313708622530, -0.342045329963538040, -0.341998345363339780, -0.341951359908146070, -0.341904373598073960, -0.341857386433240930, -0.341810398413764040, +-0.341763409539761530, -0.341716419811350540, -0.341669429228648460, -0.341622437791772370, -0.341575445500840680, -0.341528452355970290, -0.341481458357278830, -0.341434463504883270, +-0.341387467798902000, -0.341340471239452050, -0.341293473826650540, -0.341246475560615710, -0.341199476441464700, -0.341152476469315010, -0.341105475644283730, -0.341058473966489140, +-0.341011471436048370, -0.340964468053078950, -0.340917463817697940, -0.340870458730023640, -0.340823452790173230, -0.340776445998264180, -0.340729438354413610, -0.340682429858739870, +-0.340635420511360030, -0.340588410312391680, -0.340541399261951820, -0.340494387360158910, -0.340447374607130040, -0.340400361002982320, -0.340353346547834110, -0.340306331241802540, +-0.340259315085005120, -0.340212298077559040, -0.340165280219582590, -0.340118261511192950, -0.340071241952507650, -0.340024221543643870, -0.339977200284719890, -0.339930178175852970, +-0.339883155217160560, -0.339836131408759850, -0.339789106750769230, -0.339742081243305850, -0.339695054886487270, -0.339648027680430680, -0.339600999625254360, -0.339553970721075570, +-0.339506940968011480, -0.339459910366180400, -0.339412878915699550, -0.339365846616686510, -0.339318813469258460, -0.339271779473533760, -0.339224744629629590, -0.339177708937663640, +-0.339130672397752910, -0.339083635010015980, -0.339036596774569930, -0.338989557691532440, -0.338942517761020580, -0.338895476983152870, -0.338848435358046430, -0.338801392885818950, +-0.338754349566587560, -0.338707305400470730, -0.338660260387585570, -0.338613214528049820, -0.338566167821980570, -0.338519120269496380, -0.338472071870714320, -0.338425022625751750, +-0.338377972534726960, -0.338330921597757290, -0.338283869814960280, -0.338236817186453210, -0.338189763712354490, -0.338142709392781350, -0.338095654227851480, -0.338048598217682020, +-0.338001541362391470, -0.337954483662097130, -0.337907425116916520, -0.337860365726966980, -0.337813305492366880, -0.337766244413233550, -0.337719182489684630, -0.337672119721837300, +-0.337625056109810140, -0.337577991653720270, -0.337530926353685030, -0.337483860209822910, -0.337436793222251170, -0.337389725391087360, -0.337342656716448920, -0.337295587198454150, +-0.337248516837220510, -0.337201445632865530, -0.337154373585506480, -0.337107300695261960, -0.337060226962249190, -0.337013152386585860, -0.336966076968389210, -0.336919000707777800, +-0.336871923604868890, -0.336824845659780160, -0.336777766872628890, -0.336730687243533670, -0.336683606772611670, -0.336636525459980240, -0.336589443305757960, -0.336542360310062020, +-0.336495276473010250, -0.336448191794719800, -0.336401106275309340, -0.336354019914896050, -0.336306932713597790, -0.336259844671531750, -0.336212755788816490, -0.336165666065569360, +-0.336118575501908050, -0.336071484097949900, -0.336024391853813440, -0.335977298769616020, -0.335930204845475370, -0.335883110081508730, -0.335836014477834790, -0.335788918034570780, +-0.335741820751834120, -0.335694722629743260, -0.335647623668415610, -0.335600523867968900, -0.335553423228520440, -0.335506321750188910, -0.335459219433091540, -0.335412116277346070, +-0.335365012283069970, -0.335317907450381700, -0.335270801779398660, -0.335223695270238650, -0.335176587923018960, -0.335129479737858280, -0.335082370714873850, -0.335035260854183500, +-0.334988150155904550, -0.334941038620155670, -0.334893926247054220, -0.334846813036717930, -0.334799698989264150, -0.334752584104811570, -0.334705468383477530, -0.334658351825379450, +-0.334611234430635840, -0.334564116199364160, -0.334516997131682200, -0.334469877227707320, -0.334422756487558200, -0.334375634911352190, -0.334328512499207030, -0.334281389251240240, +-0.334234265167570320, -0.334187140248314810, -0.334140014493591430, -0.334092887903517600, -0.334045760478211940, -0.333998632217791860, -0.333951503122375260, -0.333904373192079440, +-0.333857242427023140, -0.333810110827323700, -0.333762978393098600, -0.333715845124466450, -0.333668711021544660, -0.333621576084451140, -0.333574440313303240, -0.333527303708219700, +-0.333480166269317870, -0.333433027996715590, -0.333385888890530340, -0.333338748950880780, -0.333291608177884390, -0.333244466571658960, -0.333197324132321950, -0.333150180859992040, +-0.333103036754786640, -0.333055891816823710, -0.333008746046220610, -0.332961599443096060, -0.332914452007567530, -0.332867303739752430, -0.332820154639769440, -0.332773004707736130, +-0.332725853943770300, -0.332678702347989410, -0.332631549920512190, -0.332584396661456120, -0.332537242570938970, -0.332490087649078390, -0.332442931895992940, -0.332395775311800200, +-0.332348617896618010, -0.332301459650563900, -0.332254300573756490, -0.332207140666313410, -0.332159979928352390, -0.332112818359991070, -0.332065655961348070, -0.332018492732540970, +-0.331971328673687620, -0.331924163784905520, -0.331876998066313430, -0.331829831518028860, -0.331782664140169270, -0.331735495932853510, -0.331688326896198930, -0.331641157030323540, +-0.331593986335344870, -0.331546814811381650, -0.331499642458551400, -0.331452469276972030, -0.331405295266761050, -0.331358120428037250, -0.331310944760918210, -0.331263768265521730, +-0.331216590941965480, -0.331169412790368100, -0.331122233810847270, -0.331075054003520770, -0.331027873368506310, -0.330980691905922500, -0.330933509615887020, -0.330886326498517290, +-0.330839142553932210, -0.330791957782249240, -0.330744772183586390, -0.330697585758061240, -0.330650398505792480, -0.330603210426897720, -0.330556021521494990, -0.330508831789701750, +-0.330461641231636850, -0.330414449847417860, -0.330367257637162740, -0.330320064600989060, -0.330272870739015620, -0.330225676051360000, -0.330178480538140200, -0.330131284199473800, +-0.330084087035479590, -0.330036889046275150, -0.329989690231978110, -0.329942490592707250, -0.329895290128580150, -0.329848088839714840, -0.329800886726228870, -0.329753683788241100, +-0.329706480025869110, -0.329659275439230960, -0.329612070028444170, -0.329564863793627650, -0.329517656734898970, -0.329470448852376090, -0.329423240146176740, -0.329376030616419680, +-0.329328820263222520, -0.329281609086703340, -0.329234397086979710, -0.329187184264170540, -0.329139970618393400, -0.329092756149765850, -0.329045540858406930, -0.328998324744434080, +-0.328951107807965440, -0.328903890049118630, -0.328856671468012450, -0.328809452064764640, -0.328762231839493210, -0.328715010792315800, -0.328667788923351250, -0.328620566232717180, +-0.328573342720531790, -0.328526118386912540, -0.328478893231978490, -0.328431667255847160, -0.328384440458636680, -0.328337212840464630, -0.328289984401450020, -0.328242755141710420, +-0.328195525061363960, -0.328148294160528260, -0.328101062439322240, -0.328053829897863580, -0.328006596536269900, -0.327959362354660170, -0.327912127353152010, -0.327864891531863540, +-0.327817654890912470, -0.327770417430417630, -0.327723179150496760, -0.327675940051267930, -0.327628700132848840, -0.327581459395358430, -0.327534217838914340, -0.327486975463634760, +-0.327439732269637240, -0.327392488257040870, -0.327345243425963270, -0.327297997776522580, -0.327250751308836460, -0.327203504023023840, -0.327156255919202500, -0.327109006997490130, +-0.327061757258005630, -0.327014506700866740, -0.326967255326191530, -0.326920003134097860, -0.326872750124704510, -0.326825496298129350, -0.326778241654490430, -0.326730986193905500, +-0.326683729916493470, -0.326636472822372180, -0.326589214911659650, -0.326541956184473740, -0.326494696640933280, -0.326447436281156130, -0.326400175105260370, -0.326352913113363790, +-0.326305650305585280, -0.326258386682042660, -0.326211122242853700, -0.326163856988137320, -0.326116590918011320, -0.326069324032593810, -0.326022056332002600, -0.325974787816356640, +-0.325927518485773730, -0.325880248340371990, -0.325832977380269280, -0.325785705605584510, -0.325738433016435460, -0.325691159612940320, -0.325643885395216880, -0.325596610363384160, +-0.325549334517559910, -0.325502057857862290, -0.325454780384409170, -0.325407502097319450, -0.325360222996711020, -0.325312943082702030, -0.325265662355410210, -0.325218380814954740, +-0.325171098461453260, -0.325123815295023600, -0.325076531315784840, -0.325029246523854790, -0.324981960919351610, -0.324934674502393050, -0.324887387273098290, -0.324840099231585020, +-0.324792810377971530, -0.324745520712375610, -0.324698230234916290, -0.324650938945711340, -0.324603646844879130, -0.324556353932537340, -0.324509060208805100, -0.324461765673800200, +-0.324414470327640870, -0.324367174170444970, -0.324319877202331520, -0.324272579423418420, -0.324225280833823400, -0.324177981433665660, -0.324130681223062930, -0.324083380202133510, +-0.324036078370995180, -0.323988775729767140, -0.323941472278567120, -0.323894168017513420, -0.323846862946723880, -0.323799557066317630, -0.323752250376412480, -0.323704942877126700, +-0.323657634568578100, -0.323610325450885860, -0.323563015524167830, -0.323515704788542250, -0.323468393244127020, -0.323421080891041160, -0.323373767729402630, -0.323326453759329280, +-0.323279138980940180, -0.323231823394353250, -0.323184506999686760, -0.323137189797058580, -0.323089871786587880, -0.323042552968392460, -0.322995233342590670, -0.322947912909300360, +-0.322900591668640710, -0.322853269620729580, -0.322805946765685250, -0.322758623103625690, -0.322711298634669960, -0.322663973358935980, -0.322616647276542050, -0.322569320387606110, +-0.322521992692247240, -0.322474664190583460, -0.322427334882732560, -0.322380004768813730, -0.322332673848944930, -0.322285342123244390, -0.322238009591830130, -0.322190676254821230, +-0.322143342112335640, -0.322096007164491720, -0.322048671411407360, -0.322001334853201760, -0.321953997489992760, -0.321906659321898820, -0.321859320349037800, -0.321811980571528880, +-0.321764639989490010, -0.321717298603039550, -0.321669956412295450, -0.321622613417376860, -0.321575269618401720, -0.321527925015488440, -0.321480579608754870, -0.321433233398320310, +-0.321385886384302650, -0.321338538566819880, -0.321291189945991150, -0.321243840521934500, -0.321196490294768210, -0.321149139264610250, -0.321101787431579910, -0.321054434795795100, +-0.321007081357374160, -0.320959727116435110, -0.320912372073097200, -0.320865016227478320, -0.320817659579696930, -0.320770302129870950, -0.320722943878119670, -0.320675584824560990, +-0.320628224969313370, -0.320580864312494720, -0.320533502854224380, -0.320486140594620270, -0.320438777533800400, -0.320391413671884010, -0.320344049008989050, -0.320296683545234000, +-0.320249317280736800, -0.320201950215616700, -0.320154582349991780, -0.320107213683980370, -0.320059844217700560, -0.320012473951271530, -0.319965102884811280, -0.319917731018438290, +-0.319870358352270570, -0.319822984886427350, -0.319775610621026720, -0.319728235556187010, -0.319680859692026310, -0.319633483028663900, -0.319586105566217750, -0.319538727304805930, +-0.319491348244547720, -0.319443968385561110, -0.319396587727964590, -0.319349206271876180, -0.319301824017415190, -0.319254440964699630, -0.319207057113848000, -0.319159672464978280, +-0.319112287018209760, -0.319064900773660560, -0.319017513731449150, -0.318970125891693490, -0.318922737254512920, -0.318875347820025520, -0.318827957588349810, -0.318780566559603680, +-0.318733174733906610, -0.318685782111376600, -0.318638388692132180, -0.318590994476291300, -0.318543599463973370, -0.318496203655296460, -0.318448807050378590, -0.318401409649339160, +-0.318354011452296190, -0.318306612459368200, -0.318259212670673250, -0.318211812086330700, -0.318164410706458620, -0.318117008531175470, -0.318069605560599430, -0.318022201794849800, +-0.317974797234044650, -0.317927391878302490, -0.317879985727741400, -0.317832578782480830, -0.317785171042638810, -0.317737762508333800, -0.317690353179684030, -0.317642943056808790, +-0.317595532139826160, -0.317548120428854270, -0.317500707924012530, -0.317453294625419050, -0.317405880533192300, -0.317358465647450410, -0.317311049968312770, -0.317263633495897530, +-0.317216216230323260, -0.317168798171707960, -0.317121379320171090, -0.317073959675830800, -0.317026539238805580, -0.316979118009213580, -0.316931695987174240, -0.316884273172805650, +-0.316836849566226380, -0.316789425167554590, -0.316741999976909610, -0.316694573994409640, -0.316647147220172840, -0.316599719654318600, -0.316552291296964990, -0.316504862148230700, +-0.316457432208233860, -0.316410001477093860, -0.316362569954928790, -0.316315137641857370, -0.316267704537997630, -0.316220270643469080, -0.316172835958389850, -0.316125400482878520, +-0.316077964217053250, -0.316030527161033530, -0.315983089314937520, -0.315935650678883740, -0.315888211252990380, -0.315840771037376960, -0.315793330032161590, -0.315745888237462520, +-0.315698445653399110, -0.315651002280089580, -0.315603558117652560, -0.315556113166206240, -0.315508667425870030, -0.315461220896762150, -0.315413773579001240, -0.315366325472705430, +-0.315318876577994290, -0.315271426894985940, -0.315223976423799010, -0.315176525164551690, -0.315129073117363550, -0.315081620282352650, -0.315034166659637740, -0.314986712249337000, +-0.314939257051569890, -0.314891801066454650, -0.314844344294109900, -0.314796886734653840, -0.314749428388206020, -0.314701969254884640, -0.314654509334807870, -0.314607048628095300, +-0.314559587134865040, -0.314512124855235890, -0.314464661789325920, -0.314417197937254810, -0.314369733299140640, -0.314322267875102150, -0.314274801665257560, -0.314227334669726410, +-0.314179866888626920, -0.314132398322077790, -0.314084928970197190, -0.314037458833104740, -0.313989987910918590, -0.313942516203757520, -0.313895043711739710, -0.313847570434984680, +-0.313800096373610780, -0.313752621527736200, -0.313705145897480500, -0.313657669482961920, -0.313610192284299150, -0.313562714301610480, -0.313515235535015480, -0.313467755984632390, +-0.313420275650579890, -0.313372794532976280, -0.313325312631941080, -0.313277829947592680, -0.313230346480049600, -0.313182862229430310, -0.313135377195854270, -0.313087891379439760, +-0.313040404780305540, -0.312992917398569880, -0.312945429234352370, -0.312897940287771290, -0.312850450558944890, -0.312802960047992800, -0.312755468755033350, -0.312707976680185180, +-0.312660483823566700, -0.312612990185297370, -0.312565495765495640, -0.312518000564280090, -0.312470504581769170, -0.312423007818082410, -0.312375510273338100, -0.312328011947655030, +-0.312280512841151490, -0.312233012953947120, -0.312185512286160200, -0.312138010837909540, -0.312090508609313370, -0.312043005600491360, -0.311995501811561880, -0.311947997242643600, +-0.311900491893854940, -0.311852985765315450, -0.311805478857143490, -0.311757971169457470, -0.311710462702376900, -0.311662953456020130, -0.311615443430506070, -0.311567932625952890, +-0.311520421042480340, -0.311472908680206720, -0.311425395539250860, -0.311377881619731070, -0.311330366921767020, -0.311282851445477020, -0.311235335190979900, -0.311187818158394030, +-0.311140300347839020, -0.311092781759433280, -0.311045262393295610, -0.310997742249544300, -0.310950221328299080, -0.310902699629678310, -0.310855177153800400, -0.310807653900784910, +-0.310760129870750360, -0.310712605063815430, -0.310665079480098580, -0.310617553119719450, -0.310570025982796430, -0.310522498069448370, -0.310474969379793630, -0.310427439913951890, +-0.310379909672041540, -0.310332378654181400, -0.310284846860489900, -0.310237314291086750, -0.310189780946090290, -0.310142246825619360, -0.310094711929792380, -0.310047176258729070, +-0.309999639812547800, -0.309952102591367070, -0.309904564595306460, -0.309857025824484430, -0.309809486279019830, -0.309761945959031120, -0.309714404864637920, -0.309666862995958750, +-0.309619320353112400, -0.309571776936217350, -0.309524232745393260, -0.309476687780758600, -0.309429142042432210, -0.309381595530532570, -0.309334048245179350, -0.309286500186491010, +-0.309238951354586400, -0.309191401749584040, -0.309143851371603550, -0.309096300220763450, -0.309048748297182150, -0.309001195600979440, -0.308953642132273720, -0.308906087891183900, +-0.308858532877828440, -0.308810977092327080, -0.308763420534798270, -0.308715863205360870, -0.308668305104133460, -0.308620746231235640, -0.308573186586786010, -0.308525626170903400, +-0.308478064983706280, -0.308430503025314440, -0.308382940295846340, -0.308335376795420890, -0.308287812524156550, -0.308240247482173100, -0.308192681669589070, -0.308145115086523310, +-0.308097547733094390, -0.308049979609421990, -0.308002410715624620, -0.307954841051820800, -0.307907270618130340, -0.307859699414671670, -0.307812127441563780, -0.307764554698925110, +-0.307716981186875460, -0.307669406905533400, -0.307621831855017850, -0.307574256035447250, -0.307526679446941450, -0.307479102089618930, -0.307431523963598690, -0.307383945068999190, +-0.307336365405940280, -0.307288784974540430, -0.307241203774918650, -0.307193621807193400, -0.307146039071484520, -0.307098455567910540, -0.307050871296590030, -0.307003286257642730, +-0.306955700451187250, -0.306908113877342510, -0.306860526536227030, -0.306812938427960700, -0.306765349552661990, -0.306717759910449920, -0.306670169501443050, -0.306622578325761120, +-0.306574986383522820, -0.306527393674846990, -0.306479800199852270, -0.306432205958658500, -0.306384610951384200, -0.306337015178148380, -0.306289418639069560, -0.306241821334267640, +-0.306194223263861200, -0.306146624427968750, -0.306099024826710140, -0.306051424460204000, -0.306003823328569290, -0.305956221431924640, -0.305908618770389770, -0.305861015344083440, +-0.305813411153124490, -0.305765806197631660, -0.305718200477724690, -0.305670593993522250, -0.305622986745143320, -0.305575378732706520, -0.305527769956331630, -0.305480160416137400, +-0.305432550112242680, -0.305384939044766210, -0.305337327213827840, -0.305289714619546130, -0.305242101262040100, -0.305194487141428440, -0.305146872257830990, -0.305099256611366330, +-0.305051640202153080, -0.305004023030311210, -0.304956405095959280, -0.304908786399216310, -0.304861166940200930, -0.304813546719033100, -0.304765925735831390, -0.304718303990714870, +-0.304670681483802160, -0.304623058215213180, -0.304575434185066500, -0.304527809393481290, -0.304480183840576120, -0.304432557526470910, -0.304384930451284340, -0.304337302615135420, +-0.304289674018142780, -0.304242044660426430, -0.304194414542104940, -0.304146783663297000, -0.304099152024122580, -0.304051519624700230, -0.304003886465149030, -0.303956252545587780, +-0.303908617866136270, -0.303860982426913230, -0.303813346228037740, -0.303765709269628430, -0.303718071551805300, -0.303670433074687000, -0.303622793838392580, -0.303575153843040790, +-0.303527513088751530, -0.303479871575643490, -0.303432229303835730, -0.303384586273447000, -0.303336942484597250, -0.303289297937405110, -0.303241652631989320, -0.303194006568469840, +-0.303146359746965300, -0.303098712167594870, -0.303051063830477310, -0.303003414735732450, -0.302955764883479030, -0.302908114273836240, -0.302860462906922700, -0.302812810782858490, +-0.302765157901762230, -0.302717504263753050, -0.302669849868949680, -0.302622194717472150, -0.302574538809439080, -0.302526882144969700, -0.302479224724182700, -0.302431566547198050, +-0.302383907614134470, -0.302336247925111160, -0.302288587480246780, -0.302240926279661310, -0.302193264323473600, -0.302145601611802260, -0.302097938144767380, -0.302050273922487620, +-0.302002608945082180, -0.301954943212669800, -0.301907276725370490, -0.301859609483302980, -0.301811941486586470, -0.301764272735339620, -0.301716603229682580, -0.301668932969734020, +-0.301621261955613120, -0.301573590187438620, -0.301525917665330550, -0.301478244389407730, -0.301430570359789320, -0.301382895576594030, -0.301335220039941900, -0.301287543749951760, +-0.301239866706742300, -0.301192188910433640, -0.301144510361144480, -0.301096831058994040, -0.301049151004101120, -0.301001470196585740, -0.300953788636566690, -0.300906106324163150, +-0.300858423259493910, -0.300810739442679050, -0.300763054873837370, -0.300715369553088030, -0.300667683480549840, -0.300619996656342870, -0.300572309080585910, -0.300524620753398140, +-0.300476931674898470, -0.300429241845206860, -0.300381551264442100, -0.300333859932723100, -0.300286167850169870, -0.300238475016901150, -0.300190781433036350, -0.300143087098694080, +-0.300095392013994540, -0.300047696179056580, -0.299999999593999310, -0.299952302258941650, -0.299904604174003660, -0.299856905339304150, -0.299809205754962340, -0.299761505421097140, +-0.299713804337828570, -0.299666102505275530, -0.299618399923557210, -0.299570696592792450, -0.299522992513101380, -0.299475287684602850, -0.299427582107415660, -0.299379875781659980, +-0.299332168707454550, -0.299284460884918720, -0.299236752314171350, -0.299189042995332440, -0.299141332928521020, -0.299093622113856210, -0.299045910551456910, -0.298998198241443300, +-0.298950485183934190, -0.298902771379048800, -0.298855056826906160, -0.298807341527626220, -0.298759625481327950, -0.298711908688130630, -0.298664191148153120, -0.298616472861515550, +-0.298568753828336810, -0.298521034048736140, -0.298473313522832520, -0.298425592250746000, -0.298377870232595490, -0.298330147468499900, -0.298282423958579400, -0.298234699702952800, +-0.298186974701739440, -0.298139248955058220, -0.298091522463029330, -0.298043795225771620, -0.297996067243404440, -0.297948338516046630, -0.297900609043818430, -0.297852878826838700, +-0.297805147865226770, -0.297757416159101560, -0.297709683708583190, -0.297661950513790690, -0.297614216574843220, -0.297566481891859860, -0.297518746464960680, -0.297471010294264650, +-0.297423273379890660, -0.297375535721958910, -0.297327797320588340, -0.297280058175898250, -0.297232318288007610, -0.297184577657036600, -0.297136836283104110, -0.297089094166329560, +-0.297041351306831850, -0.296993607704731210, -0.296945863360146500, -0.296898118273197180, -0.296850372444002090, -0.296802625872681520, -0.296754878559354400, -0.296707130504140050, +-0.296659381707157500, -0.296611632168526870, -0.296563881888367190, -0.296516130866797340, -0.296468379103937640, -0.296420626599906980, -0.296372873354824710, -0.296325119368809900, +-0.296277364641982680, -0.296229609174462060, -0.296181852966367400, -0.296134096017817650, -0.296086338328933160, -0.296038579899832790, -0.295990820730635980, -0.295943060821461660, +-0.295895300172430150, -0.295847538783660380, -0.295799776655271740, -0.295752013787383250, -0.295704250180115150, -0.295656485833586450, -0.295608720747916500, -0.295560954923224370, +-0.295513188359630200, -0.295465421057253150, -0.295417653016212030, -0.295369884236627240, -0.295322114718617800, -0.295274344462303000, -0.295226573467801960, -0.295178801735234860, +-0.295131029264720790, -0.295083256056379140, -0.295035482110328930, -0.294987707426690450, -0.294939932005582660, -0.294892155847125080, -0.294844378951436670, -0.294796601318637720, +-0.294748822948847300, -0.294701043842184820, -0.294653263998769290, -0.294605483418721060, -0.294557702102159090, -0.294509920049202400, -0.294462137259971390, -0.294414353734585020, +-0.294366569473162810, -0.294318784475823710, -0.294270998742688080, -0.294223212273874930, -0.294175425069503780, -0.294127637129693640, -0.294079848454564810, -0.294032059044236350, +-0.293984268898827780, -0.293936478018458070, -0.293888686403247670, -0.293840894053315480, -0.293793100968781080, -0.293745307149763490, -0.293697512596383050, -0.293649717308758880, +-0.293601921287009960, -0.293554124531256620, -0.293506327041618050, -0.293458528818213600, -0.293410729861162460, -0.293362930170584850, -0.293315129746599960, -0.293267328589327250, +-0.293219526698885740, -0.293171724075395880, -0.293123920718976750, -0.293076116629747750, -0.293028311807828070, -0.292980506253337990, -0.292932699966396700, -0.292884892947123670, +-0.292837085195637950, -0.292789276712059900, -0.292741467496508700, -0.292693657549103430, -0.292645846869964420, -0.292598035459210810, -0.292550223316962070, -0.292502410443337360, +-0.292454596838457090, -0.292406782502440290, -0.292358967435406570, -0.292311151637474950, -0.292263335108765900, -0.292215517849398530, -0.292167699859492370, -0.292119881139166480, +-0.292072061688541380, -0.292024241507736090, -0.291976420596870180, -0.291928598956062820, -0.291880776585434430, -0.291832953485104020, -0.291785129655191270, -0.291737305095815250, +-0.291689479807096420, -0.291641653789153850, -0.291593827042106790, -0.291545999566075520, -0.291498171361179280, -0.291450342427537590, -0.291402512765269630, -0.291354682374495800, +-0.291306851255335290, -0.291259019407907660, -0.291211186832332050, -0.291163353528728910, -0.291115519497217310, -0.291067684737917000, -0.291019849250947040, -0.290972013036427830, +-0.290924176094478630, -0.290876338425218980, -0.290828500028768030, -0.290780660905246290, -0.290732821054772880, -0.290684980477467050, -0.290637139173449130, -0.290589297142838380, +-0.290541454385754410, -0.290493610902316350, -0.290445766692644660, -0.290397921756858580, -0.290350076095077740, -0.290302229707421260, -0.290254382594009600, -0.290206534754962000, +-0.290158686190398090, -0.290110836900436990, -0.290062986885199270, -0.290015136144804060, -0.289967284679371000, -0.289919432489019300, -0.289871579573869440, -0.289823725934040650, +-0.289775871569652120, -0.289728016480824360, -0.289680160667676550, -0.289632304130328310, -0.289584446868898890, -0.289536588883508810, -0.289488730174277230, -0.289440870741323850, +-0.289393010584767800, -0.289345149704729740, -0.289297288101328760, -0.289249425774684540, -0.289201562724916370, -0.289153698952144710, -0.289105834456488800, -0.289057969238068260, +-0.289010103297002440, -0.288962236633411750, -0.288914369247415480, -0.288866501139133260, -0.288818632308684380, -0.288770762756189350, -0.288722892481767410, -0.288675021485537810, +-0.288627149767621110, -0.288579277328136540, -0.288531404167203740, -0.288483530284942000, -0.288435655681471890, -0.288387780356912590, -0.288339904311383900, -0.288292027545004990, +-0.288244150057896440, -0.288196271850177540, -0.288148392921967920, -0.288100513273386930, -0.288052632904555070, -0.288004751815591600, -0.287956870006616290, -0.287908987477748350, +-0.287861104229108380, -0.287813220260815680, -0.287765335572989440, -0.287717450165750340, -0.287669564039217620, -0.287621677193510950, -0.287573789628749690, -0.287525901345054350, +-0.287478012342544280, -0.287430122621339160, -0.287382232181558340, -0.287334341023322340, -0.287286449146750500, -0.287238556551962560, -0.287190663239077770, -0.287142769208216740, +-0.287094874459498830, -0.287046978993043660, -0.286999082808970680, -0.286951185907400430, -0.286903288288452190, -0.286855389952245300, -0.286807490898900340, -0.286759591128536660, +-0.286711690641274000, -0.286663789437231750, -0.286615887516530390, -0.286567984879289310, -0.286520081525628300, -0.286472177455666670, -0.286424272669524970, -0.286376367167322620, +-0.286328460949179350, -0.286280554015214520, -0.286232646365548680, -0.286184738000301250, -0.286136828919592020, -0.286088919123540230, -0.286041008612266610, -0.285993097385890460, +-0.285945185444531120, -0.285897272788309230, -0.285849359417344180, -0.285801445331755780, -0.285753530531663300, -0.285705615017187390, -0.285657698788447490, -0.285609781845563290, +-0.285561864188654260, -0.285513945817840950, -0.285466026733242840, -0.285418106934979600, -0.285370186423170690, -0.285322265197936740, -0.285274343259397160, -0.285226420607671670, +-0.285178497242879690, -0.285130573165141950, -0.285082648374577750, -0.285034722871306930, -0.284986796655448900, -0.284938869727124290, -0.284890942086452490, -0.284843013733552920, +-0.284795084668546250, -0.284747154891551830, -0.284699224402689580, -0.284651293202078830, -0.284603361289840210, -0.284555428666093240, -0.284507495330957700, -0.284459561284553020, +-0.284411626526999810, -0.284363691058417580, -0.284315754878926070, -0.284267817988644760, -0.284219880387694360, -0.284171942076194230, -0.284124003054264270, -0.284076063322023900, +-0.284028122879593730, -0.283980181727093330, -0.283932239864642000, -0.283884297292360480, -0.283836354010368270, -0.283788410018785130, -0.283740465317730560, -0.283692519907325250, +-0.283644573787688650, -0.283596626958940610, -0.283548679421200540, -0.283500731174589240, -0.283452782219226100, -0.283404832555231020, -0.283356882182723420, -0.283308931101824040, +-0.283260979312652320, -0.283213026815328170, -0.283165073609971010, -0.283117119696701610, -0.283069165075639400, -0.283021209746903870, -0.282973253710615710, -0.282925296966894450, +-0.282877339515859920, -0.282829381357631640, -0.282781422492330290, -0.282733462920075450, -0.282685502640986910, -0.282637541655184180, -0.282589579962788050, -0.282541617563917940, +-0.282493654458693790, -0.282445690647235070, -0.282397726129662570, -0.282349760906095760, -0.282301794976654590, -0.282253828341458400, -0.282205861000628170, -0.282157892954283230, +-0.282109924202543550, -0.282061954745528640, -0.282013984583359300, -0.281966013716154980, -0.281918042144035210, -0.281870069867120760, -0.281822096885531110, -0.281774123199386270, +-0.281726148808805640, -0.281678173713910070, -0.281630197914819080, -0.281582221411652620, -0.281534244204530160, -0.281486266293572480, -0.281438287678899170, -0.281390308360630170, +-0.281342328338884950, -0.281294347613784300, -0.281246366185447790, -0.281198384053995390, -0.281150401219546600, -0.281102417682222220, -0.281054433442141820, -0.281006448499424910, +-0.280958462854192290, -0.280910476506563530, -0.280862489456658540, -0.280814501704596930, -0.280766513250499450, -0.280718524094485720, -0.280670534236675710, -0.280622543677188920, +-0.280574552416146210, -0.280526560453667080, -0.280478567789871570, -0.280430574424879180, -0.280382580358810810, -0.280334585591785980, -0.280286590123924710, -0.280238593955346560, +-0.280190597086172280, -0.280142599516521540, -0.280094601246513920, -0.280046602276270150, -0.279998602605909920, -0.279950602235553180, -0.279902601165319450, -0.279854599395329700, +-0.279806596925703480, -0.279758593756560700, -0.279710589888021060, -0.279662585320205330, -0.279614580053233200, -0.279566574087224570, -0.279518567422299080, -0.279470560058577620, +-0.279422551996179710, -0.279374543235225480, -0.279326533775834440, -0.279278523618127490, -0.279230512762224210, -0.279182501208244280, -0.279134488956308490, -0.279086476006536470, +-0.279038462359048280, -0.278990448013963500, -0.278942432971403030, -0.278894417231486450, -0.278846400794333870, -0.278798383660064820, -0.278750365828800250, -0.278702347300659790, +-0.278654328075763400, -0.278606308154230820, -0.278558287536182890, -0.278510266221739240, -0.278462244211019890, -0.278414221504144580, -0.278366198101234090, -0.278318174002408100, +-0.278270149207786700, -0.278222123717489440, -0.278174097531637350, -0.278126070650350050, -0.278078043073747120, -0.278030014801949440, -0.277981985835076830, -0.277933956173249170, +-0.277885925816586220, -0.277837894765208930, -0.277789863019236860, -0.277741830578790090, -0.277693797443988370, -0.277645763614952580, -0.277597729091802410, -0.277549693874657890, +-0.277501657963638680, -0.277453621358865750, -0.277405584060458840, -0.277357546068537910, -0.277309507383222690, -0.277261468004634140, -0.277213427932891940, -0.277165387168115670, +-0.277117345710426450, -0.277069303559943800, -0.277021260716787950, -0.276973217181078480, -0.276925172952936390, -0.276877128032481380, -0.276829082419833560, -0.276781036115112620, +-0.276732989118439470, -0.276684941429933880, -0.276636893049715950, -0.276588843977905340, -0.276540794214623020, -0.276492743759988780, -0.276444692614122630, -0.276396640777144320, +-0.276348588249174850, -0.276300535030333920, -0.276252481120741190, -0.276204426520517740, -0.276156371229783150, -0.276108315248657700, -0.276060258577261020, -0.276012201215714130, +-0.275964143164136700, -0.275916084422648920, -0.275868024991370530, -0.275819964870422480, -0.275771904059924520, -0.275723842559996820, -0.275675780370759070, -0.275627717492332280, +-0.275579653924836190, -0.275531589668391030, -0.275483524723116380, -0.275435459089133420, -0.275387392766561770, -0.275339325755521670, -0.275291258056132800, -0.275243189668516240, +-0.275195120592791660, -0.275147050829078920, -0.275098980377498910, -0.275050909238171490, -0.275002837411216780, -0.274954764896754580, -0.274906691694905890, -0.274858617805790460, +-0.274810543229528470, -0.274762467966239710, -0.274714392016045190, -0.274666315379064720, -0.274618238055418410, -0.274570160045226110, -0.274522081348608840, -0.274474001965686390, +-0.274425921896578880, -0.274377841141406180, -0.274329759700289330, -0.274281677573348040, -0.274233594760702140, -0.274185511262472650, -0.274137427078779420, -0.274089342209742630, +-0.274041256655482010, -0.273993170416118700, -0.273945083491772490, -0.273896995882563500, -0.273848907588611690, -0.273800818610037970, -0.273752728946962230, -0.273704638599504670, +-0.273656547567785070, -0.273608455851924500, -0.273560363452042820, -0.273512270368260260, -0.273464176600696550, -0.273416082149472880, -0.273367987014708990, -0.273319891196524670, +-0.273271794695041090, -0.273223697510378010, -0.273175599642655640, -0.273127501091993910, -0.273079401858513810, -0.273031301942335210, -0.272983201343578400, -0.272935100062363100, +-0.272886998098810510, -0.272838895453040410, -0.272790792125173100, -0.272742688115328370, -0.272694583423627350, -0.272646478050189880, -0.272598371995136150, -0.272550265258586110, +-0.272502157840660840, -0.272454049741480190, -0.272405940961163940, -0.272357831499833340, -0.272309721357608110, -0.272261610534608570, -0.272213499030954600, -0.272165386846767280, +-0.272117273982166510, -0.272069160437272580, -0.272021046212205300, -0.271972931307085830, -0.271924815722034030, -0.271876699457170190, -0.271828582512614160, -0.271780464888487120, +-0.271732346584908910, -0.271684227601999840, -0.271636107939879800, -0.271587987598669870, -0.271539866578490000, -0.271491744879460480, -0.271443622501701120, -0.271395499445333140, +-0.271347375710476460, -0.271299251297250850, -0.271251126205777630, -0.271203000436176510, -0.271154873988567910, -0.271106746863071730, -0.271058619059809050, -0.271010490578899870, +-0.270962361420464480, -0.270914231584622690, -0.270866101071495780, -0.270817969881203660, -0.270769838013866560, -0.270721705469604450, -0.270673572248538550, -0.270625438350788670, +-0.270577303776475210, -0.270529168525718070, -0.270481032598638430, -0.270432895995356190, -0.270384758715991270, -0.270336620760664950, -0.270288482129497020, -0.270240342822607890, +-0.270192202840117470, -0.270144062182147040, -0.270095920848816400, -0.270047778840245940, -0.269999636156555640, -0.269951492797866620, -0.269903348764298940, -0.269855204055972850, +-0.269807058673008360, -0.269758912615526590, -0.269710765883647560, -0.269662618477491680, -0.269614470397178730, -0.269566321642830060, -0.269518172214565640, -0.269470022112505310, +-0.269421871336770370, -0.269373719887480770, -0.269325567764756800, -0.269277414968718540, -0.269229261499487170, -0.269181107357182650, -0.269132952541925370, -0.269084797053835260, +-0.269036640893033590, -0.268988484059640260, -0.268940326553775810, -0.268892168375560070, -0.268844009525114340, -0.268795850002558620, -0.268747689808013220, -0.268699528941598210, +-0.268651367403434760, -0.268603205193642950, -0.268555042312343120, -0.268506878759655230, -0.268458714535700580, -0.268410549640599130, -0.268362384074470880, -0.268314217837437140, +-0.268266050929617810, -0.268217883351133330, -0.268169715102103800, -0.268121546182650330, -0.268073376592893040, -0.268025206332952290, -0.267977035402948090, -0.267928863803001740, +-0.267880691533233240, -0.267832518593763000, -0.267784344984711040, -0.267736170706198650, -0.267687995758345790, -0.267639820141273020, -0.267591643855100200, -0.267543466899948730, +-0.267495289275938570, -0.267447110983189800, -0.267398932021823690, -0.267350752391960210, -0.267302572093719830, -0.267254391127222660, -0.267206209492589890, -0.267158027189941580, +-0.267109844219398260, -0.267061660581079830, -0.267013476275107740, -0.266965291301601960, -0.266917105660682890, -0.266868919352470700, -0.266820732377086590, -0.266772544734650670, +-0.266724356425283360, -0.266676167449104770, -0.266627977806236200, -0.266579787496797670, -0.266531596520909190, -0.266483404878692210, -0.266435212570266700, -0.266387019595753170, +-0.266338825955271640, -0.266290631648943510, -0.266242436676888740, -0.266194241039227950, -0.266146044736081060, -0.266097847767569510, -0.266049650133813380, -0.266001451834933070, +-0.265953252871048760, -0.265905053242281700, -0.265856852948752000, -0.265808651990580180, -0.265760450367886310, -0.265712248080791750, -0.265664045129416600, -0.265615841513880850, +-0.265567637234305930, -0.265519432290811930, -0.265471226683519360, -0.265423020412548280, -0.265374813478020110, -0.265326605880054860, -0.265278397618773140, -0.265230188694294990, +-0.265181979106741740, -0.265133768856233630, -0.265085557942891010, -0.265037346366834130, -0.264989134128184310, -0.264940921227061640, -0.264892707663586640, -0.264844493437879470, +-0.264796278550061490, -0.264748063000252830, -0.264699846788574000, -0.264651629915145130, -0.264603412380087550, -0.264555194183521520, -0.264506975325567050, -0.264458755806345590, +-0.264410535625977220, -0.264362314784582500, -0.264314093282281560, -0.264265871119195860, -0.264217648295445470, -0.264169424811150910, -0.264121200666432410, -0.264072975861411320, +-0.264024750396207820, -0.263976524270942370, -0.263928297485735260, -0.263880070040707790, -0.263831841935980140, -0.263783613171672930, -0.263735383747906230, -0.263687153664801500, +-0.263638922922478870, -0.263590691521058520, -0.263542459460661900, -0.263494226741409100, -0.263445993363420730, -0.263397759326816970, -0.263349524631719180, -0.263301289278247640, +-0.263253053266522870, -0.263204816596665000, -0.263156579268795540, -0.263108341283034670, -0.263060102639502910, -0.263011863338320440, -0.262963623379608770, -0.262915382763488080, +-0.262867141490078890, -0.262818899559501440, -0.262770656971877130, -0.262722413727326190, -0.262674169825968810, -0.262625925267926390, -0.262577680053319220, -0.262529434182267820, +-0.262481187654892370, -0.262432940471314440, -0.262384692631654150, -0.262336444136032080, -0.262288194984568510, -0.262239945177384860, -0.262191694714601350, -0.262143443596338620, +-0.262095191822716840, -0.262046939393857540, -0.261998686309880880, -0.261950432570907500, -0.261902178177057580, -0.261853923128452680, -0.261805667425212940, -0.261757411067459090, +-0.261709154055311200, -0.261660896388890900, -0.261612638068318360, -0.261564379093713770, -0.261516119465198700, -0.261467859182893340, -0.261419598246918290, -0.261371336657393820, +-0.261323074414441470, -0.261274811518181440, -0.261226547968734350, -0.261178283766220430, -0.261130018910761260, -0.261081753402477080, -0.261033487241488500, -0.260985220427915720, +-0.260936952961880350, -0.260888684843502640, -0.260840416072903150, -0.260792146650202230, -0.260743876575521390, -0.260695605848980830, -0.260647334470700820, -0.260599062440802940, +-0.260550789759407380, -0.260502516426634800, -0.260454242442605570, -0.260405967807441130, -0.260357692521261790, -0.260309416584188210, -0.260261139996340650, -0.260212862757840670, +-0.260164584868808560, -0.260116306329364940, -0.260068027139630180, -0.260019747299725710, -0.259971466809771960, -0.259923185669889480, -0.259874903880198630, -0.259826621440820920, +-0.259778338351876690, -0.259730054613486190, -0.259681770225770990, -0.259633485188851320, -0.259585199502847970, -0.259536913167881190, -0.259488626184072530, -0.259440338551542300, +-0.259392050270411290, -0.259343761340799670, -0.259295471762829080, -0.259247181536619850, -0.259198890662292620, -0.259150599139967740, -0.259102306969766830, -0.259054014151810120, +-0.259005720686218350, -0.258957426573111880, -0.258909131812612270, -0.258860836404839870, -0.258812540349914910, -0.258764243647959020, -0.258715946299092500, -0.258667648303436190, +-0.258619349661110280, -0.258571050372236430, -0.258522750436934960, -0.258474449855326580, -0.258426148627531660, -0.258377846753671810, -0.258329544233867390, -0.258281241068239080, +-0.258232937256907210, -0.258184632799993430, -0.258136327697618070, -0.258088021949901940, -0.258039715556965250, -0.257991408518929770, -0.257943100835915710, -0.257894792508043920, +-0.257846483535434710, -0.257798173918209750, -0.257749863656489330, -0.257701552750393860, -0.257653241200044900, -0.257604929005562810, -0.257556616167068430, -0.257508302684682110, +-0.257459988558525420, -0.257411673788718760, -0.257363358375382930, -0.257315042318638280, -0.257266725618606470, -0.257218408275407820, -0.257170090289163160, -0.257121771659992840, +-0.257073452388018540, -0.257025132473360560, -0.256976811916139800, -0.256928490716476550, -0.256880168874492500, -0.256831846390308040, -0.256783523264043520, -0.256735199495820690, +-0.256686875085759770, -0.256638550033981730, -0.256590224340606850, -0.256541898005756830, -0.256493571029552060, -0.256445243412113390, -0.256396915153561170, -0.256348586254017130, +-0.256300256713601570, -0.256251926532435390, -0.256203595710638940, -0.256155264248333960, -0.256106932145640840, -0.256058599402680330, -0.256010266019572940, -0.255961931996440300, +-0.255913597333402850, -0.255865262030580910, -0.255816926088096310, -0.255768589506069400, -0.255720252284620970, -0.255671914423871490, -0.255623575923942690, -0.255575236784954920, +-0.255526897007029070, -0.255478556590285510, -0.255430215534846070, -0.255381873840831000, -0.255333531508361300, -0.255285188537557330, -0.255236844928540820, -0.255188500681432170, +-0.255140155796352300, -0.255091810273421650, -0.255043464112761850, -0.254995117314493370, -0.254946769878737160, -0.254898421805613560, -0.254850073095244320, -0.254801723747749900, +-0.254753373763250750, -0.254705023141868600, -0.254656671883723930, -0.254608319988937510, -0.254559967457629930, -0.254511614289922810, -0.254463260485936650, -0.254414906045792370, +-0.254366550969610360, -0.254318195257512420, -0.254269838909619020, -0.254221481926050990, -0.254173124306928840, -0.254124766052374330, -0.254076407162507840, -0.254028047637450400, +-0.253979687477322410, -0.253931326682245610, -0.253882965252340440, -0.253834603187727490, -0.253786240488528440, -0.253737877154863790, -0.253689513186854450, -0.253641148584620950, +-0.253592783348284940, -0.253544417477966970, -0.253496050973788020, -0.253447683835868460, -0.253399316064330140, -0.253350947659293500, -0.253302578620879510, -0.253254208949208640, +-0.253205838644402710, -0.253157467706582150, -0.253109096135867910, -0.253060723932380550, -0.253012351096241760, -0.252963977627572110, -0.252915603526492060, -0.252867228793123460, +-0.252818853427586810, -0.252770477430002970, -0.252722100800492570, -0.252673723539177330, -0.252625345646177780, -0.252576967121614810, -0.252528587965609060, -0.252480208178282260, +-0.252431827759754920, -0.252383446710148010, -0.252335065029582030, -0.252286682718178890, -0.252238299776058990, -0.252189916203343360, -0.252141532000152490, -0.252093147166608240, +-0.252044761702831130, -0.251996375608941670, -0.251947988885061700, -0.251899601531311750, -0.251851213547812810, -0.251802824934685370, -0.251754435692051360, -0.251706045820031200, +-0.251657655318745950, -0.251609264188316140, -0.251560872428863600, -0.251512480040508910, -0.251464087023372970, -0.251415693377576410, -0.251367299103241020, -0.251318904200487410, +-0.251270508669436510, -0.251222112510208930, -0.251173715722926520, -0.251125318307709790, -0.251076920264679760, -0.251028521593957000, -0.250980122295663410, -0.250931722369919450, +-0.250883321816845810, -0.250834920636564260, -0.250786518829195390, -0.250738116394860270, -0.250689713333679400, -0.250641309645774690, -0.250592905331266710, -0.250544500390276480, +-0.250496094822924560, -0.250447688629332810, -0.250399281809621840, -0.250350874363912680, -0.250302466292325890, -0.250254057594983370, -0.250205648272005750, -0.250157238323513940, +-0.250108827749628670, -0.250060416550471680, -0.250012004726163690, -0.249963592276825300, -0.249915179202578300, -0.249866765503543390, -0.249818351179841550, -0.249769936231593410, +-0.249721520658920840, -0.249673104461944490, -0.249624687640785350, -0.249576270195564110, -0.249527852126402580, -0.249479433433421440, -0.249431014116741710, -0.249382594176484010, +-0.249334173612770270, -0.249285752425721100, -0.249237330615457530, -0.249188908182100210, -0.249140485125771060, -0.249092061446590680, -0.249043637144679720, -0.248995212220160110, +-0.248946786673152450, -0.248898360503777840, -0.248849933712156880, -0.248801506298411550, -0.248753078262662440, -0.248704649605030610, -0.248656220325636750, -0.248607790424602760, +-0.248559359902049300, -0.248510928758097440, -0.248462496992867820, -0.248414064606482410, -0.248365631599061800, -0.248317197970727150, -0.248268763721599060, -0.248220328851799480, +-0.248171893361449100, -0.248123457250668980, -0.248075020519579780, -0.248026583168303450, -0.247978145196960680, -0.247929706605672100, -0.247881267394559710, -0.247832827563744110, +-0.247784387113346470, -0.247735946043487420, -0.247687504354288960, -0.247639062045871720, -0.247590619118356840, -0.247542175571864950, -0.247493731406518090, -0.247445286622436870, +-0.247396841219742450, -0.247348395198555500, -0.247299948558997980, -0.247251501301190580, -0.247203053425254450, -0.247154604931310250, -0.247106155819479980, -0.247057706089884280, +-0.247009255742643930, -0.246960804777880850, -0.246912353195715750, -0.246863900996269790, -0.246815448179663640, -0.246766994746019290, -0.246718540695457460, -0.246670086028099260, +-0.246621630744065430, -0.246573174843477960, -0.246524718326457560, -0.246476261193125350, -0.246427803443602040, -0.246379345078009680, -0.246330886096468940, -0.246282426499101010, +-0.246233966286026560, -0.246185505457367640, -0.246137044013244930, -0.246088581953779200, -0.246040119279092450, -0.245991655989305390, -0.245943192084539190, -0.245894727564914590, +-0.245846262430553600, -0.245797796681576950, -0.245749330318105810, -0.245700863340260920, -0.245652395748164280, -0.245603927541936660, -0.245555458721699230, -0.245506989287572720, +-0.245458519239679180, -0.245410048578139330, -0.245361577303074340, -0.245313105414605020, -0.245264632912853330, -0.245216159797940060, -0.245167686069986400, -0.245119211729113110, +-0.245070736775442190, -0.245022261209094460, -0.244973785030190630, -0.244925308238852750, -0.244876830835201620, -0.244828352819358410, -0.244779874191443900, -0.244731394951580110, +-0.244682915099887850, -0.244634434636488320, -0.244585953561502230, -0.244537471875051700, -0.244488989577257510, -0.244440506668240850, -0.244392023148122470, -0.244343539017024460, +-0.244295054275067620, -0.244246568922373150, -0.244198082959061810, -0.244149596385255680, -0.244101109201075580, -0.244052621406642300, -0.244004133002077850, -0.243955643987503110, +-0.243907154363039220, -0.243858664128807050, -0.243810173284928630, -0.243761681831524770, -0.243713189768716730, -0.243664697096625250, -0.243616203815372500, -0.243567709925079200, +-0.243519215425866660, -0.243470720317855630, -0.243422224601168250, -0.243373728275925270, -0.243325231342248010, -0.243276733800257220, -0.243228235650075040, -0.243179736891822260, +-0.243131237525619710, -0.243082737551589490, -0.243034236969852440, -0.242985735780529790, -0.242937233983742370, -0.242888731579612300, -0.242840228568260370, -0.242791724949807910, +-0.242743220724375680, -0.242694715892085850, -0.242646210453059230, -0.242597704407417070, -0.242549197755280220, -0.242500690496770810, -0.242452182632009680, -0.242403674161118100, +-0.242355165084216890, -0.242306655401428210, -0.242258145112872860, -0.242209634218671750, -0.242161122718946960, -0.242112610613819390, -0.242064097903410270, -0.242015584587840500, +-0.241967070667232190, -0.241918556141706180, -0.241870041011383820, -0.241821525276385900, -0.241773008936834590, -0.241724491992850790, -0.241675974444555740, -0.241627456292070300, +-0.241578937535516680, -0.241530418175015720, -0.241481898210688720, -0.241433377642656520, -0.241384856471041300, -0.241336334695963970, -0.241287812317545790, -0.241239289335907630, +-0.241190765751171710, -0.241142241563458870, -0.241093716772889960, -0.241045191379587210, -0.240996665383671510, -0.240948138785264110, -0.240899611584485950, -0.240851083781459200, +-0.240802555376304710, -0.240754026369143860, -0.240705496760097500, -0.240656966549287840, -0.240608435736835740, -0.240559904322862560, -0.240511372307489200, -0.240462839690837840, +-0.240414306473029390, -0.240365772654185160, -0.240317238234426050, -0.240268703213874310, -0.240220167592650800, -0.240171631370876440, -0.240123094548673420, -0.240074557126162660, +-0.240026019103465520, -0.239977480480702910, -0.239928941257997020, -0.239880401435468770, -0.239831861013239530, -0.239783319991430180, -0.239734778370162990, -0.239686236149558860, +-0.239637693329739110, -0.239589149910824720, -0.239540605892937880, -0.239492061276199510, -0.239443516060731030, -0.239394970246653290, -0.239346423834088550, -0.239297876823157780, +-0.239249329213981870, -0.239200781006683070, -0.239152232201382320, -0.239103682798200990, -0.239055132797260010, -0.239006582198681650, -0.238958031002586810, -0.238909479209096910, +-0.238860926818332870, -0.238812373830416950, -0.238763820245470100, -0.238715266063613710, -0.238666711284968690, -0.238618155909657350, -0.238569599937800610, -0.238521043369519880, +-0.238472486204936110, -0.238423928444171540, -0.238375370087347160, -0.238326811134584370, -0.238278251586004100, -0.238229691441728620, -0.238181130701878930, -0.238132569366575980, +-0.238084007435942050, -0.238035444910098090, -0.237986881789165520, -0.237938318073265320, -0.237889753762519750, -0.237841188857049800, -0.237792623356976870, -0.237744057262421950, +-0.237695490573507310, -0.237646923290353970, -0.237598355413083300, -0.237549786941816300, -0.237501217876675300, -0.237452648217781230, -0.237404077965255560, -0.237355507119219240, +-0.237306935679794610, -0.237258363647102620, -0.237209791021264300, -0.237161217802401900, -0.237112643990636500, -0.237064069586089470, -0.237015494588881850, -0.236966918999135910, +-0.236918342816972660, -0.236869766042513590, -0.236821188675879650, -0.236772610717193160, -0.236724032166575170, -0.236675453024147080, -0.236626873290029930, -0.236578292964346040, +-0.236529712047216400, -0.236481130538762490, -0.236432548439105330, -0.236383965748367230, -0.236335382466669190, -0.236286798594132290, -0.236238214130878810, -0.236189629077029810, +-0.236141043432706730, -0.236092457198030600, -0.236043870373123770, -0.235995282958107260, -0.235946694953102530, -0.235898106358230640, -0.235849517173613910, -0.235800927399373420, +-0.235752337035630590, -0.235703746082506470, -0.235655154540123420, -0.235606562408602500, -0.235557969688065170, -0.235509376378632480, -0.235460782480426790, -0.235412187993569140, +-0.235363592918180600, -0.235314997254383480, -0.235266401002298900, -0.235217804162048290, -0.235169206733752740, -0.235120608717534620, -0.235072010113514970, -0.235023410921815310, +-0.234974811142556670, -0.234926210775861430, -0.234877609821850690, -0.234829008280645900, -0.234780406152368170, -0.234731803437139840, -0.234683200135082040, -0.234634596246316220, +-0.234585991770963450, -0.234537386709146170, -0.234488781060985390, -0.234440174826602680, -0.234391568006119100, -0.234342960599657040, -0.234294352607337550, -0.234245744029281780, +-0.234197134865612060, -0.234148525116449510, -0.234099914781915660, -0.234051303862131580, -0.234002692357219650, -0.233954080267301020, -0.233905467592497200, -0.233856854332929240, +-0.233808240488719590, -0.233759626059989340, -0.233711011046860040, -0.233662395449452780, -0.233613779267889950, -0.233565162502292670, -0.233516545152782500, -0.233467927219480510, +-0.233419308702509150, -0.233370689601989530, -0.233322069918042750, -0.233273449650791190, -0.233224828800356050, -0.233176207366858820, -0.233127585350420640, -0.233078962751163940, +-0.233030339569209820, -0.232981715804679860, -0.232933091457695170, -0.232884466528378190, -0.232835841016850040, -0.232787214923232290, -0.232738588247646070, -0.232689960990213800, +-0.232641333151056650, -0.232592704730296140, -0.232544075728053470, -0.232495446144451000, -0.232446815979609950, -0.232398185233651410, -0.232349553906697870, -0.232300921998870400, +-0.232252289510290640, -0.232203656441079740, -0.232155022791360130, -0.232106388561252960, -0.232057753750879810, -0.232009118360361840, -0.231960482389821530, -0.231911845839379990, +-0.231863208709158860, -0.231814570999279240, -0.231765932709863650, -0.231717293841033230, -0.231668654392909570, -0.231620014365613830, -0.231571373759268510, -0.231522732573994750, +-0.231474090809914130, -0.231425448467147880, -0.231376805545818440, -0.231328162046046980, -0.231279517967954680, -0.231230873311664030, -0.231182228077296190, -0.231133582264972770, +-0.231084935874814960, -0.231036288906945250, -0.230987641361484840, -0.230938993238555300, -0.230890344538277840, -0.230841695260774970, -0.230793045406167850, -0.230744394974578130, +-0.230695743966126960, -0.230647092380936890, -0.230598440219129090, -0.230549787480825190, -0.230501134166146370, -0.230452480275215170, -0.230403825808152750, -0.230355170765080330, +-0.230306515146120440, -0.230257858951394250, -0.230209202181023420, -0.230160544835129130, -0.230111886913833940, -0.230063228417259010, -0.230014569345526030, -0.229965909698756160, +-0.229917249477071980, -0.229868588680594650, -0.229819927309445870, -0.229771265363746840, -0.229722602843620060, -0.229673939749186790, -0.229625276080568680, -0.229576611837886910, +-0.229527947021264080, -0.229479281630821370, -0.229430615666680020, -0.229381949128962560, -0.229333282017790240, -0.229284614333284700, -0.229235946075567220, -0.229187277244760290, +-0.229138607840985160, -0.229089937864363520, -0.229041267315016590, -0.228992596193066940, -0.228943924498635790, -0.228895252231844840, -0.228846579392815300, -0.228797905981669770, +-0.228749231998529480, -0.228700557443516080, -0.228651882316750880, -0.228603206618356400, -0.228554530348453910, -0.228505853507164650, -0.228457176094611190, -0.228408498110914790, +-0.228359819556197140, -0.228311140430579510, -0.228262460734184490, -0.228213780467133280, -0.228165099629547650, -0.228116418221548820, -0.228067736243259380, -0.228019053694800610, +-0.227970370576294180, -0.227921686887861410, -0.227873002629624840, -0.227824317801705780, -0.227775632404225940, -0.227726946437306570, -0.227678259901070240, -0.227629572795638310, +-0.227580885121132420, -0.227532196877673870, -0.227483508065385280, -0.227434818684387920, -0.227386128734803100, -0.227337438216753370, -0.227288747130360040, -0.227240055475744830, +-0.227191363253029080, -0.227142670462335330, -0.227093977103784930, -0.227045283177499560, -0.226996588683600560, -0.226947893622210520, -0.226899197993450760, -0.226850501797442980, +-0.226801805034308520, -0.226753107704170010, -0.226704409807148700, -0.226655711343366370, -0.226607012312944330, -0.226558312716005210, -0.226509612552670270, -0.226460911823060910, +-0.226412210527299680, -0.226363508665507920, -0.226314806237807390, -0.226266103244319420, -0.226217399685166630, -0.226168695560470310, -0.226119990870352280, -0.226071285614933840, +-0.226022579794337620, -0.225973873408684940, -0.225925166458097570, -0.225876458942696870, -0.225827750862605450, -0.225779042217944650, -0.225730333008836240, -0.225681623235401560, +-0.225632912897763270, -0.225584201996042680, -0.225535490530361180, -0.225486778500841370, -0.225438065907604600, -0.225389352750772680, -0.225340639030466940, -0.225291924746810030, +-0.225243209899923330, -0.225194494489928590, -0.225145778516947200, -0.225097061981101770, -0.225048344882513710, -0.224999627221304760, -0.224950908997596320, -0.224902190211511060, +-0.224853470863170310, -0.224804750952695860, -0.224756030480209150, -0.224707309445832750, -0.224658587849688090, -0.224609865691896980, -0.224561142972580760, -0.224512419691862110, +-0.224463695849862420, -0.224414971446703050, -0.224366246482506660, -0.224317520957394710, -0.224268794871488930, -0.224220068224910720, -0.224171341017782770, -0.224122613250226480, +-0.224073884922363660, -0.224025156034315690, -0.223976426586205260, -0.223927696578153780, -0.223878966010283040, -0.223830234882714450, -0.223781503195570720, -0.223732770948973230, +-0.223684038143043800, -0.223635304777903860, -0.223586570853676090, -0.223537836370481860, -0.223489101328442630, -0.223440365727681080, -0.223391629568318620, -0.223342892850477090, +-0.223294155574277900, -0.223245417739843720, -0.223196679347296030, -0.223147940396756620, -0.223099200888346950, -0.223050460822189680, -0.223001720198406280, -0.222952979017118580, +-0.222904237278447990, -0.222855494982517250, -0.222806752129447750, -0.222758008719361380, -0.222709264752379570, -0.222660520228625040, -0.222611775148219170, -0.222563029511283460, +-0.222514283317940600, -0.222465536568312030, -0.222416789262519620, -0.222368041400684810, -0.222319292982930320, -0.222270544009377600, -0.222221794480148530, -0.222173044395364530, +-0.222124293755148360, -0.222075542559621450, -0.222026790808905670, -0.221978038503122500, -0.221929285642394670, -0.221880532226843620, -0.221831778256591230, -0.221783023731758950, +-0.221734268652469590, -0.221685513018844510, -0.221636756831005250, -0.221588000089074500, -0.221539242793173770, -0.221490484943424940, -0.221441726539949450, -0.221392967582870080, +-0.221344208072308280, -0.221295448008385990, -0.221246687391224630, -0.221197926220946970, -0.221149164497674520, -0.221100402221529160, -0.221051639392632340, -0.221002876011106850, +-0.220954112077074190, -0.220905347590656250, -0.220856582551974490, -0.220807816961151730, -0.220759050818309400, -0.220710284123569470, -0.220661516877053400, -0.220612749078883950, +-0.220563980729182620, -0.220515211828070930, -0.220466442375671650, -0.220417672372106240, -0.220368901817496660, -0.220320130711964380, -0.220271359055632220, -0.220222586848621640, +-0.220173814091054630, -0.220125040783052620, -0.220076266924738470, -0.220027492516233630, -0.219978717557660080, -0.219929942049139270, -0.219881165990794050, -0.219832389382745940, +-0.219783612225116830, -0.219734834518028280, -0.219686056261603040, -0.219637277455962680, -0.219588498101228710, -0.219539718197523910, -0.219490937744969810, -0.219442156743688390, +-0.219393375193801120, -0.219344593095430830, -0.219295810448699090, -0.219247027253727830, -0.219198243510638550, -0.219149459219554090, -0.219100674380595990, -0.219051888993886220, +-0.219003103059546260, -0.218954316577699010, -0.218905529548465950, -0.218856741971969050, -0.218807953848329910, -0.218759165177671270, -0.218710375960114750, -0.218661586195781830, +-0.218612795884795400, -0.218564005027276960, -0.218515213623348530, -0.218466421673131630, -0.218417629176749090, -0.218368836134322510, -0.218320042545973810, -0.218271248411824580, +-0.218222453731997670, -0.218173658506614600, -0.218124862735797400, -0.218076066419667620, -0.218027269558348110, -0.217978472151960400, -0.217929674200626530, -0.217880875704468040, +-0.217832076663607790, -0.217783277078167360, -0.217734476948268720, -0.217685676274033460, -0.217636875055584430, -0.217588073293043220, -0.217539270986531420, -0.217490468136171840, +-0.217441664742086120, -0.217392860804396210, -0.217344056323223730, -0.217295251298691540, -0.217246445730921220, -0.217197639620034800, -0.217148832966153840, -0.217100025769401210, +-0.217051218029898550, -0.217002409747767830, -0.216953600923130650, -0.216904791556109890, -0.216855981646827150, -0.216807171195404490, -0.216758360201963430, -0.216709548666626920, +-0.216660736589516540, -0.216611923970753910, -0.216563110810461870, -0.216514297108762050, -0.216465482865776490, -0.216416668081626800, -0.216367852756435890, -0.216319036890325310, +-0.216270220483417150, -0.216221403535833020, -0.216172586047695820, -0.216123768019127140, -0.216074949450249050, -0.216026130341183150, -0.215977310692052340, -0.215928490502978270, +-0.215879669774082960, -0.215830848505488060, -0.215782026697316470, -0.215733204349689790, -0.215684381462729700, -0.215635558036559070, -0.215586734071299550, -0.215537909567073190, +-0.215489084524001620, -0.215440258942207780, -0.215391432821813310, -0.215342606162940240, -0.215293778965710200, -0.215244951230246170, -0.215196122956669760, -0.215147294145103060, +-0.215098464795667660, -0.215049634908486550, -0.215000804483681330, -0.214951973521374130, -0.214903142021686560, -0.214854309984741560, -0.214805477410660780, -0.214756644299565870, +-0.214707810651579790, -0.214658976466824190, -0.214610141745421120, -0.214561306487492300, -0.214512470693160620, -0.214463634362547780, -0.214414797495775860, -0.214365960092966490, +-0.214317122154242670, -0.214268283679726030, -0.214219444669538680, -0.214170605123802320, -0.214121765042639860, -0.214072924426172980, -0.214024083274523800, -0.213975241587813950, +-0.213926399366166450, -0.213877556609702950, -0.213828713318545580, -0.213779869492815970, -0.213731025132637110, -0.213682180238130710, -0.213633334809418430, -0.213584488846623230, +-0.213535642349866800, -0.213486795319271280, -0.213437947754958330, -0.213389099657050970, -0.213340251025670840, -0.213291401860940060, -0.213242552162980380, -0.213193701931914730, +-0.213144851167864830, -0.213095999870952820, -0.213047148041300340, -0.212998295679030450, -0.212949442784264810, -0.212900589357125580, -0.212851735397734440, -0.212802880906214380, +-0.212754025882687130, -0.212705170327274370, -0.212656314240099120, -0.212607457621283110, -0.212558600470948430, -0.212509742789216830, -0.212460884576211290, -0.212412025832053540, +-0.212363166556865740, -0.212314306750769570, -0.212265446413888090, -0.212216585546342980, -0.212167724148256410, -0.212118862219750100, -0.212069999760947060, -0.212021136771969020, +-0.211972273252938160, -0.211923409203976150, -0.211874544625206080, -0.211825679516749630, -0.211776813878728540, -0.211727947711265880, -0.211679081014483320, -0.211630213788503080, +-0.211581346033446860, -0.211532477749437700, -0.211483608936597370, -0.211434739595047990, -0.211385869724911360, -0.211336999326310480, -0.211288128399367090, -0.211239256944203370, +-0.211190384960941090, -0.211141512449703280, -0.211092639410611680, -0.211043765843788510, -0.210994891749355460, -0.210946017127435630, -0.210897141978150740, -0.210848266301623010, +-0.210799390097974190, -0.210750513367327310, -0.210701636109804140, -0.210652758325526460, -0.210603880014617330, -0.210555001177198470, -0.210506121813392150, -0.210457241923320050, +-0.210408361507105290, -0.210359480564869640, -0.210310599096735270, -0.210261717102823990, -0.210212834583258850, -0.210163951538161610, -0.210115067967654500, -0.210066183871859270, +-0.210017299250899010, -0.209968414104895530, -0.209919528433971020, -0.209870642238247220, -0.209821755517847260, -0.209772868272892930, -0.209723980503505990, -0.209675092209809510, +-0.209626203391925340, -0.209577314049975620, -0.209528424184082210, -0.209479533794368150, -0.209430642880955280, -0.209381751443965790, -0.209332859483521480, -0.209283966999745470, +-0.209235073992759530, -0.209186180462685920, -0.209137286409646410, -0.209088391833764130, -0.209039496735160840, -0.208990601113958840, -0.208941704970279890, -0.208892808304247140, +-0.208843911115982330, -0.208795013405607330, -0.208746115173245230, -0.208697216419017840, -0.208648317143047410, -0.208599417345455730, -0.208550517026365980, -0.208501616185899910, +-0.208452714824179820, -0.208403812941327480, -0.208354910537466080, -0.208306007612717360, -0.208257104167203670, -0.208208200201046740, -0.208159295714369780, -0.208110390707294560, +-0.208061485179943360, -0.208012579132438010, -0.207963672564901670, -0.207914765477456130, -0.207865857870223240, -0.207816949743326150, -0.207768041096886680, -0.207719131931027120, +-0.207670222245869280, -0.207621312041536330, -0.207572401318150110, -0.207523490075832870, -0.207474578314706480, -0.207425666034894070, -0.207376753236517470, -0.207327839919699030, +-0.207278926084560530, -0.207230011731225160, -0.207181096859814760, -0.207132181470451620, -0.207083265563257600, -0.207034349138355830, -0.206985432195868210, -0.206936514735916980, +-0.206887596758624060, -0.206838678264112560, -0.206789759252504370, -0.206740839723921350, -0.206691919678486660, -0.206642999116322200, -0.206594078037550200, -0.206545156442292600, +-0.206496234330672520, -0.206447311702811890, -0.206398388558832940, -0.206349464898857610, -0.206300540723009050, -0.206251616031409120, -0.206202690824180160, -0.206153765101444040, +-0.206104838863323950, -0.206055912109941760, -0.206006984841419770, -0.205958057057879920, -0.205909128759445340, -0.205860199946237940, -0.205811270618379590, -0.205762340775993540, +-0.205713410419201600, -0.205664479548126140, -0.205615548162889040, -0.205566616263613530, -0.205517683850421460, -0.205468750923435190, -0.205419817482776600, -0.205370883528568910, +-0.205321949060934010, -0.205273014079994240, -0.205224078585871490, -0.205175142578688990, -0.205126206058568630, -0.205077269025632750, -0.205028331480003270, -0.204979393421803380, +-0.204930454851155020, -0.204881515768180090, -0.204832576173001800, -0.204783636065742070, -0.204734695446523260, -0.204685754315467260, -0.204636812672697320, -0.204587870518335320, +-0.204538927852503690, -0.204489984675324280, -0.204441040986920340, -0.204392096787413820, -0.204343152076927050, -0.204294206855581940, -0.204245261123501780, -0.204196314880808440, +-0.204147368127624320, -0.204098420864071370, -0.204049473090272770, -0.204000524806350500, -0.203951576012426920, -0.203902626708623970, -0.203853676895064890, -0.203804726571871600, +-0.203755775739166090, -0.203706824397071550, -0.203657872545709940, -0.203608920185203680, -0.203559967315674660, -0.203511013937246160, -0.203462060050040140, -0.203413105654178940, +-0.203364150749784590, -0.203315195336980250, -0.203266239415887950, -0.203217282986630030, -0.203168326049328500, -0.203119368604106560, -0.203070410651086220, -0.203021452190389830, +-0.202972493222139390, -0.202923533746458130, -0.202874573763468070, -0.202825613273291130, -0.202776652276050570, -0.202727690771868420, -0.202678728760867010, -0.202629766243168360, +-0.202580803218895710, -0.202531839688171070, -0.202482875651116830, -0.202433911107854970, -0.202384946058508740, -0.202335980503200170, -0.202287014442051630, -0.202238047875185150, +-0.202189080802723960, -0.202140113224790090, -0.202091145141505920, -0.202042176552993450, -0.201993207459375960, -0.201944237860775480, -0.201895267757313950, -0.201846297149114700, +-0.201797326036299710, -0.201748354418991390, -0.201699382297311770, -0.201650409671384120, -0.201601436541330450, -0.201552462907273160, -0.201503488769334300, -0.201454514127637150, +-0.201405538982303730, -0.201356563333456450, -0.201307587181217330, -0.201258610525709670, -0.201209633367055500, -0.201160655705377220, -0.201111677540796870, -0.201062698873437780, +-0.201013719703421940, -0.200964740030871360, -0.200915759855909370, -0.200866779178657970, -0.200817797999239630, -0.200768816317776350, -0.200719834134391480, -0.200670851449207020, +-0.200621868262345400, -0.200572884573928720, -0.200523900384080240, -0.200474915692922030, -0.200425930500576500, -0.200376944807165720, -0.200327958612813020, -0.200278971917640440, +-0.200229984721770390, -0.200180997025324990, -0.200132008828427490, -0.200083020131200000, -0.200034030933764930, -0.199985041236244360, -0.199936051038761640, -0.199887060341438770, +-0.199838069144397830, -0.199789077447762140, -0.199740085251653770, -0.199691092556195160, -0.199642099361508420, -0.199593105667716850, -0.199544111474942500, -0.199495116783307890, +-0.199446121592935070, -0.199397125903947340, -0.199348129716466820, -0.199299133030615970, -0.199250135846516850, -0.199201138164292830, -0.199152139984065970, -0.199103141305958740, +-0.199054142130093260, -0.199005142456592820, -0.198956142285579530, -0.198907141617175460, -0.198858140451503990, -0.198809138788687140, -0.198760136628847450, -0.198711133972106990, +-0.198662130818589130, -0.198613127168415950, -0.198564123021709920, -0.198515118378593170, -0.198466113239189060, -0.198417107603619660, -0.198368101472007510, -0.198319094844474660, +-0.198270087721144490, -0.198221080102139120, -0.198172071987581050, -0.198123063377592360, -0.198074054272296430, -0.198025044671815390, -0.197976034576271300, -0.197927023985787570, +-0.197878012900486260, -0.197829001320489920, -0.197779989245920630, -0.197730976676901820, -0.197681963613555580, -0.197632950056004400, -0.197583936004370440, -0.197534921458777050, +-0.197485906419346380, -0.197436890886200920, -0.197387874859462800, -0.197338858339255440, -0.197289841325700930, -0.197240823818921830, -0.197191805819040220, -0.197142787326179540, +-0.197093768340461880, -0.197044748862009820, -0.196995728890945440, -0.196946708427392150, -0.196897687471472130, -0.196848666023307420, -0.196799644083021500, -0.196750621650736480, +-0.196701598726574890, -0.196652575310658860, -0.196603551403111840, -0.196554527004055930, -0.196505502113613730, -0.196456476731907300, -0.196407450859060140, -0.196358424495194360, +-0.196309397640432510, -0.196260370294896710, -0.196211342458710440, -0.196162314131995810, -0.196113285314875400, -0.196064256007471350, -0.196015226209907080, -0.195966195922304740, +-0.195917165144786490, -0.195868133877475760, -0.195819102120494660, -0.195770069873965860, -0.195721037138011420, -0.195672003912754830, -0.195622970198318230, -0.195573935994824200, +-0.195524901302394890, -0.195475866121153780, -0.195426830451222970, -0.195377794292725120, -0.195328757645782340, -0.195279720510518090, -0.195230682887054560, -0.195181644775514310, +-0.195132606176019520, -0.195083567088693620, -0.195034527513658850, -0.194985487451037300, -0.194936446900952460, -0.194887405863526510, -0.194838364338882050, -0.194789322327141250, +-0.194740279828427560, -0.194691236842863190, -0.194642193370570700, -0.194593149411672330, -0.194544104966291490, -0.194495060034550390, -0.194446014616571660, -0.194396968712477440, +-0.194347922322391260, -0.194298875446435260, -0.194249828084732040, -0.194200780237403860, -0.194151731904574130, -0.194102683086365110, -0.194053633782898920, -0.194004583994299070, +-0.193955533720687770, -0.193906482962187650, -0.193857431718920890, -0.193808379991010970, -0.193759327778580100, -0.193710275081750930, -0.193661221900645610, -0.193612168235387680, +-0.193563114086099330, -0.193514059452903200, -0.193465004335921480, -0.193415948735277700, -0.193366892651094020, -0.193317836083493150, -0.193268779032597200, -0.193219721498529780, +-0.193170663481413040, -0.193121604981369650, -0.193072545998521810, -0.193023486532993030, -0.192974426584905550, -0.192925366154381550, -0.192876305241544590, -0.192827243846516870, +-0.192778181969421010, -0.192729119610379280, -0.192680056769515190, -0.192630993446950950, -0.192581929642809240, -0.192532865357212260, -0.192483800590283530, -0.192434735342145340, +-0.192385669612920280, -0.192336603402730620, -0.192287536711699900, -0.192238469539950330, -0.192189401887604580, -0.192140333754784900, -0.192091265141614790, -0.192042196048216540, +-0.191993126474712370, -0.191944056421225830, -0.191894985887879120, -0.191845914874794960, -0.191796843382095600, -0.191747771409904540, -0.191698698958344040, -0.191649626027536820, +-0.191600552617605090, -0.191551478728672400, -0.191502404360861020, -0.191453329514293640, -0.191404254189092520, -0.191355178385381160, -0.191306102103281860, -0.191257025342917330, +-0.191207948104409780, -0.191158870387882820, -0.191109792193458670, -0.191060713521259580, -0.191011634371409170, -0.190962554744029650, -0.190913474639243770, -0.190864394057173760, +-0.190815312997943190, -0.190766231461674350, -0.190717149448489910, -0.190668066958512180, -0.190618983991864720, -0.190569900548669820, -0.190520816629050130, -0.190471732233127970, +-0.190422647361026930, -0.190373562012869260, -0.190324476188777710, -0.190275389888874490, -0.190226303113283260, -0.190177215862126270, -0.190128128135526240, -0.190079039933605450, +-0.190029951256487500, -0.189980862104294660, -0.189931772477149240, -0.189882682375174830, -0.189833591798493710, -0.189784500747228610, -0.189735409221501810, -0.189686317221436950, +-0.189637224747156270, -0.189588131798782530, -0.189539038376438040, -0.189489944480246390, -0.189440850110329880, -0.189391755266811230, -0.189342659949812750, -0.189293564159458080, +-0.189244467895869490, -0.189195371159169730, -0.189146273949481110, -0.189097176266927240, -0.189048078111630410, -0.188998979483712970, -0.188949880383298520, -0.188900780810509340, +-0.188851680765468240, -0.188802580248297490, -0.188753479259120730, -0.188704377798060260, -0.188655275865238860, -0.188606173460778820, -0.188557070584803810, -0.188507967237436100, +-0.188458863418798470, -0.188409759129013250, -0.188360654368204070, -0.188311549136493260, -0.188262443434003580, -0.188213337260857340, -0.188164230617178210, -0.188115123503088480, +-0.188066015918710530, -0.188016907864167970, -0.187967799339583130, -0.187918690345078800, -0.187869580880777320, -0.187820470946802290, -0.187771360543276120, -0.187722249670321530, +-0.187673138328060870, -0.187624026516617830, -0.187574914236114690, -0.187525801486674280, -0.187476688268418930, -0.187427574581472300, -0.187378460425956740, -0.187329345801995010, +-0.187280230709709480, -0.187231115149223830, -0.187181999120660390, -0.187132882624141930, -0.187083765659790850, -0.187034648227730780, -0.186985530328084070, -0.186936411960973130, +-0.186887293126521580, -0.186838173824851820, -0.186789054056086590, -0.186739933820348310, -0.186690813117760650, -0.186641691948445930, -0.186592570312526990, -0.186543448210126170, +-0.186494325641367200, -0.186445202606372370, -0.186396079105264570, -0.186346955138166130, -0.186297830705200730, -0.186248705806490750, -0.186199580442159040, -0.186150454612327900, +-0.186101328317121090, -0.186052201556660940, -0.186003074331069860, -0.185953946640471520, -0.185904818484988330, -0.185855689864743070, -0.185806560779858160, -0.185757431230457290, +-0.185708301216662850, -0.185659170738597640, -0.185610039796384070, -0.185560908390145830, -0.185511776520005330, -0.185462644186085410, -0.185413511388508400, -0.185364378127398090, +-0.185315244402876810, -0.185266110215067420, -0.185216975564092310, -0.185167840450075200, -0.185118704873138500, -0.185069568833404610, -0.185020432330997210, -0.184971295366038760, +-0.184922157938652050, -0.184873020048959500, -0.184823881697084860, -0.184774742883150520, -0.184725603607279300, -0.184676463869593630, -0.184627323670217250, -0.184578183009272560, +-0.184529041886882430, -0.184479900303169240, -0.184430758258256750, -0.184381615752267330, -0.184332472785323910, -0.184283329357548850, -0.184234185469065920, -0.184185041119997510, +-0.184135896310466060, -0.184086751040595300, -0.184037605310507700, -0.183988459120326050, -0.183939312470172810, -0.183890165360171750, -0.183841017790445260, -0.183791869761116250, +-0.183742721272307120, -0.183693572324141600, -0.183644422916742180, -0.183595273050231680, -0.183546122724732560, -0.183496971940368600, -0.183447820697262180, -0.183398668995536220, +-0.183349516835313140, -0.183300364216716720, -0.183251211139869390, -0.183202057604894030, -0.183152903611913080, -0.183103749161050320, -0.183054594252428180, -0.183005438886169100, +-0.182956283062396890, -0.182907126781233940, -0.182857970042803210, -0.182808812847227110, -0.182759655194629390, -0.182710497085132570, -0.182661338518859460, -0.182612179495932610, +-0.182563020016475730, -0.182513860080611300, -0.182464699688462210, -0.182415538840150940, -0.182366377535801260, -0.182317215775535640, -0.182268053559477010, -0.182218890887747760, +-0.182169727760471740, -0.182120564177771390, -0.182071400139769220, -0.182022235646588980, -0.181973070698353140, -0.181923905295184620, -0.181874739437205890, -0.181825573124540780, +-0.181776406357311710, -0.181727239135641650, -0.181678071459653030, -0.181628903329469680, -0.181579734745214080, -0.181530565707009120, -0.181481396214977330, -0.181432226269242460, +-0.181383055869927060, -0.181333885017154000, -0.181284713711045790, -0.181235541951726250, -0.181186369739317840, -0.181137197073943070, -0.181088023955725740, -0.181038850384788370, +-0.180989676361253850, -0.180940501885244710, -0.180891326956884760, -0.180842151576296490, -0.180792975743602840, -0.180743799458926300, -0.180694622722390700, -0.180645445534118570, +-0.180596267894232800, -0.180547089802855940, -0.180497911260111780, -0.180448732266122850, -0.180399552821012080, -0.180350372924902000, -0.180301192577916440, -0.180252011780177880, +-0.180202830531809270, -0.180153648832933190, -0.180104466683673390, -0.180055284084152440, -0.180006101034492850, -0.179956917534818430, -0.179907733585251720, -0.179858549185915680, +-0.179809364336932810, -0.179760179038427000, -0.179710993290520730, -0.179661807093336980, -0.179612620446998270, -0.179563433351628440, -0.179514245807350040, -0.179465057814286010, +-0.179415869372558910, -0.179366680482292570, -0.179317491143609510, -0.179268301356632740, -0.179219111121484780, -0.179169920438289470, -0.179120729307169380, -0.179071537728247020, +-0.179022345701646240, -0.178973153227489610, -0.178923960305900100, -0.178874766937000250, -0.178825573120913910, -0.178776378857763650, -0.178727184147672440, -0.178677988990762810, +-0.178628793387158670, -0.178579597336982530, -0.178530400840357430, -0.178481203897405850, -0.178432006508251720, -0.178382808673017560, -0.178333610391826380, -0.178284411664800750, +-0.178235212492064530, -0.178186012873740280, -0.178136812809950560, -0.178087612300819210, -0.178038411346468860, -0.177989209947022500, -0.177940008102602630, -0.177890805813333220, +-0.177841603079336770, -0.177792399900736340, -0.177743196277654450, -0.177693992210215010, -0.177644787698540580, -0.177595582742754190, -0.177546377342978400, -0.177497171499337110, +-0.177447965211952910, -0.177398758480948770, -0.177349551306447310, -0.177300343688572390, -0.177251135627446630, -0.177201927123192600, -0.177152718175934170, -0.177103508785793950, +-0.177054298952894980, -0.177005088677359810, -0.176955877959312340, -0.176906666798875210, -0.176857455196171380, -0.176808243151323490, -0.176759030664455420, -0.176709817735689780, +-0.176660604365149600, -0.176611390552957460, -0.176562176299237290, -0.176512961604111670, -0.176463746467703660, -0.176414530890135840, -0.176365314871532120, -0.176316098412015120, +-0.176266881511707880, -0.176217664170733010, -0.176168446389214390, -0.176119228167274680, -0.176070009505036460, -0.176020790402623640, -0.175971570860158830, -0.175922350877765120, +-0.175873130455565070, -0.175823909593682660, -0.175774688292240470, -0.175725466551361540, -0.175676244371168520, -0.175627021751785320, -0.175577798693334590, -0.175528575195939340, +-0.175479351259722220, -0.175430126884807160, -0.175380902071316790, -0.175331676819374140, -0.175282451129101870, -0.175233225000623940, -0.175183998434062900, -0.175134771429541450, +-0.175085543987183540, -0.175036316107111730, -0.174987087789449130, -0.174937859034318380, -0.174888629841843450, -0.174839400212146890, -0.174790170145351860, -0.174740939641580970, +-0.174691708700958180, -0.174642477323606080, -0.174593245509647830, -0.174544013259205990, -0.174494780572404580, -0.174445547449366220, -0.174396313890213980, -0.174347079895070510, +-0.174297845464059800, -0.174248610597304450, -0.174199375294927160, -0.174150139557051860, -0.174100903383801210, -0.174051666775298290, -0.174002429731665800, -0.173953192253027630, +-0.173903954339506510, -0.173854715991225480, -0.173805477208307250, -0.173756237990875750, -0.173706998339053680, -0.173657758252964090, -0.173608517732729640, -0.173559276778474380, +-0.173510035390320920, -0.173460793568392360, -0.173411551312811360, -0.173362308623701940, -0.173313065501186750, -0.173263821945388890, -0.173214577956431050, -0.173165333534437190, +-0.173116088679530020, -0.173066843391832180, -0.173017597671467650, -0.172968351518559130, -0.172919104933229730, -0.172869857915602170, -0.172820610465800360, -0.172771362583947040, +-0.172722114270165290, -0.172672865524577830, -0.172623616347308660, -0.172574366738480450, -0.172525116698216300, -0.172475866226638940, -0.172426615323872350, -0.172377363990039220, +-0.172328112225262680, -0.172278860029665410, -0.172229607403371430, -0.172180354346503440, -0.172131100859184120, -0.172081846941537500, -0.172032592593686250, -0.171983337815753530, +-0.171934082607862030, -0.171884826970135740, -0.171835570902697380, -0.171786314405670100, -0.171737057479176610, -0.171687800123340920, -0.171638542338285710, -0.171589284124134160, +-0.171540025481008940, -0.171490766409034100, -0.171441506908332380, -0.171392246979026860, -0.171342986621240280, -0.171293725835096670, -0.171244464620718770, -0.171195202978229240, +-0.171145940907752180, -0.171096678409410230, -0.171047415483326610, -0.170998152129623990, -0.170948888348426450, -0.170899624139856680, -0.170850359504037850, -0.170801094441092680, +-0.170751828951145210, -0.170702563034318160, -0.170653296690734730, -0.170604029920517600, -0.170554762723790830, -0.170505495100677170, -0.170456227051299760, -0.170406958575781340, +-0.170357689674245970, -0.170308420346816400, -0.170259150593615290, -0.170209880414766780, -0.170160609810393550, -0.170111338780618820, -0.170062067325565280, -0.170012795445357020, +-0.169963523140116760, -0.169914250409967720, -0.169864977255032580, -0.169815703675435470, -0.169766429671299070, -0.169717155242746610, -0.169667880389900830, -0.169618605112885790, +-0.169569329411824200, -0.169520053286839330, -0.169470776738053890, -0.169421499765591930, -0.169372222369576190, -0.169322944550129940, -0.169273666307375860, -0.169224387641438070, +-0.169175108552439310, -0.169125829040502360, -0.169076549105751230, -0.169027268748308760, -0.168977987968298100, -0.168928706765842070, -0.168879425141064660, -0.168830143094088720, +-0.168780860625037420, -0.168731577734033520, -0.168682294421201110, -0.168633010686662980, -0.168583726530542320, -0.168534441952961880, -0.168485156954045810, -0.168435871533916840, +-0.168386585692698180, -0.168337299430512620, -0.168288012747484260, -0.168238725643735850, -0.168189438119390190, -0.168140150174571370, -0.168090861809402190, -0.168041573024005850, +-0.167992283818505140, -0.167942994193024160, -0.167893704147685700, -0.167844413682612960, -0.167795122797928770, -0.167745831493757190, -0.167696539770221030, -0.167647247627443540, +-0.167597955065547500, -0.167548662084656990, -0.167499368684894820, -0.167450074866384250, -0.167400780629248040, -0.167351485973610330, -0.167302190899593890, -0.167252895407321550, +-0.167203599496917400, -0.167154303168504240, -0.167105006422205330, -0.167055709258143480, -0.167006411676442780, -0.166957113677226070, -0.166907815260616540, -0.166858516426737070, +-0.166809217175711730, -0.166759917507663340, -0.166710617422715170, -0.166661316920990010, -0.166612016002612020, -0.166562714667703950, -0.166513412916389130, -0.166464110748790310, +-0.166414808165031680, -0.166365505165236020, -0.166316201749526580, -0.166266897918026210, -0.166217593670859030, -0.166168289008147870, -0.166118983930015560, -0.166069678436586210, +-0.166020372527982660, -0.165971066204328190, -0.165921759465745610, -0.165872452312359090, -0.165823144744291410, -0.165773836761665900, -0.165724528364605330, -0.165675219553233890, +-0.165625910327674400, -0.165576600688050140, -0.165527290634483930, -0.165477980167099940, -0.165428669286021010, -0.165379357991370380, -0.165330046283270940, -0.165280734161846830, +-0.165231421627220850, -0.165182108679515910, -0.165132795318856110, -0.165083481545364340, -0.165034167359163850, -0.164984852760377530, -0.164935537749129500, -0.164886222325542620, +-0.164836906489740200, -0.164787590241845060, -0.164738273581981400, -0.164688956510272020, -0.164639639026840280, -0.164590321131808990, -0.164541002825302350, -0.164491684107443190, +-0.164442364978354850, -0.164393045438160130, -0.164343725486983230, -0.164294405124947030, -0.164245084352174390, -0.164195763168789450, -0.164146441574915120, -0.164097119570674690, +-0.164047797156191000, -0.163998474331588260, -0.163949151096989350, -0.163899827452517580, -0.163850503398295770, -0.163801178934448150, -0.163751854061097570, -0.163702528778367380, +-0.163653203086380400, -0.163603876985260880, -0.163554550475131650, -0.163505223556116050, -0.163455896228336950, -0.163406568491918560, -0.163357240346983730, -0.163307911793655390, +-0.163258582832057690, -0.163209253462313520, -0.163159923684546240, -0.163110593498878690, -0.163061262905435100, -0.163011931904338350, -0.162962600495711790, -0.162913268679678290, +-0.162863936456362050, -0.162814603825885950, -0.162765270788373360, -0.162715937343947150, -0.162666603492731540, -0.162617269234849400, -0.162567934570424120, -0.162518599499578530, +-0.162469264022436920, -0.162419928139122120, -0.162370591849757500, -0.162321255154465970, -0.162271918053371740, -0.162222580546597720, -0.162173242634266800, -0.162123904316503230, +-0.162074565593429890, -0.162025226465170120, -0.161975886931846860, -0.161926546993584330, -0.161877206650505420, -0.161827865902733490, -0.161778524750391480, -0.161729183193603580, +-0.161679841232492710, -0.161630498867182250, -0.161581156097795110, -0.161531812924455510, -0.161482469347286380, -0.161433125366411080, -0.161383780981952520, -0.161334436194034950, +-0.161285091002781290, -0.161235745408314450, -0.161186399410758710, -0.161137053010236950, -0.161087706206872570, -0.161038359000788500, -0.160989011392108940, -0.160939663380956890, +-0.160890314967455650, -0.160840966151728190, -0.160791616933898760, -0.160742267314090280, -0.160692917292426130, -0.160643566869029250, -0.160594216044023910, -0.160544864817533020, +-0.160495513189679940, -0.160446161160587690, -0.160396808730380420, -0.160347455899181170, -0.160298102667112840, -0.160248749034299670, -0.160199395000864640, -0.160150040566931110, +-0.160100685732622070, -0.160051330498061720, -0.160001974863373060, -0.159952618828679450, -0.159903262394103880, -0.159853905559770580, -0.159804548325802510, -0.159755190692323080, +-0.159705832659455200, -0.159656474227323240, -0.159607115396050050, -0.159557756165759070, -0.159508396536573280, -0.159459036508616920, -0.159409676082012980, -0.159360315256884850, +-0.159310954033355490, -0.159261592411549190, -0.159212230391588910, -0.159162867973597600, -0.159113505157699560, -0.159064141944017770, -0.159014778332675630, -0.158965414323796100, +-0.158916049917503470, -0.158866685113920710, -0.158817319913171250, -0.158767954315378050, -0.158718588320665380, -0.158669221929156250, -0.158619855140974100, -0.158570487956241820, +-0.158521120375083780, -0.158471752397622960, -0.158422384023982730, -0.158373015254286130, -0.158323646088657400, -0.158274276527219570, -0.158224906570095610, -0.158175536217409820, +-0.158126165469285210, -0.158076794325845150, -0.158027422787212680, -0.157978050853512100, -0.157928678524866390, -0.157879305801398970, -0.157829932683232870, -0.157780559170492360, +-0.157731185263300460, -0.157681810961780610, -0.157632436266055780, -0.157583061176250290, -0.157533685692487160, -0.157484309814889780, -0.157434933543581230, -0.157385556878685770, +-0.157336179820326410, -0.157286802368626190, -0.157237424523709370, -0.157188046285699020, -0.157138667654718540, -0.157089288630890940, -0.157039909214340580, -0.156990529405190430, +-0.156941149203563950, -0.156891768609584180, -0.156842387623375410, -0.156793006245060680, -0.156743624474763420, -0.156694242312606670, -0.156644859758714760, -0.156595476813210700, +-0.156546093476217920, -0.156496709747859510, -0.156447325628259750, -0.156397941117541660, -0.156348556215828300, -0.156299170923243970, -0.156249785239911730, -0.156200399165955020, +-0.156151012701496870, -0.156101625846661620, -0.156052238601572300, -0.156002850966352410, -0.155953462941124940, -0.155904074526014260, -0.155854685721143390, -0.155805296526635800, +-0.155755906942614510, -0.155706516969203930, -0.155657126606527030, -0.155607735854707330, -0.155558344713867840, -0.155508953184132940, -0.155459561265625660, -0.155410168958469460, +-0.155360776262787410, -0.155311383178703850, -0.155261989706341840, -0.155212595845824420, -0.155163201597275950, -0.155113806960819470, -0.155064411936578470, -0.155015016524676000, +-0.154965620725236420, -0.154916224538382800, -0.154866827964238620, -0.154817431002926940, -0.154768033654572120, -0.154718635919297190, -0.154669237797225690, -0.154619839288480660, +-0.154570440393186460, -0.154521041111466170, -0.154471641443443270, -0.154422241389240820, -0.154372840948983210, -0.154323440122793500, -0.154274038910794780, -0.154224637313111370, +-0.154175235329866350, -0.154125832961183260, -0.154076430207185170, -0.154027027067996420, -0.153977623543740120, -0.153928219634539730, -0.153878815340518370, -0.153829410661800420, +-0.153780005598508930, -0.153730600150767420, -0.153681194318699000, -0.153631788102428000, -0.153582381502077560, -0.153532974517771150, -0.153483567149631850, -0.153434159397784100, +-0.153384751262350930, -0.153335342743455450, -0.153285933841222080, -0.153236524555773830, -0.153187114887234300, -0.153137704835726530, -0.153088294401374920, -0.153038883584302590, +-0.152989472384633060, -0.152940060802489420, -0.152890648837996050, -0.152841236491276070, -0.152791823762452980, -0.152742410651649900, -0.152692997158991230, -0.152643583284600070, +-0.152594169028599960, -0.152544754391113980, -0.152495339372266530, -0.152445923972180760, -0.152396508190980190, -0.152347092028787880, -0.152297675485728280, -0.152248258561924530, +-0.152198841257499660, -0.152149423572578130, -0.152100005507283060, -0.152050587061737960, -0.152001168236065960, -0.151951749030391460, -0.151902329444837610, -0.151852909479527930, +-0.151803489134585550, -0.151754068410134860, -0.151704647306299010, -0.151655225823201570, -0.151605803960965600, -0.151556381719715550, -0.151506959099574540, -0.151457536100666150, +-0.151408112723113500, -0.151358688967040970, -0.151309264832571730, -0.151259840319828890, -0.151210415428936900, -0.151160990160018850, -0.151111564513198350, -0.151062138488598480, +-0.151012712086343730, -0.150963285306557170, -0.150913858149362400, -0.150864430614882560, -0.150815002703242080, -0.150765574414564090, -0.150716145748972160, -0.150666716706589430, +-0.150617287287540340, -0.150567857491948040, -0.150518427319936090, -0.150468996771627640, -0.150419565847147140, -0.150370134546617710, -0.150320702870162530, -0.150271270817906010, +-0.150221838389971300, -0.150172405586482010, -0.150122972407561280, -0.150073538853333550, -0.150024104923921990, -0.149974670619450130, -0.149925235940041170, -0.149875800885819560, +-0.149826365456908470, -0.149776929653431450, -0.149727493475511650, -0.149678056923273570, -0.149628619996840350, -0.149579182696335580, -0.149529745021882400, -0.149480306973605310, +-0.149430868551627460, -0.149381429756071990, -0.149331990587063400, -0.149282551044724790, -0.149233111129179840, -0.149183670840551670, -0.149134230178964770, -0.149084789144542260, +-0.149035347737407810, -0.148985905957684540, -0.148936463805496940, -0.148887021280968200, -0.148837578384221870, -0.148788135115381190, -0.148738691474570610, -0.148689247461913280, +-0.148639803077532830, -0.148590358321552460, -0.148540913194096620, -0.148491467695288480, -0.148442021825251680, -0.148392575584109400, -0.148343128971986120, -0.148293681989005000, +-0.148244234635289240, -0.148194786910963360, -0.148145338816150500, -0.148095890350974260, -0.148046441515557880, -0.147996992310025830, -0.147947542734501310, -0.147898092789107930, +-0.147848642473968890, -0.147799191789208670, -0.147749740734950450, -0.147700289311317900, -0.147650837518434190, -0.147601385356423840, -0.147551932825409990, -0.147502479925516320, +-0.147453026656866020, -0.147403573019583590, -0.147354119013792250, -0.147304664639615140, -0.147255209897176800, -0.147205754786600470, -0.147156299308009750, -0.147106843461527830, +-0.147057387247279240, -0.147007930665387170, -0.146958473715975290, -0.146909016399166790, -0.146859558715086160, -0.146810100663856660, -0.146760642245601900, -0.146711183460445090, +-0.146661724308510770, -0.146612264789922150, -0.146562804904802860, -0.146513344653276120, -0.146463884035466420, -0.146414423051497070, -0.146364961701491190, -0.146315499985573330, +-0.146266037903866750, -0.146216575456495080, -0.146167112643581510, -0.146117649465250600, -0.146068185921625570, -0.146018722012830090, -0.145969257738987330, -0.145919793100221910, +-0.145870328096656980, -0.145820862728416240, -0.145771396995622890, -0.145721930898401490, -0.145672464436875290, -0.145622997611167900, -0.145573530421402590, -0.145524062867703860, +-0.145474594950195020, -0.145425126668999680, -0.145375658024241070, -0.145326189016043740, -0.145276719644530980, -0.145227249909825970, -0.145177779812053260, -0.145128309351336110, +-0.145078838527798180, -0.145029367341562710, -0.144979895792754280, -0.144930423881496070, -0.144880951607911840, -0.144831478972124780, -0.144782005974259470, -0.144732532614439140, +-0.144683058892787490, -0.144633584809427730, -0.144584110364484460, -0.144534635558080910, -0.144485160390340760, -0.144435684861387280, -0.144386208971345050, -0.144336732720337260, +-0.144287256108487220, -0.144237779135919480, -0.144188301802757300, -0.144138824109124350, -0.144089346055143900, -0.144039867640940510, -0.143990388866637480, -0.143940909732358460, +-0.143891430238226730, -0.143841950384366870, -0.143792470170902130, -0.143742989597956230, -0.143693508665652390, -0.143644027374115250, -0.143594545723468000, -0.143545063713834410, +-0.143495581345337710, -0.143446098618102510, -0.143396615532252080, -0.143347132087909640, -0.143297648285199810, -0.143248164124245870, -0.143198679605171520, -0.143149194728100030, +-0.143099709493156010, -0.143050223900462680, -0.143000737950143810, -0.142951251642322670, -0.142901764977123810, -0.142852277954670560, -0.142802790575086630, -0.142753302838495240, +-0.142703814745021060, -0.142654326294787360, -0.142604837487917800, -0.142555348324535730, -0.142505858804765740, -0.142456368928731090, -0.142406878696555080, -0.142357388108362320, +-0.142307897164276080, -0.142258405864420100, -0.142208914208917650, -0.142159422197893380, -0.142109929831470560, -0.142060437109772900, -0.142010944032923690, -0.141961450601047590, +-0.141911956814267850, -0.141862462672708220, -0.141812968176491970, -0.141763473325743770, -0.141713978120586890, -0.141664482561145060, -0.141614986647541570, -0.141565490379901040, +-0.141515993758346810, -0.141466496783002600, -0.141416999453991690, -0.141367501771438750, -0.141318003735467020, -0.141268505346199860, -0.141219006603761880, -0.141169507508276370, +-0.141120008059867100, -0.141070508258657360, -0.141021008104771810, -0.140971507598333710, -0.140922006739466870, -0.140872505528294560, -0.140823003964941430, -0.140773502049530790, +-0.140723999782186390, -0.140674497163031570, -0.140624994192190910, -0.140575490869787790, -0.140525987195945950, -0.140476483170788670, -0.140426978794440660, -0.140377474067025170, +-0.140327968988665590, -0.140278463559486500, -0.140228957779611250, -0.140179451649163620, -0.140129945168266910, -0.140080438337045780, -0.140030931155623570, -0.139981423624124020, +-0.139931915742670470, -0.139882407511387560, -0.139832898930398660, -0.139783389999827480, -0.139733880719797390, -0.139684371090433050, -0.139634861111857800, -0.139585350784195370, +-0.139535840107569140, -0.139486329082103730, -0.139436817707922520, -0.139387305985148810, -0.139337793913907270, -0.139288281494321260, -0.139238768726514530, -0.139189255610610460, +-0.139139742146733690, -0.139090228335007530, -0.139040714175555830, -0.138991199668501900, -0.138941684813970430, -0.138892169612084730, -0.138842654062968580, -0.138793138166745380, +-0.138743621923539780, -0.138694105333475120, -0.138644588396675210, -0.138595071113263360, -0.138545553483364280, -0.138496035507101320, -0.138446517184598270, -0.138396998515978500, +-0.138347479501366670, -0.138297960140886130, -0.138248440434660250, -0.138198920382813730, -0.138149399985469910, -0.138099879242752550, -0.138050358154785090, -0.138000836721692170, +-0.137951314943597140, -0.137901792820623810, -0.137852270352895600, -0.137802747540537120, -0.137753224383671800, -0.137703700882423400, -0.137654177036915320, -0.137604652847272220, +-0.137555128313617490, -0.137505603436074960, -0.137456078214767960, -0.137406552649821210, -0.137357026741358080, -0.137307500489501970, -0.137257973894377520, -0.137208446956108120, +-0.137158919674817640, -0.137109392050629390, -0.137059864083668100, -0.137010335774057190, -0.136960807121920410, -0.136911278127381160, -0.136861748790564170, -0.136812219111592800, +-0.136762689090590920, -0.136713158727681830, -0.136663628022990310, -0.136614096976639700, -0.136564565588753880, -0.136515033859456180, -0.136465501788871320, -0.136415969377122750, +-0.136366436624333790, -0.136316903530629170, -0.136267370096132300, -0.136217836320967010, -0.136168302205256690, -0.136118767749126040, -0.136069232952698490, -0.136019697816097850, +-0.135970162339447530, -0.135920626522872230, -0.135871090366495360, -0.135821553870440790, -0.135772017034831880, -0.135722479859793380, -0.135672942345448660, -0.135623404491921590, +-0.135573866299335570, -0.135524327767815340, -0.135474788897484270, -0.135425249688465810, -0.135375710140884650, -0.135326170254864210, -0.135276630030528370, -0.135227089468000490, +-0.135177548567405330, -0.135128007328866290, -0.135078465752507260, -0.135028923838451610, -0.134979381586824070, -0.134929838997748100, -0.134880296071347520, -0.134830752807745790, +-0.134781209207067570, -0.134731665269436360, -0.134682120994975980, -0.134632576383809850, -0.134583031436062730, -0.134533486151858030, -0.134483940531319620, -0.134434394574570900, +-0.134384848281736660, -0.134335301652940280, -0.134285754688305200, -0.134236207387956190, -0.134186659752016660, -0.134137111780610470, -0.134087563473861080, -0.134038014831893200, +-0.133988465854830290, -0.133938916542796220, -0.133889366895914410, -0.133839816914309630, -0.133790266598105310, -0.133740715947425310, -0.133691164962393080, -0.133641613643133400, +-0.133592061989769670, -0.133542510002425780, -0.133492957681225180, -0.133443405026292650, -0.133393852037751590, -0.133344298715725450, -0.133294745060339000, -0.133245191071715700, +-0.133195636749979420, -0.133146082095253610, -0.133096527107663040, -0.133046971787331130, -0.132997416134381820, -0.132947860148938500, -0.132898303831126000, -0.132848747181067710, +-0.132799190198887580, -0.132749632884709010, -0.132700075238656820, -0.132650517260854420, -0.132600958951425730, -0.132551400310494230, -0.132501841338184660, -0.132452282034620480, +-0.132402722399925150, -0.132353162434223460, -0.132303602137638840, -0.132254041510295240, -0.132204480552316090, -0.132154919263826190, -0.132105357644948990, -0.132055795695808390, +-0.132006233416527840, -0.131956670807232170, -0.131907107868044830, -0.131857544599089690, -0.131807981000490270, -0.131758417072371350, -0.131708852814856360, -0.131659288228069240, +-0.131609723312133470, -0.131560158067173830, -0.131510592493313820, -0.131461026590677290, -0.131411460359387780, -0.131361893799570060, -0.131312326911347590, -0.131262759694843860, +-0.131213192150183680, -0.131163624277490510, -0.131114056076888280, -0.131064487548500470, -0.131014918692451910, -0.130965349508866010, -0.130915779997866770, -0.130866210159577640, +-0.130816639994123410, -0.130767069501627560, -0.130717498682214080, -0.130667927536006370, -0.130618356063129330, -0.130568784263706360, -0.130519212137861440, -0.130469639685718060, +-0.130420066907401020, -0.130370493803033780, -0.130320920372739900, -0.130271346616644160, -0.130221772534870020, -0.130172198127541490, -0.130122623394782010, -0.130073048336716400, +-0.130023472953468190, -0.129973897245161290, -0.129924321211919190, -0.129874744853866740, -0.129825168171127440, -0.129775591163825200, -0.129726013832083540, -0.129676436176027310, +-0.129626858195779960, -0.129577279891465470, -0.129527701263207370, -0.129478122311130430, -0.129428543035358200, -0.129378963436014150, -0.129329383513223150, -0.129279803267108690, +-0.129230222697794720, -0.129180641805404760, -0.129131060590063600, -0.129081479051894820, -0.129031897191022340, -0.128982315007569680, -0.128932732501661680, -0.128883149673421820, +-0.128833566522974120, -0.128783983050442030, -0.128734399255950450, -0.128684815139622850, -0.128635230701583230, -0.128585645941955070, -0.128536060860863250, -0.128486475458431280, +-0.128436889734783120, -0.128387303690042310, -0.128337717324333660, -0.128288130637780720, -0.128238543630507020, -0.128188956302637410, -0.128139368654295400, -0.128089780685604950, +-0.128040192396689620, -0.127990603787674270, -0.127941014858682390, -0.127891425609837990, -0.127841836041264560, -0.127792246153086990, -0.127742655945428800, -0.127693065418413990, +-0.127643474572166070, -0.127593883406809880, -0.127544291922469020, -0.127494700119267390, -0.127445107997328610, -0.127395515556777470, -0.127345922797737540, -0.127296329720332390, +-0.127246736324686830, -0.127197142610924440, -0.127147548579169180, -0.127097954229544650, -0.127048359562175640, -0.126998764577185730, -0.126949169274698900, -0.126899573654838730, +-0.126849977717730070, -0.126800381463496450, -0.126750784892261880, -0.126701188004149900, -0.126651590799285400, -0.126601993277791920, -0.126552395439793460, -0.126502797285413580, +-0.126453198814777120, -0.126403600028007680, -0.126354000925228800, -0.126304401506565360, -0.126254801772140910, -0.126205201722079470, -0.126155601356504580, -0.126106000675541120, +-0.126056399679312650, -0.126006798367943210, -0.125957196741556310, -0.125907594800276860, -0.125857992544228410, -0.125808389973535000, -0.125758787088320170, -0.125709183888708830, +-0.125659580374824500, -0.125609976546791240, -0.125560372404732580, -0.125510767948773440, -0.125461163179037380, -0.125411558095647970, -0.125361952698730100, -0.125312346988407370, +-0.125262740964803750, -0.125213134628042840, -0.125163527978249560, -0.125113921015547440, -0.125064313740060500, -0.125014706151912350, -0.124965098251227880, -0.124915490038130670, +-0.124865881512744720, -0.124816272675193630, -0.124766663525602310, -0.124717054064094320, -0.124667444290793700, -0.124617834205824020, -0.124568223809310210, -0.124518613101375820, +-0.124469002082144910, -0.124419390751741060, -0.124369779110289170, -0.124320167157912820, -0.124270554894735620, -0.124220942320882470, -0.124171329436476980, -0.124121716241643160, +-0.124072102736504600, -0.124022488921186220, -0.123972874795811640, -0.123923260360504860, -0.123873645615389480, -0.123824030560590420, -0.123774415196231310, -0.123724799522436150, +-0.123675183539328550, -0.123625567247033430, -0.123575950645674390, -0.123526333735375480, -0.123476716516260300, -0.123427098988453750, -0.123377481152079470, -0.123327863007261030, +-0.123278244554123400, -0.123228625792790130, -0.123179006723385320, -0.123129387346032540, -0.123079767660856740, -0.123030147667981510, -0.122980527367530910, -0.122930906759628560, +-0.122881285844399380, -0.122831664621966980, -0.122782043092455430, -0.122732421255988320, -0.122682799112690600, -0.122633176662685890, -0.122583553906098240, -0.122533930843051250, +-0.122484307473669880, -0.122434683798077750, -0.122385059816398470, -0.122335435528756980, -0.122285810935276880, -0.122236186036082270, -0.122186560831296750, -0.122136935321045280, +-0.122087309505451460, -0.122037683384639370, -0.121988056958732630, -0.121938430227856190, -0.121888803192133670, -0.121839175851689140, -0.121789548206646240, -0.121739920257129920, +-0.121690292003263770, -0.121640663445171910, -0.121591034582977940, -0.121541405416806830, -0.121491775946782220, -0.121442146173028150, -0.121392516095668280, -0.121342885714827560, +-0.121293255030629630, -0.121243624043198120, -0.121193992752657990, -0.121144361159132880, -0.121094729262746860, -0.121045097063623580, -0.120995464561888010, -0.120945831757663750, +-0.120896198651074940, -0.120846565242245170, -0.120796931531299450, -0.120747297518361390, -0.120697663203555090, -0.120648028587004190, -0.120598393668833650, -0.120548758449167130, +-0.120499122928128710, -0.120449487105842050, -0.120399850982432120, -0.120350214558022560, -0.120300577832737010, -0.120250940806700470, -0.120201303480036560, -0.120151665852869400, +-0.120102027925322650, -0.120052389697521260, -0.120002751169588890, -0.119953112341649650, -0.119903473213827190, -0.119853833786246480, -0.119804194059031190, -0.119754554032305410, +-0.119704913706192810, -0.119655273080818360, -0.119605632156305740, -0.119555990932779020, -0.119506349410361900, -0.119456707589179340, -0.119407065469355010, -0.119357423051012570, +-0.119307780334277020, -0.119258137319272030, -0.119208494006121680, -0.119158850394949670, -0.119109206485880960, -0.119059562279039230, -0.119009917774548610, -0.118960272972532750, +-0.118910627873116640, -0.118860982476423970, -0.118811336782578840, -0.118761690791704930, -0.118712044503927240, -0.118662397919369430, -0.118612751038155620, -0.118563103860409500, +-0.118513456386256060, -0.118463808615818980, -0.118414160549221940, -0.118364512186589930, -0.118314863528046640, -0.118265214573716210, -0.118215565323722280, -0.118165915778189880, +-0.118116265937242710, -0.118066615801004860, -0.118016965369600030, -0.117967314643153230, -0.117917663621788140, -0.117868012305628910, -0.117818360694799190, -0.117768708789424010, +-0.117719056589627060, -0.117669404095532460, -0.117619751307263920, -0.117570098224946450, -0.117520444848703720, -0.117470791178659880, -0.117421137214938620, -0.117371482957664960, +-0.117321828406962610, -0.117272173562955220, -0.117222518425767850, -0.117172862995524190, -0.117123207272348360, -0.117073551256364080, -0.117023894947696360, -0.116974238346468900, +-0.116924581452805850, -0.116874924266830910, -0.116825266788669090, -0.116775609018444100, -0.116725950956280090, -0.116676292602300770, -0.116626633956631160, -0.116576975019394960, +-0.116527315790716320, -0.116477656270718950, -0.116427996459527880, -0.116378336357266830, -0.116328675964059480, -0.116279015280030900, -0.116229354305304760, -0.116179693040005250, +-0.116130031484256060, -0.116080369638182250, -0.116030707501907500, -0.115981045075555980, -0.115931382359251410, -0.115881719353118820, -0.115832056057281930, -0.115782392471864910, +-0.115732728596991460, -0.115683064432786640, -0.115633399979374150, -0.115583735236878160, -0.115534070205422400, -0.115484404885131900, -0.115434739276130390, -0.115385073378541580, +-0.115335407192490540, -0.115285740718100980, -0.115236073955497060, -0.115186406904802520, -0.115136739566142400, -0.115087071939640430, -0.115037404025420800, -0.114987735823607200, +-0.114938067334324700, -0.114888398557697040, -0.114838729493848380, -0.114789060142902450, -0.114739390504984330, -0.114689720580217720, -0.114640050368726810, -0.114590379870635330, +-0.114540709086068340, -0.114491038015149580, -0.114441366658003220, -0.114391695014753020, -0.114342023085524010, -0.114292350870439940, -0.114242678369624570, -0.114193005583202920, +-0.114143332511298770, -0.114093659154036280, -0.114043985511539210, -0.113994311583932630, -0.113944637371340250, -0.113894962873886270, -0.113845288091694460, -0.113795613024889870, +-0.113745937673596240, -0.113696262037937770, -0.113646586118038200, -0.113596909914022600, -0.113547233426014750, -0.113497556654138800, -0.113447879598518510, -0.113398202259278980, +-0.113348524636543920, -0.113298846730437120, -0.113249168541083650, -0.113199490068607260, -0.113149811313132130, -0.113100132274782050, -0.113050452953682070, -0.113000773349955950, +-0.112951093463727910, -0.112901413295121700, -0.112851732844262380, -0.112802052111273740, -0.112752371096279960, -0.112702689799404810, -0.112653008220773380, -0.112603326360509450, +-0.112553644218737180, -0.112503961795580370, -0.112454279091164090, -0.112404596105612110, -0.112354912839048210, -0.112305229291597460, -0.112255545463383640, -0.112205861354530950, +-0.112156176965163180, -0.112106492295405400, -0.112056807345381380, -0.112007122115215350, -0.111957436605031090, -0.111907750814953660, -0.111858064745106860, -0.111808378395614890, +-0.111758691766601540, -0.111709004858191890, -0.111659317670509750, -0.111609630203679300, -0.111559942457824340, -0.111510254433069960, -0.111460566129539950, -0.111410877547358080, +-0.111361188686649460, -0.111311499547537860, -0.111261810130147520, -0.111212120434602210, -0.111162430461027040, -0.111112740209545800, -0.111063049680282700, -0.111013358873361540, +-0.110963667788907430, -0.110913976427044130, -0.110864284787895910, -0.110814592871586530, -0.110764900678241100, -0.110715208207983430, -0.110665515460937740, -0.110615822437227810, +-0.110566129136978770, -0.110516435560314420, -0.110466741707358970, -0.110417047578236230, -0.110367353173071290, -0.110317658491987990, -0.110267963535110110, -0.110218268302562730, +-0.110168572794469700, -0.110118877010955240, -0.110069180952143140, -0.110019484618158540, -0.109969788009125210, -0.109920091125167430, -0.109870393966408980, -0.109820696532974970, +-0.109770998824989220, -0.109721300842575990, -0.109671602585859050, -0.109621904054963550, -0.109572205250013290, -0.109522506171132520, -0.109472806818445040, -0.109423107192075990, +-0.109373407292149170, -0.109323707118788390, -0.109274006672118770, -0.109224305952264150, -0.109174604959348760, -0.109124903693496420, -0.109075202154832250, -0.109025500343480090, +-0.108975798259564170, -0.108926095903208310, -0.108876393274537660, -0.108826690373676020, -0.108776987200747670, -0.108727283755876400, -0.108677580039187360, -0.108627876050804370, +-0.108578171790851690, -0.108528467259453140, -0.108478762456733870, -0.108429057382817680, -0.108379352037828420, -0.108329646421891200, -0.108279940535129890, -0.108230234377668710, +-0.108180527949631510, -0.108130821251143430, -0.108081114282328310, -0.108031407043310380, -0.107981699534213510, -0.107931991755162830, -0.107882283706282150, -0.107832575387695780, +-0.107782866799527530, -0.107733157941902550, -0.107683448814944680, -0.107633739418778180, -0.107584029753526910, -0.107534319819315980, -0.107484609616269270, -0.107434899144511030, +-0.107385188404165100, -0.107335477395356630, -0.107285766118209490, -0.107236054572847480, -0.107186342759395770, -0.107136630677978210, -0.107086918328719070, -0.107037205711742190, +-0.106987492827172740, -0.106937779675134560, -0.106888066255751940, -0.106838352569148700, -0.106788638615450020, -0.106738924394779750, -0.106689209907262160, -0.106639495153021110, +-0.106589780132181760, -0.106540064844867970, -0.106490349291204020, -0.106440633471313730, -0.106390917385322320, -0.106341201033353610, -0.106291484415531460, -0.106241767531981040, +-0.106192050382826200, -0.106142332968191230, -0.106092615288199990, -0.106042897342977660, -0.105993179132648070, -0.105943460657335540, -0.105893741917163910, -0.105844022912258390, +-0.105794303642742800, -0.105744584108741440, -0.105694864310378180, -0.105645144247778210, -0.105595423921065380, -0.105545703330363990, -0.105495982475797900, -0.105446261357492290, +-0.105396539975571020, -0.105346818330157980, -0.105297096421378330, -0.105247374249355930, -0.105197651814215090, -0.105147929116079690, -0.105098206155074900, -0.105048482931324600, +-0.104998759444953100, -0.104949035696084240, -0.104899311684843250, -0.104849587411353970, -0.104799862875740740, -0.104750138078127400, -0.104700413018639150, -0.104650687697399870, +-0.104600962114533870, -0.104551236270165030, -0.104501510164418540, -0.104451783797418280, -0.104402057169288100, -0.104352330280153230, -0.104302603130137530, -0.104252875719365340, +-0.104203148047960490, -0.104153420116048240, -0.104103691923752420, -0.104053963471197390, -0.104004234758506980, -0.103954505785806450, -0.103904776553219640, -0.103855047060870900, +-0.103805317308884090, -0.103755587297384450, -0.103705857026495820, -0.103656126496342550, -0.103606395707048530, -0.103556664658738960, -0.103506933351537720, -0.103457201785569160, +-0.103407469960957150, -0.103357737877826900, -0.103308005536302320, -0.103258272936507270, -0.103208540078566990, -0.103158806962605350, -0.103109073588746700, -0.103059339957114910, +-0.103009606067835230, -0.102959871921031520, -0.102910137516828150, -0.102860402855348980, -0.102810667936719240, -0.102760932761062840, -0.102711197328504100, -0.102661461639166940, +-0.102611725693176560, -0.102561989490656850, -0.102512253031732180, -0.102462516316526450, -0.102412779345164850, -0.102363042117771310, -0.102313304634469720, -0.102263566895385310, +-0.102213828900641980, -0.102164090650364090, -0.102114352144675530, -0.102064613383701530, -0.102014874367565980, -0.101965135096393270, -0.101915395570307250, -0.101865655789433210, +-0.101815915753895020, -0.101766175463817040, -0.101716434919323180, -0.101666694120538680, -0.101616953067587430, -0.101567211760593810, -0.101517470199681710, -0.101467728384976390, +-0.101417986316601750, -0.101368243994681680, -0.101318501419341470, -0.101268758590704990, -0.101219015508896610, -0.101169272174040260, -0.101119528586261160, -0.101069784745683250, +-0.101020040652430880, -0.100970296306627960, -0.100920551708399740, -0.100870806857870140, -0.100821061755163520, -0.100771316400403810, -0.100721570793716260, -0.100671824935224770, +-0.100622078825053710, -0.100572332463327030, -0.100522585850169950, -0.100472838985706410, -0.100423091870060770, -0.100373344503356960, -0.100323596885720230, -0.100273849017274500, +-0.100224100898143720, -0.100174352528453120, -0.100124603908326640, -0.100074855037888650, -0.100025105917263090, -0.099975356546575203, -0.099925606925948915, -0.099875857055508624, +-0.099826106935378231, -0.099776356565683025, -0.099726605946546920, -0.099676855078094304, -0.099627103960449118, -0.099577352593736609, -0.099527600978080707, -0.099477849113605812, +-0.099428097000435853, -0.099378344638696089, -0.099328592028510465, -0.099278839170002922, -0.099229086063298721, -0.099179332708521806, -0.099129579105796561, -0.099079825255246917, +-0.099030071156998162, -0.098980316811174224, -0.098930562217899504, -0.098880807377297916, -0.098831052289494764, -0.098781296954613990, -0.098731541372779966, -0.098681785544116635, +-0.098632029468749299, -0.098582273146801888, -0.098532516578398788, -0.098482759763663955, -0.098433002702722663, -0.098383245395698871, -0.098333487842716519, -0.098283730043900883, +-0.098233971999375932, -0.098184213709266041, -0.098134455173695193, -0.098084696392788634, -0.098034937366670336, -0.097985178095464698, -0.097935418579295663, -0.097885658818288535, +-0.097835898812567254, -0.097786138562256222, -0.097736378067479410, -0.097686617328362091, -0.097636856345028236, -0.097587095117602232, -0.097537333646208049, -0.097487571930970976, +-0.097437809972014969, -0.097388047769463998, -0.097338285323443352, -0.097288522634076988, -0.097238759701489333, -0.097188996525804316, -0.097139233107147255, -0.097089469445642118, +-0.097039705541413307, -0.096989941394584792, -0.096940177005281861, -0.096890412373628484, -0.096840647499749077, -0.096790882383767610, -0.096741117025809384, -0.096691351425998356, +-0.096641585584458956, -0.096591819501315151, -0.096542053176692233, -0.096492286610714198, -0.096442519803505433, -0.096392752755189923, -0.096342985465892983, -0.096293217935738570, +-0.096243450164850683, -0.096193682153354609, -0.096143913901374320, -0.096094145409034257, -0.096044376676458376, -0.095994607703772009, -0.095944838491099110, -0.095895069038564124, +-0.095845299346291032, -0.095795529414405112, -0.095745759243030387, -0.095695988832291259, -0.095646218182311712, -0.095596447293217063, -0.095546676165131295, -0.095496904798178836, +-0.095447133192483685, -0.095397361348171131, -0.095347589265365171, -0.095297816944189803, -0.095248044384770331, -0.095198271587230751, -0.095148498551695493, -0.095098725278288540, +-0.095048951767135223, -0.094999178018359526, -0.094949404032085891, -0.094899629808438288, -0.094849855347542061, -0.094800080649521196, -0.094750305714500133, -0.094700530542602857, +-0.094650755133954698, -0.094600979488679640, -0.094551203606902154, -0.094501427488746209, -0.094451651134337136, -0.094401874543798933, -0.094352097717255598, -0.094302320654832475, +-0.094252543356653534, -0.094202765822843246, -0.094152988053525608, -0.094103210048825922, -0.094053431808868229, -0.094003653333776943, -0.093953874623676090, -0.093904095678690985, +-0.093854316498945656, -0.093804537084564515, -0.093754757435671604, -0.093704977552392238, -0.093655197434850429, -0.093605417083170619, -0.093555636497476835, -0.093505855677894406, +-0.093456074624547317, -0.093406293337560065, -0.093356511817056620, -0.093306730063162341, -0.093256948076001239, -0.093207165855697327, -0.093157383402375948, -0.093107600716161101, +-0.093057817797177256, -0.093008034645548424, -0.092958251261399949, -0.092908467644855844, -0.092858683796040564, -0.092808899715078136, -0.092759115402093903, -0.092709330857211877, +-0.092659546080556529, -0.092609761072251884, -0.092559975832423258, -0.092510190361194705, -0.092460404658690681, -0.092410618725035185, -0.092360832560353601, -0.092311046164769928, +-0.092261259538408205, -0.092211472681393764, -0.092161685593850642, -0.092111898275903312, -0.092062110727675797, -0.092012322949293443, -0.091962534940880289, -0.091912746702560791, +-0.091862958234458975, -0.091813169536700212, -0.091763380609408529, -0.091713591452708396, -0.091663802066723837, -0.091614012451580226, -0.091564222607401574, -0.091514432534312365, +-0.091464642232436638, -0.091414851701899738, -0.091365060942825718, -0.091315269955338604, -0.091265478739563755, -0.091215687295625208, -0.091165895623647436, -0.091116103723754491, +-0.091066311596071731, -0.091016519240723182, -0.090966726657833341, -0.090916933847526249, -0.090867140809927249, -0.090817347545160410, -0.090767554053350200, -0.090717760334620659, +-0.090667966389097160, -0.090618172216903742, -0.090568377818164902, -0.090518583193004667, -0.090468788341548423, -0.090418993263920208, -0.090369197960244063, -0.090319402430645360, +-0.090269606675248165, -0.090219810694176950, -0.090170014487555752, -0.090120218055509974, -0.090070421398163653, -0.090020624515641273, -0.089970827408066889, -0.089921030075565872, +-0.089871232518262290, -0.089821434736280625, -0.089771636729744933, -0.089721838498780584, -0.089672040043511647, -0.089622241364062605, -0.089572442460557511, -0.089522643333121765, +-0.089472843981879407, -0.089423044406954935, -0.089373244608472416, -0.089323444586557221, -0.089273644341333419, -0.089223843872925063, -0.089174043181457552, -0.089124242267054912, +-0.089074441129841683, -0.089024639769941905, -0.088974838187480962, -0.088925036382582923, -0.088875234355372298, -0.088825432105973143, -0.088775629634510855, -0.088725826941109490, +-0.088676024025893557, -0.088626220888987126, -0.088576417530515580, -0.088526613950602989, -0.088476810149373863, -0.088427006126952284, -0.088377201883463610, -0.088327397419031950, +-0.088277592733781343, -0.088227787827837204, -0.088177982701323585, -0.088128177354365012, -0.088078371787085566, -0.088028565999610620, -0.087978759992064254, -0.087928953764571008, +-0.087879147317254921, -0.087829340650241408, -0.087779533763654549, -0.087729726657618856, -0.087679919332258396, -0.087630111787698584, -0.087580304024063499, -0.087530496041477640, +-0.087480687840065116, -0.087430879419951299, -0.087381070781260298, -0.087331261924116166, -0.087281452848644331, -0.087231643554968846, -0.087181834043214265, -0.087132024313504669, +-0.087082214365965430, -0.087032404200720670, -0.086982593817894902, -0.086932783217612206, -0.086882972399997982, -0.086833161365176340, -0.086783350113271790, -0.086733538644408414, +-0.086683726958711654, -0.086633915056305563, -0.086584102937314680, -0.086534290601863101, -0.086484478050076252, -0.086434665282078188, -0.086384852297993475, -0.086335039097946181, +-0.086285225682061734, -0.086235412050464227, -0.086185598203277744, -0.086135784140627697, -0.086085969862638209, -0.086036155369433778, -0.085986340661138527, -0.085936525737877870, +-0.085886710599775887, -0.085836895246957146, -0.085787079679545700, -0.085737263897667018, -0.085687447901445168, -0.085637631691004704, -0.085587815266469705, -0.085537998627965614, +-0.085488181775616540, -0.085438364709546993, -0.085388547429881112, -0.085338729936744295, -0.085288912230260652, -0.085239094310554278, -0.085189276177750628, -0.085139457831973769, +-0.085089639273348283, -0.085039820501998251, -0.084990001518049099, -0.084940182321624952, -0.084890362912850362, -0.084840543291849396, -0.084790723458747538, -0.084740903413668855, +-0.084691083156737929, -0.084641262688078839, -0.084591442007817041, -0.084541621116076632, -0.084491800012982177, -0.084441978698657771, -0.084392157173228871, -0.084342335436819571, +-0.084292513489553994, -0.084242691331557581, -0.084192868962954429, -0.084143046383869116, -0.084093223594425739, -0.084043400594749740, -0.083993577384965240, -0.083943753965196807, +-0.083893930335568537, -0.083844106496205884, -0.083794282447232971, -0.083744458188774351, -0.083694633720954134, -0.083644809043897789, -0.083594984157729410, -0.083545159062573579, +-0.083495333758554405, -0.083445508245797342, -0.083395682524426501, -0.083345856594566017, -0.083296030456341333, -0.083246204109876570, -0.083196377555296297, -0.083146550792724636, +-0.083096723822287041, -0.083046896644107637, -0.082997069258311004, -0.082947241665021237, -0.082897413864363820, -0.082847585856462860, -0.082797757641442940, -0.082747929219428182, +-0.082698100590544055, -0.082648271754914668, -0.082598442712664588, -0.082548613463917980, -0.082498784008800272, -0.082448954347435599, -0.082399124479948543, -0.082349294406463242, +-0.082299464127105135, -0.082249633641998374, -0.082199802951267095, -0.082149972055036741, -0.082100140953431461, -0.082050309646575822, -0.082000478134593963, -0.081950646417611364, +-0.081900814495752150, -0.081850982369140887, -0.081801150037901726, -0.081751317502160151, -0.081701484762040269, -0.081651651817666676, -0.081601818669163509, -0.081551985316656236, +-0.081502151760269009, -0.081452318000126395, -0.081402484036352543, -0.081352649869072924, -0.081302815498411687, -0.081252980924492957, -0.081203146147442229, -0.081153311167383627, +-0.081103475984441759, -0.081053640598740748, -0.081003805010406077, -0.080953969219561897, -0.080904133226332803, -0.080854297030842917, -0.080804460633217737, -0.080754624033581413, +-0.080704787232058525, -0.080654950228773226, -0.080605113023850983, -0.080555275617415975, -0.080505438009592770, -0.080455600200505531, -0.080405762190279728, -0.080355923979039526, +-0.080306085566909061, -0.080256246954013830, -0.080206408140477983, -0.080156569126426117, -0.080106729911982380, -0.080056890497272271, -0.080007050882419925, -0.079957211067549966, +-0.079907371052786530, -0.079857530838255100, -0.079807690424079855, -0.079757849810385376, -0.079708008997295826, -0.079658167984936704, -0.079608326773432159, -0.079558485362906800, +-0.079508643753484792, -0.079458801945291604, -0.079408959938451415, -0.079359117733088833, -0.079309275329328008, -0.079259432727294438, -0.079209589927112287, -0.079159746928905719, +-0.079109903732800219, -0.079060060338919977, -0.079010216747389561, -0.078960372958333178, -0.078910528971876295, -0.078860684788143107, -0.078810840407258193, -0.078760995829345731, +-0.078711151054531234, -0.078661306082938851, -0.078611460914693204, -0.078561615549918459, -0.078511769988740127, -0.078461924231282371, -0.078412078277669786, -0.078362232128026579, +-0.078312385782478233, -0.078262539241148926, -0.078212692504162823, -0.078162845571645420, -0.078112998443720924, -0.078063151120513916, -0.078013303602148601, -0.077963455888750463, +-0.077913607980443680, -0.077863759877352876, -0.077813911579602241, -0.077764063087317259, -0.077714214400622136, -0.077664365519641454, -0.077614516444499432, -0.077564667175321553, +-0.077514817712232009, -0.077464968055355424, -0.077415118204815975, -0.077365268160739173, -0.077315417923249197, -0.077265567492470238, -0.077215716868527809, -0.077165866051546073, +-0.077116015041649680, -0.077066163838962809, -0.077016312443610971, -0.076966460855718344, -0.076916609075409578, -0.076866757102808839, -0.076816904938041650, -0.076767052581232190, +-0.076717200032505109, -0.076667347291984586, -0.076617494359796132, -0.076567641236063938, -0.076517787920912655, -0.076467934414466449, -0.076418080716850856, -0.076368226828190056, +-0.076318372748608254, -0.076268518478230948, -0.076218664017182358, -0.076168809365587106, -0.076118954523569385, -0.076069099491254732, -0.076019244268767314, -0.075969388856231793, +-0.075919533253772362, -0.075869677461514531, -0.075819821479582508, -0.075769965308100928, -0.075720108947193998, -0.075670252396987242, -0.075620395657604852, -0.075570538729171480, +-0.075520681611811302, -0.075470824305649872, -0.075420966810811382, -0.075371109127420469, -0.075321251255601351, -0.075271393195479541, -0.075221534947179244, -0.075171676510824681, +-0.075121817886541362, -0.075071959074453493, -0.075022100074685724, -0.074972240887362276, -0.074922381512608660, -0.074872521950549081, -0.074822662201308218, -0.074772802265010235, +-0.074722942141780699, -0.074673081831743815, -0.074623221335024220, -0.074573360651746134, -0.074523499782035083, -0.074473638726015284, -0.074423777483811390, -0.074373916055547606, +-0.074324054441349471, -0.074274192641341205, -0.074224330655647014, -0.074174468484392436, -0.074124606127701692, -0.074074743585699432, -0.074024880858509876, -0.073975017946258548, +-0.073925154849069682, -0.073875291567067930, -0.073825428100377510, -0.073775564449123948, -0.073725700613431491, -0.073675836593424776, -0.073625972389228023, -0.073576108000966783, +-0.073526243428765278, -0.073476378672748172, -0.073426513733039656, -0.073376648609765310, -0.073326783303049342, -0.073276917813015971, -0.073227052139790749, -0.073177186283497897, +-0.073127320244262092, -0.073077454022207528, -0.073027587617459769, -0.072977721030143050, -0.072927854260382022, -0.072877987308300932, -0.072828120174025290, -0.072778252857679374, +-0.072728385359387804, -0.072678517679274843, -0.072628649817466029, -0.072578781774085582, -0.072528913549258181, -0.072479045143108059, -0.072429176555760769, -0.072379307787340530, +-0.072329438837972021, -0.072279569707779476, -0.072229700396888460, -0.072179830905423181, -0.072129961233507886, -0.072080091381268127, -0.072030221348828138, -0.071980351136312598, +-0.071930480743845740, -0.071880610171553130, -0.071830739419558975, -0.071780868487987995, -0.071730997376964381, -0.071681126086613728, -0.071631254617060255, -0.071581382968428642, +-0.071531511140843135, -0.071481639134429287, -0.071431766949311346, -0.071381894585613989, -0.071332022043461452, -0.071282149322979299, -0.071232276424291779, -0.071182403347523127, +-0.071132530092798907, -0.071082656660243354, -0.071032783049981160, -0.070982909262136573, -0.070933035296835159, -0.070883161154201138, -0.070833286834359230, -0.070783412337433654, +-0.070733537663550006, -0.070683662812832504, -0.070633787785405841, -0.070583912581394265, -0.070534037200923355, -0.070484161644117346, -0.070434285911100944, -0.070384410001998368, +-0.070334533916935227, -0.070284657656035740, -0.070234781219424169, -0.070184904607226095, -0.070135027819565751, -0.070085150856567843, -0.070035273718356605, -0.069985396405057645, +-0.069935518916795170, -0.069885641253693911, -0.069835763415878105, -0.069785885403473330, -0.069736007216603849, -0.069686128855394353, -0.069636250319969076, -0.069586371610453626, +-0.069536492726972252, -0.069486613669649630, -0.069436734438610051, -0.069386855033979067, -0.069336975455880939, -0.069287095704440388, -0.069237215779781647, -0.069187335682030310, +-0.069137455411310625, -0.069087574967746868, -0.069037694351464618, -0.068987813562588138, -0.068937932601242105, -0.068888051467550809, -0.068838170161639831, -0.068788288683633431, +-0.068738407033656301, -0.068688525211832704, -0.068638643218288248, -0.068588761053147179, -0.068538878716534204, -0.068488996208573599, -0.068439113529390944, -0.068389230679110499, +-0.068339347657856986, -0.068289464465754651, -0.068239581102929103, -0.068189697569504604, -0.068139813865605414, -0.068089929991357129, -0.068040045946884037, -0.067990161732310817, +-0.067940277347761743, -0.067890392793362425, -0.067840508069237124, -0.067790623175510559, -0.067740738112306992, -0.067690852879752017, -0.067640967477969910, -0.067591081907085390, +-0.067541196167222720, -0.067491310258507506, -0.067441424181064011, -0.067391537935016954, -0.067341651520490611, -0.067291764937610590, -0.067241878186501153, -0.067191991267286574, +-0.067142104180092449, -0.067092216925043080, -0.067042329502263159, -0.066992441911876977, -0.066942554154010139, -0.066892666228786909, -0.066842778136332007, -0.066792889876769734, +-0.066743001450225659, -0.066693112856824097, -0.066643224096689740, -0.066593335169946893, -0.066543446076721136, -0.066493556817136770, -0.066443667391318517, -0.066393777799390652, +-0.066343888041478782, -0.066293998117707184, -0.066244108028200160, -0.066194217773083305, -0.066144327352480908, -0.066094436766517689, -0.066044546015317937, -0.065994655099007260, +-0.065944764017709948, -0.065894872771550733, -0.065844981360653879, -0.065795089785145033, -0.065745198045148445, -0.065695306140788862, -0.065645414072190586, -0.065595521839479212, +-0.065545629442779030, -0.065495736882214772, -0.065445844157910729, -0.065395951269992522, -0.065346058218584441, -0.065296165003811205, -0.065246271625797117, -0.065196378084667786, +-0.065146484380547529, -0.065096590513560607, -0.065046696483832642, -0.064996802291487951, -0.064946907936651241, -0.064897013419446828, -0.064847118740000320, -0.064797223898436021, +-0.064747328894878664, -0.064697433729452539, -0.064647538402283267, -0.064597642913495151, -0.064547747263212926, -0.064497851451560895, -0.064447955478664679, -0.064398059344648567, +-0.064348163049637322, -0.064298266593755204, -0.064248369977127878, -0.064198473199879619, -0.064148576262134743, -0.064098679164018860, -0.064048781905656285, -0.063998884487171753, +-0.063948986908689567, -0.063899089170335363, -0.063849191272233430, -0.063799293214508529, -0.063749394997284936, -0.063699496620688301, -0.063649598084842940, -0.063599699389873560, +-0.063549800535904505, -0.063499901523061397, -0.063450002351468526, -0.063400103021250639, -0.063350203532532068, -0.063300303885438419, -0.063250404080094025, -0.063200504116623160, +-0.063150603995151489, -0.063100703715803313, -0.063050803278703368, -0.063000902683975971, -0.062951001931746770, -0.062901101022140055, -0.062851199955280587, -0.062801298731292685, +-0.062751397350301968, -0.062701495812432770, -0.062651594117809822, -0.062601692266557443, -0.062551790258801282, -0.062501888094665656, -0.062451985774275298, -0.062402083297754533, +-0.062352180665229004, -0.062302277876823027, -0.062252374932661350, -0.062202471832868297, -0.062152568577569504, -0.062102665166889288, -0.062052761600951974, -0.062002857879883196, +-0.061952954003807272, -0.061903049972848963, -0.061853145787132580, -0.061803241446783785, -0.061753336951926883, -0.061703432302686635, -0.061653527499187365, -0.061603622541554721, +-0.061553717429913023, -0.061503812164387030, -0.061453906745101060, -0.061404001172180769, -0.061354095445750476, -0.061304189565934947, -0.061254283532858493, -0.061204377346646778, +-0.061154471007424119, -0.061104564515314840, -0.061054657870444597, -0.061004751072937700, -0.060954844122918933, -0.060904937020512612, -0.060855029765844386, -0.060805122359038587, +-0.060755214800219989, -0.060705307089512904, -0.060655399227042994, -0.060605491212934591, -0.060555583047312456, -0.060505674730300926, -0.060455766262025645, -0.060405857642610951, +-0.060355948872181618, -0.060306039950861964, -0.060256130878777653, -0.060206221656053015, -0.060156312282812381, -0.060106402759181408, -0.060056493085284435, -0.060006583261246221, +-0.059956673287191106, -0.059906763163244760, -0.059856852889531499, -0.059806942466176106, -0.059757031893302913, -0.059707121171037582, -0.059657210299504451, -0.059607299278828296, +-0.059557388109133448, -0.059507476790545570, -0.059457565323189007, -0.059407653707188528, -0.059357741942668470, -0.059307830029754496, -0.059257917968570953, -0.059208005759242170, +-0.059158093401893819, -0.059108180896650230, -0.059058268243636192, -0.059008355442976036, -0.058958442494795441, -0.058908529399218736, -0.058858616156370704, -0.058808702766375689, +-0.058758789229359371, -0.058708875545446071, -0.058658961714760580, -0.058609047737427249, -0.058559133613571734, -0.058509219343318389, -0.058459304926791994, -0.058409390364116895, +-0.058359475655418769, -0.058309560800821947, -0.058259645800451225, -0.058209730654430941, -0.058159815362886780, -0.058109899925943079, -0.058059984343724183, -0.058010068616355770, +-0.057960152743962184, -0.057910236726668222, -0.057860320564598215, -0.057810404257877861, -0.057760487806631490, -0.057710571210983899, -0.057660654471059440, -0.057610737586983783, +-0.057560820558881287, -0.057510903386876741, -0.057460986071094490, -0.057411068611660218, -0.057361151008698277, -0.057311233262333450, -0.057261315372690108, -0.057211397339893909, +-0.057161479164069225, -0.057111560845340401, -0.057061642383833114, -0.057011723779671723, -0.056961805032981018, -0.056911886143885364, -0.056861967112510431, -0.056812047938980585, +-0.056762128623420616, -0.056712209165954888, -0.056662289566709073, -0.056612369825807543, -0.056562449943375080, -0.056512529919536050, -0.056462609754416145, -0.056412689448139708, +-0.056362769000831550, -0.056312848412616030, -0.056262927683618826, -0.056213006813964309, -0.056163085803776831, -0.056113164653182078, -0.056063243362304414, -0.056013321931268643, +-0.055963400360199124, -0.055913478649221547, -0.055863556798460272, -0.055813634808040108, -0.055763712678085414, -0.055713790408721875, -0.055663868000073870, -0.055613945452266188, +-0.055564022765423202, -0.055514099939670596, -0.055464176975132749, -0.055414253871934452, -0.055364330630200083, -0.055314407250055327, -0.055264483731624556, -0.055214560075032573, +-0.055164636280403752, -0.055114712347863776, -0.055064788277537025, -0.055014864069547857, -0.054964939724021972, -0.054915015241083741, -0.054865090620857968, -0.054815165863469031, +-0.054765240969042617, -0.054715315937703103, -0.054665390769575294, -0.054615465464783568, -0.054565540023453624, -0.054515614445709834, -0.054465688731677002, -0.054415762881479500, +-0.054365836895243040, -0.054315910773091988, -0.054265984515151161, -0.054216058121544924, -0.054166131592398990, -0.054116204927837724, -0.054066278127985506, -0.054016351192968035, +-0.053966424122909681, -0.053916496917935271, -0.053866569578169175, -0.053816642103737100, -0.053766714494763418, -0.053716786751372946, -0.053666858873690070, -0.053616930861840488, +-0.053567002715948574, -0.053517074436139157, -0.053467146022536612, -0.053417217475266648, -0.053367288794453634, -0.053317359980222405, -0.053267431032697328, -0.053217501952004115, +-0.053167572738267152, -0.053117643391610812, -0.053067713912160808, -0.053017784300041511, -0.052967854555377766, -0.052917924678293933, -0.052867994668915730, -0.052818064527367550, +-0.052768134253774197, -0.052718203848260071, -0.052668273310950885, -0.052618342641971010, -0.052568411841445277, -0.052518480909498066, -0.052468549846255104, -0.052418618651840769, +-0.052368687326379885, -0.052318755869996833, -0.052268824282817344, -0.052218892564965785, -0.052168960716566563, -0.052119028737745376, -0.052069096628626611, -0.052019164389335112, +-0.051969232019995260, -0.051919299520732771, -0.051869366891672028, -0.051819434132937874, -0.051769501244654688, -0.051719568226948190, -0.051669635079942773, -0.051619701803763268, +-0.051569768398534069, -0.051519834864380887, -0.051469901201428123, -0.051419967409800607, -0.051370033489622720, -0.051320099441020200, -0.051270165264117429, -0.051220230959039249, +-0.051170296525910042, -0.051120361964855539, -0.051070427276000134, -0.051020492459468214, -0.050970557515385512, -0.050920622443876414, -0.050870687245065757, -0.050820751919077936, +-0.050770816466038683, -0.050720880886072392, -0.050670945179303893, -0.050621009345857587, -0.050571073385859207, -0.050521137299433139, -0.050471201086704227, -0.050421264747796873, +-0.050371328282836796, -0.050321391691948401, -0.050271454975256528, -0.050221518132885570, -0.050171581164961267, -0.050121644071608004, -0.050071706852950190, -0.050021769509113558, +-0.049971832040222493, -0.049921894446401854, -0.049871956727776029, -0.049822018884470763, -0.049772080916610451, -0.049722142824319929, -0.049672204607723612, -0.049622266266947226, +-0.049572327802115172, -0.049522389213352301, -0.049472450500783006, -0.049422511664533035, -0.049372572704726787, -0.049322633621489108, -0.049272694414944397, -0.049222755085218395, +-0.049172815632435501, -0.049122876056720131, -0.049072936358198010, -0.049022996536993553, -0.048973056593231604, -0.048923116527036563, -0.048873176338534184, -0.048823236027848854, +-0.048773295595105438, -0.048723355040428344, -0.048673414363943304, -0.048623473565774726, -0.048573532646047461, -0.048523591604885931, -0.048473650442415854, -0.048423709158761659, +-0.048373767754048190, -0.048323826228399855, -0.048273884581942400, -0.048223942814800233, -0.048174000927098205, -0.048124058918960738, -0.048074116790513564, -0.048024174541881098, +-0.047974232173187754, -0.047924289684559272, -0.047874347076120066, -0.047824404347994988, -0.047774461500308459, -0.047724518533186225, -0.047674575446752687, -0.047624632241132711, +-0.047574688916450718, -0.047524745472832440, -0.047474801910402299, -0.047424858229285154, -0.047374914429605418, -0.047324970511488845, -0.047275026475059843, -0.047225082320443271, +-0.047175138047763555, -0.047125193657146437, -0.047075249148716330, -0.047025304522597663, -0.046975359778916176, -0.046925414917796282, -0.046875469939362861, -0.046825524843740321, +-0.046775579631054408, -0.046725634301429543, -0.046675688854990599, -0.046625743291861990, -0.046575797612169463, -0.046525851816037439, -0.046475905903590790, -0.046425959874953932, +-0.046376013730252616, -0.046326067469611265, -0.046276121093154751, -0.046226174601007489, -0.046176227993295231, -0.046126281270142400, -0.046076334431673430, -0.046026387478014061, +-0.045976440409288728, -0.045926493225622290, -0.045876545927139183, -0.045826598513965144, -0.045776650986224618, -0.045726703344042462, -0.045676755587543104, -0.045626807716852298, +-0.045576859732094473, -0.045526911633394500, -0.045476963420876808, -0.045427015094667143, -0.045377066654889948, -0.045327118101670082, -0.045277169435131978, -0.045227220655401391, +-0.045177271762602757, -0.045127322756860502, -0.045077373638300375, -0.045027424407046823, -0.044977475063224706, -0.044927525606958459, -0.044877576038373841, -0.044827626357595282, +-0.044777676564747661, -0.044727726659955398, -0.044677776643344269, -0.044627826515038695, -0.044577876275163554, -0.044527925923843276, -0.044477975461203634, -0.044428024887369050, +-0.044378074202464403, -0.044328123406614128, -0.044278172499943987, -0.044228221482578413, -0.044178270354642286, -0.044128319116260042, -0.044078367767557448, -0.044028416308658926, +-0.043978464739688923, -0.043928513060773201, -0.043878561272036203, -0.043828609373602792, -0.043778657365597419, -0.043728705248145844, -0.043678753021372509, -0.043628800685402293, +-0.043578848240359624, -0.043528895686370285, -0.043478943023558703, -0.043428990252049771, -0.043379037371967910, -0.043329084383438903, -0.043279131286587183, -0.043229178081537638, +-0.043179224768414702, -0.043129271347344150, -0.043079317818450417, -0.043029364181857946, -0.042979410437692510, -0.042929456586078552, -0.042879502627140943, -0.042829548561004141, +-0.042779594387793912, -0.042729640107634692, -0.042679685720651374, -0.042629731226968400, -0.042579776626711537, -0.042529821920005234, -0.042479867106974378, -0.042429912187743411, +-0.042379957162438107, -0.042330002031182909, -0.042280046794102702, -0.042230091451321942, -0.042180136002966391, -0.042130180449160504, -0.042080224790028722, -0.042030269025696815, +-0.041980313156289244, -0.041930357181930888, -0.041880401102746191, -0.041830444918860940, -0.041780488630399577, -0.041730532237486989, -0.041680575740247632, -0.041630619138807272, +-0.041580662433290366, -0.041530705623821808, -0.041480748710526039, -0.041430791693528847, -0.041380834572954668, -0.041330877348928409, -0.041280920021574505, -0.041230962591018751, +-0.041181005057385589, -0.041131047420799920, -0.041081089681386178, -0.041031131839270166, -0.040981173894576318, -0.040931215847429092, -0.040881257697954275, -0.040831299446276309, +-0.040781341092520094, -0.040731382636810080, -0.040681424079272062, -0.040631465420030481, -0.040581506659210231, -0.040531547796935775, -0.040481588833332895, -0.040431629768526038, +-0.040381670602640106, -0.040331711335799561, -0.040281751968130178, -0.040231792499756412, -0.040181832930803164, -0.040131873261394897, -0.040081913491657385, -0.040031953621715091, +-0.039981993651692471, -0.039932033581715307, -0.039882073411908060, -0.039832113142395632, -0.039782152773302472, -0.039732192304754381, -0.039682231736875802, -0.039632271069791648, +-0.039582310303626377, -0.039532349438505768, -0.039482388474554285, -0.039432427411896828, -0.039382466250657867, -0.039332504990963177, -0.039282543632937234, -0.039232582176704923, +-0.039182620622390717, -0.039132658970120401, -0.039082697220018434, -0.039032735372209290, -0.038982773426818745, -0.038932811383971262, -0.038882849243791762, -0.038832887006404686, +-0.038782924671935837, -0.038732962240509677, -0.038682999712251115, -0.038633037087284612, -0.038583074365735957, -0.038533111547729613, -0.038483148633390495, -0.038433185622843057, +-0.038383222516213102, -0.038333259313625086, -0.038283296015203923, -0.038233332621074083, -0.038183369131361347, -0.038133405546190192, -0.038083441865685082, -0.038033478089971810, +-0.037983514219174841, -0.037933550253419088, -0.037883586192829014, -0.037833622037530414, -0.037783657787647765, -0.037733693443305967, -0.037683729004629497, -0.037633764471744144, +-0.037583799844774383, -0.037533835123845123, -0.037483870309080826, -0.037433905400607301, -0.037383940398549018, -0.037333975303030877, -0.037284010114177354, -0.037234044832114253, +-0.037184079456966036, -0.037134113988857617, -0.037084148427913480, -0.037034182774259405, -0.036984217028019878, -0.036934251189319367, -0.036884285258283668, -0.036834319235037258, +-0.036784353119705050, -0.036734386912411515, -0.036684420613282455, -0.036634454222442346, -0.036584487740016103, -0.036534521166128195, -0.036484554500904424, -0.036434587744469268, +-0.036384620896947648, -0.036334653958464025, -0.036284686929144216, -0.036234719809112692, -0.036184752598494359, -0.036134785297413707, -0.036084817905996540, -0.036034850424367319, +-0.035984882852650536, -0.035934915190971986, -0.035884947439456145, -0.035834979598227942, -0.035785011667411840, -0.035735043647133653, -0.035685075537517860, -0.035635107338689381, +-0.035585139050772686, -0.035535170673893585, -0.035485202208176560, -0.035435233653746533, -0.035385265010727973, -0.035335296279246690, -0.035285327459427175, -0.035235358551394341, +-0.035185389555272659, -0.035135420471187957, -0.035085451299264700, -0.035035482039627364, -0.034985512692401778, -0.034935543257712399, -0.034885573735684169, -0.034835604126441565, +-0.034785634430110388, -0.034735664646815122, -0.034685694776680702, -0.034635724819831598, -0.034585754776393626, -0.034535784646491263, -0.034485814430249444, -0.034435844127792645, +-0.034385873739246675, -0.034335903264736026, -0.034285932704385617, -0.034235962058319927, -0.034185991326664784, -0.034136020509544659, -0.034086049607084480, -0.034036078619408737, +-0.033986107546643239, -0.033936136388912477, -0.033886165146340928, -0.033836193819054408, -0.033786222407177401, -0.033736250910834840, -0.033686279330151211, -0.033636307665252323, +-0.033586335916262672, -0.033536364083307180, -0.033486392166510330, -0.033436420165997946, -0.033386448081894511, -0.033336475914324953, -0.033286503663413763, -0.033236531329286757, +-0.033186558912068426, -0.033136586411883696, -0.033086613828857053, -0.033036641163114326, -0.032986668414779992, -0.032936695583978541, -0.032886722670835804, -0.032836749675476250, +-0.032786776598024828, -0.032736803438606014, -0.032686830197345640, -0.032636856874368195, -0.032586883469798600, -0.032536909983761353, -0.032486936416382277, -0.032436962767785862, +-0.032386989038097037, -0.032337015227440299, -0.032287041335941465, -0.032237067363725030, -0.032187093310915925, -0.032137119177638639, -0.032087144964019002, -0.032037170670181504, +-0.031987196296250631, -0.031937221842352218, -0.031887247308610742, -0.031837272695151159, -0.031787298002097938, -0.031737323229576925, -0.031687348377712601, -0.031637373446629903, +-0.031587398436453334, -0.031537423347308705, -0.031487448179320525, -0.031437472932613716, -0.031387497607312791, -0.031337522203543557, -0.031287546721430526, -0.031237571161098619, +-0.031187595522672348, -0.031137619806277529, -0.031087644012038659, -0.031037668140080237, -0.030987692190528087, -0.030937716163506709, -0.030887740059141040, -0.030837763877555574, +-0.030787787618876145, -0.030737811283227248, -0.030687834870733819, -0.030637858381520361, -0.030587881815712703, -0.030537905173435336, -0.030487928454813209, -0.030437951659970819, +-0.030387974789033989, -0.030337997842127224, -0.030288020819375466, -0.030238043720903211, -0.030188066546836291, -0.030138089297299202, -0.030088111972416894, -0.030038134572313861, +-0.029988157097115935, -0.029938179546947614, -0.029888201921933404, -0.029838224222199131, -0.029788246447869298, -0.029738268599068848, -0.029688290675922283, -0.029638312678555434, +-0.029588334607092807, -0.029538356461659341, -0.029488378242379539, -0.029438399949379235, -0.029388421582782934, -0.029338443142715578, -0.029288464629301670, -0.029238486042667045, +-0.029188507382936203, -0.029138528650234096, -0.029088549844685219, -0.029038570966415416, -0.028988592015549181, -0.028938612992211024, -0.028888633896526780, -0.028838654728620950, +-0.028788675488618482, -0.028738696176643885, -0.028688716792822987, -0.028638737337280298, -0.028588757810140770, -0.028538778211528899, -0.028488798541570527, -0.028438818800390162, +-0.028388838988112744, -0.028338859104862790, -0.028288879150766128, -0.028238899125947271, -0.028188919030531168, -0.028138938864642318, -0.028088958628406571, -0.028038978321948422, +-0.027988997945392387, -0.027939017498864301, -0.027889036982488669, -0.027839056396390446, -0.027789075740694134, -0.027739095015525583, -0.027689114221009292, -0.027639133357270213, +-0.027589152424432859, -0.027539171422623070, -0.027489190351965349, -0.027439209212584654, -0.027389228004605491, -0.027339246728153702, -0.027289265383353797, -0.027239283970330725, +-0.027189302489209005, -0.027139320940114467, -0.027089339323171632, -0.027039357638505446, -0.026989375886240421, -0.026939394066502403, -0.026889412179415897, -0.026839430225105418, +-0.026789448203696806, -0.026739466115314577, -0.026689483960083679, -0.026639501738128631, -0.026589519449575268, -0.026539537094548111, -0.026489554673172107, -0.026439572185571775, +-0.026389589631872955, -0.026339607012200162, -0.026289624326678352, -0.026239641575432036, -0.026189658758587062, -0.026139675876267938, -0.026089692928599625, -0.026039709915706640, +-0.025989726837714819, -0.025939743694748683, -0.025889760486932745, -0.025839777214392848, -0.025789793877253508, -0.025739810475639682, -0.025689827009675890, -0.025639843479487973, +-0.025589859885200444, -0.025539876226938270, -0.025489892504825959, -0.025439908718989358, -0.025389924869552990, -0.025339940956641806, -0.025289956980380328, -0.025239972940894403, +-0.025189988838308544, -0.025140004672747712, -0.025090020444336423, -0.025040036153200530, -0.024990051799464546, -0.024940067383252988, -0.024890082904691704, -0.024840098363905216, +-0.024790113761018480, -0.024740129096156017, -0.024690144369443674, -0.024640159581005971, -0.024590174730967869, -0.024540189819453884, -0.024490204846589869, -0.024440219812500344, +-0.024390234717310270, -0.024340249561144164, -0.024290264344127878, -0.024240279066385931, -0.024190293728043284, -0.024140308329224463, -0.024090322870055313, -0.024040337350660357, +-0.023990351771164112, -0.023940366131692432, -0.023890380432369837, -0.023840394673321292, -0.023790408854671315, -0.023740422976545758, -0.023690437039069145, -0.023640451042366440, +-0.023590464986562164, -0.023540478871782171, -0.023490492698150980, -0.023440506465793553, -0.023390520174834419, -0.023340533825399429, -0.023290547417613106, -0.023240560951600410, +-0.023190574427485872, -0.023140587845395338, -0.023090601205453337, -0.023040614507784832, -0.022990627752514349, -0.022940640939767738, -0.022890654069669527, -0.022840667142344236, +-0.022790680157917718, -0.022740693116514502, -0.022690706018259555, -0.022640718863277398, -0.022590731651693886, -0.022540744383633547, -0.022490757059221343, -0.022440769678581808, +-0.022390782241840788, -0.022340794749122816, -0.022290807200552855, -0.022240819596255432, -0.022190831936356407, -0.022140844220980300, -0.022090856450252081, -0.022040868624296280, +-0.021990880743238749, -0.021940892807204019, -0.021890904816316611, -0.021840916770702382, -0.021790928670485866, -0.021740940515792024, -0.021690952306745389, -0.021640964043471819, +-0.021590975726095838, -0.021540987354742417, -0.021490998929536084, -0.021441010450602697, -0.021391021918066782, -0.021341033332053314, -0.021291044692686820, -0.021241056000093156, +-0.021191067254396855, -0.021141078455722884, -0.021091089604195774, -0.021041100699941383, -0.020991111743084240, -0.020941122733748874, -0.020891133672061146, -0.020841144558145581, +-0.020791155392127156, -0.020741166174130399, -0.020691176904281173, -0.020641187582704001, -0.020591198209523862, -0.020541208784865282, -0.020491219308854124, -0.020441229781614920, +-0.020391240203272640, -0.020341250573951818, -0.020291260893778310, -0.020241271162876651, -0.020191281381371814, -0.020141291549388329, -0.020091301667052062, -0.020041311734487539, +-0.019991321751819734, -0.019941331719173186, -0.019891341636673748, -0.019841351504445957, -0.019791361322614345, -0.019741371091304773, -0.019691380810641774, -0.019641390480750320, +-0.019591400101754950, -0.019541409673781519, -0.019491419196954567, -0.019441428671399068, -0.019391438097239550, -0.019341447474601883, -0.019291456803610597, -0.019241466084390670, +-0.019191475317066633, -0.019141484501764349, -0.019091493638608358, -0.019041502727723630, -0.018991511769234703, -0.018941520763267439, -0.018891529709946373, -0.018841538609396039, +-0.018791547461742303, -0.018741556267109698, -0.018691565025623205, -0.018641573737407352, -0.018591582402588010, -0.018541591021289713, -0.018491599593637435, -0.018441608119755717, +-0.018391616599770424, -0.018341625033806087, -0.018291633421987689, -0.018241641764439761, -0.018191650061288176, -0.018141658312657464, -0.018091666518672604, -0.018041674679458136, +-0.017991682795139925, -0.017941690865842509, -0.017891698891690420, -0.017841706872809528, -0.017791714809324368, -0.017741722701359919, -0.017691730549040725, -0.017641738352492643, +-0.017591746111840219, -0.017541753827208427, -0.017491761498721808, -0.017441769126506232, -0.017391776710686230, -0.017341784251386785, -0.017291791748732438, -0.017241799202849052, +-0.017191806613861171, -0.017141813981893773, -0.017091821307071396, -0.017041828589519911, -0.016991835829363852, -0.016941843026727764, -0.016891850181737507, -0.016841857294517627, +-0.016791864365193105, -0.016741871393888476, -0.016691878380729611, -0.016641885325841054, -0.016591892229347781, -0.016541899091374334, -0.016491905912046585, -0.016441912691489070, +-0.016391919429826773, -0.016341926127184235, -0.016291932783687322, -0.016241939399460580, -0.016191945974628988, -0.016141952509317090, -0.016091959003650753, -0.016041965457754517, +-0.015991971871753368, -0.015941978245771846, -0.015891984579935823, -0.015841990874369837, -0.015791997129198432, -0.015742003344547475, -0.015692009520541512, -0.015642015657305525, +-0.015592021754964054, -0.015542027813642972, -0.015492033833466822, -0.015442039814560587, -0.015392045757048809, -0.015342051661057361, -0.015292057526710782, -0.015242063354134061, +-0.015192069143451736, -0.015142074894789683, -0.015092080608272444, -0.015042086284025001, -0.014992091922171899, -0.014942097522839011, -0.014892103086150882, -0.014842108612232048, +-0.014792114101208387, -0.014742119553204442, -0.014692124968345198, -0.014642130346755197, -0.014592135688560314, -0.014542140993885093, -0.014492146262854519, -0.014442151495593135, +-0.014392156692226815, -0.014342161852880104, -0.014292166977677989, -0.014242172066745013, -0.014192177120207049, -0.014142182138188644, -0.014092187120814784, -0.014042192068210011, +-0.013992196980500202, -0.013942201857809901, -0.013892206700263652, -0.013842211507987328, -0.013792216281105477, -0.013742221019743085, -0.013692225724024697, -0.013642230394076187, +-0.013592235030022102, -0.013542239631987430, -0.013492244200096714, -0.013442248734475831, -0.013392253235249328, -0.013342257702542191, -0.013292262136478966, -0.013242266537185529, +-0.013192270904786427, -0.013142275239406646, -0.013092279541170733, -0.013042283810204567, -0.012992288046632690, -0.012942292250580094, -0.012892296422171321, -0.012842300561532254, +-0.012792304668787434, -0.012742308744061409, -0.012692312787480056, -0.012642316799167920, -0.012592320779249993, -0.012542324727850820, -0.012492328645096279, -0.012442332531110916, +-0.012392336386019722, -0.012342340209947242, -0.012292344003019358, -0.012242347765360612, -0.012192351497095997, -0.012142355198350059, -0.012092358869248677, -0.012042362509916400, +-0.011992366120478215, -0.011942369701058671, -0.011892373251783646, -0.011842376772777687, -0.011792380264165344, -0.011742383726072494, -0.011692387158623684, -0.011642390561943907, +-0.011592393936157710, -0.011542397281390971, -0.011492400597768239, -0.011442403885414506, -0.011392407144454319, -0.011342410375013557, -0.011292413577216770, -0.011242416751188949, +-0.011192419897054643, -0.011142423014939730, -0.011092426104968760, -0.011042429167266726, -0.010992432201958174, -0.010942435209168985, -0.010892438189023709, -0.010842441141646892, +-0.010792444067164416, -0.010742446965700833, -0.010692449837381129, -0.010642452682329858, -0.010592455500672900, -0.010542458292534803, -0.010492461058040558, -0.010442463797314719, +-0.010392466510483164, -0.010342469197670442, -0.010292471859001548, -0.010242474494601028, -0.010192477104594769, -0.010142479689107316, -0.010092482248263663, -0.010042484782188360, +-0.009992487291007291, -0.009942489774845003, -0.009892492233826490, -0.009842494668076303, -0.009792497077720322, -0.009742499462883100, -0.009692501823689184, -0.009642504160264459, +-0.009592506472733473, -0.009542508761221220, -0.009492511025852251, -0.009442513266752450, -0.009392515484046364, -0.009342517677858991, -0.009292519848314879, -0.009242521995539911, +-0.009192524119658639, -0.009142526220796057, -0.009092528299076714, -0.009042530354626495, -0.008992532387569949, -0.008942534398032073, -0.008892536386137417, -0.008842538352011865, +-0.008792540295779966, -0.008742542217566273, -0.008692544117496667, -0.008642545995695701, -0.008592547852288371, -0.008542549687399228, -0.008492551501154154, -0.008442553293677700, +-0.008392555065094865, -0.008342556815530196, -0.008292558545109581, -0.008242560253957568, -0.008192561942199155, -0.008142563609958894, -0.008092565257362667, -0.008042566884535028, +-0.007992568491600970, -0.007942570078685048, -0.007892571645913145, -0.007842573193409811, -0.007792574721299603, -0.007742576229708400, -0.007692577718760757, -0.007642579188581669, +-0.007592580639295690, -0.007542582071028704, -0.007492583483905262, -0.007442584878050361, -0.007392586253588554, -0.007342587610645725, -0.007292588949346428, -0.007242590269815658, +-0.007192591572177969, -0.007142592856559244, -0.007092594123084038, -0.007042595371877345, -0.006992596603063722, -0.006942597816769049, -0.006892599013117883, -0.006842600192234775, +-0.006792601354245611, -0.006742602499274943, -0.006692603627447769, -0.006642604738888642, -0.006592605833723447, -0.006542606912076737, -0.006492607974073510, -0.006442609019838320, +-0.006392610049497051, -0.006342611063174256, -0.006292612060994934, -0.006242613043083638, -0.006192614009566253, -0.006142614960567333, -0.006092615896211876, -0.006042616816624435, +-0.005992617721930896, -0.005942618612255812, -0.005892619487724183, -0.005842620348460561, -0.005792621194590831, -0.005742622026239549, -0.005692622843531267, -0.005642623646591872, +-0.005592624435545919, -0.005542625210518404, -0.005492625971633882, -0.005442626719018240, -0.005392627452796030, -0.005342628173092252, -0.005292628880031459, -0.005242629573739539, +-0.005192630254341044, -0.005142630921960973, -0.005092631576723882, -0.005042632218755655, -0.004992632848180848, -0.004942633465124459, -0.004892634069711042, -0.004842634662066484, +-0.004792635242315340, -0.004742635810582162, -0.004692636366992840, -0.004642636911671927, -0.004592637444744421, -0.004542637966334878, -0.004492638476569184, -0.004442638975571894, +-0.004392639463468006, -0.004342639940382076, -0.004292640406439990, -0.004242640861766302, -0.004192641306486013, -0.004142641740723677, -0.004092642164605180, -0.004042642578255077, +-0.003992642981798369, -0.003942643375359608, -0.003892643759064683, -0.003842644133038149, -0.003792644497404561, -0.003742644852289805, -0.003692645197818437, -0.003642645534115456, +-0.003592645861305418, -0.003542646179514209, -0.003492646488866384, -0.003442646789486943, -0.003392647081500441, -0.003342647365032765, -0.003292647640208471, -0.003242647907152558, +-0.003192648165989581, -0.003142648416845428, -0.003092648659844654, -0.003042648895112258, -0.002992649122772795, -0.002942649342952154, -0.002892649555774890, -0.002842649761366002, +-0.002792649959850045, -0.002742650151352907, -0.002692650335999144, -0.002642650513913312, -0.002592650685221296, -0.002542650850047655, -0.002492651008517386, -0.002442651160755045, +-0.002392651306886521, -0.002342651447036368, -0.002292651581329587, -0.002242651709890733, -0.002192651832845693, -0.002142651950319024, -0.002092652062435725, -0.002042652169320352, +-0.001992652271098793, -0.001942652367895603, -0.001892652459835782, -0.001842652547043885, -0.001792652629645802, -0.001742652707766087, -0.001692652781529296, -0.001642652851061317, +-0.001592652916486706, -0.001542652977930462, -0.001492653035517143, -0.001442653089372634, -0.001392653139621493, -0.001342653186388719, -0.001292653229798869, -0.001242653269977829, +-0.001192653307050155, -0.001142653341140849, -0.001092653372374465, -0.001042653400876892, -0.000992653426772685, -0.000942653450186845, -0.000892653471243927, -0.000842653490069820, +-0.000792653506789079, -0.000742653521526259, -0.000692653534407251, -0.000642653545556608, -0.000592653555099331, -0.000542653563159977, -0.000492653569864433, -0.000442653575337254, +-0.000392653579703442, -0.000342653583087552, -0.000292653585615472, -0.000242653587411758, -0.000192653588601410, -0.000142653589308984, -0.000092653589660368, -0.000042653589780118, +0.000007346410206766, 0.000057346410175728, 0.000107346410000880, 0.000157346409557666, 0.000207346408721530, 0.000257346407366583, 0.000307346405368271, 0.000357346402601593, +0.000407346398941993, 0.000457346394263583, 0.000507346388441806, 0.000557346381351664, 0.000607346372868600, 0.000657346362866726, 0.000707346351221486, 0.000757346337807880, +0.000807346322501352, 0.000857346305176015, 0.000907346285707312, 0.000957346263970243, 0.001007346239840252, 0.001057346213191452, 0.001107346183899286, 0.001157346151838755, +0.001207346116885302, 0.001257346078913040, 0.001307346037797413, 0.001357345993413865, 0.001407345945636508, 0.001457345894340786, 0.001507345839401699, 0.001557345780694692, +0.001607345718093876, 0.001657345651474696, 0.001707345580712151, 0.001757345505681687, 0.001807345426257415, 0.001857345342314780, 0.001907345253728781, 0.001957345160374863, +0.002007345062127138, 0.002057344958861051, 0.002107344850451600, 0.002157344736774233, 0.002207344617703058, 0.002257344493113523, 0.002307344362881071, 0.002357344226879813, +0.002407344084985194, 0.002457343937072216, 0.002507343783016322, 0.002557343622691624, 0.002607343455973567, 0.002657343282737152, 0.002707343102857823, 0.002757342916209691, +0.002807342722668203, 0.002857342522108357, 0.002907342314405600, 0.002957342099434042, 0.003007341877069129, 0.003057341647185862, 0.003107341409659684, 0.003157341164364709, +0.003207340911176381, 0.003257340649970145, 0.003307340380620113, 0.003357340103001730, 0.003407339816989997, 0.003457339522460358, 0.003507339219286927, 0.003557338907345147, +0.003607338586510021, 0.003657338256656991, 0.003707337917660173, 0.003757337569395009, 0.003807337211736501, 0.003857336844560094, 0.003907336467739902, 0.003957336081151368, +0.004007335684669494, 0.004057335278169725, 0.004107334861526173, 0.004157334434614284, 0.004207333997309060, 0.004257333549485944, 0.004307333091019050, 0.004357332621783824, +0.004407332141655711, 0.004457331650508822, 0.004507331148218605, 0.004557330634660059, 0.004607330109708632, 0.004657329573238434, 0.004707329025124913, 0.004757328465243070, +0.004807327893468349, 0.004857327309674865, 0.004907326713738062, 0.004957326105532942, 0.005007325484934952, 0.005057324851818203, 0.005107324206058143, 0.005157323547529772, +0.005207322876108536, 0.005257322191668548, 0.005307321494085256, 0.005357320783234103, 0.005407320058989205, 0.005457319321226006, 0.005507318569819510, 0.005557317804645160, +0.005607317025577073, 0.005657316232490692, 0.005707315425261022, 0.005757314603763507, 0.005807313767872260, 0.005857312917462730, 0.005907312052409917, 0.005957311172589269, +0.006007310277874899, 0.006057309368142251, 0.006107308443266332, 0.006157307503122585, 0.006207306547585126, 0.006257305576529399, 0.006307304589830853, 0.006357303587363602, +0.006407302569003091, 0.006457301534624325, 0.006507300484102748, 0.006557299417312476, 0.006607298334128956, 0.006657297234427190, 0.006707296118082624, 0.006757294984969375, +0.006807293834962888, 0.006857292667938166, 0.006907291483770657, 0.006957290282334475, 0.007007289063505067, 0.007057287827157437, 0.007107286573167031, 0.007157285301407965, +0.007207284011755685, 0.007257282704085639, 0.007307281378271943, 0.007357280034190043, 0.007407278671714943, 0.007457277290722091, 0.007507275891085601, 0.007557274472680921, +0.007607273035383055, 0.007657271579067451, 0.007707270103608224, 0.007757268608880821, 0.007807267094760247, 0.007857265561121950, 0.007907264007840044, 0.007957262434789978, +0.008007260841846756, 0.008057259228885828, 0.008107257595781304, 0.008157255942408639, 0.008207254268642833, 0.008257252574359336, 0.008307250859432264, 0.008357249123737063, +0.008407247367149184, 0.008457245589542743, 0.008507243790793187, 0.008557241970775523, 0.008607240129365198, 0.008657238266436327, 0.008707236381864362, 0.008757234475524305, +0.008807232547291606, 0.008857230597040383, 0.008907228624646083, 0.008957226629983710, 0.009007224612928716, 0.009057222573355216, 0.009107220511138658, 0.009157218426154051, +0.009207216318276841, 0.009257214187381147, 0.009307212033342416, 0.009357209856036100, 0.009407207655336316, 0.009457205431118511, 0.009507203183257693, 0.009557200911629312, +0.009607198616107484, 0.009657196296567659, 0.009707193952884843, 0.009757191584934488, 0.009807189192590708, 0.009857186775728957, 0.009907184334224238, 0.009957181867952003, +0.010007179376786367, 0.010057176860602784, 0.010107174319276260, 0.010157171752682244, 0.010207169160694854, 0.010257166543189540, 0.010307163900041756, 0.010357161231125615, +0.010407158536316574, 0.010457155815489635, 0.010507153068520252, 0.010557150295282541, 0.010607147495651954, 0.010657144669503498, 0.010707141816712626, 0.010757138937153455, +0.010807136030701436, 0.010857133097231577, 0.010907130136619330, 0.010957127148738812, 0.011007124133465478, 0.011057121090674332, 0.011107118020240829, 0.011157114922039087, +0.011207111795944556, 0.011257108641832247, 0.011307105459577610, 0.011357102249054764, 0.011407099010139164, 0.011457095742706260, 0.011507092446630172, 0.011557089121786353, +0.011607085768049813, 0.011657082385296001, 0.011707078973399039, 0.011757075532234380, 0.011807072061677032, 0.011857068561602449, 0.011907065031884750, 0.011957061472399387, +0.012007057883021371, 0.012057054263626155, 0.012107050614087858, 0.012157046934281936, 0.012207043224083397, 0.012257039483367692, 0.012307035712008946, 0.012357031909882609, +0.012407028076864139, 0.012457024212827652, 0.012507020317648606, 0.012557016391202009, 0.012607012433363315, 0.012657008444006645, 0.012707004423007455, 0.012757000370240754, +0.012806996285581995, 0.012856992168905302, 0.012906988020086128, 0.012956983838999486, 0.013006979625520826, 0.013056975379524275, 0.013106971100885283, 0.013156966789478865, +0.013206962445180475, 0.013256958067864233, 0.013306953657405597, 0.013356949213680020, 0.013406944736561626, 0.013456940225925871, 0.013506935681647764, 0.013556931103602763, +0.013606926491664990, 0.013656921845709900, 0.013706917165612507, 0.013756912451248264, 0.013806907702491296, 0.013856902919217059, 0.013906898101300564, 0.013956893248617269, +0.014006888361041296, 0.014056883438448102, 0.014106878480712700, 0.014156873487710546, 0.014206868459315763, 0.014256863395403810, 0.014306858295850142, 0.014356853160528885, +0.014406847989315495, 0.014456842782084983, 0.014506837538712810, 0.014556832259073098, 0.014606826943041308, 0.014656821590492449, 0.014706816201301980, 0.014756810775344026, +0.014806805312494044, 0.014856799812627051, 0.014906794275618501, 0.014956788701342523, 0.015006783089674571, 0.015056777440489662, 0.015106771753663255, 0.015156766029069473, +0.015206760266583777, 0.015256754466081180, 0.015306748627437141, 0.015356742750525785, 0.015406736835222574, 0.015456730881402963, 0.015506724888941083, 0.015556718857712390, +0.015606712787591900, 0.015656706678455069, 0.015706700530176032, 0.015756694342630242, 0.015806688115692715, 0.015856681849238913, 0.015906675543142960, 0.015956669197280320, +0.016006662811526007, 0.016056656385755482, 0.016106649919842873, 0.016156643413663636, 0.016206636867092790, 0.016256630280005797, 0.016306623652276787, 0.016356616983781214, +0.016406610274394547, 0.016456603523990906, 0.016506596732445759, 0.016556589899634117, 0.016606583025431446, 0.016656576109711874, 0.016706569152350862, 0.016756562153223426, +0.016806555112205031, 0.016856548029169801, 0.016906540903993204, 0.016956533736550251, 0.017006526526716411, 0.017056519274365810, 0.017106511979373910, 0.017156504641615729, +0.017206497260966732, 0.017256489837301048, 0.017306482370494140, 0.017356474860421470, 0.017406467306957166, 0.017456459709976696, 0.017506452069355076, 0.017556444384967770, +0.017606436656688911, 0.017656428884393959, 0.017706421067957934, 0.017756413207256301, 0.017806405302163191, 0.017856397352554065, 0.017906389358303951, 0.017956381319288305, +0.018006373235381259, 0.018056365106458284, 0.018106356932394395, 0.018156348713065058, 0.018206340448344405, 0.018256332138107900, 0.018306323782230564, 0.018356315380587865, +0.018406306933053930, 0.018456298439504231, 0.018506289899814229, 0.018556281313858058, 0.018606272681511184, 0.018656264002648627, 0.018706255277145856, 0.018756246504877002, +0.018806237685717531, 0.018856228819542468, 0.018906219906227276, 0.018956210945646090, 0.019006201937674376, 0.019056192882187156, 0.019106183779059899, 0.019156174628166739, +0.019206165429383144, 0.019256156182584132, 0.019306146887645176, 0.019356137544440408, 0.019406128152845297, 0.019456118712735310, 0.019506109223984578, 0.019556099686468577, +0.019606090100062326, 0.019656080464641294, 0.019706070780079618, 0.019756061046252764, 0.019806051263035755, 0.019856041430304065, 0.019906031547931826, 0.019956021615794507, +0.020006011633767137, 0.020056001601725180, 0.020105991519542774, 0.020155981387095390, 0.020205971204258055, 0.020255960970906234, 0.020305950686914067, 0.020355940352157022, +0.020405929966510569, 0.020455919529848852, 0.020505909042047330, 0.020555898502981042, 0.020605887912525447, 0.020655877270554689, 0.020705866576944239, 0.020755855831569123, +0.020805845034304809, 0.020855834185025440, 0.020905823283606486, 0.020955812329922975, 0.021005801323850375, 0.021055790265262827, 0.021105779154035803, 0.021155767990044334, +0.021205756773163886, 0.021255745503268607, 0.021305734180233959, 0.021355722803935422, 0.021405711374247134, 0.021455699891044566, 0.021505688354202749, 0.021555676763597157, +0.021605665119101929, 0.021655653420592537, 0.021705641667944010, 0.021755629861031824, 0.021805617999730121, 0.021855606083914372, 0.021905594113459607, 0.021955582088241301, +0.022005570008133593, 0.022055557873011965, 0.022105545682751439, 0.022155533437227495, 0.022205521136314271, 0.022255508779887245, 0.022305496367821448, 0.022355483899992354, +0.022405471376274109, 0.022455458796542180, 0.022505446160672050, 0.022555433468537861, 0.022605420720015090, 0.022655407914978765, 0.022705395053304368, 0.022755382134866033, +0.022805369159539249, 0.022855356127199036, 0.022905343037720880, 0.022955329890978923, 0.023005316686848642, 0.023055303425205068, 0.023105290105923677, 0.023155276728878620, +0.023205263293945372, 0.023255249800998964, 0.023305236249914874, 0.023355222640567250, 0.023405208972831573, 0.023455195246583314, 0.023505181461696622, 0.023555167618046980, +0.023605153715509416, 0.023655139753959414, 0.023705125733271118, 0.023755111653320005, 0.023805097513981115, 0.023855083315129925, 0.023905069056640586, 0.023955054738388569, +0.024005040360248919, 0.024055025922097111, 0.024105011423807294, 0.024154996865254946, 0.024204982246315107, 0.024254967566863260, 0.024304952826773547, 0.024354938025921452, +0.024404923164182458, 0.024454908241430710, 0.024504893257541693, 0.024554878212390441, 0.024604863105852439, 0.024654847937801833, 0.024704832708114109, 0.024754817416664302, +0.024804802063327899, 0.024854786647979042, 0.024904771170493223, 0.024954755630745472, 0.025004740028611278, 0.025054724363964789, 0.025104708636681492, 0.025154692846636420, +0.025204676993705061, 0.025254661077761566, 0.025304645098681418, 0.025354629056339659, 0.025404612950611770, 0.025454596781371904, 0.025504580548495547, 0.025554564251858179, +0.025604547891333960, 0.025654531466798372, 0.025704514978126453, 0.025754498425193690, 0.025804481807874240, 0.025854465126043585, 0.025904448379576766, 0.025954431568349270, +0.026004414692235252, 0.026054397751110195, 0.026104380744849144, 0.026154363673327588, 0.026204346536419676, 0.026254329334000900, 0.026304312065946300, 0.026354294732131363, +0.026404277332430247, 0.026454259866718434, 0.026504242334871420, 0.026554224736763353, 0.026604207072269726, 0.026654189341265580, 0.026704171543626403, 0.026754153679226355, +0.026804135747940924, 0.026854117749645152, 0.026904099684214530, 0.026954081551523217, 0.027004063351446696, 0.027054045083860022, 0.027104026748638675, 0.027154008345656819, +0.027203989874789940, 0.027253971335913087, 0.027303952728901751, 0.027353934053630090, 0.027403915309973593, 0.027453896497807748, 0.027503877617006723, 0.027553858667446002, +0.027603839649000633, 0.027653820561546111, 0.027703801404956593, 0.027753782179107570, 0.027803762883874095, 0.027853743519131655, 0.027903724084754410, 0.027953704580617859, +0.028003685006597043, 0.028053665362567461, 0.028103645648403269, 0.028153625863979966, 0.028203606009172596, 0.028253586083856655, 0.028303566087906306, 0.028353546021197041, +0.028403525883604355, 0.028453505675002412, 0.028503485395266703, 0.028553465044272280, 0.028603444621894639, 0.028653424128007941, 0.028703403562487687, 0.028753382925208921, +0.028803362216047141, 0.028853341434876514, 0.028903320581572533, 0.028953299656010248, 0.029003278658065158, 0.029053257587611431, 0.029103236444524557, 0.029153215228679592, +0.029203193939952035, 0.029253172578216049, 0.029303151143347129, 0.029353129635220333, 0.029403108053711158, 0.029453086398693769, 0.029503064670043662, 0.029553042867636336, +0.029603020991345961, 0.029652999041048032, 0.029702977016617609, 0.029752954917930185, 0.029802932744859928, 0.029852910497282344, 0.029902888175072480, 0.029952865778105839, +0.030002843306256591, 0.030052820759400235, 0.030102798137411828, 0.030152775440166868, 0.030202752667539527, 0.030252729819405303, 0.030302706895639252, 0.030352683896116880, +0.030402660820712357, 0.030452637669301178, 0.030502614441758853, 0.030552591137959544, 0.030602567757778761, 0.030652544301091555, 0.030702520767773432, 0.030752497157698566, +0.030802473470742456, 0.030852449706780163, 0.030902425865687186, 0.030952401947337706, 0.031002377951607218, 0.031052353878370784, 0.031102329727503913, 0.031152305498880772, +0.031202281192376866, 0.031252256807867258, 0.031302232345227450, 0.031352207804331622, 0.031402183185055270, 0.031452158487273903, 0.031502133710861698, 0.031552108855694164, +0.031602083921646353, 0.031652058908593773, 0.031702033816410603, 0.031752008644972352, 0.031801983394154076, 0.031851958063831287, 0.031901932653878161, 0.031951907164170200, +0.032001881594582476, 0.032051855944990486, 0.032101830215268419, 0.032151804405291771, 0.032201778514935615, 0.032251752544075453, 0.032301726492585468, 0.032351700360341164, +0.032401674147217611, 0.032451647853090321, 0.032501621477833462, 0.032551595021322551, 0.032601568483433097, 0.032651541864039277, 0.032701515163016601, 0.032751488380240140, +0.032801461515585398, 0.032851434568926564, 0.032901407540139142, 0.032951380429098197, 0.033001353235679251, 0.033051325959756475, 0.033101298601205378, 0.033151271159901040, +0.033201243635718969, 0.033251216028533349, 0.033301188338219684, 0.033351160564653044, 0.033401132707708954, 0.033451104767261583, 0.033501076743186455, 0.033551048635359078, +0.033601020443653630, 0.033650992167945634, 0.033700963808110163, 0.033750935364022717, 0.033800906835557497, 0.033850878222590003, 0.033900849524995322, 0.033950820742648956, +0.034000791875425096, 0.034050762923199251, 0.034100733885846501, 0.034150704763242362, 0.034200675555261018, 0.034250646261777984, 0.034300616882668333, 0.034350587417807589, +0.034400557867069928, 0.034450528230330874, 0.034500498507465942, 0.034550468698349317, 0.034600438802856522, 0.034650408820862635, 0.034700378752243168, 0.034750348596872302, +0.034800318354625576, 0.034850288025378047, 0.034900257609005246, 0.034950227105381357, 0.035000196514381895, 0.035050165835881948, 0.035100135069757024, 0.035150104215881321, +0.035200073274130363, 0.035250042244379214, 0.035300011126503404, 0.035349979920377125, 0.035399948625875900, 0.035449917242875238, 0.035499885771249351, 0.035549854210873741, +0.035599822561623494, 0.035649790823374140, 0.035699758995999864, 0.035749727079376188, 0.035799695073378199, 0.035849662977881412, 0.035899630792760026, 0.035949598517889557, +0.035999566153145098, 0.036049533698402164, 0.036099501153534955, 0.036149468518418992, 0.036199435792929363, 0.036249402976941583, 0.036299370070329851, 0.036349337072969695, +0.036399303984736196, 0.036449270805504877, 0.036499237535149942, 0.036549204173546915, 0.036599170720571318, 0.036649137176097350, 0.036699103540000541, 0.036749069812155970, +0.036799035992439173, 0.036849002080724343, 0.036898968076887001, 0.036948933980802241, 0.036998899792345594, 0.037048865511391249, 0.037098831137814745, 0.037148796671491159, +0.037198762112296030, 0.037248727460103548, 0.037298692714789250, 0.037348657876228215, 0.037398622944295981, 0.037448587918866752, 0.037498552799816044, 0.037548517587019402, +0.037598482280351023, 0.037648446879686437, 0.037698411384900737, 0.037748375795869447, 0.037798340112466779, 0.037848304334568261, 0.037898268462048981, 0.037948232494784469, +0.037998196432648935, 0.038048160275517912, 0.038098124023266490, 0.038148087675770194, 0.038198051232903242, 0.038248014694541158, 0.038297978060559040, 0.038347941330832420, +0.038397904505235503, 0.038447867583643824, 0.038497830565932915, 0.038547793451976994, 0.038597756241651585, 0.038647718934831786, 0.038697681531393135, 0.038747644031209838, +0.038797606434157424, 0.038847568740110999, 0.038897530948946095, 0.038947493060536922, 0.038997455074759012, 0.039047416991487470, 0.039097378810597820, 0.039147340531964288, +0.039197302155462403, 0.039247263680967259, 0.039297225108354407, 0.039347186437498044, 0.039397147668273715, 0.039447108800556512, 0.039497069834221986, 0.039547030769144342, +0.039596991605199118, 0.039646952342261864, 0.039696912980206778, 0.039746873518909417, 0.039796833958244869, 0.039846794298088677, 0.039896754538315059, 0.039946714678799553, +0.039996674719417265, 0.040046634660043733, 0.040096594500553161, 0.040146554240821114, 0.040196513880722679, 0.040246473420133398, 0.040296432858927492, 0.040346392196980503, +0.040396351434167539, 0.040446310570364137, 0.040496269605444515, 0.040546228539284218, 0.040596187371758789, 0.040646146102742454, 0.040696104732110758, 0.040746063259738792, +0.040796021685502115, 0.040845980009274939, 0.040895938230932814, 0.040945896350350841, 0.040995854367404570, 0.041045812281968228, 0.041095770093917343, 0.041145727803127044, +0.041195685409472861, 0.041245642912829027, 0.041295600313071078, 0.041345557610074135, 0.041395514803713743, 0.041445471893864112, 0.041495428880400809, 0.041545385763199376, +0.041595342542134033, 0.041645299217080337, 0.041695255787913388, 0.041745212254508744, 0.041795168616740631, 0.041845124874484593, 0.041895081027615744, 0.041945037076009634, +0.041994993019540489, 0.042044948858083860, 0.042094904591514860, 0.042144860219709042, 0.042194815742540630, 0.042244771159885175, 0.042294726471617798, 0.042344681677614043, +0.042394636777748143, 0.042444591771895655, 0.042494546659932124, 0.042544501441731788, 0.042594456117170200, 0.042644410686122465, 0.042694365148464149, 0.042744319504069483, +0.042794273752814013, 0.042844227894572859, 0.042894181929221578, 0.042944135856634397, 0.042994089676686879, 0.043044043389254140, 0.043093996994211729, 0.043143950491433887, +0.043193903880796164, 0.043243857162173688, 0.043293810335442010, 0.043343763400475362, 0.043393716357149302, 0.043443669205338958, 0.043493621944919882, 0.043543574575766304, +0.043593527097753798, 0.043643479510757907, 0.043693431814652885, 0.043743384009314275, 0.043793336094617205, 0.043843288070437240, 0.043893239936648613, 0.043943191693126889, +0.043993143339747180, 0.044043094876385060, 0.044093046302914753, 0.044142997619211838, 0.044192948825151422, 0.044242899920609084, 0.044292850905459050, 0.044342801779576890, +0.044392752542837727, 0.044442703195117124, 0.044492653736289314, 0.044542604166229877, 0.044592554484814369, 0.044642504691917037, 0.044692454787413440, 0.044742404771178704, +0.044792354643088401, 0.044842304403016765, 0.044892254050839374, 0.044942203586431341, 0.044992153009668252, 0.045042102320424326, 0.045092051518575156, 0.045142000603995848, +0.045191949576561988, 0.045241898436147801, 0.045291847182628880, 0.045341795815880333, 0.045391744335777744, 0.045441692742195346, 0.045491641035008724, 0.045541589214093438, +0.045591537279323732, 0.045641485230575186, 0.045691433067722928, 0.045741380790642536, 0.045791328399208242, 0.045841275893295626, 0.045891223272779821, 0.045941170537536401, +0.045991117687439617, 0.046041064722365035, 0.046091011642187790, 0.046140958446783460, 0.046190905136026292, 0.046240851709791857, 0.046290798167955297, 0.046340744510392183, +0.046390690736976763, 0.046440636847584621, 0.046490582842090886, 0.046540528720371135, 0.046590474482299617, 0.046640420127751915, 0.046690365656603609, 0.046740311068728939, +0.046790256364003496, 0.046840201542302409, 0.046890146603501263, 0.046940091547474312, 0.046990036374097127, 0.047039981083244850, 0.047089925674793066, 0.047139870148616023, +0.047189814504589311, 0.047239758742588053, 0.047289702862487848, 0.047339646864162942, 0.047389590747488913, 0.047439534512340918, 0.047489478158594521, 0.047539421686123989, +0.047589365094804902, 0.047639308384512843, 0.047689251555122075, 0.047739194606508176, 0.047789137538546286, 0.047839080351112000, 0.047889023044079569, 0.047938965617324580, +0.047988908070722182, 0.048038850404147952, 0.048088792617476152, 0.048138734710582373, 0.048188676683341758, 0.048238618535629892, 0.048288560267321035, 0.048338501878290779, +0.048388443368414268, 0.048438384737567092, 0.048488325985623512, 0.048538267112459121, 0.048588208117949498, 0.048638149001968917, 0.048688089764392962, 0.048738030405096777, +0.048787970923955967, 0.048837911320844786, 0.048887851595638819, 0.048937791748213229, 0.048987731778443601, 0.049037671686204203, 0.049087611471370626, 0.049137551133818021, +0.049187490673421978, 0.049237430090056766, 0.049287369383597977, 0.049337308553920767, 0.049387247600900727, 0.049437186524412126, 0.049487125324330562, 0.049537064000531178, +0.049587002552889586, 0.049636940981280041, 0.049686879285578141, 0.049736817465659486, 0.049786755521398343, 0.049836693452670312, 0.049886631259350549, 0.049936568941314652, +0.049986506498436889, 0.050036443930592860, 0.050086381237657719, 0.050136318419507067, 0.050186255476015185, 0.050236192407057650, 0.050286129212509648, 0.050336065892246755, +0.050386002446143260, 0.050435938874074757, 0.050485875175916406, 0.050535811351543815, 0.050585747400831250, 0.050635683323654312, 0.050685619119888614, 0.050735554789408423, +0.050785490332089352, 0.050835425747806542, 0.050885361036435622, 0.050935296197850852, 0.050985231231927844, 0.051035166138541754, 0.051085100917568189, 0.051135035568881437, +0.051184970092357090, 0.051234904487870318, 0.051284838755296734, 0.051334772894510605, 0.051384706905387545, 0.051434640787802716, 0.051484574541631731, 0.051534508166748864, +0.051584441663029730, 0.051634375030349934, 0.051684308268583758, 0.051734241377606807, 0.051784174357294252, 0.051834107207521712, 0.051884039928163456, 0.051933972519095095, +0.051983904980191807, 0.052033837311329205, 0.052083769512381563, 0.052133701583224494, 0.052183633523733175, 0.052233565333783212, 0.052283497013248900, 0.052333428562005839, +0.052383359979929205, 0.052433291266894617, 0.052483222422776359, 0.052533153447450041, 0.052583084340791286, 0.052633015102674381, 0.052682945732974933, 0.052732876231568117, +0.052782806598329561, 0.052832736833133540, 0.052882666935855679, 0.052932596906371150, 0.052982526744555572, 0.053032456450283240, 0.053082386023429760, 0.053132315463870317, +0.053182244771480529, 0.053232173946134685, 0.053282102987708406, 0.053332031896076867, 0.053381960671115697, 0.053431889312699175, 0.053481817820702937, 0.053531746195002151, +0.053581674435472446, 0.053631602541988108, 0.053681530514424765, 0.053731458352658037, 0.053781386056562221, 0.053831313626012942, 0.053881241060885376, 0.053931168361055153, +0.053981095526396565, 0.054031022556785241, 0.054080949452096357, 0.054130876212205546, 0.054180802836987098, 0.054230729326316639, 0.054280655680069366, 0.054330581898120893, +0.054380507980345522, 0.054430433926618879, 0.054480359736816149, 0.054530285410812972, 0.054580210948483629, 0.054630136349703762, 0.054680061614348997, 0.054729986742293638, +0.054779911733413310, 0.054829836587583204, 0.054879761304678948, 0.054929685884574850, 0.054979610327146530, 0.055029534632269186, 0.055079458799818452, 0.055129382829668623, +0.055179306721695340, 0.055229230475773793, 0.055279154091779609, 0.055329077569587097, 0.055379000909071892, 0.055428924110109190, 0.055478847172574612, 0.055528770096342474, +0.055578692881288416, 0.055628615527288067, 0.055678538034215734, 0.055728460401947059, 0.055778382630357233, 0.055828304719321889, 0.055878226668715343, 0.055928148478413230, +0.055978070148290746, 0.056027991678223532, 0.056077913068085891, 0.056127834317753471, 0.056177755427101468, 0.056227676396005517, 0.056277597224339927, 0.056327517911980346, +0.056377438458801978, 0.056427358864680449, 0.056477279129490084, 0.056527199253106515, 0.056577119235404955, 0.056627039076261036, 0.056676958775549076, 0.056726878333144722, +0.056776797748923614, 0.056826717022760063, 0.056876636154529731, 0.056926555144107799, 0.056976473991369923, 0.057026392696190427, 0.057076311258444944, 0.057126229678008678, +0.057176147954757291, 0.057226066088565085, 0.057275984079307708, 0.057325901926860379, 0.057375819631098737, 0.057425737191897107, 0.057475654609131129, 0.057525571882676013, +0.057575489012407409, 0.057625405998199646, 0.057675322839928364, 0.057725239537469220, 0.057775156090696535, 0.057825072499485958, 0.057874988763712699, 0.057924904883252408, +0.057974820857979420, 0.058024736687769370, 0.058074652372497489, 0.058124567912039411, 0.058174483306269474, 0.058224398555063332, 0.058274313658296190, 0.058324228615843708, +0.058374143427580211, 0.058424058093381352, 0.058473972613122351, 0.058523886986678861, 0.058573801213925213, 0.058623715294737061, 0.058673629228990061, 0.058723543016558549, +0.058773456657318174, 0.058823370151144166, 0.058873283497912168, 0.058923196697496523, 0.058973109749772878, 0.059023022654616467, 0.059072935411902942, 0.059122848021506635, +0.059172760483303208, 0.059222672797167877, 0.059272584962976306, 0.059322496980602830, 0.059372408849923120, 0.059422320570812377, 0.059472232143146279, 0.059522143566799163, +0.059572054841646682, 0.059621965967564507, 0.059671876944426980, 0.059721787772109756, 0.059771698450488062, 0.059821608979437564, 0.059871519358832608, 0.059921429588548847, +0.059971339668461514, 0.060021249598446270, 0.060071159378377467, 0.060121069008130759, 0.060170978487581385, 0.060220887816605000, 0.060270796995075961, 0.060320706022869923, +0.060370614899862118, 0.060420523625928230, 0.060470432200942580, 0.060520340624780851, 0.060570248897318275, 0.060620157018430515, 0.060670064987991920, 0.060719972805878167, +0.060769880471964917, 0.060819787986126528, 0.060869695348238669, 0.060919602558176571, 0.060969509615815910, 0.061019416521031038, 0.061069323273697615, 0.061119229873690888, +0.061169136320886532, 0.061219042615158883, 0.061268948756383640, 0.061318854744436012, 0.061368760579191703, 0.061418666260525043, 0.061468571788311714, 0.061518477162426963, +0.061568382382746457, 0.061618287449144556, 0.061668192361496933, 0.061718097119679273, 0.061768001723565925, 0.061817906173032580, 0.061867810467954462, 0.061917714608207261, +0.061967618593665334, 0.062017522424204365, 0.062067426099699584, 0.062117329620026682, 0.062167232985060009, 0.062217136194675254, 0.062267039248747665, 0.062316942147152915, +0.062366844889765370, 0.062416747476460713, 0.062466649907114188, 0.062516552181601473, 0.062566454299796945, 0.062616356261576273, 0.062666258066815167, 0.062716159715387965, +0.062766061207170362, 0.062815962542037598, 0.062865863719865384, 0.062915764740528068, 0.062965665603901336, 0.063015566309860438, 0.063065466858281058, 0.063115367249037588, +0.063165267482005683, 0.063215167557060623, 0.063265067474078077, 0.063314967232932423, 0.063364866833499345, 0.063414766275654108, 0.063464665559272396, 0.063514564684228586, +0.063564463650398348, 0.063614362457656962, 0.063664261105880110, 0.063714159594942157, 0.063764057924718814, 0.063813956095085764, 0.063863854105917384, 0.063913751957089357, +0.063963649648476964, 0.064013547179955888, 0.064063444551400492, 0.064113341762686502, 0.064163238813689141, 0.064213135704284136, 0.064263032434345849, 0.064312929003749963, +0.064362825412371774, 0.064412721660086963, 0.064462617746769896, 0.064512513672296296, 0.064562409436541401, 0.064612305039380924, 0.064662200480689255, 0.064712095760342078, +0.064761990878215103, 0.064811885834182709, 0.064861780628120591, 0.064911675259904031, 0.064961569729408725, 0.065011464036509051, 0.065061358181080720, 0.065111252162998998, +0.065161145982139582, 0.065211039638376850, 0.065260933131586527, 0.065310826461643878, 0.065360719628424602, 0.065410612631803075, 0.065460505471655023, 0.065510398147855711, +0.065560290660280837, 0.065610183008804793, 0.065660075193303302, 0.065709967213652062, 0.065759859069725465, 0.065809750761399208, 0.065859642288548584, 0.065909533651049290, +0.065959424848775733, 0.066009315881603609, 0.066059206749408184, 0.066109097452065196, 0.066158987989449011, 0.066208878361435367, 0.066258768567899529, 0.066308658608717208, +0.066358548483762783, 0.066408438192912006, 0.066458327736040129, 0.066508217113022877, 0.066558106323734628, 0.066607995368051121, 0.066657884245848079, 0.066707772956999867, +0.066757661501382237, 0.066807549878870442, 0.066857438089340221, 0.066907326132665965, 0.066957214008723384, 0.067007101717387774, 0.067056989258534844, 0.067106876632039014, +0.067156763837775982, 0.067206650875621041, 0.067256537745449915, 0.067306424447136998, 0.067356310980558026, 0.067406197345588281, 0.067456083542103487, 0.067505969569978022, +0.067555855429087652, 0.067605741119307644, 0.067655626640513708, 0.067705511992580278, 0.067755397175383064, 0.067805282188797805, 0.067855167032698893, 0.067905051706962066, +0.067954936211462605, 0.068004820546076247, 0.068054704710677399, 0.068104588705141786, 0.068154472529344701, 0.068204356183161882, 0.068254239666467723, 0.068304122979137960, +0.068354006121047903, 0.068403889092073275, 0.068453771892088469, 0.068503654520969237, 0.068553536978590873, 0.068603419264829102, 0.068653301379558357, 0.068703183322654335, +0.068753065093992816, 0.068802946693448178, 0.068852828120896187, 0.068902709376212123, 0.068952590459271726, 0.069002471369949400, 0.069052352108120912, 0.069102232673661529, +0.069152113066447016, 0.069201993286351779, 0.069251873333251557, 0.069301753207021644, 0.069351632907537791, 0.069401512434674420, 0.069451391788307268, 0.069501270968311643, +0.069551149974563270, 0.069601028806936582, 0.069650907465307332, 0.069700785949551244, 0.069750664259542752, 0.069800542395157608, 0.069850420356271092, 0.069900298142758985, +0.069950175754495678, 0.070000053191356937, 0.070049930453218057, 0.070099807539954803, 0.070149684451441582, 0.070199561187554146, 0.070249437748167817, 0.070299314133158333, +0.070349190342400114, 0.070399066375768926, 0.070448942233140077, 0.070498817914389306, 0.070548693419391045, 0.070598568748021062, 0.070648443900154650, 0.070698318875667562, +0.070748193674434245, 0.070798068296330452, 0.070847942741231920, 0.070897817009013084, 0.070947691099549709, 0.070997565012717118, 0.071047438748391048, 0.071097312306445934, +0.071147185686757541, 0.071197058889201192, 0.071246931913652625, 0.071296804759986301, 0.071346677428077959, 0.071396549917802921, 0.071446422229036952, 0.071496294361654486, +0.071546166315531276, 0.071596038090542657, 0.071645909686564396, 0.071695781103470899, 0.071745652341137958, 0.071795523399441341, 0.071845394278255453, 0.071895264977456089, +0.071945135496918555, 0.071995005836518633, 0.072044875996130756, 0.072094745975630689, 0.072144615774893756, 0.072194485393795721, 0.072244354832211033, 0.072294224090015458, +0.072344093167084317, 0.072393962063293391, 0.072443830778517113, 0.072493699312631263, 0.072543567665511163, 0.072593435837032594, 0.072643303827069974, 0.072693171635499113, +0.072743039262195761, 0.072792906707034366, 0.072842773969890709, 0.072892641050640111, 0.072942507949158353, 0.072992374665319881, 0.073042241199000477, 0.073092107550075461, +0.073141973718420628, 0.073191839703910425, 0.073241705506420604, 0.073291571125826530, 0.073341436562003981, 0.073391301814827378, 0.073441166884172529, 0.073491031769914769, +0.073540896471929865, 0.073590760990092277, 0.073640625324277800, 0.073690489474362186, 0.073740353440219911, 0.073790217221726753, 0.073840080818758050, 0.073889944231189594, +0.073939807458895820, 0.073989670501752536, 0.074039533359635090, 0.074089396032419236, 0.074139258519979448, 0.074189120822191520, 0.074238982938930789, 0.074288844870073048, +0.074338706615492745, 0.074388568175065686, 0.074438429548667195, 0.074488290736173079, 0.074538151737457786, 0.074588012552397123, 0.074637873180866426, 0.074687733622741490, +0.074737593877896774, 0.074787453946208074, 0.074837313827551169, 0.074887173521800562, 0.074937033028832006, 0.074986892348520864, 0.075036751480742944, 0.075086610425372693, +0.075136469182285934, 0.075186327751357987, 0.075236186132464661, 0.075286044325480431, 0.075335902330281090, 0.075385760146742004, 0.075435617774738950, 0.075485475214146405, +0.075535332464840177, 0.075585189526695615, 0.075635046399588526, 0.075684903083393387, 0.075734759577985977, 0.075784615883242118, 0.075834471999036271, 0.075884327925244244, +0.075934183661741400, 0.075984039208403534, 0.076033894565105134, 0.076083749731721995, 0.076133604708129479, 0.076183459494203395, 0.076233314089818233, 0.076283168494849771, +0.076333022709173387, 0.076382876732664903, 0.076432730565198767, 0.076482584206650814, 0.076532437656896407, 0.076582290915811341, 0.076632143983270104, 0.076681996859148505, +0.076731849543322364, 0.076781702035666144, 0.076831554336055680, 0.076881406444366321, 0.076931258360473903, 0.076981110084252888, 0.077030961615579097, 0.077080812954327907, +0.077130664100375113, 0.077180515053595231, 0.077230365813864055, 0.077280216381056963, 0.077330066755049789, 0.077379916935716983, 0.077429766922934393, 0.077479616716577396, +0.077529466316521786, 0.077579315722642067, 0.077629164934814074, 0.077679013952913156, 0.077728862776815150, 0.077778711406394543, 0.077828559841527159, 0.077878408082088818, +0.077928256127954010, 0.077978103978998570, 0.078027951635097861, 0.078077799096127720, 0.078127646361962635, 0.078177493432478443, 0.078227340307550505, 0.078277186987054673, +0.078327033470865420, 0.078376879758858584, 0.078426725850909554, 0.078476571746894153, 0.078526417446686869, 0.078576262950163553, 0.078626108257199581, 0.078675953367670776, +0.078725798281451639, 0.078775642998418008, 0.078825487518445717, 0.078875331841409269, 0.078925175967184485, 0.078975019895646759, 0.079024863626671937, 0.079074707160134511, +0.079124550495910301, 0.079174393633874726, 0.079224236573903609, 0.079274079315871465, 0.079323921859654117, 0.079373764205126957, 0.079423606352165846, 0.079473448300645261, +0.079523290050441064, 0.079573131601428634, 0.079622972953483820, 0.079672814106481138, 0.079722655060296410, 0.079772495814805500, 0.079822336369882896, 0.079872176725404462, +0.079922016881245575, 0.079971856837282099, 0.080021696593388522, 0.080071536149440722, 0.080121375505314077, 0.080171214660884421, 0.080221053616026300, 0.080270892370615549, +0.080320730924527559, 0.080370569277638179, 0.080420407429821941, 0.080470245380954694, 0.080520083130911815, 0.080569920679569182, 0.080619758026801311, 0.080669595172484024, +0.080719432116493212, 0.080769268858703364, 0.080819105398990357, 0.080868941737229569, 0.080918777873296877, 0.080968613807066811, 0.081018449538415194, 0.081068285067217458, +0.081118120393349452, 0.081167955516685708, 0.081217790437102061, 0.081267625154473944, 0.081317459668677219, 0.081367293979586391, 0.081417128087077323, 0.081466961991025447, +0.081516795691306598, 0.081566629187795323, 0.081616462480367483, 0.081666295568898470, 0.081716128453264175, 0.081765961133339116, 0.081815793608999141, 0.081865625880120127, +0.081915457946576620, 0.081965289808244454, 0.082015121464999077, 0.082064952916716324, 0.082114784163270754, 0.082164615204538216, 0.082214446040394157, 0.082264276670714412, +0.082314107095373540, 0.082363937314247390, 0.082413767327211410, 0.082463597134141448, 0.082513426734912049, 0.082563256129399076, 0.082613085317477977, 0.082662914299024601, +0.082712743073913492, 0.082762571642020527, 0.082812400003221584, 0.082862228157391193, 0.082912056104405232, 0.082961883844139134, 0.083011711376468761, 0.083061538701268672, +0.083111365818414731, 0.083161192727782385, 0.083211019429247496, 0.083260845922684623, 0.083310672207969616, 0.083360498284977949, 0.083410324153585472, 0.083460149813666729, +0.083509975265097625, 0.083559800507753579, 0.083609625541510482, 0.083659450366242866, 0.083709274981826634, 0.083759099388137651, 0.083808923585050488, 0.083858747572441009, +0.083908571350184646, 0.083958394918157320, 0.084008218276233559, 0.084058041424289243, 0.084107864362199830, 0.084157687089841199, 0.084207509607087908, 0.084257331913815833, +0.084307154009900437, 0.084356975895217609, 0.084406797569641881, 0.084456619033049171, 0.084506440285314899, 0.084556261326314983, 0.084606082155923967, 0.084655902774017744, +0.084705723180471773, 0.084755543375161918, 0.084805363357962779, 0.084855183128750220, 0.084905002687400158, 0.084954822033787139, 0.085004641167787068, 0.085054460089275391, +0.085104278798128014, 0.085154097294219480, 0.085203915577425723, 0.085253733647622162, 0.085303551504684716, 0.085353369148487956, 0.085403186578907761, 0.085453003795819604, +0.085502820799099377, 0.085552637588621666, 0.085602454164262348, 0.085652270525896898, 0.085702086673401220, 0.085751902606649888, 0.085801718325518792, 0.085851533829883836, +0.085901349119619608, 0.085951164194602012, 0.086000979054706495, 0.086050793699808989, 0.086100608129784040, 0.086150422344507580, 0.086200236343855055, 0.086250050127702399, +0.086299863695924156, 0.086349677048396259, 0.086399490184994182, 0.086449303105593817, 0.086499115810069735, 0.086548928298297884, 0.086598740570153709, 0.086648552625513117, +0.086698364464250707, 0.086748176086242385, 0.086797987491364054, 0.086847798679490329, 0.086897609650497101, 0.086947420404259845, 0.086997230940654480, 0.087047041259555605, +0.087096851360839111, 0.087146661244380502, 0.087196470910055682, 0.087246280357739237, 0.087296089587307099, 0.087345898598634730, 0.087395707391598049, 0.087445515966071669, +0.087495324321931495, 0.087545132459053016, 0.087594940377312150, 0.087644748076583484, 0.087694555556742937, 0.087744362817666469, 0.087794169859228624, 0.087843976681305377, +0.087893783283772176, 0.087943589666504965, 0.087993395829378332, 0.088043201772268209, 0.088093007495050085, 0.088142812997599893, 0.088192618279792218, 0.088242423341502993, +0.088292228182607721, 0.088342032802982307, 0.088391837202501378, 0.088441641381040853, 0.088491445338476221, 0.088541249074683429, 0.088591052589537062, 0.088640855882913067, +0.088690658954686932, 0.088740461804734591, 0.088790264432930657, 0.088840066839151063, 0.088889869023271742, 0.088939670985167307, 0.088989472724713692, 0.089039274241786398, +0.089089075536261358, 0.089138876608013187, 0.089188677456917817, 0.089238478082850764, 0.089288278485687961, 0.089338078665304008, 0.089387878621574865, 0.089437678354376021, +0.089487477863583437, 0.089537277149071698, 0.089587076210716779, 0.089636875048394168, 0.089686673661979813, 0.089736472051348326, 0.089786270216375655, 0.089836068156937759, +0.089885865872909240, 0.089935663364166071, 0.089985460630583741, 0.090035257672038196, 0.090085054488404065, 0.090134851079557293, 0.090184647445373398, 0.090234443585728324, +0.090284239500496716, 0.090334035189554490, 0.090383830652777178, 0.090433625890040739, 0.090483420901219788, 0.090533215686190285, 0.090583010244827747, 0.090632804577008119, +0.090682598682606044, 0.090732392561497469, 0.090782186213558352, 0.090831979638663338, 0.090881772836688371, 0.090931565807508968, 0.090981358551001090, 0.091031151067039379, +0.091080943355499794, 0.091130735416257838, 0.091180527249189500, 0.091230318854169393, 0.091280110231073491, 0.091329901379777312, 0.091379692300156815, 0.091429482992086655, +0.091479273455442781, 0.091529063690100734, 0.091578853695936463, 0.091628643472824622, 0.091678433020641159, 0.091728222339261617, 0.091778011428561970, 0.091827800288416847, +0.091877588918702222, 0.091927377319294068, 0.091977165490067042, 0.092026953430897090, 0.092076741141659743, 0.092126528622231002, 0.092176315872485495, 0.092226102892299197, +0.092275889681547638, 0.092325676240106805, 0.092375462567851327, 0.092425248664657206, 0.092475034530399958, 0.092524820164955557, 0.092574605568198673, 0.092624390740005266, +0.092674175680250895, 0.092723960388811519, 0.092773744865561808, 0.092823529110377723, 0.092873313123135265, 0.092923096903709076, 0.092972880451975159, 0.093022663767809030, +0.093072446851086690, 0.093122229701682782, 0.093172012319473307, 0.093221794704333796, 0.093271576856140237, 0.093321358774767299, 0.093371140460090971, 0.093420921911986782, +0.093470703130330735, 0.093520484114997485, 0.093570264865863020, 0.093620045382802899, 0.093669825665693110, 0.093719605714408322, 0.093769385528824509, 0.093819165108817673, +0.093868944454262485, 0.093918723565034931, 0.093968502441010571, 0.094018281082065405, 0.094068059488074077, 0.094117837658912615, 0.094167615594456550, 0.094217393294581897, +0.094267170759163313, 0.094316947988076813, 0.094366724981197928, 0.094416501738402672, 0.094466278259565731, 0.094516054544563091, 0.094565830593270311, 0.094615606405563407, +0.094665381981317034, 0.094715157320407209, 0.094764932422709933, 0.094814707288099875, 0.094864481916453067, 0.094914256307645037, 0.094964030461551815, 0.095013804378048086, +0.095063578057009823, 0.095113351498312640, 0.095163124701832497, 0.095212897667444119, 0.095262670395023494, 0.095312442884446180, 0.095362215135588208, 0.095411987148324259, +0.095461758922530338, 0.095511530458082028, 0.095561301754855332, 0.095611072812724934, 0.095660843631566850, 0.095710614211256664, 0.095760384551670394, 0.095810154652682708, +0.095859924514169637, 0.095909694136007195, 0.095959463518070082, 0.096009232660234298, 0.096059001562375443, 0.096108770224369519, 0.096158538646091238, 0.096208306827416601, +0.096258074768221208, 0.096307842468381061, 0.096357609927770871, 0.096407377146266654, 0.096457144123743982, 0.096506910860078912, 0.096556677355146114, 0.096606443608821618, +0.096656209620981023, 0.096705975391500332, 0.096755740920254268, 0.096805506207118863, 0.096855271251970118, 0.096905036054682758, 0.096954800615132813, 0.097004564933195855, +0.097054329008747942, 0.097104092841663756, 0.097153856431819341, 0.097203619779090283, 0.097253382883352613, 0.097303145744481054, 0.097352908362351623, 0.097402670736839919, +0.097452432867821986, 0.097502194755172536, 0.097551956398767584, 0.097601717798482743, 0.097651478954194057, 0.097701239865776224, 0.097751000533105301, 0.097800760956057317, +0.097850521134506985, 0.097900281068330347, 0.097950040757403017, 0.097999800201601012, 0.098049559400799083, 0.098099318354873233, 0.098149077063699103, 0.098198835527152722, +0.098248593745108803, 0.098298351717443402, 0.098348109444032134, 0.098397866924751012, 0.098447624159474806, 0.098497381148079516, 0.098547137890440784, 0.098596894386434653, +0.098646650635935834, 0.098696406638820400, 0.098746162394963949, 0.098795917904242525, 0.098845673166530867, 0.098895428181705033, 0.098945182949641067, 0.098994937470213692, +0.099044691743298982, 0.099094445768772535, 0.099144199546510423, 0.099193953076387370, 0.099243706358279435, 0.099293459392062244, 0.099343212177611828, 0.099392964714802953, +0.099442717003511663, 0.099492469043613571, 0.099542220834984763, 0.099591972377499949, 0.099641723671035201, 0.099691474715466161, 0.099741225510668857, 0.099790976056518058, +0.099840726352889819, 0.099890476399660214, 0.099940226196703966, 0.099989975743897147, 0.100039725041115400, 0.100089474088234780, 0.100139222885130020, 0.100188971431677220, +0.100238719727751990, 0.100288467773230390, 0.100338215567987190, 0.100387963111898450, 0.100437710404839800, 0.100487457446687310, 0.100537204237315740, 0.100586950776601170, +0.100636697064419200, 0.100686443100645950, 0.100736188885156130, 0.100785934417825860, 0.100835679698531190, 0.100885424727146870, 0.100935169503549000, 0.100984914027613200, +0.101034658299215550, 0.101084402318230820, 0.101134146084535080, 0.101183889598003980, 0.101233632858513600, 0.101283375865938690, 0.101333118620155340, 0.101382861121039200, +0.101432603368466340, 0.101482345362311540, 0.101532087102450870, 0.101581828588759980, 0.101631569821114970, 0.101681310799390580, 0.101731051523462930, 0.101780791993208080, +0.101830532208500820, 0.101880272169217220, 0.101930011875232930, 0.101979751326424060, 0.102029490522665380, 0.102079229463832970, 0.102128968149802480, 0.102178706580450020, +0.102228444755650350, 0.102278182675279560, 0.102327920339213310, 0.102377657747327720, 0.102427394899497540, 0.102477131795598860, 0.102526868435507360, 0.102576604819099120, +0.102626340946248940, 0.102676076816832900, 0.102725812430726660, 0.102775547787806340, 0.102825282887946720, 0.102875017731023880, 0.102924752316913930, 0.102974486645491680, +0.103024220716633200, 0.103073954530214160, 0.103123688086110680, 0.103173421384197550, 0.103223154424350860, 0.103272887206446280, 0.103322619730359930, 0.103372351995966570, +0.103422084003142360, 0.103471815751762920, 0.103521547241704380, 0.103571278472841550, 0.103621009445050510, 0.103670740158206940, 0.103720470612186980, 0.103770200806865390, +0.103819930742118300, 0.103869660417821820, 0.103919389833850750, 0.103969118990081210, 0.104018847886388880, 0.104068576522649850, 0.104118304898738950, 0.104168033014532290, +0.104217760869905540, 0.104267488464734840, 0.104317215798894970, 0.104366942872262060, 0.104416669684711790, 0.104466396236120290, 0.104516122526362370, 0.104565848555314130, +0.104615574322851280, 0.104665299828849920, 0.104715025073184880, 0.104764750055732270, 0.104814474776368240, 0.104864199234967560, 0.104913923431406400, 0.104963647365560420, +0.105013371037305780, 0.105063094446517260, 0.105112817593071010, 0.105162540476842700, 0.105212263097708490, 0.105261985455543190, 0.105311707550222910, 0.105361429381623360, +0.105411150949620700, 0.105460872254089700, 0.105510593294906530, 0.105560314071946880, 0.105610034585086870, 0.105659754834201360, 0.105709474819166440, 0.105759194539857840, +0.105808913996151690, 0.105858633187922810, 0.105908352115047360, 0.105958070777401460, 0.106007789174859950, 0.106057507307298970, 0.106107225174594210, 0.106156942776621840, +0.106206660113256660, 0.106256377184374850, 0.106306093989852080, 0.106355810529564510, 0.106405526803386980, 0.106455242811195640, 0.106504958552866190, 0.106554674028274790, +0.106604389237296250, 0.106654104179806750, 0.106703818855681980, 0.106753533264798110, 0.106803247407029960, 0.106852961282253690, 0.106902674890345470, 0.106952388231180110, +0.107002101304633790, 0.107051814110582210, 0.107101526648901530, 0.107151238919466610, 0.107200950922153580, 0.107250662656838180, 0.107300374123396550, 0.107350085321703550, +0.107399796251635340, 0.107449506913067640, 0.107499217305876610, 0.107548927429937100, 0.107598637285125270, 0.107648346871316840, 0.107698056188388000, 0.107747765236213570, +0.107797474014669730, 0.107847182523632640, 0.107896890762977150, 0.107946598732579450, 0.107996306432315240, 0.108046013862060700, 0.108095721021690700, 0.108145427911081380, +0.108195134530108500, 0.108244840878648220, 0.108294546956575410, 0.108344252763766220, 0.108393958300096390, 0.108443663565442120, 0.108493368559678250, 0.108543073282680950, +0.108592777734325980, 0.108642481914489500, 0.108692185823046360, 0.108741889459872770, 0.108791592824844460, 0.108841295917837600, 0.108890998738727070, 0.108940701287389030, +0.108990403563699680, 0.109040105567533890, 0.109089807298767840, 0.109139508757277250, 0.109189209942938350, 0.109238910855625980, 0.109288611495216320, 0.109338311861585140, +0.109388011954608620, 0.109437711774161630, 0.109487411320120370, 0.109537110592360570, 0.109586809590758440, 0.109636508315188840, 0.109686206765527970, 0.109735904941651590, +0.109785602843435890, 0.109835300470755720, 0.109884997823487320, 0.109934694901506850, 0.109984391704689220, 0.110034088232910610, 0.110083784486046780, 0.110133480463973910, +0.110183176166566920, 0.110232871593701970, 0.110282566745254860, 0.110332261621101770, 0.110381956221117570, 0.110431650545178490, 0.110481344593160280, 0.110531038364939160, +0.110580731860390000, 0.110630425079389000, 0.110680118021811950, 0.110729810687535040, 0.110779503076433170, 0.110829195188382520, 0.110878887023259350, 0.110928578580938510, +0.110978269861296220, 0.111027960864208260, 0.111077651589550840, 0.111127342037198850, 0.111177032207028500, 0.111226722098915570, 0.111276411712736280, 0.111326101048365520, +0.111375790105679500, 0.111425478884554010, 0.111475167384865260, 0.111524855606488160, 0.111574543549298910, 0.111624231213173300, 0.111673918597987570, 0.111723605703616590, +0.111773292529936600, 0.111822979076823810, 0.111872665344153150, 0.111922351331800810, 0.111972037039642610, 0.112021722467554740, 0.112071407615412120, 0.112121092483090990, +0.112170777070467130, 0.112220461377416770, 0.112270145403814820, 0.112319829149537490, 0.112369512614460600, 0.112419195798460370, 0.112468878701411700, 0.112518561323190840, +0.112568243663673570, 0.112617925722736140, 0.112667607500253450, 0.112717288996101740, 0.112766970210156820, 0.112816651142294900, 0.112866331792390930, 0.112916012160321110, +0.112965692245961720, 0.113015372049187640, 0.113065051569875130, 0.113114730807900010, 0.113164409763138490, 0.113214088435465500, 0.113263766824757310, 0.113313444930889680, +0.113363122753738890, 0.113412800293179850, 0.113462477549088810, 0.113512154521341570, 0.113561831209814390, 0.113611507614382200, 0.113661183734921230, 0.113710859571307300, +0.113760535123416680, 0.113810210391124250, 0.113859885374306320, 0.113909560072839100, 0.113959234486597550, 0.114008908615457910, 0.114058582459296010, 0.114108256017988070, +0.114157929291409070, 0.114207602279435240, 0.114257274981942410, 0.114306947398806830, 0.114356619529903430, 0.114406291375108490, 0.114455962934297830, 0.114505634207347690, +0.114555305194133030, 0.114604975894530100, 0.114654646308414740, 0.114704316435663200, 0.114753986276150440, 0.114803655829752700, 0.114853325096346270, 0.114902994075806080, +0.114952662768008400, 0.115002331172829070, 0.115051999290144360, 0.115101667119829190, 0.115151334661759880, 0.115201001915812220, 0.115250668881862490, 0.115300335559785650, +0.115350001949457980, 0.115399668050755300, 0.115449333863553880, 0.115498999387728700, 0.115548664623156020, 0.115598329569711670, 0.115647994227271940, 0.115697658595711790, +0.115747322674907490, 0.115796986464734880, 0.115846649965070240, 0.115896313175788550, 0.115945976096766060, 0.115995638727879090, 0.116045301069002570, 0.116094963120012790, +0.116144624880785610, 0.116194286351197320, 0.116243947531122850, 0.116293608420438520, 0.116343269019020190, 0.116392929326744110, 0.116442589343485270, 0.116492249069119950, +0.116541908503524010, 0.116591567646573750, 0.116641226498144110, 0.116690885058111410, 0.116740543326351500, 0.116790201302740690, 0.116839858987153920, 0.116889516379467500, +0.116939173479557730, 0.116988830287299590, 0.117038486802569370, 0.117088143025242940, 0.117137798955196590, 0.117187454592305300, 0.117237109936445370, 0.117286764987492670, +0.117336419745323510, 0.117386074209812840, 0.117435728380837000, 0.117485382258271830, 0.117535035841993650, 0.117584689131877430, 0.117634342127799500, 0.117683994829635710, +0.117733647237262370, 0.117783299350554480, 0.117832951169388330, 0.117882602693640260, 0.117932253923185220, 0.117981904857899560, 0.118031555497659130, 0.118081205842340260, +0.118130855891817930, 0.118180505645968460, 0.118230155104667740, 0.118279804267792050, 0.118329453135216420, 0.118379101706817160, 0.118428749982470150, 0.118478397962051690, +0.118528045645436800, 0.118577693032501800, 0.118627340123122570, 0.118676986917175420, 0.118726633414535380, 0.118776279615078740, 0.118825925518681850, 0.118875571125219700, +0.118925216434568620, 0.118974861446604500, 0.119024506161203680, 0.119074150578241140, 0.119123794697593220, 0.119173438519135820, 0.119223082042745270, 0.119272725268296580, +0.119322368195666060, 0.119372010824729630, 0.119421653155363610, 0.119471295187443020, 0.119520936920844190, 0.119570578355443020, 0.119620219491115840, 0.119669860327737670, +0.119719500865184850, 0.119769141103333280, 0.119818781042059300, 0.119868420681237920, 0.119918060020745500, 0.119967699060458360, 0.120017337800251530, 0.120066976240001360, +0.120116614379583750, 0.120166252218875040, 0.120215889757750270, 0.120265526996085770, 0.120315163933757450, 0.120364800570641670, 0.120414436906613440, 0.120464072941549120, +0.120513708675324610, 0.120563344107816270, 0.120612979238899150, 0.120662614068449550, 0.120712248596343440, 0.120761882822457150, 0.120811516746665700, 0.120861150368845450, +0.120910783688872790, 0.120960416706622710, 0.121010049421971590, 0.121059681834795350, 0.121109313944970350, 0.121158945752371610, 0.121208577256875530, 0.121258208458358000, +0.121307839356695370, 0.121357469951762720, 0.121407100243436390, 0.121456730231592310, 0.121506359916106840, 0.121555989296855040, 0.121605618373713250, 0.121655247146557440, +0.121704875615263930, 0.121754503779707800, 0.121804131639765400, 0.121853759195313130, 0.121903386446226020, 0.121953013392380430, 0.122002640033652310, 0.122052266369918030, +0.122101892401052650, 0.122151518126932530, 0.122201143547433620, 0.122250768662432300, 0.122300393471803600, 0.122350017975423940, 0.122399642173169220, 0.122449266064915840, +0.122498889650538840, 0.122548512929914630, 0.122598135902919140, 0.122647758569428740, 0.122697380929318510, 0.122747002982464830, 0.122796624728743640, 0.122846246168031330, +0.122895867300202950, 0.122945488125134920, 0.122995108642703600, 0.123044728852784070, 0.123094348755252730, 0.123143968349985510, 0.123193587636858810, 0.123243206615747700, +0.123292825286528560, 0.123342443649077370, 0.123392061703270510, 0.123441679448983060, 0.123491296886091410, 0.123540914014471510, 0.123590530833999760, 0.123640147344551250, +0.123689763546002390, 0.123739379438229100, 0.123788995021107810, 0.123838610294513580, 0.123888225258322840, 0.123937839912411970, 0.123987454256656070, 0.124037068290931520, +0.124086682015114300, 0.124136295429080820, 0.124185908532706170, 0.124235521325866740, 0.124285133808438500, 0.124334745980297880, 0.124384357841319950, 0.124433969391381110, +0.124483580630357370, 0.124533191558125100, 0.124582802174559430, 0.124632412479536740, 0.124682022472933020, 0.124731632154624680, 0.124781241524486830, 0.124830850582395870, +0.124880459328228240, 0.124930067761859000, 0.124979675883164600, 0.125029283692021010, 0.125078891188304650, 0.125128498371890630, 0.125178105242655350, 0.125227711800474820, +0.125277318045225430, 0.125326923976782330, 0.125376529595021910, 0.125426134899820160, 0.125475739891053510, 0.125525344568597070, 0.125574948932327290, 0.125624552982120140, +0.125674156717852010, 0.125723760139398070, 0.125773363246634740, 0.125822966039438430, 0.125872568517684270, 0.125922170681248670, 0.125971772530007660, 0.126021374063837680, +0.126070975282613800, 0.126120576186212470, 0.126170176774509730, 0.126219777047381960, 0.126269377004704310, 0.126318976646353250, 0.126368575972204720, 0.126418174982135200, +0.126467773676019770, 0.126517372053734950, 0.126566970115156690, 0.126616567860161430, 0.126666165288624320, 0.126715762400421790, 0.126765359195429860, 0.126814955673524990, +0.126864551834582260, 0.126914147678478170, 0.126963743205089160, 0.127013338414290330, 0.127062933305958160, 0.127112527879968660, 0.127162122136198260, 0.127211716074522140, +0.127261309694816720, 0.127310902996958020, 0.127360495980822520, 0.127410088646285340, 0.127459680993222910, 0.127509273021511300, 0.127558864731026960, 0.127608456121645010, +0.127658047193241890, 0.127707637945693670, 0.127757228378876820, 0.127806818492666420, 0.127856408286939010, 0.127905997761570990, 0.127955586916437550, 0.128005175751415150, +0.128054764266379790, 0.128104352461207970, 0.128153940335774850, 0.128203527889956840, 0.128253115123630020, 0.128302702036670880, 0.128352288628954540, 0.128401874900357450, +0.128451460850755680, 0.128501046480025720, 0.128550631788042690, 0.128600216774683060, 0.128649801439822910, 0.128699385783338700, 0.128748969805105580, 0.128798553505000050, +0.128848136882898560, 0.128897719938676270, 0.128947302672209720, 0.128996885083374900, 0.129046467172048290, 0.129096048938105080, 0.129145630381421740, 0.129195211501874350, +0.129244792299339360, 0.129294372773691930, 0.129343952924808600, 0.129393532752565380, 0.129443112256838740, 0.129492691437503920, 0.129542270294437320, 0.129591848827515090, +0.129641427036613660, 0.129691004921608230, 0.129740582482375270, 0.129790159718790880, 0.129839736630731510, 0.129889313218072370, 0.129938889480689930, 0.129988465418460740, +0.130038041031259930, 0.130087616318964010, 0.130137191281449040, 0.130186765918591550, 0.130236340230266700, 0.130285914216351000, 0.130335487876720500, 0.130385061211251760, +0.130434634219819880, 0.130484206902301450, 0.130533779258572490, 0.130583351288509510, 0.130632922991987730, 0.130682494368883630, 0.130732065419073310, 0.130781636142433240, +0.130831206538838670, 0.130880776608166080, 0.130930346350291970, 0.130979915765091550, 0.131029484852441370, 0.131079053612217440, 0.131128622044296340, 0.131178190148553250, +0.131227757924864690, 0.131277325373106710, 0.131326892493155850, 0.131376459284887340, 0.131426025748177690, 0.131475591882902950, 0.131525157688939690, 0.131574723166163090, +0.131624288314449690, 0.131673853133675550, 0.131723417623717250, 0.131772981784449930, 0.131822545615750190, 0.131872109117494500, 0.131921672289558090, 0.131971235131817520, +0.132020797644148870, 0.132070359826428650, 0.132119921678532090, 0.132169483200335720, 0.132219044391715640, 0.132268605252548410, 0.132318165782709220, 0.132367725982074610, +0.132417285850520680, 0.132466845387924000, 0.132516404594159750, 0.132565963469104490, 0.132615522012634300, 0.132665080224625780, 0.132714638104954100, 0.132764195653495810, +0.132813752870127500, 0.132863309754724350, 0.132912866307162950, 0.132962422527319350, 0.133011978415070150, 0.133061533970290580, 0.133111089192857160, 0.133160644082646020, +0.133210198639533710, 0.133259752863395450, 0.133309306754107820, 0.133358860311546920, 0.133408413535589330, 0.133457966426110240, 0.133507518982986240, 0.133557071206093450, +0.133606623095308410, 0.133656174650506360, 0.133705725871563900, 0.133755276758357110, 0.133804827310762600, 0.133854377528655530, 0.133903927411912570, 0.133953476960410180, +0.134003026174023680, 0.134052575052629630, 0.134102123596104130, 0.134151671804323750, 0.134201219677163780, 0.134250767214500740, 0.134300314416210760, 0.134349861282170470, +0.134399407812255070, 0.134448954006341160, 0.134498499864304870, 0.134548045386022750, 0.134597590571370110, 0.134647135420223470, 0.134696679932458980, 0.134746224107953260, +0.134795767946581520, 0.134845311448220350, 0.134894854612746360, 0.134944397440034780, 0.134993939929962230, 0.135043482082404800, 0.135093023897239120, 0.135142565374340440, +0.135192106513585350, 0.135241647314850000, 0.135291187778010940, 0.135340727902943490, 0.135390267689524220, 0.135439807137629290, 0.135489346247135290, 0.135538885017917470, +0.135588423449852450, 0.135637961542816350, 0.135687499296685780, 0.135737036711336050, 0.135786573786643720, 0.135836110522485400, 0.135885646918736340, 0.135935182975273180, +0.135984718691972070, 0.136034254068709590, 0.136083789105361040, 0.136133323801803010, 0.136182858157911670, 0.136232392173563640, 0.136281925848634190, 0.136331459182999910, +0.136380992176536990, 0.136430524829122020, 0.136480057140630300, 0.136529589110938460, 0.136579120739922620, 0.136628652027459440, 0.136678182973424180, 0.136727713577693450, +0.136777243840143450, 0.136826773760650780, 0.136876303339090730, 0.136925832575339940, 0.136975361469274970, 0.137024890020771200, 0.137074418229705170, 0.137123946095953130, +0.137173473619391640, 0.137223000799896020, 0.137272527637342910, 0.137322054131608470, 0.137371580282569350, 0.137421106090100830, 0.137470631554079570, 0.137520156674381690, +0.137569681450883880, 0.137619205883461440, 0.137668729971990980, 0.137718253716348660, 0.137767777116411190, 0.137817300172053820, 0.137866822883153190, 0.137916345249585960, +0.137965867271227420, 0.138015388947954200, 0.138064910279642520, 0.138114431266169010, 0.138163951907408960, 0.138213472203239040, 0.138262992153535460, 0.138312511758174830, +0.138362031017032460, 0.138411549929985030, 0.138461068496908730, 0.138510586717680180, 0.138560104592174740, 0.138609622120269030, 0.138659139301839260, 0.138708656136762090, +0.138758172624912860, 0.138807688766168170, 0.138857204560404710, 0.138906720007497790, 0.138956235107324080, 0.139005749859759780, 0.139055264264681510, 0.139104778321964690, +0.139154292031485910, 0.139203805393121380, 0.139253318406747790, 0.139302831072240480, 0.139352343389476080, 0.139401855358330830, 0.139451366978681350, 0.139500878250403050, +0.139550389173372540, 0.139599899747466060, 0.139649409972560260, 0.139698919848530500, 0.139748429375253450, 0.139797938552605750, 0.139847447380462790, 0.139896955858701180, +0.139946463987197180, 0.139995971765827480, 0.140045479194467410, 0.140094986272993630, 0.140144493001282400, 0.140193999379210370, 0.140243505406652900, 0.140293011083486690, +0.140342516409587920, 0.140392021384833310, 0.140441526009098210, 0.140491030282259290, 0.140540534204192800, 0.140590037774775380, 0.140639540993882480, 0.140689043861390690, +0.140738546377176310, 0.140788048541115980, 0.140837550353085120, 0.140887051812960380, 0.140936552920618440, 0.140986053675934670, 0.141035554078785790, 0.141085054129048010, +0.141134553826598010, 0.141184053171311220, 0.141233552163064300, 0.141283050801733480, 0.141332549087195470, 0.141382047019325660, 0.141431544598000720, 0.141481041823096950, +0.141530538694490980, 0.141580035212058250, 0.141629531375675410, 0.141679027185218740, 0.141728522640564960, 0.141778017741589430, 0.141827512488168860, 0.141877006880179930, +0.141926500917498060, 0.141975994599999930, 0.142025487927561810, 0.142074980900060430, 0.142124473517371150, 0.142173965779370660, 0.142223457685935280, 0.142272949236941700, +0.142322440432265300, 0.142371931271782800, 0.142421421755370450, 0.142470911882905000, 0.142520401654261860, 0.142569891069317670, 0.142619380127948780, 0.142668868830031880, +0.142718357175442350, 0.142767845164056940, 0.142817332795752370, 0.142866820070403990, 0.142916306987888600, 0.142965793548082420, 0.143015279750862200, 0.143064765596103340, +0.143114251083682590, 0.143163736213476170, 0.143213220985360880, 0.143262705399212100, 0.143312189454906540, 0.143361673152320510, 0.143411156491330740, 0.143460639471812620, +0.143510122093642920, 0.143559604356697930, 0.143609086260854340, 0.143658567805987620, 0.143708048991974450, 0.143757529818691190, 0.143807010286014530, 0.143856490393819900, +0.143905970141984060, 0.143955449530383720, 0.144004928558894320, 0.144054407227392600, 0.144103885535754870, 0.144153363483857850, 0.144202841071576990, 0.144252318298789010, +0.144301795165370260, 0.144351271671197460, 0.144400747816146040, 0.144450223600092740, 0.144499699022913870, 0.144549174084486230, 0.144598648784685170, 0.144648123123387510, +0.144697597100469560, 0.144747070715808030, 0.144796543969278410, 0.144846016860757400, 0.144895489390121810, 0.144944961557247040, 0.144994433362009870, 0.145043904804286610, +0.145093375883954050, 0.145142846600887610, 0.145192316954964040, 0.145241786946059690, 0.145291256574051290, 0.145340725838814330, 0.145390194740225550, 0.145439663278161270, +0.145489131452498280, 0.145538599263112020, 0.145588066709879280, 0.145637533792676350, 0.145687000511380030, 0.145736466865865780, 0.145785932856010350, 0.145835398481690550, +0.145884863742781780, 0.145934328639160890, 0.145983793170704150, 0.146033257337288360, 0.146082721138789010, 0.146132184575082870, 0.146181647646046240, 0.146231110351555920, +0.146280572691487420, 0.146330034665717450, 0.146379496274122420, 0.146428957516579080, 0.146478418392962910, 0.146527878903150690, 0.146577339047018810, 0.146626798824443960, +0.146676258235301730, 0.146725717279468810, 0.146775175956822050, 0.146824634267236910, 0.146874092210590200, 0.146923549786758260, 0.146973006995617860, 0.147022463837044510, +0.147071920310915010, 0.147121376417105710, 0.147170832155493400, 0.147220287525953590, 0.147269742528363030, 0.147319197162598140, 0.147368651428535670, 0.147418105326051150, +0.147467558855021390, 0.147517012015322690, 0.147566464806831920, 0.147615917229424550, 0.147665369282977380, 0.147714820967366790, 0.147764272282469580, 0.147813723228161280, +0.147863173804318630, 0.147912624010818510, 0.147962073847536370, 0.148011523314349080, 0.148060972411132950, 0.148110421137764850, 0.148159869494120240, 0.148209317480075960, +0.148258765095508390, 0.148308212340294370, 0.148357659214309350, 0.148407105717430180, 0.148456551849533270, 0.148505997610495400, 0.148555443000192110, 0.148604888018500190, +0.148654332665296070, 0.148703776940456560, 0.148753220843857140, 0.148802664375374700, 0.148852107534886040, 0.148901550322266650, 0.148950992737393400, 0.149000434780142660, +0.149049876450391280, 0.149099317748014740, 0.149148758672889930, 0.149198199224893220, 0.149247639403901460, 0.149297079209790160, 0.149346518642436170, 0.149395957701715880, +0.149445396387506120, 0.149494834699682420, 0.149544272638121640, 0.149593710202700210, 0.149643147393294930, 0.149692584209781320, 0.149742020652036260, 0.149791456719936600, +0.149840892413357850, 0.149890327732176860, 0.149939762676270070, 0.149989197245514290, 0.150038631439785100, 0.150088065258959320, 0.150137498702913370, 0.150186931771524150, +0.150236364464667120, 0.150285796782219210, 0.150335228724056770, 0.150384660290056730, 0.150434091480094590, 0.150483522294047210, 0.150532952731791040, 0.150582382793202910, +0.150631812478158410, 0.150681241786534360, 0.150730670718207200, 0.150780099273053830, 0.150829527450949740, 0.150878955251771860, 0.150928382675397020, 0.150977809721700770, +0.151027236390560010, 0.151076662681851160, 0.151126088595451100, 0.151175514131235370, 0.151224939289080850, 0.151274364068863960, 0.151323788470461630, 0.151373212493749380, +0.151422636138604130, 0.151472059404902240, 0.151521482292520660, 0.151570904801334950, 0.151620326931221960, 0.151669748682058150, 0.151719170053720430, 0.151768591046084340, +0.151818011659026750, 0.151867431892424600, 0.151916851746153410, 0.151966271220090100, 0.152015690314111110, 0.152065109028093340, 0.152114527361912330, 0.152163945315445030, +0.152213362888567880, 0.152262780081157730, 0.152312196893090200, 0.152361613324242170, 0.152411029374490140, 0.152460445043710920, 0.152509860331780210, 0.152559275238574820, +0.152608689763971240, 0.152658103907846370, 0.152707517670075820, 0.152756931050536450, 0.152806344049105200, 0.152855756665657650, 0.152905168900070720, 0.152954580752220880, +0.153003992221984990, 0.153053403309238720, 0.153102814013858920, 0.153152224335722090, 0.153201634274705120, 0.153251043830683640, 0.153300453003534560, 0.153349861793134340, +0.153399270199359890, 0.153448678222086850, 0.153498085861192100, 0.153547493116552140, 0.153596899988043880, 0.153646306475542950, 0.153695712578926220, 0.153745118298070690, +0.153794523632851900, 0.153843928583146800, 0.153893333148831880, 0.153942737329784090, 0.153992141125878970, 0.154041544536993540, 0.154090947563004230, 0.154140350203788000, +0.154189752459220450, 0.154239154329178510, 0.154288555813538700, 0.154337956912177910, 0.154387357624971830, 0.154436757951797320, 0.154486157892530950, 0.154535557447049580, +0.154584956615228920, 0.154634355396945840, 0.154683753792076880, 0.154733151800498990, 0.154782549422087770, 0.154831946656720180, 0.154881343504273160, 0.154930739964622340, +0.154980136037644660, 0.155029531723216650, 0.155078927021215260, 0.155128321931516100, 0.155177716453996140, 0.155227110588531890, 0.155276504335000310, 0.155325897693277010, +0.155375290663238990, 0.155424683244762720, 0.155474075437725210, 0.155523467242002030, 0.155572858657470230, 0.155622249684006260, 0.155671640321487090, 0.155721030569788390, +0.155770420428787110, 0.155819809898360250, 0.155869198978383390, 0.155918587668733540, 0.155967975969287240, 0.156017363879921410, 0.156066751400511770, 0.156116138530935230, +0.156165525271068330, 0.156214911620788070, 0.156264297579970100, 0.156313683148491370, 0.156363068326228430, 0.156412453113058260, 0.156461837508856530, 0.156511221513500190, +0.156560605126865810, 0.156609988348830360, 0.156659371179269510, 0.156708753618060190, 0.156758135665079460, 0.156807517320202950, 0.156856898583307650, 0.156906279454270080, +0.156955659932967260, 0.157005040019274870, 0.157054419713069850, 0.157103799014228800, 0.157153177922628700, 0.157202556438145210, 0.157251934560655310, 0.157301312290035580, +0.157350689626163030, 0.157400066568913280, 0.157449443118163390, 0.157498819273789890, 0.157548195035669770, 0.157597570403678750, 0.157646945377693780, 0.157696319957591450, +0.157745694143248770, 0.157795067934541400, 0.157844441331346370, 0.157893814333540690, 0.157943186941000010, 0.157992559153601360, 0.158041930971221320, 0.158091302393736920, +0.158140673421023780, 0.158190044052958970, 0.158239414289419070, 0.158288784130281050, 0.158338153575420660, 0.158387522624714870, 0.158436891278040250, 0.158486259535273870, +0.158535627396291400, 0.158584994860969860, 0.158634361929185810, 0.158683728600816340, 0.158733094875737060, 0.158782460753825070, 0.158831826234957370, 0.158881191319009660, +0.158930556005858980, 0.158979920295381880, 0.159029284187455430, 0.159078647681955340, 0.159128010778758660, 0.159177373477741910, 0.159226735778782190, 0.159276097681755160, +0.159325459186537900, 0.159374820293007010, 0.159424181001039500, 0.159473541310511090, 0.159522901221298840, 0.159572260733279320, 0.159621619846329610, 0.159670978560325390, +0.159720336875143730, 0.159769694790661660, 0.159819052306754920, 0.159868409423300550, 0.159917766140175170, 0.159967122457255810, 0.160016478374418180, 0.160065833891539390, +0.160115189008495970, 0.160164543725165060, 0.160213898041422330, 0.160263251957144860, 0.160312605472209270, 0.160361958586492580, 0.160411311299870570, 0.160460663612220280, +0.160510015523418340, 0.160559367033341780, 0.160608718141866390, 0.160658068848869180, 0.160707419154227260, 0.160756769057816330, 0.160806118559513490, 0.160855467659195370, +0.160904816356738980, 0.160954164652020140, 0.161003512544915880, 0.161052860035302840, 0.161102207123058090, 0.161151553808057370, 0.161200900090177790, 0.161250245969295960, +0.161299591445288940, 0.161348936518032500, 0.161398281187403710, 0.161447625453279230, 0.161496969315536140, 0.161546312774050150, 0.161595655828698420, 0.161644998479357540, +0.161694340725904580, 0.161743682568215340, 0.161793024006166910, 0.161842365039636340, 0.161891705668499420, 0.161941045892633250, 0.161990385711914460, 0.162039725126220140, +0.162089064135426060, 0.162138402739409330, 0.162187740938046610, 0.162237078731214960, 0.162286416118790160, 0.162335753100649320, 0.162385089676669120, 0.162434425846726630, +0.162483761610697640, 0.162533096968459220, 0.162582431919888080, 0.162631766464861300, 0.162681100603254660, 0.162730434334945270, 0.162779767659810230, 0.162829100577725340, +0.162878433088567700, 0.162927765192213970, 0.162977096888541260, 0.163026428177425380, 0.163075759058743410, 0.163125089532372060, 0.163174419598188430, 0.163223749256068310, +0.163273078505888790, 0.163322407347526590, 0.163371735780858840, 0.163421063805761270, 0.163470391422111060, 0.163519718629784870, 0.163569045428659830, 0.163618371818611720, +0.163667697799517700, 0.163717023371254850, 0.163766348533699040, 0.163815673286727330, 0.163864997630216420, 0.163914321564043480, 0.163963645088084310, 0.164012968202216000, +0.164062290906315300, 0.164111613200259270, 0.164160935083923790, 0.164210256557185990, 0.164259577619922520, 0.164308898272010560, 0.164358218513325910, 0.164407538343745720, +0.164456857763146700, 0.164506176771405940, 0.164555495368399330, 0.164604813554003970, 0.164654131328096560, 0.164703448690554280, 0.164752765641252940, 0.164802082180069670, +0.164851398306881640, 0.164900714021564670, 0.164950029323995940, 0.164999344214052100, 0.165048658691610370, 0.165097972756546560, 0.165147286408737800, 0.165196599648060800, +0.165245912474392770, 0.165295224887609530, 0.165344536887588210, 0.165393848474205550, 0.165443159647338690, 0.165492470406863520, 0.165541780752657160, 0.165591090684596350, +0.165640400202558270, 0.165689709306418740, 0.165739017996054920, 0.165788326271344020, 0.165837634132161850, 0.165886941578385600, 0.165936248609891980, 0.165985555226558200, +0.166034861428260070, 0.166084167214874820, 0.166133472586279110, 0.166182777542350200, 0.166232082082963860, 0.166281386207997340, 0.166330689917327380, 0.166379993210831110, +0.166429296088384420, 0.166478598549864490, 0.166527900595148050, 0.166577202224112320, 0.166626503436633130, 0.166675804232587680, 0.166725104611853160, 0.166774404574305450, +0.166823704119821730, 0.166873003248278750, 0.166922301959553680, 0.166971600253522450, 0.167020898130062180, 0.167070195589049700, 0.167119492630362160, 0.167168789253875430, +0.167218085459466730, 0.167267381247012850, 0.167316676616390940, 0.167365971567476870, 0.167415266100147900, 0.167464560214280770, 0.167513853909752650, 0.167563147186439500, +0.167612440044218440, 0.167661732482966290, 0.167711024502560260, 0.167760316102876230, 0.167809607283791410, 0.167858898045183000, 0.167908188386926890, 0.167957478308900340, +0.168006767810980090, 0.168056056893043340, 0.168105345554966030, 0.168154633796625350, 0.168203921617898100, 0.168253209018661450, 0.168302495998791380, 0.168351782558165050, +0.168401068696659250, 0.168450354414151240, 0.168499639710516870, 0.168548924585633450, 0.168598209039377670, 0.168647493071626830, 0.168696776682256830, 0.168746059871144880, +0.168795342638168200, 0.168844624983202740, 0.168893906906125740, 0.168943188406813940, 0.168992469485144630, 0.169041750140993680, 0.169091030374238370, 0.169140310184755500, +0.169189589572422280, 0.169238868537114650, 0.169288147078709840, 0.169337425197084670, 0.169386702892116350, 0.169435980163680860, 0.169485257011655430, 0.169534533435916850, +0.169583809436342350, 0.169633085012807910, 0.169682360165190750, 0.169731634893368150, 0.169780909197216000, 0.169830183076611600, 0.169879456531431720, 0.169928729561553640, +0.169978002166853300, 0.170027274347207960, 0.170076546102494420, 0.170125817432589980, 0.170175088337370550, 0.170224358816713380, 0.170273628870495320, 0.170322898498593640, +0.170372167700884260, 0.170421436477244480, 0.170470704827551080, 0.170519972751681380, 0.170569240249511310, 0.170618507320918130, 0.170667773965779120, 0.170717040183970240, +0.170766305975368770, 0.170815571339851510, 0.170864836277295790, 0.170914100787577520, 0.170963364870574010, 0.171012628526162060, 0.171061891754219010, 0.171111154554620780, +0.171160416927244650, 0.171209678871967500, 0.171258940388666570, 0.171308201477217870, 0.171357462137498670, 0.171406722369385810, 0.171455982172756570, 0.171505241547486950, +0.171554500493454220, 0.171603759010535230, 0.171653017098607280, 0.171702274757546370, 0.171751531987229760, 0.171800788787534770, 0.171850045158337350, 0.171899301099514850, +0.171948556610944050, 0.171997811692502330, 0.172047066344065640, 0.172096320565511270, 0.172145574356716100, 0.172194827717557450, 0.172244080647911270, 0.172293333147654910, +0.172342585216665210, 0.172391836854819490, 0.172441088061993740, 0.172490338838065250, 0.172539589182910930, 0.172588839096408070, 0.172638088578432660, 0.172687337628862040, +0.172736586247573540, 0.172785834434443120, 0.172835082189348090, 0.172884329512165370, 0.172933576402772270, 0.172982822861044800, 0.173032068886860260, 0.173081314480095530, +0.173130559640627980, 0.173179804368333580, 0.173229048663089690, 0.173278292524773170, 0.173327535953261340, 0.173376778948430230, 0.173426021510157180, 0.173475263638319080, +0.173524505332793260, 0.173573746593455760, 0.173622987420183870, 0.173672227812854930, 0.173721467771345010, 0.173770707295531400, 0.173819946385291050, 0.173869185040501250, +0.173918423261038070, 0.173967661046778830, 0.174016898397600400, 0.174066135313380190, 0.174115371793994220, 0.174164607839319810, 0.174213843449233850, 0.174263078623613760, +0.174312313362335520, 0.174361547665276480, 0.174410781532313600, 0.174460014963324190, 0.174509247958184290, 0.174558480516771310, 0.174607712638962100, 0.174656944324634050, +0.174706175573663190, 0.174755406385926900, 0.174804636761302530, 0.174853866699666160, 0.174903096200895090, 0.174952325264866290, 0.175001553891457110, 0.175050782080543620, +0.175100009832003160, 0.175149237145712680, 0.175198464021549540, 0.175247690459389820, 0.175296916459110860, 0.175346142020589600, 0.175395367143703430, 0.175444591828328420, +0.175493816074341920, 0.175543039881620870, 0.175592263250042680, 0.175641486179483390, 0.175690708669820370, 0.175739930720931030, 0.175789152332691410, 0.175838373504978910, +0.175887594237670470, 0.175936814530643500, 0.175986034383774050, 0.176035253796939520, 0.176084472770016850, 0.176133691302883450, 0.176182909395415370, 0.176232127047490030, +0.176281344258984340, 0.176330561029775760, 0.176379777359740310, 0.176428993248755440, 0.176478208696698090, 0.176527423703445650, 0.176576638268874210, 0.176625852392861160, +0.176675066075283940, 0.176724279316018610, 0.176773492114942590, 0.176822704471932820, 0.176871916386866720, 0.176921127859620410, 0.176970338890071300, 0.177019549478096310, +0.177068759623572910, 0.177117969326377160, 0.177167178586386480, 0.177216387403477870, 0.177265595777528710, 0.177314803708415130, 0.177364011196014530, 0.177413218240203920, +0.177462424840860690, 0.177511630997860990, 0.177560836711082170, 0.177610041980401730, 0.177659246805695730, 0.177708451186841620, 0.177757655123716380, 0.177806858616197440, +0.177856061664160900, 0.177905264267484240, 0.177954466426044370, 0.178003668139718820, 0.178052869408383630, 0.178102070231916290, 0.178151270610193760, 0.178200470543093490, +0.178249670030491610, 0.178298869072265580, 0.178348067668292340, 0.178397265818449390, 0.178446463522612810, 0.178495660780660120, 0.178544857592468240, 0.178594053957914670, +0.178643249876875520, 0.178692445349228230, 0.178741640374850300, 0.178790834953617810, 0.178840029085408220, 0.178889222770098580, 0.178938416007566330, 0.178987608797687580, +0.179036801140339820, 0.179085993035400040, 0.179135184482745740, 0.179184375482253020, 0.179233566033799360, 0.179282756137261800, 0.179331945792517770, 0.179381134999443470, +0.179430323757916290, 0.179479512067813350, 0.179528699929012020, 0.179577887341388520, 0.179627074304820310, 0.179676260819184840, 0.179725446884358290, 0.179774632500218130, +0.179823817666641380, 0.179873002383505510, 0.179922186650686710, 0.179971370468062440, 0.180020553835509740, 0.180069736752906110, 0.180118919220127680, 0.180168101237051990, +0.180217282803556010, 0.180266463919517260, 0.180315644584811920, 0.180364824799317480, 0.180414004562910960, 0.180463183875469890, 0.180512362736870410, 0.180561541146990020, +0.180610719105706200, 0.180659896612895170, 0.180709073668434390, 0.180758250272200940, 0.180807426424072270, 0.180856602123924630, 0.180905777371635460, 0.180954952167081850, +0.181004126510141310, 0.181053300400690010, 0.181102473838605450, 0.181151646823764720, 0.181200819356045290, 0.181249991435323390, 0.181299163061476530, 0.181348334234381740, +0.181397504953916540, 0.181446675219957170, 0.181495845032381090, 0.181545014391065410, 0.181594183295887610, 0.181643351746723940, 0.181692519743451880, 0.181741687285948940, +0.181790854374091370, 0.181840021007756670, 0.181889187186821900, 0.181938352911164610, 0.181987518180661000, 0.182036682995188580, 0.182085847354624460, 0.182135011258846150, +0.182184174707729910, 0.182233337701153190, 0.182282500238993140, 0.182331662321127300, 0.182380823947431850, 0.182429985117784330, 0.182479145832061870, 0.182528306090141950, +0.182577465891900850, 0.182626625237216090, 0.182675784125965190, 0.182724942558024410, 0.182774100533271260, 0.182823258051582870, 0.182872415112836750, 0.182921571716909180, +0.182970727863677660, 0.183019883553019320, 0.183069038784811730, 0.183118193558931110, 0.183167347875254990, 0.183216501733660500, 0.183265655134025180, 0.183314808076225300, +0.183363960560138400, 0.183413112585641610, 0.183462264152612440, 0.183511415260927210, 0.183560565910463440, 0.183609716101098660, 0.183658865832709180, 0.183708015105172540, +0.183757163918365830, 0.183806312272166680, 0.183855460166451300, 0.183904607601097250, 0.183953754575981730, 0.184002901090982220, 0.184052047145975030, 0.184101192740837720, +0.184150337875447430, 0.184199482549681740, 0.184248626763416910, 0.184297770516530510, 0.184346913808899670, 0.184396056640401980, 0.184445199010913750, 0.184494340920312470, +0.184543482368475810, 0.184592623355280010, 0.184641763880602630, 0.184690903944320860, 0.184740043546312240, 0.184789182686453090, 0.184838321364621000, 0.184887459580693080, +0.184936597334546950, 0.184985734626058910, 0.185034871455106530, 0.185084007821566950, 0.185133143725317810, 0.185182279166235360, 0.185231414144197220, 0.185280548659080560, +0.185329682710762940, 0.185378816299120670, 0.185427949424031370, 0.185477082085372220, 0.185526214283020770, 0.185575346016853350, 0.185624477286747580, 0.185673608092581040, +0.185722738434230070, 0.185771868311572250, 0.185820997724484740, 0.185870126672845170, 0.185919255156529850, 0.185968383175416390, 0.186017510729382000, 0.186066637818304240, +0.186115764442059460, 0.186164890600525270, 0.186214016293578840, 0.186263141521097800, 0.186312266282958490, 0.186361390579038530, 0.186410514409215050, 0.186459637773365740, +0.186508760671366900, 0.186557883103096180, 0.186607005068431170, 0.186656126567248200, 0.186705247599424940, 0.186754368164838540, 0.186803488263366650, 0.186852607894885610, +0.186901727059273080, 0.186950845756406190, 0.186999963986162640, 0.187049081748418750, 0.187098199043052170, 0.187147315869940050, 0.187196432228960100, 0.187245548119988640, +0.187294663542903310, 0.187343778497581300, 0.187392892983900300, 0.187442007001736630, 0.187491120550967920, 0.187540233631471880, 0.187589346243124790, 0.187638458385804340, +0.187687570059387770, 0.187736681263752670, 0.187785791998775460, 0.187834902264333780, 0.187884012060304810, 0.187933121386566260, 0.187982230242994490, 0.188031338629467110, +0.188080446545861400, 0.188129553992055030, 0.188178660967924320, 0.188227767473346940, 0.188276873508200160, 0.188325979072361650, 0.188375084165707720, 0.188424188788116090, +0.188473292939464020, 0.188522396619629110, 0.188571499828487810, 0.188620602565917730, 0.188669704831796600, 0.188718806626000770, 0.188767907948407920, 0.188817008798895290, +0.188866109177340590, 0.188915209083620170, 0.188964308517611730, 0.189013407479192510, 0.189062505968240230, 0.189111603984631230, 0.189160701528243210, 0.189209798598953480, +0.189258895196639660, 0.189307991321178150, 0.189357086972446690, 0.189406182150322510, 0.189455276854683300, 0.189504371085405470, 0.189553464842366710, 0.189602558125444710, +0.189651650934515890, 0.189700743269457960, 0.189749835130148150, 0.189798926516464180, 0.189848017428282470, 0.189897107865480720, 0.189946197827936200, 0.189995287315526620, +0.190044376328128400, 0.190093464865619200, 0.190142552927876380, 0.190191640514777600, 0.190240727626199290, 0.190289814262019130, 0.190338900422114460, 0.190387986106362980, +0.190437071314641080, 0.190486156046826500, 0.190535240302796980, 0.190584324082428920, 0.190633407385600060, 0.190682490212187670, 0.190731572562069490, 0.190780654435121960, +0.190829735831222760, 0.190878816750249260, 0.190927897192079120, 0.190976977156588820, 0.191026056643656070, 0.191075135653158170, 0.191124214184972880, 0.191173292238976610, +0.191222369815047120, 0.191271446913061720, 0.191320523532898110, 0.191369599674432760, 0.191418675337543420, 0.191467750522107820, 0.191516825228002420, 0.191565899455104940, +0.191614973203292740, 0.191664046472443510, 0.191713119262433730, 0.191762191573141170, 0.191811263404443130, 0.191860334756217360, 0.191909405628340330, 0.191958476020689770, +0.192007545933143010, 0.192056615365577860, 0.192105684317870700, 0.192154752789899350, 0.192203820781541110, 0.192252888292673760, 0.192301955323173730, 0.192351021872918830, +0.192400087941786370, 0.192449153529654140, 0.192498218636398570, 0.192547283261897460, 0.192596347406028600, 0.192645411068668420, 0.192694474249694710, 0.192743536948984800, +0.192792599166416500, 0.192841660901866270, 0.192890722155211890, 0.192939782926330680, 0.192988843215100490, 0.193037903021397730, 0.193086962345100200, 0.193136021186085280, +0.193185079544230750, 0.193234137419413060, 0.193283194811510050, 0.193332251720399060, 0.193381308145957860, 0.193430364088062970, 0.193479419546592150, 0.193528474521423220, +0.193577529012432660, 0.193626583019498310, 0.193675636542497480, 0.193724689581307980, 0.193773742135806340, 0.193822794205870340, 0.193871845791377370, 0.193920896892205210, +0.193969947508230350, 0.194018997639330640, 0.194068047285383460, 0.194117096446266570, 0.194166145121856510, 0.194215193312031080, 0.194264241016667670, 0.194313288235644090, +0.194362334968836870, 0.194411381216123810, 0.194460426977382720, 0.194509472252490130, 0.194558517041323880, 0.194607561343761310, 0.194656605159680280, 0.194705648488957300, +0.194754691331470190, 0.194803733687096360, 0.194852775555713650, 0.194901816937198550, 0.194950857831428900, 0.194999898238282120, 0.195048938157636020, 0.195097977589367140, +0.195147016533353340, 0.195196054989471960, 0.195245092957600900, 0.195294130437616680, 0.195343167429397110, 0.195392203932819640, 0.195441239947762080, 0.195490275474101000, +0.195539310511714220, 0.195588345060479620, 0.195637379120273710, 0.195686412690974340, 0.195735445772458940, 0.195784478364605390, 0.195833510467290170, 0.195882542080391190, +0.195931573203785870, 0.195980603837352020, 0.196029633980966260, 0.196078663634506410, 0.196127692797849890, 0.196176721470874560, 0.196225749653457020, 0.196274777345475080, +0.196323804546806200, 0.196372831257328270, 0.196421857476917790, 0.196470883205452700, 0.196519908442810810, 0.196568933188868730, 0.196617957443504300, 0.196666981206595010, +0.196716004478018680, 0.196765027257651910, 0.196814049545372540, 0.196863071341058100, 0.196912092644586370, 0.196961113455834000, 0.197010133774678850, 0.197059153600998350, +0.197108172934670390, 0.197157191775571590, 0.197206210123579810, 0.197255227978572510, 0.197304245340427540, 0.197353262209021550, 0.197402278584232400, 0.197451294465937980, +0.197500309854014900, 0.197549324748341030, 0.197598339148793850, 0.197647353055251270, 0.197696366467589870, 0.197745379385687560, 0.197794391809421790, 0.197843403738670490, +0.197892415173310220, 0.197941426113218940, 0.197990436558274090, 0.198039446508353560, 0.198088455963333990, 0.198137464923093280, 0.198186473387508920, 0.198235481356458800, +0.198284488829819560, 0.198333495807469060, 0.198382502289285310, 0.198431508275144830, 0.198480513764925590, 0.198529518758505050, 0.198578523255761170, 0.198627527256570540, +0.198676530760811100, 0.198725533768360300, 0.198774536279096140, 0.198823538292895170, 0.198872539809635400, 0.198921540829194250, 0.198970541351449680, 0.199019541376278340, +0.199068540903558130, 0.199117539933166580, 0.199166538464981590, 0.199215536498879850, 0.199264534034739260, 0.199313531072437320, 0.199362527611852000, 0.199411523652859940, +0.199460519195339050, 0.199509514239167300, 0.199558508784221320, 0.199607502830379090, 0.199656496377518090, 0.199705489425516300, 0.199754481974250330, 0.199803474023598160, +0.199852465573437300, 0.199901456623645720, 0.199950447174100070, 0.199999437224678310, 0.200048426775257940, 0.200097415825716940, 0.200146404375931980, 0.200195392425780990, +0.200244379975141520, 0.200293367023891560, 0.200342353571907720, 0.200391339619067990, 0.200440325165250370, 0.200489310210331480, 0.200538294754189330, 0.200587278796701430, +0.200636262337745790, 0.200685245377199060, 0.200734227914939200, 0.200783209950843780, 0.200832191484790760, 0.200881172516656830, 0.200930153046319980, 0.200979133073657720, +0.201028112598548080, 0.201077091620867730, 0.201126070140494630, 0.201175048157306390, 0.201224025671180940, 0.201273002681994990, 0.201321979189626550, 0.201370955193953590, +0.201419930694852780, 0.201468905692202190, 0.201517880185879290, 0.201566854175762170, 0.201615827661727450, 0.201664800643653160, 0.201713773121416890, 0.201762745094896580, +0.201811716563969010, 0.201860687528512130, 0.201909657988403550, 0.201958627943521260, 0.202007597393741970, 0.202056566338943640, 0.202105534779003950, 0.202154502713800840, +0.202203470143211020, 0.202252437067112540, 0.202301403485382970, 0.202350369397900330, 0.202399334804541310, 0.202448299705183970, 0.202497264099706310, 0.202546227987985050, +0.202595191369898230, 0.202644154245323420, 0.202693116614138690, 0.202742078476220690, 0.202791039831447530, 0.202840000679696760, 0.202888961020846410, 0.202937920854773250, +0.202986880181355270, 0.203035839000470090, 0.203084797311995750, 0.203133755115808970, 0.203182712411787810, 0.203231669199809870, 0.203280625479753200, 0.203329581251494530, +0.203378536514911890, 0.203427491269883350, 0.203476445516285660, 0.203525399253996850, 0.203574352482894540, 0.203623305202856790, 0.203672257413760330, 0.203721209115483220, +0.203770160307903100, 0.203819110990898030, 0.203868061164344720, 0.203917010828121280, 0.203965959982105290, 0.204014908626174860, 0.204063856760206720, 0.204112804384078920, +0.204161751497669130, 0.204210698100855380, 0.204259644193514440, 0.204308589775524410, 0.204357534846763330, 0.204406479407107990, 0.204455423456436440, 0.204504366994626350, +0.204553310021555750, 0.204602252537101460, 0.204651194541141530, 0.204700136033553610, 0.204749077014215800, 0.204798017483004860, 0.204846957439798860, 0.204895896884475490, +0.204944835816912780, 0.204993774236987590, 0.205042712144577920, 0.205091649539561490, 0.205140586421816370, 0.205189522791219350, 0.205238458647648530, 0.205287393990982000, +0.205336328821096540, 0.205385263137870260, 0.205434196941180810, 0.205483130230906310, 0.205532063006923560, 0.205580995269110640, 0.205629927017345250, 0.205678858251505480, +0.205727788971468100, 0.205776719177111270, 0.205825648868312620, 0.205874578044950300, 0.205923506706901100, 0.205972434854043150, 0.206021362486254080, 0.206070289603412060, +0.206119216205393860, 0.206168142292077640, 0.206217067863341070, 0.206265992919062250, 0.206314917459118010, 0.206363841483386490, 0.206412764991745800, 0.206461687984072740, +0.206510610460245490, 0.206559532420141690, 0.206608453863639520, 0.206657374790615770, 0.206706295200948580, 0.206755215094515640, 0.206804134471195110, 0.206853053330863820, +0.206901971673399880, 0.206950889498681010, 0.206999806806585360, 0.207048723596989750, 0.207097639869772340, 0.207146555624810820, 0.207195470861983370, 0.207244385581166780, +0.207293299782239230, 0.207342213465078890, 0.207391126629562550, 0.207440039275568420, 0.207488951402974160, 0.207537863011658000, 0.207586774101496700, 0.207635684672368510, +0.207684594724151070, 0.207733504256722600, 0.207782413269959910, 0.207831321763741220, 0.207880229737944210, 0.207929137192447070, 0.207978044127126640, 0.208026950541861100, +0.208075856436528210, 0.208124761811006090, 0.208173666665171620, 0.208222570998903010, 0.208271474812078390, 0.208320378104574650, 0.208369280876269960, 0.208418183127042080, +0.208467084856769180, 0.208515986065328120, 0.208564886752597100, 0.208613786918453860, 0.208662686562776590, 0.208711585685442180, 0.208760484286328790, 0.208809382365314180, +0.208858279922276570, 0.208907176957092820, 0.208956073469641120, 0.209004969459799270, 0.209053864927445400, 0.209102759872456440, 0.209151654294710580, 0.209200548194085570, +0.209249441570459630, 0.209298334423709650, 0.209347226753713870, 0.209396118560350420, 0.209445009843496260, 0.209493900603029550, 0.209542790838828100, 0.209591680550770130, +0.209640569738732490, 0.209689458402593450, 0.209738346542230750, 0.209787234157522620, 0.209836121248345970, 0.209885007814579030, 0.209933893856099560, 0.209982779372785780, +0.210031664364514650, 0.210080548831164340, 0.210129432772612650, 0.210178316188737810, 0.210227199079416750, 0.210276081444527700, 0.210324963283948900, 0.210373844597557230, +0.210422725385230940, 0.210471605646847860, 0.210520485382286180, 0.210569364591422860, 0.210618243274136140, 0.210667121430303810, 0.210715999059804090, 0.210764876162513960, +0.210813752738311630, 0.210862628787074930, 0.210911504308682080, 0.210960379303010040, 0.211009253769937040, 0.211058127709340900, 0.211107001121099900, 0.211155874005090950, +0.211204746361192320, 0.211253618189282260, 0.211302489489237720, 0.211351360260936950, 0.211400230504257800, 0.211449100219078480, 0.211497969405275990, 0.211546838062728560, +0.211595706191314040, 0.211644573790910700, 0.211693440861395490, 0.211742307402646680, 0.211791173414542090, 0.211840038896960010, 0.211888903849777400, 0.211937768272872530, +0.211986632166123230, 0.212035495529407810, 0.212084358362603200, 0.212133220665587680, 0.212182082438239550, 0.212230943680435800, 0.212279804392054660, 0.212328664572974030, +0.212377524223072180, 0.212426383342226080, 0.212475241930314000, 0.212524099987213830, 0.212572957512803830, 0.212621814506961020, 0.212670670969563690, 0.212719526900489650, +0.212768382299617250, 0.212817237166823440, 0.212866091501986540, 0.212914945304984420, 0.212963798575695390, 0.213012651313996410, 0.213061503519765800, 0.213110355192881430, +0.213159206333221610, 0.213208056940663330, 0.213256907015084930, 0.213305756556364660, 0.213354605564379600, 0.213403454039008010, 0.213452301980127800, 0.213501149387617250, +0.213549996261353400, 0.213598842601214560, 0.213647688407078620, 0.213696533678823880, 0.213745378416327380, 0.213794222619467430, 0.213843066288121940, 0.213891909422169210, +0.213940752021486270, 0.213989594085951450, 0.214038435615442640, 0.214087276609838170, 0.214136117069015090, 0.214184956992851700, 0.214233796381226360, 0.214282635234016080, +0.214331473551099240, 0.214380311332353720, 0.214429148577657820, 0.214477985286888630, 0.214526821459924490, 0.214575657096643310, 0.214624492196923390, 0.214673326760641820, +0.214722160787676920, 0.214770994277906630, 0.214819827231209290, 0.214868659647461930, 0.214917491526542940, 0.214966322868330230, 0.215015153672702130, 0.215063983939535710, +0.215112813668709320, 0.215161642860101370, 0.215210471513588820, 0.215259299629050130, 0.215308127206363190, 0.215356954245406380, 0.215405780746056740, 0.215454606708192640, +0.215503432131692010, 0.215552257016433240, 0.215601081362293420, 0.215649905169150860, 0.215698728436883560, 0.215747551165369870, 0.215796373354486870, 0.215845195004112920, +0.215894016114126010, 0.215942836684404480, 0.215991656714825430, 0.216040476205267230, 0.216089295155607850, 0.216138113565725650, 0.216186931435497750, 0.216235748764802500, +0.216284565553518330, 0.216333381801522310, 0.216382197508692810, 0.216431012674907860, 0.216479827300045780, 0.216528641383983700, 0.216577454926600050, 0.216626267927772730, +0.216675080387380180, 0.216723892305299480, 0.216772703681409080, 0.216821514515586900, 0.216870324807711370, 0.216919134557659630, 0.216967943765310010, 0.217016752430540550, +0.217065560553229620, 0.217114368133254380, 0.217163175170493220, 0.217211981664824550, 0.217260787616125490, 0.217309593024274470, 0.217358397889149430, 0.217407202210628870, +0.217456005988589860, 0.217504809222910820, 0.217553611913469780, 0.217602414060145130, 0.217651215662814030, 0.217700016721354860, 0.217748817235645680, 0.217797617205564870, +0.217846416630989580, 0.217895215511798270, 0.217944013847868910, 0.217992811639079940, 0.218041608885308520, 0.218090405586433080, 0.218139201742332060, 0.218187997352882580, +0.218236792417963120, 0.218285586937451700, 0.218334380911226730, 0.218383174339165380, 0.218431967221146080, 0.218480759557046850, 0.218529551346746180, 0.218578342590121180, +0.218627133287050360, 0.218675923437411680, 0.218724713041083620, 0.218773502097943360, 0.218822290607869310, 0.218871078570739560, 0.218919865986432570, 0.218968652854825450, +0.219017439175796720, 0.219066224949224790, 0.219115010174986890, 0.219163794852961470, 0.219212578983026540, 0.219261362565060620, 0.219310145598940850, 0.219358928084545710, +0.219407710021753270, 0.219456491410441960, 0.219505272250489020, 0.219554052541772880, 0.219602832284171600, 0.219651611477563680, 0.219700390121826320, 0.219749168216837960, +0.219797945762476690, 0.219846722758620970, 0.219895499205148030, 0.219944275101936340, 0.219993050448863970, 0.220041825245809400, 0.220090599492649810, 0.220139373189263740, +0.220188146335529690, 0.220236918931324830, 0.220285690976527640, 0.220334462471016260, 0.220383233414669140, 0.220432003807363520, 0.220480773648977890, 0.220529542939390310, +0.220578311678479300, 0.220627079866122090, 0.220675847502197180, 0.220724614586582660, 0.220773381119157040, 0.220822147099797500, 0.220870912528382620, 0.220919677404790460, +0.220968441728899540, 0.221017205500587070, 0.221065968719731580, 0.221114731386211630, 0.221163493499904410, 0.221212255060688450, 0.221261016068441840, 0.221309776523043120, +0.221358536424369560, 0.221407295772299640, 0.221456054566711470, 0.221504812807483600, 0.221553570494493280, 0.221602327627619030, 0.221651084206738960, 0.221699840231731620, +0.221748595702474210, 0.221797350618845340, 0.221846104980723100, 0.221894858787986010, 0.221943612040511360, 0.221992364738177680, 0.222041116880863500, 0.222089868468446110, +0.222138619500804050, 0.222187369977815440, 0.222236119899358820, 0.222284869265311490, 0.222333618075551990, 0.222382366329958420, 0.222431114028409400, 0.222479861170782140, +0.222528607756955240, 0.222577353786806790, 0.222626099260215430, 0.222674844177058350, 0.222723588537214190, 0.222772332340561040, 0.222821075586977500, 0.222869818276340840, +0.222918560408529640, 0.222967301983422040, 0.223016043000896610, 0.223064783460830640, 0.223113523363102690, 0.223162262707591400, 0.223211001494174000, 0.223259739722729110, +0.223308477393134860, 0.223357214505269850, 0.223405951059011370, 0.223454687054238020, 0.223503422490827970, 0.223552157368659770, 0.223600891687610740, 0.223649625447559510, +0.223698358648384190, 0.223747091289963400, 0.223795823372174460, 0.223844554894895960, 0.223893285858006080, 0.223942016261383440, 0.223990746104905300, 0.224039475388450290, +0.224088204111897030, 0.224136932275122820, 0.224185659878006290, 0.224234386920425600, 0.224283113402259400, 0.224331839323384960, 0.224380564683680920, 0.224429289483025480, +0.224478013721297250, 0.224526737398373560, 0.224575460514133020, 0.224624183068453830, 0.224672905061214600, 0.224721626492292690, 0.224770347361566700, 0.224819067668914850, +0.224867787414215760, 0.224916506597346770, 0.224965225218186540, 0.225013943276613640, 0.225062660772505470, 0.225111377705740660, 0.225160094076197390, 0.225208809883754300, +0.225257525128288780, 0.225306239809679430, 0.225354953927804500, 0.225403667482542590, 0.225452380473771110, 0.225501092901368660, 0.225549804765213470, 0.225598516065184220, +0.225647226801158260, 0.225695936973014210, 0.225744646580630310, 0.225793355623885250, 0.225842064102656340, 0.225890772016822280, 0.225939479366261300, 0.225988186150852060, +0.226036892370471890, 0.226085598024999530, 0.226134303114313600, 0.226183007638291470, 0.226231711596811800, 0.226280414989752880, 0.226329117816993330, 0.226377820078410590, +0.226426521773883280, 0.226475222903289640, 0.226523923466508400, 0.226572623463416940, 0.226621322893893890, 0.226670021757817560, 0.226718720055066570, 0.226767417785518370, +0.226816114949051630, 0.226864811545544610, 0.226913507574875970, 0.226962203036923130, 0.227010897931564810, 0.227059592258679670, 0.227108286018145090, 0.227156979209839820, +0.227205671833642100, 0.227254363889430630, 0.227303055377082790, 0.227351746296477340, 0.227400436647492520, 0.227449126430007060, 0.227497815643898320, 0.227546504289045050, +0.227595192365325520, 0.227643879872618470, 0.227692566810801240, 0.227741253179752630, 0.227789938979350880, 0.227838624209474700, 0.227887308870001550, 0.227935992960810100, +0.227984676481779110, 0.228033359432786020, 0.228082041813709500, 0.228130723624427880, 0.228179404864819910, 0.228228085534762980, 0.228276765634135820, 0.228325445162816780, +0.228374124120684530, 0.228422802507616540, 0.228471480323491540, 0.228520157568187860, 0.228568834241584200, 0.228617510343558040, 0.228666185873988100, 0.228714860832752690, +0.228763535219730560, 0.228812209034799150, 0.228860882277837240, 0.228909554948723530, 0.228958227047335510, 0.229006898573551940, 0.229055569527251120, 0.229104239908311800, +0.229152909716611420, 0.229201578952028810, 0.229250247614442240, 0.229298915703730480, 0.229347583219771000, 0.229396250162442560, 0.229444916531623490, 0.229493582327192550, +0.229542247549027250, 0.229590912197006340, 0.229639576271008120, 0.229688239770911410, 0.229736902696593640, 0.229785565047933630, 0.229834226824809720, 0.229882888027100660, +0.229931548654683960, 0.229980208707438380, 0.230028868185242710, 0.230077527087974440, 0.230126185415512360, 0.230174843167734790, 0.230223500344520580, 0.230272156945747150, +0.230320812971293360, 0.230369468421037530, 0.230418123294858450, 0.230466777592633650, 0.230515431314241880, 0.230564084459561560, 0.230612737028471430, 0.230661389020849040, +0.230710040436573170, 0.230758691275522200, 0.230807341537574960, 0.230855991222608910, 0.230904640330502900, 0.230953288861135700, 0.231001936814384860, 0.231050584190129170, +0.231099230988247030, 0.231147877208617240, 0.231196522851117300, 0.231245167915626080, 0.231293812402021960, 0.231342456310183710, 0.231391099639988880, 0.231439742391316320, +0.231488384564044410, 0.231537026158051940, 0.231585667173216490, 0.231634307609416890, 0.231682947466531510, 0.231731586744439190, 0.231780225443017460, 0.231828863562145190, +0.231877501101701190, 0.231926138061562980, 0.231974774441609440, 0.232023410241718960, 0.232072045461770400, 0.232120680101641270, 0.232169314161210480, 0.232217947640356360, +0.232266580538957820, 0.232315212856892410, 0.232363844594038970, 0.232412475750275900, 0.232461106325482090, 0.232509736319535060, 0.232558365732313700, 0.232606994563696430, +0.232655622813562110, 0.232704250481788280, 0.232752877568253860, 0.232801504072837200, 0.232850129995417240, 0.232898755335871540, 0.232947380094078920, 0.232996004269918290, +0.233044627863267210, 0.233093250874004590, 0.233141873302008810, 0.233190495147158810, 0.233239116409332120, 0.233287737088407640, 0.233336357184263820, 0.233384976696779540, +0.233433595625832380, 0.233482213971301230, 0.233530831733064550, 0.233579448911001240, 0.233628065504988850, 0.233676681514906310, 0.233725296940632040, 0.233773911782044990, +0.233822526039022730, 0.233871139711444130, 0.233919752799188140, 0.233968365302132330, 0.234016977220155600, 0.234065588553136420, 0.234114199300953730, 0.234162809463485080, +0.234211419040609410, 0.234260028032205190, 0.234308636438151360, 0.234357244258325490, 0.234405851492606510, 0.234454458140872870, 0.234503064203003570, 0.234551669678876140, +0.234600274568369540, 0.234648878871362270, 0.234697482587733240, 0.234746085717360050, 0.234794688260121650, 0.234843290215896980, 0.234891891584563640, 0.234940492366000560, +0.234989092560086270, 0.235037692166699670, 0.235086291185718390, 0.235134889617021420, 0.235183487460487200, 0.235232084715994690, 0.235280681383421560, 0.235329277462646700, +0.235377872953548670, 0.235426467856006380, 0.235475062169897470, 0.235523655895100940, 0.235572249031495230, 0.235620841578959350, 0.235669433537370940, 0.235718024906608950, +0.235766615686552330, 0.235815205877078720, 0.235863795478067100, 0.235912384489396000, 0.235960972910944370, 0.236009560742589890, 0.236058147984211490, 0.236106734635687710, +0.236155320696897540, 0.236203906167718640, 0.236252491048029980, 0.236301075337710080, 0.236349659036637900, 0.236398242144691180, 0.236446824661748850, 0.236495406587689440, +0.236543987922391950, 0.236592568665734080, 0.236641148817594770, 0.236689728377852600, 0.236738307346386510, 0.236786885723074240, 0.236835463507794770, 0.236884040700427070, +0.236932617300848800, 0.236981193308939020, 0.237029768724576260, 0.237078343547639490, 0.237126917778006460, 0.237175491415556110, 0.237224064460167030, 0.237272636911718240, +0.237321208770087390, 0.237369780035153550, 0.237418350706795260, 0.237466920784891510, 0.237515490269320030, 0.237564059159959850, 0.237612627456689480, 0.237661195159387990, +0.237709762267933080, 0.237758328782203790, 0.237806894702079080, 0.237855460027436710, 0.237904024758155700, 0.237952588894114610, 0.238001152435192490, 0.238049715381267040, +0.238098277732217340, 0.238146839487921920, 0.238195400648259840, 0.238243961213108810, 0.238292521182347890, 0.238341080555855680, 0.238389639333511180, 0.238438197515192160, +0.238486755100777630, 0.238535312090146220, 0.238583868483176980, 0.238632424279747620, 0.238680979479737210, 0.238729534083024770, 0.238778088089488080, 0.238826641499006150, +0.238875194311457650, 0.238923746526721550, 0.238972298144675690, 0.239020849165199060, 0.239069399588170330, 0.239117949413468510, 0.239166498640971390, 0.239215047270558030, +0.239263595302107060, 0.239312142735497530, 0.239360689570607190, 0.239409235807315160, 0.239457781445500010, 0.239506326485040860, 0.239554870925815460, 0.239603414767702860, +0.239651958010581730, 0.239700500654331160, 0.239749042698828880, 0.239797584143954020, 0.239846124989585600, 0.239894665235601460, 0.239943204881880650, 0.239991743928301830, +0.240040282374744090, 0.240088820221085190, 0.240137357467204240, 0.240185894112979910, 0.240234430158291300, 0.240282965603016150, 0.240331500447033580, 0.240380034690222290, +0.240428568332461320, 0.240477101373628520, 0.240525633813602950, 0.240574165652263310, 0.240622696889488650, 0.240671227525156850, 0.240719757559146990, 0.240768286991338150, +0.240816815821608160, 0.240865344049836120, 0.240913871675900730, 0.240962398699681110, 0.241010925121055040, 0.241059450939901660, 0.241107976156099660, 0.241156500769528160, +0.241205024780064950, 0.241253548187589210, 0.241302070991979560, 0.241350593193115190, 0.241399114790873920, 0.241447635785134840, 0.241496156175776660, 0.241544675962678560, +0.241593195145718310, 0.241641713724775080, 0.241690231699728000, 0.241738749070454890, 0.241787265836834940, 0.241835781998746810, 0.241884297556069630, 0.241932812508681320, +0.241981326856460950, 0.242029840599287280, 0.242078353737039430, 0.242126866269595260, 0.242175378196833930, 0.242223889518634160, 0.242272400234875090, 0.242320910345434600, +0.242369419850191840, 0.242417928749025490, 0.242466437041814780, 0.242514944728437540, 0.242563451808772950, 0.242611958282700160, 0.242660464150097010, 0.242708969410842750, +0.242757474064816040, 0.242805978111896080, 0.242854481551960740, 0.242902984384889190, 0.242951486610560180, 0.242999988228852880, 0.243048489239645200, 0.243096989642816290, +0.243145489438244910, 0.243193988625810240, 0.243242487205390160, 0.243290985176863840, 0.243339482540110090, 0.243387979295008050, 0.243436475441435620, 0.243484970979272020, +0.243533465908396000, 0.243581960228686720, 0.243630453940022110, 0.243678947042281380, 0.243727439535343730, 0.243775931419087020, 0.243824422693390500, 0.243872913358132910, +0.243921403413193490, 0.243969892858450110, 0.244018381693781980, 0.244066869919067920, 0.244115357534187120, 0.244163844539017490, 0.244212330933438250, 0.244260816717328190, +0.244309301890566520, 0.244357786453031130, 0.244406270404601310, 0.244454753745155800, 0.244503236474573840, 0.244551718592733360, 0.244600200099513580, 0.244648680994793750, +0.244697161278451760, 0.244745640950366880, 0.244794120010417890, 0.244842598458484020, 0.244891076294443260, 0.244939553518174790, 0.244988030129557420, 0.245036506128470420, +0.245084981514791720, 0.245133456288400580, 0.245181930449175800, 0.245230403996996610, 0.245278876931740970, 0.245327349253288170, 0.245375820961516970, 0.245424292056306640, +0.245472762537535170, 0.245521232405081810, 0.245569701658825770, 0.245618170298645050, 0.245666638324418900, 0.245715105736026170, 0.245763572533346100, 0.245812038716256680, +0.245860504284637150, 0.245908969238366360, 0.245957433577323580, 0.246005897301386780, 0.246054360410435240, 0.246102822904347790, 0.246151284783003740, 0.246199746046281030, +0.246248206694058950, 0.246296666726216360, 0.246345126142632540, 0.246393584943185470, 0.246442043127754420, 0.246490500696218280, 0.246538957648456320, 0.246587413984346530, +0.246635869703768220, 0.246684324806600630, 0.246732779292721830, 0.246781233162011090, 0.246829686414347240, 0.246878139049609620, 0.246926591067676200, 0.246975042468426330, +0.247023493251738830, 0.247071943417493060, 0.247120392965566980, 0.247168841895839900, 0.247217290208190750, 0.247265737902498780, 0.247314184978642050, 0.247362631436499860, +0.247411077275951070, 0.247459522496875060, 0.247507967099149770, 0.247556411082654580, 0.247604854447268790, 0.247653297192870440, 0.247701739319338840, 0.247750180826552900, +0.247798621714391900, 0.247847061982733960, 0.247895501631458350, 0.247943940660444010, 0.247992379069570220, 0.248040816858715040, 0.248089254027757860, 0.248137690576577500, +0.248186126505053370, 0.248234561813063500, 0.248282996500487210, 0.248331430567203440, 0.248379864013091510, 0.248428296838029500, 0.248476729041896740, 0.248525160624572610, +0.248573591585935120, 0.248622021925863660, 0.248670451644237150, 0.248718880740934960, 0.248767309215835090, 0.248815737068816990, 0.248864164299759520, 0.248912590908542090, +0.248961016895042740, 0.249009442259140850, 0.249057867000715360, 0.249106291119645630, 0.249154714615809740, 0.249203137489087070, 0.249251559739356560, 0.249299981366497560, +0.249348402370388190, 0.249396822750907830, 0.249445242507935820, 0.249493661641350280, 0.249542080151030580, 0.249590498036855680, 0.249638915298704990, 0.249687331936456560, +0.249735747949989790, 0.249784163339183680, 0.249832578103917570, 0.249880992244069590, 0.249929405759519140, 0.249977818650145150, 0.250026230915827040, 0.250074642556442960, +0.250123053571872260, 0.250171463961993910, 0.250219873726687360, 0.250268282865830690, 0.250316691379303290, 0.250365099266984190, 0.250413506528752720, 0.250461913164487130, +0.250510319174066690, 0.250558724557370880, 0.250607129314277870, 0.250655533444667070, 0.250703936948417360, 0.250752339825408290, 0.250800742075517890, 0.250849143698625650, +0.250897544694610560, 0.250945945063352050, 0.250994344804728260, 0.251042743918618580, 0.251091142404902050, 0.251139540263458080, 0.251187937494164850, 0.251236334096901770, +0.251284730071547830, 0.251333125417982530, 0.251381520136084000, 0.251429914225731630, 0.251478307686804900, 0.251526700519182020, 0.251575092722742370, 0.251623484297364970, +0.251671875242929280, 0.251720265559313480, 0.251768655246397020, 0.251817044304058930, 0.251865432732178710, 0.251913820530634380, 0.251962207699305550, 0.252010594238071210, +0.252058980146810770, 0.252107365425402520, 0.252155750073725820, 0.252204134091659700, 0.252252517479083730, 0.252300900235876040, 0.252349282361916060, 0.252397663857083340, +0.252446044721256040, 0.252494424954313570, 0.252542804556135090, 0.252591183526599980, 0.252639561865586500, 0.252687939572974140, 0.252736316648641930, 0.252784693092469370, +0.252833068904334600, 0.252881444084117170, 0.252929818631696170, 0.252978192546951030, 0.253026565829759960, 0.253074938480002510, 0.253123310497557650, 0.253171681882304990, +0.253220052634122730, 0.253268422752890300, 0.253316792238486800, 0.253365161090791770, 0.253413529309683420, 0.253461896895041230, 0.253510263846744690, 0.253558630164672120, +0.253606995848702940, 0.253655360898716260, 0.253703725314591680, 0.253752089096207280, 0.253800452243442720, 0.253848814756176990, 0.253897176634289620, 0.253945537877658940, +0.253993898486164380, 0.254042258459685090, 0.254090617798100600, 0.254138976501289080, 0.254187334569130170, 0.254235692001502920, 0.254284048798286870, 0.254332404959360210, +0.254380760484602620, 0.254429115373893510, 0.254477469627111210, 0.254525823244135200, 0.254574176224844630, 0.254622528569119100, 0.254670880276836760, 0.254719231347877270, +0.254767581782119670, 0.254815931579443600, 0.254864280739727220, 0.254912629262850130, 0.254960977148691480, 0.255009324397130810, 0.255057671008046440, 0.255106016981317850, +0.255154362316824260, 0.255202707014445140, 0.255251051074058820, 0.255299394495544950, 0.255347737278782960, 0.255396079423651220, 0.255444420930029280, 0.255492761797796230, +0.255541102026831780, 0.255589441617014130, 0.255637780568222840, 0.255686118880337150, 0.255734456553236570, 0.255782793586799400, 0.255831129980905290, 0.255879465735433300, +0.255927800850263120, 0.255976135325272970, 0.256024469160342550, 0.256072802355350900, 0.256121134910177680, 0.256169466824701210, 0.256217798098801020, 0.256266128732356820, +0.256314458725246890, 0.256362788077350750, 0.256411116788547670, 0.256459444858717240, 0.256507772287737750, 0.256556099075488820, 0.256604425221849670, 0.256652750726699850, +0.256701075589917780, 0.256749399811382950, 0.256797723390974670, 0.256846046328572500, 0.256894368624054790, 0.256942690277301160, 0.256991011288190800, 0.257039331656603360, +0.257087651382417130, 0.257135970465511790, 0.257184288905766500, 0.257232606703060920, 0.257280923857273410, 0.257329240368283580, 0.257377556235971080, 0.257425871460214280, +0.257474186040892780, 0.257522499977885840, 0.257570813271073060, 0.257619125920332810, 0.257667437925544750, 0.257715749286588140, 0.257764060003342510, 0.257812370075686360, +0.257860679503499280, 0.257908988286660480, 0.257957296425049610, 0.258005603918545100, 0.258053910767026610, 0.258102216970373330, 0.258150522528464930, 0.258198827441179780, +0.258247131708397530, 0.258295435329997940, 0.258343738305859330, 0.258392040635861350, 0.258440342319883280, 0.258488643357804750, 0.258536943749504200, 0.258585243494861340, +0.258633542593755320, 0.258681841046065900, 0.258730138851671400, 0.258778436010451580, 0.258826732522285720, 0.258875028387053400, 0.258923323604633100, 0.258971618174904490, +0.259019912097746830, 0.259068205373039820, 0.259116498000661890, 0.259164789980492690, 0.259213081312411940, 0.259261371996298060, 0.259309662032030760, 0.259357951419489310, +0.259406240158553400, 0.259454528249101420, 0.259502815691013190, 0.259551102484167910, 0.259599388628445280, 0.259647674123723750, 0.259695958969883010, 0.259744243166802390, +0.259792526714361650, 0.259840809612439110, 0.259889091860914520, 0.259937373459667280, 0.259985654408576960, 0.260033934707522120, 0.260082214356382400, 0.260130493355037180, +0.260178771703366170, 0.260227049401247750, 0.260275326448561770, 0.260323602845187850, 0.260371878591004520, 0.260420153685891500, 0.260468428129728090, 0.260516701922394010, +0.260564975063767800, 0.260613247553729110, 0.260661519392157310, 0.260709790578932120, 0.260758061113932070, 0.260806330997036820, 0.260854600228125790, 0.260902868807078640, +0.260951136733773960, 0.260999404008091350, 0.261047670629910300, 0.261095936599110460, 0.261144201915570360, 0.261192466579169780, 0.261240730589788420, 0.261288993947304870, +0.261337256651598790, 0.261385518702549560, 0.261433780100036980, 0.261482040843939500, 0.261530300934136930, 0.261578560370508640, 0.261626819152934340, 0.261675077281292580, +0.261723334755463110, 0.261771591575325310, 0.261819847740758950, 0.261868103251642560, 0.261916358107855910, 0.261964612309278370, 0.262012865855789700, 0.262061118747268450, +0.262109370983594440, 0.262157622564647420, 0.262205873490305890, 0.262254123760449650, 0.262302373374958150, 0.262350622333711150, 0.262398870636587120, 0.262447118283465950, +0.262495365274226950, 0.262543611608750000, 0.262591857286913590, 0.262640102308597520, 0.262688346673681180, 0.262736590382044440, 0.262784833433565790, 0.262833075828125040, +0.262881317565601620, 0.262929558645875310, 0.262977799068824680, 0.263026038834329570, 0.263074277942269790, 0.263122516392523880, 0.263170754184971660, 0.263218991319492560, +0.263267227795966450, 0.263315463614271830, 0.263363698774288500, 0.263411933275895960, 0.263460167118974020, 0.263508400303401220, 0.263556632829057450, 0.263604864695822060, +0.263653095903574940, 0.263701326452194680, 0.263749556341561050, 0.263797785571553590, 0.263846014142052050, 0.263894242052935100, 0.263942469304082490, 0.263990695895373770, +0.264038921826688700, 0.264087147097905870, 0.264135371708905220, 0.264183595659566510, 0.264231818949768440, 0.264280041579390780, 0.264328263548313070, 0.264376484856415070, +0.264424705503575500, 0.264472925489674100, 0.264521144814590440, 0.264569363478204310, 0.264617581480394330, 0.264665798821040410, 0.264714015500021990, 0.264762231517219000, +0.264810446872509990, 0.264858661565774810, 0.264906875596893020, 0.264955088965744490, 0.265003301672207760, 0.265051513716162810, 0.265099725097489470, 0.265147935816066440, +0.265196145871773540, 0.265244355264490250, 0.265292563994096510, 0.265340772060470960, 0.265388979463493490, 0.265437186203043520, 0.265485392279001030, 0.265533597691244680, +0.265581802439654290, 0.265630006524109400, 0.265678209944489930, 0.265726412700674490, 0.265774614792543050, 0.265822816219975060, 0.265871016982850430, 0.265919217081047880, +0.265967416514447220, 0.266015615282928500, 0.266063813386370310, 0.266112010824652580, 0.266160207597654800, 0.266208403705256950, 0.266256599147337680, 0.266304793923776870, +0.266352988034454120, 0.266401181479249290, 0.266449374258041110, 0.266497566370709480, 0.266545757817133910, 0.266593948597194430, 0.266642138710769640, 0.266690328157739460, +0.266738516937983510, 0.266786705051381630, 0.266834892497812610, 0.266883079277156320, 0.266931265389292400, 0.266979450834100680, 0.267027635611459920, 0.267075819721250110, +0.267124003163351110, 0.267172185937641750, 0.267220368044001840, 0.267268549482311100, 0.267316730252449340, 0.267364910354295380, 0.267413089787729100, 0.267461268552630140, +0.267509446648878440, 0.267557624076352640, 0.267605800834932790, 0.267653976924498490, 0.267702152344929610, 0.267750327096104970, 0.267798501177904490, 0.267846674590207780, +0.267894847332894810, 0.267943019405844250, 0.267991190808936190, 0.268039361542050550, 0.268087531605066100, 0.268135700997862820, 0.268183869720320270, 0.268232037772318470, +0.268280205153736180, 0.268328371864453350, 0.268376537904349620, 0.268424703273304920, 0.268472867971198070, 0.268521031997909050, 0.268569195353317470, 0.268617358037303300, +0.268665520049745310, 0.268713681390523540, 0.268761842059517530, 0.268810002056607380, 0.268858161381671790, 0.268906320034590750, 0.268954478015244410, 0.269002635323511430, +0.269050791959271840, 0.269098947922405240, 0.269147103212791730, 0.269195257830310060, 0.269243411774840240, 0.269291565046261840, 0.269339717644455020, 0.269387869569298440, +0.269436020820672200, 0.269484171398455870, 0.269532321302529580, 0.269580470532772070, 0.269628619089063330, 0.269676766971283120, 0.269724914179311330, 0.269773060713026870, +0.269821206572309790, 0.269869351757040080, 0.269917496267096600, 0.269965640102359350, 0.270013783262707970, 0.270061925748022620, 0.270110067558182010, 0.270158208693066230, +0.270206349152554930, 0.270254488936528150, 0.270302628044864770, 0.270350766477444770, 0.270398904234147920, 0.270447041314854200, 0.270495177719442430, 0.270543313447792750, +0.270591448499784780, 0.270639582875298600, 0.270687716574213030, 0.270735849596408170, 0.270783981941763730, 0.270832113610159690, 0.270880244601474970, 0.270928374915589690, +0.270976504552383870, 0.271024633511736330, 0.271072761793527240, 0.271120889397636230, 0.271169016323943410, 0.271217142572327650, 0.271265268142668990, 0.271313393034847190, +0.271361517248742360, 0.271409640784233300, 0.271457763641200110, 0.271505885819522510, 0.271554007319080640, 0.271602128139753320, 0.271650248281420700, 0.271698367743962440, +0.271746486527258690, 0.271794604631188260, 0.271842722055631370, 0.271890838800468100, 0.271938954865577290, 0.271987070250839070, 0.272035184956133210, 0.272083298981339820, +0.272131412326337750, 0.272179524991007120, 0.272227636975227730, 0.272275748278879630, 0.272323858901841740, 0.272371968843994230, 0.272420078105216730, 0.272468186685389520, +0.272516294584391420, 0.272564401802102560, 0.272612508338402730, 0.272660614193172000, 0.272708719366289320, 0.272756823857634890, 0.272804927667088800, 0.272853030794529940, +0.272901133239838500, 0.272949235002894250, 0.272997336083577350, 0.273045436481766710, 0.273093536197342450, 0.273141635230184310, 0.273189733580172570, 0.273237831247186040, +0.273285928231104920, 0.273334024531808990, 0.273382120149178400, 0.273430215083092120, 0.273478309333430310, 0.273526402900072680, 0.273574495782899500, 0.273622587981789680, +0.273670679496623380, 0.273718770327280370, 0.273766860473640850, 0.273814949935583750, 0.273863038712989280, 0.273911126805737650, 0.273959214213707780, 0.274007300936779830, +0.274055386974833670, 0.274103472327749450, 0.274151556995406160, 0.274199640977683960, 0.274247724274462650, 0.274295806885622440, 0.274343888811042270, 0.274391970050602450, +0.274440050604182640, 0.274488130471663150, 0.274536209652922910, 0.274584288147842190, 0.274632365956300690, 0.274680443078178740, 0.274728519513355200, 0.274776595261710390, +0.274824670323124580, 0.274872744697476580, 0.274920818384646770, 0.274968891384514860, 0.275016963696961210, 0.275065035321864710, 0.275113106259105620, 0.275161176508563750, +0.275209246070119370, 0.275257314943651410, 0.275305383129040240, 0.275353450626165560, 0.275401517434907710, 0.275449583555145590, 0.275497648986759550, 0.275545713729629380, +0.275593777783635360, 0.275641841148656470, 0.275689903824572980, 0.275737965811265140, 0.275786027108612000, 0.275834087716493760, 0.275882147634790300, 0.275930206863381880, +0.275978265402147540, 0.276026323250967540, 0.276074380409721710, 0.276122436878290360, 0.276170492656552520, 0.276218547744388420, 0.276266602141677970, 0.276314655848301450, +0.276362708864137830, 0.276410761189067430, 0.276458812822970190, 0.276506863765726310, 0.276554914017214830, 0.276602963577316060, 0.276651012445910340, 0.276699060622876640, +0.276747108108095270, 0.276795154901446180, 0.276843201002809570, 0.276891246412064580, 0.276939291129091440, 0.276987335153770110, 0.277035378485980870, 0.277083421125602750, +0.277131463072516020, 0.277179504326600710, 0.277227544887737040, 0.277275584755804050, 0.277323623930682110, 0.277371662412251140, 0.277419700200391420, 0.277467737294982030, +0.277515773695903300, 0.277563809403035100, 0.277611844416257860, 0.277659878735450560, 0.277707912360493530, 0.277755945291267180, 0.277803977527650510, 0.277852009069523950, +0.277900039916767320, 0.277948070069261030, 0.277996099526884140, 0.278044128289517020, 0.278092156357039600, 0.278140183729332140, 0.278188210406273840, 0.278236236387745030, +0.278284261673625580, 0.278332286263795970, 0.278380310158135140, 0.278428333356523620, 0.278476355858841170, 0.278524377664968350, 0.278572398774784070, 0.278620419188168880, +0.278668438905003040, 0.278716457925165640, 0.278764476248537120, 0.278812493874997400, 0.278860510804426860, 0.278908527036704660, 0.278956542571711100, 0.279004557409326230, +0.279052571549430360, 0.279100584991902660, 0.279148597736623480, 0.279196609783472770, 0.279244621132331010, 0.279292631783077280, 0.279340641735591920, 0.279388650989755020, +0.279436659545446890, 0.279484667402546630, 0.279532674560934780, 0.279580681020491660, 0.279628686781096370, 0.279676691842629390, 0.279724696204970650, 0.279772699868000630, +0.279820702831598430, 0.279868705095644490, 0.279916706660018780, 0.279964707524601670, 0.280012707689272440, 0.280060707153911400, 0.280108705918398590, 0.280156703982614500, +0.280204701346438160, 0.280252698009750060, 0.280300693972430240, 0.280348689234359130, 0.280396683795415880, 0.280444677655480870, 0.280492670814434190, 0.280540663272156270, +0.280588655028526260, 0.280636646083424590, 0.280684636436731750, 0.280732626088326890, 0.280780615038090490, 0.280828603285902530, 0.280876590831643460, 0.280924577675192520, +0.280972563816430150, 0.281020549255236340, 0.281068533991491560, 0.281116518025075090, 0.281164501355867290, 0.281212483983748210, 0.281260465908598380, 0.281308447130296960, +0.281356427648724430, 0.281404407463760780, 0.281452386575286590, 0.281500364983180980, 0.281548342687324480, 0.281596319687597520, 0.281644295983879360, 0.281692271576050480, +0.281740246463990870, 0.281788220647581080, 0.281836194126700360, 0.281884166901229080, 0.281932138971047460, 0.281980110336035870, 0.282028080996073570, 0.282076050951041100, +0.282124020200818500, 0.282171988745286260, 0.282219956584323640, 0.282267923717811120, 0.282315890145628800, 0.282363855867657170, 0.282411820883775420, 0.282459785193864220, +0.282507748797803940, 0.282555711695473830, 0.282603673886754450, 0.282651635371525930, 0.282699596149668720, 0.282747556221062070, 0.282795515585586580, 0.282843474243122280, +0.282891432193549670, 0.282939389436748120, 0.282987345972598060, 0.283035301800979690, 0.283083256921773440, 0.283131211334858630, 0.283179165040115810, 0.283227118037425060, +0.283275070326666930, 0.283323021907720740, 0.283370972780466970, 0.283418922944785770, 0.283466872400557680, 0.283514821147661970, 0.283562769185979220, 0.283610716515389990, +0.283658663135773540, 0.283706609047010390, 0.283754554248980770, 0.283802498741565160, 0.283850442524642920, 0.283898385598094550, 0.283946327961800190, 0.283994269615640450, +0.284042210559494630, 0.284090150793243290, 0.284138090316766510, 0.284186029129945010, 0.284233967232657980, 0.284281904624786030, 0.284329841306209310, 0.284377777276808410, +0.284425712536462650, 0.284473647085052570, 0.284521580922458880, 0.284569514048560730, 0.284617446463238830, 0.284665378166373330, 0.284713309157844820, 0.284761239437532570, +0.284809169005317280, 0.284857097861078990, 0.284905026004698410, 0.284952953436054870, 0.285000880155028950, 0.285048806161500800, 0.285096731455351030, 0.285144656036459050, +0.285192579904705420, 0.285240503059970340, 0.285288425502134460, 0.285336347231077040, 0.285384268246678790, 0.285432188548820240, 0.285480108137380840, 0.285528027012241170, +0.285575945173281440, 0.285623862620382250, 0.285671779353422970, 0.285719695372284250, 0.285767610676846310, 0.285815525266989780, 0.285863439142593990, 0.285911352303539590, +0.285959264749706840, 0.286007176480976290, 0.286055087497227470, 0.286102997798340860, 0.286150907384196740, 0.286198816254675860, 0.286246724409657430, 0.286294631849022260, +0.286342538572650910, 0.286390444580422730, 0.286438349872218500, 0.286486254447918360, 0.286534158307403090, 0.286582061450551930, 0.286629963877245600, 0.286677865587364410, +0.286725766580788970, 0.286773666857398690, 0.286821566417074180, 0.286869465259695810, 0.286917363385144230, 0.286965260793298760, 0.287013157484040160, 0.287061053457248690, +0.287108948712805010, 0.287156843250588490, 0.287204737070479890, 0.287252630172359470, 0.287300522556107830, 0.287348414221604510, 0.287396305168730160, 0.287444195397365430, +0.287492084907389810, 0.287539973698684000, 0.287587861771128270, 0.287635749124603270, 0.287683635758988480, 0.287731521674164600, 0.287779406870011910, 0.287827291346411160, +0.287875175103241730, 0.287923058140384380, 0.287970940457719370, 0.288018822055127410, 0.288066702932487980, 0.288114583089681800, 0.288162462526589170, 0.288210341243090810, +0.288258219239066190, 0.288306096514395980, 0.288353973068960990, 0.288401848902640650, 0.288449724015315660, 0.288497598406866400, 0.288545472077173510, 0.288593345026116550, +0.288641217253576220, 0.288689088759432830, 0.288736959543567150, 0.288784829605858660, 0.288832698946188130, 0.288880567564435810, 0.288928435460482470, 0.288976302634207650, +0.289024169085492060, 0.289072034814216060, 0.289119899820260430, 0.289167764103504590, 0.289215627663829360, 0.289263490501115440, 0.289311352615242380, 0.289359214006090990, +0.289407074673541490, 0.289454934617474790, 0.289502793837770330, 0.289550652334308820, 0.289598510106970740, 0.289646367155636800, 0.289694223480186530, 0.289742079080500650, +0.289789933956459630, 0.289837788107944140, 0.289885641534833820, 0.289933494237009370, 0.289981346214351180, 0.290029197466740050, 0.290077047994055480, 0.290124897796178340, +0.290172746872988880, 0.290220595224368050, 0.290268442850195260, 0.290316289750351400, 0.290364135924717210, 0.290411981373172310, 0.290459826095597400, 0.290507670091872950, +0.290555513361879740, 0.290603355905497300, 0.290651197722606500, 0.290699038813087730, 0.290746879176821740, 0.290794718813688120, 0.290842557723567760, 0.290890395906340970, +0.290938233361888620, 0.290986070090090250, 0.291033906090826740, 0.291081741363978410, 0.291129575909426170, 0.291177409727049590, 0.291225242816729510, 0.291273075178346720, +0.291320906811780800, 0.291368737716912630, 0.291416567893622580, 0.291464397341791580, 0.291512226061299120, 0.291560054052026120, 0.291607881313853010, 0.291655707846660620, +0.291703533650328470, 0.291751358724737560, 0.291799183069768210, 0.291847006685301340, 0.291894829571216540, 0.291942651727394640, 0.291990473153716120, 0.292038293850061860, +0.292086113816311440, 0.292133933052345700, 0.292181751558045600, 0.292229569333290640, 0.292277386377961800, 0.292325202691939510, 0.292373018275104590, 0.292420833127336740, +0.292468647248516790, 0.292516460638525210, 0.292564273297242940, 0.292612085224549510, 0.292659896420325920, 0.292707706884452520, 0.292755516616810320, 0.292803325617278950, +0.292851133885739190, 0.292898941422071620, 0.292946748226157130, 0.292994554297875350, 0.293042359637107170, 0.293090164243733520, 0.293137968117634040, 0.293185771258689660, +0.293233573666780820, 0.293281375341788500, 0.293329176283592290, 0.293376976492073120, 0.293424775967111530, 0.293472574708588450, 0.293520372716383480, 0.293568169990377600, +0.293615966530451300, 0.293663762336485450, 0.293711557408359860, 0.293759351745955300, 0.293807145349152370, 0.293854938217832040, 0.293902730351873920, 0.293950521751158990, +0.293998312415567730, 0.294046102344981130, 0.294093891539278840, 0.294141679998341790, 0.294189467722051010, 0.294237254710286110, 0.294285040962928120, 0.294332826479857480, +0.294380611260955220, 0.294428395306100990, 0.294476178615175830, 0.294523961188060180, 0.294571743024635010, 0.294619524124780100, 0.294667304488376410, 0.294715084115304390, +0.294762863005445130, 0.294810641158678280, 0.294858418574884820, 0.294906195253945350, 0.294953971195740790, 0.295001746400150870, 0.295049520867056550, 0.295097294596338930, +0.295145067587877620, 0.295192839841553590, 0.295240611357247500, 0.295288382134840320, 0.295336152174211770, 0.295383921475242780, 0.295431690037814050, 0.295479457861806460, +0.295527224947099880, 0.295574991293575170, 0.295622756901113000, 0.295670521769594350, 0.295718285898899040, 0.295766049288907930, 0.295813811939501740, 0.295861573850561440, +0.295909335021966760, 0.295957095453598770, 0.296004855145338470, 0.296052614097065570, 0.296100372308661150, 0.296148129780005820, 0.296195886510980610, 0.296243642501465180, +0.296291397751340720, 0.296339152260487740, 0.296386906028787310, 0.296434659056119150, 0.296482411342364360, 0.296530162887403580, 0.296577913691117800, 0.296625663753386780, +0.296673413074091620, 0.296721161653112960, 0.296768909490331800, 0.296816656585627950, 0.296864402938882390, 0.296912148549975890, 0.296959893418789420, 0.297007637545202820, +0.297055380929097110, 0.297103123570353400, 0.297150865468851390, 0.297198606624472280, 0.297246347037096630, 0.297294086706605510, 0.297341825632878750, 0.297389563815797450, +0.297437301255242260, 0.297485037951094210, 0.297532773903233180, 0.297580509111540160, 0.297628243575895900, 0.297675977296181450, 0.297723710272276620, 0.297771442504062570, +0.297819173991419880, 0.297866904734229660, 0.297914634732371730, 0.297962363985727290, 0.298010092494177310, 0.298057820257601690, 0.298105547275881510, 0.298153273548897480, +0.298200999076530690, 0.298248723858660970, 0.298296447895169400, 0.298344171185936760, 0.298391893730844130, 0.298439615529771270, 0.298487336582599460, 0.298535056889209230, +0.298582776449481830, 0.298630495263297050, 0.298678213330536070, 0.298725930651079500, 0.298773647224808540, 0.298821363051603060, 0.298869078131344170, 0.298916792463913010, +0.298964506049189390, 0.299012218887054590, 0.299059930977389200, 0.299107642320074420, 0.299155352914990070, 0.299203062762017360, 0.299250771861036990, 0.299298480211930170, +0.299346187814576670, 0.299393894668857690, 0.299441600774653980, 0.299489306131846710, 0.299537010740315750, 0.299584714599942290, 0.299632417710607000, 0.299680120072191140, +0.299727821684574510, 0.299775522547638340, 0.299823222661263770, 0.299870922025330720, 0.299918620639720410, 0.299966318504313490, 0.300014015618991210, 0.300061711983633520, +0.300109407598121490, 0.300157102462335960, 0.300204796576158120, 0.300252489939467850, 0.300300182552146360, 0.300347874414074400, 0.300395565525133190, 0.300443255885202600, +0.300490945494163940, 0.300538634351897870, 0.300586322458285650, 0.300634009813207200, 0.300681696416543740, 0.300729382268176030, 0.300777067367985260, 0.300824751715851440, +0.300872435311655690, 0.300920118155279360, 0.300967800246602250, 0.301015481585505620, 0.301063162171870350, 0.301110842005577530, 0.301158521086507200, 0.301206199414540630, +0.301253876989558520, 0.301301553811442140, 0.301349229880071400, 0.301396905195327640, 0.301444579757091600, 0.301492253565244560, 0.301539926619666440, 0.301587598920238510, +0.301635270466841580, 0.301682941259356910, 0.301730611297664490, 0.301778280581645460, 0.301825949111181210, 0.301873616886151660, 0.301921283906438080, 0.301968950171921270, +0.302016615682482500, 0.302064280438001760, 0.302111944438360370, 0.302159607683439080, 0.302207270173119210, 0.302254931907280700, 0.302302592885804910, 0.302350253108572610, +0.302397912575465110, 0.302445571286362400, 0.302493229241145800, 0.302540886439696070, 0.302588542881894570, 0.302636198567621310, 0.302683853496757530, 0.302731507669184550, +0.302779161084782370, 0.302826813743432290, 0.302874465645015130, 0.302922116789412330, 0.302969767176503760, 0.303017416806170730, 0.303065065678294220, 0.303112713792755450, +0.303160361149434450, 0.303208007748212600, 0.303255653588970660, 0.303303298671590060, 0.303350942995950780, 0.303398586561934140, 0.303446229369421060, 0.303493871418292820, +0.303541512708429440, 0.303589153239712310, 0.303636793012022290, 0.303684432025240700, 0.303732070279247650, 0.303779707773924380, 0.303827344509152280, 0.303874980484811370, +0.303922615700783050, 0.303970250156948170, 0.304017883853188060, 0.304065516789382870, 0.304113148965413860, 0.304160780381162010, 0.304208411036508590, 0.304256040931333740, +0.304303670065518780, 0.304351298438944650, 0.304398926051492660, 0.304446552903043010, 0.304494178993476920, 0.304541804322675410, 0.304589428890519760, 0.304637052696890180, +0.304684675741667970, 0.304732298024734450, 0.304779919545969780, 0.304827540305255270, 0.304875160302471970, 0.304922779537501190, 0.304970398010223020, 0.305018015720518840, +0.305065632668269640, 0.305113248853356780, 0.305160864275660360, 0.305208478935061810, 0.305256092831442060, 0.305303705964682480, 0.305351318334663220, 0.305398929941265660, +0.305446540784370780, 0.305494150863859950, 0.305541760179613320, 0.305589368731512320, 0.305636976519438330, 0.305684583543271440, 0.305732189802893130, 0.305779795298184330, +0.305827400029026420, 0.305875003995299650, 0.305922607196885350, 0.305970209633664500, 0.306017811305518580, 0.306065412212327690, 0.306113012353973310, 0.306160611730336370, +0.306208210341298300, 0.306255808186739360, 0.306303405266540820, 0.306351001580583810, 0.306398597128749730, 0.306446191910918650, 0.306493785926972180, 0.306541379176791640, +0.306588971660257230, 0.306636563377250370, 0.306684154327652110, 0.306731744511343940, 0.306779333928205940, 0.306826922578119610, 0.306874510460965980, 0.306922097576626470, +0.306969683924981310, 0.307017269505911960, 0.307064854319299420, 0.307112438365025160, 0.307160021642969350, 0.307207604153013570, 0.307255185895038700, 0.307302766868926320, +0.307350347074556610, 0.307397926511811030, 0.307445505180570620, 0.307493083080716880, 0.307540660212130000, 0.307588236574691480, 0.307635812168282790, 0.307683386992784190, +0.307730961048077070, 0.307778534334042560, 0.307826106850562110, 0.307873678597516020, 0.307921249574785670, 0.307968819782252270, 0.308016389219797180, 0.308063957887300730, +0.308111525784644400, 0.308159092911709230, 0.308206659268376760, 0.308254224854527190, 0.308301789670042070, 0.308349353714802490, 0.308396916988689930, 0.308444479491584710, +0.308492041223368210, 0.308539602183922070, 0.308587162373126560, 0.308634721790863040, 0.308682280437012790, 0.308729838311457230, 0.308777395414076670, 0.308824951744752610, +0.308872507303366130, 0.308920062089798890, 0.308967616103930980, 0.309015169345644100, 0.309062721814819250, 0.309110273511338070, 0.309157824435080720, 0.309205374585928890, +0.309252923963763580, 0.309300472568466380, 0.309348020399917540, 0.309395567457998680, 0.309443113742591370, 0.309490659253575770, 0.309538203990833590, 0.309585747954245870, +0.309633291143694200, 0.309680833559058900, 0.309728375200221510, 0.309775916067063170, 0.309823456159465490, 0.309870995477308730, 0.309918534020474480, 0.309966071788843890, +0.310013608782298500, 0.310061145000718740, 0.310108680443986100, 0.310156215111981710, 0.310203749004587250, 0.310251282121683010, 0.310298814463150550, 0.310346346028871010, +0.310393876818726100, 0.310441406832596020, 0.310488936070362430, 0.310536464531906970, 0.310583992217109860, 0.310631519125852850, 0.310679045258016980, 0.310726570613483910, +0.310774095192134060, 0.310821618993848910, 0.310869142018509740, 0.310916664265998120, 0.310964185736194390, 0.311011706428980240, 0.311059226344236830, 0.311106745481845750, +0.311154263841687430, 0.311201781423643410, 0.311249298227594890, 0.311296814253423650, 0.311344329501009880, 0.311391843970235280, 0.311439357660981580, 0.311486870573128960, +0.311534382706559200, 0.311581894061153500, 0.311629404636793510, 0.311676914433359540, 0.311724423450733310, 0.311771931688796020, 0.311819439147429270, 0.311866945826513590, +0.311914451725930460, 0.311961956845561270, 0.312009461185287550, 0.312056964744989780, 0.312104467524549620, 0.312151969523848270, 0.312199470742767440, 0.312246971181187490, +0.312294470838990090, 0.312341969716056990, 0.312389467812268510, 0.312436965127506350, 0.312484461661651840, 0.312531957414586500, 0.312579452386190890, 0.312626946576346710, +0.312674439984935100, 0.312721932611837780, 0.312769424456935290, 0.312816915520109210, 0.312864405801240810, 0.312911895300211850, 0.312959384016902710, 0.313006871951195090, +0.313054359102970300, 0.313101845472110060, 0.313149331058494800, 0.313196815862006210, 0.313244299882525950, 0.313291783119934550, 0.313339265574113680, 0.313386747244944700, +0.313434228132309200, 0.313481708236087730, 0.313529187556161990, 0.313576666092413300, 0.313624143844723370, 0.313671620812972620, 0.313719096997042870, 0.313766572396815320, +0.313814047012171800, 0.313861520842992740, 0.313908993889159880, 0.313956466150554560, 0.314003937627058420, 0.314051408318552050, 0.314098878224917220, 0.314146347346035140, +0.314193815681787610, 0.314241283232055080, 0.314288749996719410, 0.314336215975662250, 0.314383681168764140, 0.314431145575906850, 0.314478609196971680, 0.314526072031840410, +0.314573534080393510, 0.314620995342512810, 0.314668455818079620, 0.314715915506975700, 0.314763374409081590, 0.314810832524278990, 0.314858289852449350, 0.314905746393474410, +0.314953202147234660, 0.315000657113611910, 0.315048111292487550, 0.315095564683743280, 0.315143017287259740, 0.315190469102918590, 0.315237920130601760, 0.315285370370189670, +0.315332819821564140, 0.315380268484606600, 0.315427716359198750, 0.315475163445221250, 0.315522609742555800, 0.315570055251083840, 0.315617499970687170, 0.315664943901246330, +0.315712387042643150, 0.315759829394758940, 0.315807270957475630, 0.315854711730673700, 0.315902151714235020, 0.315949590908040920, 0.315997029311973270, 0.316044466925912650, +0.316091903749740830, 0.316139339783339690, 0.316186775026589820, 0.316234209479372970, 0.316281643141570590, 0.316329076013064540, 0.316376508093735350, 0.316423939383464910, +0.316471369882134650, 0.316518799589626370, 0.316566228505820670, 0.316613656630599370, 0.316661083963843960, 0.316708510505436250, 0.316755936255256830, 0.316803361213187580, +0.316850785379109930, 0.316898208752905750, 0.316945631334455640, 0.316993053123641400, 0.317040474120344530, 0.317087894324446950, 0.317135313735829210, 0.317182732354373110, +0.317230150179960650, 0.317277567212472410, 0.317324983451790220, 0.317372398897795620, 0.317419813550370410, 0.317467227409395260, 0.317514640474751970, 0.317562052746322150, +0.317609464223987610, 0.317656874907629010, 0.317704284797128200, 0.317751693892366680, 0.317799102193226320, 0.317846509699587830, 0.317893916411333020, 0.317941322328343430, +0.317988727450501000, 0.318036131777686300, 0.318083535309781230, 0.318130938046667810, 0.318178339988226590, 0.318225741134339490, 0.318273141484888110, 0.318320541039754270, +0.318367939798818610, 0.318415337761963180, 0.318462734929069350, 0.318510131300019090, 0.318557526874693130, 0.318604921652973330, 0.318652315634741220, 0.318699708819878750, +0.318747101208266600, 0.318794492799786670, 0.318841883594320530, 0.318889273591750070, 0.318936662791956040, 0.318984051194820320, 0.319031438800224940, 0.319078825608050510, +0.319126211618179000, 0.319173596830492010, 0.319220981244871420, 0.319268364861197970, 0.319315747679353610, 0.319363129699219870, 0.319410510920678680, 0.319457891343610860, +0.319505270967898270, 0.319552649793422520, 0.319600027820065580, 0.319647405047708170, 0.319694781476232200, 0.319742157105519290, 0.319789531935451400, 0.319836905965909250, +0.319884279196774870, 0.319931651627930190, 0.319979023259255980, 0.320026394090634210, 0.320073764121946440, 0.320121133353074680, 0.320168501783899660, 0.320215869414303410, +0.320263236244167470, 0.320310602273373880, 0.320357967501803340, 0.320405331929337900, 0.320452695555859090, 0.320500058381249010, 0.320547420405388360, 0.320594781628159130, +0.320642142049442970, 0.320689501669121860, 0.320736860487076560, 0.320784218503189170, 0.320831575717341170, 0.320878932129414710, 0.320926287739290440, 0.320973642546850460, +0.321020996551976800, 0.321068349754550290, 0.321115702154452840, 0.321163053751566120, 0.321210404545772210, 0.321257754536951880, 0.321305103724987160, 0.321352452109759710, +0.321399799691151510, 0.321447146469043380, 0.321494492443317400, 0.321541837613855190, 0.321589181980538820, 0.321636525543249060, 0.321683868301868010, 0.321731210256277270, +0.321778551406358910, 0.321825891751993780, 0.321873231293063890, 0.321920570029451350, 0.321967907961036970, 0.322015245087702850, 0.322062581409330580, 0.322109916925802320, +0.322157251636998820, 0.322204585542802180, 0.322251918643094050, 0.322299250937756580, 0.322346582426670580, 0.322393913109718100, 0.322441242986780840, 0.322488572057740900, +0.322535900322479090, 0.322583227780877560, 0.322630554432817910, 0.322677880278182340, 0.322725205316851670, 0.322772529548707940, 0.322819852973633300, 0.322867175591508630, +0.322914497402216010, 0.322961818405637200, 0.323009138601654200, 0.323056457990147930, 0.323103776571000530, 0.323151094344093730, 0.323198411309309600, 0.323245727466528960, +0.323293042815634090, 0.323340357356506570, 0.323387671089028550, 0.323434984013080960, 0.323482296128545900, 0.323529607435305120, 0.323576917933240730, 0.323624227622233640, +0.323671536502165960, 0.323718844572919440, 0.323766151834376240, 0.323813458286417220, 0.323860763928924600, 0.323908068761780410, 0.323955372784865690, 0.324002675998062540, +0.324049978401252660, 0.324097279994318310, 0.324144580777140310, 0.324191880749600870, 0.324239179911581690, 0.324286478262965030, 0.324333775803631710, 0.324381072533463990, +0.324428368452343570, 0.324475663560152620, 0.324522957856772150, 0.324570251342084230, 0.324617544015970700, 0.324664835878313740, 0.324712126928994320, 0.324759417167894530, +0.324806706594896580, 0.324853995209881510, 0.324901283012731410, 0.324948570003328110, 0.324995856181553850, 0.325043141547289470, 0.325090426100417270, 0.325137709840818970, +0.325184992768376870, 0.325232274882971790, 0.325279556184486120, 0.325326836672801490, 0.325374116347800220, 0.325421395209363200, 0.325468673257372720, 0.325515950491710560, +0.325563226912258970, 0.325610502518898840, 0.325657777311512460, 0.325705051289982120, 0.325752324454188670, 0.325799596804014440, 0.325846868339341180, 0.325894139060051210, +0.325941408966025470, 0.325988678057146150, 0.326035946333295190, 0.326083213794354790, 0.326130480440205930, 0.326177746270730870, 0.326225011285811380, 0.326272275485329890, +0.326319538869167200, 0.326366801437205700, 0.326414063189327200, 0.326461324125413950, 0.326508584245347010, 0.326555843549008570, 0.326603102036280960, 0.326650359707045150, +0.326697616561183460, 0.326744872598577710, 0.326792127819110210, 0.326839382222661960, 0.326886635809115260, 0.326933888578351980, 0.326981140530254400, 0.327028391664703540, +0.327075641981581730, 0.327122891480770780, 0.327170140162153010, 0.327217388025609510, 0.327264635071022550, 0.327311881298273930, 0.327359126707246100, 0.327406371297820020, +0.327453615069877970, 0.327500858023301920, 0.327548100157974140, 0.327595341473775670, 0.327642581970588880, 0.327689821648296020, 0.327737060506778200, 0.327784298545917730, +0.327831535765596540, 0.327878772165696890, 0.327926007746099920, 0.327973242506687910, 0.328020476447342780, 0.328067709567946900, 0.328114941868381360, 0.328162173348528430, +0.328209404008270030, 0.328256633847488600, 0.328303862866065170, 0.328351091063882050, 0.328398318440821180, 0.328445544996764980, 0.328492770731594500, 0.328539995645192040, +0.328587219737440040, 0.328634443008219590, 0.328681665457413010, 0.328728887084902280, 0.328776107890569770, 0.328823327874296520, 0.328870547035965020, 0.328917765375457080, +0.328964982892655190, 0.329012199587440380, 0.329059415459695140, 0.329106630509301330, 0.329153844736141340, 0.329201058140096310, 0.329248270721048670, 0.329295482478880350, +0.329342693413473770, 0.329389903524709980, 0.329437112812471460, 0.329484321276640570, 0.329531528917098470, 0.329578735733727530, 0.329625941726409740, 0.329673146895027580, +0.329720351239462080, 0.329767554759595680, 0.329814757455310470, 0.329861959326488710, 0.329909160373011660, 0.329956360594761740, 0.330003559991620900, 0.330050758563471550, +0.330097956310194900, 0.330145153231673370, 0.330192349327788960, 0.330239544598424080, 0.330286739043459900, 0.330333932662778940, 0.330381125456263080, 0.330428317423794860, +0.330475508565255430, 0.330522698880527210, 0.330569888369492690, 0.330617077032032970, 0.330664264868030630, 0.330711451877367610, 0.330758638059926340, 0.330805823415588120, +0.330853007944235280, 0.330900191645749960, 0.330947374520014550, 0.330994556566910290, 0.331041737786319680, 0.331088918178124690, 0.331136097742207810, 0.331183276478450310, +0.331230454386734540, 0.331277631466942720, 0.331324807718957230, 0.331371983142659250, 0.331419157737931350, 0.331466331504655990, 0.331513504442714320, 0.331560676551988950, +0.331607847832361860, 0.331655018283715570, 0.331702187905931310, 0.331749356698891610, 0.331796524662478500, 0.331843691796574520, 0.331890858101060840, 0.331938023575820080, +0.331985188220734200, 0.332032352035685820, 0.332079515020556100, 0.332126677175227590, 0.332173838499582430, 0.332220998993503050, 0.332268158656870820, 0.332315317489568110, +0.332362475491477570, 0.332409632662480410, 0.332456789002459170, 0.332503944511296000, 0.332551099188873320, 0.332598253035072510, 0.332645406049776050, 0.332692558232866090, +0.332739709584225160, 0.332786860103734540, 0.332834009791276750, 0.332881158646733900, 0.332928306669988630, 0.332975453860922140, 0.333022600219417040, 0.333069745745355470, +0.333116890438619920, 0.333164034299091690, 0.333211177326653400, 0.333258319521187620, 0.333305460882575570, 0.333352601410699890, 0.333399741105442740, 0.333446879966686590, +0.333494017994312890, 0.333541155188204100, 0.333588291548242430, 0.333635427074310490, 0.333682561766289520, 0.333729695624062130, 0.333776828647510570, 0.333823960836517280, +0.333871092190963730, 0.333918222710732400, 0.333965352395705520, 0.334012481245765710, 0.334059609260794250, 0.334106736440673790, 0.334153862785286470, 0.334200988294514940, +0.334248112968240470, 0.334295236806345760, 0.334342359808713350, 0.334389481975224670, 0.334436603305762250, 0.334483723800208300, 0.334530843458445530, 0.334577962280355190, +0.334625080265819940, 0.334672197414721980, 0.334719313726943970, 0.334766429202367210, 0.334813543840874420, 0.334860657642347740, 0.334907770606669870, 0.334954882733722150, +0.335001994023387210, 0.335049104475547310, 0.335096214090085050, 0.335143322866881810, 0.335190430805820280, 0.335237537906783120, 0.335284644169651650, 0.335331749594308610, +0.335378854180636180, 0.335425957928517040, 0.335473060837832570, 0.335520162908465480, 0.335567264140297920, 0.335614364533212690, 0.335661464087091080, 0.335708562801815820, +0.335755660677269200, 0.335802757713333790, 0.335849853909891080, 0.335896949266823790, 0.335944043784014050, 0.335991137461344620, 0.336038230298697000, 0.336085322295953730, +0.336132413452997600, 0.336179503769710060, 0.336226593245973700, 0.336273681881670890, 0.336320769676684280, 0.336367856630895360, 0.336414942744186760, 0.336462028016440820, +0.336509112447540230, 0.336556196037366420, 0.336603278785802150, 0.336650360692729630, 0.336697441758031680, 0.336744521981589660, 0.336791601363286400, 0.336838679903004090, +0.336885757600625500, 0.336932834456032120, 0.336979910469106640, 0.337026985639731380, 0.337074059967789110, 0.337121133453161250, 0.337168206095730560, 0.337215277895379750, +0.337262348851990360, 0.337309418965445030, 0.337356488235626200, 0.337403556662416610, 0.337450624245697660, 0.337497690985352150, 0.337544756881262400, 0.337591821933311220, +0.337638886141380050, 0.337685949505351630, 0.337733012025108410, 0.337780073700533030, 0.337827134531507030, 0.337874194517913230, 0.337921253659633940, 0.337968311956551910, +0.338015369408548700, 0.338062426015507070, 0.338109481777309760, 0.338156536693838380, 0.338203590764975640, 0.338250643990603890, 0.338297696370605970, 0.338344747904863410, +0.338391798593258960, 0.338438848435675010, 0.338485897431994360, 0.338532945582098570, 0.338579992885870430, 0.338627039343192270, 0.338674084953946910, 0.338721129718015990, +0.338768173635282170, 0.338815216705627980, 0.338862258928936120, 0.338909300305088200, 0.338956340833967080, 0.339003380515455480, 0.339050419349435030, 0.339097457335788500, +0.339144494474398320, 0.339191530765147350, 0.339238566207917150, 0.339285600802590510, 0.339332634549049880, 0.339379667447178070, 0.339426699496856720, 0.339473730697968550, +0.339520761050396080, 0.339567790554022140, 0.339614819208728320, 0.339661847014397440, 0.339708873970911930, 0.339755900078154650, 0.339802925336007200, 0.339849949744352450, +0.339896973303072840, 0.339943996012051160, 0.339991017871169140, 0.340038038880309530, 0.340085059039355260, 0.340132078348187930, 0.340179096806690400, 0.340226114414745100, +0.340273131172234950, 0.340320147079041570, 0.340367162135047810, 0.340414176340136150, 0.340461189694189480, 0.340508202197089380, 0.340555213848718790, 0.340602224648960170, +0.340649234597696420, 0.340696243694809160, 0.340743251940181290, 0.340790259333695280, 0.340837265875234050, 0.340884271564679210, 0.340931276401913730, 0.340978280386820430, +0.341025283519281070, 0.341072285799178480, 0.341119287226395170, 0.341166287800814040, 0.341213287522316780, 0.341260286390786320, 0.341307284406105140, 0.341354281568156170, +0.341401277876821060, 0.341448273331982800, 0.341495267933523810, 0.341542261681327060, 0.341589254575274280, 0.341636246615248330, 0.341683237801131800, 0.341730228132807570, +0.341777217610157340, 0.341824206233064090, 0.341871194001410750, 0.341918180915078970, 0.341965166973951800, 0.342012152177911640, 0.342059136526841560, 0.342106120020623180, +0.342153102659139560, 0.342200084442273120, 0.342247065369906960, 0.342294045441922660, 0.342341024658203260, 0.342388003018631320, 0.342434980523089790, 0.342481957171460350, +0.342528932963626020, 0.342575907899469400, 0.342622881978873420, 0.342669855201719780, 0.342716827567891570, 0.342763799077271670, 0.342810769729741840, 0.342857739525185110, +0.342904708463483980, 0.342951676544521580, 0.342998643768179510, 0.343045610134340820, 0.343092575642888140, 0.343139540293704470, 0.343186504086671450, 0.343233467021672230, +0.343280429098589300, 0.343327390317305750, 0.343374350677703330, 0.343421310179664980, 0.343468268823073410, 0.343515226607811530, 0.343562183533761170, 0.343609139600805360, +0.343656094808826750, 0.343703049157708270, 0.343750002647331740, 0.343796955277580250, 0.343843907048336730, 0.343890857959483100, 0.343937808010902290, 0.343984757202476950, +0.344031705534090130, 0.344078653005623620, 0.344125599616960490, 0.344172545367983360, 0.344219490258575290, 0.344266434288618080, 0.344313377457994780, 0.344360319766588040, +0.344407261214280950, 0.344454201800955260, 0.344501141526494030, 0.344548080390780000, 0.344595018393696160, 0.344641955535124390, 0.344688891814947660, 0.344735827233049190, +0.344782761789310720, 0.344829695483615310, 0.344876628315845700, 0.344923560285884890, 0.344970491393614800, 0.345017421638918460, 0.345064351021678590, 0.345111279541778280, +0.345158207199099290, 0.345205133993524820, 0.345252059924937520, 0.345298984993220480, 0.345345909198255590, 0.345392832539925860, 0.345439755018114080, 0.345486676632703330, +0.345533597383575470, 0.345580517270613670, 0.345627436293700910, 0.345674354452719210, 0.345721271747551570, 0.345768188178080800, 0.345815103744189940, 0.345862018445760920, +0.345908932282676830, 0.345955845254820430, 0.346002757362074860, 0.346049668604321960, 0.346096578981444860, 0.346143488493326320, 0.346190397139849500, 0.346237304920896270, +0.346284211836349780, 0.346331117886092720, 0.346378023070008310, 0.346424927387978420, 0.346471830839886250, 0.346518733425614460, 0.346565635145046290, 0.346612535998063580, +0.346659435984549510, 0.346706335104387310, 0.346753233357458830, 0.346800130743647290, 0.346847027262835450, 0.346893922914906390, 0.346940817699742170, 0.346987711617225860, +0.347034604667240290, 0.347081496849668600, 0.347128388164392790, 0.347175278611295990, 0.347222168190260970, 0.347269056901170990, 0.347315944743907920, 0.347362831718355030, +0.347409717824395000, 0.347456603061911170, 0.347503487430785350, 0.347550370930900850, 0.347597253562140830, 0.347644135324387200, 0.347691016217523300, 0.347737896241431870, +0.347784775395996060, 0.347831653681097920, 0.347878531096620650, 0.347925407642447060, 0.347972283318460360, 0.348019158124542540, 0.348066032060576850, 0.348112905126446050, +0.348159777322033400, 0.348206648647220900, 0.348253519101891730, 0.348300388685928830, 0.348347257399215350, 0.348394125241633320, 0.348440992213065960, 0.348487858313396510, +0.348534723542507090, 0.348581587900280760, 0.348628451386600540, 0.348675314001349550, 0.348722175744409890, 0.348769036615664770, 0.348815896614997070, 0.348862755742290030, +0.348909613997425700, 0.348956471380287350, 0.349003327890757830, 0.349050183528720360, 0.349097038294057030, 0.349143892186651150, 0.349190745206385490, 0.349237597353143360, +0.349284448626806850, 0.349331299027259230, 0.349378148554383820, 0.349424997208062580, 0.349471844988178850, 0.349518691894615490, 0.349565537927255810, 0.349612383085981910, +0.349659227370677010, 0.349706070781224070, 0.349752913317506350, 0.349799754979405960, 0.349846595766806160, 0.349893435679589860, 0.349940274717640390, 0.349987112880839830, +0.350033950169071520, 0.350080786582218310, 0.350127622120163520, 0.350174456782789300, 0.350221290569978920, 0.350268123481615290, 0.350314955517581790, 0.350361786677760470, +0.350408616962034740, 0.350455446370287800, 0.350502274902401880, 0.350549102558260270, 0.350595929337745920, 0.350642755240742120, 0.350689580267131040, 0.350736404416795990, +0.350783227689619950, 0.350830050085486290, 0.350876871604277050, 0.350923692245875610, 0.350970512010164940, 0.351017330897028470, 0.351064148906348180, 0.351110966038007570, +0.351157782291889540, 0.351204597667877430, 0.351251412165853430, 0.351298225785700910, 0.351345038527303260, 0.351391850390542600, 0.351438661375302270, 0.351485471481465310, +0.351532280708915070, 0.351579089057533770, 0.351625896527204660, 0.351672703117810900, 0.351719508829235750, 0.351766313661361410, 0.351813117614071300, 0.351859920687248360, +0.351906722880776070, 0.351953524194536570, 0.352000324628413240, 0.352047124182289060, 0.352093922856047570, 0.352140720649570800, 0.352187517562742250, 0.352234313595445270, +0.352281108747562130, 0.352327903018976260, 0.352374696409570590, 0.352421488919228590, 0.352468280547832470, 0.352515071295265600, 0.352561861161411080, 0.352608650146152340, +0.352655438249371570, 0.352702225470952200, 0.352749011810777220, 0.352795797268730170, 0.352842581844693190, 0.352889365538549770, 0.352936148350182940, 0.352982930279476140, +0.353029711326311610, 0.353076491490572800, 0.353123270772142780, 0.353170049170905000, 0.353216826686741650, 0.353263603319536210, 0.353310379069172230, 0.353357153935531850, +0.353403927918498620, 0.353450701017955560, 0.353497473233786160, 0.353544244565872630, 0.353591015014098560, 0.353637784578346880, 0.353684553258501230, 0.353731321054443710, +0.353778087966057920, 0.353824853993226880, 0.353871619135834150, 0.353918383393761970, 0.353965146766893830, 0.354011909255112780, 0.354058670858302390, 0.354105431576344940, +0.354152191409123910, 0.354198950356522770, 0.354245708418423840, 0.354292465594710670, 0.354339221885266340, 0.354385977289974340, 0.354432731808717040, 0.354479485441377860, +0.354526238187839960, 0.354572990047986920, 0.354619741021700960, 0.354666491108865670, 0.354713240309364130, 0.354759988623079890, 0.354806736049895320, 0.354853482589693850, +0.354900228242358730, 0.354946973007773390, 0.354993716885820270, 0.355040459876382830, 0.355087201979344620, 0.355133943194588020, 0.355180683521996610, 0.355227422961453430, +0.355274161512842130, 0.355320899176044980, 0.355367635950945620, 0.355414371837427130, 0.355461106835373190, 0.355507840944666030, 0.355554574165189260, 0.355601306496826090, +0.355648037939460040, 0.355694768492973430, 0.355741498157249980, 0.355788226932172770, 0.355834954817625390, 0.355881681813490220, 0.355928407919650800, 0.355975133135990830, +0.356021857462392620, 0.356068580898739720, 0.356115303444915380, 0.356162025100803190, 0.356208745866285590, 0.356255465741246060, 0.356302184725567850, 0.356348902819134670, +0.356395620021828730, 0.356442336333533780, 0.356489051754133040, 0.356535766283510020, 0.356582479921547180, 0.356629192668128150, 0.356675904523136130, 0.356722615486454790, +0.356769325557966480, 0.356816034737554850, 0.356862743025103120, 0.356909450420494930, 0.356956156923612770, 0.357002862534340160, 0.357049567252560820, 0.357096271078157170, +0.357142974011012860, 0.357189676051011040, 0.357236377198035530, 0.357283077451968580, 0.357329776812694010, 0.357376475280094970, 0.357423172854055120, 0.357469869534456970, +0.357516565321184140, 0.357563260214119880, 0.357609954213147900, 0.357656647318150610, 0.357703339529011730, 0.357750030845614460, 0.357796721267842570, 0.357843410795578410, +0.357890099428705750, 0.357936787167108250, 0.357983474010668380, 0.358030159959269840, 0.358076845012795850, 0.358123529171130220, 0.358170212434155310, 0.358216894801754890, +0.358263576273812220, 0.358310256850211010, 0.358356936530833780, 0.358403615315564190, 0.358450293204285560, 0.358496970196881650, 0.358543646293234820, 0.358590321493228950, +0.358636995796747240, 0.358683669203673450, 0.358730341713890120, 0.358777013327280900, 0.358823684043729550, 0.358870353863118610, 0.358917022785331720, 0.358963690810252310, +0.359010357937764090, 0.359057024167749590, 0.359103689500092530, 0.359150353934676200, 0.359197017471384440, 0.359243680110099660, 0.359290341850705740, 0.359337002693085940, +0.359383662637124070, 0.359430321682702610, 0.359476979829705390, 0.359523637078015660, 0.359570293427517280, 0.359616948878092760, 0.359663603429625830, 0.359710257081999940, +0.359756909835098780, 0.359803561688804950, 0.359850212643002210, 0.359896862697574370, 0.359943511852403920, 0.359990160107374720, 0.360036807462370160, 0.360083453917273920, +0.360130099471968670, 0.360176744126338160, 0.360223387880265810, 0.360270030733635390, 0.360316672686329500, 0.360363313738231880, 0.360409953889226030, 0.360456593139195650, +0.360503231488023430, 0.360549868935593100, 0.360596505481788120, 0.360643141126492260, 0.360689775869588170, 0.360736409710959600, 0.360783042650490440, 0.360829674688063260, +0.360876305823561890, 0.360922936056869760, 0.360969565387870730, 0.361016193816447340, 0.361062821342483460, 0.361109447965862530, 0.361156073686468400, 0.361202698504183680, +0.361249322418892240, 0.361295945430477440, 0.361342567538823210, 0.361389188743812150, 0.361435809045328130, 0.361482428443254570, 0.361529046937475400, 0.361575664527873150, +0.361622281214331760, 0.361668896996735050, 0.361715511874965700, 0.361762125848907600, 0.361808738918444120, 0.361855351083459230, 0.361901962343835590, 0.361948572699457020, +0.361995182150207040, 0.362041790695969480, 0.362088398336627040, 0.362135005072063590, 0.362181610902162670, 0.362228215826808090, 0.362274819845882610, 0.362321422959270060, +0.362368025166853960, 0.362414626468518190, 0.362461226864145390, 0.362507826353619610, 0.362554424936824660, 0.362601022613643190, 0.362647619383959230, 0.362694215247656160, +0.362740810204618010, 0.362787404254727390, 0.362833997397868260, 0.362880589633924170, 0.362927180962778980, 0.362973771384315470, 0.363020360898417490, 0.363066949504968650, +0.363113537203852810, 0.363160123994952730, 0.363206709878152290, 0.363253294853335130, 0.363299878920385180, 0.363346462079185080, 0.363393044329618780, 0.363439625671569950, +0.363486206104922440, 0.363532785629558990, 0.363579364245363580, 0.363625941952220140, 0.363672518750011500, 0.363719094638621510, 0.363765669617933770, 0.363812243687832330, +0.363858816848199820, 0.363905389098920280, 0.363951960439877260, 0.363998530870954800, 0.364045100392035580, 0.364091669003003600, 0.364138236703742400, 0.364184803494136070, +0.364231369374067300, 0.364277934343420150, 0.364324498402078150, 0.364371061549925270, 0.364417623786844390, 0.364464185112719390, 0.364510745527434340, 0.364557305030872080, +0.364603863622916520, 0.364650421303451270, 0.364696978072360400, 0.364743533929526690, 0.364790088874834160, 0.364836642908166360, 0.364883196029407390, 0.364929748238440040, +0.364976299535148260, 0.365022849919415800, 0.365069399391126590, 0.365115947950163440, 0.365162495596410450, 0.365209042329751270, 0.365255588150069810, 0.365302133057249010, +0.365348677051172910, 0.365395220131725480, 0.365441762298789610, 0.365488303552249320, 0.365534843891988310, 0.365581383317890580, 0.365627921829838940, 0.365674459427717540, +0.365720996111409960, 0.365767531880800360, 0.365814066735771440, 0.365860600676207400, 0.365907133701991850, 0.365953665813008920, 0.366000197009141380, 0.366046727290273320, +0.366093256656288450, 0.366139785107070900, 0.366186312642503400, 0.366232839262470190, 0.366279364966854810, 0.366325889755541480, 0.366372413628413000, 0.366418936585353520, +0.366465458626247080, 0.366511979750976550, 0.366558499959426130, 0.366605019251479420, 0.366651537627020570, 0.366698055085932510, 0.366744571628099260, 0.366791087253404650, +0.366837601961732650, 0.366884115752966310, 0.366930628626989610, 0.366977140583686410, 0.367023651622940710, 0.367070161744635470, 0.367116670948654860, 0.367163179234882560, +0.367209686603202750, 0.367256193053498270, 0.367302698585653340, 0.367349203199552050, 0.367395706895077330, 0.367442209672113380, 0.367488711530543910, 0.367535212470253000, +0.367581712491123700, 0.367628211593040160, 0.367674709775886010, 0.367721207039545580, 0.367767703383901630, 0.367814198808838480, 0.367860693314239820, 0.367907186899989860, +0.367953679565971530, 0.368000171312068970, 0.368046662138165950, 0.368093152044146720, 0.368139641029894220, 0.368186129095292580, 0.368232616240226070, 0.368279102464577570, +0.368325587768231320, 0.368372072151071150, 0.368418555612981150, 0.368465038153844350, 0.368511519773545020, 0.368558000471966850, 0.368604480248994060, 0.368650959104509680, +0.368697437038397910, 0.368743914050542580, 0.368790390140827820, 0.368836865309136670, 0.368883339555353410, 0.368929812879361770, 0.368976285281045980, 0.369022756760289120, +0.369069227316975330, 0.369115696950988950, 0.369162165662212830, 0.369208633450531340, 0.369255100315828260, 0.369301566257987820, 0.369348031276893090, 0.369394495372428240, +0.369440958544477230, 0.369487420792924180, 0.369533882117652150, 0.369580342518545430, 0.369626801995487860, 0.369673260548363690, 0.369719718177055960, 0.369766174881448920, +0.369812630661426500, 0.369859085516872850, 0.369905539447671130, 0.369951992453705520, 0.369998444534859920, 0.370044895691018620, 0.370091345922064720, 0.370137795227882430, +0.370184243608356060, 0.370230691063368640, 0.370277137592804560, 0.370323583196547570, 0.370370027874482090, 0.370416471626491050, 0.370462914452458880, 0.370509356352269450, +0.370555797325807010, 0.370602237372954670, 0.370648676493596730, 0.370695114687617120, 0.370741551954900110, 0.370787988295328830, 0.370834423708787550, 0.370880858195160260, +0.370927291754331200, 0.370973724386183530, 0.371020156090601520, 0.371066586867469520, 0.371113016716670690, 0.371159445638089280, 0.371205873631609230, 0.371252300697114960, +0.371298726834489500, 0.371345152043617230, 0.371391576324382080, 0.371437999676668410, 0.371484422100359310, 0.371530843595339170, 0.371577264161491950, 0.371623683798701920, +0.371670102506852280, 0.371716520285827410, 0.371762937135511230, 0.371809353055788160, 0.371855768046541250, 0.371902182107654910, 0.371948595239013520, 0.371995007440500290, +0.372041418711999470, 0.372087829053395160, 0.372134238464571660, 0.372180646945412140, 0.372227054495801070, 0.372273461115622320, 0.372319866804760310, 0.372366271563098210, +0.372412675390520480, 0.372459078286911050, 0.372505480252154300, 0.372551881286133480, 0.372598281388732970, 0.372644680559836680, 0.372691078799329170, 0.372737476107093510, +0.372783872483014200, 0.372830267926975210, 0.372876662438860920, 0.372923056018554580, 0.372969448665940620, 0.373015840380903410, 0.373062231163326210, 0.373108621013093440, +0.373155009930089100, 0.373201397914197650, 0.373247784965302310, 0.373294171083287500, 0.373340556268037300, 0.373386940519436050, 0.373433323837367100, 0.373479706221714780, +0.373526087672363230, 0.373572468189196870, 0.373618847772098920, 0.373665226420953900, 0.373711604135645750, 0.373757980916059050, 0.373804356762076910, 0.373850731673583960, +0.373897105650464520, 0.373943478692601970, 0.373989850799880730, 0.374036221972184780, 0.374082592209398770, 0.374128961511405840, 0.374175329878090490, 0.374221697309336850, +0.374268063805029360, 0.374314429365051270, 0.374360793989287120, 0.374407157677621010, 0.374453520429937400, 0.374499882246119580, 0.374546243126052060, 0.374592603069618950, +0.374638962076704720, 0.374685320147192690, 0.374731677280967350, 0.374778033477913220, 0.374824388737913570, 0.374870743060853000, 0.374917096446615530, 0.374963448895085760, +0.375009800406146950, 0.375056150979683640, 0.375102500615579980, 0.375148849313720440, 0.375195197073988350, 0.375241543896268290, 0.375287889780444420, 0.375334234726401150, +0.375380578734021920, 0.375426921803191260, 0.375473263933793320, 0.375519605125712590, 0.375565945378832420, 0.375612284693037420, 0.375658623068212070, 0.375704960504239790, +0.375751297001005120, 0.375797632558392210, 0.375843967176285600, 0.375890300854568700, 0.375936633593126010, 0.375982965391841730, 0.376029296250600500, 0.376075626169285580, +0.376121955147781570, 0.376168283185972730, 0.376214610283743590, 0.376260936440977470, 0.376307261657559010, 0.376353585933372430, 0.376399909268302300, 0.376446231662231960, +0.376492553115046040, 0.376538873626628750, 0.376585193196864680, 0.376631511825637200, 0.376677829512830960, 0.376724146258330560, 0.376770462062019420, 0.376816776923782070, +0.376863090843502780, 0.376909403821066190, 0.376955715856355680, 0.377002026949255890, 0.377048337099651020, 0.377094646307425730, 0.377140954572463380, 0.377187261894648680, +0.377233568273865780, 0.377279873709999440, 0.377326178202932960, 0.377372481752551060, 0.377418784358737940, 0.377465086021378240, 0.377511386740355450, 0.377557686515554160, +0.377603985346859130, 0.377650283234153670, 0.377696580177322550, 0.377742876176249910, 0.377789171230820560, 0.377835465340917830, 0.377881758506426410, 0.377928050727230680, +0.377974342003215170, 0.378020632334263420, 0.378066921720260070, 0.378113210161089400, 0.378159497656636150, 0.378205784206783750, 0.378252069811416850, 0.378298354470419820, +0.378344638183677310, 0.378390920951072740, 0.378437202772490930, 0.378483483647816530, 0.378529763576932960, 0.378576042559724990, 0.378622320596076920, 0.378668597685873460, +0.378714873828998160, 0.378761149025335590, 0.378807423274770180, 0.378853696577186590, 0.378899968932468410, 0.378946240340500280, 0.378992510801166530, 0.379038780314351900, +0.379085048879939930, 0.379131316497815400, 0.379177583167862490, 0.379223848889966080, 0.379270113664009590, 0.379316377489877900, 0.379362640367455210, 0.379408902296626330, +0.379455163277274800, 0.379501423309285320, 0.379547682392542720, 0.379593940526930520, 0.379640197712333430, 0.379686453948635870, 0.379732709235722610, 0.379778963573477120, +0.379825216961784280, 0.379871469400528350, 0.379917720889594190, 0.379963971428865290, 0.380010221018226460, 0.380056469657562120, 0.380102717346756940, 0.380148964085694600, +0.380195209874259870, 0.380241454712337110, 0.380287698599811100, 0.380333941536565470, 0.380380183522484930, 0.380426424557454400, 0.380472664641357320, 0.380518903774078650, +0.380565141955502730, 0.380611379185514300, 0.380657615463997070, 0.380703850790835740, 0.380750085165914850, 0.380796318589119110, 0.380842551060332210, 0.380888782579438870, +0.380935013146323610, 0.380981242760871250, 0.381027471422965340, 0.381073699132490780, 0.381119925889331970, 0.381166151693373700, 0.381212376544499690, 0.381258600442594740, +0.381304823387543680, 0.381351045379230150, 0.381397266417539020, 0.381443486502354710, 0.381489705633562100, 0.381535923811044840, 0.381582141034687740, 0.381628357304375330, +0.381674572619992380, 0.381720786981422640, 0.381767000388550880, 0.381813212841261630, 0.381859424339439810, 0.381905634882968970, 0.381951844471734080, 0.381998053105619520, +0.382044260784510310, 0.382090467508289950, 0.382136673276843530, 0.382182878090055740, 0.382229081947810410, 0.382275284849992350, 0.382321486796486090, 0.382367687787176500, +0.382413887821947300, 0.382460086900683340, 0.382506285023269220, 0.382552482189589760, 0.382598678399528710, 0.382644873652970950, 0.382691067949801010, 0.382737261289903820, +0.382783453673163020, 0.382829645099463660, 0.382875835568690150, 0.382922025080727420, 0.382968213635459300, 0.383014401232770580, 0.383060587872545880, 0.383106773554670100, +0.383152958279027010, 0.383199142045501540, 0.383245324853978610, 0.383291506704341920, 0.383337687596476460, 0.383383867530266820, 0.383430046505597920, 0.383476224522353530, +0.383522401580418500, 0.383568577679677500, 0.383614752820015450, 0.383660927001316150, 0.383707100223464490, 0.383753272486345110, 0.383799443789842930, 0.383845614133841770, +0.383891783518226560, 0.383937951942881880, 0.383984119407692730, 0.384030285912542850, 0.384076451457317280, 0.384122616041901010, 0.384168779666177800, 0.384214942330032620, +0.384261104033350060, 0.384307264776015180, 0.384353424557911720, 0.384399583378924660, 0.384445741238938710, 0.384491898137838740, 0.384538054075508670, 0.384584209051833440, +0.384630363066697730, 0.384676516119986490, 0.384722668211583570, 0.384768819341373970, 0.384814969509242270, 0.384861118715073610, 0.384907266958751770, 0.384953414240161720, +0.384999560559188550, 0.385045705915716070, 0.385091850309629340, 0.385137993740812920, 0.385184136209151980, 0.385230277714530330, 0.385276418256832900, 0.385322557835944490, +0.385368696451750090, 0.385414834104133520, 0.385460970792979860, 0.385507106518173770, 0.385553241279600330, 0.385599375077143370, 0.385645507910688020, 0.385691639780118830, +0.385737770685321000, 0.385783900626178290, 0.385830029602575900, 0.385876157614398360, 0.385922284661530890, 0.385968410743857290, 0.386014535861262610, 0.386060660013632040, +0.386106783200849460, 0.386152905422799840, 0.386199026679368010, 0.386245146970438990, 0.386291266295896720, 0.386337384655626280, 0.386383502049512330, 0.386429618477440120, +0.386475733939293410, 0.386521848434957350, 0.386567961964316700, 0.386614074527256490, 0.386660186123660770, 0.386706296753414560, 0.386752406416402570, 0.386798515112510010, +0.386844622841620740, 0.386890729603619920, 0.386936835398392690, 0.386982940225822910, 0.387029044085795860, 0.387075146978196170, 0.387121248902909000, 0.387167349859818320, +0.387213449848809230, 0.387259548869766550, 0.387305646922575410, 0.387351744007119750, 0.387397840123284710, 0.387443935270955050, 0.387490029450016040, 0.387536122660351480, +0.387582214901846630, 0.387628306174386210, 0.387674396477855450, 0.387720485812138360, 0.387766574177119960, 0.387812661572685570, 0.387858747998719170, 0.387904833455105850, +0.387950917941730420, 0.387997001458478150, 0.388043084005232960, 0.388089165581880000, 0.388135246188304190, 0.388181325824390690, 0.388227404490023410, 0.388273482185087670, +0.388319558909468180, 0.388365634663050240, 0.388411709445717790, 0.388457783257356030, 0.388503856097849880, 0.388549927967084430, 0.388595998864943840, 0.388642068791313190, +0.388688137746077740, 0.388734205729121600, 0.388780272740329950, 0.388826338779587610, 0.388872403846779790, 0.388918467941790580, 0.388964531064505240, 0.389010593214808520, +0.389056654392585740, 0.389102714597720890, 0.389148773830099270, 0.389194832089605760, 0.389240889376125550, 0.389286945689542700, 0.389333001029742440, 0.389379055396609770, +0.389425108790029780, 0.389471161209886670, 0.389517212656065650, 0.389563263128451580, 0.389609312626929770, 0.389655361151384270, 0.389701408701700390, 0.389747455277763390, +0.389793500879457300, 0.389839545506667500, 0.389885589159278840, 0.389931631837176610, 0.389977673540244870, 0.390023714268368960, 0.390069754021433730, 0.390115792799324570, +0.390161830601925500, 0.390207867429121890, 0.390253903280798560, 0.390299938156840940, 0.390345972057133010, 0.390392004981560180, 0.390438036930007340, 0.390484067902359790, +0.390530097898501680, 0.390576126918318280, 0.390622154961695060, 0.390668182028515940, 0.390714208118666470, 0.390760233232031410, 0.390806257368496170, 0.390852280527944910, +0.390898302710262990, 0.390944323915335230, 0.390990344143047120, 0.391036363393282740, 0.391082381665927400, 0.391128398960866150, 0.391174415277984360, 0.391220430617166050, +0.391266444978296660, 0.391312458361261220, 0.391358470765944990, 0.391404482192232170, 0.391450492640008200, 0.391496502109158320, 0.391542510599566850, 0.391588518111119050, +0.391634524643700020, 0.391680530197195060, 0.391726534771488330, 0.391772538366465310, 0.391818540982010910, 0.391864542618010630, 0.391910543274348490, 0.391956542950910040, +0.392002541647580250, 0.392048539364244500, 0.392094536100786980, 0.392140531857093130, 0.392186526633047980, 0.392232520428536900, 0.392278513243444090, 0.392324505077654980, +0.392370495931054660, 0.392416485803528500, 0.392462474694960710, 0.392508462605236700, 0.392554449534242010, 0.392600435481860740, 0.392646420447978370, 0.392692404432479990, +0.392738387435250970, 0.392784369456175560, 0.392830350495139260, 0.392876330552027090, 0.392922309626724530, 0.392968287719115740, 0.393014264829086250, 0.393060240956521090, +0.393106216101305690, 0.393152190263324430, 0.393198163442462610, 0.393244135638605440, 0.393290106851638340, 0.393336077081445520, 0.393382046327912570, 0.393428014590924860, +0.393473981870366750, 0.393519948166123620, 0.393565913478080680, 0.393611877806123330, 0.393657841150135910, 0.393703803510003840, 0.393749764885612310, 0.393795725276846750, +0.393841684683591490, 0.393887643105731990, 0.393933600543153410, 0.393979556995741220, 0.394025512463379690, 0.394071466945954460, 0.394117420443350520, 0.394163372955453450, +0.394209324482147520, 0.394255275023318310, 0.394301224578851250, 0.394347173148630770, 0.394393120732542400, 0.394439067330471180, 0.394485012942302700, 0.394530957567921280, +0.394576901207212450, 0.394622843860061410, 0.394668785526353650, 0.394714726205973530, 0.394760665898806600, 0.394806604604737930, 0.394852542323653240, 0.394898479055436790, +0.394944414799974110, 0.394990349557150400, 0.395036283326851200, 0.395082216108960880, 0.395128147903365090, 0.395174078709948860, 0.395220008528597840, 0.395265937359196460, +0.395311865201630200, 0.395357792055784640, 0.395403717921544220, 0.395449642798794520, 0.395495566687420750, 0.395541489587308390, 0.395587411498341980, 0.395633332420406990, +0.395679252353388690, 0.395725171297172660, 0.395771089251643280, 0.395817006216686200, 0.395862922192186550, 0.395908837178030050, 0.395954751174101060, 0.396000664180285180, +0.396046576196467660, 0.396092487222534040, 0.396138397258368860, 0.396184306303857650, 0.396230214358886110, 0.396276121423338620, 0.396322027497100830, 0.396367932580057980, +0.396413836672095680, 0.396459739773098400, 0.396505641882951730, 0.396551543001541000, 0.396597443128751780, 0.396643342264468570, 0.396689240408577000, 0.396735137560962350, +0.396781033721510250, 0.396826928890105180, 0.396872823066632740, 0.396918716250978300, 0.396964608443027440, 0.397010499642664660, 0.397056389849775590, 0.397102279064246000, +0.397148167285960310, 0.397194054514804160, 0.397239940750662930, 0.397285825993422210, 0.397331710242966540, 0.397377593499181610, 0.397423475761952690, 0.397469357031165480, +0.397515237306704460, 0.397561116588455330, 0.397606994876303410, 0.397652872170134450, 0.397698748469832890, 0.397744623775284470, 0.397790498086374460, 0.397836371402988610, +0.397882243725011460, 0.397928115052328670, 0.397973985384825980, 0.398019854722387990, 0.398065723064900290, 0.398111590412248360, 0.398157456764317800, 0.398203322120993190, +0.398249186482160290, 0.398295049847704420, 0.398340912217511390, 0.398386773591465570, 0.398432633969452890, 0.398478493351358600, 0.398524351737068520, 0.398570209126467120, +0.398616065519440180, 0.398661920915873100, 0.398707775315651600, 0.398753628718660270, 0.398799481124784920, 0.398845332533910800, 0.398891182945923790, 0.398937032360708380, +0.398982880778150420, 0.399028728198135670, 0.399074574620548680, 0.399120420045275260, 0.399166264472200770, 0.399212107901211030, 0.399257950332190640, 0.399303791765025340, +0.399349632199600570, 0.399395471635802140, 0.399441310073514630, 0.399487147512623820, 0.399532983953015170, 0.399578819394574460, 0.399624653837186260, 0.399670487280736510, +0.399716319725110460, 0.399762151170194040, 0.399807981615871830, 0.399853811062029660, 0.399899639508553400, 0.399945466955327620, 0.399991293402238160, 0.400037118849170480, +0.400082943296010410, 0.400128766742642580, 0.400174589188952820, 0.400220410634826610, 0.400266231080149750, 0.400312050524806950, 0.400357868968683970, 0.400403686411666350, +0.400449502853639890, 0.400495318294489310, 0.400541132734100410, 0.400586946172358680, 0.400632758609149990, 0.400678570044359030, 0.400724380477871620, 0.400770189909573640, +0.400815998339349780, 0.400861805767085970, 0.400907612192667630, 0.400953417615980630, 0.400999222036909740, 0.401045025455340760, 0.401090827871159180, 0.401136629284250980, +0.401182429694500800, 0.401228229101794560, 0.401274027506017710, 0.401319824907056260, 0.401365621304794750, 0.401411416699119280, 0.401457211089915220, 0.401503004477068550, +0.401548796860463910, 0.401594588239987340, 0.401640378615524260, 0.401686167986960660, 0.401731956354181240, 0.401777743717071980, 0.401823530075518690, 0.401869315429406180, +0.401915099778620390, 0.401960883123046840, 0.402006665462571520, 0.402052446797079130, 0.402098227126455600, 0.402144006450586510, 0.402189784769357790, 0.402235562082654260, +0.402281338390361790, 0.402327113692365960, 0.402372887988552750, 0.402418661278806930, 0.402464433563014480, 0.402510204841060870, 0.402555975112832250, 0.402601744378213220, +0.402647512637089870, 0.402693279889348110, 0.402739046134872770, 0.402784811373549770, 0.402830575605264810, 0.402876338829903760, 0.402922101047351490, 0.402967862257493980, +0.403013622460216770, 0.403059381655405950, 0.403105139842946210, 0.403150897022723660, 0.403196653194623890, 0.403242408358532870, 0.403288162514335410, 0.403333915661917560, +0.403379667801164970, 0.403425418931963540, 0.403471169054198220, 0.403516918167754920, 0.403562666272519740, 0.403608413368377490, 0.403654159455214270, 0.403699904532915600, +0.403745648601367580, 0.403791391660455020, 0.403837133710063970, 0.403882874750080110, 0.403928614780389440, 0.403974353800876870, 0.404020091811428390, 0.404065828811929710, +0.404111564802266840, 0.404157299782324670, 0.404203033751989240, 0.404248766711146180, 0.404294498659681640, 0.404340229597480500, 0.404385959524428740, 0.404431688440412500, +0.404477416345316590, 0.404523143239027220, 0.404568869121429920, 0.404614593992410900, 0.404660317851854970, 0.404706040699648220, 0.404751762535676410, 0.404797483359825570, +0.404843203171980640, 0.404888921972027690, 0.404934639759852440, 0.404980356535340980, 0.405026072298378230, 0.405071787048850330, 0.405117500786642940, 0.405163213511642200, +0.405208925223733030, 0.405254635922801530, 0.405300345608733460, 0.405346054281414900, 0.405391761940730840, 0.405437468586567370, 0.405483174218810580, 0.405528878837345510, +0.405574582442058240, 0.405620285032834480, 0.405665986609560440, 0.405711687172121030, 0.405757386720402350, 0.405803085254290260, 0.405848782773670870, 0.405894479278429090, +0.405940174768451120, 0.405985869243622680, 0.406031562703830010, 0.406077255148958040, 0.406122946578892920, 0.406168636993520400, 0.406214326392726750, 0.406260014776396840, +0.406305702144416910, 0.406351388496673130, 0.406397073833050460, 0.406442758153435110, 0.406488441457712850, 0.406534123745769920, 0.406579805017491250, 0.406625485272763100, +0.406671164511471170, 0.406716842733501840, 0.406762519938739910, 0.406808196127071700, 0.406853871298383020, 0.406899545452560070, 0.406945218589487840, 0.406990890709052530, +0.407036561811140060, 0.407082231895636580, 0.407127900962427070, 0.407173569011397840, 0.407219236042435100, 0.407264902055423820, 0.407310567050250320, 0.407356231026800410, +0.407401893984960290, 0.407447555924615070, 0.407493216845650930, 0.407538876747953750, 0.407584535631409840, 0.407630193495904130, 0.407675850341322920, 0.407721506167552150, +0.407767160974477960, 0.407812814761985500, 0.407858467529960970, 0.407904119278290290, 0.407949770006859720, 0.407995419715554310, 0.408041068404260350, 0.408086716072863730, +0.408132362721250750, 0.408178008349306400, 0.408223652956917090, 0.408269296543968980, 0.408314939110347270, 0.408360580655938220, 0.408406221180627750, 0.408451860684302060, +0.408497499166846360, 0.408543136628146900, 0.408588773068089610, 0.408634408486560740, 0.408680042883445500, 0.408725676258630100, 0.408771308612000560, 0.408816939943443150, +0.408862570252842950, 0.408908199540086390, 0.408953827805059290, 0.408999455047648010, 0.409045081267737700, 0.409090706465214670, 0.409136330639965300, 0.409181953791874720, +0.409227575920829200, 0.409273197026714770, 0.409318817109417750, 0.409364436168823340, 0.409410054204817800, 0.409455671217287100, 0.409501287206117610, 0.409546902171194550, +0.409592516112404210, 0.409638129029632590, 0.409683740922766050, 0.409729351791689730, 0.409774961636290070, 0.409820570456452980, 0.409866178252064840, 0.409911785023010900, +0.409957390769177480, 0.410002995490450990, 0.410048599186716600, 0.410094201857860720, 0.410139803503769330, 0.410185404124328860, 0.410231003719424450, 0.410276602288942530, +0.410322199832769070, 0.410367796350790570, 0.410413391842892160, 0.410458986308960270, 0.410504579748880940, 0.410550172162540530, 0.410595763549824300, 0.410641353910618680, +0.410686943244809640, 0.410732531552283620, 0.410778118832925920, 0.410823705086622910, 0.410869290313261030, 0.410914874512725570, 0.410960457684902860, 0.411006039829679040, +0.411051620946940530, 0.411097201036572550, 0.411142780098461560, 0.411188358132493600, 0.411233935138555220, 0.411279511116531550, 0.411325086066309080, 0.411370659987773950, +0.411416232880812530, 0.411461804745310130, 0.411507375581153250, 0.411552945388227900, 0.411598514166420570, 0.411644081915616580, 0.411689648635702400, 0.411735214326564070, +0.411780778988088130, 0.411826342620159820, 0.411871905222665700, 0.411917466795492180, 0.411963027338524580, 0.412008586851649430, 0.412054145334752820, 0.412099702787721230, +0.412145259210439980, 0.412190814602795610, 0.412236368964674190, 0.412281922295962280, 0.412327474596545120, 0.412373025866309250, 0.412418576105140880, 0.412464125312926420, +0.412509673489551250, 0.412555220634901960, 0.412600766748864530, 0.412646311831325660, 0.412691855882170560, 0.412737398901285860, 0.412782940888558050, 0.412828481843872440, +0.412874021767115680, 0.412919560658173870, 0.412965098516933530, 0.413010635343280030, 0.413056171137099970, 0.413101705898279490, 0.413147239626705130, 0.413192772322262260, +0.413238303984837460, 0.413283834614316890, 0.413329364210587190, 0.413374892773533620, 0.413420420303042880, 0.413465946799001060, 0.413511472261294750, 0.413556996689809390, +0.413602520084431490, 0.413648042445047710, 0.413693563771543480, 0.413739084063805270, 0.413784603321719400, 0.413830121545172400, 0.413875638734049700, 0.413921154888237890, +0.413966670007623220, 0.414012184092092230, 0.414057697141530400, 0.414103209155824380, 0.414148720134860260, 0.414194230078524790, 0.414239738986703300, 0.414285246859282530, +0.414330753696148580, 0.414376259497188200, 0.414421764262286720, 0.414467267991330880, 0.414512770684206830, 0.414558272340801230, 0.414603772960999590, 0.414649272544688530, +0.414694771091754680, 0.414740268602083460, 0.414785765075561640, 0.414831260512075360, 0.414876754911511330, 0.414922248273755010, 0.414967740598693120, 0.415013231886211810, +0.415058722136197880, 0.415104211348536700, 0.415149699523114980, 0.415195186659819080, 0.415240672758535550, 0.415286157819149960, 0.415331641841548970, 0.415377124825618890, +0.415422606771246370, 0.415468087678317000, 0.415513567546717310, 0.415559046376334170, 0.415604524167053010, 0.415650000918760530, 0.415695476631343040, 0.415740951304687300, +0.415786424938678730, 0.415831897533204100, 0.415877369088149760, 0.415922839603402370, 0.415968309078847520, 0.416013777514371850, 0.416059244909861740, 0.416104711265203930, +0.416150176580283970, 0.416195640854988560, 0.416241104089204010, 0.416286566282817130, 0.416332027435713400, 0.416377487547779650, 0.416422946618902560, 0.416468404648967670, +0.416513861637861800, 0.416559317585471320, 0.416604772491682870, 0.416650226356382160, 0.416695679179455820, 0.416741130960790300, 0.416786581700272380, 0.416832031397787570, +0.416877480053222730, 0.416922927666464160, 0.416968374237398690, 0.417013819765911840, 0.417059264251890440, 0.417104707695220960, 0.417150150095790040, 0.417195591453483340, +0.417241031768187720, 0.417286471039789890, 0.417331909268175430, 0.417377346453231270, 0.417422782594843720, 0.417468217692899600, 0.417513651747284550, 0.417559084757885390, +0.417604516724588480, 0.417649947647280690, 0.417695377525847620, 0.417740806360176130, 0.417786234150152650, 0.417831660895663930, 0.417877086596595670, 0.417922511252834690, +0.417967934864267480, 0.418013357430780770, 0.418058778952260290, 0.418104199428592890, 0.418149618859664950, 0.418195037245363390, 0.418240454585573850, 0.418285870880183150, +0.418331286129078160, 0.418376700332144580, 0.418422113489269280, 0.418467525600338620, 0.418512936665239590, 0.418558346683857830, 0.418603755656080160, 0.418649163581793160, +0.418694570460883600, 0.418739976293237230, 0.418785381078740910, 0.418830784817281140, 0.418876187508744830, 0.418921589153017640, 0.418966989749986470, 0.419012389299537880, +0.419057787801558670, 0.419103185255934540, 0.419148581662552530, 0.419193977021299400, 0.419239371332060960, 0.419284764594724140, 0.419330156809175350, 0.419375547975301580, +0.419420938092988530, 0.419466327162123120, 0.419511715182591950, 0.419557102154281880, 0.419602488077078620, 0.419647872950869140, 0.419693256775539980, 0.419738639550978120, +0.419784021277069210, 0.419829401953700280, 0.419874781580757810, 0.419920160158128830, 0.419965537685699050, 0.420010914163355400, 0.420056289590984840, 0.420101663968473200, +0.420147037295707400, 0.420192409572573980, 0.420237780798959960, 0.420283150974751110, 0.420328520099834350, 0.420373888174096270, 0.420419255197423900, 0.420464621169702960, +0.420509986090820520, 0.420555349960663070, 0.420600712779117650, 0.420646074546070060, 0.420691435261407290, 0.420736794925015920, 0.420782153536783000, 0.420827511096594220, +0.420872867604336730, 0.420918223059897070, 0.420963577463162210, 0.421008930814018020, 0.421054283112351550, 0.421099634358049700, 0.421144984550998410, 0.421190333691084660, +0.421235681778195040, 0.421281028812216630, 0.421326374793035250, 0.421371719720537940, 0.421417063594611340, 0.421462406415142490, 0.421507748182017190, 0.421553088895122550, +0.421598428554345150, 0.421643767159572140, 0.421689104710689270, 0.421734441207583630, 0.421779776650141880, 0.421825111038251150, 0.421870444371797160, 0.421915776650667150, +0.421961107874748000, 0.422006438043925740, 0.422051767158087400, 0.422097095217119630, 0.422142422220909470, 0.422187748169342900, 0.422233073062306950, 0.422278396899688320, +0.422323719681374110, 0.422369041407250180, 0.422414362077203680, 0.422459681691121250, 0.422505000248890040, 0.422550317750395870, 0.422595634195525980, 0.422640949584166980, +0.422686263916205950, 0.422731577191528930, 0.422776889410022950, 0.422822200571575100, 0.422867510676071420, 0.422912819723398950, 0.422958127713444380, 0.423003434646094910, +0.423048740521236480, 0.423094045338756220, 0.423139349098540780, 0.423184651800477430, 0.423229953444452020, 0.423275254030351710, 0.423320553558063310, 0.423365852027473900, +0.423411149438469410, 0.423456445790937110, 0.423501741084763680, 0.423547035319836280, 0.423592328496040950, 0.423637620613264760, 0.423682911671394940, 0.423728201670317380, +0.423773490609919370, 0.423818778490087640, 0.423864065310709300, 0.423909351071670440, 0.423954635772858250, 0.423999919414159380, 0.424045201995461200, 0.424090483516649570, +0.424135763977611710, 0.424181043378234480, 0.424226321718405020, 0.424271598998009370, 0.424316875216934670, 0.424362150375067860, 0.424407424472296010, 0.424452697508505230, +0.424497969483582700, 0.424543240397415260, 0.424588510249890140, 0.424633779040893280, 0.424679046770312040, 0.424724313438033520, 0.424769579043943860, 0.424814843587930260, +0.424860107069879530, 0.424905369489678940, 0.424950630847214520, 0.424995891142373520, 0.425041150375042810, 0.425086408545109600, 0.425131665652459970, 0.425176921696981180, +0.425222176678560100, 0.425267430597083940, 0.425312683452438830, 0.425357935244512040, 0.425403185973190380, 0.425448435638361160, 0.425493684239910460, 0.425538931777725560, +0.425584178251693700, 0.425629423661701030, 0.425674668007634760, 0.425719911289381860, 0.425765153506829530, 0.425810394659863980, 0.425855634748372400, 0.425900873772241730, +0.425946111731359320, 0.425991348625611170, 0.426036584454884680, 0.426081819219066740, 0.426127052918044650, 0.426172285551704500, 0.426217517119933660, 0.426262747622619060, +0.426307977059647960, 0.426353205430906490, 0.426398432736282030, 0.426443658975661890, 0.426488884148932210, 0.426534108255980320, 0.426579331296693120, 0.426624553270958050, +0.426669774178661140, 0.426714994019689820, 0.426760212793931000, 0.426805430501272120, 0.426850647141599200, 0.426895862714799680, 0.426941077220760470, 0.426986290659368990, +0.427031503030511410, 0.427076714334075010, 0.427121924569946910, 0.427167133738014350, 0.427212341838163530, 0.427257548870281890, 0.427302754834256390, 0.427347959729974360, +0.427393163557322100, 0.427438366316186870, 0.427483568006456150, 0.427528768628016090, 0.427573968180754100, 0.427619166664557240, 0.427664364079312850, 0.427709560424907100, +0.427754755701227510, 0.427799949908161000, 0.427845143045595010, 0.427890335113415790, 0.427935526111510700, 0.427980716039766840, 0.428025904898071520, 0.428071092686311110, +0.428116279404372910, 0.428161465052144030, 0.428206649629511940, 0.428251833136362780, 0.428297015572584040, 0.428342196938063140, 0.428387377232686380, 0.428432556456341150, +0.428477734608914530, 0.428522911690293990, 0.428568087700365810, 0.428613262639017330, 0.428658436506135780, 0.428703609301608450, 0.428748781025321770, 0.428793951677163110, +0.428839121257019560, 0.428884289764778600, 0.428929457200326550, 0.428974623563550820, 0.429019788854338560, 0.429064953072577250, 0.429110116218153090, 0.429155278290953680, +0.429200439290866490, 0.429245599217777770, 0.429290758071575070, 0.429335915852145480, 0.429381072559376460, 0.429426228193154400, 0.429471382753366770, 0.429516536239900660, +0.429561688652643660, 0.429606839991481970, 0.429651990256303180, 0.429697139446994500, 0.429742287563443290, 0.429787434605535980, 0.429832580573160090, 0.429877725466202790, +0.429922869284551530, 0.429968012028092710, 0.430013153696713830, 0.430058294290302510, 0.430103433808744990, 0.430148572251928930, 0.430193709619741460, 0.430238845912070120, +0.430283981128801230, 0.430329115269822370, 0.430374248335020800, 0.430419380324283950, 0.430464511237498240, 0.430509641074551250, 0.430554769835330200, 0.430599897519722610, +0.430645024127614850, 0.430690149658894570, 0.430735274113448920, 0.430780397491165420, 0.430825519791930620, 0.430870641015631940, 0.430915761162156690, 0.430960880231392450, +0.431005998223225610, 0.431051115137543740, 0.431096230974234500, 0.431141345733184300, 0.431186459414280690, 0.431231572017410970, 0.431276683542462740, 0.431321793989322360, +0.431366903357877470, 0.431412011648015400, 0.431457118859623620, 0.431502224992588720, 0.431547330046798240, 0.431592434022139370, 0.431637536918499880, 0.431682638735766120, +0.431727739473825810, 0.431772839132566090, 0.431817937711874710, 0.431863035211638050, 0.431908131631743850, 0.431953226972079720, 0.431998321232532070, 0.432043414412988660, +0.432088506513336690, 0.432133597533463860, 0.432178687473256660, 0.432223776332602730, 0.432268864111389320, 0.432313950809504190, 0.432359036426833760, 0.432404120963265800, +0.432449204418687510, 0.432494286792986570, 0.432539368086049540, 0.432584448297764050, 0.432629527428017470, 0.432674605476697500, 0.432719682443690580, 0.432764758328884500, +0.432809833132166870, 0.432854906853424260, 0.432899979492544440, 0.432945051049414610, 0.432990121523922580, 0.433035190915954830, 0.433080259225399110, 0.433125326452142740, +0.433170392596073480, 0.433215457657077810, 0.433260521635043530, 0.433305584529857900, 0.433350646341408740, 0.433395707069582580, 0.433440766714267120, 0.433485825275349730, +0.433530882752718230, 0.433575939146259080, 0.433620994455860110, 0.433666048681408620, 0.433711101822792430, 0.433756153879898080, 0.433801204852613360, 0.433846254740826000, +0.433891303544422620, 0.433936351263291000, 0.433981397897318490, 0.434026443446392850, 0.434071487910400730, 0.434116531289229890, 0.434161573582767750, 0.434206614790902060, +0.434251654913519410, 0.434296693950507630, 0.434341731901754120, 0.434386768767146660, 0.434431804546571930, 0.434476839239917640, 0.434521872847071280, 0.434566905367920640, +0.434611936802352330, 0.434656967150254150, 0.434701996411513970, 0.434747024586018440, 0.434792051673655310, 0.434837077674312010, 0.434882102587876460, 0.434927126414235250, +0.434972149153276260, 0.435017170804886890, 0.435062191368954960, 0.435107210845367130, 0.435152229234011310, 0.435197246534774930, 0.435242262747545790, 0.435287277872210670, +0.435332291908657300, 0.435377304856773170, 0.435422316716446210, 0.435467327487563060, 0.435512337170011590, 0.435557345763679720, 0.435602353268454030, 0.435647359684222470, +0.435692365010872500, 0.435737369248292040, 0.435782372396367750, 0.435827374454987540, 0.435872375424038890, 0.435917375303409680, 0.435962374092986660, 0.436007371792657690, +0.436052368402310260, 0.436097363921832350, 0.436142358351110650, 0.436187351690032980, 0.436232343938486980, 0.436277335096360520, 0.436322325163540300, 0.436367314139914310, +0.436412302025370400, 0.436457288819795340, 0.436502274523077110, 0.436547259135103120, 0.436592242655761410, 0.436637225084938680, 0.436682206422522920, 0.436727186668401660, +0.436772165822462750, 0.436817143884593080, 0.436862120854680570, 0.436907096732612740, 0.436952071518277580, 0.436997045211561800, 0.437042017812353410, 0.437086989320540020, +0.437131959736009550, 0.437176929058648740, 0.437221897288345650, 0.437266864424987800, 0.437311830468463170, 0.437356795418658570, 0.437401759275462040, 0.437446722038761450, +0.437491683708443660, 0.437536644284396700, 0.437581603766508060, 0.437626562154665890, 0.437671519448756870, 0.437716475648669060, 0.437761430754290030, 0.437806384765507870, +0.437851337682209350, 0.437896289504282440, 0.437941240231614850, 0.437986189864094540, 0.438031138401608340, 0.438076085844044340, 0.438121032191290120, 0.438165977443233660, +0.438210921599761940, 0.438255864660762830, 0.438300806626124530, 0.438345747495733800, 0.438390687269478660, 0.438435625947246830, 0.438480563528926340, 0.438525500014404050, +0.438570435403567990, 0.438615369696305820, 0.438660302892505680, 0.438705234992054330, 0.438750165994839900, 0.438795095900750110, 0.438840024709672930, 0.438884952421495280, +0.438929879036105310, 0.438974804553390610, 0.439019728973239260, 0.439064652295538260, 0.439109574520175570, 0.439154495647039340, 0.439199415676016500, 0.439244334606995130, +0.439289252439862890, 0.439334169174507960, 0.439379084810817170, 0.439423999348678710, 0.439468912787980230, 0.439513825128609870, 0.439558736370454510, 0.439603646513402340, +0.439648555557341060, 0.439693463502158820, 0.439738370347742490, 0.439783276093980210, 0.439828180740759740, 0.439873084287969280, 0.439917986735495650, 0.439962888083227090, +0.440007788331051310, 0.440052687478856400, 0.440097585526529440, 0.440142482473958490, 0.440187378321031720, 0.440232273067636130, 0.440277166713659850, 0.440322059258990650, +0.440366950703516720, 0.440411841047125000, 0.440456730289703670, 0.440501618431140500, 0.440546505471323730, 0.440591391410140250, 0.440636276247478310, 0.440681159983225660, +0.440726042617270550, 0.440770924149499920, 0.440815804579801960, 0.440860683908064540, 0.440905562134175750, 0.440950439258022690, 0.440995315279493540, 0.441040190198476460, +0.441085064014858530, 0.441129936728527900, 0.441174808339372500, 0.441219678847280420, 0.441264548252138790, 0.441309416553835760, 0.441354283752259210, 0.441399149847297330, +0.441444014838837160, 0.441488878726767010, 0.441533741510974630, 0.441578603191348280, 0.441623463767775060, 0.441668323240143160, 0.441713181608340440, 0.441758038872255180, +0.441802895031774390, 0.441847750086786450, 0.441892604037179450, 0.441937456882840580, 0.441982308623658060, 0.442027159259519740, 0.442072008790313940, 0.442116857215927750, +0.442161704536249370, 0.442206550751166770, 0.442251395860568160, 0.442296239864340690, 0.442341082762372610, 0.442385924554551830, 0.442430765240766630, 0.442475604820904090, +0.442520443294852570, 0.442565280662499950, 0.442610116923734530, 0.442654952078443350, 0.442699786126514890, 0.442744619067837300, 0.442789450902297770, 0.442834281629784610, +0.442879111250185750, 0.442923939763389560, 0.442968767169283070, 0.443013593467754650, 0.443058418658692280, 0.443103242741984260, 0.443148065717517750, 0.443192887585181050, +0.443237708344862150, 0.443282527996449350, 0.443327346539829860, 0.443372163974891990, 0.443416980301523660, 0.443461795519613340, 0.443506609629048140, 0.443551422629716360, +0.443596234521506090, 0.443641045304305590, 0.443685854978002110, 0.443730663542483970, 0.443775470997639590, 0.443820277343356110, 0.443865082579521950, 0.443909886706025050, +0.443954689722753870, 0.443999491629595570, 0.444044292426438500, 0.444089092113170770, 0.444133890689680620, 0.444178688155855430, 0.444223484511583440, 0.444268279756752820, +0.444313073891251850, 0.444357866914967810, 0.444402658827789070, 0.444447449629603750, 0.444492239320300130, 0.444537027899765570, 0.444581815367888430, 0.444626601724557150, +0.444671386969658970, 0.444716171103082260, 0.444760954124715220, 0.444805736034446120, 0.444850516832162310, 0.444895296517752230, 0.444940075091103890, 0.444984852552105740, +0.445029628900645070, 0.445074404136610370, 0.445119178259889610, 0.445163951270371280, 0.445208723167942740, 0.445253493952492360, 0.445298263623908230, 0.445343032182078880, +0.445387799626891510, 0.445432565958234660, 0.445477331175996800, 0.445522095280065260, 0.445566858270328380, 0.445611620146674440, 0.445656380908991790, 0.445701140557167810, +0.445745899091091020, 0.445790656510649420, 0.445835412815731640, 0.445880168006224880, 0.445924922082017670, 0.445969675042998230, 0.446014426889054960, 0.446059177620075240, +0.446103927235947550, 0.446148675736560090, 0.446193423121801320, 0.446238169391558580, 0.446282914545720390, 0.446327658584174950, 0.446372401506810790, 0.446417143313515170, +0.446461884004176750, 0.446506623578683980, 0.446551362036924250, 0.446596099378786140, 0.446640835604157740, 0.446685570712927690, 0.446730304704983320, 0.446775037580213140, +0.446819769338505420, 0.446864499979748640, 0.446909229503830220, 0.446953957910638740, 0.446998685200062360, 0.447043411371989610, 0.447088136426308010, 0.447132860362906060, +0.447177583181671940, 0.447222304882494260, 0.447267025465260430, 0.447311744929859030, 0.447356463276178620, 0.447401180504106710, 0.447445896613531850, 0.447490611604342230, +0.447535325476426490, 0.447580038229672020, 0.447624749863967500, 0.447669460379201080, 0.447714169775261410, 0.447758878052035900, 0.447803585209413210, 0.447848291247281540, +0.447892996165529580, 0.447937699964044640, 0.447982402642715550, 0.448027104201430440, 0.448071804640077900, 0.448116503958545520, 0.448161202156721840, 0.448205899234495610, +0.448250595191754140, 0.448295290028386250, 0.448339983744280140, 0.448384676339324440, 0.448429367813406700, 0.448474058166415500, 0.448518747398239160, 0.448563435508766320, +0.448608122497884510, 0.448652808365482440, 0.448697493111448300, 0.448742176735670850, 0.448786859238037520, 0.448831540618437110, 0.448876220876757770, 0.448920900012888310, +0.448965578026716220, 0.449010254918130180, 0.449054930687018520, 0.449099605333269870, 0.449144278856771880, 0.449188951257413150, 0.449233622535082420, 0.449278292689667290, +0.449322961721056400, 0.449367629629138120, 0.449412296413801150, 0.449456962074933020, 0.449501626612422540, 0.449546290026157980, 0.449590952316028080, 0.449635613481920380, +0.449680273523723640, 0.449724932441326270, 0.449769590234616930, 0.449814246903483210, 0.449858902447813900, 0.449903556867497330, 0.449948210162422260, 0.449992862332476260, +0.450037513377548100, 0.450082163297526590, 0.450126812092299270, 0.450171459761754880, 0.450216106305781850, 0.450260751724268990, 0.450305396017103790, 0.450350039184175150, +0.450394681225371410, 0.450439322140581360, 0.450483961929692590, 0.450528600592593920, 0.450573238129173770, 0.450617874539320900, 0.450662509822922940, 0.450707143979868720, +0.450751777010046650, 0.450796408913345490, 0.450841039689652940, 0.450885669338857820, 0.450930297860848930, 0.450974925255513860, 0.451019551522741480, 0.451064176662420210, +0.451108800674438930, 0.451153423558685210, 0.451198045315047980, 0.451242665943415610, 0.451287285443676970, 0.451331903815719690, 0.451376521059432710, 0.451421137174704390, +0.451465752161423650, 0.451510366019478140, 0.451554978748756660, 0.451599590349147760, 0.451644200820540300, 0.451688810162821920, 0.451733418375881550, 0.451778025459607990, +0.451822631413889010, 0.451867236238613410, 0.451911839933669730, 0.451956442498946900, 0.452001043934332490, 0.452045644239715490, 0.452090243414984440, 0.452134841460028080, +0.452179438374734290, 0.452224034158991870, 0.452268628812689420, 0.452313222335715750, 0.452357814727958610, 0.452402405989306980, 0.452446996119649280, 0.452491585118874550, +0.452536172986870430, 0.452580759723525850, 0.452625345328729390, 0.452669929802369970, 0.452714513144335360, 0.452759095354514420, 0.452803676432796180, 0.452848256379068340, +0.452892835193219820, 0.452937412875139220, 0.452981989424715510, 0.453026564841836450, 0.453071139126390960, 0.453115712278267580, 0.453160284297355390, 0.453204855183542030, +0.453249424936716550, 0.453293993556767530, 0.453338561043583890, 0.453383127397053500, 0.453427692617065230, 0.453472256703507770, 0.453516819656270050, 0.453561381475239890, +0.453605942160306250, 0.453650501711358180, 0.453695060128283480, 0.453739617410971070, 0.453784173559309670, 0.453828728573188230, 0.453873282452494530, 0.453917835197117650, +0.453962386806946230, 0.454006937281869190, 0.454051486621774410, 0.454096034826550920, 0.454140581896087300, 0.454185127830272710, 0.454229672628994830, 0.454274216292142820, +0.454318758819605210, 0.454363300211271140, 0.454407840467028420, 0.454452379586766100, 0.454496917570373250, 0.454541454417737630, 0.454585990128748450, 0.454630524703294290, +0.454675058141264190, 0.454719590442546060, 0.454764121607028950, 0.454808651634601550, 0.454853180525152890, 0.454897708278570900, 0.454942234894744610, 0.454986760373562780, +0.455031284714914440, 0.455075807918687460, 0.455120329984770980, 0.455164850913053700, 0.455209370703424650, 0.455253889355771770, 0.455298406869984180, 0.455342923245950600, +0.455387438483560110, 0.455431952582700580, 0.455476465543261210, 0.455520977365131030, 0.455565488048198080, 0.455609997592351320, 0.455654505997479640, 0.455699013263472060, +0.455743519390216570, 0.455788024377602240, 0.455832528225517900, 0.455877030933852620, 0.455921532502494340, 0.455966032931332250, 0.456010532220255120, 0.456055030369151960, +0.456099527377910930, 0.456144023246421000, 0.456188517974571050, 0.456233011562250210, 0.456277504009346410, 0.456321995315748910, 0.456366485481346780, 0.456410974506028020, +0.456455462389681820, 0.456499949132196990, 0.456544434733462730, 0.456588919193366920, 0.456633402511798850, 0.456677884688647230, 0.456722365723801320, 0.456766845617149090, +0.456811324368579800, 0.456855801977982150, 0.456900278445245390, 0.456944753770257510, 0.456989227952907810, 0.457033700993084990, 0.457078172890678370, 0.457122643645575870, +0.457167113257666790, 0.457211581726840290, 0.457256049052984450, 0.457300515235988530, 0.457344980275741280, 0.457389444172132010, 0.457433906925048710, 0.457478368534380620, +0.457522829000016620, 0.457567288321845960, 0.457611746499756670, 0.457656203533638060, 0.457700659423378900, 0.457745114168868480, 0.457789567769994910, 0.457834020226647380, +0.457878471538714800, 0.457922921706086510, 0.457967370728650460, 0.458011818606295970, 0.458056265338912360, 0.458100710926387660, 0.458145155368611220, 0.458189598665471880, +0.458234040816858920, 0.458278481822660510, 0.458322921682765840, 0.458367360397063940, 0.458411797965443960, 0.458456234387794090, 0.458500669664003660, 0.458545103793961570, +0.458589536777557090, 0.458633968614678420, 0.458678399305214760, 0.458722828849055130, 0.458767257246088860, 0.458811684496204020, 0.458856110599289990, 0.458900535555235630, +0.458944959363930370, 0.458989382025262290, 0.459033803539120820, 0.459078223905395160, 0.459122643123973610, 0.459167061194745370, 0.459211478117599550, 0.459255893892425380, +0.459300308519111130, 0.459344721997546060, 0.459389134327619240, 0.459433545509219940, 0.459477955542236360, 0.459522364426557920, 0.459566772162073590, 0.459611178748672690, +0.459655584186243470, 0.459699988474675300, 0.459744391613857160, 0.459788793603678410, 0.459833194444027260, 0.459877594134793180, 0.459921992675865480, 0.459966390067132410, +0.460010786308483350, 0.460055181399807330, 0.460099575340993770, 0.460143968131930870, 0.460188359772508050, 0.460232750262614340, 0.460277139602139120, 0.460321527790970690, +0.460365914828998410, 0.460410300716111330, 0.460454685452198920, 0.460499069037149430, 0.460543451470852240, 0.460587832753196420, 0.460632212884071410, 0.460676591863365460, +0.460720969690968040, 0.460765346366768640, 0.460809721890655390, 0.460854096262517890, 0.460898469482245170, 0.460942841549726650, 0.460987212464850580, 0.461031582227506560, +0.461075950837583510, 0.461120318294971020, 0.461164684599557340, 0.461209049751231950, 0.461253413749883930, 0.461297776595402780, 0.461342138287676780, 0.461386498826595440, +0.461430858212047880, 0.461475216443923530, 0.461519573522110760, 0.461563929446499040, 0.461608284216977530, 0.461652637833435690, 0.461696990295761830, 0.461741341603845560, +0.461785691757576280, 0.461830040756842360, 0.461874388601533400, 0.461918735291538430, 0.461963080826747030, 0.462007425207047520, 0.462051768432329420, 0.462096110502481950, +0.462140451417394570, 0.462184791176955710, 0.462229129781054790, 0.462273467229581130, 0.462317803522424130, 0.462362138659472290, 0.462406472640615070, 0.462450805465741690, +0.462495137134741660, 0.462539467647503420, 0.462583797003916500, 0.462628125203870480, 0.462672452247253730, 0.462716778133955840, 0.462761102863866070, 0.462805426436873890, +0.462849748852867780, 0.462894070111737280, 0.462938390213371580, 0.462982709157660320, 0.463027026944491940, 0.463071343573755900, 0.463115659045341580, 0.463159973359138500, +0.463204286515035040, 0.463248598512920880, 0.463292909352685240, 0.463337219034217760, 0.463381527557406800, 0.463425834922142010, 0.463470141128313030, 0.463514446175808340, +0.463558750064517470, 0.463603052794329780, 0.463647354365134820, 0.463691654776821120, 0.463735954029278250, 0.463780252122395490, 0.463824549056062520, 0.463868844830167770, +0.463913139444600890, 0.463957432899251180, 0.464001725194008290, 0.464046016328760690, 0.464090306303398040, 0.464134595117809630, 0.464178882771885130, 0.464223169265512990, +0.464267454598582980, 0.464311738770984690, 0.464356021782606710, 0.464400303633338620, 0.464444584323069790, 0.464488863851689910, 0.464533142219087480, 0.464577419425152180, +0.464621695469773330, 0.464665970352840630, 0.464710244074242610, 0.464754516633869020, 0.464798788031609070, 0.464843058267352620, 0.464887327340988090, 0.464931595252405240, +0.464975862001493380, 0.465020127588142260, 0.465064392012240480, 0.465108655273677670, 0.465152917372343270, 0.465197178308126960, 0.465241438080917280, 0.465285696690603990, +0.465329954137076900, 0.465374210420224530, 0.465418465539936600, 0.465462719496102520, 0.465506972288612040, 0.465551223917353760, 0.465595474382217380, 0.465639723683092310, +0.465683971819868370, 0.465728218792434090, 0.465772464600679230, 0.465816709244493250, 0.465860952723765880, 0.465905195038385730, 0.465949436188242580, 0.465993676173225850, +0.466037914993225330, 0.466082152648129630, 0.466126389137828560, 0.466170624462211860, 0.466214858621168240, 0.466259091614587510, 0.466303323442358970, 0.466347554104372560, +0.466391783600516860, 0.466436011930681740, 0.466480239094756550, 0.466524465092631180, 0.466568689924194260, 0.466612913589335600, 0.466657136087944620, 0.466701357419911260, +0.466745577585124080, 0.466789796583472970, 0.466834014414847340, 0.466878231079137060, 0.466922446576230830, 0.466966660906018520, 0.467010874068389930, 0.467055086063233700, +0.467099296890439830, 0.467143506549897670, 0.467187715041497200, 0.467231922365127010, 0.467276128520677010, 0.467320333508036700, 0.467364537327095930, 0.467408739977743400, +0.467452941459869100, 0.467497141773362380, 0.467541340918113220, 0.467585538894010330, 0.467629735700943570, 0.467673931338802470, 0.467718125807476960, 0.467762319106855730, +0.467806511236828700, 0.467850702197285420, 0.467894891988115740, 0.467939080609208410, 0.467983268060453430, 0.468027454341740650, 0.468071639452958880, 0.468115823393997990, +0.468160006164747510, 0.468204187765097420, 0.468248368194936480, 0.468292547454154660, 0.468336725542641390, 0.468380902460286740, 0.468425078206979480, 0.468469252782609480, +0.468513426187066370, 0.468557598420240030, 0.468601769482019370, 0.468645939372294260, 0.468690108090954290, 0.468734275637889440, 0.468778442012988570, 0.468822607216141550, +0.468866771247238360, 0.468910934106167910, 0.468955095792820130, 0.468999256307084560, 0.469043415648851270, 0.469087573818009030, 0.469131730814447920, 0.469175886638057430, +0.469220041288727630, 0.469264194766347340, 0.469308347070806540, 0.469352498201994870, 0.469396648159802370, 0.469440796944117830, 0.469484944554831360, 0.469529090991832490, +0.469573236255011240, 0.469617380344256540, 0.469661523259458420, 0.469705665000506870, 0.469749805567290730, 0.469793944959700120, 0.469838083177624650, 0.469882220220954330, +0.469926356089578110, 0.469970490783385930, 0.470014624302267590, 0.470058756646113070, 0.470102887814811240, 0.470147017808252190, 0.470191146626325660, 0.470235274268921590, +0.470279400735928940, 0.470323526027237810, 0.470367650142737900, 0.470411773082319180, 0.470455894845870690, 0.470500015433282460, 0.470544134844444570, 0.470588253079245960, +0.470632370137576690, 0.470676486019326550, 0.470720600724385540, 0.470764714252642660, 0.470808826603987980, 0.470852937778311220, 0.470897047775502560, 0.470941156595450830, +0.470985264238046260, 0.471029370703178460, 0.471073475990737680, 0.471117580100612830, 0.471161683032694010, 0.471205784786870970, 0.471249885363033860, 0.471293984761071650, +0.471338082980874480, 0.471382180022332120, 0.471426275885334700, 0.471470370569771200, 0.471514464075531770, 0.471558556402506550, 0.471602647550584560, 0.471646737519655910, +0.471690826309610460, 0.471734913920338340, 0.471779000351728540, 0.471823085603671260, 0.471867169676056240, 0.471911252568773700, 0.471955334281712600, 0.471999414814763210, +0.472043494167815270, 0.472087572340758990, 0.472131649333483390, 0.472175725145878630, 0.472219799777834570, 0.472263873229241460, 0.472307945499988220, 0.472352016589965120, +0.472396086499062400, 0.472440155227169030, 0.472484222774175290, 0.472528289139971030, 0.472572354324446390, 0.472616418327490460, 0.472660481148993510, 0.472704542788845380, +0.472748603246936290, 0.472792662523155270, 0.472836720617392570, 0.472880777529538110, 0.472924833259482090, 0.472968887807113600, 0.473012941172322900, 0.473056993354999840, +0.473101044355034640, 0.473145094172316480, 0.473189142806735570, 0.473233190258182220, 0.473277236526545520, 0.473321281611715660, 0.473365325513582680, 0.473409368232036720, +0.473453409766966930, 0.473497450118263660, 0.473541489285816740, 0.473585527269516530, 0.473629564069252050, 0.473673599684913740, 0.473717634116391340, 0.473761667363575280, +0.473805699426354700, 0.473849730304619850, 0.473893759998260670, 0.473937788507167450, 0.473981815831229390, 0.474025841970336810, 0.474069866924379580, 0.474113890693248110, +0.474157913276831540, 0.474201934675020140, 0.474245954887704320, 0.474289973914773230, 0.474333991756117180, 0.474378008411626200, 0.474422023881190540, 0.474466038164699460, +0.474510051262043260, 0.474554063173111940, 0.474598073897795850, 0.474642083435984190, 0.474686091787567320, 0.474730098952435230, 0.474774104930478280, 0.474818109721585670, +0.474862113325647820, 0.474906115742554650, 0.474950116972196580, 0.474994117014462810, 0.475038115869243830, 0.475082113536429870, 0.475126110015910260, 0.475170105307575360, +0.475214099411315210, 0.475258092327020210, 0.475302084054579580, 0.475346074593883780, 0.475390063944822750, 0.475434052107286950, 0.475478039081165650, 0.475522024866349200, +0.475566009462727760, 0.475609992870191680, 0.475653975088630170, 0.475697956117933750, 0.475741935957992470, 0.475785914608696680, 0.475829892069935760, 0.475873868341600110, +0.475917843423580180, 0.475961817315765260, 0.476005790018045770, 0.476049761530311810, 0.476093731852453850, 0.476137700984361150, 0.476181668925924170, 0.476225635677033080, +0.476269601237578280, 0.476313565607449090, 0.476357528786535980, 0.476401490774728990, 0.476445451571918750, 0.476489411177994430, 0.476533369592846650, 0.476577326816365390, +0.476621282848441190, 0.476665237688963410, 0.476709191337822580, 0.476753143794909070, 0.476797095060112420, 0.476841045133322980, 0.476884994014430910, 0.476928941703326780, +0.476972888199899860, 0.477016833504040780, 0.477060777615639590, 0.477104720534586800, 0.477148662260771850, 0.477192602794085260, 0.477236542134417190, 0.477280480281658090, +0.477324417235697460, 0.477368352996425770, 0.477412287563733160, 0.477456220937510280, 0.477500153117646430, 0.477544084104032150, 0.477588013896557750, 0.477631942495113650, +0.477675869899589320, 0.477719796109875310, 0.477763721125862180, 0.477807644947439380, 0.477851567574497430, 0.477895489006926630, 0.477939409244617470, 0.477983328287459370, +0.478027246135342980, 0.478071162788158480, 0.478115078245796410, 0.478158992508146310, 0.478202905575098700, 0.478246817446543850, 0.478290728122372330, 0.478334637602473630, +0.478378545886738280, 0.478422452975056590, 0.478466358867319200, 0.478510263563415470, 0.478554167063236110, 0.478598069366671710, 0.478641970473611730, 0.478685870383946830, +0.478729769097567260, 0.478773666614363710, 0.478817562934225560, 0.478861458057043500, 0.478905351982707780, 0.478949244711109060, 0.478993136242136910, 0.479037026575681870, +0.479080915711634250, 0.479124803649884750, 0.479168690390322840, 0.479212575932839220, 0.479256460277324160, 0.479300343423668340, 0.479344225371761250, 0.479388106121493630, +0.479431985672756130, 0.479475864025438240, 0.479519741179430690, 0.479563617134623810, 0.479607491890908290, 0.479651365448173660, 0.479695237806310570, 0.479739108965209440, +0.479782978924760910, 0.479826847684854510, 0.479870715245381000, 0.479914581606230740, 0.479958446767294380, 0.480002310728461560, 0.480046173489622920, 0.480090035050668830, +0.480133895411490100, 0.480177754571976200, 0.480221612532017890, 0.480265469291505600, 0.480309324850330010, 0.480353179208380720, 0.480397032365548480, 0.480440884321724050, +0.480484735076797010, 0.480528584630658120, 0.480572432983197790, 0.480616280134306790, 0.480660126083874650, 0.480703970831792230, 0.480747814377949890, 0.480791656722238390, +0.480835497864547380, 0.480879337804767600, 0.480923176542789490, 0.480967014078503790, 0.481010850411800190, 0.481054685542569470, 0.481098519470702040, 0.481142352196088700, +0.481186183718619100, 0.481230014038184000, 0.481273843154674310, 0.481317671067979570, 0.481361497777990700, 0.481405323284598060, 0.481449147587692470, 0.481492970687163680, +0.481536792582902440, 0.481580613274799230, 0.481624432762744860, 0.481668251046629030, 0.481712068126342540, 0.481755884001775940, 0.481799698672819960, 0.481843512139364380, +0.481887324401300000, 0.481931135458517290, 0.481974945310907180, 0.482018753958359300, 0.482062561400764530, 0.482106367638013730, 0.482150172669996660, 0.482193976496604120, +0.482237779117726690, 0.482281580533255150, 0.482325380743079290, 0.482369179747089980, 0.482412977545177760, 0.482456774137233420, 0.482500569523146790, 0.482544363702808730, +0.482588156676109710, 0.482631948442940770, 0.482675739003191550, 0.482719528356752970, 0.482763316503515560, 0.482807103443370240, 0.482850889176206780, 0.482894673701916130, +0.482938457020389120, 0.482982239131515670, 0.483026020035186520, 0.483069799731292380, 0.483113578219724120, 0.483157355500371530, 0.483201131573125550, 0.483244906437876760, +0.483288680094516090, 0.483332452542933280, 0.483376223783019370, 0.483419993814664940, 0.483463762637760860, 0.483507530252197000, 0.483551296657864340, 0.483595061854653400, +0.483638825842455210, 0.483682588621159590, 0.483726350190657460, 0.483770110550839460, 0.483813869701596620, 0.483857627642818640, 0.483901384374396670, 0.483945139896221570, +0.483988894208183250, 0.484032647310172700, 0.484076399202080510, 0.484120149883797760, 0.484163899355214200, 0.484207647616220930, 0.484251394666708520, 0.484295140506568020, +0.484338885135689230, 0.484382628553963300, 0.484426370761280760, 0.484470111757532680, 0.484513851542608950, 0.484557590116400590, 0.484601327478798250, 0.484645063629693010, +0.484688798568974680, 0.484732532296534350, 0.484776264812263100, 0.484819996116050810, 0.484863726207788500, 0.484907455087366880, 0.484951182754677020, 0.484994909209608800, +0.485038634452053310, 0.485082358481901290, 0.485126081299043720, 0.485169802903370530, 0.485213523294772850, 0.485257242473141390, 0.485300960438367180, 0.485344677190340190, +0.485388392728951510, 0.485432107054091900, 0.485475820165652330, 0.485519532063522830, 0.485563242747594550, 0.485606952217758510, 0.485650660473904710, 0.485694367515924260, +0.485738073343707940, 0.485781777957146780, 0.485825481356130790, 0.485869183540551090, 0.485912884510298460, 0.485956584265263950, 0.486000282805337640, 0.486043980130410610, +0.486087676240373630, 0.486131371135117840, 0.486175064814533260, 0.486218757278510990, 0.486262448526941840, 0.486306138559716940, 0.486349827376726330, 0.486393514977861150, +0.486437201363012160, 0.486480886532070560, 0.486524570484926370, 0.486568253221470740, 0.486611934741594860, 0.486655615045188780, 0.486699294132143630, 0.486742972002350280, +0.486786648655699870, 0.486830324092082490, 0.486873998311389280, 0.486917671313511050, 0.486961343098339050, 0.487005013665763260, 0.487048683015675000, 0.487092351147965010, +0.487136018062524490, 0.487179683759243590, 0.487223348238013440, 0.487267011498724980, 0.487310673541269330, 0.487354334365536600, 0.487397993971418090, 0.487441652358804930, +0.487485309527587280, 0.487528965477656340, 0.487572620208902960, 0.487616273721218460, 0.487659926014492870, 0.487703577088617500, 0.487747226943483160, 0.487790875578981150, +0.487834522995001520, 0.487878169191435620, 0.487921814168174320, 0.487965457925108810, 0.488009100462129310, 0.488052741779127050, 0.488096381875992970, 0.488140020752618310, +0.488183658408893160, 0.488227294844708890, 0.488270930059956810, 0.488314564054526950, 0.488358196828310720, 0.488401828381199000, 0.488445458713083090, 0.488489087823853140, +0.488532715713400510, 0.488576342381616070, 0.488619967828391120, 0.488663592053615870, 0.488707215057181680, 0.488750836838979460, 0.488794457398900480, 0.488838076736835050, +0.488881694852674350, 0.488925311746309430, 0.488968927417631650, 0.489012541866531150, 0.489056155092899290, 0.489099767096627390, 0.489143377877605760, 0.489186987435725640, +0.489230595770878070, 0.489274202882954420, 0.489317808771844830, 0.489361413437440720, 0.489405016879633110, 0.489448619098313330, 0.489492220093371620, 0.489535819864699350, +0.489579418412187550, 0.489623015735727530, 0.489666611835209650, 0.489710206710525230, 0.489753800361565240, 0.489797392788221210, 0.489840983990383280, 0.489884573967942880, +0.489928162720791040, 0.489971750248819230, 0.490015336551917590, 0.490058921629977660, 0.490102505482890800, 0.490146088110547270, 0.490189669512838540, 0.490233249689655650, +0.490276828640890010, 0.490320406366431930, 0.490363982866172780, 0.490407558140003700, 0.490451132187816110, 0.490494705009500320, 0.490538276604947750, 0.490581846974049500, +0.490625416116697020, 0.490668984032780590, 0.490712550722191720, 0.490756116184821510, 0.490799680420561320, 0.490843243429301580, 0.490886805210933750, 0.490930365765349260, +0.490973925092438530, 0.491017483192092930, 0.491061040064203650, 0.491104595708662110, 0.491148150125358730, 0.491191703314184990, 0.491235255275031980, 0.491278806007791170, +0.491322355512353040, 0.491365903788608950, 0.491409450836450160, 0.491452996655768080, 0.491496541246453140, 0.491540084608396880, 0.491583626741490360, 0.491627167645625200, +0.491670707320691740, 0.491714245766581460, 0.491757782983185950, 0.491801318970395640, 0.491844853728102050, 0.491888387256196270, 0.491931919554569940, 0.491975450623113430, +0.492018980461718270, 0.492062509070275660, 0.492106036448677180, 0.492149562596813190, 0.492193087514575360, 0.492236611201854750, 0.492280133658543060, 0.492323654884530560, +0.492367174879708990, 0.492410693643969500, 0.492454211177203620, 0.492497727479301820, 0.492541242550155740, 0.492584756389656540, 0.492628268997695800, 0.492671780374164040, +0.492715290518952800, 0.492758799431953720, 0.492802307113057280, 0.492845813562155070, 0.492889318779138330, 0.492932822763898660, 0.492976325516326590, 0.493019827036313640, +0.493063327323751190, 0.493106826378530760, 0.493150324200542890, 0.493193820789679220, 0.493237316145831000, 0.493280810268889870, 0.493324303158746310, 0.493367794815292030, +0.493411285238418260, 0.493454774428016610, 0.493498262383977700, 0.493541749106193080, 0.493585234594554500, 0.493628718848952490, 0.493672201869278630, 0.493715683655424290, +0.493759164207281110, 0.493802643524739630, 0.493846121607691530, 0.493889598456028140, 0.493933074069641150, 0.493976548448421090, 0.494020021592259660, 0.494063493501048170, +0.494106964174678360, 0.494150433613040730, 0.494193901816027010, 0.494237368783528530, 0.494280834515437030, 0.494324299011643040, 0.494367762272038320, 0.494411224296514570, +0.494454685084962380, 0.494498144637273480, 0.494541602953339210, 0.494585060033051300, 0.494628515876300410, 0.494671970482978170, 0.494715423852976070, 0.494758875986185730, +0.494802326882497870, 0.494845776541804170, 0.494889224963996010, 0.494932672148965190, 0.494976118096602300, 0.495019562806799100, 0.495063006279447050, 0.495106448514437800, +0.495149889511662060, 0.495193329271011620, 0.495236767792378240, 0.495280205075652570, 0.495323641120726350, 0.495367075927491070, 0.495410509495838420, 0.495453941825659160, +0.495497372916845040, 0.495540802769287470, 0.495584231382878330, 0.495627658757508190, 0.495671084893068880, 0.495714509789451860, 0.495757933446549000, 0.495801355864250890, +0.495844777042449390, 0.495888196981035980, 0.495931615679902400, 0.495975033138939430, 0.496018449358038900, 0.496061864337092210, 0.496105278075991250, 0.496148690574626740, +0.496192101832890480, 0.496235511850674380, 0.496278920627869100, 0.496322328164366500, 0.496365734460058050, 0.496409139514835730, 0.496452543328590120, 0.496495945901213150, +0.496539347232596350, 0.496582747322631520, 0.496626146171209480, 0.496669543778222090, 0.496712940143560770, 0.496756335267117540, 0.496799729148783060, 0.496843121788449300, +0.496886513186007680, 0.496929903341350230, 0.496973292254367590, 0.497016679924951690, 0.497060066352994550, 0.497103451538386810, 0.497146835481020450, 0.497190218180787010, +0.497233599637578410, 0.497276979851285380, 0.497320358821799920, 0.497363736549013610, 0.497407113032818320, 0.497450488273104840, 0.497493862269765160, 0.497537235022690870, +0.497580606531773830, 0.497623976796904840, 0.497667345817976000, 0.497710713594878730, 0.497754080127505110, 0.497797445415745890, 0.497840809459493050, 0.497884172258638570, +0.497927533813073250, 0.497970894122689130, 0.498014253187377740, 0.498057611007031160, 0.498100967581540100, 0.498144322910796690, 0.498187676994692410, 0.498231029833119340, +0.498274381425968360, 0.498317731773131380, 0.498361080874500100, 0.498404428729966430, 0.498447775339421360, 0.498491120702756860, 0.498534464819864580, 0.498577807690636480, +0.498621149314963490, 0.498664489692737580, 0.498707828823850510, 0.498751166708194250, 0.498794503345659670, 0.498837838736138790, 0.498881172879523770, 0.498924505775705410, +0.498967837424575730, 0.499011167826026560, 0.499054496979949800, 0.499097824886236390, 0.499141151544778450, 0.499184476955467640, 0.499227801118195980, 0.499271124032854450, +0.499314445699335140, 0.499357766117529690, 0.499401085287330240, 0.499444403208627650, 0.499487719881314070, 0.499531035305281200, 0.499574349480421120, 0.499617662406624750, +0.499660974083784290, 0.499704284511791720, 0.499747593690538060, 0.499790901619915460, 0.499834208299815560, 0.499877513730130560, 0.499920817910751380, 0.499964120841570160, +0.500007422522478650, 0.500050722953368940, 0.500094022134132010, 0.500137320064660050, 0.500180616744844820, 0.500223912174578400, 0.500267206353751880, 0.500310499282257240, +0.500353790959986440, 0.500397081386831480, 0.500440370562683420, 0.500483658487434480, 0.500526945160976840, 0.500570230583201380, 0.500613514754000400, 0.500656797673265540, +0.500700079340889110, 0.500743359756762100, 0.500786638920776680, 0.500829916832824740, 0.500873193492798350, 0.500916468900588500, 0.500959743056087590, 0.501003015959187280, +0.501046287609779870, 0.501089558007756230, 0.501132827153008780, 0.501176095045429260, 0.501219361684909880, 0.501262627071341730, 0.501305891204616990, 0.501349154084627550, +0.501392415711265580, 0.501435676084422190, 0.501478935203989560, 0.501522193069860120, 0.501565449681924620, 0.501608705040075710, 0.501651959144204910, 0.501695211994204530, +0.501738463589965880, 0.501781713931380930, 0.501824963018341790, 0.501868210850740630, 0.501911457428468540, 0.501954702751417850, 0.501997946819480400, 0.502041189632548400, +0.502084431190513050, 0.502127671493266650, 0.502170910540701070, 0.502214148332708610, 0.502257384869180370, 0.502300620150008650, 0.502343854175085760, 0.502387086944302900, +0.502430318457552370, 0.502473548714725940, 0.502516777715716010, 0.502560005460413910, 0.502603231948711590, 0.502646457180501380, 0.502689681155675250, 0.502732903874124610, +0.502776125335741670, 0.502819345540418520, 0.502862564488047340, 0.502905782178519330, 0.502948998611726930, 0.502992213787561980, 0.503035427705916800, 0.503078640366682820, +0.503121851769752100, 0.503165061915017200, 0.503208270802369300, 0.503251478431700710, 0.503294684802903400, 0.503337889915869810, 0.503381093770491010, 0.503424296366659530, +0.503467497704267350, 0.503510697783206780, 0.503553896603369020, 0.503597094164646600, 0.503640290466931480, 0.503683485510115880, 0.503726679294091320, 0.503769871818749990, +0.503813063083983990, 0.503856253089685730, 0.503899441835746420, 0.503942629322058580, 0.503985815548514520, 0.504029000515005430, 0.504072184221423970, 0.504115366667661990, +0.504158547853612030, 0.504201727779165280, 0.504244906444214160, 0.504288083848650870, 0.504331259992367720, 0.504374434875256020, 0.504417608497208180, 0.504460780858116410, +0.504503951957873010, 0.504547121796369400, 0.504590290373498010, 0.504633457689150800, 0.504676623743220420, 0.504719788535598070, 0.504762952066176160, 0.504806114334847010, +0.504849275341502810, 0.504892435086035210, 0.504935593568336390, 0.504978750788299010, 0.505021906745814380, 0.505065061440775010, 0.505108214873072890, 0.505151367042600660, +0.505194517949249630, 0.505237667592912330, 0.505280815973480960, 0.505323963090847820, 0.505367108944904330, 0.505410253535543140, 0.505453396862656330, 0.505496538926136440, +0.505539679725874770, 0.505582819261763850, 0.505625957533695990, 0.505669094541563500, 0.505712230285258020, 0.505755364764671870, 0.505798497979697670, 0.505841629930226970, +0.505884760616152060, 0.505927890037365380, 0.505971018193759230, 0.506014145085225240, 0.506057270711655850, 0.506100395072943240, 0.506143518168980070, 0.506186639999657740, +0.506229760564868790, 0.506272879864505530, 0.506315997898460380, 0.506359114666624750, 0.506402230168891410, 0.506445344405152540, 0.506488457375300680, 0.506531569079227250, +0.506574679516825000, 0.506617788687986350, 0.506660896592602830, 0.506704003230567080, 0.506747108601771300, 0.506790212706108250, 0.506833315543469110, 0.506876417113746870, +0.506919517416833500, 0.506962616452621640, 0.507005714221002930, 0.507048810721869910, 0.507091905955114890, 0.507134999920630490, 0.507178092618308260, 0.507221184048040730, +0.507264274209720200, 0.507307363103239430, 0.507350450728489830, 0.507393537085364170, 0.507436622173754630, 0.507479705993553960, 0.507522788544653600, 0.507565869826946180, +0.507608949840324560, 0.507652028584680170, 0.507695106059905750, 0.507738182265893510, 0.507781257202536310, 0.507824330869725450, 0.507867403267353800, 0.507910474395313670, +0.507953544253497700, 0.507996612841797530, 0.508039680160105810, 0.508082746208314840, 0.508125810986317480, 0.508168874494005160, 0.508211936731270630, 0.508254997698006310, +0.508298057394104830, 0.508341115819457840, 0.508384172973957990, 0.508427228857498250, 0.508470283469969920, 0.508513336811265980, 0.508556388881278630, 0.508599439679900730, +0.508642489207023820, 0.508685537462540640, 0.508728584446343720, 0.508771630158325720, 0.508814674598378150, 0.508857717766393990, 0.508900759662265450, 0.508943800285885480, +0.508986839637145640, 0.509029877715938660, 0.509072914522156970, 0.509115950055693430, 0.509158984316439580, 0.509202017304288270, 0.509245049019132260, 0.509288079460863300, +0.509331108629374140, 0.509374136524557210, 0.509417163146305360, 0.509460188494510140, 0.509503212569064500, 0.509546235369860880, 0.509589256896791910, 0.509632277149749570, +0.509675296128626500, 0.509718313833315120, 0.509761330263708400, 0.509804345419697880, 0.509847359301176640, 0.509890371908036880, 0.509933383240171570, 0.509976393297472460, +0.510019402079832430, 0.510062409587144220, 0.510105415819299580, 0.510148420776191490, 0.510191424457712260, 0.510234426863754860, 0.510277427994211050, 0.510320427848973580, +0.510363426427935200, 0.510406423730988550, 0.510449419758025380, 0.510492414508938790, 0.510535407983621070, 0.510578400181965210, 0.510621391103863060, 0.510664380749207390, +0.510707369117890720, 0.510750356209806020, 0.510793342024845170, 0.510836326562900790, 0.510879309823865760, 0.510922291807632710, 0.510965272514093630, 0.511008251943141260, +0.511051230094668680, 0.511094206968567780, 0.511137182564731170, 0.511180156883051740, 0.511223129923422230, 0.511266101685734500, 0.511309072169881640, 0.511352041375755960, +0.511395009303250660, 0.511437975952257370, 0.511480941322669190, 0.511523905414378640, 0.511566868227278700, 0.511609829761261240, 0.511652790016219220, 0.511695748992045170, +0.511738706688632080, 0.511781663105871920, 0.511824618243657660, 0.511867572101882160, 0.511910524680437300, 0.511953475979216250, 0.511996425998111460, 0.512039374737016000, +0.512082322195821620, 0.512125268374421520, 0.512168213272708230, 0.512211156890574840, 0.512254099227913100, 0.512297040284616200, 0.512339980060576570, 0.512382918555687520, +0.512425855769840680, 0.512468791702929250, 0.512511726354845880, 0.512554659725483530, 0.512597591814734080, 0.512640522622490710, 0.512683452148646520, 0.512726380393093150, +0.512769307355723900, 0.512812233036431420, 0.512855157435108680, 0.512898080551647760, 0.512941002385941540, 0.512983922937882860, 0.513026842207364720, 0.513069760194279080, +0.513112676898519030, 0.513155592319977320, 0.513198506458547030, 0.513241419314120150, 0.513284330886589650, 0.513327241175848270, 0.513370150181789220, 0.513413057904304470, +0.513455964343287000, 0.513498869498629660, 0.513541773370225550, 0.513584675957966530, 0.513627577261745900, 0.513670477281456650, 0.513713376016990850, 0.513756273468241710, +0.513799169635101750, 0.513842064517464280, 0.513884958115221280, 0.513927850428265940, 0.513970741456490910, 0.514013631199789380, 0.514056519658053430, 0.514099406831176160, +0.514142292719050430, 0.514185177321569320, 0.514228060638624920, 0.514270942670110310, 0.514313823415918360, 0.514356702875942260, 0.514399581050074000, 0.514442457938206750, +0.514485333540233740, 0.514528207856047140, 0.514571080885539820, 0.514613952628604990, 0.514656823085135610, 0.514699692255023660, 0.514742560138162660, 0.514785426734445160, +0.514828292043764460, 0.514871156066012640, 0.514914018801083010, 0.514956880248868320, 0.514999740409261770, 0.515042599282155460, 0.515085456867442780, 0.515128313165016280, +0.515171168174769490, 0.515214021896594380, 0.515256874330384250, 0.515299725476032310, 0.515342575333430640, 0.515385423902472550, 0.515428271183050900, 0.515471117175058890, +0.515513961878388720, 0.515556805292933680, 0.515599647418586660, 0.515642488255240950, 0.515685327802788530, 0.515728166061122820, 0.515771003030136680, 0.515813838709723420, +0.515856673099775230, 0.515899506200185320, 0.515942338010846660, 0.515985168531652550, 0.516027997762495080, 0.516070825703267680, 0.516113652353863530, 0.516156477714174940, +0.516199301784095010, 0.516242124563517040, 0.516284946052333990, 0.516327766250438190, 0.516370585157723050, 0.516413402774081430, 0.516456219099406640, 0.516499034133591000, +0.516541847876527680, 0.516584660328109790, 0.516627471488230740, 0.516670281356782500, 0.516713089933658500, 0.516755897218751930, 0.516798703211955870, 0.516841507913162750, +0.516884311322265870, 0.516927113439158090, 0.516969914263733070, 0.517012713795882760, 0.517055512035500710, 0.517098308982480330, 0.517141104636713700, 0.517183898998094360, +0.517226692066515280, 0.517269483841869770, 0.517312274324050250, 0.517355063512950020, 0.517397851408462060, 0.517440638010480010, 0.517483423318895850, 0.517526207333603220, +0.517568990054494970, 0.517611771481464760, 0.517654551614404660, 0.517697330453208200, 0.517740107997768370, 0.517782884247978690, 0.517825659203731360, 0.517868432864920010, +0.517911205231437850, 0.517953976303177300, 0.517996746080031880, 0.518039514561894570, 0.518082281748658780, 0.518125047640217050, 0.518167812236462580, 0.518210575537288660, +0.518253337542588620, 0.518296098252254870, 0.518338857666180820, 0.518381615784259680, 0.518424372606384960, 0.518467128132448770, 0.518509882362344850, 0.518552635295966290, +0.518595386933206390, 0.518638137273957690, 0.518680886318113710, 0.518723634065567870, 0.518766380516212490, 0.518809125669941200, 0.518851869526647190, 0.518894612086223780, +0.518937353348563500, 0.518980093313559760, 0.519022831981105880, 0.519065569351095270, 0.519108305423420350, 0.519151040197974640, 0.519193773674651360, 0.519236505853344020, +0.519279236733945050, 0.519321966316347970, 0.519364694600445990, 0.519407421586132620, 0.519450147273300410, 0.519492871661842770, 0.519535594751652900, 0.519578316542624540, +0.519621037034649900, 0.519663756227622730, 0.519706474121436560, 0.519749190715983690, 0.519791906011157990, 0.519834620006852430, 0.519877332702960770, 0.519920044099375420, +0.519962754195989920, 0.520005462992697560, 0.520048170489391890, 0.520090876685965430, 0.520133581582311710, 0.520176285178324150, 0.520218987473896170, 0.520261688468920400, +0.520304388163290390, 0.520347086556899430, 0.520389783649641060, 0.520432479441407910, 0.520475173932093530, 0.520517867121591650, 0.520560559009794700, 0.520603249596596320, +0.520645938881889810, 0.520688626865568830, 0.520731313547526000, 0.520773998927654750, 0.520816683005848600, 0.520859365782001090, 0.520902047256004860, 0.520944727427753440, +0.520987406297140130, 0.521030083864058800, 0.521072760128401870, 0.521115435090062970, 0.521158108748935530, 0.521200781104913190, 0.521243452157888590, 0.521286121907755250, +0.521328790354407050, 0.521371457497736390, 0.521414123337637150, 0.521456787874002630, 0.521499451106726570, 0.521542113035701420, 0.521584773660821010, 0.521627432981978670, +0.521670090999068140, 0.521712747711981950, 0.521755403120613970, 0.521798057224857390, 0.521840710024606080, 0.521883361519752680, 0.521926011710190820, 0.521968660595813930, +0.522011308176515750, 0.522053954452188940, 0.522096599422727240, 0.522139243088024510, 0.522181885447973170, 0.522224526502467200, 0.522267166251399790, 0.522309804694665040, +0.522352441832155230, 0.522395077663764360, 0.522437712189385840, 0.522480345408913420, 0.522522977322239730, 0.522565607929258550, 0.522608237229863380, 0.522650865223947990, +0.522693491911405130, 0.522736117292128430, 0.522778741366011550, 0.522821364132948110, 0.522863985592830980, 0.522906605745553810, 0.522949224591010120, 0.522991842129093780, +0.523034458359697420, 0.523077073282714910, 0.523119686898040110, 0.523162299205565780, 0.523204910205185670, 0.523247519896793190, 0.523290128280282430, 0.523332735355545810, +0.523375341122477520, 0.523417945580970770, 0.523460548730919630, 0.523503150572216640, 0.523545751104755760, 0.523588350328430540, 0.523630948243134830, 0.523673544848761390, +0.523716140145204070, 0.523758734132356410, 0.523801326810112270, 0.523843918178364510, 0.523886508237006890, 0.523929096985933370, 0.523971684425036720, 0.524014270554210900, +0.524056855373349450, 0.524099438882346110, 0.524142021081093870, 0.524184601969486570, 0.524227181547417760, 0.524269759814781410, 0.524312336771470270, 0.524354912417378300, +0.524397486752398940, 0.524440059776426380, 0.524482631489353260, 0.524525201891073430, 0.524567770981480770, 0.524610338760469030, 0.524652905227930950, 0.524695470383760740, +0.524738034227852150, 0.524780596760098140, 0.524823157980392590, 0.524865717888629240, 0.524908276484701840, 0.524950833768503490, 0.524993389739928040, 0.525035944398869030, +0.525078497745220640, 0.525121049778875530, 0.525163600499727880, 0.525206149907671120, 0.525248698002599430, 0.525291244784405700, 0.525333790252983770, 0.525376334408227400, +0.525418877250030560, 0.525461418778286120, 0.525503958992888150, 0.525546497893730310, 0.525589035480706570, 0.525631571753709890, 0.525674106712634260, 0.525716640357373750, +0.525759172687821240, 0.525801703703870800, 0.525844233405416080, 0.525886761792351170, 0.525929288864569020, 0.525971814621963630, 0.526014339064428740, 0.526056862191858320, +0.526099384004145350, 0.526141904501184030, 0.526184423682867890, 0.526226941549091000, 0.526269458099746460, 0.526311973334728230, 0.526354487253930080, 0.526396999857246080, +0.526439511144569220, 0.526482021115793560, 0.526524529770813320, 0.526567037109521240, 0.526609543131811630, 0.526652047837578240, 0.526694551226715050, 0.526737053299115020, +0.526779554054672470, 0.526822053493280930, 0.526864551614834700, 0.526907048419226750, 0.526949543906351180, 0.526992038076101620, 0.527034530928372490, 0.527077022463056540, +0.527119512680048090, 0.527162001579240870, 0.527204489160529090, 0.527246975423805610, 0.527289460368964740, 0.527331943995900550, 0.527374426304506150, 0.527416907294675610, +0.527459386966302900, 0.527501865319282110, 0.527544342353506220, 0.527586818068869420, 0.527629292465265690, 0.527671765542589100, 0.527714237300732640, 0.527756707739590600, +0.527799176859056860, 0.527841644659025500, 0.527884111139389710, 0.527926576300043580, 0.527969040140881090, 0.528011502661796310, 0.528053963862682330, 0.528096423743433570, +0.528138882303944010, 0.528181339544106950, 0.528223795463816590, 0.528266250062966680, 0.528308703341451520, 0.528351155299164210, 0.528393605935999040, 0.528436055251849780, +0.528478503246610830, 0.528520949920175290, 0.528563395272437230, 0.528605839303290860, 0.528648282012630140, 0.528690723400348390, 0.528733163466339810, 0.528775602210498350, +0.528818039632718230, 0.528860475732892630, 0.528902910510915870, 0.528945343966681800, 0.528987776100084740, 0.529030206911017880, 0.529072636399375520, 0.529115064565051970, +0.529157491407940330, 0.529199916927935000, 0.529242341124929850, 0.529284763998819300, 0.529327185549496430, 0.529369605776855550, 0.529412024680790630, 0.529454442261196090, +0.529496858517965020, 0.529539273450991830, 0.529581687060170500, 0.529624099345395230, 0.529666510306559420, 0.529708919943557290, 0.529751328256282910, 0.529793735244630580, +0.529836140908493510, 0.529878545247766010, 0.529920948262342590, 0.529963349952116470, 0.530005750316981940, 0.530048149356833090, 0.530090547071564110, 0.530132943461068540, +0.530175338525240460, 0.530217732263974170, 0.530260124677163880, 0.530302515764702890, 0.530344905526485500, 0.530387293962406030, 0.530429681072358550, 0.530472066856236600, +0.530514451313934490, 0.530556834445346180, 0.530599216250366210, 0.530641596728887780, 0.530683975880805400, 0.530726353706013400, 0.530768730204405180, 0.530811105375875170, +0.530853479220317340, 0.530895851737626210, 0.530938222927695100, 0.530980592790418430, 0.531022961325690270, 0.531065328533405050, 0.531107694413456180, 0.531150058965737970, +0.531192422190144730, 0.531234784086570770, 0.531277144654909490, 0.531319503895055330, 0.531361861806902370, 0.531404218390345240, 0.531446573645277140, 0.531488927571592610, +0.531531280169185720, 0.531573631437951000, 0.531615981377781880, 0.531658329988572760, 0.531700677270218190, 0.531743023222611580, 0.531785367845647450, 0.531827711139219780, +0.531870053103223330, 0.531912393737551280, 0.531954733042098280, 0.531997071016758530, 0.532039407661426320, 0.532081742975995420, 0.532124076960360020, 0.532166409614414420, +0.532208740938053260, 0.532251070931169750, 0.532293399593658620, 0.532335726925413980, 0.532378052926330450, 0.532420377596301450, 0.532462700935221410, 0.532505022942984960, +0.532547343619485640, 0.532589662964617960, 0.532631980978276130, 0.532674297660354790, 0.532716613010747240, 0.532758927029348130, 0.532801239716051760, 0.532843551070752650, +0.532885861093344350, 0.532928169783721260, 0.532970477141777920, 0.533012783167408630, 0.533055087860507040, 0.533097391220967780, 0.533139693248684930, 0.533181993943553370, +0.533224293305466280, 0.533266591334318530, 0.533308888030004760, 0.533351183392418270, 0.533393477421453930, 0.533435770117005830, 0.533478061478968700, 0.533520351507236090, +0.533562640201702520, 0.533604927562262410, 0.533647213588810290, 0.533689498281239790, 0.533731781639445570, 0.533774063663321920, 0.533816344352763370, 0.533858623707663680, +0.533900901727917490, 0.533943178413418870, 0.533985453764062810, 0.534027727779742720, 0.534070000460353240, 0.534112271805789240, 0.534154541815944130, 0.534196810490712660, +0.534239077829989250, 0.534281343833668430, 0.534323608501643840, 0.534365871833810350, 0.534408133830062030, 0.534450394490293860, 0.534492653814399370, 0.534534911802273080, +0.534577168453809650, 0.534619423768903700, 0.534661677747448660, 0.534703930389339610, 0.534746181694470630, 0.534788431662736490, 0.534830680294031020, 0.534872927588248780, +0.534915173545284280, 0.534957418165032280, 0.534999661447386200, 0.535041903392241110, 0.535084143999491560, 0.535126383269031280, 0.535168621200755030, 0.535210857794557240, +0.535253093050332750, 0.535295326967975100, 0.535337559547379050, 0.535379790788439220, 0.535422020691050270, 0.535464249255105830, 0.535506476480500760, 0.535548702367129590, +0.535590926914886970, 0.535633150123666750, 0.535675371993363570, 0.535717592523871970, 0.535759811715086690, 0.535802029566901590, 0.535844246079211440, 0.535886461251911080, +0.535928675084894060, 0.535970887578055440, 0.536013098731289660, 0.536055308544491350, 0.536097517017554480, 0.536139724150373810, 0.536181929942843860, 0.536224134394859500, +0.536266337506314360, 0.536308539277103310, 0.536350739707120990, 0.536392938796262260, 0.536435136544420770, 0.536477332951491360, 0.536519528017368690, 0.536561721741947490, +0.536603914125121760, 0.536646105166786120, 0.536688294866835670, 0.536730483225164030, 0.536772670241666190, 0.536814855916236790, 0.536857040248770460, 0.536899223239161280, +0.536941404887304020, 0.536983585193093190, 0.537025764156423780, 0.537067941777189640, 0.537110118055285630, 0.537152292990606290, 0.537194466583046590, 0.537236638832500390, +0.537278809738862660, 0.537320979302027820, 0.537363147521890850, 0.537405314398345710, 0.537447479931287280, 0.537489644120610180, 0.537531806966209280, 0.537573968467978560, +0.537616128625812870, 0.537658287439607200, 0.537700444909255500, 0.537742601034652660, 0.537784755815693290, 0.537826909252272500, 0.537869061344283920, 0.537911212091622850, +0.537953361494183600, 0.537995509551861370, 0.538037656264550020, 0.538079801632144530, 0.538121945654539520, 0.538164088331630100, 0.538206229663310000, 0.538248369649474310, +0.538290508290017680, 0.538332645584835290, 0.538374781533820790, 0.538416916136869370, 0.538459049393876010, 0.538501181304734680, 0.538543311869340350, 0.538585441087587770, +0.538627568959372030, 0.538669695484586870, 0.538711820663127620, 0.538753944494888670, 0.538796066979765340, 0.538838188117651380, 0.538880307908442100, 0.538922426352031910, +0.538964543448316010, 0.539006659197188490, 0.539048773598544310, 0.539090886652278110, 0.539132998358285100, 0.539175108716459240, 0.539217217726695620, 0.539259325388889320, +0.539301431702934320, 0.539343536668725700, 0.539385640286158320, 0.539427742555127150, 0.539469843475526290, 0.539511943047250810, 0.539554041270195460, 0.539596138144255330, +0.539638233669324620, 0.539680327845298180, 0.539722420672070990, 0.539764512149538130, 0.539806602277593690, 0.539848691056132650, 0.539890778485049850, 0.539932864564240500, +0.539974949293598680, 0.540017032673019480, 0.540059114702397980, 0.540101195381628370, 0.540143274710605750, 0.540185352689225070, 0.540227429317381210, 0.540269504594968470, +0.540311578521882050, 0.540353651098016590, 0.540395722323267380, 0.540437792197528520, 0.540479860720695200, 0.540521927892662180, 0.540563993713324640, 0.540606058182576900, +0.540648121300313920, 0.540690183066430690, 0.540732243480822380, 0.540774302543382990, 0.540816360254007920, 0.540858416612591930, 0.540900471619030320, 0.540942525273217180, +0.540984577575047590, 0.541026628524417070, 0.541068678121219500, 0.541110726365350290, 0.541152773256704300, 0.541194818795176610, 0.541236862980661650, 0.541278905813054490, +0.541320947292250000, 0.541362987418143590, 0.541405026190629360, 0.541447063609602490, 0.541489099674957950, 0.541531134386591170, 0.541573167744396010, 0.541615199748267990, +0.541657230398101990, 0.541699259693793290, 0.541741287635236100, 0.541783314222325620, 0.541825339454957260, 0.541867363333025210, 0.541909385856424790, 0.541951407025050850, +0.541993426838798700, 0.542035445297562650, 0.542077462401238000, 0.542119478149719720, 0.542161492542903130, 0.542203505580682310, 0.542245517262952890, 0.542287527589609630, +0.542329536560547830, 0.542371544175661910, 0.542413550434847070, 0.542455555337998390, 0.542497558885011280, 0.542539561075779720, 0.542581561910199350, 0.542623561388165480, +0.542665559509572290, 0.542707556274315220, 0.542749551682289330, 0.542791545733389840, 0.542833538427511140, 0.542875529764548560, 0.542917519744397170, 0.542959508366952390, +0.543001495632108420, 0.543043481539760790, 0.543085466089804350, 0.543127449282134630, 0.543169431116645950, 0.543211411593233720, 0.543253390711792910, 0.543295368472219040, +0.543337344874406440, 0.543379319918250280, 0.543421293603645990, 0.543463265930488770, 0.543505236898673030, 0.543547206508094180, 0.543589174758647760, 0.543631141650227970, +0.543673107182730320, 0.543715071356049910, 0.543757034170082250, 0.543798995624721560, 0.543840955719863350, 0.543882914455402820, 0.543924871831235390, 0.543966827847255360, +0.544008782503358270, 0.544050735799439190, 0.544092687735393770, 0.544134638311116080, 0.544176587526501890, 0.544218535381446270, 0.544260481875844640, 0.544302427009591420, +0.544344370782582130, 0.544386313194712310, 0.544428254245876380, 0.544470193935969740, 0.544512132264887700, 0.544554069232525580, 0.544596004838778010, 0.544637939083540410, +0.544679871966707860, 0.544721803488176120, 0.544763733647839480, 0.544805662445593470, 0.544847589881333420, 0.544889515954954610, 0.544931440666351690, 0.544973364015420180, +0.545015286002055290, 0.545057206626152540, 0.545099125887606450, 0.545141043786312450, 0.545182960322166290, 0.545224875495062270, 0.545266789304896140, 0.545308701751562990, +0.545350612834958450, 0.545392522554977060, 0.545434430911514330, 0.545476337904465590, 0.545518243533726240, 0.545560147799191040, 0.545602050700755400, 0.545643952238314630, +0.545685852411764370, 0.545727751220999150, 0.545769648665914490, 0.545811544746405700, 0.545853439462368420, 0.545895332813697290, 0.545937224800287720, 0.545979115422035480, +0.546021004678835080, 0.546062892570582160, 0.546104779097172030, 0.546146664258500230, 0.546188548054461490, 0.546230430484951460, 0.546272311549865220, 0.546314191249098640, +0.546356069582546120, 0.546397946550103540, 0.546439822151666090, 0.546481696387129400, 0.546523569256388120, 0.546565440759337880, 0.546607310895874000, 0.546649179665892330, +0.546691047069287280, 0.546732913105954620, 0.546774777775789640, 0.546816641078688210, 0.546858503014544750, 0.546900363583255000, 0.546942222784714720, 0.546984080618818420, +0.547025937085462100, 0.547067792184540820, 0.547109645915950460, 0.547151498279585650, 0.547193349275342020, 0.547235198903115010, 0.547277047162800460, 0.547318894054292900, +0.547360739577488100, 0.547402583732281340, 0.547444426518568620, 0.547486267936244440, 0.547528107985204570, 0.547569946665344420, 0.547611783976559850, 0.547653619918745390, +0.547695454491796910, 0.547737287695610140, 0.547779119530079740, 0.547820949995101560, 0.547862779090571020, 0.547904606816383980, 0.547946433172434970, 0.547988258158619850, +0.548030081774834140, 0.548071904020973610, 0.548113724896932890, 0.548155544402607940, 0.548197362537894080, 0.548239179302687170, 0.548280994696881960, 0.548322808720374310, +0.548364621373059520, 0.548406432654833690, 0.548448242565591330, 0.548490051105228300, 0.548531858273640590, 0.548573664070722830, 0.548615468496370990, 0.548657271550480390, +0.548699073232947090, 0.548740873543665630, 0.548782672482531990, 0.548824470049441680, 0.548866266244290580, 0.548908061066973430, 0.548949854517386200, 0.548991646595424320, +0.549033437300983640, 0.549075226633959020, 0.549117014594246330, 0.549158801181741100, 0.549200586396339170, 0.549242370237935430, 0.549284152706425830, 0.549325933801705800, +0.549367713523671420, 0.549409491872217210, 0.549451268847239380, 0.549493044448633780, 0.549534818676295170, 0.549576591530119400, 0.549618363010002220, 0.549660133115839610, +0.549701901847526210, 0.549743669204957990, 0.549785435188030690, 0.549827199796640190, 0.549868963030681220, 0.549910724890049880, 0.549952485374641810, 0.549994244484352750, +0.550036002219077780, 0.550077758578712880, 0.550119513563153470, 0.550161267172295740, 0.550203019406034440, 0.550244770264265550, 0.550286519746885140, 0.550328267853788080, +0.550370014584870340, 0.550411759940027560, 0.550453503919155710, 0.550495246522149760, 0.550536987748905690, 0.550578727599319140, 0.550620466073286190, 0.550662203170701690, +0.550703938891461630, 0.550745673235461750, 0.550787406202598030, 0.550829137792765540, 0.550870868005860050, 0.550912596841777510, 0.550954324300413800, 0.550996050381663880, +0.551037775085423950, 0.551079498411589870, 0.551121220360056620, 0.551162940930720380, 0.551204660123476800, 0.551246377938221950, 0.551288094374850710, 0.551329809433259270, +0.551371523113343360, 0.551413235414998980, 0.551454946338121090, 0.551496655882605880, 0.551538364048348990, 0.551580070835246630, 0.551621776243193750, 0.551663480272086340, +0.551705182921820250, 0.551746884192291560, 0.551788584083395370, 0.551830282595027640, 0.551871979727084240, 0.551913675479461240, 0.551955369852053620, 0.551997062844757690, +0.552038754457469420, 0.552080444690083880, 0.552122133542497280, 0.552163821014605370, 0.552205507106304230, 0.552247191817488940, 0.552288875148055690, 0.552330557097900240, +0.552372237666918680, 0.552413916855006290, 0.552455594662059070, 0.552497271087972860, 0.552538946132643870, 0.552580619795967070, 0.552622292077838750, 0.552663962978154680, +0.552705632496811150, 0.552747300633703140, 0.552788967388726850, 0.552830632761778570, 0.552872296752753290, 0.552913959361547300, 0.552955620588056360, 0.552997280432176770, +0.553038938893803620, 0.553080595972833100, 0.553122251669161070, 0.553163905982683830, 0.553205558913296370, 0.553247210460895090, 0.553288860625375860, 0.553330509406634750, +0.553372156804566970, 0.553413802819068820, 0.553455447450036160, 0.553497090697365300, 0.553538732560951320, 0.553580373040690520, 0.553622012136479100, 0.553663649848212370, +0.553705286175786400, 0.553746921119097290, 0.553788554678041220, 0.553830186852513400, 0.553871817642410220, 0.553913447047627350, 0.553955075068061300, 0.553996701703607150, +0.554038326954161330, 0.554079950819619580, 0.554121573299878430, 0.554163194394832860, 0.554204814104379380, 0.554246432428413870, 0.554288049366832620, 0.554329664919530950, +0.554371279086405040, 0.554412891867351320, 0.554454503262264970, 0.554496113271042420, 0.554537721893579530, 0.554579329129772700, 0.554620934979517250, 0.554662539442709490, +0.554704142519245270, 0.554745744209021120, 0.554787344511932230, 0.554828943427874920, 0.554870540956745370, 0.554912137098439780, 0.554953731852853460, 0.554995325219882820, +0.555036917199423940, 0.555078507791373020, 0.555120096995625590, 0.555161684812077730, 0.555203271240625850, 0.555244856281166040, 0.555286439933593830, 0.555328022197805420, +0.555369603073697320, 0.555411182561164950, 0.555452760660104520, 0.555494337370412210, 0.555535912691984430, 0.555577486624716510, 0.555619059168504850, 0.555660630323245640, +0.555702200088835090, 0.555743768465168710, 0.555785335452142930, 0.555826901049653820, 0.555868465257597810, 0.555910028075870310, 0.555951589504367740, 0.555993149542986180, +0.556034708191622040, 0.556076265450170860, 0.556117821318528940, 0.556159375796592910, 0.556200928884257980, 0.556242480581420780, 0.556284030887977400, 0.556325579803824240, +0.556367127328856850, 0.556408673462971630, 0.556450218206064660, 0.556491761558032590, 0.556533303518770730, 0.556574844088175590, 0.556616383266143270, 0.556657921052570500, +0.556699457447352500, 0.556740992450385770, 0.556782526061566640, 0.556824058280791620, 0.556865589107956030, 0.556907118542956490, 0.556948646585689430, 0.556990173236050490, +0.557031698493936080, 0.557073222359242390, 0.557114744831866070, 0.557156265911702530, 0.557197785598648300, 0.557239303892599570, 0.557280820793452980, 0.557322336301103950, +0.557363850415449110, 0.557405363136384670, 0.557446874463807140, 0.557488384397612060, 0.557529892937696060, 0.557571400083955340, 0.557612905836286420, 0.557654410194584840, +0.557695913158747340, 0.557737414728670000, 0.557778914904249470, 0.557820413685381270, 0.557861911071962150, 0.557903407063888520, 0.557944901661056040, 0.557986394863361320, +0.558027886670700580, 0.558069377082970550, 0.558110866100066660, 0.558152353721885540, 0.558193839948323610, 0.558235324779277510, 0.558276808214642650, 0.558318290254315790, +0.558359770898193110, 0.558401250146171480, 0.558442727998146320, 0.558484204454014370, 0.558525679513671940, 0.558567153177015660, 0.558608625443941080, 0.558650096314344920, +0.558691565788123960, 0.558733033865173700, 0.558774500545390800, 0.558815965828671770, 0.558857429714913030, 0.558898892204010460, 0.558940353295860670, 0.558981812990359870, +0.559023271287405030, 0.559064728186891570, 0.559106183688716340, 0.559147637792775650, 0.559189090498966260, 0.559230541807183680, 0.559271991717324890, 0.559313440229285970, +0.559354887342963900, 0.559396333058254200, 0.559437777375053740, 0.559479220293259140, 0.559520661812766160, 0.559562101933471560, 0.559603540655271630, 0.559644977978063230, +0.559686413901742010, 0.559727848426204820, 0.559769281551347970, 0.559810713277068220, 0.559852143603261410, 0.559893572529824190, 0.559935000056653090, 0.559976426183644740, +0.560017850910695110, 0.560059274237700740, 0.560100696164558260, 0.560142116691164430, 0.560183535817414870, 0.560224953543206450, 0.560266369868436030, 0.560307784792999360, +0.560349198316793200, 0.560390610439714050, 0.560432021161658800, 0.560473430482523070, 0.560514838402203730, 0.560556244920597300, 0.560597650037600650, 0.560639053753109520, +0.560680456067020770, 0.560721856979230830, 0.560763256489636650, 0.560804654598134000, 0.560846051304619620, 0.560887446608990260, 0.560928840511142560, 0.560970233010972370, +0.561011624108376570, 0.561053013803251790, 0.561094402095494770, 0.561135788985001490, 0.561177174471668590, 0.561218558555393270, 0.561259941236071040, 0.561301322513599100, +0.561342702387873760, 0.561384080858791990, 0.561425457926249760, 0.561466833590143820, 0.561508207850370810, 0.561549580706827700, 0.561590952159410240, 0.561632322208015400, +0.561673690852539710, 0.561715058092880250, 0.561756423928932660, 0.561797788360594020, 0.561839151387760970, 0.561880513010330370, 0.561921873228198200, 0.561963232041261310, +0.562004589449416670, 0.562045945452560260, 0.562087300050588930, 0.562128653243399330, 0.562170005030888540, 0.562211355412952310, 0.562252704389487710, 0.562294051960391280, +0.562335398125560220, 0.562376742884890260, 0.562418086238278380, 0.562459428185621340, 0.562500768726816090, 0.562542107861758510, 0.562583445590345680, 0.562624781912474230, +0.562666116828041240, 0.562707450336942580, 0.562748782439075220, 0.562790113134336360, 0.562831442422621730, 0.562872770303828650, 0.562914096777853530, 0.562955421844593570, +0.562996745503944740, 0.563038067755804010, 0.563079388600068120, 0.563120708036634050, 0.563162026065397890, 0.563203342686256710, 0.563244657899107160, 0.563285971703846310, +0.563327284100370140, 0.563368595088575840, 0.563409904668359940, 0.563451212839619740, 0.563492519602251110, 0.563533824956151230, 0.563575128901216750, 0.563616431437344740, +0.563657732564431410, 0.563699032282373610, 0.563740330591068650, 0.563781627490412610, 0.563822922980302340, 0.563864217060634830, 0.563905509731307150, 0.563946800992215390, +0.563988090843256520, 0.564029379284327500, 0.564070666315325320, 0.564111951936146160, 0.564153236146687110, 0.564194518946845030, 0.564235800336516880, 0.564277080315598980, +0.564318358883988400, 0.564359636041581900, 0.564400911788276560, 0.564442186123968680, 0.564483459048555350, 0.564524730561933640, 0.564566000663999870, 0.564607269354651000, +0.564648536633784000, 0.564689802501295970, 0.564731066957083190, 0.564772330001042660, 0.564813591633071320, 0.564854851853066280, 0.564896110660923820, 0.564937368056541160, +0.564978624039815020, 0.565019878610642620, 0.565061131768920260, 0.565102383514545000, 0.565143633847413730, 0.565184882767423850, 0.565226130274471330, 0.565267376368453590, +0.565308621049267710, 0.565349864316809890, 0.565391106170977430, 0.565432346611667190, 0.565473585638776480, 0.565514823252201370, 0.565556059451839290, 0.565597294237586980, +0.565638527609341860, 0.565679759567000010, 0.565720990110458730, 0.565762219239615120, 0.565803446954366240, 0.565844673254608300, 0.565885898140238820, 0.565927121611154550, +0.565968343667252790, 0.566009564308429860, 0.566050783534582940, 0.566092001345609550, 0.566133217741405680, 0.566174432721868850, 0.566215646286895910, 0.566256858436384180, +0.566298069170229960, 0.566339278488330540, 0.566380486390583030, 0.566421692876884600, 0.566462897947131560, 0.566504101601221330, 0.566545303839050770, 0.566586504660517300, +0.566627704065517320, 0.566668902053947930, 0.566710098625706430, 0.566751293780690000, 0.566792487518794960, 0.566833679839918720, 0.566874870743958260, 0.566916060230810980, +0.566957248300373200, 0.566998434952542210, 0.567039620187215650, 0.567080804004289620, 0.567121986403661520, 0.567163167385228540, 0.567204346948887990, 0.567245525094536180, +0.567286701822070530, 0.567327877131388100, 0.567369051022386440, 0.567410223494961730, 0.567451394549011500, 0.567492564184432840, 0.567533732401123040, 0.567574899198978520, +0.567616064577896820, 0.567657228537774890, 0.567698391078510280, 0.567739552199999390, 0.567780711902139630, 0.567821870184828330, 0.567863027047962100, 0.567904182491438260, +0.567945336515154000, 0.567986489119006730, 0.568027640302892880, 0.568068790066709850, 0.568109938410354950, 0.568151085333725490, 0.568192230836717990, 0.568233374919229980, +0.568274517581158430, 0.568315658822401090, 0.568356798642854160, 0.568397937042415150, 0.568439074020981370, 0.568480209578450250, 0.568521343714718300, 0.568562476429682940, +0.568603607723241810, 0.568644737595291220, 0.568685866045728790, 0.568726993074451740, 0.568768118681357570, 0.568809242866342710, 0.568850365629304800, 0.568891486970140910, +0.568932606888748690, 0.568973725385024550, 0.569014842458866130, 0.569055958110170620, 0.569097072338835550, 0.569138185144757450, 0.569179296527833940, 0.569220406487962130, +0.569261515025039630, 0.569302622138963100, 0.569343727829629940, 0.569384832096937470, 0.569425934940783310, 0.569467036361063880, 0.569508136357676830, 0.569549234930519900, +0.569590332079489500, 0.569631427804483280, 0.569672522105398430, 0.569713614982132690, 0.569754706434582590, 0.569795796462645670, 0.569836885066219210, 0.569877972245200980, +0.569919057999487390, 0.569960142328976180, 0.570001225233564670, 0.570042306713150370, 0.570083386767630040, 0.570124465396901200, 0.570165542600861160, 0.570206618379407670, +0.570247692732437250, 0.570288765659847650, 0.570329837161536400, 0.570370907237400250, 0.570411975887336830, 0.570453043111243450, 0.570494108909017860, 0.570535173280556700, +0.570576236225757480, 0.570617297744517750, 0.570658357836735020, 0.570699416502306160, 0.570740473741128680, 0.570781529553100130, 0.570822583938118020, 0.570863636896079110, +0.570904688426881140, 0.570945738530421410, 0.570986787206597680, 0.571027834455306690, 0.571068880276446090, 0.571109924669913620, 0.571150967635605910, 0.571192009173420940, +0.571233049283255800, 0.571274087965008450, 0.571315125218575530, 0.571356161043854890, 0.571397195440743740, 0.571438228409139940, 0.571479259948940220, 0.571520290060042460, +0.571561318742343840, 0.571602345995742330, 0.571643371820134690, 0.571684396215418560, 0.571725419181491330, 0.571766440718251000, 0.571807460825594190, 0.571848479503418770, +0.571889496751622480, 0.571930512570102080, 0.571971526958755420, 0.572012539917479910, 0.572053551446173540, 0.572094561544732820, 0.572135570213055720, 0.572176577451039670, +0.572217583258582520, 0.572258587635581020, 0.572299590581933140, 0.572340592097536290, 0.572381592182288230, 0.572422590836085930, 0.572463588058827130, 0.572504583850409250, +0.572545578210730380, 0.572586571139687250, 0.572627562637177620, 0.572668552703099020, 0.572709541337349530, 0.572750528539825780, 0.572791514310425630, 0.572832498649047170, +0.572873481555587040, 0.572914463029943200, 0.572955443072013180, 0.572996421681694960, 0.573037398858885380, 0.573078374603482210, 0.573119348915383190, 0.573160321794486060, +0.573201293240687800, 0.573242263253886280, 0.573283231833979220, 0.573324198980864290, 0.573365164694438660, 0.573406128974599970, 0.573447091821245980, 0.573488053234274760, +0.573529013213582850, 0.573569971759068540, 0.573610928870629590, 0.573651884548163070, 0.573692838791566740, 0.573733791600738340, 0.573774742975575850, 0.573815692915976120, +0.573856641421837120, 0.573897588493056500, 0.573938534129532330, 0.573979478331161470, 0.574020421097841900, 0.574061362429471260, 0.574102302325947610, 0.574143240787167830, +0.574184177813029880, 0.574225113403431520, 0.574266047558270820, 0.574306980277444530, 0.574347911560850850, 0.574388841408387750, 0.574429769819952200, 0.574470696795442160, +0.574511622334755500, 0.574552546437790080, 0.574593469104442870, 0.574634390334612060, 0.574675310128195280, 0.574716228485090520, 0.574757145405194850, 0.574798060888406350, +0.574838974934622660, 0.574879887543741970, 0.574920798715661150, 0.574961708450278270, 0.575002616747491200, 0.575043523607197900, 0.575084429029295460, 0.575125333013681960, +0.575166235560255150, 0.575207136668913100, 0.575248036339552790, 0.575288934572072420, 0.575329831366370060, 0.575370726722342800, 0.575411620639888710, 0.575452513118905550, +0.575493404159291510, 0.575534293760943560, 0.575575181923759890, 0.575616068647638260, 0.575656953932476840, 0.575697837778172630, 0.575738720184623910, 0.575779601151728330, +0.575820480679384070, 0.575861358767488340, 0.575902235415939100, 0.575943110624634320, 0.575983984393472200, 0.576024856722349600, 0.576065727611165030, 0.576106597059816370, +0.576147465068200910, 0.576188331636216860, 0.576229196763761830, 0.576270060450734260, 0.576310922697031210, 0.576351783502550790, 0.576392642867190940, 0.576433500790849870, +0.576474357273424660, 0.576515212314813510, 0.576556065914914370, 0.576596918073625450, 0.576637768790843830, 0.576678618066467810, 0.576719465900395250, 0.576760312292524450, +0.576801157242752380, 0.576842000750977470, 0.576882842817098010, 0.576923683441010970, 0.576964522622614770, 0.577005360361807270, 0.577046196658486670, 0.577087031512550250, +0.577127864923896230, 0.577168696892422560, 0.577209527418027560, 0.577250356500608300, 0.577291184140063200, 0.577332010336290110, 0.577372835089187460, 0.577413658398652220, +0.577454480264582900, 0.577495300686877380, 0.577536119665433940, 0.577576937200149910, 0.577617753290923460, 0.577658567937653020, 0.577699381140235780, 0.577740192898570150, +0.577781003212553990, 0.577821812082085720, 0.577862619507062520, 0.577903425487382720, 0.577944230022944480, 0.577985033113645910, 0.578025834759384520, 0.578066634960058390, +0.578107433715565830, 0.578148231025804930, 0.578189026890673090, 0.578229821310068730, 0.578270614283889820, 0.578311405812034770, 0.578352195894400790, 0.578392984530886280, +0.578433771721389430, 0.578474557465808450, 0.578515341764040620, 0.578556124615984600, 0.578596906021538570, 0.578637685980599840, 0.578678464493066920, 0.578719241558837920, +0.578760017177811110, 0.578800791349883940, 0.578841564074954800, 0.578882335352921660, 0.578923105183683170, 0.578963873567136410, 0.579004640503180120, 0.579045405991712170, +0.579086170032630960, 0.579126932625834150, 0.579167693771219900, 0.579208453468686430, 0.579249211718132150, 0.579289968519454580, 0.579330723872552020, 0.579371477777323010, +0.579412230233664950, 0.579452981241476260, 0.579493730800655140, 0.579534478911100100, 0.579575225572708570, 0.579615970785378850, 0.579656714549009240, 0.579697456863498270, +0.579738197728743240, 0.579778937144642680, 0.579819675111094780, 0.579860411627998170, 0.579901146695250060, 0.579941880312749070, 0.579982612480393510, 0.580023343198081690, +0.580064072465711120, 0.580104800283180340, 0.580145526650387990, 0.580186251567231470, 0.580226975033609320, 0.580267697049419720, 0.580308417614561310, 0.580349136728931400, +0.580389854392428630, 0.580430570604951290, 0.580471285366397920, 0.580511998676665810, 0.580552710535653830, 0.580593420943260050, 0.580634129899383120, 0.580674837403920450, +0.580715543456770790, 0.580756248057832100, 0.580796951207003250, 0.580837652904181660, 0.580878353149265950, 0.580919051942154320, 0.580959749282745410, 0.581000445170936850, +0.581041139606627070, 0.581081832589714910, 0.581122524120097680, 0.581163214197674250, 0.581203902822342800, 0.581244589994001860, 0.581285275712549070, 0.581325959977883170, +0.581366642789902350, 0.581407324148505270, 0.581448004053589540, 0.581488682505053810, 0.581529359502796380, 0.581570035046715890, 0.581610709136709870, 0.581651381772677170, +0.581692052954515980, 0.581732722682125060, 0.581773390955401930, 0.581814057774245440, 0.581854723138554020, 0.581895387048225520, 0.581936049503158470, 0.581976710503251390, +0.582017370048402820, 0.582058028138510490, 0.582098684773473040, 0.582139339953189010, 0.582179993677556910, 0.582220645946474490, 0.582261296759840400, 0.582301946117553040, +0.582342594019511270, 0.582383240465612630, 0.582423885455755850, 0.582464528989839360, 0.582505171067762010, 0.582545811689421320, 0.582586450854716050, 0.582627088563545060, +0.582667724815805980, 0.582708359611397550, 0.582748992950218200, 0.582789624832166790, 0.582830255257140940, 0.582870884225039520, 0.582911511735760830, 0.582952137789203630, +0.582992762385265870, 0.583033385523846090, 0.583074007204842930, 0.583114627428155120, 0.583155246193680310, 0.583195863501317470, 0.583236479350964900, 0.583277093742521570, +0.583317706675885010, 0.583358318150954290, 0.583398928167628170, 0.583439536725804290, 0.583480143825381600, 0.583520749466258540, 0.583561353648333950, 0.583601956371505690, +0.583642557635672410, 0.583683157440732850, 0.583723755786585750, 0.583764352673128760, 0.583804948100261070, 0.583845542067880970, 0.583886134575887230, 0.583926725624178020, +0.583967315212651880, 0.584007903341207450, 0.584048490009743570, 0.584089075218158120, 0.584129658966350050, 0.584170241254217790, 0.584210822081660310, 0.584251401448575460, +0.584291979354861990, 0.584332555800419100, 0.584373130785144300, 0.584413704308936690, 0.584454276371694890, 0.584494846973317770, 0.584535416113703080, 0.584575983792749890, +0.584616550010356840, 0.584657114766422680, 0.584697678060845380, 0.584738239893523800, 0.584778800264356800, 0.584819359173243010, 0.584859916620080520, 0.584900472604768300, +0.584941027127204750, 0.584981580187289070, 0.585022131784919130, 0.585062681919993890, 0.585103230592412200, 0.585143777802072050, 0.585184323548872510, 0.585224867832712210, +0.585265410653490030, 0.585305952011104020, 0.585346491905453070, 0.585387030336435910, 0.585427567303951620, 0.585468102807897960, 0.585508636848174110, 0.585549169424678610, +0.585589700537310520, 0.585630230185967830, 0.585670758370549600, 0.585711285090954490, 0.585751810347081460, 0.585792334138828590, 0.585832856466094950, 0.585873377328779420, +0.585913896726780180, 0.585954414659996090, 0.585994931128326010, 0.586035446131669020, 0.586075959669922990, 0.586116471742987090, 0.586156982350759970, 0.586197491493140820, +0.586237999170027500, 0.586278505381319200, 0.586319010126914670, 0.586359513406713000, 0.586400015220612140, 0.586440515568511290, 0.586481014450309090, 0.586521511865904840, +0.586562007815196300, 0.586602502298082750, 0.586642995314463070, 0.586683486864236100, 0.586723976947300160, 0.586764465563554330, 0.586804952712897570, 0.586845438395228070, +0.586885922610445030, 0.586926405358447200, 0.586966886639133770, 0.587007366452402590, 0.587047844798153080, 0.587088321676284000, 0.587128797086694520, 0.587169271029282620, +0.587209743503947500, 0.587250214510588010, 0.587290684049103450, 0.587331152119391800, 0.587371618721352130, 0.587412083854883530, 0.587452547519885070, 0.587493009716254950, +0.587533470443892150, 0.587573929702696170, 0.587614387492564890, 0.587654843813397720, 0.587695298665093510, 0.587735752047551240, 0.587776203960669320, 0.587816654404346940, +0.587857103378482850, 0.587897550882976460, 0.587937996917725750, 0.587978441482630010, 0.588018884577588220, 0.588059326202499570, 0.588099766357262240, 0.588140205041775550, +0.588180642255938250, 0.588221077999649730, 0.588261512272808210, 0.588301945075312860, 0.588342376407063110, 0.588382806267956910, 0.588423234657893810, 0.588463661576772550, +0.588504087024492530, 0.588544511000951950, 0.588584933506050010, 0.588625354539685790, 0.588665774101758580, 0.588706192192166580, 0.588746608810808980, 0.588787023957584980, +0.588827437632393760, 0.588867849835133520, 0.588908260565703780, 0.588948669824003290, 0.588989077609931470, 0.589029483923386610, 0.589069888764268130, 0.589110292132475230, +0.589150694027906210, 0.589191094450460470, 0.589231493400037000, 0.589271890876535200, 0.589312286879853260, 0.589352681409890610, 0.589393074466546210, 0.589433466049719580, +0.589473856159308920, 0.589514244795213530, 0.589554631957332600, 0.589595017645565430, 0.589635401859810340, 0.589675784599966720, 0.589716165865933780, 0.589756545657610600, +0.589796923974895800, 0.589837300817688700, 0.589877676185888270, 0.589918050079394130, 0.589958422498104370, 0.589998793441918630, 0.590039162910736330, 0.590079530904455640, +0.590119897422976210, 0.590160262466197020, 0.590200626034017460, 0.590240988126336070, 0.590281348743052160, 0.590321707884064910, 0.590362065549273620, 0.590402421738576930, +0.590442776451874260, 0.590483129689064470, 0.590523481450047290, 0.590563831734721160, 0.590604180542985360, 0.590644527874739090, 0.590684873729881880, 0.590725218108312020, +0.590765561009929270, 0.590805902434632930, 0.590846242382321420, 0.590886580852894360, 0.590926917846250840, 0.590967253362290390, 0.591007587400911530, 0.591047919962013560, +0.591088251045495780, 0.591128580651257840, 0.591168908779198030, 0.591209235429216000, 0.591249560601210810, 0.591289884295082110, 0.591330206510728430, 0.591370527248049060, +0.591410846506943530, 0.591451164287311150, 0.591491480589050540, 0.591531795412061130, 0.591572108756242780, 0.591612420621493660, 0.591652731007713540, 0.591693039914801490, +0.591733347342657370, 0.591773653291179370, 0.591813957760267350, 0.591854260749820390, 0.591894562259738130, 0.591934862289919090, 0.591975160840262920, 0.592015457910668900, +0.592055753501036450, 0.592096047611264440, 0.592136340241252170, 0.592176631390899040, 0.592216921060104820, 0.592257209248767900, 0.592297495956787930, 0.592337781184064220, +0.592378064930496380, 0.592418347195983070, 0.592458627980423810, 0.592498907283718460, 0.592539185105765420, 0.592579461446464340, 0.592619736305714740, 0.592660009683416140, +0.592700281579467080, 0.592740551993767410, 0.592780820926216310, 0.592821088376713550, 0.592861354345157630, 0.592901618831448430, 0.592941881835485020, 0.592982143357167370, +0.593022403396394000, 0.593062661953064670, 0.593102919027078680, 0.593143174618335660, 0.593183428726734460, 0.593223681352174630, 0.593263932494555890, 0.593304182153777000, +0.593344430329737720, 0.593384677022337330, 0.593424922231475580, 0.593465165957051230, 0.593505408198963910, 0.593545648957113040, 0.593585888231398460, 0.593626126021718830, +0.593666362327973870, 0.593706597150062910, 0.593746830487885900, 0.593787062341341490, 0.593827292710329300, 0.593867521594748980, 0.593907748994500160, 0.593947974909481700, +0.593988199339593240, 0.594028422284734630, 0.594068643744804610, 0.594108863719702950, 0.594149082209329160, 0.594189299213583100, 0.594229514732363300, 0.594269728765569830, +0.594309941313102000, 0.594350152374859660, 0.594390361950741570, 0.594430570040647590, 0.594470776644477120, 0.594510981762130130, 0.594551185393505380, 0.594591387538502600, +0.594631588197021330, 0.594671787368961540, 0.594711985054221850, 0.594752181252702240, 0.594792375964302460, 0.594832569188921470, 0.594872760926459020, 0.594912951176814640, +0.594953139939888300, 0.594993327215578740, 0.595033513003785820, 0.595073697304409180, 0.595113880117348560, 0.595154061442502940, 0.595194241279772160, 0.595234419629055770, +0.595274596490253720, 0.595314771863264870, 0.595354945747988970, 0.595395118144325770, 0.595435289052175130, 0.595475458471435900, 0.595515626402008060, 0.595555792843791120, +0.595595957796685060, 0.595636121260588740, 0.595676283235402120, 0.595716443721025170, 0.595756602717356640, 0.595796760224296730, 0.595836916241744950, 0.595877070769601170, +0.595917223807764350, 0.595957375356134470, 0.595997525414611150, 0.596037673983094370, 0.596077821061483100, 0.596117966649677200, 0.596158110747576410, 0.596198253355080810, +0.596238394472089040, 0.596278534098501400, 0.596318672234217420, 0.596358808879137060, 0.596398944033159410, 0.596439077696184320, 0.596479209868111980, 0.596519340548841150, +0.596559469738272010, 0.596599597436304200, 0.596639723642837790, 0.596679848357771660, 0.596719971581005870, 0.596760093312440290, 0.596800213551974770, 0.596840332299508280, +0.596880449554941020, 0.596920565318172720, 0.596960679589103260, 0.597000792367631710, 0.597040903653658250, 0.597081013447082530, 0.597121121747804630, 0.597161228555723620, +0.597201333870739480, 0.597241437692752290, 0.597281540021661230, 0.597321640857366280, 0.597361740199767290, 0.597401838048764340, 0.597441934404256300, 0.597482029266143580, +0.597522122634325690, 0.597562214508702840, 0.597602304889174100, 0.597642393775639660, 0.597682481167999160, 0.597722567066152900, 0.597762651469999850, 0.597802734379440090, +0.597842815794373590, 0.597882895714700320, 0.597922974140319470, 0.597963051071131240, 0.598003126507035350, 0.598043200447932020, 0.598083272893720320, 0.598123343844300440, +0.598163413299572570, 0.598203481259435790, 0.598243547723790290, 0.598283612692535940, 0.598323676165572920, 0.598363738142800310, 0.598403798624118410, 0.598443857609427090, +0.598483915098626310, 0.598523971091615480, 0.598564025588294690, 0.598604078588563900, 0.598644130092323200, 0.598684180099471890, 0.598724228609910040, 0.598764275623537730, +0.598804321140254950, 0.598844365159961090, 0.598884407682556350, 0.598924448707940930, 0.598964488236014000, 0.599004526266675890, 0.599044562799826430, 0.599084597835365830, +0.599124631373193490, 0.599164663413209620, 0.599204693955313950, 0.599244722999407010, 0.599284750545387880, 0.599324776593156860, 0.599364801142613920, 0.599404824193659370, +0.599444845746192280, 0.599484865800113180, 0.599524884355321920, 0.599564901411718810, 0.599604916969203040, 0.599644931027674910, 0.599684943587034950, 0.599724954647182230, +0.599764964208017060, 0.599804972269439520, 0.599844978831349910, 0.599884983893647530, 0.599924987456232680, 0.599964989519005340, 0.600004990081865920, 0.600044989144713600, +0.600084986707448810, 0.600124982769971620, 0.600164977332182330, 0.600204970393980240, 0.600244961955265670, 0.600284952015938680, 0.600324940575899690, 0.600364927635048010, +0.600404913193284040, 0.600444897250507760, 0.600484879806619580, 0.600524860861518790, 0.600564840415105940, 0.600604818467281310, 0.600644795017944320, 0.600684770066995280, +0.600724743614334370, 0.600764715659861890, 0.600804686203477380, 0.600844655245081020, 0.600884622784573110, 0.600924588821853960, 0.600964553356822970, 0.601004516389380680, +0.601044477919427060, 0.601084437946862500, 0.601124396471586550, 0.601164353493499730, 0.601204309012501880, 0.601244263028493650, 0.601284215541374460, 0.601324166551044700, +0.601364116057404810, 0.601404064060354400, 0.601444010559793680, 0.601483955555623060, 0.601523899047742840, 0.601563841036052540, 0.601603781520452690, 0.601643720500843250, +0.601683657977124970, 0.601723593949197170, 0.601763528416960460, 0.601803461380314820, 0.601843392839160880, 0.601883322793398180, 0.601923251242927120, 0.601963178187648000, +0.602003103627461230, 0.602043027562266350, 0.602082949991963880, 0.602122870916454330, 0.602162790335637350, 0.602202708249413470, 0.602242624657682630, 0.602282539560345720, +0.602322452957302020, 0.602362364848452290, 0.602402275233696600, 0.602442184112935600, 0.602482091486068680, 0.602521997352996610, 0.602561901713619560, 0.602601804567838070, +0.602641705915551770, 0.602681605756661190, 0.602721504091066510, 0.602761400918668590, 0.602801296239366620, 0.602841190053061580, 0.602881082359653760, 0.602920973159043030, +0.602960862451129790, 0.603000750235814450, 0.603040636512997550, 0.603080521282578720, 0.603120404544458480, 0.603160286298537350, 0.603200166544715870, 0.603240045282893540, +0.603279922512971130, 0.603319798234848940, 0.603359672448427590, 0.603399545153606720, 0.603439416350286970, 0.603479286038368650, 0.603519154217752480, 0.603559020888338130, +0.603598886050026100, 0.603638749702717030, 0.603678611846311330, 0.603718472480708760, 0.603758331605810050, 0.603798189221515850, 0.603838045327725780, 0.603877899924340600, +0.603917753011260720, 0.603957604588386760, 0.603997454655618490, 0.604037303212856540, 0.604077150260001310, 0.604116995796953550, 0.604156839823613010, 0.604196682339880330, +0.604236523345656030, 0.604276362840840740, 0.604316200825334100, 0.604356037299037090, 0.604395872261849880, 0.604435705713673330, 0.604475537654407310, 0.604515368083952340, +0.604555197002209280, 0.604595024409077860, 0.604634850304458960, 0.604674674688252870, 0.604714497560360550, 0.604754318920681540, 0.604794138769116700, 0.604833957105566640, +0.604873773929931910, 0.604913589242112470, 0.604953403042009060, 0.604993215329522100, 0.605033026104552450, 0.605072835366999960, 0.605112643116765270, 0.605152449353749010, +0.605192254077852040, 0.605232057288974110, 0.605271858987015960, 0.605311659171878460, 0.605351457843461560, 0.605391255001666020, 0.605431050646392240, 0.605470844777541320, +0.605510637395012870, 0.605550428498707770, 0.605590218088526640, 0.605630006164370350, 0.605669792726138630, 0.605709577773732470, 0.605749361307052370, 0.605789143325999310, +0.605828923830472930, 0.605868702820374190, 0.605908480295603850, 0.605948256256062520, 0.605988030701650300, 0.606027803632267940, 0.606067575047816050, 0.606107344948195630, +0.606147113333306510, 0.606186880203049560, 0.606226645557325750, 0.606266409396035040, 0.606306171719078190, 0.606345932526356050, 0.606385691817769360, 0.606425449593218090, +0.606465205852603220, 0.606504960595825260, 0.606544713822785300, 0.606584465533383190, 0.606624215727520010, 0.606663964405096180, 0.606703711566012880, 0.606743457210169870, +0.606783201337468210, 0.606822943947808670, 0.606862685041091980, 0.606902424617218330, 0.606942162676088580, 0.606981899217603700, 0.607021634241663780, 0.607061367748169770, +0.607101099737022420, 0.607140830208122590, 0.607180559161370370, 0.607220286596666710, 0.607260012513912370, 0.607299736913008310, 0.607339459793854620, 0.607379181156352250, +0.607418901000401860, 0.607458619325904610, 0.607498336132760500, 0.607538051420870580, 0.607577765190135510, 0.607617477440456350, 0.607657188171733090, 0.607696897383866900, +0.607736605076758860, 0.607776311250308950, 0.607816015904418250, 0.607855719038987500, 0.607895420653917770, 0.607935120749109160, 0.607974819324462850, 0.608014516379879360, +0.608054211915259990, 0.608093905930504720, 0.608133598425514620, 0.608173289400190660, 0.608212978854433710, 0.608252666788144050, 0.608292353201222660, 0.608332038093570390, +0.608371721465088440, 0.608411403315676780, 0.608451083645236700, 0.608490762453669180, 0.608530439740874400, 0.608570115506753550, 0.608609789751207390, 0.608649462474137090, +0.608689133675442860, 0.608728803355025770, 0.608768471512786570, 0.608808138148626670, 0.608847803262446030, 0.608887466854145850, 0.608927128923626990, 0.608966789470790750, +0.609006448495537090, 0.609046105997767430, 0.609085761977382400, 0.609125416434283310, 0.609165069368370340, 0.609204720779544790, 0.609244370667707310, 0.609284019032759310, +0.609323665874600960, 0.609363311193133360, 0.609402954988257920, 0.609442597259874600, 0.609482238007884920, 0.609521877232189650, 0.609561514932689950, 0.609601151109286140, +0.609640785761879520, 0.609680418890370830, 0.609720050494661490, 0.609759680574651690, 0.609799309130242720, 0.609838936161335440, 0.609878561667831160, 0.609918185649630070, +0.609957808106633690, 0.609997429038742660, 0.610037048445858380, 0.610076666327881160, 0.610116282684712300, 0.610155897516253100, 0.610195510822403750, 0.610235122603065670, +0.610274732858139820, 0.610314341587527400, 0.610353948791128810, 0.610393554468845360, 0.610433158620578010, 0.610472761246228180, 0.610512362345696060, 0.610551961918882950, +0.610591559965690030, 0.610631156486018510, 0.610670751479768790, 0.610710344946842180, 0.610749936887139630, 0.610789527300562680, 0.610829116187011520, 0.610868703546387560, +0.610908289378592210, 0.610947873683525880, 0.610987456461089760, 0.611027037711185050, 0.611066617433713040, 0.611106195628574160, 0.611145772295669800, 0.611185347434900940, +0.611224921046169210, 0.611264493129374700, 0.611304063684419030, 0.611343632711203180, 0.611383200209628550, 0.611422766179595680, 0.611462330621005750, 0.611501893533760050, +0.611541454917760020, 0.611581014772905940, 0.611620573099099340, 0.611660129896241410, 0.611699685164233340, 0.611739238902975770, 0.611778791112370100, 0.611818341792317870, +0.611857890942719360, 0.611897438563476110, 0.611936984654489310, 0.611976529215660480, 0.612016072246889810, 0.612055613748079040, 0.612095153719129260, 0.612134692159941980, +0.612174229070417520, 0.612213764450457500, 0.612253298299963110, 0.612292830618835770, 0.612332361406976110, 0.612371890664285430, 0.612411418390665040, 0.612450944586016570, +0.612490469250240310, 0.612529992383237800, 0.612569513984910770, 0.612609034055159540, 0.612648552593885840, 0.612688069600990650, 0.612727585076375590, 0.612767099019941310, +0.612806611431589320, 0.612846122311220710, 0.612885631658737220, 0.612925139474039150, 0.612964645757028360, 0.613004150507605930, 0.613043653725673490, 0.613083155411131560, +0.613122655563881790, 0.613162154183825250, 0.613201651270863790, 0.613241146824897830, 0.613280640845829010, 0.613320133333558950, 0.613359624287988070, 0.613399113709018230, +0.613438601596550610, 0.613478087950486860, 0.613517572770727490, 0.613557056057174250, 0.613596537809728340, 0.613636018028291490, 0.613675496712764110, 0.613714973863048070, +0.613754449479044560, 0.613793923560655320, 0.613833396107780980, 0.613872867120323070, 0.613912336598183010, 0.613951804541262410, 0.613991270949461930, 0.614030735822683420, +0.614070199160828280, 0.614109660963797380, 0.614149121231492230, 0.614188579963814370, 0.614228037160665430, 0.614267492821945930, 0.614306946947557830, 0.614346399537402220, +0.614385850591381070, 0.614425300109394890, 0.614464748091345550, 0.614504194537134230, 0.614543639446662790, 0.614583082819831980, 0.614622524656543430, 0.614661964956698560, +0.614701403720199100, 0.614740840946945810, 0.614780276636840430, 0.614819710789784260, 0.614859143405679260, 0.614898574484426090, 0.614938004025926350, 0.614977432030082040, +0.615016858496793770, 0.615056283425963410, 0.615095706817492260, 0.615135128671282280, 0.615174548987234120, 0.615213967765249500, 0.615253385005230080, 0.615292800707077480, +0.615332214870692450, 0.615371627495976960, 0.615411038582832410, 0.615450448131160680, 0.615489856140862380, 0.615529262611839490, 0.615568667543993420, 0.615608070937226030, +0.615647472791438060, 0.615686873106531470, 0.615726271882408030, 0.615765669118968570, 0.615805064816114970, 0.615844458973748730, 0.615883851591771610, 0.615923242670084580, +0.615962632208589380, 0.616002020207187640, 0.616041406665781110, 0.616080791584270870, 0.616120174962558550, 0.616159556800545790, 0.616198937098134560, 0.616238315855225590, +0.616277693071720760, 0.616317068747521790, 0.616356442882530550, 0.616395815476647680, 0.616435186529775470, 0.616474556041815450, 0.616513924012668800, 0.616553290442237390, +0.616592655330422620, 0.616632018677126690, 0.616671380482250340, 0.616710740745695430, 0.616750099467363810, 0.616789456647157230, 0.616828812284976660, 0.616868166380723950, +0.616907518934300960, 0.616946869945609540, 0.616986219414550560, 0.617025567341025980, 0.617064913724937550, 0.617104258566187110, 0.617143601864675760, 0.617182943620305350, +0.617222283832977610, 0.617261622502594420, 0.617300959629056960, 0.617340295212267080, 0.617379629252126750, 0.617418961748537050, 0.617458292701399850, 0.617497622110616980, +0.617536949976090430, 0.617576276297721160, 0.617615601075411140, 0.617654924309062210, 0.617694245998576250, 0.617733566143854330, 0.617772884744798520, 0.617812201801310470, +0.617851517313292240, 0.617890831280644930, 0.617930143703270480, 0.617969454581070780, 0.618008763913947660, 0.618048071701802430, 0.618087377944536830, 0.618126682642053280, +0.618165985794252640, 0.618205287401037080, 0.618244587462308150, 0.618283885977968240, 0.618323182947918220, 0.618362478372060260, 0.618401772250296130, 0.618441064582527900, +0.618480355368656640, 0.618519644608584440, 0.618558932302213260, 0.618598218449444960, 0.618637503050180840, 0.618676786104322970, 0.618716067611773110, 0.618755347572433450, +0.618794625986205050, 0.618833902852990110, 0.618873178172690720, 0.618912451945208050, 0.618951724170444310, 0.618990994848301220, 0.619030263978680990, 0.619069531561484700, +0.619108797596614640, 0.619148062083972550, 0.619187325023460740, 0.619226586414980180, 0.619265846258433170, 0.619305104553721560, 0.619344361300747550, 0.619383616499412320, +0.619422870149617940, 0.619462122251266400, 0.619501372804259990, 0.619540621808499780, 0.619579869263887970, 0.619619115170326860, 0.619658359527717640, 0.619697602335962490, +0.619736843594963280, 0.619776083304622420, 0.619815321464840970, 0.619854558075521140, 0.619893793136565010, 0.619933026647874750, 0.619972258609351570, 0.620011489020897640, +0.620050717882415060, 0.620089945193806000, 0.620129170954971780, 0.620168395165814680, 0.620207617826236460, 0.620246838936139630, 0.620286058495425400, 0.620325276503995940, +0.620364492961753330, 0.620403707868599770, 0.620442921224436670, 0.620482133029166220, 0.620521343282690820, 0.620560551984911670, 0.620599759135731180, 0.620638964735051200, +0.620678168782774260, 0.620717371278801560, 0.620756572223035370, 0.620795771615377800, 0.620834969455731130, 0.620874165743996680, 0.620913360480076840, 0.620952553663873590, +0.620991745295289220, 0.621030935374225270, 0.621070123900583910, 0.621109310874267240, 0.621148496295177650, 0.621187680163216460, 0.621226862478286180, 0.621266043240289000, +0.621305222449126340, 0.621344400104700600, 0.621383576206913980, 0.621422750755668660, 0.621461923750866170, 0.621501095192408810, 0.621540265080198770, 0.621579433414138350, +0.621618600194129070, 0.621657765420073340, 0.621696929091873020, 0.621736091209430850, 0.621775251772648140, 0.621814410781427180, 0.621853568235670280, 0.621892724135279850, +0.621931878480157190, 0.621971031270204810, 0.622010182505325250, 0.622049332185419910, 0.622088480310391210, 0.622127626880141230, 0.622166771894572590, 0.622205915353586710, +0.622245057257086010, 0.622284197604972670, 0.622323336397149210, 0.622362473633517040, 0.622401609313978700, 0.622440743438436250, 0.622479876006792440, 0.622519007018948470, +0.622558136474807070, 0.622597264374270210, 0.622636390717240640, 0.622675515503619770, 0.622714638733310010, 0.622753760406213660, 0.622792880522233360, 0.622831999081270400, +0.622871116083227540, 0.622910231528007170, 0.622949345415510950, 0.622988457745641270, 0.623027568518300550, 0.623066677733391190, 0.623105785390814740, 0.623144891490473920, +0.623183996032270810, 0.623223099016108060, 0.623262200441887290, 0.623301300309510920, 0.623340398618881350, 0.623379495369901120, 0.623418590562471840, 0.623457684196496050, +0.623496776271876050, 0.623535866788514470, 0.623574955746312830, 0.623614043145173880, 0.623653128985000140, 0.623692213265693130, 0.623731295987155710, 0.623770377149290070, +0.623809456751998730, 0.623848534795183430, 0.623887611278746810, 0.623926686202591170, 0.623965759566619150, 0.624004831370732480, 0.624043901614833580, 0.624082970298824980, +0.624122037422609300, 0.624161102986088290, 0.624200166989164360, 0.624239229431740040, 0.624278290313718070, 0.624317349634999960, 0.624356407395488590, 0.624395463595086350, +0.624434518233695330, 0.624473571311217830, 0.624512622827556490, 0.624551672782613920, 0.624590721176291890, 0.624629768008492900, 0.624668813279119610, 0.624707856988074630, +0.624746899135259600, 0.624785939720577390, 0.624824978743930280, 0.624864016205221140, 0.624903052104351600, 0.624942086441224400, 0.624981119215741950, 0.625020150427807120, +0.625059180077321530, 0.625098208164187930, 0.625137234688309170, 0.625176259649587120, 0.625215283047924290, 0.625254304883223310, 0.625293325155386830, 0.625332343864316800, +0.625371361009915860, 0.625410376592086540, 0.625449390610731570, 0.625488403065752820, 0.625527413957053020, 0.625566423284534710, 0.625605431048100740, 0.625644437247652840, +0.625683441883093770, 0.625722444954326160, 0.625761446461252760, 0.625800446403775410, 0.625839444781796870, 0.625878441595219770, 0.625917436843946960, 0.625956430527880190, +0.625995422646922320, 0.626034413200976300, 0.626073402189943780, 0.626112389613727840, 0.626151375472230990, 0.626190359765355970, 0.626229342493004660, 0.626268323655080010, +0.626307303251484540, 0.626346281282121220, 0.626385257746891910, 0.626424232645699350, 0.626463205978446180, 0.626502177745035470, 0.626541147945368860, 0.626580116579349420, +0.626619083646879680, 0.626658049147862610, 0.626697013082200050, 0.626735975449794980, 0.626774936250550250, 0.626813895484367830, 0.626852853151150800, 0.626891809250801460, +0.626930763783223100, 0.626969716748317360, 0.627008668145987440, 0.627047617976135840, 0.627086566238665430, 0.627125512933478290, 0.627164458060477490, 0.627203401619565450, +0.627242343610645240, 0.627281284033618820, 0.627320222888389290, 0.627359160174859150, 0.627398095892931380, 0.627437030042508060, 0.627475962623492260, 0.627514893635786830, +0.627553823079293750, 0.627592750953916200, 0.627631677259556820, 0.627670601996118460, 0.627709525163503310, 0.627748446761614340, 0.627787366790354300, 0.627826285249626140, +0.627865202139331950, 0.627904117459374800, 0.627943031209657220, 0.627981943390082510, 0.628020854000552630, 0.628059763040970550, 0.628098670511239020, 0.628137576411261220, +0.628176480740939120, 0.628215383500175810, 0.628254284688874120, 0.628293184306937040, 0.628332082354266520, 0.628370978830765870, 0.628409873736338160, 0.628448767070885370, +0.628487658834310790, 0.628526549026516950, 0.628565437647407020, 0.628604324696883320, 0.628643210174848700, 0.628682094081206010, 0.628720976415858560, 0.628759857178708190, +0.628798736369658330, 0.628837613988611490, 0.628876490035470970, 0.628915364510138960, 0.628954237412518550, 0.628993108742512460, 0.629031978500024010, 0.629070846684955160, +0.629109713297209330, 0.629148578336689470, 0.629187441803297890, 0.629226303696937660, 0.629265164017511760, 0.629304022764923140, 0.629342879939074230, 0.629381735539868090, +0.629420589567207590, 0.629459442020996020, 0.629498292901135460, 0.629537142207529100, 0.629575989940080020, 0.629614836098691180, 0.629653680683264990, 0.629692523693704540, +0.629731365129912900, 0.629770204991793040, 0.629809043279247470, 0.629847879992179170, 0.629886715130491550, 0.629925548694086790, 0.629964380682868200, 0.630003211096738620, +0.630042039935601370, 0.630080867199358740, 0.630119692887913920, 0.630158517001169760, 0.630197339539029790, 0.630236160501395970, 0.630274979888171830, 0.630313797699260330, +0.630352613934564540, 0.630391428593986890, 0.630430241677430780, 0.630469053184798960, 0.630507863115994940, 0.630546671470920810, 0.630585478249480080, 0.630624283451575950, +0.630663087077110830, 0.630701889125987900, 0.630740689598110360, 0.630779488493381390, 0.630818285811703290, 0.630857081552979590, 0.630895875717113140, 0.630934668304007350, +0.630973459313564520, 0.631012248745688060, 0.631051036600280950, 0.631089822877246580, 0.631128607576487370, 0.631167390697906620, 0.631206172241407400, 0.631244952206893030, +0.631283730594266010, 0.631322507403429660, 0.631361282634287040, 0.631400056286741560, 0.631438828360695540, 0.631477598856052480, 0.631516367772715800, 0.631555135110587810, +0.631593900869572010, 0.631632665049571500, 0.631671427650489560, 0.631710188672228830, 0.631748948114692510, 0.631787705977783890, 0.631826462261406370, 0.631865216965462270, +0.631903970089855220, 0.631942721634488170, 0.631981471599264770, 0.632020219984087190, 0.632058966788859200, 0.632097712013483750, 0.632136455657864360, 0.632175197721903450, +0.632213938205504530, 0.632252677108571250, 0.632291414431005780, 0.632330150172711880, 0.632368884333592510, 0.632407616913551300, 0.632446347912490770, 0.632485077330314230, +0.632523805166925080, 0.632562531422226850, 0.632601256096121830, 0.632639979188513670, 0.632678700699305650, 0.632717420628401190, 0.632756138975702820, 0.632794855741114050, +0.632833570924538180, 0.632872284525878740, 0.632910996545038240, 0.632949706981920320, 0.632988415836428400, 0.633027123108465100, 0.633065828797934050, 0.633104532904738340, +0.633143235428781700, 0.633181936369966560, 0.633220635728196650, 0.633259333503375150, 0.633298029695405610, 0.633336724304190630, 0.633375417329633980, 0.633414108771638620, +0.633452798630108390, 0.633491486904945830, 0.633530173596054570, 0.633568858703337900, 0.633607542226699350, 0.633646224166041660, 0.633684904521268470, 0.633723583292282950, +0.633762260478988760, 0.633800936081288620, 0.633839610099086180, 0.633878282532285060, 0.633916953380787800, 0.633955622644498230, 0.633994290323319550, 0.634032956417155510, +0.634071620925908740, 0.634110283849482980, 0.634148945187781420, 0.634187604940707920, 0.634226263108164990, 0.634264919690056490, 0.634303574686285620, 0.634342228096756220, +0.634380879921370820, 0.634419530160033270, 0.634458178812646880, 0.634496825879115380, 0.634535471359341520, 0.634574115253228930, 0.634612757560681360, 0.634651398281601660, +0.634690037415893360, 0.634728674963460080, 0.634767310924205350, 0.634805945298032030, 0.634844578084843960, 0.634883209284544340, 0.634921838897037020, 0.634960466922224740, +0.634999093360011370, 0.635037718210300190, 0.635076341472995190, 0.635114963147998870, 0.635153583235215200, 0.635192201734547490, 0.635230818645899700, 0.635269433969174570, +0.635308047704275740, 0.635346659851107170, 0.635385270409571600, 0.635423879379572900, 0.635462486761014470, 0.635501092553800160, 0.635539696757832840, 0.635578299373016240, +0.635616900399253780, 0.635655499836449530, 0.635694097684506240, 0.635732693943327650, 0.635771288612817290, 0.635809881692879000, 0.635848473183415750, 0.635887063084331290, +0.635925651395529260, 0.635964238116913380, 0.636002823248386530, 0.636041406789852660, 0.636079988741215630, 0.636118569102378180, 0.636157147873244400, 0.636195725053717690, +0.636234300643702120, 0.636272874643100340, 0.636311447051816410, 0.636350017869753870, 0.636388587096816670, 0.636427154732907670, 0.636465720777930730, 0.636504285231789480, +0.636542848094387880, 0.636581409365628790, 0.636619969045416180, 0.636658527133653670, 0.636697083630245240, 0.636735638535093740, 0.636774191848103020, 0.636812743569176940, +0.636851293698219360, 0.636889842235133120, 0.636928389179822310, 0.636966934532190890, 0.637005478292141710, 0.637044020459578970, 0.637082561034406080, 0.637121100016527110, +0.637159637405845140, 0.637198173202264020, 0.637236707405687500, 0.637275240016019540, 0.637313771033163110, 0.637352300457022290, 0.637390828287500710, 0.637429354524502330, +0.637467879167930350, 0.637506402217688510, 0.637544923673680760, 0.637583443535811090, 0.637621961803982450, 0.637660478478098810, 0.637698993558064480, 0.637737507043782180, +0.637776018935156230, 0.637814529232090140, 0.637853037934488110, 0.637891545042253090, 0.637930050555289290, 0.637968554473500320, 0.638007056796790260, 0.638045557525062310, +0.638084056658220430, 0.638122554196168370, 0.638161050138810300, 0.638199544486049210, 0.638238037237789380, 0.638276528393934340, 0.638315017954388390, 0.638353505919054490, +0.638391992287836940, 0.638430477060639600, 0.638468960237365880, 0.638507441817919630, 0.638545921802204820, 0.638584400190125520, 0.638622876981584930, 0.638661352176487120, +0.638699825774735940, 0.638738297776235590, 0.638776768180889130, 0.638815236988600650, 0.638853704199274230, 0.638892169812813830, 0.638930633829122630, 0.638969096248104830, +0.639007557069664280, 0.639046016293705280, 0.639084473920130790, 0.639122929948845230, 0.639161384379752230, 0.639199837212756190, 0.639238288447760210, 0.639276738084668450, +0.639315186123385230, 0.639353632563813720, 0.639392077405858130, 0.639430520649422300, 0.639468962294410530, 0.639507402340726010, 0.639545840788272920, 0.639584277636955360, +0.639622712886677380, 0.639661146537342300, 0.639699578588854290, 0.639738009041117440, 0.639776437894035820, 0.639814865147512850, 0.639853290801452590, 0.639891714855759240, +0.639930137310336880, 0.639968558165088800, 0.640006977419919300, 0.640045395074732790, 0.640083811129432470, 0.640122225583922510, 0.640160638438107110, 0.640199049691890340, +0.640237459345175730, 0.640275867397867350, 0.640314273849869390, 0.640352678701086030, 0.640391081951420690, 0.640429483600777560, 0.640467883649060710, 0.640506282096174660, +0.640544678942022380, 0.640583074186508510, 0.640621467829536880, 0.640659859871012040, 0.640698250310837050, 0.640736639148916540, 0.640775026385154820, 0.640813412019455080, +0.640851796051721820, 0.640890178481859140, 0.640928559309771330, 0.640966938535361800, 0.641005316158534840, 0.641043692179194660, 0.641082066597245650, 0.641120439412591000, +0.641158810625135360, 0.641197180234782560, 0.641235548241437250, 0.641273914645002720, 0.641312279445383380, 0.641350642642483430, 0.641389004236207150, 0.641427364226457960, +0.641465722613140390, 0.641504079396158940, 0.641542434575416820, 0.641580788150818760, 0.641619140122268620, 0.641657490489671020, 0.641695839252929280, 0.641734186411948020, +0.641772531966631310, 0.641810875916883570, 0.641849218262608320, 0.641887559003709970, 0.641925898140092820, 0.641964235671661170, 0.642002571598318640, 0.642040905919969650, +0.642079238636518390, 0.642117569747869490, 0.642155899253926240, 0.642194227154593180, 0.642232553449774590, 0.642270878139375000, 0.642309201223297820, 0.642347522701447680, +0.642385842573729100, 0.642424160840045500, 0.642462477500301610, 0.642500792554401400, 0.642539106002249620, 0.642577417843749670, 0.642615728078806290, 0.642654036707323460, +0.642692343729205920, 0.642730649144357290, 0.642768952952681880, 0.642807255154084210, 0.642845555748468690, 0.642883854735738950, 0.642922152115799510, 0.642960447888554780, +0.642998742053909170, 0.643037034611766420, 0.643075325562031170, 0.643113614904607830, 0.643151902639400140, 0.643190188766312730, 0.643228473285249790, 0.643266756196116060, +0.643305037498815070, 0.643343317193251550, 0.643381595279329700, 0.643419871756954140, 0.643458146626028630, 0.643496419886457780, 0.643534691538145800, 0.643572961580997420, +0.643611230014916380, 0.643649496839807210, 0.643687762055574320, 0.643726025662122340, 0.643764287659355010, 0.643802548047176960, 0.643840806825492830, 0.643879063994206360, +0.643917319553222180, 0.643955573502444810, 0.643993825841778780, 0.644032076571127820, 0.644070325690396680, 0.644108573199489780, 0.644146819098311730, 0.644185063386766400, +0.644223306064758310, 0.644261547132191970, 0.644299786588972130, 0.644338024435002430, 0.644376260670187720, 0.644414495294432290, 0.644452728307641000, 0.644490959709717590, +0.644529189500566810, 0.644567417680092960, 0.644605644248200990, 0.644643869204794440, 0.644682092549778370, 0.644720314283057320, 0.644758534404535230, 0.644796752914116640, +0.644834969811706290, 0.644873185097208920, 0.644911398770528050, 0.644949610831568880, 0.644987821280235570, 0.645026030116433110, 0.645064237340065130, 0.645102442951036690, +0.645140646949252110, 0.645178849334616220, 0.645217050107032790, 0.645255249266406870, 0.645293446812642780, 0.645331642745645360, 0.645369837065318590, 0.645408029771567190, +0.645446220864296040, 0.645484410343408980, 0.645522598208810860, 0.645560784460406320, 0.645598969098100220, 0.645637152121796290, 0.645675333531399390, 0.645713513326814260, +0.645751691507945650, 0.645789868074697520, 0.645828043026974720, 0.645866216364681670, 0.645904388087723550, 0.645942558196004100, 0.645980726689428300, 0.646018893567900650, +0.646057058831326030, 0.646095222479608490, 0.646133384512652900, 0.646171544930364220, 0.646209703732646300, 0.646247860919404000, 0.646286016490542180, 0.646324170445965680, +0.646362322785578370, 0.646400473509285310, 0.646438622616991030, 0.646476770108600500, 0.646514915984017670, 0.646553060243147630, 0.646591202885894890, 0.646629343912164530, +0.646667483321860530, 0.646705621114887720, 0.646743757291150860, 0.646781891850555010, 0.646820024793004040, 0.646858156118403030, 0.646896285826656590, 0.646934413917669810, +0.646972540391346660, 0.647010665247592100, 0.647048788486311200, 0.647086910107408150, 0.647125030110787700, 0.647163148496354700, 0.647201265264014220, 0.647239380413670130, +0.647277493945227710, 0.647315605858591490, 0.647353716153666550, 0.647391824830357070, 0.647429931888567900, 0.647468037328204020, 0.647506141149170380, 0.647544243351371060, +0.647582343934711040, 0.647620442899095260, 0.647658540244428590, 0.647696635970615330, 0.647734730077560440, 0.647772822565169100, 0.647810913433345400, 0.647849002681994300, +0.647887090311020760, 0.647925176320329870, 0.647963260709825680, 0.648001343479413290, 0.648039424628997550, 0.648077504158483640, 0.648115582067775640, 0.648153658356778630, +0.648191733025397450, 0.648229806073537420, 0.648267877501102370, 0.648305947307997730, 0.648344015494128120, 0.648382082059398850, 0.648420147003714090, 0.648458210326978920, +0.648496272029098650, 0.648534332109977240, 0.648572390569520100, 0.648610447407631850, 0.648648502624217920, 0.648686556219182360, 0.648724608192430500, 0.648762658543867050, +0.648800707273397230, 0.648838754380925420, 0.648876799866356600, 0.648914843729595850, 0.648952885970548340, 0.648990926589118280, 0.649028965585210840, 0.649067002958731100, +0.649105038709584140, 0.649143072837674250, 0.649181105342906630, 0.649219136225186570, 0.649257165484418360, 0.649295193120507320, 0.649333219133358170, 0.649371243522876450, +0.649409266288966220, 0.649447287431532790, 0.649485306950481120, 0.649523324845716620, 0.649561341117143360, 0.649599355764666760, 0.649637368788191890, 0.649675380187623830, +0.649713389962866980, 0.649751398113826650, 0.649789404640407910, 0.649827409542515940, 0.649865412820055170, 0.649903414472930760, 0.649941414501047920, 0.649979412904311830, +0.650017409682626780, 0.650055404835898300, 0.650093398364031680, 0.650131390266931230, 0.650169380544502240, 0.650207369196649790, 0.650245356223279280, 0.650283341624295020, +0.650321325399602520, 0.650359307549106540, 0.650397288072712800, 0.650435266970325390, 0.650473244241849820, 0.650511219887191180, 0.650549193906254760, 0.650587166298945090, +0.650625137065167450, 0.650663106204827040, 0.650701073717829150, 0.650739039604078200, 0.650777003863479700, 0.650814966495939060, 0.650852927501360590, 0.650890886879649910, +0.650928844630711880, 0.650966800754452120, 0.651004755250775060, 0.651042708119586090, 0.651080659360790400, 0.651118608974293300, 0.651156556959999410, 0.651194503317814140, +0.651232448047642580, 0.651270391149390230, 0.651308332622961620, 0.651346272468262160, 0.651384210685197030, 0.651422147273671650, 0.651460082233590530, 0.651498015564859310, +0.651535947267383290, 0.651573877341067200, 0.651611805785816230, 0.651649732601535910, 0.651687657788131540, 0.651725581345507730, 0.651763503273569910, 0.651801423572223370, +0.651839342241373520, 0.651877259280925100, 0.651915174690783420, 0.651953088470853870, 0.651991000621041980, 0.652028911141252170, 0.652066820031390050, 0.652104727291360930, +0.652142632921070440, 0.652180536920422880, 0.652218439289323990, 0.652256340027679070, 0.652294239135393640, 0.652332136612372220, 0.652370032458520430, 0.652407926673744030, +0.652445819257947420, 0.652483710211036130, 0.652521599532915660, 0.652559487223491660, 0.652597373282668420, 0.652635257710351800, 0.652673140506447090, 0.652711021670859810, +0.652748901203494600, 0.652786779104257200, 0.652824655373052900, 0.652862530009787220, 0.652900403014364920, 0.652938274386691610, 0.652976144126672600, 0.653014012234213510, +0.653051878709219100, 0.653089743551594990, 0.653127606761246930, 0.653165468338079420, 0.653203328281998340, 0.653241186592908860, 0.653279043270716730, 0.653316898315326690, +0.653354751726644480, 0.653392603504575290, 0.653430453649024970, 0.653468302159898150, 0.653506149037100580, 0.653543994280537670, 0.653581837890115040, 0.653619679865737550, +0.653657520207310830, 0.653695358914740290, 0.653733195987931780, 0.653771031426789830, 0.653808865231220390, 0.653846697401129110, 0.653884527936420710, 0.653922356837000950, +0.653960184102775340, 0.653998009733649630, 0.654035833729528560, 0.654073656090317980, 0.654111476815923080, 0.654149295906249930, 0.654187113361203280, 0.654224929180688750, +0.654262743364611880, 0.654300555912878500, 0.654338366825393480, 0.654376176102062450, 0.654413983742791030, 0.654451789747484970, 0.654489594116049120, 0.654527396848389230, +0.654565197944411150, 0.654602997404019840, 0.654640795227121040, 0.654678591413620170, 0.654716385963423190, 0.654754178876434940, 0.654791970152561190, 0.654829759791707540, +0.654867547793779870, 0.654905334158682910, 0.654943118886322730, 0.654980901976604630, 0.655018683429434700, 0.655056463244717670, 0.655094241422359500, 0.655132017962265830, +0.655169792864342290, 0.655207566128494070, 0.655245337754626790, 0.655283107742646200, 0.655320876092458260, 0.655358642803967720, 0.655396407877080640, 0.655434171311702900, +0.655471933107739320, 0.655509693265095890, 0.655547451783678240, 0.655585208663392320, 0.655622963904143100, 0.655660717505836320, 0.655698469468377840, 0.655736219791673510, +0.655773968475628300, 0.655811715520148280, 0.655849460925138850, 0.655887204690506100, 0.655924946816154990, 0.655962687301991590, 0.656000426147921420, 0.656038163353850460, +0.656075898919683880, 0.656113632845327530, 0.656151365130687390, 0.656189095775668530, 0.656226824780176910, 0.656264552144118160, 0.656302277867398480, 0.656340001949922700, +0.656377724391596920, 0.656415445192326860, 0.656453164352018610, 0.656490881870576910, 0.656528597747908170, 0.656566311983917910, 0.656604024578512190, 0.656641735531595990, +0.656679444843075500, 0.656717152512856450, 0.656754858540844810, 0.656792562926945770, 0.656830265671065280, 0.656867966773109440, 0.656905666232983300, 0.656943364050593060, +0.656981060225844350, 0.657018754758643350, 0.657056447648895150, 0.657094138896505810, 0.657131828501381190, 0.657169516463427250, 0.657207202782549290, 0.657244887458653170, +0.657282570491644960, 0.657320251881430620, 0.657357931627915230, 0.657395609731005190, 0.657433286190605930, 0.657470961006623940, 0.657508634178964100, 0.657546305707532810, +0.657583975592235690, 0.657621643832978940, 0.657659310429667740, 0.657696975382208280, 0.657734638690506750, 0.657772300354468210, 0.657809960373998970, 0.657847618749004880, +0.657885275479392020, 0.657922930565065570, 0.657960584005931940, 0.657998235801896760, 0.658035885952866330, 0.658073534458745830, 0.658111181319441570, 0.658148826534859290, +0.658186470104905390, 0.658224112029484830, 0.658261752308504030, 0.658299390941868960, 0.658337027929485560, 0.658374663271259370, 0.658412296967096580, 0.658449929016903250, +0.658487559420584900, 0.658525188178047500, 0.658562815289197250, 0.658600440753940310, 0.658638064572181770, 0.658675686743828260, 0.658713307268785410, 0.658750926146959740, +0.658788543378256320, 0.658826158962581570, 0.658863772899841440, 0.658901385189942120, 0.658938995832789140, 0.658976604828288570, 0.659014212176346480, 0.659051817876869280, +0.659089421929762160, 0.659127024334931530, 0.659164625092283570, 0.659202224201723810, 0.659239821663158420, 0.659277417476493600, 0.659315011641635420, 0.659352604158489400, +0.659390195026961940, 0.659427784246959030, 0.659465371818386830, 0.659502957741150970, 0.659540542015157770, 0.659578124640313180, 0.659615705616523500, 0.659653284943694350, +0.659690862621731930, 0.659728438650542430, 0.659766013030032020, 0.659803585760106340, 0.659841156840671680, 0.659878726271634570, 0.659916294052900200, 0.659953860184375070, +0.659991424665965280, 0.660028987497577320, 0.660066548679116630, 0.660104108210489480, 0.660141666091601960, 0.660179222322360810, 0.660216776902671110, 0.660254329832439590, +0.660291881111572110, 0.660329430739975410, 0.660366978717554680, 0.660404525044216540, 0.660442069719867190, 0.660479612744412910, 0.660517154117759240, 0.660554693839812690, +0.660592231910479440, 0.660629768329665910, 0.660667303097277610, 0.660704836213221180, 0.660742367677402910, 0.660779897489728320, 0.660817425650104040, 0.660854952158436260, +0.660892477014631390, 0.660930000218594940, 0.660967521770233550, 0.661005041669453290, 0.661042559916160790, 0.661080076510261570, 0.661117591451662160, 0.661155104740268840, +0.661192616375988030, 0.661230126358725360, 0.661267634688387340, 0.661305141364880170, 0.661342646388110580, 0.661380149757984090, 0.661417651474407120, 0.661455151537286400, +0.661492649946527460, 0.661530146702036910, 0.661567641803720960, 0.661605135251486230, 0.661642627045238350, 0.661680117184883950, 0.661717605670329220, 0.661755092501480790, +0.661792577678244290, 0.661830061200526340, 0.661867543068233370, 0.661905023281271650, 0.661942501839547280, 0.661979978742966440, 0.662017453991435740, 0.662054927584861840, +0.662092399523150130, 0.662129869806207470, 0.662167338433940600, 0.662204805406254930, 0.662242270723057190, 0.662279734384253800, 0.662317196389751510, 0.662354656739455820, +0.662392115433273480, 0.662429572471110890, 0.662467027852874700, 0.662504481578470640, 0.662541933647805230, 0.662579384060785090, 0.662616832817316870, 0.662654279917306190, +0.662691725360659790, 0.662729169147284080, 0.662766611277085800, 0.662804051749970700, 0.662841490565845400, 0.662878927724616320, 0.662916363226190410, 0.662953797070473190, +0.662991229257371420, 0.663028659786791930, 0.663066088658640580, 0.663103515872823900, 0.663140941429248400, 0.663178365327820930, 0.663215787568447230, 0.663253208151034060, +0.663290627075487800, 0.663328044341715330, 0.663365459949622480, 0.663402873899115900, 0.663440286190102200, 0.663477696822488140, 0.663515105796179450, 0.663552513111082990, +0.663589918767105270, 0.663627322764153040, 0.663664725102132260, 0.663702125780949560, 0.663739524800512020, 0.663776922160725260, 0.663814317861496140, 0.663851711902731290, +0.663889104284337450, 0.663926495006220590, 0.663963884068287440, 0.664001271470444520, 0.664038657212598920, 0.664076041294656140, 0.664113423716523380, 0.664150804478107040, +0.664188183579314080, 0.664225561020050260, 0.664262936800222530, 0.664300310919737510, 0.664337683378501960, 0.664375054176421950, 0.664412423313404330, 0.664449790789355950, +0.664487156604182670, 0.664524520757791670, 0.664561883250089250, 0.664599244080982480, 0.664636603250377210, 0.664673960758180530, 0.664711316604298940, 0.664748670788639310, +0.664786023311107700, 0.664823374171611080, 0.664860723370055970, 0.664898070906349450, 0.664935416780397360, 0.664972760992106780, 0.665010103541384230, 0.665047444428136790, +0.665084783652270420, 0.665122121213692070, 0.665159457112308730, 0.665196791348026450, 0.665234123920752210, 0.665271454830392630, 0.665308784076854790, 0.665346111660044540, +0.665383437579869170, 0.665420761836235110, 0.665458084429049520, 0.665495405358218270, 0.665532724623648650, 0.665570042225247180, 0.665607358162920940, 0.665644672436575880, +0.665681985046119310, 0.665719295991457630, 0.665756605272498140, 0.665793912889146800, 0.665831218841310580, 0.665868523128896330, 0.665905825751811230, 0.665943126709961140, +0.665980426003253250, 0.666017723631594620, 0.666055019594891330, 0.666092313893050570, 0.666129606525978970, 0.666166897493583600, 0.666204186795770760, 0.666241474432447410, +0.666278760403520410, 0.666316044708896830, 0.666353327348482850, 0.666390608322185440, 0.666427887629911670, 0.666465165271568400, 0.666502441247061930, 0.666539715556299320, +0.666576988199187430, 0.666614259175633330, 0.666651528485543430, 0.666688796128824590, 0.666726062105384100, 0.666763326415128140, 0.666800589057963800, 0.666837850033798030, +0.666875109342538020, 0.666912366984089840, 0.666949622958360800, 0.666986877265257630, 0.667024129904687620, 0.667061380876557090, 0.667098630180772870, 0.667135877817242260, +0.667173123785872240, 0.667210368086569080, 0.667247610719239990, 0.667284851683791810, 0.667322090980131840, 0.667359328608166380, 0.667396564567802610, 0.667433798858947710, +0.667471031481507990, 0.667508262435390740, 0.667545491720502810, 0.667582719336751510, 0.667619945284043000, 0.667657169562284710, 0.667694392171383380, 0.667731613111246510, +0.667768832381780310, 0.667806049982891950, 0.667843265914488390, 0.667880480176477050, 0.667917692768764340, 0.667954903691257210, 0.667992112943862850, 0.668029320526488670, +0.668066526439040740, 0.668103730681426480, 0.668140933253552950, 0.668178134155327340, 0.668215333386656170, 0.668252530947446630, 0.668289726837606010, 0.668326921057040830, +0.668364113605658390, 0.668401304483365540, 0.668438493690069800, 0.668475681225677580, 0.668512867090096050, 0.668550051283232420, 0.668587233804993960, 0.668624414655287100, +0.668661593834019240, 0.668698771341097340, 0.668735947176428920, 0.668773121339920170, 0.668810293831478720, 0.668847464651011530, 0.668884633798426000, 0.668921801273628550, +0.668958967076526580, 0.668996131207027500, 0.669033293665037830, 0.669070454450464870, 0.669107613563215800, 0.669144771003198020, 0.669181926770317960, 0.669219080864483120, +0.669256233285600580, 0.669293384033577740, 0.669330533108321140, 0.669367680509738160, 0.669404826237736120, 0.669441970292222190, 0.669479112673103120, 0.669516253380286200, +0.669553392413678620, 0.669590529773188000, 0.669627665458720660, 0.669664799470184090, 0.669701931807485940, 0.669739062470532610, 0.669776191459231620, 0.669813318773490150, +0.669850444413215730, 0.669887568378314870, 0.669924690668695090, 0.669961811284263580, 0.669998930224927850, 0.670036047490594420, 0.670073163081170930, 0.670110276996564560, +0.670147389236682820, 0.670184499801432240, 0.670221608690720450, 0.670258715904454630, 0.670295821442542290, 0.670332925304890080, 0.670370027491405620, 0.670407128001996420, +0.670444226836569010, 0.670481323995031130, 0.670518419477289850, 0.670555513283252800, 0.670592605412826730, 0.670629695865919140, 0.670666784642437340, 0.670703871742288850, +0.670740957165380400, 0.670778040911619520, 0.670815122980913610, 0.670852203373170090, 0.670889282088295790, 0.670926359126198360, 0.670963434486784970, 0.671000508169963260, +0.671037580175640080, 0.671074650503722840, 0.671111719154119050, 0.671148786126736230, 0.671185851421481130, 0.671222915038261370, 0.671259976976984700, 0.671297037237557850, +0.671334095819888230, 0.671371152723883480, 0.671408207949451220, 0.671445261496497970, 0.671482313364931690, 0.671519363554659580, 0.671556412065589360, 0.671593458897627780, +0.671630504050682590, 0.671667547524661180, 0.671704589319471190, 0.671741629435019360, 0.671778667871213540, 0.671815704627960920, 0.671852739705169450, 0.671889773102745890, +0.671926804820597750, 0.671963834858632980, 0.672000863216758340, 0.672037889894881450, 0.672074914892909940, 0.672111938210751440, 0.672148959848312690, 0.672185979805501650, +0.672222998082225520, 0.672260014678392360, 0.672297029593908800, 0.672334042828682590, 0.672371054382621350, 0.672408064255632820, 0.672445072447623750, 0.672482078958501980, +0.672519083788175040, 0.672556086936550780, 0.672593088403535930, 0.672630088189038360, 0.672667086292965900, 0.672704082715225300, 0.672741077455724650, 0.672778070514371220, +0.672815061891072990, 0.672852051585736800, 0.672889039598270400, 0.672926025928581420, 0.672963010576577700, 0.672999993542166110, 0.673036974825254600, 0.673073954425750580, +0.673110932343562120, 0.673147908578595850, 0.673184883130759970, 0.673221855999961760, 0.673258827186109300, 0.673295796689109330, 0.673332764508870030, 0.673369730645298700, +0.673406695098303420, 0.673443657867791030, 0.673480618953669620, 0.673517578355846910, 0.673554536074229880, 0.673591492108726600, 0.673628446459244580, 0.673665399125691680, +0.673702350107975080, 0.673739299406002520, 0.673776247019681640, 0.673813192948920610, 0.673850137193626190, 0.673887079753706430, 0.673924020629069090, 0.673960959819621900, +0.673997897325272040, 0.674034833145927380, 0.674071767281495650, 0.674108699731884920, 0.674145630497002050, 0.674182559576755100, 0.674219486971052050, 0.674256412679799970, +0.674293336702906920, 0.674330259040280430, 0.674367179691828690, 0.674404098657458650, 0.674441015937078390, 0.674477931530595540, 0.674514845437918180, 0.674551757658953480, +0.674588668193609300, 0.674625577041793490, 0.674662484203414010, 0.674699389678378060, 0.674736293466593580, 0.674773195567968440, 0.674810095982410600, 0.674846994709827120, +0.674883891750126310, 0.674920787103216010, 0.674957680769003420, 0.674994572747396600, 0.675031463038303300, 0.675068351641631810, 0.675105238557288990, 0.675142123785183120, +0.675179007325221960, 0.675215889177313680, 0.675252769341365240, 0.675289647817284840, 0.675326524604980440, 0.675363399704359990, 0.675400273115330680, 0.675437144837800820, +0.675474014871678020, 0.675510883216870470, 0.675547749873285360, 0.675584614840830990, 0.675621478119415310, 0.675658339708945730, 0.675695199609330220, 0.675732057820476630, +0.675768914342293360, 0.675805769174687490, 0.675842622317567090, 0.675879473770840120, 0.675916323534414890, 0.675953171608198460, 0.675990017992099120, 0.676026862686024740, +0.676063705689883500, 0.676100547003582800, 0.676137386627030600, 0.676174224560134980, 0.676211060802804020, 0.676247895354945230, 0.676284728216466680, 0.676321559387276230, +0.676358388867282280, 0.676395216656392020, 0.676432042754513630, 0.676468867161555630, 0.676505689877424990, 0.676542510902030210, 0.676579330235279050, 0.676616147877080020, +0.676652963827340190, 0.676689778085967970, 0.676726590652871440, 0.676763401527958660, 0.676800210711136940, 0.676837018202314900, 0.676873824001400170, 0.676910628108301270, +0.676947430522925390, 0.676984231245181030, 0.677021030274976070, 0.677057827612218780, 0.677094623256816690, 0.677131417208677980, 0.677168209467711170, 0.677205000033823450, +0.677241788906923100, 0.677278576086918440, 0.677315361573717630, 0.677352145367228100, 0.677388927467358130, 0.677425707874015900, 0.677462486587109720, 0.677499263606547000, +0.677536038932236130, 0.677572812564085190, 0.677609584502002480, 0.677646354745895520, 0.677683123295672600, 0.677719890151242010, 0.677756655312511840, 0.677793418779389920, +0.677830180551784340, 0.677866940629603620, 0.677903699012755160, 0.677940455701147580, 0.677977210694688860, 0.678013963993287390, 0.678050715596850710, 0.678087465505287200, +0.678124213718505060, 0.678160960236412700, 0.678197705058917630, 0.678234448185928260, 0.678271189617352780, 0.678307929353099690, 0.678344667393076420, 0.678381403737191470, +0.678418138385353030, 0.678454871337469510, 0.678491602593448540, 0.678528332153198630, 0.678565060016627860, 0.678601786183644750, 0.678638510654156810, 0.678675233428072570, +0.678711954505300640, 0.678748673885748440, 0.678785391569324600, 0.678822107555937300, 0.678858821845495060, 0.678895534437905400, 0.678932245333076940, 0.678968954530917770, +0.679005662031336720, 0.679042367834240990, 0.679079071939539420, 0.679115774347140210, 0.679152475056951870, 0.679189174068882020, 0.679225871382839190, 0.679262566998731780, +0.679299260916468190, 0.679335953135956180, 0.679372643657104260, 0.679409332479821050, 0.679446019604014180, 0.679482705029592290, 0.679519388756463560, 0.679556070784536730, +0.679592751113719420, 0.679629429743920270, 0.679666106675047450, 0.679702781907009830, 0.679739455439714810, 0.679776127273071130, 0.679812797406987190, 0.679849465841371630, +0.679886132576131950, 0.679922797611177020, 0.679959460946415130, 0.679996122581754790, 0.680032782517103970, 0.680069440752371080, 0.680106097287464960, 0.680142752122293250, +0.680179405256764680, 0.680216056690787660, 0.680252706424270710, 0.680289354457121800, 0.680326000789249320, 0.680362645420562020, 0.680399288350968300, 0.680435929580376130, +0.680472569108694140, 0.680509206935830610, 0.680545843061694520, 0.680582477486193380, 0.680619110209236160, 0.680655741230731030, 0.680692370550586960, 0.680728998168711690, +0.680765624085013840, 0.680802248299402280, 0.680838870811784850, 0.680875491622070060, 0.680912110730166660, 0.680948728135983390, 0.680985343839427880, 0.681021957840408980, +0.681058570138835200, 0.681095180734615390, 0.681131789627657190, 0.681168396817869670, 0.681205002305161010, 0.681241606089440290, 0.681278208170615130, 0.681314808548594500, +0.681351407223286800, 0.681388004194600990, 0.681424599462444820, 0.681461193026727140, 0.681497784887356460, 0.681534375044241640, 0.681570963497290520, 0.681607550246412060, +0.681644135291515020, 0.681680718632507340, 0.681717300269297890, 0.681753880201795060, 0.681790458429908040, 0.681827034953544460, 0.681863609772613290, 0.681900182887023030, +0.681936754296682770, 0.681973324001500240, 0.682009892001384400, 0.682046458296243770, 0.682083022885987320, 0.682119585770523120, 0.682156146949759900, 0.682192706423606190, +0.682229264191971160, 0.682265820254762680, 0.682302374611889580, 0.682338927263260840, 0.682375478208784520, 0.682412027448369480, 0.682448574981924350, 0.682485120809358190, +0.682521664930578860, 0.682558207345495330, 0.682594748054016320, 0.682631287056050700, 0.682667824351506640, 0.682704359940292990, 0.682740893822318400, 0.682777425997491920, +0.682813956465721520, 0.682850485226916270, 0.682887012280984810, 0.682923537627836200, 0.682960061267378290, 0.682996583199520280, 0.683033103424171230, 0.683069621941238990, +0.683106138750632750, 0.683142653852261140, 0.683179167246033110, 0.683215678931856970, 0.683252188909641680, 0.683288697179295750, 0.683325203740728580, 0.683361708593847930, +0.683398211738563080, 0.683434713174782660, 0.683471212902415860, 0.683507710921370640, 0.683544207231556180, 0.683580701832881220, 0.683617194725254730, 0.683653685908585000, +0.683690175382781100, 0.683726663147751660, 0.683763149203405970, 0.683799633549652010, 0.683836116186399060, 0.683872597113556080, 0.683909076331031260, 0.683945553838733790, +0.683982029636572400, 0.684018503724456270, 0.684054976102293600, 0.684091446769993450, 0.684127915727464790, 0.684164382974616570, 0.684200848511356980, 0.684237312337595440, +0.684273774453240560, 0.684310234858201530, 0.684346693552386530, 0.684383150535704980, 0.684419605808065380, 0.684456059369377150, 0.684492511219548460, 0.684528961358488510, +0.684565409786106470, 0.684601856502310540, 0.684638301507010110, 0.684674744800113810, 0.684711186381530950, 0.684747626251169810, 0.684784064408939570, 0.684820500854749330, +0.684856935588508020, 0.684893368610124060, 0.684929799919506750, 0.684966229516564830, 0.685002657401207800, 0.685039083573343750, 0.685075508032881860, 0.685111930779731430, +0.685148351813801290, 0.685184771135000090, 0.685221188743236900, 0.685257604638421000, 0.685294018820460930, 0.685330431289265630, 0.685366842044744410, 0.685403251086806330, +0.685439658415359810, 0.685476064030314140, 0.685512467931578270, 0.685548870119061630, 0.685585270592672490, 0.685621669352320050, 0.685658066397913600, 0.685694461729362210, +0.685730855346574410, 0.685767247249459370, 0.685803637437926270, 0.685840025911884420, 0.685876412671242220, 0.685912797715908850, 0.685949181045793940, 0.685985562660805680, +0.686021942560853580, 0.686058320745846610, 0.686094697215694050, 0.686131071970304540, 0.686167445009587370, 0.686203816333451510, 0.686240185941806470, 0.686276553834560650, +0.686312920011623360, 0.686349284472903890, 0.686385647218311520, 0.686422008247754680, 0.686458367561142760, 0.686494725158384940, 0.686531081039390760, 0.686567435204068380, +0.686603787652327550, 0.686640138384077230, 0.686676487399226820, 0.686712834697684850, 0.686749180279360830, 0.686785524144164160, 0.686821866292003480, 0.686858206722787970, +0.686894545436427030, 0.686930882432830070, 0.686967217711905500, 0.687003551273563050, 0.687039883117711580, 0.687076213244260710, 0.687112541653119080, 0.687148868344195970, +0.687185193317400800, 0.687221516572642970, 0.687257838109830990, 0.687294157928874380, 0.687330476029682450, 0.687366792412164580, 0.687403107076229420, 0.687439420021786600, +0.687475731248745390, 0.687512040757014660, 0.687548348546503710, 0.687584654617122040, 0.687620958968778950, 0.687657261601383190, 0.687693562514844150, 0.687729861709071360, +0.687766159183974100, 0.687802454939461240, 0.687838748975442280, 0.687875041291826310, 0.687911331888523160, 0.687947620765441250, 0.687983907922490420, 0.688020193359579760, +0.688056477076618880, 0.688092759073516640, 0.688129039350182330, 0.688165317906525800, 0.688201594742455680, 0.688237869857881600, 0.688274143252712860, 0.688310414926858960, +0.688346684880228770, 0.688382953112731900, 0.688419219624277660, 0.688455484414775660, 0.688491747484134550, 0.688528008832264170, 0.688564268459073700, 0.688600526364473000, +0.688636782548370570, 0.688673037010676170, 0.688709289751299190, 0.688745540770149380, 0.688781790067135360, 0.688818037642166870, 0.688854283495153210, 0.688890527626004220, +0.688926770034628540, 0.688963010720936020, 0.688999249684836280, 0.689035486926238060, 0.689071722445051100, 0.689107956241184930, 0.689144188314549040, 0.689180418665052530, +0.689216647292604900, 0.689252874197115670, 0.689289099378494470, 0.689325322836650270, 0.689361544571492790, 0.689397764582931450, 0.689433982870875980, 0.689470199435235240, +0.689506414275919080, 0.689542627392836780, 0.689578838785898320, 0.689615048455012420, 0.689651256400088840, 0.689687462621037530, 0.689723667117767110, 0.689759869890187670, +0.689796070938208490, 0.689832270261739430, 0.689868467860689450, 0.689904663734968170, 0.689940857884485340, 0.689977050309150690, 0.690013241008872960, 0.690049429983562220, +0.690085617233128000, 0.690121802757479920, 0.690157986556527050, 0.690194168630179240, 0.690230348978346010, 0.690266527600937210, 0.690302704497861800, 0.690338879669029630, +0.690375053114350550, 0.690411224833733520, 0.690447394827088390, 0.690483563094324790, 0.690519729635352690, 0.690555894450080810, 0.690592057538419350, 0.690628218900277590, +0.690664378535565730, 0.690700536444192490, 0.690736692626067960, 0.690772847081101760, 0.690808999809203740, 0.690845150810282860, 0.690881300084249080, 0.690917447631012040, +0.690953593450481800, 0.690989737542567210, 0.691025879907178230, 0.691062020544224610, 0.691098159453616300, 0.691134296635262160, 0.691170432089072360, 0.691206565814956760, +0.691242697812824440, 0.691278828082585340, 0.691314956624149210, 0.691351083437426020, 0.691387208522324830, 0.691423331878755490, 0.691459453506627960, 0.691495573405851990, +0.691531691576336870, 0.691567808017992560, 0.691603922730728570, 0.691640035714455200, 0.691676146969081420, 0.691712256494517290, 0.691748364290672440, 0.691784470357457050, +0.691820574694780090, 0.691856677302551850, 0.691892778180682070, 0.691928877329080150, 0.691964974747655950, 0.692001070436319420, 0.692037164394980420, 0.692073256623548240, +0.692109347121932950, 0.692145435890044290, 0.692181522927792340, 0.692217608235086160, 0.692253691811836050, 0.692289773657951750, 0.692325853773343320, 0.692361932157919970, +0.692398008811591750, 0.692434083734268400, 0.692470156925860340, 0.692506228386276400, 0.692542298115427000, 0.692578366113222100, 0.692614432379571100, 0.692650496914383850, +0.692686559717570540, 0.692722620789041010, 0.692758680128704670, 0.692794737736471600, 0.692830793612251640, 0.692866847755955080, 0.692902900167491120, 0.692938950846769820, +0.692974999793701250, 0.693011047008195380, 0.693047092490161610, 0.693083136239510230, 0.693119178256150880, 0.693155218539993840, 0.693191257090948640, 0.693227293908925120, +0.693263328993833810, 0.693299362345583760, 0.693335393964085390, 0.693371423849248440, 0.693407452000983300, 0.693443478419199180, 0.693479503103806460, 0.693515526054714890, +0.693551547271834880, 0.693587566755075600, 0.693623584504347470, 0.693659600519560330, 0.693695614800624580, 0.693731627347449420, 0.693767638159945240, 0.693803647238021900, +0.693839654581589800, 0.693875660190558240, 0.693911664064837620, 0.693947666204337680, 0.693983666608969040, 0.694019665278640780, 0.694055662213263420, 0.694091657412747250, +0.694127650877001570, 0.694163642605936770, 0.694199632599462930, 0.694235620857490240, 0.694271607379928210, 0.694307592166687140, 0.694343575217677200, 0.694379556532808470, +0.694415536111990690, 0.694451513955133940, 0.694487490062148490, 0.694523464432944550, 0.694559437067431730, 0.694595407965520330, 0.694631377127120310, 0.694667344552142190, +0.694703310240495480, 0.694739274192090360, 0.694775236406837470, 0.694811196884646100, 0.694847155625426760, 0.694883112629089640, 0.694919067895544920, 0.694955021424702220, +0.694990973216472070, 0.695026923270764430, 0.695062871587489810, 0.695098818166557610, 0.695134763007878460, 0.695170706111362340, 0.695206647476919850, 0.695242587104460410, +0.695278524993894420, 0.695314461145132180, 0.695350395558084090, 0.695386328232659780, 0.695422259168769540, 0.695458188366324000, 0.695494115825232680, 0.695530041545405990, +0.695565965526754320, 0.695601887769188080, 0.695637808272616680, 0.695673727036950850, 0.695709644062100560, 0.695745559347976660, 0.695781472894488440, 0.695817384701546530, +0.695853294769061210, 0.695889203096943020, 0.695925109685101350, 0.695961014533447050, 0.695996917641890090, 0.696032819010341310, 0.696068718638710000, 0.696104616526906920, +0.696140512674842450, 0.696176407082426900, 0.696212299749570000, 0.696248190676182380, 0.696284079862174550, 0.696319967307456270, 0.696355853011938140, 0.696391736975530250, +0.696427619198143440, 0.696463499679687130, 0.696499378420072150, 0.696535255419208800, 0.696571130677007490, 0.696607004193378070, 0.696642875968231160, 0.696678746001477170, +0.696714614293026500, 0.696750480842789010, 0.696786345650675320, 0.696822208716595730, 0.696858070040460960, 0.696893929622180660, 0.696929787461665560, 0.696965643558826400, +0.697001497913572690, 0.697037350525815390, 0.697073201395464580, 0.697109050522431110, 0.697144897906624710, 0.697180743547956010, 0.697216587446335520, 0.697252429601673880, +0.697288270013880830, 0.697324108682867090, 0.697359945608543090, 0.697395780790819540, 0.697431614229606200, 0.697467445924813910, 0.697503275876352970, 0.697539104084134110, +0.697574930548067180, 0.697610755268062930, 0.697646578244032200, 0.697682399475884620, 0.697718218963531030, 0.697754036706881850, 0.697789852705848030, 0.697825666960339210, +0.697861479470266220, 0.697897290235539480, 0.697933099256069830, 0.697968906531767130, 0.698004712062542220, 0.698040515848305510, 0.698076317888967850, 0.698112118184438970, +0.698147916734629950, 0.698183713539451080, 0.698219508598813210, 0.698255301912626300, 0.698291093480801090, 0.698326883303248440, 0.698362671379878290, 0.698398457710601490, +0.698434242295328470, 0.698470025133970270, 0.698505806226436650, 0.698541585572638460, 0.698577363172486310, 0.698613139025891170, 0.698648913132762780, 0.698684685493012100, +0.698720456106549760, 0.698756224973286600, 0.698791992093132590, 0.698827757465998460, 0.698863521091795060, 0.698899282970433130, 0.698935043101822640, 0.698970801485874650, +0.699006558122499570, 0.699042313011608460, 0.699078066153111190, 0.699113817546918810, 0.699149567192942190, 0.699185315091091280, 0.699221061241277140, 0.699256805643410420, +0.699292548297401950, 0.699328289203161700, 0.699364028360600740, 0.699399765769629810, 0.699435501430159760, 0.699471235342100650, 0.699506967505363340, 0.699542697919858680, +0.699578426585497630, 0.699614153502190140, 0.699649878669847290, 0.699685602088379820, 0.699721323757698580, 0.699757043677713740, 0.699792761848336280, 0.699828478269477250, +0.699864192941046630, 0.699899905862955580, 0.699935617035114750, 0.699971326457435210, 0.700007034129827010, 0.700042740052201350, 0.700078444224468740, 0.700114146646540370, +0.700149847318326300, 0.700185546239737500, 0.700221243410684920, 0.700256938831079640, 0.700292632500831620, 0.700328324419852040, 0.700364014588051640, 0.700399703005341490, +0.700435389671631770, 0.700471074586833550, 0.700506757750858020, 0.700542439163615250, 0.700578118825016420, 0.700613796734972260, 0.700649472893393970, 0.700685147300191600, +0.700720819955276460, 0.700756490858559180, 0.700792160009951040, 0.700827827409362230, 0.700863493056703810, 0.700899156951886650, 0.700934819094821910, 0.700970479485419800, +0.701006138123591470, 0.701041795009247790, 0.701077450142299940, 0.701113103522658210, 0.701148755150233670, 0.701184405024937290, 0.701220053146680230, 0.701255699515372700, +0.701291344130925860, 0.701326986993251020, 0.701362628102258360, 0.701398267457859160, 0.701433905059964280, 0.701469540908485010, 0.701505175003331540, 0.701540807344415040, +0.701576437931646700, 0.701612066764937480, 0.701647693844197780, 0.701683319169338790, 0.701718942740271580, 0.701754564556907320, 0.701790184619156320, 0.701825802926929860, +0.701861419480138920, 0.701897034278694760, 0.701932647322507600, 0.701968258611488930, 0.702003868145549830, 0.702039475924600810, 0.702075081948553060, 0.702110686217317650, +0.702146288730805870, 0.702181889488928010, 0.702217488491595380, 0.702253085738719140, 0.702288681230210380, 0.702324274965979710, 0.702359866945938220, 0.702395457169997180, +0.702431045638067800, 0.702466632350060460, 0.702502217305886580, 0.702537800505457110, 0.702573381948683460, 0.702608961635476040, 0.702644539565746240, 0.702680115739405360, +0.702715690156363930, 0.702751262816533220, 0.702786833719824420, 0.702822402866148830, 0.702857970255416850, 0.702893535887540000, 0.702929099762429340, 0.702964661879996180, +0.703000222240151130, 0.703035780842805490, 0.703071337687870330, 0.703106892775257180, 0.703142446104876530, 0.703177997676639690, 0.703213547490457950, 0.703249095546242600, +0.703284641843904270, 0.703320186383354250, 0.703355729164504060, 0.703391270187264330, 0.703426809451546340, 0.703462346957261400, 0.703497882704320790, 0.703533416692635250, +0.703568948922116190, 0.703604479392674680, 0.703640008104222340, 0.703675535056669690, 0.703711060249928130, 0.703746583683908970, 0.703782105358523700, 0.703817625273682750, +0.703853143429297830, 0.703888659825280040, 0.703924174461540760, 0.703959687337990970, 0.703995198454541840, 0.704030707811104660, 0.704066215407591070, 0.704101721243911680, +0.704137225319978020, 0.704172727635701490, 0.704208228190992940, 0.704243726985763760, 0.704279224019925150, 0.704314719293388960, 0.704350212806065690, 0.704385704557866750, +0.704421194548703560, 0.704456682778487830, 0.704492169247129980, 0.704527653954541640, 0.704563136900634320, 0.704598618085319430, 0.704634097508507580, 0.704669575170110530, +0.704705051070039560, 0.704740525208206290, 0.704775997584521360, 0.704811468198896510, 0.704846937051243240, 0.704882404141472410, 0.704917869469495420, 0.704953333035223890, +0.704988794838569240, 0.705024254879442310, 0.705059713157754730, 0.705095169673417900, 0.705130624426343560, 0.705166077416442220, 0.705201528643625730, 0.705236978107805390, +0.705272425808892930, 0.705307871746799100, 0.705343315921435510, 0.705378758332713800, 0.705414198980545360, 0.705449637864841160, 0.705485074985512830, 0.705520510342472210, +0.705555943935629930, 0.705591375764897830, 0.705626805830187220, 0.705662234131410050, 0.705697660668476830, 0.705733085441299530, 0.705768508449789560, 0.705803929693858520, +0.705839349173417400, 0.705874766888377910, 0.705910182838651590, 0.705945597024150050, 0.705981009444784150, 0.706016420100465720, 0.706051828991106410, 0.706087236116617720, +0.706122641476910620, 0.706158045071896940, 0.706193446901488110, 0.706228846965595960, 0.706264245264131450, 0.706299641797006330, 0.706335036564132320, 0.706370429565420510, +0.706405820800782620, 0.706441210270130180, 0.706476597973374920, 0.706511983910427910, 0.706547368081201000, 0.706582750485605700, 0.706618131123553760, 0.706653509994956130, +0.706688887099724770, 0.706724262437771200, 0.706759636009007370, 0.706795007813344030, 0.706830377850693250, 0.706865746120966420, 0.706901112624075620, 0.706936477359931700, +0.706971840328446620, 0.707007201529532110, 0.707042560963099480, 0.707077918629060330, 0.707113274527326420, 0.707148628657809700, 0.707183981020421020, 0.707219331615072330, +0.707254680441675390, 0.707290027500142030, 0.707325372790383320, 0.707360716312311120, 0.707396058065837270, 0.707431398050873520, 0.707466736267330920, 0.707502072715121440, +0.707537407394156830, 0.707572740304349020, 0.707608071445609110, 0.707643400817848930, 0.707678728420980560, 0.707714054254915180, 0.707749378319564530, 0.707784700614840450, +0.707820021140655010, 0.707855339896919180, 0.707890656883544910, 0.707925972100444060, 0.707961285547528570, 0.707996597224709530, 0.708031907131899120, 0.708067215269008840, +0.708102521635950890, 0.708137826232636210, 0.708173129058977110, 0.708208430114885100, 0.708243729400272470, 0.708279026915049960, 0.708314322659130080, 0.708349616632424570, +0.708384908834844840, 0.708420199266302730, 0.708455487926710200, 0.708490774815979220, 0.708526059934020960, 0.708561343280747600, 0.708596624856070890, 0.708631904659902890, +0.708667182692154900, 0.708702458952738870, 0.708737733441566760, 0.708773006158550540, 0.708808277103601610, 0.708843546276631930, 0.708878813677553340, 0.708914079306278030, +0.708949343162717290, 0.708984605246783080, 0.709019865558387470, 0.709055124097442420, 0.709090380863859230, 0.709125635857550280, 0.709160889078427340, 0.709196140526401900, +0.709231390201386260, 0.709266638103291940, 0.709301884232031440, 0.709337128587515960, 0.709372371169657570, 0.709407611978368320, 0.709442851013560300, 0.709478088275144910, +0.709513323763034220, 0.709548557477140300, 0.709583789417375210, 0.709619019583650370, 0.709654247975877950, 0.709689474593970030, 0.709724699437838670, 0.709759922507395170, +0.709795143802551930, 0.709830363323221140, 0.709865581069314190, 0.709900797040743270, 0.709936011237420230, 0.709971223659257580, 0.710006434306166610, 0.710041643178059510, +0.710076850274848240, 0.710112055596445190, 0.710147259142761670, 0.710182460913710070, 0.710217660909202240, 0.710252859129150590, 0.710288055573466530, 0.710323250242062330, +0.710358443134849970, 0.710393634251741850, 0.710428823592649250, 0.710464011157484700, 0.710499196946160260, 0.710534380958587670, 0.710569563194679120, 0.710604743654346560, +0.710639922337502620, 0.710675099244058470, 0.710710274373926530, 0.710745447727018980, 0.710780619303248100, 0.710815789102525300, 0.710850957124763090, 0.710886123369873450, +0.710921287837768870, 0.710956450528360760, 0.710991611441561420, 0.711026770577283140, 0.711061927935438210, 0.711097083515938260, 0.711132237318695460, 0.711167389343622110, +0.711202539590630620, 0.711237688059632390, 0.711272834750540040, 0.711307979663265870, 0.711343122797721490, 0.711378264153819220, 0.711413403731471330, 0.711448541530590230, +0.711483677551087550, 0.711518811792875570, 0.711553944255866600, 0.711589074939973030, 0.711624203845106610, 0.711659330971179500, 0.711694456318104240, 0.711729579885793000, +0.711764701674157510, 0.711799821683110400, 0.711834939912563640, 0.711870056362429840, 0.711905171032620520, 0.711940283923048420, 0.711975395033625840, 0.712010504364264500, +0.712045611914876810, 0.712080717685375180, 0.712115821675672000, 0.712150923885679020, 0.712186024315308640, 0.712221122964473370, 0.712256219833085510, 0.712291314921056680, +0.712326408228299730, 0.712361499754726620, 0.712396589500250200, 0.712431677464781980, 0.712466763648234470, 0.712501848050520080, 0.712536930671551440, 0.712572011511240170, +0.712607090569498780, 0.712642167846240020, 0.712677243341375610, 0.712712317054817970, 0.712747388986479600, 0.712782459136273030, 0.712817527504110090, 0.712852594089903310, +0.712887658893564870, 0.712922721915007830, 0.712957783154143600, 0.712992842610884800, 0.713027900285144070, 0.713062956176833800, 0.713098010285865840, 0.713133062612152810, +0.713168113155607130, 0.713203161916141530, 0.713238208893667740, 0.713273254088098390, 0.713308297499346210, 0.713343339127322950, 0.713378378971941450, 0.713413417033113890, +0.713448453310753130, 0.713483487804770890, 0.713518520515080020, 0.713553551441592830, 0.713588580584222030, 0.713623607942879490, 0.713658633517477940, 0.713693657307929770, +0.713728679314147740, 0.713763699536043680, 0.713798717973530560, 0.713833734626520440, 0.713868749494926400, 0.713903762578660170, 0.713938773877634600, 0.713973783391761980, +0.714008791120955280, 0.714043797065126220, 0.714078801224187650, 0.714113803598052540, 0.714148804186632510, 0.714183802989840410, 0.714218800007588860, 0.714253795239790600, +0.714288788686357590, 0.714323780347202670, 0.714358770222238150, 0.714393758311377080, 0.714428744614531320, 0.714463729131613710, 0.714498711862536770, 0.714533692807213350, +0.714568671965555290, 0.714603649337475780, 0.714638624922886990, 0.714673598721701890, 0.714708570733832650, 0.714743540959191790, 0.714778509397692610, 0.714813476049246610, +0.714848440913767090, 0.714883403991166460, 0.714918365281357550, 0.714953324784252440, 0.714988282499764090, 0.715023238427805020, 0.715058192568288060, 0.715093144921125410, +0.715128095486229800, 0.715163044263514070, 0.715197991252890960, 0.715232936454272660, 0.715267879867571900, 0.715302821492701520, 0.715337761329574270, 0.715372699378102440, +0.715407635638198870, 0.715442570109776410, 0.715477502792747240, 0.715512433687024440, 0.715547362792520400, 0.715582290109148420, 0.715617215636820240, 0.715652139375449140, +0.715687061324947640, 0.715721981485228810, 0.715756899856204720, 0.715791816437788330, 0.715826731229892490, 0.715861644232430040, 0.715896555445313170, 0.715931464868455050, +0.715966372501768090, 0.716001278345165690, 0.716036182398559600, 0.716071084661863200, 0.716105985134989020, 0.716140883817850240, 0.716175780710358810, 0.716210675812428030, +0.716245569123970970, 0.716280460644899470, 0.716315350375126950, 0.716350238314566010, 0.716385124463129850, 0.716420008820730430, 0.716454891387281130, 0.716489772162694490, +0.716524651146883800, 0.716559528339761220, 0.716594403741239730, 0.716629277351232270, 0.716664149169651930, 0.716699019196410880, 0.716733887431422190, 0.716768753874598930, +0.716803618525854060, 0.716838481385099870, 0.716873342452249430, 0.716908201727215920, 0.716943059209911640, 0.716977914900249650, 0.717012768798142910, 0.717047620903504600, +0.717082471216246910, 0.717117319736283010, 0.717152166463525860, 0.717187011397888540, 0.717221854539283440, 0.717256695887623640, 0.717291535442822090, 0.717326373204792090, +0.717361209173445920, 0.717396043348696550, 0.717430875730457160, 0.717465706318640930, 0.717500535113160030, 0.717535362113927880, 0.717570187320857530, 0.717605010733861400, +0.717639832352852890, 0.717674652177744620, 0.717709470208450220, 0.717744286444881750, 0.717779100886952510, 0.717813913534575580, 0.717848724387664230, 0.717883533446130650, +0.717918340709888250, 0.717953146178849980, 0.717987949852929240, 0.718022751732038330, 0.718057551816090430, 0.718092350104998720, 0.718127146598676490, 0.718161941297035920, +0.718196734199990640, 0.718231525307453820, 0.718266314619337760, 0.718301102135556090, 0.718335887856021540, 0.718370671780647620, 0.718405453909346740, 0.718440234242032180, +0.718475012778617030, 0.718509789519014790, 0.718544564463137640, 0.718579337610899090, 0.718614108962212230, 0.718648878516990330, 0.718683646275146030, 0.718718412236592610, +0.718753176401243030, 0.718787938769010930, 0.718822699339808580, 0.718857458113549620, 0.718892215090146890, 0.718926970269514020, 0.718961723651563410, 0.718996475236208470, +0.719031225023362590, 0.719065973012938400, 0.719100719204849300, 0.719135463599008370, 0.719170206195329120, 0.719204946993724060, 0.719239685994106480, 0.719274423196389790, +0.719309158600487390, 0.719343892206311790, 0.719378624013776390, 0.719413354022794490, 0.719448082233279500, 0.719482808645143910, 0.719517533258301370, 0.719552256072665040, +0.719586977088148340, 0.719621696304663880, 0.719656413722125190, 0.719691129340445770, 0.719725843159538250, 0.719760555179316030, 0.719795265399692520, 0.719829973820581110, +0.719864680441894440, 0.719899385263546130, 0.719934088285449360, 0.719968789507517530, 0.720003488929663590, 0.720038186551800850, 0.720072882373842700, 0.720107576395702550, +0.720142268617293250, 0.720176959038528300, 0.720211647659320890, 0.720246334479584640, 0.720281019499232290, 0.720315702718177350, 0.720350384136333570, 0.720385063753613440, +0.720419741569930610, 0.720454417585198570, 0.720489091799330630, 0.720523764212239740, 0.720558434823839410, 0.720593103634042940, 0.720627770642764180, 0.720662435849915630, +0.720697099255410920, 0.720731760859163460, 0.720766420661086980, 0.720801078661094110, 0.720835734859098460, 0.720870389255013570, 0.720905041848753040, 0.720939692640229500, +0.720974341629356810, 0.721008988816048250, 0.721043634200217550, 0.721078277781777350, 0.721112919560641610, 0.721147559536723710, 0.721182197709936750, 0.721216834080194210, +0.721251468647409520, 0.721286101411496630, 0.721320732372368050, 0.721355361529937730, 0.721389988884118980, 0.721424614434825530, 0.721459238181970220, 0.721493860125466900, +0.721528480265228870, 0.721563098601169960, 0.721597715133203030, 0.721632329861241820, 0.721666942785199720, 0.721701553904990690, 0.721736163220527250, 0.721770770731723580, +0.721805376438493300, 0.721839980340749140, 0.721874582438405190, 0.721909182731374610, 0.721943781219571480, 0.721978377902908640, 0.722012972781299830, 0.722047565854658460, +0.722082157122898580, 0.722116746585933060, 0.722151334243675610, 0.722185920096039770, 0.722220504142939480, 0.722255086384287700, 0.722289666819998070, 0.722324245449984410, +0.722358822274160370, 0.722393397292438900, 0.722427970504734060, 0.722462541910959600, 0.722497111511028360, 0.722531679304854510, 0.722566245292351250, 0.722600809473432860, +0.722635371848012080, 0.722669932416002860, 0.722704491177318830, 0.722739048131873840, 0.722773603279580960, 0.722808156620354140, 0.722842708154106780, 0.722877257880753080, +0.722911805800205860, 0.722946351912379100, 0.722980896217186530, 0.723015438714541990, 0.723049979404358560, 0.723084518286550180, 0.723119055361030830, 0.723153590627713560, +0.723188124086512230, 0.723222655737340680, 0.723257185580112650, 0.723291713614741430, 0.723326239841140970, 0.723360764259224910, 0.723395286868907190, 0.723429807670101010, +0.723464326662720310, 0.723498843846678730, 0.723533359221890440, 0.723567872788268280, 0.723602384545726670, 0.723636894494178890, 0.723671402633539350, 0.723705908963720780, +0.723740413484637690, 0.723774916196203380, 0.723809417098332130, 0.723843916190937130, 0.723878413473932230, 0.723912908947231700, 0.723947402610748410, 0.723981894464396760, +0.724016384508090360, 0.724050872741743400, 0.724085359165268730, 0.724119843778580850, 0.724154326581593290, 0.724188807574220220, 0.724223286756374820, 0.724257764127971160, +0.724292239688923090, 0.724326713439144790, 0.724361185378549430, 0.724395655507050980, 0.724430123824563510, 0.724464590331000970, 0.724499055026276760, 0.724533517910304850, +0.724567978982999410, 0.724602438244273730, 0.724636895694041990, 0.724671351332217940, 0.724705805158715850, 0.724740257173449030, 0.724774707376331430, 0.724809155767277110, +0.724843602346200270, 0.724878047113014070, 0.724912490067632700, 0.724946931209970220, 0.724981370539940610, 0.725015808057457360, 0.725050243762434540, 0.725084677654786120, +0.725119109734426280, 0.725153540001268420, 0.725187968455226710, 0.725222395096215330, 0.725256819924147590, 0.725291242938937990, 0.725325664140500150, 0.725360083528748480, +0.725394501103596380, 0.725428916864957920, 0.725463330812747160, 0.725497742946878410, 0.725532153267265060, 0.725566561773821280, 0.725600968466461050, 0.725635373345098760, +0.725669776409647690, 0.725704177660022260, 0.725738577096136320, 0.725772974717904250, 0.725807370525239470, 0.725841764518056150, 0.725876156696268590, 0.725910547059790860, +0.725944935608536460, 0.725979322342419690, 0.726013707261354950, 0.726048090365255640, 0.726082471654036170, 0.726116851127610370, 0.726151228785892890, 0.726185604628796890, +0.726219978656237000, 0.726254350868127170, 0.726288721264381600, 0.726323089844914120, 0.726357456609638800, 0.726391821558469930, 0.726426184691321810, 0.726460546008107830, +0.726494905508742520, 0.726529263193139930, 0.726563619061214580, 0.726597973112879770, 0.726632325348050110, 0.726666675766639900, 0.726701024368562650, 0.726735371153732880, +0.726769716122064760, 0.726804059273472580, 0.726838400607869970, 0.726872740125171330, 0.726907077825290850, 0.726941413708142910, 0.726975747773641270, 0.727010080021700200, +0.727044410452233890, 0.727078739065156960, 0.727113065860382820, 0.727147390837825980, 0.727181713997400610, 0.727216035339021350, 0.727250354862601700, 0.727284672568056180, +0.727318988455299300, 0.727353302524244570, 0.727387614774806620, 0.727421925206899630, 0.727456233820438110, 0.727490540615335800, 0.727524845591506990, 0.727559148748866180, +0.727593450087327680, 0.727627749606805320, 0.727662047307213620, 0.727696343188466770, 0.727730637250479370, 0.727764929493165070, 0.727799219916438480, 0.727833508520213890, +0.727867795304405710, 0.727902080268927780, 0.727936363413694610, 0.727970644738620940, 0.728004924243620290, 0.728039201928607270, 0.728073477793496400, 0.728107751838201980, +0.728142024062637950, 0.728176294466718830, 0.728210563050359030, 0.728244829813473160, 0.728279094755974850, 0.728313357877778840, 0.728347619178799420, 0.728381878658951100, +0.728416136318148060, 0.728450392156304470, 0.728484646173334970, 0.728518898369154180, 0.728553148743675830, 0.728587397296814540, 0.728621644028484840, 0.728655888938601230, +0.728690132027077660, 0.728724373293828780, 0.728758612738769300, 0.728792850361812960, 0.728827086162874500, 0.728861320141868330, 0.728895552298709060, 0.728929782633310760, +0.728964011145587950, 0.728998237835455030, 0.729032462702826840, 0.729066685747617240, 0.729100906969740950, 0.729135126369112370, 0.729169343945646250, 0.729203559699256540, +0.729237773629857870, 0.729271985737364740, 0.729306196021692000, 0.729340404482753390, 0.729374611120463870, 0.729408815934738050, 0.729443018925489910, 0.729477220092634270, +0.729511419436085550, 0.729545616955758590, 0.729579812651567240, 0.729614006523426450, 0.729648198571250520, 0.729682388794954510, 0.729716577194452150, 0.729750763769658420, +0.729784948520487700, 0.729819131446854950, 0.729853312548674030, 0.729887491825859880, 0.729921669278327020, 0.729955844905990190, 0.729990018708763570, 0.730024190686561880, +0.730058360839299980, 0.730092529166891820, 0.730126695669252480, 0.730160860346296350, 0.730195023197938280, 0.730229184224092330, 0.730263343424673580, 0.730297500799596320, +0.730331656348775730, 0.730365810072125640, 0.730399961969561030, 0.730434112040996510, 0.730468260286347040, 0.730502406705526570, 0.730536551298450190, 0.730570694065032390, +0.730604835005188020, 0.730638974118831390, 0.730673111405877320, 0.730707246866240450, 0.730741380499835720, 0.730775512306577340, 0.730809642286380120, 0.730843770439159050, +0.730877896764828390, 0.730912021263302790, 0.730946143934497310, 0.730980264778326670, 0.731014383794705180, 0.731048500983547570, 0.731082616344768790, 0.731116729878283800, +0.731150841584006670, 0.731184951461852470, 0.731219059511735820, 0.731253165733571910, 0.731287270127274680, 0.731321372692759320, 0.731355473429940560, 0.731389572338733360, +0.731423669419051900, 0.731457764670811360, 0.731491858093926690, 0.731525949688312080, 0.731560039453882590, 0.731594127390552960, 0.731628213498238370, 0.731662297776852880, +0.731696380226311670, 0.731730460846529480, 0.731764539637421500, 0.731798616598901890, 0.731832691730885610, 0.731866765033287740, 0.731900836506023220, 0.731934906149006360, +0.731968973962152100, 0.732003039945375520, 0.732037104098591570, 0.732071166421714550, 0.732105226914659620, 0.732139285577342090, 0.732173342409675800, 0.732207397411576370, +0.732241450582958310, 0.732275501923736920, 0.732309551433826480, 0.732343599113142170, 0.732377644961598960, 0.732411688979111910, 0.732445731165595190, 0.732479771520964330, +0.732513810045133940, 0.732547846738019310, 0.732581881599534750, 0.732615914629595630, 0.732649945828116600, 0.732683975195013050, 0.732718002730199160, 0.732752028433590440, +0.732786052305101520, 0.732820074344647800, 0.732854094552143560, 0.732888112927504220, 0.732922129470644720, 0.732956144181479700, 0.732990157059924320, 0.733024168105893550, +0.733058177319302560, 0.733092184700065990, 0.733126190248098770, 0.733160193963316220, 0.733194195845633390, 0.733228195894964910, 0.733262194111225840, 0.733296190494331260, +0.733330185044196560, 0.733364177760736040, 0.733398168643865200, 0.733432157693498790, 0.733466144909552420, 0.733500130291940280, 0.733534113840577870, 0.733568095555380490, +0.733602075436262440, 0.733636053483139430, 0.733670029695926100, 0.733704004074538060, 0.733737976618889620, 0.733771947328896390, 0.733805916204473220, 0.733839883245535620, +0.733873848451997880, 0.733907811823775620, 0.733941773360783810, 0.733975733062937950, 0.734009690930152340, 0.734043646962342590, 0.734077601159423660, 0.734111553521310970, +0.734145504047919230, 0.734179452739163630, 0.734213399594959790, 0.734247344615222010, 0.734281287799865900, 0.734315229148806650, 0.734349168661959650, 0.734383106339239310, +0.734417042180561360, 0.734450976185840760, 0.734484908354992920, 0.734518838687932550, 0.734552767184575180, 0.734586693844835770, 0.734620618668629930, 0.734654541655872300, +0.734688462806478260, 0.734722382120363230, 0.734756299597442370, 0.734790215237630440, 0.734824129040843040, 0.734858041006995700, 0.734891951136002810, 0.734925859427780100, +0.734959765882242880, 0.734993670499306310, 0.735027573278885460, 0.735061474220895630, 0.735095373325251990, 0.735129270591870390, 0.735163166020665120, 0.735197059611552130, +0.735230951364446380, 0.735264841279263500, 0.735298729355918330, 0.735332615594326280, 0.735366499994402730, 0.735400382556063210, 0.735434263279222460, 0.735468142163796080, +0.735502019209699260, 0.735535894416847640, 0.735569767785156150, 0.735603639314540200, 0.735637509004915310, 0.735671376856196440, 0.735705242868299190, 0.735739107041138760, +0.735772969374630880, 0.735806829868690280, 0.735840688523232590, 0.735874545338173200, 0.735908400313427750, 0.735942253448911070, 0.735976104744538560, 0.736009954200225970, +0.736043801815888690, 0.736077647591441670, 0.736111491526800550, 0.736145333621880620, 0.736179173876597700, 0.736213012290866550, 0.736246848864602900, 0.736280683597722360, +0.736314516490139900, 0.736348347541771030, 0.736382176752531370, 0.736416004122336540, 0.736449829651101400, 0.736483653338741770, 0.736517475185172850, 0.736551295190310710, +0.736585113354069950, 0.736618929676366330, 0.736652744157115460, 0.736686556796233070, 0.736720367593633910, 0.736754176549233920, 0.736787983662948510, 0.736821788934693300, +0.736855592364383360, 0.736889393951934530, 0.736923193697262450, 0.736956991600282050, 0.736990787660909200, 0.737024581879059390, 0.737058374254648490, 0.737092164787591320, +0.737125953477803740, 0.737159740325201260, 0.737193525329699620, 0.737227308491213980, 0.737261089809660100, 0.737294869284953470, 0.737328646917009940, 0.737362422705744480, +0.737396196651073030, 0.737429968752911000, 0.737463739011174350, 0.737497507425778130, 0.737531273996638090, 0.737565038723669850, 0.737598801606789370, 0.737632562645911590, +0.737666321840952380, 0.737700079191827670, 0.737733834698452440, 0.737767588360742630, 0.737801340178613870, 0.737835090151982120, 0.737868838280762220, 0.737902584564870230, +0.737936329004221900, 0.737970071598732960, 0.738003812348318580, 0.738037551252894610, 0.738071288312376780, 0.738105023526681060, 0.738138756895722500, 0.738172488419416960, +0.738206218097680280, 0.738239945930428300, 0.738273671917576200, 0.738307396059039940, 0.738341118354735480, 0.738374838804577880, 0.738408557408483210, 0.738442274166367100, +0.738475989078145710, 0.738509702143734010, 0.738543413363047960, 0.738577122736003510, 0.738610830262516500, 0.738644535942502010, 0.738678239775876320, 0.738711941762554950, +0.738745641902454060, 0.738779340195488850, 0.738813036641575160, 0.738846731240628940, 0.738880423992566150, 0.738914114897302080, 0.738947803954752680, 0.738981491164834030, +0.739015176527461400, 0.739048860042550770, 0.739082541710018080, 0.739116221529779290, 0.739149899501749590, 0.739183575625845250, 0.739217249901981900, 0.739250922330075830, +0.739284592910042000, 0.739318261641796810, 0.739351928525255890, 0.739385593560335510, 0.739419256746950750, 0.739452918085018010, 0.739486577574452800, 0.739520235215171520, +0.739553891007089350, 0.739587544950122470, 0.739621197044187050, 0.739654847289198280, 0.739688495685072440, 0.739722142231725280, 0.739755786929073180, 0.739789429777031220, +0.739823070775515790, 0.739856709924442520, 0.739890347223727930, 0.739923982673287070, 0.739957616273036360, 0.739991248022891510, 0.740024877922768830, 0.740058505972583710, +0.740092132172252340, 0.740125756521690660, 0.740159379020814740, 0.740192999669540220, 0.740226618467783150, 0.740260235415459600, 0.740293850512485640, 0.740327463758776780, +0.740361075154249320, 0.740394684698819530, 0.740428292392402600, 0.740461898234915040, 0.740495502226272690, 0.740529104366391850, 0.740562704655188030, 0.740596303092577400, +0.740629899678476030, 0.740663494412800110, 0.740697087295465240, 0.740730678326387610, 0.740764267505483410, 0.740797854832668690, 0.740831440307859190, 0.740865023930970870, +0.740898605701920230, 0.740932185620623240, 0.740965763686995520, 0.740999339900953350, 0.741032914262413240, 0.741066486771290390, 0.741100057427501400, 0.741133626230962240, +0.741167193181589410, 0.741200758279298210, 0.741234321524005150, 0.741267882915626290, 0.741301442454078030, 0.741335000139275780, 0.741368555971136050, 0.741402109949575010, +0.741435662074508950, 0.741469212345853390, 0.741502760763524950, 0.741536307327439470, 0.741569852037513580, 0.741603394893662670, 0.741636935895803370, 0.741670475043851970, +0.741704012337724090, 0.741737547777336250, 0.741771081362604500, 0.741804613093445360, 0.741838142969774350, 0.741871670991508080, 0.741905197158562510, 0.741938721470854270, +0.741972243928298970, 0.742005764530813130, 0.742039283278312700, 0.742072800170714530, 0.742106315207933910, 0.742139828389887570, 0.742173339716491690, 0.742206849187662780, +0.742240356803316350, 0.742273862563369140, 0.742307366467737100, 0.742340868516337070, 0.742374368709084690, 0.742407867045896230, 0.742441363526688440, 0.742474858151376930, +0.742508350919878210, 0.742541841832108700, 0.742575330887984890, 0.742608818087422410, 0.742642303430337880, 0.742675786916647710, 0.742709268546268180, 0.742742748319115350, +0.742776226235105530, 0.742809702294155220, 0.742843176496180920, 0.742876648841098390, 0.742910119328824230, 0.742943587959274840, 0.742977054732366640, 0.743010519648015680, +0.743043982706138250, 0.743077443906651200, 0.743110903249470270, 0.743144360734512070, 0.743177816361693000, 0.743211270130929690, 0.743244722042137870, 0.743278172095234390, +0.743311620290135310, 0.743345066626757480, 0.743378511105016740, 0.743411953724829820, 0.743445394486112800, 0.743478833388782730, 0.743512270432755250, 0.743545705617947080, +0.743579138944274740, 0.743612570411654740, 0.743646000020003030, 0.743679427769236350, 0.743712853659271420, 0.743746277690023990, 0.743779699861410900, 0.743813120173348550, +0.743846538625753780, 0.743879955218542220, 0.743913369951630930, 0.743946782824936090, 0.743980193838374660, 0.744013602991862370, 0.744047010285316170, 0.744080415718652350, +0.744113819291787880, 0.744147221004638480, 0.744180620857121110, 0.744214018849152170, 0.744247414980648500, 0.744280809251525950, 0.744314201661701370, 0.744347592211091590, +0.744380980899612580, 0.744414367727181060, 0.744447752693713550, 0.744481135799127110, 0.744514517043337490, 0.744547896426261510, 0.744581273947815920, 0.744614649607917340, +0.744648023406481840, 0.744681395343426260, 0.744714765418667210, 0.744748133632121560, 0.744781499983705350, 0.744814864473335340, 0.744848227100928130, 0.744881587866400690, +0.744914946769668960, 0.744948303810649910, 0.744981658989260050, 0.745015012305416340, 0.745048363759034830, 0.745081713350032370, 0.745115061078325920, 0.745148406943831660, +0.745181750946466210, 0.745215093086146420, 0.745248433362789230, 0.745281771776310720, 0.745315108326627730, 0.745348443013656880, 0.745381775837315350, 0.745415106797518990, +0.745448435894184860, 0.745481763127229690, 0.745515088496570440, 0.745548412002123070, 0.745581733643804760, 0.745615053421532110, 0.745648371335222100, 0.745681687384790900, +0.745715001570155470, 0.745748313891232750, 0.745781624347939040, 0.745814932940191190, 0.745848239667906030, 0.745881544531000640, 0.745914847529391080, 0.745948148662994410, +0.745981447931727270, 0.746014745335506820, 0.746048040874249360, 0.746081334547871620, 0.746114626356290670, 0.746147916299423450, 0.746181204377186050, 0.746214490589495630, +0.746247774936269040, 0.746281057417423340, 0.746314338032874720, 0.746347616782540140, 0.746380893666336860, 0.746414168684181090, 0.746447441835989880, 0.746480713121680070, +0.746513982541168850, 0.746547250094372170, 0.746580515781207540, 0.746613779601591590, 0.746647041555441370, 0.746680301642673410, 0.746713559863204650, 0.746746816216951940, +0.746780070703832570, 0.746813323323762710, 0.746846574076659440, 0.746879822962439820, 0.746913069981020920, 0.746946315132319020, 0.746979558416251410, 0.747012799832734830, +0.747046039381686570, 0.747079277063022910, 0.747112512876661140, 0.747145746822518330, 0.747178978900510880, 0.747212209110555970, 0.747245437452570440, 0.747278663926471690, +0.747311888532176010, 0.747345111269600570, 0.747378332138662340, 0.747411551139278600, 0.747444768271365630, 0.747477983534840850, 0.747511196929621090, 0.747544408455623530, +0.747577618112764800, 0.747610825900961950, 0.747644031820131950, 0.747677235870192300, 0.747710438051059190, 0.747743638362650010, 0.747776836804882050, 0.747810033377671710, +0.747843228080936170, 0.747876420914592720, 0.747909611878558420, 0.747942800972749900, 0.747975988197084220, 0.748009173551478670, 0.748042357035850420, 0.748075538650116110, +0.748108718394192800, 0.748141896267997760, 0.748175072271448300, 0.748208246404460820, 0.748241418666952820, 0.748274589058841140, 0.748307757580043310, 0.748340924230475930, +0.748374089010056090, 0.748407251918701390, 0.748440412956328240, 0.748473572122854040, 0.748506729418195850, 0.748539884842271300, 0.748573038394996670, 0.748606190076289370, +0.748639339886066680, 0.748672487824245890, 0.748705633890743630, 0.748738778085477170, 0.748771920408363930, 0.748805060859321080, 0.748838199438265350, 0.748871336145114030, +0.748904470979784410, 0.748937603942194000, 0.748970735032259190, 0.749003864249897510, 0.749036991595026570, 0.749070117067562770, 0.749103240667423730, 0.749136362394526520, +0.749169482248788770, 0.749202600230126970, 0.749235716338458760, 0.749268830573701190, 0.749301942935771900, 0.749335053424587280, 0.749368162040065290, 0.749401268782122650, +0.749434373650677330, 0.749467476645645610, 0.749500577766945340, 0.749533677014493580, 0.749566774388207850, 0.749599869888004980, 0.749632963513802380, 0.749666055265517440, +0.749699145143067570, 0.749732233146369610, 0.749765319275341070, 0.749798403529899460, 0.749831485909961630, 0.749864566415444970, 0.749897645046266990, 0.749930721802345210, +0.749963796683596250, 0.749996869689937840, 0.750029940821287270, 0.750063010077562150, 0.750096077458679120, 0.750129142964556020, 0.750162206595110010, 0.750195268350258740, +0.750228328229919030, 0.750261386234008510, 0.750294442362444580, 0.750327496615144750, 0.750360548992025980, 0.750393599493005770, 0.750426648118001860, 0.750459694866930980, +0.750492739739710980, 0.750525782736259030, 0.750558823856492970, 0.750591863100329550, 0.750624900467686480, 0.750657935958481070, 0.750690969572631260, 0.750724001310053680, +0.750757031170666060, 0.750790059154385900, 0.750823085261130840, 0.750856109490817820, 0.750889131843364590, 0.750922152318688420, 0.750955170916707160, 0.750988187637337660, +0.751021202480497860, 0.751054215446105180, 0.751087226534076780, 0.751120235744330180, 0.751153243076783110, 0.751186248531353180, 0.751219252107957370, 0.751252253806513390, +0.751285253626938760, 0.751318251569151330, 0.751351247633067930, 0.751384241818606520, 0.751417234125684400, 0.751450224554219500, 0.751483213104128800, 0.751516199775330020, +0.751549184567740780, 0.751582167481278820, 0.751615148515861200, 0.751648127671405650, 0.751681104947829800, 0.751714080345051490, 0.751747053862987680, 0.751780025501556310, +0.751812995260675130, 0.751845963140261090, 0.751878929140232240, 0.751911893260506000, 0.751944855501000430, 0.751977815861632260, 0.752010774342319670, 0.752043730942980160, +0.752076685663531470, 0.752109638503890900, 0.752142589463976270, 0.752175538543705110, 0.752208485742995370, 0.752241431061764110, 0.752274374499929290, 0.752307316057408530, +0.752340255734119780, 0.752373193529980220, 0.752406129444907480, 0.752439063478819840, 0.752471995631634140, 0.752504925903268560, 0.752537854293640620, 0.752570780802668370, +0.752603705430268780, 0.752636628176360010, 0.752669549040859700, 0.752702468023685680, 0.752735385124755350, 0.752768300343986450, 0.752801213681296820, 0.752834125136604530, +0.752867034709826520, 0.752899942400880980, 0.752932848209685650, 0.752965752136158350, 0.752998654180216500, 0.753031554341777930, 0.753064452620760830, 0.753097349017082250, +0.753130243530660270, 0.753163136161412840, 0.753196026909257690, 0.753228915774112330, 0.753261802755894600, 0.753294687854522360, 0.753327571069913660, 0.753360452401985790, +0.753393331850656820, 0.753426209415844370, 0.753459085097466840, 0.753491958895441290, 0.753524830809685800, 0.753557700840118190, 0.753590568986656770, 0.753623435249218490, +0.753656299627721630, 0.753689162122084370, 0.753722022732223880, 0.753754881458058470, 0.753787738299505740, 0.753820593256483980, 0.753853446328910380, 0.753886297516703220, +0.753919146819780340, 0.753951994238059810, 0.753984839771459030, 0.754017683419896170, 0.754050525183289080, 0.754083365061556040, 0.754116203054614240, 0.754149039162381960, +0.754181873384777050, 0.754214705721717780, 0.754247536173121350, 0.754280364738906250, 0.754313191418990110, 0.754346016213291340, 0.754378839121727210, 0.754411660144215900, +0.754444479280675930, 0.754477296531024360, 0.754510111895179580, 0.754542925373059450, 0.754575736964582360, 0.754608546669665590, 0.754641354488227560, 0.754674160420185980, +0.754706964465459370, 0.754739766623965140, 0.754772566895621440, 0.754805365280346250, 0.754838161778057960, 0.754870956388674070, 0.754903749112112780, 0.754936539948292020, +0.754969328897130200, 0.755002115958544830, 0.755034901132454190, 0.755067684418776590, 0.755100465817429400, 0.755133245328331150, 0.755166022951399670, 0.755198798686553490, +0.755231572533710090, 0.755264344492787680, 0.755297114563704410, 0.755329882746378580, 0.755362649040727810, 0.755395413446670490, 0.755428175964124590, 0.755460936593008500, +0.755493695333239850, 0.755526452184736910, 0.755559207147417870, 0.755591960221201010, 0.755624711406004070, 0.755657460701745330, 0.755690208108343200, 0.755722953625715290, +0.755755697253780000, 0.755788438992455400, 0.755821178841660110, 0.755853916801311530, 0.755886652871328060, 0.755919387051628090, 0.755952119342129910, 0.755984849742751040, +0.756017578253410210, 0.756050304874025360, 0.756083029604515010, 0.756115752444796780, 0.756148473394789300, 0.756181192454410510, 0.756213909623579040, 0.756246624902212620, +0.756279338290229530, 0.756312049787548070, 0.756344759394086850, 0.756377467109763390, 0.756410172934496310, 0.756442876868204110, 0.756475578910804410, 0.756508279062215630, +0.756540977322356260, 0.756573673691144810, 0.756606368168498800, 0.756639060754336850, 0.756671751448577350, 0.756704440251138700, 0.756737127161938640, 0.756769812180895670, +0.756802495307928310, 0.756835176542954740, 0.756867855885893110, 0.756900533336662520, 0.756933208895179900, 0.756965882561364320, 0.756998554335134080, 0.757031224216407450, +0.757063892205102730, 0.757096558301138310, 0.757129222504433040, 0.757161884814904100, 0.757194545232470540, 0.757227203757050550, 0.757259860388562520, 0.757292515126924970, +0.757325167972055960, 0.757357818923874220, 0.757390467982298370, 0.757423115147245810, 0.757455760418635380, 0.757488403796385710, 0.757521045280414970, 0.757553684870641560, +0.757586322566983990, 0.757618958369360550, 0.757651592277690410, 0.757684224291890640, 0.757716854411880410, 0.757749482637577910, 0.757782108968901750, 0.757814733405770320, +0.757847355948102040, 0.757879976595815960, 0.757912595348829270, 0.757945212207061240, 0.757977827170430050, 0.758010440238854440, 0.758043051412252700, 0.758075660690543220, +0.758108268073644620, 0.758140873561476080, 0.758173477153954670, 0.758206078850999440, 0.758238678652529140, 0.758271276558462160, 0.758303872568717010, 0.758336466683212200, +0.758369058901866680, 0.758401649224597960, 0.758434237651325120, 0.758466824181966760, 0.758499408816441290, 0.758531991554667330, 0.758564572396563270, 0.758597151342047970, +0.758629728391040260, 0.758662303543457650, 0.758694876799219320, 0.758727448158243780, 0.758760017620449530, 0.758792585185755430, 0.758825150854079760, 0.758857714625341130, +0.758890276499458950, 0.758922836476350390, 0.758955394555934750, 0.758987950738130630, 0.759020505022856670, 0.759053057410031480, 0.759085607899573580, 0.759118156491402240, +0.759150703185434980, 0.759183247981590980, 0.759215790879788740, 0.759248331879947110, 0.759280870981984600, 0.759313408185819940, 0.759345943491371740, 0.759378476898559310, +0.759411008407300140, 0.759443538017513410, 0.759476065729117740, 0.759508591542031990, 0.759541115456174860, 0.759573637471464780, 0.759606157587820690, 0.759638675805161760, +0.759671192123405610, 0.759703706542471440, 0.759736219062277950, 0.759768729682744000, 0.759801238403788100, 0.759833745225329200, 0.759866250147286590, 0.759898753169577670, +0.759931254292121830, 0.759963753514838030, 0.759996250837644660, 0.760028746260460690, 0.760061239783204940, 0.760093731405796060, 0.760126221128153420, 0.760158708950194660, +0.760191194871839170, 0.760223678893005570, 0.760256161013612820, 0.760288641233579750, 0.760321119552825000, 0.760353595971268060, 0.760386070488826560, 0.760418543105419900, +0.760451013820966800, 0.760483482635386230, 0.760515949548596910, 0.760548414560517800, 0.760580877671067520, 0.760613338880165690, 0.760645798187730040, 0.760678255593679740, +0.760710711097933870, 0.760743164700411260, 0.760775616401030640, 0.760808066199711090, 0.760840514096371320, 0.760872960090930860, 0.760905404183307430, 0.760937846373420430, +0.760970286661188820, 0.761002725046531550, 0.761035161529367450, 0.761067596109615390, 0.761100028787194960, 0.761132459562023910, 0.761164888434021750, 0.761197315403107310, +0.761229740469199560, 0.761262163632217440, 0.761294584892080020, 0.761327004248706030, 0.761359421702015090, 0.761391837251925160, 0.761424250898355530, 0.761456662641225250, +0.761489072480453390, 0.761521480415958800, 0.761553886447660530, 0.761586290575478220, 0.761618692799329480, 0.761651093119134040, 0.761683491534810850, 0.761715888046278880, +0.761748282653457290, 0.761780675356264920, 0.761813066154620970, 0.761845455048444810, 0.761877842037654520, 0.761910227122169600, 0.761942610301909130, 0.761974991576792050, +0.762007370946737540, 0.762039748411664660, 0.762072123971492380, 0.762104497626140300, 0.762136869375526490, 0.762169239219570470, 0.762201607158191300, 0.762233973191308150, +0.762266337318840080, 0.762298699540706170, 0.762331059856826140, 0.762363418267117840, 0.762395774771501000, 0.762428129369894680, 0.762460482062218060, 0.762492832848390200, +0.762525181728330280, 0.762557528701957480, 0.762589873769191410, 0.762622216929950030, 0.762654558184153180, 0.762686897531719810, 0.762719234972569330, 0.762751570506620680, +0.762783904133793160, 0.762816235854005820, 0.762848565667178510, 0.762880893573229190, 0.762913219572077580, 0.762945543663642980, 0.762977865847844550, 0.763010186124601360, +0.763042504493832820, 0.763074820955458530, 0.763107135509396680, 0.763139448155566890, 0.763171758893888550, 0.763204067724280840, 0.763236374646662830, 0.763268679660954020, +0.763300982767073480, 0.763333283964941050, 0.763365583254474790, 0.763397880635594660, 0.763430176108219730, 0.763462469672269380, 0.763494761327662920, 0.763527051074319510, +0.763559338912159100, 0.763591624841099660, 0.763623908861061240, 0.763656190971963020, 0.763688471173724400, 0.763720749466264560, 0.763753025849502780, 0.763785300323358450, +0.763817572887751430, 0.763849843542599990, 0.763882112287823880, 0.763914379123342590, 0.763946644049075200, 0.763978907064941310, 0.764011168170860120, 0.764043427366751020, +0.764075684652533840, 0.764107940028126990, 0.764140193493450190, 0.764172445048422970, 0.764204694692964700, 0.764236942426994580, 0.764269188250432220, 0.764301432163197350, +0.764333674165208370, 0.764365914256385230, 0.764398152436647220, 0.764430388705913950, 0.764462623064104620, 0.764494855511138720, 0.764527086046935760, 0.764559314671415580, +0.764591541384496590, 0.764623766186098730, 0.764655989076141520, 0.764688210054544240, 0.764720429121226510, 0.764752646276107620, 0.764784861519107180, 0.764817074850145160, +0.764849286269139840, 0.764881495776011390, 0.764913703370679100, 0.764945909053062590, 0.764978112823081370, 0.765010314680654720, 0.765042514625702940, 0.765074712658144310, +0.765106908777898890, 0.765139102984886190, 0.765171295279025830, 0.765203485660237100, 0.765235674128439740, 0.765267860683553120, 0.765300045325497450, 0.765332228054191100, +0.765364408869554260, 0.765396587771506320, 0.765428764759966910, 0.765460939834855520, 0.765493112996091910, 0.765525284243596000, 0.765557453577286440, 0.765589620997083050, +0.765621786502905800, 0.765653950094673960, 0.765686111772307280, 0.765718271535725360, 0.765750429384847720, 0.765782585319594530, 0.765814739339884310, 0.765846891445637330, +0.765879041636773120, 0.765911189913211170, 0.765943336274871430, 0.765975480721673210, 0.766007623253536330, 0.766039763870380970, 0.766071902572125650, 0.766104039358690540, +0.766136174229995360, 0.766168307185959740, 0.766200438226503300, 0.766232567351545880, 0.766264694561007540, 0.766296819854806910, 0.766328943232864160, 0.766361064695099130, +0.766393184241431440, 0.766425301871780710, 0.766457417586066780, 0.766489531384209280, 0.766521643266128590, 0.766553753231743240, 0.766585861280973390, 0.766617967413739000, +0.766650071629959570, 0.766682173929555070, 0.766714274312445100, 0.766746372778549400, 0.766778469327788370, 0.766810563960080630, 0.766842656675346460, 0.766874747473505700, +0.766906836354477980, 0.766938923318183250, 0.766971008364541130, 0.767003091493472120, 0.767035172704894740, 0.767067251998729490, 0.767099329374896110, 0.767131404833314430, +0.767163478373904200, 0.767195549996585240, 0.767227619701277510, 0.767259687487901190, 0.767291753356375120, 0.767323817306619690, 0.767355879338554650, 0.767387939452100040, +0.767419997647175500, 0.767452053923700970, 0.767484108281596860, 0.767516160720781880, 0.767548211241176560, 0.767580259842700730, 0.767612306525274240, 0.767644351288816920, +0.767676394133248730, 0.767708435058489620, 0.767740474064460000, 0.767772511151078580, 0.767804546318265890, 0.767836579565941870, 0.767868610894026360, 0.767900640302439320, +0.767932667791100700, 0.767964693359930340, 0.767996717008848860, 0.768028738737775110, 0.768060758546629360, 0.768092776435331800, 0.768124792403802380, 0.768156806451960830, +0.768188818579727320, 0.768220828787022360, 0.768252837073764680, 0.768284843439875020, 0.768316847885273210, 0.768348850409879210, 0.768380851013613200, 0.768412849696395010, +0.768444846458144700, 0.768476841298782800, 0.768508834218228240, 0.768540825216401660, 0.768572814293222990, 0.768604801448612210, 0.768636786682489580, 0.768668769994774850, +0.768700751385388180, 0.768732730854250310, 0.768764708401279970, 0.768796684026397890, 0.768828657729524020, 0.768860629510578650, 0.768892599369481620, 0.768924567306153110, +0.768956533320513720, 0.768988497412482540, 0.769020459581979950, 0.769052419828926360, 0.769084378153241600, 0.769116334554845960, 0.769148289033659500, 0.769180241589602300, +0.769212192222595070, 0.769244140932556770, 0.769276087719408030, 0.769308032583069230, 0.769339975523460230, 0.769371916540501410, 0.769403855634112730, 0.769435792804214920, +0.769467728050727160, 0.769499661373570070, 0.769531592772663810, 0.769563522247928570, 0.769595449799284510, 0.769627375426651830, 0.769659299129950680, 0.769691220909101910, +0.769723140764024480, 0.769755058694639230, 0.769786974700866320, 0.769818888782625940, 0.769850800939838380, 0.769882711172423790, 0.769914619480302490, 0.769946525863395070, +0.769978430321620940, 0.770010332854900610, 0.770042233463154480, 0.770074132146302830, 0.770106028904265830, 0.770137923736963660, 0.770169816644317380, 0.770201707626245850, +0.770233596682670110, 0.770265483813510450, 0.770297369018686950, 0.770329252298120220, 0.770361133651730200, 0.770393013079437420, 0.770424890581162590, 0.770456766156825010, +0.770488639806345520, 0.770520511529644400, 0.770552381326642060, 0.770584249197258760, 0.770616115141414810, 0.770647979159031160, 0.770679841250026980, 0.770711701414323210, +0.770743559651840270, 0.770775415962498320, 0.770807270346217770, 0.770839122802919220, 0.770870973332522750, 0.770902821934949410, 0.770934668610118500, 0.770966513357950860, +0.770998356178366980, 0.771030197071287170, 0.771062036036631930, 0.771093873074321530, 0.771125708184276500, 0.771157541366417790, 0.771189372620664670, 0.771221201946938000, +0.771253029345158380, 0.771284854815246220, 0.771316678357121920, 0.771348499970705870, 0.771380319655919240, 0.771412137412681220, 0.771443953240912750, 0.771475767140534450, +0.771507579111466830, 0.771539389153630180, 0.771571197266945010, 0.771603003451331930, 0.771634807706711890, 0.771666610033004190, 0.771698410430130100, 0.771730208898009920, +0.771762005436564150, 0.771793800045713410, 0.771825592725378210, 0.771857383475478940, 0.771889172295936900, 0.771920959186671360, 0.771952744147603290, 0.771984527178653510, +0.772016308279742320, 0.772048087450790340, 0.772079864691718190, 0.772111640002446920, 0.772143413382896050, 0.772175184832986530, 0.772206954352639200, 0.772238721941774340, +0.772270487600312800, 0.772302251328174980, 0.772334013125281490, 0.772365772991553620, 0.772397530926910660, 0.772429286931273880, 0.772461041004563920, 0.772492793146701380, +0.772524543357606900, 0.772556291637200960, 0.772588037985404870, 0.772619782402138130, 0.772651524887322030, 0.772683265440876950, 0.772715004062723860, 0.772746740752783160, +0.772778475510975670, 0.772810208337221920, 0.772841939231443290, 0.772873668193559290, 0.772905395223491000, 0.772937120321159240, 0.772968843486484760, 0.773000564719388050, +0.773032284019790070, 0.773064001387611330, 0.773095716822773120, 0.773127430325195040, 0.773159141894798400, 0.773190851531503910, 0.773222559235232310, 0.773254265005904330, +0.773285968843440590, 0.773317670747762590, 0.773349370718789840, 0.773381068756443630, 0.773412764860644810, 0.773444459031313980, 0.773476151268372100, 0.773507841571739800, +0.773539529941337790, 0.773571216377087700, 0.773602900878908930, 0.773634583446722870, 0.773666264080450360, 0.773697942780012250, 0.773729619545329260, 0.773761294376322130, +0.773792967272911910, 0.773824638235019790, 0.773856307262565490, 0.773887974355470410, 0.773919639513655390, 0.773951302737041270, 0.773982964025549000, 0.774014623379099210, +0.774046280797613400, 0.774077936281011400, 0.774109589829214520, 0.774141241442143690, 0.774172891119719760, 0.774204538861863580, 0.774236184668496090, 0.774267828539538130, +0.774299470474911100, 0.774331110474534840, 0.774362748538330870, 0.774394384666220010, 0.774426018858123230, 0.774457651113961370, 0.774489281433655360, 0.774520909817126620, +0.774552536264295210, 0.774584160775082300, 0.774615783349409170, 0.774647403987196450, 0.774679022688365300, 0.774710639452836470, 0.774742254280531120, 0.774773867171370760, +0.774805478125275120, 0.774837087142165700, 0.774868694221963690, 0.774900299364589930, 0.774931902569965360, 0.774963503838011050, 0.774995103168647950, 0.775026700561797680, +0.775058296017380190, 0.775089889535316880, 0.775121481115528810, 0.775153070757937050, 0.775184658462462650, 0.775216244229026570, 0.775247828057550550, 0.775279409947954300, +0.775310989900159450, 0.775342567914087290, 0.775374143989658650, 0.775405718126794600, 0.775437290325416310, 0.775468860585444730, 0.775500428906801600, 0.775531995289406860, +0.775563559733182140, 0.775595122238048500, 0.775626682803926990, 0.775658241430738920, 0.775689798118405100, 0.775721352866846850, 0.775752905675985760, 0.775784456545741910, +0.775816005476036800, 0.775847552466791820, 0.775879097517927830, 0.775910640629366210, 0.775942181801027920, 0.775973721032834800, 0.776005258324706680, 0.776036793676565530, +0.776068327088332400, 0.776099858559928360, 0.776131388091274800, 0.776162915682292680, 0.776194441332903270, 0.776225965043028320, 0.776257486812587880, 0.776289006641503800, +0.776320524529697130, 0.776352040477089280, 0.776383554483601190, 0.776415066549154260, 0.776446576673670230, 0.776478084857069150, 0.776509591099272870, 0.776541095400202660, +0.776572597759779710, 0.776604098177925310, 0.776635596654560610, 0.776667093189606920, 0.776698587782986060, 0.776730080434618110, 0.776761571144425010, 0.776793059912327940, +0.776824546738248300, 0.776856031622107260, 0.776887514563826100, 0.776918995563326220, 0.776950474620529350, 0.776981951735355780, 0.777013426907727340, 0.777044900137565330, +0.777076371424791020, 0.777107840769325820, 0.777139308171091000, 0.777170773630008530, 0.777202237145998450, 0.777233698718982850, 0.777265158348883100, 0.777296616035620280, +0.777328071779116000, 0.777359525579291550, 0.777390977436068330, 0.777422427349368170, 0.777453875319111360, 0.777485321345219860, 0.777516765427615050, 0.777548207566218340, +0.777579647760951230, 0.777611086011734900, 0.777642522318490850, 0.777673956681141030, 0.777705389099605740, 0.777736819573807030, 0.777768248103666290, 0.777799674689104940, +0.777831099330044350, 0.777862522026406040, 0.777893942778111970, 0.777925361585082520, 0.777956778447239650, 0.777988193364504750, 0.778019606336799450, 0.778051017364045140, +0.778082426446163320, 0.778113833583075400, 0.778145238774703430, 0.778176642020967810, 0.778208043321790610, 0.778239442677093220, 0.778270840086797260, 0.778302235550824230, +0.778333629069095640, 0.778365020641533460, 0.778396410268058280, 0.778427797948591960, 0.778459183683056220, 0.778490567471372460, 0.778521949313462410, 0.778553329209247360, +0.778584707158649030, 0.778616083161589480, 0.778647457217989110, 0.778678829327770220, 0.778710199490854180, 0.778741567707162630, 0.778772933976617180, 0.778804298299139440, +0.778835660674650930, 0.778867021103073820, 0.778898379584328500, 0.778929736118337380, 0.778961090705021840, 0.778992443344303620, 0.779023794036104220, 0.779055142780345380, +0.779086489576949370, 0.779117834425836380, 0.779149177326928900, 0.779180518280148450, 0.779211857285416750, 0.779243194342655320, 0.779274529451785990, 0.779305862612730270, +0.779337193825410450, 0.779368523089747130, 0.779399850405662510, 0.779431175773078300, 0.779462499191916010, 0.779493820662097600, 0.779525140183544570, 0.779556457756179320, +0.779587773379922360, 0.779619087054695850, 0.779650398780421750, 0.779681708557021570, 0.779713016384417150, 0.779744322262530210, 0.779775626191282490, 0.779806928170596160, +0.779838228200392060, 0.779869526280592360, 0.779900822411118800, 0.779932116591893210, 0.779963408822837320, 0.779994699103872980, 0.780025987434921800, 0.780057273815906280, +0.780088558246746940, 0.780119840727366290, 0.780151121257685930, 0.780182399837627830, 0.780213676467113700, 0.780244951146065510, 0.780276223874405320, 0.780307494652054180, +0.780338763478934160, 0.780370030354967330, 0.780401295280075400, 0.780432558254180230, 0.780463819277203650, 0.780495078349067510, 0.780526335469694190, 0.780557590639004540, +0.780588843856920960, 0.780620095123365170, 0.780651344438259230, 0.780682591801524880, 0.780713837213084070, 0.780745080672858640, 0.780776322180771090, 0.780807561736742150, +0.780838799340694330, 0.780870034992549480, 0.780901268692229640, 0.780932500439656560, 0.780963730234752180, 0.780994958077439130, 0.781026183967638010, 0.781057407905271560, +0.781088629890261510, 0.781119849922529920, 0.781151068001998630, 0.781182284128589810, 0.781213498302225200, 0.781244710522827400, 0.781275920790317270, 0.781307129104617300, +0.781338335465649570, 0.781369539873335910, 0.781400742327598490, 0.781431942828359260, 0.781463141375540630, 0.781494337969063650, 0.781525532608850830, 0.781556725294824120, +0.781587916026905580, 0.781619104805017280, 0.781650291629081280, 0.781681476499019530, 0.781712659414754540, 0.781743840376207480, 0.781775019383300740, 0.781806196435956500, +0.781837371534096710, 0.781868544677643550, 0.781899715866518960, 0.781930885100645230, 0.781962052379944650, 0.781993217704338490, 0.782024381073749280, 0.782055542488099160, +0.782086701947310110, 0.782117859451304300, 0.782149015000003890, 0.782180168593331500, 0.782211320231208100, 0.782242469913556390, 0.782273617640298570, 0.782304763411356690, +0.782335907226652800, 0.782367049086109210, 0.782398188989648080, 0.782429326937191920, 0.782460462928662000, 0.782491596963980740, 0.782522729043070630, 0.782553859165853630, +0.782584987332252120, 0.782616113542187960, 0.782647237795583650, 0.782678360092361690, 0.782709480432443370, 0.782740598815751310, 0.782771715242207790, 0.782802829711734980, +0.782833942224255060, 0.782865052779690210, 0.782896161377963360, 0.782927268018995590, 0.782958372702709630, 0.782989475429027750, 0.783020576197872130, 0.783051675009165060, +0.783082771862828820, 0.783113866758785690, 0.783144959696958410, 0.783176050677268250, 0.783207139699637840, 0.783238226763989690, 0.783269311870245950, 0.783300395018328930, +0.783331476208160900, 0.783362555439664710, 0.783393632712761630, 0.783424708027374410, 0.783455781383425530, 0.783486852780837070, 0.783517922219531540, 0.783548989699431210, +0.783580055220458370, 0.783611118782535980, 0.783642180385585200, 0.783673240029528980, 0.783704297714289730, 0.783735353439789730, 0.783766407205951250, 0.783797459012696820, +0.783828508859948700, 0.783859556747629860, 0.783890602675661690, 0.783921646643966910, 0.783952688652468030, 0.783983728701087460, 0.784014766789747460, 0.784045802918370670, +0.784076837086879920, 0.784107869295196380, 0.784138899543243340, 0.784169927830942970, 0.784200954158217780, 0.784231978524990270, 0.784263000931182730, 0.784294021376717780, +0.784325039861518250, 0.784356056385505540, 0.784387070948602720, 0.784418083550732280, 0.784449094191816520, 0.784480102871778160, 0.784511109590539490, 0.784542114348023010, +0.784573117144151900, 0.784604117978847330, 0.784635116852032470, 0.784666113763629820, 0.784697108713561910, 0.784728101701751330, 0.784759092728120390, 0.784790081792592240, +0.784821068895088400, 0.784852054035531820, 0.784883037213845220, 0.784914018429950900, 0.784944997683771570, 0.784975974975229860, 0.785006950304248050, 0.785037923670749540, +0.785068895074655600, 0.785099864515889420, 0.785130831994373610, 0.785161797510030680, 0.785192761062783350, 0.785223722652554020, 0.785254682279265980, 0.785285639942840620, +0.785316595643201330, 0.785347549380270400, 0.785378501153970570, 0.785409450964224540, 0.785440398810954950, 0.785471344694084310, 0.785502288613535880, 0.785533230569231080, +0.785564170561093290, 0.785595108589045130, 0.785626044653009110, 0.785656978752907960, 0.785687910888664410, 0.785718841060201070, 0.785749769267441220, 0.785780695510306380, +0.785811619788719720, 0.785842542102604070, 0.785873462451882050, 0.785904380836476400, 0.785935297256309840, 0.785966211711305540, 0.785997124201385120, 0.786028034726471980, +0.786058943286488620, 0.786089849881357990, 0.786120754511002830, 0.786151657175345630, 0.786182557874309350, 0.786213456607817160, 0.786244353375790910, 0.786275248178153750, +0.786306141014828320, 0.786337031885737670, 0.786367920790804420, 0.786398807729951410, 0.786429692703101260, 0.786460575710177580, 0.786491456751101770, 0.786522335825797450, +0.786553212934187230, 0.786584088076193950, 0.786614961251740460, 0.786645832460749590, 0.786676701703144630, 0.786707568978847420, 0.786738434287781230, 0.786769297629869020, +0.786800159005033640, 0.786831018413197690, 0.786861875854284350, 0.786892731328216240, 0.786923584834916870, 0.786954436374307950, 0.786985285946313010, 0.787016133550854760, +0.787046979187856270, 0.787077822857240260, 0.787108664558929690, 0.787139504292848070, 0.787170342058917120, 0.787201177857060340, 0.787232011687200580, 0.787262843549260790, +0.787293673443163920, 0.787324501368832810, 0.787355327326190510, 0.787386151315160430, 0.787416973335664410, 0.787447793387625940, 0.787478611470967980, 0.787509427585613490, +0.787540241731485510, 0.787571053908506900, 0.787601864116600600, 0.787632672355690230, 0.787663478625697520, 0.787694282926546310, 0.787725085258159210, 0.787755885620459510, +0.787786684013370040, 0.787817480436813990, 0.787848274890714630, 0.787879067374994020, 0.787909857889575900, 0.787940646434383000, 0.787971433009338580, 0.788002217614365510, +0.788033000249386940, 0.788063780914325830, 0.788094559609105790, 0.788125336333648900, 0.788156111087878640, 0.788186883871717980, 0.788217654685090310, 0.788248423527918350, +0.788279190400125400, 0.788309955301634950, 0.788340718232369180, 0.788371479192251590, 0.788402238181205250, 0.788432995199153330, 0.788463750246018890, 0.788494503321725100, +0.788525254426195030, 0.788556003559352400, 0.788586750721119280, 0.788617495911419280, 0.788648239130175450, 0.788678980377310990, 0.788709719652749160, 0.788740456956413040, +0.788771192288225790, 0.788801925648111020, 0.788832657035990930, 0.788863386451789220, 0.788894113895429070, 0.788924839366833550, 0.788955562865925940, 0.788986284392629520, +0.789017003946867910, 0.789047721528563170, 0.789078437137639140, 0.789109150774019110, 0.789139862437626130, 0.789170572128383490, 0.789201279846214470, 0.789231985591042130, +0.789262689362790540, 0.789293391161381530, 0.789324090986739170, 0.789354788838786510, 0.789385484717446850, 0.789416178622643570, 0.789446870554299740, 0.789477560512338860, +0.789508248496684550, 0.789538934507259090, 0.789569618543986220, 0.789600300606789430, 0.789630980695591790, 0.789661658810316690, 0.789692334950887530, 0.789723009117228040, +0.789753681309260490, 0.789784351526908730, 0.789815019770096050, 0.789845686038745830, 0.789876350332781470, 0.789907012652126150, 0.789937672996703370, 0.789968331366436960, +0.789998987761249110, 0.790029642181063750, 0.790060294625804400, 0.790090945095394240, 0.790121593589756750, 0.790152240108815240, 0.790182884652493760, 0.790213527220714470, +0.790244167813401340, 0.790274806430477870, 0.790305443071867230, 0.790336077737493150, 0.790366710427278800, 0.790397341141147680, 0.790427969879023750, 0.790458596640829290, +0.790489221426488480, 0.790519844235924470, 0.790550465069060900, 0.790581083925821270, 0.790611700806128860, 0.790642315709907170, 0.790672928637080160, 0.790703539587570450, +0.790734148561301750, 0.790764755558197810, 0.790795360578181890, 0.790825963621177630, 0.790856564687108410, 0.790887163775898290, 0.790917760887469790, 0.790948356021746850, +0.790978949178653080, 0.791009540358111880, 0.791040129560046880, 0.791070716784381460, 0.791101302031039340, 0.791131885299944490, 0.791162466591019410, 0.791193045904188040, +0.791223623239374120, 0.791254198596501150, 0.791284771975492740, 0.791315343376272410, 0.791345912798763650, 0.791376480242890650, 0.791407045708575900, 0.791437609195743570, +0.791468170704317190, 0.791498730234220460, 0.791529287785376790, 0.791559843357710010, 0.791590396951144080, 0.791620948565601610, 0.791651498201006890, 0.791682045857283300, +0.791712591534354690, 0.791743135232144570, 0.791773676950576540, 0.791804216689574350, 0.791834754449062260, 0.791865290228962570, 0.791895824029199780, 0.791926355849697390, +0.791956885690379140, 0.791987413551168640, 0.792017939431989610, 0.792048463332766350, 0.792078985253421350, 0.792109505193878790, 0.792140023154062510, 0.792170539133896230, +0.792201053133303580, 0.792231565152208270, 0.792262075190534150, 0.792292583248205280, 0.792323089325144390, 0.792353593421275870, 0.792384095536523340, 0.792414595670810520, +0.792445093824061250, 0.792475589996199270, 0.792506084187148300, 0.792536576396832610, 0.792567066625174950, 0.792597554872099600, 0.792628041137530490, 0.792658525421391150, +0.792689007723605620, 0.792719488044097420, 0.792749966382791160, 0.792780442739609460, 0.792810917114476490, 0.792841389507316420, 0.792871859918052760, 0.792902328346609450, +0.792932794792910340, 0.792963259256879270, 0.792993721738440630, 0.793024182237517030, 0.793054640754033090, 0.793085097287912430, 0.793115551839079110, 0.793146004407456860, +0.793176454992969630, 0.793206903595541360, 0.793237350215096230, 0.793267794851557180, 0.793298237504848740, 0.793328678174894610, 0.793359116861618860, 0.793389553564945340, +0.793419988284797870, 0.793450421021100970, 0.793480851773777470, 0.793511280542751880, 0.793541707327948150, 0.793572132129290010, 0.793602554946701620, 0.793632975780106830, +0.793663394629429590, 0.793693811494594500, 0.793724226375524200, 0.793754639272143400, 0.793785050184376060, 0.793815459112146020, 0.793845866055377320, 0.793876271013993940, +0.793906673987920470, 0.793937074977079770, 0.793967473981396440, 0.793997871000794330, 0.794028266035197610, 0.794058659084530220, 0.794089050148716110, 0.794119439227679360, +0.794149826321344680, 0.794180211429634800, 0.794210594552474450, 0.794240975689787580, 0.794271354841498240, 0.794301732007530630, 0.794332107187808560, 0.794362480382256320, +0.794392851590798310, 0.794423220813357700, 0.794453588049858990, 0.794483953300226360, 0.794514316564383870, 0.794544677842255580, 0.794575037133765540, 0.794605394438838490, +0.794635749757397480, 0.794666103089366920, 0.794696454434671300, 0.794726803793234460, 0.794757151164980580, 0.794787496549833830, 0.794817839947718370, 0.794848181358558840, +0.794878520782278280, 0.794908858218801420, 0.794939193668052440, 0.794969527129955500, 0.794999858604434670, 0.795030188091414350, 0.795060515590818360, 0.795090841102571780, +0.795121164626597430, 0.795151486162820280, 0.795181805711164370, 0.795212123271553880, 0.795242438843913210, 0.795272752428166420, 0.795303064024238230, 0.795333373632051810, +0.795363681251532010, 0.795393986882602990, 0.795424290525189040, 0.795454592179214330, 0.795484891844603140, 0.795515189521279750, 0.795545485209168900, 0.795575778908193860, +0.795606070618279260, 0.795636360339349590, 0.795666648071328920, 0.795696933814141750, 0.795727217567712140, 0.795757499331965050, 0.795787779106823740, 0.795818056892212860, +0.795848332688056990, 0.795878606494280110, 0.795908878310806810, 0.795939148137561390, 0.795969415974468020, 0.795999681821451640, 0.796029945678435550, 0.796060207545344570, +0.796090467422103100, 0.796120725308635420, 0.796150981204865940, 0.796181235110719030, 0.796211487026118990, 0.796241736950990760, 0.796271984885257740, 0.796302230828844660, +0.796332474781676130, 0.796362716743676310, 0.796392956714769730, 0.796423194694880760, 0.796453430683934260, 0.796483664681853720, 0.796513896688564090, 0.796544126703989660, +0.796574354728054820, 0.796604580760684190, 0.796634804801802150, 0.796665026851333000, 0.796695246909201900, 0.796725464975332030, 0.796755681049648670, 0.796785895132075980, +0.796816107222538590, 0.796846317320960900, 0.796876525427267390, 0.796906731541382700, 0.796936935663231650, 0.796967137792737650, 0.796997337929825860, 0.797027536074420780, +0.797057732226446820, 0.797087926385828480, 0.797118118552490370, 0.797148308726357560, 0.797178496907353320, 0.797208683095402940, 0.797238867290430810, 0.797269049492361550, +0.797299229701119660, 0.797329407916629650, 0.797359584138816140, 0.797389758367604170, 0.797419930602917380, 0.797450100844680600, 0.797480269092818660, 0.797510435347256070, +0.797540599607917340, 0.797570761874727200, 0.797600922147610580, 0.797631080426491220, 0.797661236711294070, 0.797691391001943860, 0.797721543298365200, 0.797751693600482700, +0.797781841908220880, 0.797811988221504450, 0.797842132540258710, 0.797872274864407040, 0.797902415193874610, 0.797932553528586270, 0.797962689868466410, 0.797992824213439980, +0.798022956563431360, 0.798053086918365410, 0.798083215278167280, 0.798113341642760600, 0.798143466012070530, 0.798173588386021820, 0.798203708764539050, 0.798233827147547090, +0.798263943534970540, 0.798294057926734690, 0.798324170322763150, 0.798354280722981200, 0.798384389127313470, 0.798414495535684890, 0.798444599948019970, 0.798474702364243560, +0.798504802784280490, 0.798534901208055810, 0.798564997635493490, 0.798595092066518570, 0.798625184501055910, 0.798655274939030320, 0.798685363380366550, 0.798715449824989430, +0.798745534272824130, 0.798775616723794490, 0.798805697177825790, 0.798835775634842870, 0.798865852094770570, 0.798895926557533500, 0.798925999023056720, 0.798956069491264960, +0.798986137962083510, 0.799016204435436190, 0.799046268911248300, 0.799076331389444890, 0.799106391869950580, 0.799136450352690210, 0.799166506837588830, 0.799196561324571060, +0.799226613813562530, 0.799256664304486830, 0.799286712797269590, 0.799316759291835540, 0.799346803788109520, 0.799376846286016460, 0.799406886785481440, 0.799436925286429620, +0.799466961788785070, 0.799496996292472950, 0.799527028797418440, 0.799557059303546370, 0.799587087810781580, 0.799617114319049140, 0.799647138828273870, 0.799677161338381290, +0.799707181849295350, 0.799737200360941420, 0.799767216873244480, 0.799797231386129460, 0.799827243899521310, 0.799857254413345210, 0.799887262927525880, 0.799917269441988930, +0.799947273956658320, 0.799977276471459440, 0.800007276986317350, 0.800037275501157220, 0.800067272015903770, 0.800097266530482190, 0.800127259044817960, 0.800157249558835160, +0.800187238072459060, 0.800217224585614950, 0.800247209098227770, 0.800277191610222590, 0.800307172121524470, 0.800337150632058240, 0.800367127141749850, 0.800397101650523020, +0.800427074158303500, 0.800457044665016220, 0.800487013170586350, 0.800516979674939070, 0.800546944177999210, 0.800576906679692500, 0.800606867179943120, 0.800636825678676440, +0.800666782175817770, 0.800696736671292040, 0.800726689165024650, 0.800756639656940440, 0.800786588146964570, 0.800816534635022890, 0.800846479121039230, 0.800876421604939440, +0.800906362086648560, 0.800936300566091770, 0.800966237043194250, 0.800996171517881160, 0.801026103990077680, 0.801056034459709410, 0.801085962926700420, 0.801115889390976670, +0.801145813852463200, 0.801175736311085070, 0.801205656766767690, 0.801235575219436220, 0.801265491669016280, 0.801295406115432040, 0.801325318558609330, 0.801355228998473330, +0.801385137434949210, 0.801415043867962360, 0.801444948297437840, 0.801474850723300940, 0.801504751145477370, 0.801534649563891530, 0.801564545978468930, 0.801594440389135080, +0.801624332795815020, 0.801654223198434270, 0.801684111596917880, 0.801713997991191140, 0.801743882381180110, 0.801773764766808730, 0.801803645148002950, 0.801833523524688060, +0.801863399896789340, 0.801893274264232180, 0.801923146626941750, 0.801953016984844000, 0.801982885337863220, 0.802012751685925230, 0.802042616028955440, 0.802072478366878890, +0.802102338699621330, 0.802132197027107920, 0.802162053349263940, 0.802191907666015340, 0.802221759977286510, 0.802251610283003290, 0.802281458583090970, 0.802311304877475040, +0.802341149166080900, 0.802370991448833840, 0.802400831725659790, 0.802430669996483160, 0.802460506261229890, 0.802490340519825260, 0.802520172772194900, 0.802550003018264070, +0.802579831257958180, 0.802609657491202830, 0.802639481717923760, 0.802669303938045480, 0.802699124151493910, 0.802728942358194590, 0.802758758558072880, 0.802788572751054310, +0.802818384937064260, 0.802848195116028340, 0.802878003287872400, 0.802907809452520830, 0.802937613609899900, 0.802967415759934800, 0.802997215902551240, 0.803027014037674620, +0.803056810165230450, 0.803086604285144890, 0.803116396397342220, 0.803146186501748520, 0.803175974598289380, 0.803205760686890200, 0.803235544767476830, 0.803265326839974430, +0.803295106904308830, 0.803324884960405880, 0.803354661008190310, 0.803384435047587940, 0.803414207078524620, 0.803443977100925630, 0.803473745114716810, 0.803503511119823650, +0.803533275116171670, 0.803563037103687040, 0.803592797082294250, 0.803622555051919480, 0.803652311012488350, 0.803682064963926470, 0.803711816906159450, 0.803741566839112800, +0.803771314762712800, 0.803801060676883950, 0.803830804581552540, 0.803860546476644070, 0.803890286362084150, 0.803920024237798620, 0.803949760103713000, 0.803979493959752990, +0.804009225805844770, 0.804038955641912860, 0.804068683467883740, 0.804098409283682810, 0.804128133089235810, 0.804157854884468560, 0.804187574669306680, 0.804217292443676350, +0.804247008207502280, 0.804276721960710650, 0.804306433703227300, 0.804336143434977830, 0.804365851155887880, 0.804395556865883490, 0.804425260564890050, 0.804454962252834080, +0.804484661929640190, 0.804514359595234650, 0.804544055249543090, 0.804573748892491560, 0.804603440524005560, 0.804633130144010940, 0.804662817752433530, 0.804692503349199620, +0.804722186934233920, 0.804751868507462720, 0.804781548068811860, 0.804811225618207170, 0.804840901155574380, 0.804870574680839330, 0.804900246193928410, 0.804929915694766350, +0.804959583183279430, 0.804989248659393590, 0.805018912123034670, 0.805048573574128400, 0.805078233012600840, 0.805107890438377490, 0.805137545851385080, 0.805167199251548230, +0.805196850638793430, 0.805226500013046410, 0.805256147374233230, 0.805285792722279630, 0.805315436057111640, 0.805345077378654910, 0.805374716686836130, 0.805404353981580060, +0.805433989262812950, 0.805463622530461000, 0.805493253784449910, 0.805522883024705760, 0.805552510251154370, 0.805582135463722260, 0.805611758662334250, 0.805641379846916860, +0.805670999017396030, 0.805700616173697700, 0.805730231315747720, 0.805759844443472260, 0.805789455556797260, 0.805819064655649010, 0.805848671739952670, 0.805878276809634640, +0.805907879864620870, 0.805937480904837410, 0.805967079930210330, 0.805996676940665460, 0.806026271936129410, 0.806055864916527250, 0.806085455881785370, 0.806115044831829830, +0.806144631766586680, 0.806174216685981990, 0.806203799589941710, 0.806233380478391990, 0.806262959351259360, 0.806292536208468750, 0.806322111049946780, 0.806351683875619510, +0.806381254685413110, 0.806410823479253640, 0.806440390257066930, 0.806469955018779380, 0.806499517764317500, 0.806529078493606110, 0.806558637206572170, 0.806588193903141630, +0.806617748583240530, 0.806647301246795180, 0.806676851893731510, 0.806706400523976240, 0.806735947137454450, 0.806765491734092730, 0.806795034313817380, 0.806824574876554350, +0.806854113422230010, 0.806883649950770220, 0.806913184462101470, 0.806942716956150160, 0.806972247432841570, 0.807001775892102420, 0.807031302333858780, 0.807060826758036810, +0.807090349164562900, 0.807119869553363120, 0.807149387924364080, 0.807178904277491170, 0.807208418612670900, 0.807237930929829650, 0.807267441228893490, 0.807296949509788810, +0.807326455772441660, 0.807355960016778450, 0.807385462242725890, 0.807414962450209160, 0.807444460639154980, 0.807473956809489630, 0.807503450961139400, 0.807532943094030560, +0.807562433208089290, 0.807591921303241980, 0.807621407379415460, 0.807650891436534900, 0.807680373474527040, 0.807709853493318250, 0.807739331492834830, 0.807768807473003060, +0.807798281433749320, 0.807827753375000350, 0.807857223296681530, 0.807886691198719700, 0.807916157081041030, 0.807945620943572030, 0.807975082786238970, 0.808004542608968150, +0.808034000411686050, 0.808063456194319410, 0.808092909956793730, 0.808122361699035620, 0.808151811420971700, 0.808181259122528140, 0.808210704803631550, 0.808240148464208110, +0.808269590104184420, 0.808299029723487220, 0.808328467322041890, 0.808357902899775380, 0.808387336456614200, 0.808416767992484630, 0.808446197507313170, 0.808475625001026100, +0.808505050473550590, 0.808534473924811930, 0.808563895354737050, 0.808593314763252470, 0.808622732150284570, 0.808652147515759870, 0.808681560859604850, 0.808710972181745810, +0.808740381482109920, 0.808769788760622550, 0.808799194017210790, 0.808828597251800900, 0.808857998464319610, 0.808887397654693310, 0.808916794822848510, 0.808946189968712260, +0.808975583092209960, 0.809004974193268780, 0.809034363271815100, 0.809063750327775550, 0.809093135361076520, 0.809122518371644730, 0.809151899359406680, 0.809181278324289430, +0.809210655266218380, 0.809240030185120700, 0.809269403080922990, 0.809298773953551760, 0.809328142802933530, 0.809357509628995000, 0.809386874431662800, 0.809416237210863750, +0.809445597966523710, 0.809474956698569610, 0.809504313406928190, 0.809533668091525940, 0.809563020752289480, 0.809592371389145530, 0.809621720002021150, 0.809651066590841960, +0.809680411155535130, 0.809709753696027160, 0.809739094212244880, 0.809768432704114920, 0.809797769171563870, 0.809827103614518260, 0.809856436032905580, 0.809885766426651220, +0.809915094795682470, 0.809944421139925930, 0.809973745459308340, 0.810003067753756410, 0.810032388023196770, 0.810061706267556250, 0.810091022486761900, 0.810120336680739570, +0.810149648849416320, 0.810178958992718970, 0.810208267110574140, 0.810237573202908790, 0.810266877269649410, 0.810296179310723400, 0.810325479326056360, 0.810354777315575700, +0.810384073279208030, 0.810413367216880290, 0.810442659128519090, 0.810471949014051170, 0.810501236873403360, 0.810530522706503050, 0.810559806513275970, 0.810589088293649280, +0.810618368047549830, 0.810647645774904560, 0.810676921475640190, 0.810706195149683450, 0.810735466796961730, 0.810764736417400880, 0.810794004010928160, 0.810823269577470420, +0.810852533116954490, 0.810881794629307320, 0.810911054114455520, 0.810940311572326160, 0.810969567002846610, 0.810998820405942510, 0.811028071781541460, 0.811057321129570190, +0.811086568449955530, 0.811115813742624650, 0.811145057007504060, 0.811174298244520920, 0.811203537453602520, 0.811232774634674690, 0.811262009787664940, 0.811291242912500320, +0.811320474009107450, 0.811349703077413390, 0.811378930117345190, 0.811408155128830020, 0.811437378111794060, 0.811466599066164700, 0.811495817991868760, 0.811525034888833210, +0.811554249756985200, 0.811583462596251470, 0.811612673406559180, 0.811641882187835620, 0.811671088940006950, 0.811700293663000450, 0.811729496356743300, 0.811758697021162320, +0.811787895656184700, 0.811817092261737260, 0.811846286837747180, 0.811875479384141840, 0.811904669900847310, 0.811933858387791090, 0.811963044844900230, 0.811992229272101680, +0.812021411669322620, 0.812050592036489990, 0.812079770373531520, 0.812108946680373030, 0.812138120956942160, 0.812167293203166050, 0.812196463418971560, 0.812225631604286070, +0.812254797759036420, 0.812283961883149770, 0.812313123976553750, 0.812342284039174410, 0.812371442070939360, 0.812400598071775780, 0.812429752041610610, 0.812458903980371130, +0.812488053887984290, 0.812517201764377920, 0.812546347609477970, 0.812575491423212170, 0.812604633205507690, 0.812633772956291580, 0.812662910675491010, 0.812692046363033270, +0.812721180018845300, 0.812750311642854940, 0.812779441234988350, 0.812808568795173050, 0.812837694323336410, 0.812866817819405510, 0.812895939283307500, 0.812925058714969670, +0.812954176114319300, 0.812983291481283900, 0.813012404815789740, 0.813041516117764650, 0.813070625387135700, 0.813099732623830170, 0.813128837827775450, 0.813157940998898490, +0.813187042137127230, 0.813216141242387950, 0.813245238314608150, 0.813274333353715350, 0.813303426359636710, 0.813332517332299500, 0.813361606271631010, 0.813390693177558520, +0.813419778050009760, 0.813448860888911000, 0.813477941694190190, 0.813507020465774500, 0.813536097203591210, 0.813565171907567720, 0.813594244577631300, 0.813623315213709230, +0.813652383815729460, 0.813681450383618170, 0.813710514917303280, 0.813739577416712100, 0.813768637881771890, 0.813797696312410170, 0.813826752708554200, 0.813855807070131940, +0.813884859397069560, 0.813913909689295000, 0.813942957946735660, 0.813972004169319030, 0.814001048356972290, 0.814030090509623050, 0.814059130627198480, 0.814088168709626640, +0.814117204756833800, 0.814146238768748030, 0.814175270745296610, 0.814204300686407030, 0.814233328592006700, 0.814262354462023110, 0.814291378296384090, 0.814320400095016050, +0.814349419857847150, 0.814378437584804550, 0.814407453275815870, 0.814436466930808620, 0.814465478549710300, 0.814494488132448180, 0.814523495678950330, 0.814552501189143240, +0.814581504662954870, 0.814610506100312830, 0.814639505501144500, 0.814668502865377290, 0.814697498192938910, 0.814726491483756870, 0.814755482737759000, 0.814784471954871910, +0.814813459135023680, 0.814842444278141790, 0.814871427384153860, 0.814900408452987280, 0.814929387484569670, 0.814958364478829190, 0.814987339435692240, 0.815016312355086870, +0.815045283236940810, 0.815074252081181560, 0.815103218887736620, 0.815132183656533620, 0.815161146387500150, 0.815190107080564390, 0.815219065735652840, 0.815248022352693560, +0.815276976931614270, 0.815305929472342590, 0.815334879974806030, 0.815363828438932290, 0.815392774864649450, 0.815421719251884220, 0.815450661600564670, 0.815479601910618520, +0.815508540181973270, 0.815537476414556650, 0.815566410608296490, 0.815595342763120180, 0.815624272878956110, 0.815653200955730790, 0.815682126993372390, 0.815711050991808740, +0.815739972950967560, 0.815768892870776360, 0.815797810751162870, 0.815826726592054910, 0.815855640393380650, 0.815884552155066830, 0.815913461877041610, 0.815942369559232720, +0.815971275201567870, 0.816000178803974800, 0.816029080366381330, 0.816057979888715760, 0.816086877370904570, 0.816115772812876280, 0.816144666214558610, 0.816173557575879170, +0.816202446896765910, 0.816231334177146440, 0.816260219416948710, 0.816289102616100990, 0.816317983774529910, 0.816346862892163850, 0.816375739968930760, 0.816404615004758250, +0.816433487999574160, 0.816462358953306320, 0.816491227865882680, 0.816520094737231420, 0.816548959567279460, 0.816577822355955110, 0.816606683103186180, 0.816635541808900520, +0.816664398473026080, 0.816693253095490570, 0.816722105676222500, 0.816750956215148590, 0.816779804712197350, 0.816808651167296510, 0.816837495580374110, 0.816866337951357990, +0.816895178280175990, 0.816924016566756060, 0.816952852811026590, 0.816981687012914510, 0.817010519172348130, 0.817039349289255480, 0.817068177363564520, 0.817097003395203080, +0.817125827384099110, 0.817154649330181120, 0.817183469233375930, 0.817212287093612160, 0.817241102910817640, 0.817269916684920330, 0.817298728415848270, 0.817327538103529430, +0.817356345747891620, 0.817385151348863470, 0.817413954906372030, 0.817442756420345700, 0.817471555890712410, 0.817500353317400230, 0.817529148700337220, 0.817557942039451310, +0.817586733334670580, 0.817615522585923520, 0.817644309793137070, 0.817673094956239850, 0.817701878075159930, 0.817730659149825350, 0.817759438180164170, 0.817788215166104230, +0.817816990107574360, 0.817845763004501510, 0.817874533856814300, 0.817903302664440670, 0.817932069427308780, 0.817960834145346700, 0.817989596818482600, 0.818018357446644530, +0.818047116029760990, 0.818075872567759270, 0.818104627060567750, 0.818133379508114710, 0.818162129910328220, 0.818190878267136430, 0.818219624578467420, 0.818248368844249340, +0.818277111064410920, 0.818305851238879110, 0.818334589367582740, 0.818363325450449870, 0.818392059487408670, 0.818420791478387310, 0.818449521423314060, 0.818478249322117430, +0.818506975174724700, 0.818535698981064490, 0.818564420741065170, 0.818593140454654590, 0.818621858121761360, 0.818650573742313310, 0.818679287316238960, 0.818707998843466900, +0.818736708323924200, 0.818765415757539810, 0.818794121144241880, 0.818822824483958710, 0.818851525776618460, 0.818880225022149300, 0.818908922220480170, 0.818937617371538140, +0.818966310475252150, 0.818995001531550360, 0.819023690540361060, 0.819052377501612640, 0.819081062415233150, 0.819109745281150990, 0.819138426099294990, 0.819167104869592540, +0.819195781591972150, 0.819224456266362420, 0.819253128892691530, 0.819281799470887860, 0.819310468000879590, 0.819339134482595210, 0.819367798915963560, 0.819396461300911820, +0.819425121637368910, 0.819453779925263250, 0.819482436164523100, 0.819511090355076850, 0.819539742496852910, 0.819568392589780200, 0.819597040633785910, 0.819625686628798980, +0.819654330574747900, 0.819682972471560970, 0.819711612319166670, 0.819740250117493300, 0.819768885866469230, 0.819797519566023540, 0.819826151216083490, 0.819854780816578140, +0.819883408367435780, 0.819912033868584910, 0.819940657319953910, 0.819969278721471300, 0.819997898073065560, 0.820026515374665530, 0.820055130626198720, 0.820083743827594080, +0.820112354978779990, 0.820140964079685180, 0.820169571130237810, 0.820198176130366610, 0.820226779080000410, 0.820255379979066830, 0.820283978827494710, 0.820312575625212760, +0.820341170372149260, 0.820369763068232840, 0.820398353713392090, 0.820426942307555420, 0.820455528850651870, 0.820484113342609070, 0.820512695783355840, 0.820541276172821020, +0.820569854510933010, 0.820598430797620290, 0.820627005032811500, 0.820655577216435670, 0.820684147348420430, 0.820712715428694840, 0.820741281457187500, 0.820769845433826920, +0.820798407358541700, 0.820826967231260470, 0.820855525051911840, 0.820884080820424860, 0.820912634536727250, 0.820941186200747960, 0.820969735812415720, 0.820998283371659250, +0.821026828878406940, 0.821055372332587630, 0.821083913734129920, 0.821112453082962880, 0.821140990379014220, 0.821169525622213130, 0.821198058812488090, 0.821226589949768050, +0.821255119033981410, 0.821283646065057100, 0.821312171042924090, 0.821340693967510190, 0.821369214838744480, 0.821397733656555770, 0.821426250420872810, 0.821454765131624190, +0.821483277788738640, 0.821511788392144780, 0.821540296941772110, 0.821568803437548120, 0.821597307879402110, 0.821625810267262890, 0.821654310601059200, 0.821682808880719650, +0.821711305106173070, 0.821739799277348190, 0.821768291394174400, 0.821796781456579310, 0.821825269464492300, 0.821853755417842110, 0.821882239316557570, 0.821910721160567400, +0.821939200949800440, 0.821967678684185970, 0.821996154363651810, 0.822024627988127250, 0.822053099557541130, 0.822081569071822280, 0.822110036530899420, 0.822138501934701500, +0.822166965283157470, 0.822195426576196380, 0.822223885813746280, 0.822252342995736460, 0.822280798122095760, 0.822309251192753000, 0.822337702207637240, 0.822366151166677220, +0.822394598069802200, 0.822423042916940240, 0.822451485708020740, 0.822479926442972520, 0.822508365121724430, 0.822536801744205400, 0.822565236310344390, 0.822593668820070350, +0.822622099273312650, 0.822650527669999130, 0.822678954010059300, 0.822707378293422000, 0.822735800520016380, 0.822764220689771290, 0.822792638802615550, 0.822821054858478230, +0.822849468857288820, 0.822877880798975280, 0.822906290683466880, 0.822934698510692900, 0.822963104280582060, 0.822991507993063530, 0.823019909648066260, 0.823048309245519640, +0.823076706785351830, 0.823105102267492230, 0.823133495691869780, 0.823161887058413640, 0.823190276367052890, 0.823218663617716340, 0.823247048810333170, 0.823275431944832880, +0.823303813021143420, 0.823332192039194500, 0.823360568998915190, 0.823388943900234320, 0.823417316743081160, 0.823445687527384670, 0.823474056253074460, 0.823502422920078690, +0.823530787528326760, 0.823559150077747940, 0.823587510568271170, 0.823615868999825640, 0.823644225372340500, 0.823672579685744810, 0.823700931939968070, 0.823729282134938570, +0.823757630270585790, 0.823785976346839030, 0.823814320363627340, 0.823842662320879770, 0.823871002218525610, 0.823899340056493900, 0.823927675834714270, 0.823956009553115100, +0.823984341211625780, 0.824012670810175710, 0.824040998348693930, 0.824069323827109620, 0.824097647245352060, 0.824125968603350860, 0.824154287901034180, 0.824182605138331860, +0.824210920315172960, 0.824239233431486750, 0.824267544487202520, 0.824295853482249430, 0.824324160416556650, 0.824352465290054020, 0.824380768102669690, 0.824409068854333520, +0.824437367544974650, 0.824465664174522270, 0.824493958742905870, 0.824522251250054410, 0.824550541695897480, 0.824578830080364590, 0.824607116403384130, 0.824635400664885940, +0.824663682864799190, 0.824691963003053250, 0.824720241079577420, 0.824748517094300970, 0.824776791047153850, 0.824805062938064100, 0.824833332766961690, 0.824861600533776000, +0.824889866238436300, 0.824918129880871990, 0.824946391461012340, 0.824974650978786640, 0.825002908434124830, 0.825031163826955290, 0.825059417157207760, 0.825087668424811850, +0.825115917629696600, 0.825144164771791640, 0.825172409851026250, 0.825200652867330350, 0.825228893820632250, 0.825257132710861980, 0.825285369537948840, 0.825313604301822320, +0.825341837002411820, 0.825370067639646710, 0.825398296213456390, 0.825426522723770820, 0.825454747170518480, 0.825482969553629210, 0.825511189873032620, 0.825539408128658000, +0.825567624320434850, 0.825595838448292650, 0.825624050512160810, 0.825652260511969490, 0.825680468447646860, 0.825708674319123090, 0.825736878126327680, 0.825765079869190120, +0.825793279547639810, 0.825821477161606250, 0.825849672711019500, 0.825877866195808160, 0.825906057615902080, 0.825934246971230860, 0.825962434261724110, 0.825990619487311120, +0.826018802647921710, 0.826046983743485290, 0.826075162773931890, 0.826103339739190030, 0.826131514639189880, 0.826159687473860930, 0.826187858243132790, 0.826216026946934860, +0.826244193585196960, 0.826272358157848610, 0.826300520664819850, 0.826328681106039300, 0.826356839481437010, 0.826384995790942710, 0.826413150034485790, 0.826441302211996080, +0.826469452323403080, 0.826497600368636950, 0.826525746347626320, 0.826553890260301350, 0.826582032106591650, 0.826610171886426940, 0.826638309599736720, 0.826666445246450720, +0.826694578826498550, 0.826722710339810480, 0.826750839786315250, 0.826778967165942790, 0.826807092478622940, 0.826835215724285310, 0.826863336902859740, 0.826891456014275830, +0.826919573058463750, 0.826947688035352120, 0.826975800944871440, 0.827003911786951210, 0.827032020561521140, 0.827060127268511080, 0.827088231907850640, 0.827116334479469640, +0.827144434983298370, 0.827172533419265440, 0.827200629787301240, 0.827228724087335500, 0.827256816319297820, 0.827284906483118140, 0.827312994578726310, 0.827341080606051830, +0.827369164565025290, 0.827397246455575220, 0.827425326277632100, 0.827453404031125660, 0.827481479715985730, 0.827509553332142040, 0.827537624879524540, 0.827565694358063380, +0.827593761767687620, 0.827621827108327320, 0.827649890379912550, 0.827677951582373010, 0.827706010715638540, 0.827734067779639090, 0.827762122774304500, 0.827790175699565140, +0.827818226555349760, 0.827846275341588830, 0.827874322058212210, 0.827902366705149830, 0.827930409282331530, 0.827958449789687130, 0.827986488227146710, 0.828014524594640420, +0.828042558892097440, 0.828070591119448030, 0.828098621276622150, 0.828126649363549740, 0.828154675380160630, 0.828182699326384890, 0.828210721202153000, 0.828238741007393700, +0.828266758742037480, 0.828294774406014400, 0.828322787999254520, 0.828350799521687550, 0.828378808973243560, 0.828406816353852600, 0.828434821663445060, 0.828462824901950000, +0.828490826069297910, 0.828518825165418750, 0.828546822190242450, 0.828574817143699180, 0.828602810025718780, 0.828630800836231860, 0.828658789575167590, 0.828686776242456240, +0.828714760838027860, 0.828742743361812750, 0.828770723813740730, 0.828798702193741850, 0.828826678501746180, 0.828854652737684440, 0.828882624901485450, 0.828910594993079950, +0.828938563012397990, 0.828966528959369510, 0.828994492833924790, 0.829022454635993890, 0.829050414365506750, 0.829078372022394210, 0.829106327606585090, 0.829134281118010240, +0.829162232556599710, 0.829190181922283550, 0.829218129214991940, 0.829246074434655030, 0.829274017581203340, 0.829301958654566240, 0.829329897654674130, 0.829357834581457400, +0.829385769434845990, 0.829413702214770180, 0.829441632921160130, 0.829469561553945910, 0.829497488113058350, 0.829525412598426600, 0.829553335009981300, 0.829581255347652700, +0.829609173611370880, 0.829637089801066210, 0.829665003916668750, 0.829692915958108790, 0.829720825925317150, 0.829748733818222780, 0.829776639636756630, 0.829804543380848970, +0.829832445050429860, 0.829860344645429680, 0.829888242165778610, 0.829916137611407480, 0.829944030982245450, 0.829971922278223360, 0.829999811499271490, 0.830027698645320000, +0.830055583716299390, 0.830083466712139730, 0.830111347632771500, 0.830139226478125320, 0.830167103248130590, 0.830194977942718020, 0.830222850561818100, 0.830250721105361130, +0.830278589573277270, 0.830306455965496900, 0.830334320281950980, 0.830362182522568660, 0.830390042687281000, 0.830417900776018070, 0.830445756788710580, 0.830473610725288580, +0.830501462585682580, 0.830529312369822970, 0.830557160077640470, 0.830585005709064570, 0.830612849264026230, 0.830640690742455830, 0.830668530144283660, 0.830696367469440090, +0.830724202717855630, 0.830752035889460670, 0.830779866984186150, 0.830807696001961470, 0.830835522942717450, 0.830863347806384710, 0.830891170592893640, 0.830918991302174610, +0.830946809934158040, 0.830974626488774960, 0.831002440965954880, 0.831030253365628640, 0.831058063687726830, 0.831085871932179750, 0.831113678098918120, 0.831141482187872200, +0.831169284198972620, 0.831197084132150320, 0.831224881987334800, 0.831252677764457100, 0.831280471463447750, 0.831308263084237110, 0.831336052626755920, 0.831363840090934560, +0.831391625476703530, 0.831419408783994010, 0.831447190012735480, 0.831474969162858900, 0.831502746234294990, 0.831530521226974130, 0.831558294140827050, 0.831586064975784130, +0.831613833731776660, 0.831641600408734030, 0.831669365006587390, 0.831697127525267370, 0.831724887964704560, 0.831752646324829480, 0.831780402605572840, 0.831808156806865150, +0.831835908928637570, 0.831863658970819820, 0.831891406933342740, 0.831919152816137260, 0.831946896619133900, 0.831974638342263260, 0.832002377985456070, 0.832030115548643370, +0.832057851031754890, 0.832085584434721800, 0.832113315757474830, 0.832141044999944460, 0.832168772162061530, 0.832196497243756660, 0.832224220244960570, 0.832251941165604410, +0.832279660005617820, 0.832307376764932160, 0.832335091443478060, 0.832362804041186230, 0.832390514557987400, 0.832418222993812300, 0.832445929348591520, 0.832473633622256570, +0.832501335814736950, 0.832529035925964060, 0.832556733955868490, 0.832584429904381080, 0.832612123771432680, 0.832639815556953990, 0.832667505260876180, 0.832695192883129100, +0.832722878423644120, 0.832750561882351860, 0.832778243259183260, 0.832805922554069040, 0.832833599766939940, 0.832861274897726990, 0.832888947946361260, 0.832916618912772690, +0.832944287796892450, 0.832971954598651590, 0.832999619317980830, 0.833027281954811130, 0.833054942509073080, 0.833082600980698200, 0.833110257369616410, 0.833137911675758900, +0.833165563899056600, 0.833193214039440360, 0.833220862096841210, 0.833248508071189780, 0.833276151962417110, 0.833303793770454600, 0.833331433495232090, 0.833359071136681060, +0.833386706694732250, 0.833414340169316700, 0.833441971560365370, 0.833469600867809080, 0.833497228091578670, 0.833524853231605740, 0.833552476287820250, 0.833580097260153590, +0.833607716148536570, 0.833635332952900380, 0.833662947673175840, 0.833690560309293890, 0.833718170861186050, 0.833745779328782240, 0.833773385712013980, 0.833800990010812320, +0.833828592225108190, 0.833856192354832550, 0.833883790399916450, 0.833911386360290830, 0.833938980235887310, 0.833966572026635710, 0.833994161732467880, 0.834021749353314520, +0.834049334889106710, 0.834076918339775710, 0.834104499705252360, 0.834132078985467820, 0.834159656180353480, 0.834187231289839510, 0.834214804313857530, 0.834242375252338460, +0.834269944105213490, 0.834297510872413770, 0.834325075553870140, 0.834352638149514330, 0.834380198659276480, 0.834407757083088120, 0.834435313420880290, 0.834462867672584260, +0.834490419838131100, 0.834517969917451750, 0.834545517910477600, 0.834573063817140140, 0.834600607637369430, 0.834628149371097310, 0.834655689018254710, 0.834683226578773030, +0.834710762052583210, 0.834738295439616420, 0.834765826739804480, 0.834793355953077460, 0.834820883079366970, 0.834848408118604390, 0.834875931070720670, 0.834903451935647300, +0.834930970713315120, 0.834958487403655640, 0.834986002006600340, 0.835013514522079610, 0.835041024950025080, 0.835068533290367900, 0.835096039543039460, 0.835123543707970930, +0.835151045785093580, 0.835178545774338590, 0.835206043675637670, 0.835233539488921210, 0.835261033214120820, 0.835288524851167890, 0.835316014399993700, 0.835343501860529410, +0.835370987232706420, 0.835398470516456440, 0.835425951711709750, 0.835453430818398290, 0.835480907836453120, 0.835508382765805750, 0.835535855606387430, 0.835563326358129470, +0.835590795020963120, 0.835618261594820330, 0.835645726079631390, 0.835673188475328230, 0.835700648781841910, 0.835728106999104160, 0.835755563127046020, 0.835783017165599000, +0.835810469114694480, 0.835837918974264180, 0.835865366744238720, 0.835892812424549710, 0.835920256015128760, 0.835947697515907140, 0.835975136926816240, 0.836002574247787570, +0.836030009478752940, 0.836057442619642770, 0.836084873670388970, 0.836112302630923070, 0.836139729501176430, 0.836167154281080350, 0.836194576970566430, 0.836221997569566060, +0.836249416078011290, 0.836276832495832290, 0.836304246822961340, 0.836331659059329820, 0.836359069204869020, 0.836386477259510650, 0.836413883223186110, 0.836441287095827210, +0.836468688877364700, 0.836496088567730500, 0.836523486166856010, 0.836550881674672840, 0.836578275091112490, 0.836605666416106340, 0.836633055649586120, 0.836660442791483770, +0.836687827841729790, 0.836715210800256240, 0.836742591666994720, 0.836769970441876620, 0.836797347124833670, 0.836824721715797250, 0.836852094214699080, 0.836879464621471230, +0.836906832936044180, 0.836934199158350100, 0.836961563288320390, 0.836988925325886870, 0.837016285270981040, 0.837043643123534520, 0.837070998883479240, 0.837098352550746160, +0.837125704125267100, 0.837153053606973780, 0.837180400995797820, 0.837207746291670940, 0.837235089494524630, 0.837262430604290510, 0.837289769620900960, 0.837317106544286370, +0.837344441374379130, 0.837371774111110740, 0.837399104754412930, 0.837426433304217290, 0.837453759760455550, 0.837481084123059550, 0.837508406391961220, 0.837535726567091410, +0.837563044648382270, 0.837590360635765530, 0.837617674529172910, 0.837644986328536120, 0.837672296033786900, 0.837699603644857290, 0.837726909161678250, 0.837754212584181920, +0.837781513912300160, 0.837808813145964560, 0.837836110285106850, 0.837863405329658970, 0.837890698279552540, 0.837917989134719820, 0.837945277895091660, 0.837972564560600320, +0.837999849131177530, 0.838027131606755130, 0.838054411987264940, 0.838081690272638680, 0.838108966462808750, 0.838136240557705860, 0.838163512557262400, 0.838190782461410100, +0.838218050270080890, 0.838245315983206510, 0.838272579600718880, 0.838299841122549850, 0.838327100548631580, 0.838354357878895120, 0.838381613113272860, 0.838408866251696530, +0.838436117294097950, 0.838463366240409070, 0.838490613090561940, 0.838517857844488070, 0.838545100502120170, 0.838572341063389070, 0.838599579528227060, 0.838626815896566070, +0.838654050168338050, 0.838681282343474940, 0.838708512421908580, 0.838735740403571460, 0.838762966288394530, 0.838790190076310060, 0.838817411767250220, 0.838844631361146840, +0.838871848857931870, 0.838899064257537350, 0.838926277559895020, 0.838953488764937580, 0.838980697872595990, 0.839007904882802520, 0.839035109795489340, 0.839062312610588390, +0.839089513328031720, 0.839116711947751170, 0.839143908469678900, 0.839171102893747410, 0.839198295219887540, 0.839225485448031990, 0.839252673578112730, 0.839279859610061800, +0.839307043543811250, 0.839334225379293030, 0.839361405116439750, 0.839388582755182470, 0.839415758295453670, 0.839442931737185650, 0.839470103080310110, 0.839497272324759460, +0.839524439470465510, 0.839551604517360550, 0.839578767465376960, 0.839605928314446140, 0.839633087064500350, 0.839660243715471880, 0.839687398267292770, 0.839714550719895200, +0.839741701073211330, 0.839768849327173550, 0.839795995481713240, 0.839823139536763020, 0.839850281492254820, 0.839877421348120930, 0.839904559104293510, 0.839931694760704730, +0.839958828317286740, 0.839985959773972060, 0.840013089130692060, 0.840040216387379360, 0.840067341543966120, 0.840094464600384390, 0.840121585556566690, 0.840148704412444940, +0.840175821167951420, 0.840202935823018750, 0.840230048377578420, 0.840257158831562820, 0.840284267184904450, 0.840311373437535370, 0.840338477589387840, 0.840365579640394160, +0.840392679590486910, 0.840419777439597620, 0.840446873187658760, 0.840473966834602740, 0.840501058380361820, 0.840528147824868290, 0.840555235168054420, 0.840582320409852370, +0.840609403550195090, 0.840636484589013740, 0.840663563526241160, 0.840690640361809740, 0.840717715095651740, 0.840744787727699450, 0.840771858257885140, 0.840798926686141650, +0.840825993012400460, 0.840853057236594200, 0.840880119358655250, 0.840907179378516110, 0.840934237296109060, 0.840961293111366250, 0.840988346824220300, 0.841015398434603930, +0.841042447942448650, 0.841069495347687270, 0.841096540650252080, 0.841123583850075570, 0.841150624947090030, 0.841177663941228060, 0.841204700832421830, 0.841231735620604380, +0.841258768305707120, 0.841285798887662860, 0.841312827366404110, 0.841339853741863370, 0.841366878013972920, 0.841393900182665360, 0.841420920247873520, 0.841447938209528790, +0.841474954067564340, 0.841501967821912440, 0.841528979472505600, 0.841555989019276420, 0.841582996462157170, 0.841610001801080480, 0.841637005035979160, 0.841664006166784940, +0.841691005193430760, 0.841718002115849020, 0.841744996933972200, 0.841771989647732920, 0.841798980257063680, 0.841825968761897080, 0.841852955162165960, 0.841879939457801930, +0.841906921648738150, 0.841933901734906900, 0.841960879716241010, 0.841987855592672970, 0.842014829364135190, 0.842041801030560920, 0.842068770591881570, 0.842095738048030400, +0.842122703398939800, 0.842149666644542490, 0.842176627784770980, 0.842203586819557870, 0.842230543748835880, 0.842257498572537950, 0.842284451290595810, 0.842311401902942510, +0.842338350409510770, 0.842365296810233090, 0.842392241105042180, 0.842419183293870670, 0.842446123376651700, 0.842473061353317010, 0.842499997223799530, 0.842526930988032220, +0.842553862645947450, 0.842580792197478060, 0.842607719642556650, 0.842634644981116070, 0.842661568213089240, 0.842688489338408010, 0.842715408357005540, 0.842742325268814650, +0.842769240073767860, 0.842796152771797980, 0.842823063362837850, 0.842849971846819870, 0.842876878223677520, 0.842903782493342520, 0.842930684655748050, 0.842957584710826820, +0.842984482658511780, 0.843011378498735310, 0.843038272231430570, 0.843065163856530630, 0.843092053373967200, 0.843118940783673660, 0.843145826085582750, 0.843172709279627400, +0.843199590365740100, 0.843226469343853920, 0.843253346213901580, 0.843280220975816340, 0.843307093629530050, 0.843333964174976080, 0.843360832612087160, 0.843387698940796130, +0.843414563161035910, 0.843441425272739240, 0.843468285275839060, 0.843495143170268520, 0.843521998955959810, 0.843548852632845960, 0.843575704200860030, 0.843602553659934860, +0.843629401010003390, 0.843656246250998330, 0.843683089382853080, 0.843709930405499690, 0.843736769318871430, 0.843763606122901360, 0.843790440817522190, 0.843817273402666880, +0.843844103878268470, 0.843870932244259690, 0.843897758500574140, 0.843924582647143760, 0.843951404683901840, 0.843978224610781420, 0.844005042427715460, 0.844031858134636880, +0.844058671731478750, 0.844085483218174340, 0.844112292594655700, 0.844139099860856330, 0.844165905016709290, 0.844192708062147410, 0.844219508997103850, 0.844246307821511440, +0.844273104535303350, 0.844299899138412860, 0.844326691630772230, 0.844353482012314860, 0.844380270282973690, 0.844407056442681990, 0.844433840491372490, 0.844460622428978570, +0.844487402255432950, 0.844514179970669350, 0.844540955574619830, 0.844567729067217890, 0.844594500448396680, 0.844621269718089260, 0.844648036876228580, 0.844674801922747800, +0.844701564857580520, 0.844728325680658920, 0.844755084391916380, 0.844781840991286170, 0.844808595478701460, 0.844835347854095090, 0.844862098117400540, 0.844888846268550650, +0.844915592307479040, 0.844942336234118070, 0.844969078048401270, 0.844995817750261780, 0.845022555339632660, 0.845049290816447200, 0.845076024180638540, 0.845102755432139750, +0.845129484570884660, 0.845156211596805320, 0.845182936509835450, 0.845209659309908210, 0.845236379996956890, 0.845263098570914530, 0.845289815031714520, 0.845316529379290360, +0.845343241613574440, 0.845369951734500470, 0.845396659742001510, 0.845423365636011060, 0.845450069416462060, 0.845476771083287890, 0.845503470636421840, 0.845530168075797620, +0.845556863401347500, 0.845583556613005110, 0.845610247710703920, 0.845636936694377120, 0.845663623563957970, 0.845690308319379750, 0.845716990960576180, 0.845743671487479750, +0.845770349900024090, 0.845797026198142570, 0.845823700381768460, 0.845850372450835160, 0.845877042405275840, 0.845903710245023980, 0.845930375970013300, 0.845957039580176210, +0.845983701075446510, 0.846010360455757620, 0.846037017721042780, 0.846063672871235410, 0.846090325906268870, 0.846116976826076450, 0.846143625630592090, 0.846170272319748170, +0.846196916893478650, 0.846223559351716780, 0.846250199694396080, 0.846276837921449810, 0.846303474032811480, 0.846330108028414910, 0.846356739908192600, 0.846383369672078390, +0.846409997320005880, 0.846436622851908240, 0.846463246267719180, 0.846489867567371880, 0.846516486750800050, 0.846543103817937400, 0.846569718768716450, 0.846596331603071350, +0.846622942320935270, 0.846649550922241920, 0.846676157406924700, 0.846702761774916990, 0.846729364026152510, 0.846755964160565090, 0.846782562178087120, 0.846809158078652870, +0.846835751862195730, 0.846862343528649200, 0.846888933077946770, 0.846915520510022060, 0.846942105824809000, 0.846968689022240210, 0.846995270102249730, 0.847021849064771070, +0.847048425909737720, 0.847075000637083410, 0.847101573246741510, 0.847128143738645640, 0.847154712112729970, 0.847181278368926980, 0.847207842507170850, 0.847234404527395180, +0.847260964429533360, 0.847287522213519220, 0.847314077879286250, 0.847340631426768520, 0.847367182855898740, 0.847393732166611070, 0.847420279358839010, 0.847446824432516290, +0.847473367387576500, 0.847499908223953270, 0.847526446941580300, 0.847552983540391660, 0.847579518020320170, 0.847606050381299770, 0.847632580623264300, 0.847659108746147360, +0.847685634749882680, 0.847712158634403860, 0.847738680399644730, 0.847765200045539240, 0.847791717572020430, 0.847818232979022260, 0.847844746266478430, 0.847871257434322790, +0.847897766482489050, 0.847924273410910920, 0.847950778219522470, 0.847977280908256640, 0.848003781477047690, 0.848030279925829240, 0.848056776254535020, 0.848083270463098950, +0.848109762551454650, 0.848136252519535950, 0.848162740367277120, 0.848189226094610890, 0.848215709701471750, 0.848242191187793200, 0.848268670553509190, 0.848295147798553530, +0.848321622922860060, 0.848348095926362960, 0.848374566808995030, 0.848401035570690800, 0.848427502211383970, 0.848453966731008480, 0.848480429129497950, 0.848506889406786310, +0.848533347562807520, 0.848559803597495830, 0.848586257510784200, 0.848612709302606900, 0.848639158972897770, 0.848665606521590730, 0.848692051948619740, 0.848718495253918630, +0.848744936437421330, 0.848771375499062010, 0.848797812438773950, 0.848824247256491190, 0.848850679952147910, 0.848877110525677940, 0.848903538977015090, 0.848929965306093550, +0.848956389512847460, 0.848982811597209900, 0.849009231559115450, 0.849035649398497850, 0.849062065115291030, 0.849088478709429160, 0.849114890180846070, 0.849141299529475700, +0.849167706755252660, 0.849194111858109780, 0.849220514837981670, 0.849246915694802260, 0.849273314428505620, 0.849299711039025680, 0.849326105526296390, 0.849352497890251910, +0.849378888130826630, 0.849405276247953590, 0.849431662241567410, 0.849458046111602140, 0.849484427857991610, 0.849510807480670200, 0.849537184979571650, 0.849563560354630540, +0.849589933605780170, 0.849616304732955020, 0.849642673736089040, 0.849669040615116280, 0.849695405369971010, 0.849721768000587300, 0.849748128506899070, 0.849774486888841050, +0.849800843146346300, 0.849827197279349410, 0.849853549287784560, 0.849879899171585910, 0.849906246930687390, 0.849932592565023400, 0.849958936074528220, 0.849985277459135320, +0.850011616718779230, 0.850037953853394090, 0.850064288862914070, 0.850090621747273350, 0.850116952506406070, 0.850143281140246400, 0.850169607648728950, 0.850195932031787120, +0.850222254289355380, 0.850248574421368030, 0.850274892427759220, 0.850301208308463230, 0.850327522063414110, 0.850353833692546250, 0.850380143195794360, 0.850406450573091500, +0.850432755824372610, 0.850459058949571860, 0.850485359948623400, 0.850511658821461510, 0.850537955568020480, 0.850564250188235120, 0.850590542682038600, 0.850616833049365750, +0.850643121290150740, 0.850669407404327950, 0.850695691391831770, 0.850721973252596240, 0.850748252986555760, 0.850774530593645160, 0.850800806073797820, 0.850827079426948350, +0.850853350653031250, 0.850879619751980790, 0.850905886723731240, 0.850932151568217000, 0.850958414285372440, 0.850984674875132190, 0.851010933337429830, 0.851037189672200210, +0.851063443879377490, 0.851089695958896280, 0.851115945910690730, 0.851142193734695460, 0.851168439430844970, 0.851194682999073080, 0.851220924439314410, 0.851247163751503440, +0.851273400935574580, 0.851299635991462190, 0.851325868919100780, 0.851352099718424630, 0.851378328389368670, 0.851404554931866510, 0.851430779345852870, 0.851457001631262370, +0.851483221788029270, 0.851509439816088180, 0.851535655715373490, 0.851561869485820130, 0.851588081127361620, 0.851614290639932880, 0.851640498023468420, 0.851666703277902730, +0.851692906403170300, 0.851719107399205640, 0.851745306265943140, 0.851771503003317830, 0.851797697611263340, 0.851823890089714600, 0.851850080438606220, 0.851876268657872470, +0.851902454747448190, 0.851928638707267650, 0.851954820537265680, 0.851981000237377000, 0.852007177807535320, 0.852033353247675820, 0.852059526557732870, 0.852085697737641090, +0.852111866787335080, 0.852138033706749340, 0.852164198495819040, 0.852190361154477770, 0.852216521682660710, 0.852242680080302240, 0.852268836347337080, 0.852294990483699830, +0.852321142489325110, 0.852347292364147520, 0.852373440108102120, 0.852399585721122730, 0.852425729203144300, 0.852451870554101650, 0.852478009773929290, 0.852504146862561930, +0.852530281819934180, 0.852556414645980640, 0.852582545340636600, 0.852608673903835770, 0.852634800335513200, 0.852660924635603610, 0.852687046804041730, 0.852713166840762260, +0.852739284745699930, 0.852765400518789800, 0.852791514159965680, 0.852817625669162750, 0.852843735046315830, 0.852869842291359540, 0.852895947404228580, 0.852922050384857800, +0.852948151233181910, 0.852974249949136070, 0.853000346532654220, 0.853026440983671420, 0.853052533302122610, 0.853078623487942390, 0.853104711541065600, 0.853130797461427060, +0.853156881248962050, 0.853182962903604290, 0.853209042425289170, 0.853235119813951390, 0.853261195069525910, 0.853287268191947330, 0.853313339181150710, 0.853339408037070650, +0.853365474759642530, 0.853391539348800300, 0.853417601804479120, 0.853443662126614040, 0.853469720315139790, 0.853495776369991190, 0.853521830291103180, 0.853547882078410700, +0.853573931731848810, 0.853599979251351780, 0.853626024636854660, 0.853652067888292510, 0.853678109005600260, 0.853704147988712750, 0.853730184837564800, 0.853756219552091800, +0.853782252132227910, 0.853808282577908310, 0.853834310889068140, 0.853860337065642020, 0.853886361107565110, 0.853912383014772350, 0.853938402787198570, 0.853964420424779270, +0.853990435927448500, 0.854016449295141530, 0.854042460527793530, 0.854068469625339330, 0.854094476587713980, 0.854120481414852530, 0.854146484106689810, 0.854172484663161310, +0.854198483084201100, 0.854224479369744770, 0.854250473519727160, 0.854276465534083430, 0.854302455412748520, 0.854328443155657480, 0.854354428762745700, 0.854380412233947560, +0.854406393569198230, 0.854432372768432980, 0.854458349831586860, 0.854484324758594820, 0.854510297549391900, 0.854536268203913370, 0.854562236722094530, 0.854588203103869630, +0.854614167349174280, 0.854640129457943430, 0.854666089430112350, 0.854692047265615980, 0.854718002964389600, 0.854743956526368590, 0.854769907951487220, 0.854795857239681100, +0.854821804390885290, 0.854847749405035050, 0.854873692282065440, 0.854899633021911520, 0.854925571624508550, 0.854951508089792140, 0.854977442417696460, 0.855003374608157230, +0.855029304661109490, 0.855055232576488520, 0.855081158354229490, 0.855107081994267550, 0.855133003496537870, 0.855158922860976280, 0.855184840087516720, 0.855210755176095240, +0.855236668126646780, 0.855262578939106620, 0.855288487613410030, 0.855314394149492290, 0.855340298547288990, 0.855366200806734530, 0.855392100927764520, 0.855417998910314230, +0.855443894754318920, 0.855469788459713890, 0.855495680026434500, 0.855521569454415820, 0.855547456743593670, 0.855573341893902440, 0.855599224905277840, 0.855625105777655160, +0.855650984510969770, 0.855676861105156950, 0.855702735560151860, 0.855728607875890450, 0.855754478052307090, 0.855780346089337510, 0.855806211986917090, 0.855832075744981100, +0.855857937363464940, 0.855883796842303870, 0.855909654181433390, 0.855935509380789220, 0.855961362440305850, 0.855987213359919010, 0.856013062139564180, 0.856038908779176650, +0.856064753278691910, 0.856090595638045240, 0.856116435857172120, 0.856142273936008390, 0.856168109874488440, 0.856193943672548310, 0.856219775330123170, 0.856245604847148730, +0.856271432223560170, 0.856297257459293190, 0.856323080554283410, 0.856348901508465430, 0.856374720321775310, 0.856400536994148310, 0.856426351525520050, 0.856452163915825790, +0.856477974165001150, 0.856503782272981630, 0.856529588239703150, 0.856555392065100120, 0.856581193749108680, 0.856606993291664230, 0.856632790692702370, 0.856658585952158490, +0.856684379069968080, 0.856710170046066870, 0.856735958880390560, 0.856761745572873990, 0.856787530123452990, 0.856813312532063160, 0.856839092798640010, 0.856864870923119250, +0.856890646905436260, 0.856916420745527100, 0.856942192443326370, 0.856967961998770230, 0.856993729411794190, 0.857019494682333850, 0.857045257810324700, 0.857071018795702470, +0.857096777638402640, 0.857122534338361390, 0.857148288895513310, 0.857174041309794470, 0.857199791581140570, 0.857225539709487230, 0.857251285694769940, 0.857277029536924530, +0.857302771235886940, 0.857328510791592000, 0.857354248203975770, 0.857379983472973950, 0.857405716598522160, 0.857431447580556010, 0.857457176419011310, 0.857482903113823690, +0.857508627664929190, 0.857534350072262750, 0.857560070335760430, 0.857585788455357820, 0.857611504430990880, 0.857637218262595090, 0.857662929950106290, 0.857688639493460190, +0.857714346892592850, 0.857740052147439310, 0.857765755257935520, 0.857791456224017420, 0.857817155045620730, 0.857842851722681040, 0.857868546255134310, 0.857894238642916580, +0.857919928885962910, 0.857945616984209350, 0.857971302937591720, 0.857996986746045850, 0.858022668409507580, 0.858048347927912620, 0.858074025301196700, 0.858099700529296290, +0.858125373612146140, 0.858151044549682500, 0.858176713341841310, 0.858202379988558310, 0.858228044489769300, 0.858253706845410250, 0.858279367055416960, 0.858305025119725620, +0.858330681038271370, 0.858356334810990380, 0.858381986437818490, 0.858407635918691740, 0.858433283253545730, 0.858458928442316640, 0.858484571484940730, 0.858510212381352830, +0.858535851131489450, 0.858561487735286510, 0.858587122192679740, 0.858612754503605190, 0.858638384667998800, 0.858664012685796400, 0.858689638556934360, 0.858715262281347870, +0.858740883858973290, 0.858766503289746350, 0.858792120573603210, 0.858817735710479810, 0.858843348700311980, 0.858868959543036330, 0.858894568238587790, 0.858920174786902860, +0.858945779187917480, 0.858971381441567590, 0.858996981547789250, 0.859022579506518500, 0.859048175317691290, 0.859073768981244100, 0.859099360497112110, 0.859124949865231580, +0.859150537085538790, 0.859176122157969570, 0.859201705082460080, 0.859227285858946370, 0.859252864487364380, 0.859278440967650710, 0.859304015299740540, 0.859329587483570250, +0.859355157519075990, 0.859380725406193920, 0.859406291144860000, 0.859431854735010270, 0.859457416176581450, 0.859482975469508580, 0.859508532613728280, 0.859534087609176710, +0.859559640455789920, 0.859585191153503960, 0.859610739702255100, 0.859636286101979290, 0.859661830352613340, 0.859687372454092210, 0.859712912406352730, 0.859738450209331040, +0.859763985862963100, 0.859789519367185280, 0.859815050721933650, 0.859840579927144360, 0.859866106982754120, 0.859891631888698100, 0.859917154644913030, 0.859942675251335160, +0.859968193707900450, 0.859993710014545390, 0.860019224171205910, 0.860044736177818960, 0.860070246034319700, 0.860095753740644730, 0.860121259296730440, 0.860146762702513000, +0.860172263957928670, 0.860197763062913620, 0.860223260017404230, 0.860248754821337110, 0.860274247474647650, 0.860299737977272550, 0.860325226329148210, 0.860350712530210670, +0.860376196580396440, 0.860401678479641660, 0.860427158227883180, 0.860452635825056380, 0.860478111271097970, 0.860503584565944220, 0.860529055709531530, 0.860554524701796280, +0.860579991542674620, 0.860605456232103050, 0.860630918770018180, 0.860656379156355620, 0.860681837391052200, 0.860707293474044180, 0.860732747405267840, 0.860758199184659680, +0.860783648812155970, 0.860809096287693200, 0.860834541611208090, 0.860859984782636150, 0.860885425801914290, 0.860910864668978930, 0.860936301383766310, 0.860961735946212950, +0.860987168356255330, 0.861012598613830170, 0.861038026718873080, 0.861063452671321010, 0.861088876471110210, 0.861114298118177190, 0.861139717612458440, 0.861165134953890470, +0.861190550142409640, 0.861215963177952790, 0.861241374060455640, 0.861266782789855130, 0.861292189366087650, 0.861317593789089560, 0.861342996058797610, 0.861368396175148150, +0.861393794138077710, 0.861419189947523200, 0.861444583603420240, 0.861469975105705890, 0.861495364454316630, 0.861520751649188840, 0.861546136690259260, 0.861571519577464360, +0.861596900310740990, 0.861622278890025070, 0.861647655315253340, 0.861673029586362490, 0.861698401703289150, 0.861723771665969700, 0.861749139474340840, 0.861774505128339200, +0.861799868627901700, 0.861825229972964070, 0.861850589163463350, 0.861875946199336160, 0.861901301080519210, 0.861926653806948880, 0.861952004378562010, 0.861977352795295530, +0.862002699057085150, 0.862028043163868160, 0.862053385115580940, 0.862078724912160310, 0.862104062553542880, 0.862129398039665260, 0.862154731370464280, 0.862180062545876760, +0.862205391565838640, 0.862230718430287090, 0.862256043139158820, 0.862281365692390330, 0.862306686089918450, 0.862332004331679890, 0.862357320417611260, 0.862382634347649830, +0.862407946121731330, 0.862433255739793010, 0.862458563201771610, 0.862483868507603610, 0.862509171657226070, 0.862534472650575590, 0.862559771487589440, 0.862585068168203350, +0.862610362692354580, 0.862635655059979860, 0.862660945271016110, 0.862686233325399840, 0.862711519223068100, 0.862736802963957610, 0.862762084548005400, 0.862787363975147660, +0.862812641245321530, 0.862837916358463740, 0.862863189314511110, 0.862888460113400590, 0.862913728755068890, 0.862938995239452830, 0.862964259566489810, 0.862989521736115650, +0.863014781748267730, 0.863040039602882780, 0.863065295299897840, 0.863090548839249520, 0.863115800220874860, 0.863141049444711260, 0.863166296510694540, 0.863191541418761980, +0.863216784168850610, 0.863242024760897400, 0.863267263194839040, 0.863292499470612480, 0.863317733588154780, 0.863342965547403090, 0.863368195348293570, 0.863393422990763600, +0.863418648474750030, 0.863443871800189780, 0.863469092967020010, 0.863494311975177340, 0.863519528824599480, 0.863544743515222260, 0.863569956046983280, 0.863595166419819260, +0.863620374633667480, 0.863645580688464640, 0.863670784584147920, 0.863695986320654250, 0.863721185897921020, 0.863746383315884380, 0.863771578574481720, 0.863796771673650210, +0.863821962613326780, 0.863847151393448360, 0.863872338013952130, 0.863897522474775030, 0.863922704775854530, 0.863947884917126930, 0.863973062898529600, 0.863998238719999480, +0.864023412381473950, 0.864048583882889740, 0.864073753224184120, 0.864098920405294570, 0.864124085426157260, 0.864149248286709800, 0.864174408986889130, 0.864199567526632520, +0.864224723905876900, 0.864249878124559560, 0.864275030182617420, 0.864300180079988320, 0.864325327816608200, 0.864350473392414780, 0.864375616807345090, 0.864400758061336540, +0.864425897154325940, 0.864451034086250680, 0.864476168857048250, 0.864501301466654940, 0.864526431915008440, 0.864551560202045820, 0.864576686327704240, 0.864601810291921070, +0.864626932094633260, 0.864652051735778190, 0.864677169215293470, 0.864702284533115260, 0.864727397689181390, 0.864752508683429120, 0.864777617515795400, 0.864802724186217840, +0.864827828694633370, 0.864852931040979270, 0.864878031225193360, 0.864903129247211910, 0.864928225106972650, 0.864953318804412840, 0.864978410339469650, 0.865003499712080570, +0.865028586922182650, 0.865053671969713720, 0.865078754854610170, 0.865103835576809700, 0.865128914136249700, 0.865153990532867350, 0.865179064766600110, 0.865204136837385170, +0.865229206745159910, 0.865254274489862030, 0.865279340071428040, 0.865304403489795650, 0.865329464744902350, 0.865354523836685320, 0.865379580765082030, 0.865404635530029780, +0.865429688131465810, 0.865454738569328200, 0.865479786843553310, 0.865504832954078870, 0.865529876900842490, 0.865554918683781200, 0.865579958302832850, 0.865604995757934480, +0.865630031049024030, 0.865655064176038100, 0.865680095138914530, 0.865705123937590690, 0.865730150572004090, 0.865755175042092100, 0.865780197347792100, 0.865805217489041710, +0.865830235465778640, 0.865855251277939610, 0.865880264925462440, 0.865905276408284520, 0.865930285726343450, 0.865955292879576730, 0.865980297867921740, 0.866005300691316430, +0.866030301349697500, 0.866055299843002780, 0.866080296171169770, 0.866105290334135970, 0.866130282331839090, 0.866155272164216390, 0.866180259831205610, 0.866205245332744460, +0.866230228668769860, 0.866255209839219660, 0.866280188844031570, 0.866305165683142860, 0.866330140356491250, 0.866355112864014340, 0.866380083205649630, 0.866405051381335170, +0.866430017391007560, 0.866454981234604960, 0.866479942912064980, 0.866504902423325010, 0.866529859768322860, 0.866554814946996040, 0.866579767959282710, 0.866604718805119360, +0.866629667484444370, 0.866654613997195120, 0.866679558343309340, 0.866704500522724740, 0.866729440535378810, 0.866754378381209280, 0.866779314060154290, 0.866804247572150470, +0.866829178917136180, 0.866854108095048810, 0.866879035105826310, 0.866903959949406170, 0.866928882625725980, 0.866953803134723810, 0.866978721476337480, 0.867003637650503810, +0.867028551657161200, 0.867053463496247120, 0.867078373167699420, 0.867103280671455810, 0.867128186007453890, 0.867153089175632050, 0.867177990175927000, 0.867202889008277020, +0.867227785672619820, 0.867252680168893120, 0.867277572497034740, 0.867302462656982410, 0.867327350648673940, 0.867352236472047510, 0.867377120127040050, 0.867402001613589820, +0.867426880931634560, 0.867451758081112080, 0.867476633061960210, 0.867501505874116790, 0.867526376517520070, 0.867551244992106900, 0.867576111297815640, 0.867600975434584140, +0.867625837402350220, 0.867650697201051700, 0.867675554830626310, 0.867700410291012190, 0.867725263582147410, 0.867750114703969010, 0.867774963656415380, 0.867799810439424340, +0.867824655052933710, 0.867849497496881450, 0.867874337771205480, 0.867899175875843750, 0.867924011810734420, 0.867948845575814640, 0.867973677171022700, 0.867998506596296630, +0.868023333851574260, 0.868048158936793660, 0.868072981851892520, 0.868097802596809460, 0.868122621171481420, 0.868147437575846780, 0.868172251809843590, 0.868197063873409780, +0.868221873766483300, 0.868246681489002080, 0.868271487040904290, 0.868296290422128080, 0.868321091632610840, 0.868345890672290730, 0.868370687541106020, 0.868395482238994540, +0.868420274765894340, 0.868445065121743460, 0.868469853306479970, 0.868494639320042230, 0.868519423162367410, 0.868544204833394120, 0.868568984333060290, 0.868593761661303980, +0.868618536818063340, 0.868643309803276200, 0.868668080616881390, 0.868692849258815850, 0.868717615729018180, 0.868742380027426540, 0.868767142153978880, 0.868791902108613460, +0.868816659891268220, 0.868841415501881320, 0.868866168940391370, 0.868890920206735530, 0.868915669300852290, 0.868940416222680030, 0.868965160972156700, 0.868989903549220340, +0.869014643953809340, 0.869039382185862190, 0.869064118245316040, 0.869088852132109730, 0.869113583846181200, 0.869138313387468720, 0.869163040755910440, 0.869187765951444650, +0.869212488974009380, 0.869237209823543360, 0.869261928499983850, 0.869286645003269460, 0.869311359333338470, 0.869336071490129150, 0.869360781473579650, 0.869385489283628130, +0.869410194920212990, 0.869434898383272700, 0.869459599672744780, 0.869484298788567920, 0.869508995730680190, 0.869533690499020070, 0.869558383093525620, 0.869583073514135330, +0.869607761760787690, 0.869632447833420310, 0.869657131731971680, 0.869681813456380290, 0.869706493006584420, 0.869731170382522230, 0.869755845584132210, 0.869780518611352530, +0.869805189464122000, 0.869829858142378010, 0.869854524646059390, 0.869879188975104520, 0.869903851129451570, 0.869928511109039130, 0.869953168913805360, 0.869977824543688550, +0.870002477998627730, 0.870027129278560300, 0.870051778383424960, 0.870076425313160210, 0.870101070067704430, 0.870125712646996010, 0.870150353050973210, 0.870174991279574980, +0.870199627332738920, 0.870224261210403750, 0.870248892912507950, 0.870273522438989810, 0.870298149789787920, 0.870322774964840780, 0.870347397964086560, 0.870372018787464290, +0.870396637434911580, 0.870421253906367260, 0.870445868201769830, 0.870470480321057670, 0.870495090264169380, 0.870519698031043340, 0.870544303621618500, 0.870568907035832450, +0.870593508273624140, 0.870618107334932060, 0.870642704219694700, 0.870667298927850550, 0.870691891459338230, 0.870716481814096110, 0.870741069992063240, 0.870765655993177230, +0.870790239817377130, 0.870814821464601430, 0.870839400934788730, 0.870863978227877420, 0.870888553343806220, 0.870913126282513610, 0.870937697043938640, 0.870962265628019040, +0.870986832034693740, 0.871011396263901340, 0.871035958315580450, 0.871060518189669670, 0.871085075886107620, 0.871109631404833220, 0.871134184745784410, 0.871158735908900140, +0.871183284894119000, 0.871207831701379610, 0.871232376330620670, 0.871256918781780800, 0.871281459054798700, 0.871305997149613320, 0.871330533066162480, 0.871355066804385350, +0.871379598364220520, 0.871404127745606720, 0.871428654948482650, 0.871453179972786820, 0.871477702818458600, 0.871502223485435600, 0.871526741973657090, 0.871551258283061680, +0.871575772413588190, 0.871600284365175230, 0.871624794137761620, 0.871649301731285960, 0.871673807145687430, 0.871698310380904060, 0.871722811436874910, 0.871747310313538690, +0.871771807010834120, 0.871796301528700130, 0.871820793867075340, 0.871845284025898670, 0.871869772005109070, 0.871894257804644690, 0.871918741424444700, 0.871943222864447810, +0.871967702124592850, 0.871992179204818640, 0.872016654105064020, 0.872041126825268130, 0.872065597365369040, 0.872090065725305900, 0.872114531905017750, 0.872138995904443100, +0.872163457723521000, 0.872187917362190370, 0.872212374820389820, 0.872236830098058860, 0.872261283195135300, 0.872285734111558520, 0.872310182847267470, 0.872334629402200970, +0.872359073776297840, 0.872383515969497150, 0.872407955981737480, 0.872432393812958450, 0.872456829463098100, 0.872481262932095600, 0.872505694219889880, 0.872530123326419990, +0.872554550251624760, 0.872578974995443120, 0.872603397557814580, 0.872627817938677050, 0.872652236137970050, 0.872676652155632390, 0.872701065991603020, 0.872725477645821090, +0.872749887118225430, 0.872774294408755090, 0.872798699517349450, 0.872823102443946560, 0.872847503188486030, 0.872871901750906680, 0.872896298131147550, 0.872920692329147710, +0.872945084344846080, 0.872969474178182270, 0.872993861829094220, 0.873018247297521640, 0.873042630583403370, 0.873067011686678550, 0.873091390607286130, 0.873115767345165380, +0.873140141900255130, 0.873164514272494970, 0.873188884461822970, 0.873213252468178940, 0.873237618291501700, 0.873261981931730440, 0.873286343388804180, 0.873310702662662090, +0.873335059753243210, 0.873359414660487170, 0.873383767384332210, 0.873408117924717730, 0.873432466281583000, 0.873456812454867060, 0.873481156444509080, 0.873505498250448320, +0.873529837872624170, 0.873554175310975010, 0.873578510565440340, 0.873602843635959530, 0.873627174522471520, 0.873651503224915580, 0.873675829743230880, 0.873700154077356570, +0.873724476227232370, 0.873748796192796550, 0.873773113973988710, 0.873797429570748130, 0.873821742983013960, 0.873846054210725360, 0.873870363253821720, 0.873894670112242200, +0.873918974785926280, 0.873943277274812690, 0.873967577578840800, 0.873991875697949890, 0.874016171632079450, 0.874040465381168420, 0.874064756945156400, 0.874089046323982770, +0.874113333517586130, 0.874137618525906210, 0.874161901348882160, 0.874186181986453480, 0.874210460438559210, 0.874234736705138850, 0.874259010786131660, 0.874283282681477370, +0.874307552391114460, 0.874331819914982660, 0.874356085253021330, 0.874380348405169760, 0.874404609371367330, 0.874428868151553300, 0.874453124745667610, 0.874477379153648650, +0.874501631375436350, 0.874525881410969870, 0.874550129260188710, 0.874574374923032140, 0.874598618399439750, 0.874622859689350720, 0.874647098792705080, 0.874671335709441220, +0.874695570439498970, 0.874719802982817820, 0.874744033339337150, 0.874768261508996450, 0.874792487491735100, 0.874816711287492500, 0.874840932896208460, 0.874865152317821800, +0.874889369552272260, 0.874913584599499190, 0.874937797459442220, 0.874962008132040720, 0.874986216617234300, 0.875010422914962670, 0.875034627025164550, 0.875058828947779980, +0.875083028682748230, 0.875107226230008920, 0.875131421589501520, 0.875155614761165660, 0.875179805744940700, 0.875203994540766690, 0.875228181148582140, 0.875252365568327310, +0.875276547799941460, 0.875300727843364320, 0.875324905698535270, 0.875349081365394020, 0.875373254843880070, 0.875397426133933340, 0.875421595235492680, 0.875445762148498010, +0.875469926872888940, 0.875494089408605070, 0.875518249755586010, 0.875542407913771250, 0.875566563883100950, 0.875590717663513820, 0.875614869254949800, 0.875639018657348720, +0.875663165870650070, 0.875687310894793460, 0.875711453729718590, 0.875735594375365080, 0.875759732831673080, 0.875783869098581190, 0.875808003176029690, 0.875832135063958180, +0.875856264762306380, 0.875880392271013890, 0.875904517590020410, 0.875928640719266130, 0.875952761658689740, 0.875976880408231520, 0.876000996967830960, 0.876025111337428000, +0.876049223516962350, 0.876073333506373510, 0.876097441305601410, 0.876121546914586100, 0.876145650333266410, 0.876169751561582720, 0.876193850599474630, 0.876217947446881860, +0.876242042103744350, 0.876266134570001580, 0.876290224845593600, 0.876314312930460360, 0.876338398824541010, 0.876362482527775600, 0.876386564040104070, 0.876410643361466010, +0.876434720491801490, 0.876458795431049990, 0.876482868179152110, 0.876506938736046460, 0.876531007101673640, 0.876555073275973150, 0.876579137258885030, 0.876603199050349110, +0.876627258650305220, 0.876651316058693060, 0.876675371275453140, 0.876699424300524280, 0.876723475133846960, 0.876747523775360800, 0.876771570225005960, 0.876795614482722140, +0.876819656548449400, 0.876843696422127450, 0.876867734103696670, 0.876891769593096120, 0.876915802890266050, 0.876939833995146630, 0.876963862907677580, 0.876987889627798830, +0.877011914155450430, 0.877035936490572650, 0.877059956633104540, 0.877083974582986590, 0.877107990340158740, 0.877132003904560810, 0.877156015276132960, 0.877180024454815020, +0.877204031440547040, 0.877228036233269390, 0.877252038832921240, 0.877276039239443080, 0.877300037452774740, 0.877324033472856260, 0.877348027299627690, 0.877372018933029190, +0.877396008373000910, 0.877419995619482250, 0.877443980672413690, 0.877467963531735060, 0.877491944197386520, 0.877515922669308220, 0.877539898947440000, 0.877563873031722120, +0.877587844922094960, 0.877611814618497800, 0.877635782120871010, 0.877659747429154760, 0.877683710543289200, 0.877707671463214380, 0.877731630188870350, 0.877755586720197270, +0.877779541057135630, 0.877803493199624700, 0.877827443147605080, 0.877851390901016830, 0.877875336459800090, 0.877899279823895040, 0.877923220993241720, 0.877947159967780830, +0.877971096747451660, 0.877995031332194700, 0.878018963721950210, 0.878042893916658240, 0.878066821916258950, 0.878090747720692730, 0.878114671329899620, 0.878138592743820330, +0.878162511962394030, 0.878186428985561540, 0.878210343813262910, 0.878234256445438400, 0.878258166882028290, 0.878282075122972740, 0.878305981168212460, 0.878329885017686830, +0.878353786671336350, 0.878377686129101500, 0.878401583390922450, 0.878425478456739460, 0.878449371326492700, 0.878473262000122550, 0.878497150477569710, 0.878521036758773580, +0.878544920843674750, 0.878568802732213720, 0.878592682424330640, 0.878616559919965790, 0.878640435219059660, 0.878664308321552400, 0.878688179227384740, 0.878712047936496270, +0.878735914448827700, 0.878759778764319210, 0.878783640882911390, 0.878807500804544510, 0.878831358529158830, 0.878855214056695090, 0.878879067387092980, 0.878902918520293230, +0.878926767456236100, 0.878950614194862090, 0.878974458736111570, 0.878998301079924830, 0.879022141226242450, 0.879045979175005040, 0.879069814926152330, 0.879093648479625010, +0.879117479835363700, 0.879141308993308560, 0.879165135953400180, 0.879188960715578950, 0.879212783279785360, 0.879236603645960240, 0.879260421814043180, 0.879284237783975020, +0.879308051555696360, 0.879331863129147460, 0.879355672504268940, 0.879379479681001270, 0.879403284659285300, 0.879427087439060730, 0.879450888020268380, 0.879474686402848870, +0.879498482586742570, 0.879522276571890080, 0.879546068358232010, 0.879569857945708630, 0.879593645334261100, 0.879617430523829010, 0.879641213514353320, 0.879664994305774720, +0.879688772898033490, 0.879712549291070340, 0.879736323484825890, 0.879760095479241060, 0.879783865274255560, 0.879807632869810340, 0.879831398265846110, 0.879855161462303360, +0.879878922459122690, 0.879902681256244710, 0.879926437853610020, 0.879950192251159670, 0.879973944448833370, 0.879997694446572280, 0.880021442244317000, 0.880045187842008030, +0.880068931239586070, 0.880092672436991850, 0.880116411434165860, 0.880140148231049360, 0.880163882827582070, 0.880187615223705030, 0.880211345419358970, 0.880235073414484480, +0.880258799209022390, 0.880282522802913300, 0.880306244196098260, 0.880329963388517210, 0.880353680380111300, 0.880377395170821140, 0.880401107760587550, 0.880424818149351140, +0.880448526337052730, 0.880472232323632920, 0.880495936109033090, 0.880519637693192860, 0.880543337076053590, 0.880567034257556000, 0.880590729237640810, 0.880614422016248730, +0.880638112593320700, 0.880661800968797310, 0.880685487142619850, 0.880709171114728350, 0.880732852885063870, 0.880756532453567220, 0.880780209820179240, 0.880803884984840750, +0.880827557947492570, 0.880851228708075860, 0.880874897266530680, 0.880898563622798280, 0.880922227776819500, 0.880945889728535050, 0.880969549477885970, 0.880993207024812990, +0.881016862369257030, 0.881040515511159250, 0.881064166450459820, 0.881087815187099890, 0.881111461721020510, 0.881135106052162500, 0.881158748180466690, 0.881182388105874010, +0.881206025828325750, 0.881229661347762040, 0.881253294664124160, 0.881276925777353060, 0.881300554687389660, 0.881324181394174790, 0.881347805897649490, 0.881371428197754710, +0.881395048294431830, 0.881418666187620880, 0.881442281877263260, 0.881465895363299890, 0.881489506645671830, 0.881513115724320010, 0.881536722599185360, 0.881560327270208940, +0.881583929737332130, 0.881607530000494970, 0.881631128059639170, 0.881654723914705450, 0.881678317565634860, 0.881701909012368560, 0.881725498254847470, 0.881749085293012990, +0.881772670126805490, 0.881796252756166240, 0.881819833181036410, 0.881843411401356910, 0.881866987417068930, 0.881890561228113490, 0.881914132834431650, 0.881937702235964900, +0.881961269432653520, 0.881984834424438870, 0.882008397211262230, 0.882031957793064540, 0.882055516169786950, 0.882079072341370620, 0.882102626307756600, 0.882126178068886380, +0.882149727624700340, 0.882173274975139980, 0.882196820120146330, 0.882220363059660780, 0.882243903793624270, 0.882267442321977960, 0.882290978644663550, 0.882314512761621210, +0.882338044672792530, 0.882361574378118910, 0.882385101877541160, 0.882408627171000770, 0.882432150258438800, 0.882455671139796500, 0.882479189815015390, 0.882502706284035820, +0.882526220546799630, 0.882549732603247760, 0.882573242453321580, 0.882596750096962370, 0.882620255534111280, 0.882643758764709910, 0.882667259788698750, 0.882690758606019420, +0.882714255216613180, 0.882737749620421290, 0.882761241817385130, 0.882784731807445770, 0.882808219590544670, 0.882831705166623350, 0.882855188535622390, 0.882878669697483410, +0.882902148652147780, 0.882925625399556880, 0.882949099939651760, 0.882972572272374020, 0.882996042397664830, 0.883019510315465880, 0.883042976025717800, 0.883066439528362170, +0.883089900823340600, 0.883113359910594140, 0.883136816790064390, 0.883160271461692510, 0.883183723925420440, 0.883207174181188660, 0.883230622228938890, 0.883254068068612510, +0.883277511700151120, 0.883300953123495770, 0.883324392338588170, 0.883347829345369480, 0.883371264143781750, 0.883394696733765360, 0.883418127115262350, 0.883441555288213890, +0.883464981252561570, 0.883488405008246770, 0.883511826555211100, 0.883535245893395720, 0.883558663022742660, 0.883582077943192550, 0.883605490654687300, 0.883628901157168300, +0.883652309450576930, 0.883675715534854910, 0.883699119409943610, 0.883722521075784860, 0.883745920532319370, 0.883769317779489190, 0.883792712817235590, 0.883816105645500280, +0.883839496264224760, 0.883862884673350390, 0.883886270872818900, 0.883909654862572110, 0.883933036642550740, 0.883956416212696830, 0.883979793572951870, 0.884003168723257350, +0.884026541663554990, 0.884049912393786270, 0.884073280913893140, 0.884096647223816420, 0.884120011323498160, 0.884143373212879720, 0.884166732891902950, 0.884190090360509330, +0.884213445618640460, 0.884236798666238060, 0.884260149503243940, 0.884283498129599170, 0.884306844545245550, 0.884330188750124810, 0.884353530744178660, 0.884376870527348700, +0.884400208099576530, 0.884423543460803870, 0.884446876610972770, 0.884470207550023920, 0.884493536277899730, 0.884516862794541670, 0.884540187099891350, 0.884563509193890710, +0.884586829076481120, 0.884610146747605080, 0.884633462207203070, 0.884656775455217480, 0.884680086491590020, 0.884703395316262300, 0.884726701929176020, 0.884750006330273010, +0.884773308519495090, 0.884796608496784210, 0.884819906262081400, 0.884843201815328830, 0.884866495156468310, 0.884889786285441570, 0.884913075202190310, 0.884936361906656370, +0.884959646398781890, 0.884982928678507920, 0.885006208745776620, 0.885029486600529820, 0.885052762242709350, 0.885076035672256900, 0.885099306889114310, 0.885122575893223520, +0.885145842684526780, 0.885169107262964940, 0.885192369628480360, 0.885215629781014760, 0.885238887720510180, 0.885262143446908350, 0.885285396960151180, 0.885308648260180520, +0.885331897346938730, 0.885355144220366650, 0.885378388880406760, 0.885401631327000890, 0.885424871560090980, 0.885448109579618840, 0.885471345385526520, 0.885494578977756190, +0.885517810356248880, 0.885541039520947200, 0.885564266471792870, 0.885587491208727930, 0.885610713731694200, 0.885633934040633730, 0.885657152135488350, 0.885680368016200540, +0.885703581682711460, 0.885726793134963280, 0.885750002372898250, 0.885773209396458210, 0.885796414205585080, 0.885819616800220920, 0.885842817180307770, 0.885866015345788020, +0.885889211296602700, 0.885912405032694420, 0.885935596554005110, 0.885958785860476830, 0.885981972952051610, 0.886005157828671400, 0.886028340490278790, 0.886051520936814830, +0.886074699168222120, 0.886097875184442610, 0.886121048985418440, 0.886144220571091660, 0.886167389941404320, 0.886190557096298460, 0.886213722035716690, 0.886236884759600160, +0.886260045267891480, 0.886283203560532700, 0.886306359637465850, 0.886329513498633090, 0.886352665143976590, 0.886375814573438840, 0.886398961786961090, 0.886422106784485960, +0.886445249565955500, 0.886468390131312070, 0.886491528480497500, 0.886514664613454180, 0.886537798530124270, 0.886560930230450240, 0.886584059714373370, 0.886607186981836490, +0.886630312032781530, 0.886653434867150870, 0.886676555484886550, 0.886699673885930960, 0.886722790070226030, 0.886745904037714690, 0.886769015788338110, 0.886792125322038990, +0.886815232638759500, 0.886838337738442010, 0.886861440621028670, 0.886884541286461660, 0.886907639734683780, 0.886930735965636430, 0.886953829979262090, 0.886976921775503360, +0.887000011354302180, 0.887023098715601030, 0.887046183859342090, 0.887069266785467710, 0.887092347493920630, 0.887115425984642210, 0.887138502257575290, 0.887161576312662010, +0.887184648149844880, 0.887207717769066150, 0.887230785170268100, 0.887253850353392990, 0.887276913318383760, 0.887299974065181800, 0.887323032593729910, 0.887346088903970490, +0.887369142995845790, 0.887392194869298320, 0.887415244524270230, 0.887438291960704560, 0.887461337178542700, 0.887484380177727460, 0.887507420958201340, 0.887530459519906610, +0.887553495862785760, 0.887576529986781160, 0.887599561891835200, 0.887622591577890810, 0.887645619044889480, 0.887668644292774140, 0.887691667321487190, 0.887714688130971100, +0.887737706721168250, 0.887760723092021140, 0.887783737243472590, 0.887806749175464320, 0.887829758887939250, 0.887852766380839650, 0.887875771654108250, 0.887898774707687300, +0.887921775541519520, 0.887944774155547290, 0.887967770549713540, 0.887990764723959880, 0.888013756678229350, 0.888036746412464440, 0.888059733926607640, 0.888082719220601560, +0.888105702294388680, 0.888128683147911490, 0.888151661781113040, 0.888174638193934940, 0.888197612386320330, 0.888220584358211720, 0.888243554109551580, 0.888266521640282520, +0.888289486950347260, 0.888312450039688620, 0.888335410908248520, 0.888358369555969810, 0.888381325982795180, 0.888404280188667350, 0.888427232173528700, 0.888450181937322060, +0.888473129479989910, 0.888496074801475300, 0.888519017901720170, 0.888541958780667440, 0.888564897438259840, 0.888587833874440070, 0.888610768089150630, 0.888633700082334220, +0.888656629853933680, 0.888679557403891930, 0.888702482732150910, 0.888725405838653560, 0.888748326723342810, 0.888771245386161260, 0.888794161827051510, 0.888817076045956390, +0.888839988042818940, 0.888862897817581210, 0.888885805370186240, 0.888908710700576640, 0.888931613808695340, 0.888954514694485050, 0.888977413357888380, 0.889000309798848250, +0.889023204017307720, 0.889046096013208720, 0.889068985786494630, 0.889091873337107930, 0.889114758664991570, 0.889137641770088360, 0.889160522652341020, 0.889183401311692820, +0.889206277748085690, 0.889229151961462900, 0.889252023951767170, 0.889274893718941420, 0.889297761262928370, 0.889320626583670950, 0.889343489681111990, 0.889366350555194750, +0.889389209205861180, 0.889412065633054530, 0.889434919836717740, 0.889457771816793750, 0.889480621573225270, 0.889503469105955240, 0.889526314414926470, 0.889549157500082340, +0.889571998361365020, 0.889594836998717660, 0.889617673412083090, 0.889640507601404450, 0.889663339566624580, 0.889686169307686290, 0.889708996824532970, 0.889731822117106770, +0.889754645185350970, 0.889777466029208600, 0.889800284648622600, 0.889823101043535900, 0.889845915213891450, 0.889868727159632170, 0.889891536880701440, 0.889914344377041530, +0.889937149648595720, 0.889959952695307030, 0.889982753517118530, 0.890005552113973030, 0.890028348485813690, 0.890051142632583560, 0.890073934554225900, 0.890096724250682980, +0.890119511721898290, 0.890142296967814880, 0.890165079988375680, 0.890187860783523740, 0.890210639353202220, 0.890233415697354480, 0.890256189815922800, 0.890278961708850570, +0.890301731376081040, 0.890324498817557150, 0.890347264033221950, 0.890370027023018710, 0.890392787786890240, 0.890415546324780370, 0.890438302636631150, 0.890461056722386180, +0.890483808581988610, 0.890506558215381380, 0.890529305622507870, 0.890552050803311120, 0.890574793757734630, 0.890597534485720770, 0.890620272987213020, 0.890643009262154560, +0.890665743310488640, 0.890688475132158320, 0.890711204727106850, 0.890733932095277400, 0.890756657236613460, 0.890779380151057510, 0.890802100838553050, 0.890824819299043340, +0.890847535532471650, 0.890870249538781130, 0.890892961317914960, 0.890915670869816380, 0.890938378194429000, 0.890961083291695320, 0.890983786161558930, 0.891006486803962990, +0.891029185218850880, 0.891051881406165870, 0.891074575365851110, 0.891097267097850310, 0.891119956602105970, 0.891142643878561680, 0.891165328927160830, 0.891188011747846680, +0.891210692340562490, 0.891233370705251550, 0.891256046841857110, 0.891278720750323110, 0.891301392430591810, 0.891324061882607040, 0.891346729106312070, 0.891369394101650280, +0.891392056868565150, 0.891414717406999730, 0.891437375716897520, 0.891460031798202320, 0.891482685650856640, 0.891505337274804300, 0.891527986669988560, 0.891550633836352800, +0.891573278773840520, 0.891595921482395080, 0.891618561961960210, 0.891641200212478500, 0.891663836233893780, 0.891686470026149540, 0.891709101589189030, 0.891731730922955880, +0.891754358027393330, 0.891776982902444890, 0.891799605548054370, 0.891822225964164490, 0.891844844150719070, 0.891867460107661490, 0.891890073834935240, 0.891912685332483800, +0.891935294600250670, 0.891957901638179670, 0.891980506446213630, 0.892003109024296250, 0.892025709372371130, 0.892048307490381660, 0.892070903378271440, 0.892093497035984060, +0.892116088463462800, 0.892138677660651800, 0.892161264627493680, 0.892183849363932470, 0.892206431869911550, 0.892229012145374530, 0.892251590190265120, 0.892274166004526580, +0.892296739588102740, 0.892319310940937300, 0.892341880062973320, 0.892364446954154620, 0.892387011614424800, 0.892409574043727450, 0.892432134242006180, 0.892454692209204480, +0.892477247945266510, 0.892499801450135080, 0.892522352723754130, 0.892544901766067270, 0.892567448577018090, 0.892589993156550410, 0.892612535504607620, 0.892635075621133640, +0.892657613506072200, 0.892680149159366440, 0.892702682580960310, 0.892725213770797500, 0.892747742728821510, 0.892770269454976280, 0.892792793949205410, 0.892815316211452940, +0.892837836241661690, 0.892860354039775930, 0.892882869605739260, 0.892905382939495400, 0.892927894040988050, 0.892950402910161030, 0.892972909546957960, 0.892995413951323090, +0.893017916123199250, 0.893040416062530600, 0.893062913769260950, 0.893085409243333910, 0.893107902484693410, 0.893130393493283160, 0.893152882269046990, 0.893175368811928940, +0.893197853121872050, 0.893220335198820600, 0.893242815042718300, 0.893265292653508960, 0.893287768031136300, 0.893310241175544250, 0.893332712086677080, 0.893355180764477730, +0.893377647208890350, 0.893400111419858870, 0.893422573397327110, 0.893445033141239020, 0.893467490651538190, 0.893489945928168770, 0.893512398971074820, 0.893534849780199480, +0.893557298355486920, 0.893579744696881280, 0.893602188804326180, 0.893624630677765650, 0.893647070317143520, 0.893669507722403720, 0.893691942893490520, 0.893714375830347070, +0.893736806532917760, 0.893759235001146400, 0.893781661234976930, 0.893804085234353280, 0.893826506999219510, 0.893848926529519750, 0.893871343825197400, 0.893893758886196600, +0.893916171712461400, 0.893938582303935860, 0.893960990660563780, 0.893983396782289220, 0.894005800669056220, 0.894028202320809040, 0.894050601737491070, 0.894072998919046570, +0.894095393865419470, 0.894117786576553940, 0.894140177052394010, 0.894162565292883630, 0.894184951297967160, 0.894207335067587980, 0.894229716601690370, 0.894252095900218590, +0.894274472963116460, 0.894296847790328250, 0.894319220381797790, 0.894341590737469440, 0.894363958857287370, 0.894386324741195060, 0.894408688389137010, 0.894431049801057140, +0.894453408976899620, 0.894475765916608710, 0.894498120620128350, 0.894520473087402570, 0.894542823318376090, 0.894565171312992180, 0.894587517071195330, 0.894609860592929680, +0.894632201878139300, 0.894654540926768550, 0.894676877738761370, 0.894699212314062460, 0.894721544652615000, 0.894743874754363790, 0.894766202619252880, 0.894788528247226430, +0.894810851638228600, 0.894833172792203760, 0.894855491709095950, 0.894877808388849780, 0.894900122831408740, 0.894922435036717310, 0.894944745004719880, 0.894967052735360590, +0.894989358228583610, 0.895011661484333200, 0.895033962502553740, 0.895056261283189710, 0.895078557826184620, 0.895100852131483160, 0.895123144199029610, 0.895145434028768120, +0.895167721620643060, 0.895190006974598720, 0.895212290090579790, 0.895234570968529760, 0.895256849608393250, 0.895279126010114610, 0.895301400173638130, 0.895323672098908170, +0.895345941785869130, 0.895368209234465140, 0.895390474444641040, 0.895412737416340310, 0.895434998149507780, 0.895457256644087820, 0.895479512900024590, 0.895501766917262690, +0.895524018695746270, 0.895546268235420270, 0.895568515536228180, 0.895590760598114820, 0.895613003421024570, 0.895635244004901800, 0.895657482349690890, 0.895679718455336340, +0.895701952321782400, 0.895724183948974020, 0.895746413336854790, 0.895768640485369530, 0.895790865394462730, 0.895813088064078670, 0.895835308494161930, 0.895857526684656900, +0.895879742635508070, 0.895901956346660260, 0.895924167818057170, 0.895946377049643750, 0.895968584041364260, 0.895990788793163410, 0.896012991304985460, 0.896035191576775140, +0.896057389608477250, 0.896079585400035410, 0.896101778951394650, 0.896123970262499460, 0.896146159333294330, 0.896168346163723760, 0.896190530753732340, 0.896212713103264670, +0.896234893212265570, 0.896257071080678760, 0.896279246708449380, 0.896301420095521830, 0.896323591241840800, 0.896345760147350680, 0.896367926811996290, 0.896390091235722000, +0.896412253418472860, 0.896434413360192690, 0.896456571060826550, 0.896478726520318900, 0.896500879738614590, 0.896523030715657980, 0.896545179451393780, 0.896567325945767050, +0.896589470198721590, 0.896611612210202470, 0.896633751980154270, 0.896655889508521710, 0.896678024795249500, 0.896700157840282120, 0.896722288643564400, 0.896744417205041390, +0.896766543524656900, 0.896788667602356090, 0.896810789438083570, 0.896832909031784140, 0.896855026383402310, 0.896877141492883000, 0.896899254360171260, 0.896921364985210910, +0.896943473367947220, 0.896965579508324780, 0.896987683406288540, 0.897009785061782970, 0.897031884474752910, 0.897053981645143160, 0.897076076572898900, 0.897098169257964040, +0.897120259700283750, 0.897142347899802740, 0.897164433856465940, 0.897186517570218060, 0.897208599041003920, 0.897230678268768230, 0.897252755253456160, 0.897274829995011960, +0.897296902493380570, 0.897318972748507030, 0.897341040760335940, 0.897363106528812350, 0.897385170053880850, 0.897407231335486940, 0.897429290373574550, 0.897451347168088940, +0.897473401718974940, 0.897495454026177470, 0.897517504089641370, 0.897539551909311450, 0.897561597485132650, 0.897583640817050220, 0.897605681905008450, 0.897627720748952360, +0.897649757348826900, 0.897671791704577230, 0.897693823816147930, 0.897715853683484170, 0.897737881306530760, 0.897759906685232980, 0.897781929819535090, 0.897803950709382350, +0.897825969354719700, 0.897847985755492180, 0.897869999911644730, 0.897892011823122170, 0.897914021489870100, 0.897936028911832440, 0.897958034088954800, 0.897980037021182120, +0.898002037708459320, 0.898024036150731340, 0.898046032347943330, 0.898068026300040230, 0.898090018006967530, 0.898112007468669260, 0.898133994685091030, 0.898155979656177880, +0.898177962381874750, 0.898199942862126680, 0.898221921096878710, 0.898243897086076440, 0.898265870829664030, 0.898287842327586850, 0.898309811579790060, 0.898331778586218820, +0.898353743346818060, 0.898375705861533040, 0.898397666130308690, 0.898419624153090620, 0.898441579929822990, 0.898463533460451490, 0.898485484744921180, 0.898507433783177100, +0.898529380575164520, 0.898551325120828360, 0.898573267420114010, 0.898595207472966840, 0.898617145279331230, 0.898639080839152780, 0.898661014152376650, 0.898682945218947870, +0.898704874038811830, 0.898726800611913570, 0.898748724938198800, 0.898770647017611780, 0.898792566850098120, 0.898814484435602970, 0.898836399774071700, 0.898858312865449370, +0.898880223709681350, 0.898902132306712680, 0.898924038656489180, 0.898945942758955010, 0.898967844614056100, 0.898989744221737610, 0.899011641581944690, 0.899033536694622710, +0.899055429559716960, 0.899077320177172900, 0.899099208546935150, 0.899121094668949410, 0.899142978543161050, 0.899164860169515130, 0.899186739547957030, 0.899208616678432100, +0.899230491560885640, 0.899252364195263440, 0.899274234581509790, 0.899296102719570610, 0.899317968609391170, 0.899339832250916850, 0.899361693644092910, 0.899383552788864730, +0.899405409685177680, 0.899427264332977590, 0.899449116732208840, 0.899470966882817250, 0.899492814784748410, 0.899514660437947370, 0.899536503842359720, 0.899558344997930860, +0.899580183904606480, 0.899602020562331290, 0.899623854971051130, 0.899645687130711140, 0.899667517041257030, 0.899689344702634180, 0.899711170114787850, 0.899732993277663760, +0.899754814191207400, 0.899776632855363690, 0.899798449270078460, 0.899820263435297090, 0.899842075350964940, 0.899863885017027740, 0.899885692433430750, 0.899907497600119570, +0.899929300517040010, 0.899951101184136790, 0.899972899601355850, 0.899994695768642660, 0.900016489685942720, 0.900038281353201520, 0.900060070770364760, 0.900081857937378050, +0.900103642854186430, 0.900125425520735600, 0.900147205936971280, 0.900168984102838850, 0.900190760018284020, 0.900212533683252380, 0.900234305097689310, 0.900256074261540860, +0.900277841174751850, 0.900299605837268200, 0.900321368249035640, 0.900343128409999530, 0.900364886320105700, 0.900386641979299630, 0.900408395387527370, 0.900430146544733630, +0.900451895450864570, 0.900473642105865890, 0.900495386509682970, 0.900517128662261630, 0.900538868563547480, 0.900560606213486100, 0.900582341612023660, 0.900604074759104980, +0.900625805654676090, 0.900647534298682610, 0.900669260691070450, 0.900690984831785000, 0.900712706720772190, 0.900734426357977510, 0.900756143743347230, 0.900777858876826150, +0.900799571758360560, 0.900821282387895940, 0.900842990765378100, 0.900864696890752770, 0.900886400763965760, 0.900908102384963110, 0.900929801753689750, 0.900951498870091960, +0.900973193734115440, 0.900994886345705900, 0.901016576704809170, 0.901038264811370950, 0.901059950665337060, 0.901081634266653770, 0.901103315615265910, 0.901124994711119840, +0.901146671554161170, 0.901168346144335940, 0.901190018481589860, 0.901211688565868640, 0.901233356397118210, 0.901255021975284840, 0.901276685300313460, 0.901298346372150450, +0.901320005190741510, 0.901341661756032590, 0.901363316067969490, 0.901384968126498150, 0.901406617931564740, 0.901428265483114390, 0.901449910781093380, 0.901471553825447520, +0.901493194616122870, 0.901514833153065240, 0.901536469436220570, 0.901558103465534670, 0.901579735240953810, 0.901601364762423360, 0.901622992029889380, 0.901644617043298010, +0.901666239802595080, 0.901687860307726520, 0.901709478558638370, 0.901731094555276890, 0.901752708297587250, 0.901774319785515810, 0.901795929019008620, 0.901817535998011620, +0.901839140722470840, 0.901860743192332110, 0.901882343407541590, 0.901903941368045530, 0.901925537073789200, 0.901947130524719090, 0.901968721720781240, 0.901990310661921480, +0.902011897348085960, 0.902033481779220710, 0.902055063955271690, 0.902076643876185470, 0.902098221541907220, 0.902119796952383420, 0.902141370107560130, 0.902162941007383480, +0.902184509651799420, 0.902206076040754090, 0.902227640174193990, 0.902249202052064380, 0.902270761674311750, 0.902292319040882140, 0.902313874151721820, 0.902335427006776820, +0.902356977605993320, 0.902378525949317220, 0.902400072036695260, 0.902421615868072790, 0.902443157443396200, 0.902464696762611760, 0.902486233825665620, 0.902507768632503820, +0.902529301183072620, 0.902550831477318180, 0.902572359515187110, 0.902593885296624650, 0.902615408821577540, 0.902636930089991910, 0.902658449101813920, 0.902679965856989730, +0.902701480355465710, 0.902722992597188470, 0.902744502582103260, 0.902766010310156800, 0.902787515781295240, 0.902809018995465060, 0.902830519952612210, 0.902852018652683050, +0.902873515095623970, 0.902895009281381330, 0.902916501209900860, 0.902937990881129140, 0.902959478295012440, 0.902980963451497030, 0.903002446350529290, 0.903023926992055360, +0.903045405376021960, 0.903066881502374800, 0.903088355371060250, 0.903109826982024910, 0.903131296335215050, 0.903152763430576930, 0.903174228268056820, 0.903195690847601210, +0.903217151169156680, 0.903238609232668970, 0.903260065038084760, 0.903281518585350330, 0.903302969874412160, 0.903324418905216530, 0.903345865677709800, 0.903367310191838470, +0.903388752447549240, 0.903410192444787710, 0.903431630183500810, 0.903453065663634700, 0.903474498885135980, 0.903495929847951020, 0.903517358552026200, 0.903538784997308440, +0.903560209183743250, 0.903581631111277540, 0.903603050779857810, 0.903624468189430430, 0.903645883339941890, 0.903667296231338680, 0.903688706863567170, 0.903710115236574300, +0.903731521350305770, 0.903752925204708400, 0.903774326799728690, 0.903795726135313230, 0.903817123211408500, 0.903838518027960890, 0.903859910584916990, 0.903881300882223630, +0.903902688919826720, 0.903924074697673110, 0.903945458215709260, 0.903966839473881790, 0.903988218472137170, 0.904009595210422120, 0.904030969688683350, 0.904052341906866790, +0.904073711864919470, 0.904095079562787780, 0.904116445000418430, 0.904137808177757910, 0.904159169094752910, 0.904180527751350050, 0.904201884147496140, 0.904223238283137220, +0.904244590158220230, 0.904265939772691650, 0.904287287126498310, 0.904308632219586680, 0.904329975051903600, 0.904351315623395770, 0.904372653934009450, 0.904393989983691360, +0.904415323772388420, 0.904436655300047130, 0.904457984566614190, 0.904479311572036200, 0.904500636316260100, 0.904521958799232690, 0.904543279020900040, 0.904564596981209170, +0.904585912680106800, 0.904607226117539630, 0.904628537293454380, 0.904649846207797870, 0.904671152860516690, 0.904692457251558000, 0.904713759380867840, 0.904735059248393260, +0.904756356854081070, 0.904777652197877870, 0.904798945279730700, 0.904820236099586060, 0.904841524657391210, 0.904862810953092180, 0.904884094986636130, 0.904905376757969890, +0.904926656267040160, 0.904947933513793770, 0.904969208498177520, 0.904990481220138370, 0.905011751679623330, 0.905033019876578470, 0.905054285810951150, 0.905075549482688090, +0.905096810891736100, 0.905118070038042230, 0.905139326921553080, 0.905160581542215900, 0.905181833899977080, 0.905203083994783550, 0.905224331826582350, 0.905245577395320300, +0.905266820700944330, 0.905288061743401370, 0.905309300522638140, 0.905330537038602110, 0.905351771291239340, 0.905373003280497080, 0.905394233006322380, 0.905415460468662170, +0.905436685667463160, 0.905457908602672500, 0.905479129274237130, 0.905500347682104190, 0.905521563826220070, 0.905542777706532130, 0.905563989322987100, 0.905585198675532220, +0.905606405764114220, 0.905627610588680240, 0.905648813149177670, 0.905670013445552650, 0.905691211477752670, 0.905712407245724550, 0.905733600749415450, 0.905754791988772400, +0.905775980963742340, 0.905797167674272320, 0.905818352120309700, 0.905839534301800860, 0.905860714218693190, 0.905881891870933820, 0.905903067258469590, 0.905924240381247750, +0.905945411239215350, 0.905966579832319320, 0.905987746160507370, 0.906008910223725540, 0.906030072021921540, 0.906051231555042300, 0.906072388823034980, 0.906093543825846610, +0.906114696563424470, 0.906135847035716040, 0.906156995242667460, 0.906178141184226460, 0.906199284860340180, 0.906220426270955560, 0.906241565416019970, 0.906262702295480450, +0.906283836909284160, 0.906304969257378690, 0.906326099339710310, 0.906347227156226840, 0.906368352706875210, 0.906389475991602690, 0.906410597010356530, 0.906431715763083790, +0.906452832249732280, 0.906473946470248150, 0.906495058424579230, 0.906516168112672660, 0.906537275534475720, 0.906558380689935550, 0.906579483578999420, 0.906600584201614600, +0.906621682557728680, 0.906642778647288150, 0.906663872470240720, 0.906684964026533650, 0.906706053316114090, 0.906727140338929430, 0.906748225094926920, 0.906769307584053830, +0.906790387806257870, 0.906811465761485520, 0.906832541449684610, 0.906853614870802290, 0.906874686024785830, 0.906895754911582810, 0.906916821531140280, 0.906937885883406180, +0.906958947968326990, 0.906980007785850310, 0.907001065335923730, 0.907022120618494410, 0.907043173633509840, 0.907064224380917270, 0.907085272860664200, 0.907106319072698340, +0.907127363016966280, 0.907148404693415840, 0.907169444101994290, 0.907190481242649230, 0.907211516115327910, 0.907232548719977830, 0.907253579056546360, 0.907274607124981420, +0.907295632925229410, 0.907316656457238470, 0.907337677720955860, 0.907358696716328960, 0.907379713443305370, 0.907400727901832570, 0.907421740091858280, 0.907442750013329190, +0.907463757666193360, 0.907484763050398050, 0.907505766165890850, 0.907526767012619140, 0.907547765590530630, 0.907568761899572700, 0.907589755939693270, 0.907610747710838940, +0.907631737212957870, 0.907652724445997430, 0.907673709409905220, 0.907694692104628610, 0.907715672530115310, 0.907736650686313260, 0.907757626573169160, 0.907778600190631060, +0.907799571538646430, 0.907820540617162890, 0.907841507426127900, 0.907862471965489190, 0.907883434235194350, 0.907904394235191310, 0.907925351965426900, 0.907946307425849030, +0.907967260616405420, 0.907988211537043680, 0.908009160187711490, 0.908030106568356250, 0.908051050678925890, 0.908071992519368210, 0.908092932089630160, 0.908113869389659770, +0.908134804419404750, 0.908155737178812710, 0.908176667667831230, 0.908197595886408250, 0.908218521834491590, 0.908239445512028180, 0.908260366918966170, 0.908281286055253380, +0.908302202920837190, 0.908323117515665630, 0.908344029839686210, 0.908364939892846720, 0.908385847675095340, 0.908406753186378870, 0.908427656426645470, 0.908448557395843070, +0.908469456093919160, 0.908490352520821660, 0.908511246676498300, 0.908532138560896870, 0.908553028173965330, 0.908573915515650920, 0.908594800585901700, 0.908615683384665580, +0.908636563911890070, 0.908657442167523310, 0.908678318151512900, 0.908699191863806990, 0.908720063304352840, 0.908740932473098510, 0.908761799369991800, 0.908782663994980640, +0.908803526348012760, 0.908824386429036070, 0.908845244237998510, 0.908866099774848110, 0.908886953039532150, 0.908907804031998780, 0.908928652752195920, 0.908949499200071400, +0.908970343375573140, 0.908991185278649080, 0.909012024909247370, 0.909032862267315170, 0.909053697352800950, 0.909074530165652320, 0.909095360705817530, 0.909116188973244200, +0.909137014967880460, 0.909157838689674260, 0.909178660138573740, 0.909199479314526270, 0.909220296217480020, 0.909241110847383020, 0.909261923204183310, 0.909282733287828830, +0.909303541098267390, 0.909324346635447260, 0.909345149899316470, 0.909365950889822530, 0.909386749606913680, 0.909407546050537970, 0.909428340220643340, 0.909449132117177930, +0.909469921740089670, 0.909490709089327050, 0.909511494164837230, 0.909532276966568580, 0.909553057494469350, 0.909573835748487490, 0.909594611728570920, 0.909615385434667910, +0.909636156866726500, 0.909656926024694950, 0.909677692908520740, 0.909698457518152370, 0.909719219853537760, 0.909739979914625190, 0.909760737701362570, 0.909781493213698170, +0.909802246451580030, 0.909822997414956650, 0.909843746103775390, 0.909864492517984740, 0.909885236657532960, 0.909905978522367990, 0.909926718112438080, 0.909947455427691400, +0.909968190468076530, 0.909988923233540750, 0.910009653724032640, 0.910030381939500370, 0.910051107879892180, 0.910071831545156250, 0.910092552935240720, 0.910113272050093740, +0.910133988889664010, 0.910154703453898930, 0.910175415742747180, 0.910196125756156830, 0.910216833494076120, 0.910237538956453320, 0.910258242143236700, 0.910278943054374850, +0.910299641689815360, 0.910320338049506630, 0.910341032133397120, 0.910361723941435000, 0.910382413473568630, 0.910403100729746170, 0.910423785709916000, 0.910444468414026710, +0.910465148842025900, 0.910485826993862160, 0.910506502869483870, 0.910527176468839410, 0.910547847791876920, 0.910568516838544780, 0.910589183608791490, 0.910609848102565510, +0.910630510319814570, 0.910651170260487360, 0.910671827924532160, 0.910692483311897450, 0.910713136422531490, 0.910733787256382770, 0.910754435813399880, 0.910775082093530530, +0.910795726096723550, 0.910816367822927190, 0.910837007272089940, 0.910857644444160060, 0.910878279339086270, 0.910898911956816600, 0.910919542297300100, 0.910940170360484360, +0.910960796146318200, 0.910981419654750100, 0.911002040885728450, 0.911022659839201610, 0.911043276515118180, 0.911063890913426880, 0.911084503034075510, 0.911105112877012900, +0.911125720442187540, 0.911146325729547790, 0.911166928739042370, 0.911187529470619540, 0.911208127924227900, 0.911228724099816260, 0.911249317997332440, 0.911269909616725380, +0.911290498957943560, 0.911311086020935360, 0.911331670805649590, 0.911352253312034620, 0.911372833540038950, 0.911393411489611620, 0.911413987160700430, 0.911434560553254220, +0.911455131667221590, 0.911475700502551110, 0.911496267059191510, 0.911516831337091160, 0.911537393336199100, 0.911557953056463140, 0.911578510497832340, 0.911599065660255280, +0.911619618543680570, 0.911640169148056790, 0.911660717473332550, 0.911681263519456550, 0.911701807286377730, 0.911722348774044120, 0.911742887982404550, 0.911763424911407830, +0.911783959561002440, 0.911804491931137220, 0.911825022021760860, 0.911845549832821840, 0.911866075364269220, 0.911886598616051260, 0.911907119588116650, 0.911927638280414230, +0.911948154692892810, 0.911968668825500980, 0.911989180678187460, 0.912009690250901390, 0.912030197543590710, 0.912050702556204460, 0.912071205288691570, 0.912091705741000620, +0.912112203913080340, 0.912132699804879650, 0.912153193416347150, 0.912173684747432100, 0.912194173798082430, 0.912214660568247290, 0.912235145057875510, 0.912255627266915890, +0.912276107195317270, 0.912296584843028340, 0.912317060209998250, 0.912337533296175170, 0.912358004101508250, 0.912378472625946400, 0.912398938869438240, 0.912419402831932790, +0.912439864513378880, 0.912460323913725340, 0.912480781032921300, 0.912501235870914920, 0.912521688427655460, 0.912542138703091750, 0.912562586697172720, 0.912583032409847280, +0.912603475841064160, 0.912623916990772390, 0.912644355858921230, 0.912664792445458840, 0.912685226750334370, 0.912705658773496850, 0.912726088514895230, 0.912746515974478420, +0.912766941152195250, 0.912787364047995100, 0.912807784661826220, 0.912828202993637870, 0.912848619043378990, 0.912869032810998630, 0.912889444296445580, 0.912909853499669020, +0.912930260420617760, 0.912950665059241160, 0.912971067415487610, 0.912991467489306370, 0.913011865280646480, 0.913032260789456980, 0.913052654015686800, 0.913073044959284870, +0.913093433620200460, 0.913113819998382810, 0.913134204093780210, 0.913154585906342130, 0.913174965436017510, 0.913195342682755600, 0.913215717646505220, 0.913236090327215640, +0.913256460724836130, 0.913276828839315160, 0.913297194670602110, 0.913317558218646020, 0.913337919483396040, 0.913358278464801330, 0.913378635162810810, 0.913398989577373870, +0.913419341708439640, 0.913439691555956830, 0.913460039119874720, 0.913480384400142560, 0.913500727396709400, 0.913521068109524380, 0.913541406538536770, 0.913561742683696050, +0.913582076544950490, 0.913602408122249800, 0.913622737415543120, 0.913643064424779490, 0.913663389149908300, 0.913683711590878580, 0.913704031747639590, 0.913724349620140930, +0.913744665208330980, 0.913764978512159430, 0.913785289531575450, 0.913805598266528070, 0.913825904716966900, 0.913846208882840850, 0.913866510764099300, 0.913886810360691860, +0.913907107672567000, 0.913927402699674430, 0.913947695441963300, 0.913967985899383000, 0.913988274071882660, 0.914008559959411660, 0.914028843561919600, 0.914049124879355080, +0.914069403911667800, 0.914089680658807020, 0.914109955120721910, 0.914130227297362040, 0.914150497188676580, 0.914170764794614790, 0.914191030115126480, 0.914211293150160360, +0.914231553899665930, 0.914251812363592540, 0.914272068541889690, 0.914292322434506640, 0.914312574041392880, 0.914332823362497550, 0.914353070397770580, 0.914373315147160580, +0.914393557610617250, 0.914413797788090070, 0.914434035679528410, 0.914454271284881660, 0.914474504604099180, 0.914494735637130910, 0.914514964383925320, 0.914535190844432360, +0.914555415018601380, 0.914575636906381990, 0.914595856507723350, 0.914616073822575150, 0.914636288850886770, 0.914656501592608030, 0.914676712047687750, 0.914696920216075520, +0.914717126097721160, 0.914737329692573820, 0.914757531000583320, 0.914777730021698820, 0.914797926755870460, 0.914818121203046950, 0.914838313363178110, 0.914858503236213430, +0.914878690822102600, 0.914898876120794900, 0.914919059132240140, 0.914939239856387700, 0.914959418293187500, 0.914979594442588360, 0.914999768304540330, 0.915019939878992770, +0.915040109165895510, 0.915060276165197810, 0.915080440876849480, 0.915100603300800120, 0.915120763436999550, 0.915140921285396700, 0.915161076845941500, 0.915181230118583770, +0.915201381103272870, 0.915221529799958410, 0.915241676208590320, 0.915261820329118290, 0.915281962161491380, 0.915302101705659510, 0.915322238961572500, 0.915342373929179720, +0.915362506608431210, 0.915382636999276240, 0.915402765101664850, 0.915422890915546850, 0.915443014440871170, 0.915463135677588080, 0.915483254625647060, 0.915503371284997920, +0.915523485655590390, 0.915543597737374150, 0.915563707530298920, 0.915583815034314740, 0.915603920249370650, 0.915624023175416800, 0.915644123812402900, 0.915664222160278650, +0.915684318218993880, 0.915704411988498280, 0.915724503468742010, 0.915744592659674230, 0.915764679561244850, 0.915784764173403820, 0.915804846496100830, 0.915824926529285820, +0.915845004272908380, 0.915865079726918550, 0.915885152891266260, 0.915905223765900780, 0.915925292350772250, 0.915945358645830490, 0.915965422651025320, 0.915985484366306670, +0.916005543791624240, 0.916025600926928310, 0.916045655772168010, 0.916065708327293620, 0.916085758592254830, 0.916105806567001800, 0.916125852251484130, 0.916145895645651960, +0.916165936749455010, 0.916185975562843540, 0.916206012085766690, 0.916226046318174950, 0.916246078260018030, 0.916266107911245960, 0.916286135271808580, 0.916306160341655910, +0.916326183120737770, 0.916346203609004540, 0.916366221806405480, 0.916386237712890850, 0.916406251328410690, 0.916426262652914820, 0.916446271686353290, 0.916466278428676120, +0.916486282879833580, 0.916506285039775050, 0.916526284908450780, 0.916546282485810710, 0.916566277771804990, 0.916586270766383660, 0.916606261469496530, 0.916626249881093760, +0.916646236001125820, 0.916666219829541880, 0.916686201366292310, 0.916706180611327360, 0.916726157564596860, 0.916746132226051060, 0.916766104595639900, 0.916786074673313410, +0.916806042459022200, 0.916826007952715400, 0.916845971154343630, 0.916865932063857030, 0.916885890681205520, 0.916905847006339260, 0.916925801039208400, 0.916945752779763420, +0.916965702227953710, 0.916985649383729730, 0.917005594247041530, 0.917025536817839490, 0.917045477096073540, 0.917065415081693920, 0.917085350774650700, 0.917105284174894560, +0.917125215282374780, 0.917145144097041950, 0.917165070618846330, 0.917184994847738080, 0.917204916783667220, 0.917224836426584140, 0.917244753776439210, 0.917264668833182140, +0.917284581596763400, 0.917304492067133270, 0.917324400244241780, 0.917344306128039410, 0.917364209718476210, 0.917384111015502430, 0.917404010019068790, 0.917423906729124770, +0.917443801145620960, 0.917463693268507630, 0.917483583097735140, 0.917503470633253660, 0.917523355875013550, 0.917543238822964960, 0.917563119477058710, 0.917582997837244170, +0.917602873903472280, 0.917622747675693180, 0.917642619153857140, 0.917662488337914640, 0.917682355227815830, 0.917702219823511630, 0.917722082124951430, 0.917741942132086040, +0.917761799844865720, 0.917781655263240960, 0.917801508387162120, 0.917821359216579370, 0.917841207751443400, 0.917861053991704590, 0.917880897937312870, 0.917900739588218940, +0.917920578944373180, 0.917940416005725960, 0.917960250772227650, 0.917980083243828740, 0.917999913420479930, 0.918019741302131040, 0.918039566888732780, 0.918059390180235520, +0.918079211176589860, 0.918099029877746280, 0.918118846283654920, 0.918138660394266610, 0.918158472209531950, 0.918178281729400750, 0.918198088953823820, 0.918217893882751660, +0.918237696516134850, 0.918257496853923770, 0.918277294896068910, 0.918297090642520850, 0.918316884093230310, 0.918336675248147330, 0.918356464107222600, 0.918376250670406740, +0.918396034937650320, 0.918415816908903730, 0.918435596584117550, 0.918455373963242840, 0.918475149046229290, 0.918494921833027830, 0.918514692323589180, 0.918534460517863690, +0.918554226415802090, 0.918573990017354960, 0.918593751322472780, 0.918613510331106610, 0.918633267043206360, 0.918653021458722850, 0.918672773577606790, 0.918692523399808890, +0.918712270925279630, 0.918732016153969710, 0.918751759085829730, 0.918771499720810740, 0.918791238058862540, 0.918810974099936400, 0.918830707843982690, 0.918850439290952340, +0.918870168440795830, 0.918889895293463880, 0.918909619848907510, 0.918929342107076770, 0.918949062067922710, 0.918968779731396010, 0.918988495097447290, 0.919008208166027350, +0.919027918937086910, 0.919047627410576770, 0.919067333586447770, 0.919087037464650150, 0.919106739045134850, 0.919126438327852790, 0.919146135312754690, 0.919165829999791130, +0.919185522388913050, 0.919205212480071480, 0.919224900273216570, 0.919244585768299370, 0.919264268965270800, 0.919283949864081460, 0.919303628464682280, 0.919323304767024060, +0.919342978771057530, 0.919362650476733930, 0.919382319884003320, 0.919401986992816940, 0.919421651803125630, 0.919441314314880080, 0.919460974528031330, 0.919480632442530200, +0.919500288058327400, 0.919519941375374180, 0.919539592393620820, 0.919559241113018570, 0.919578887533518130, 0.919598531655070440, 0.919618173477626420, 0.919637813001137010, +0.919657450225553450, 0.919677085150825800, 0.919696717776905540, 0.919716348103743480, 0.919735976131290540, 0.919755601859497670, 0.919775225288315790, 0.919794846417695820, +0.919814465247589030, 0.919834081777945790, 0.919853696008717360, 0.919873307939854670, 0.919892917571308750, 0.919912524903030550, 0.919932129934970980, 0.919951732667081080, +0.919971333099312230, 0.919990931231614680, 0.920010527063939820, 0.920030120596238570, 0.920049711828462070, 0.920069300760561370, 0.920088887392487290, 0.920108471724191410, +0.920128053755624010, 0.920147633486736450, 0.920167210917479880, 0.920186786047805240, 0.920206358877663550, 0.920225929407006090, 0.920245497635783670, 0.920265063563947990, +0.920284627191449210, 0.920304188518238920, 0.920323747544268160, 0.920343304269487960, 0.920362858693849480, 0.920382410817303990, 0.920401960639802730, 0.920421508161296310, +0.920441053381735990, 0.920460596301073130, 0.920480136919258780, 0.920499675236243990, 0.920519211251980110, 0.920538744966418190, 0.920558276379509710, 0.920577805491205270, +0.920597332301456240, 0.920616856810213880, 0.920636379017429450, 0.920655898923053990, 0.920675416527038770, 0.920694931829335150, 0.920714444829894400, 0.920733955528667320, +0.920753463925605200, 0.920772970020659500, 0.920792473813781380, 0.920811975304922090, 0.920831474494032910, 0.920850971381065310, 0.920870465965969890, 0.920889958248698460, +0.920909448229201950, 0.920928935907431970, 0.920948421283339540, 0.920967904356876140, 0.920987385127992940, 0.921006863596641630, 0.921026339762772820, 0.921045813626338190, +0.921065285187289030, 0.921084754445576580, 0.921104221401152330, 0.921123686053967440, 0.921143148403973380, 0.921162608451121860, 0.921182066195363360, 0.921201521636649700, +0.921220974774932370, 0.921240425610162510, 0.921259874142291490, 0.921279320371270920, 0.921298764297052370, 0.921318205919586570, 0.921337645238825220, 0.921357082254719790, +0.921376516967221670, 0.921395949376282220, 0.921415379481852930, 0.921434807283885160, 0.921454232782330740, 0.921473655977140370, 0.921493076868265870, 0.921512495455658720, +0.921531911739270290, 0.921551325719052070, 0.921570737394955540, 0.921590146766932520, 0.921609553834933810, 0.921628958598911140, 0.921648361058816090, 0.921667761214600260, +0.921687159066214900, 0.921706554613611730, 0.921725947856742110, 0.921745338795557980, 0.921764727430010140, 0.921784113760050540, 0.921803497785630640, 0.921822879506701940, +0.921842258923216140, 0.921861636035124610, 0.921881010842379060, 0.921900383344931180, 0.921919753542732150, 0.921939121435733640, 0.921958487023887390, 0.921977850307144960, +0.921997211285457860, 0.922016569958777680, 0.922035926327056440, 0.922055280390245090, 0.922074632148295550, 0.922093981601159410, 0.922113328748788260, 0.922132673591133820, +0.922152016128147680, 0.922171356359781540, 0.922190694285987320, 0.922210029906716080, 0.922229363221919730, 0.922248694231549980, 0.922268022935558430, 0.922287349333896890, +0.922306673426516950, 0.922325995213370330, 0.922345314694409170, 0.922364631869584280, 0.922383946738847830, 0.922403259302151500, 0.922422569559447010, 0.922441877510686070, +0.922461183155820490, 0.922480486494802300, 0.922499787527582550, 0.922519086254113270, 0.922538382674346290, 0.922557676788233420, 0.922576968595726350, 0.922596258096776810, +0.922615545291336600, 0.922634830179357990, 0.922654112760791900, 0.922673393035590480, 0.922692671003705670, 0.922711946665089040, 0.922731220019692660, 0.922750491067468200, +0.922769759808367840, 0.922789026242342820, 0.922808290369345090, 0.922827552189326770, 0.922846811702239480, 0.922866068908035240, 0.922885323806665770, 0.922904576398082990, +0.922923826682239160, 0.922943074659085430, 0.922962320328573950, 0.922981563690656650, 0.923000804745285450, 0.923020043492412290, 0.923039279931989090, 0.923058514063967550, +0.923077745888300160, 0.923096975404937960, 0.923116202613833430, 0.923135427514938380, 0.923154650108204740, 0.923173870393584450, 0.923193088371029540, 0.923212304040492150, +0.923231517401923770, 0.923250728455276560, 0.923269937200502430, 0.923289143637553540, 0.923308347766381820, 0.923327549586939190, 0.923346749099177800, 0.923365946303049690, +0.923385141198506560, 0.923404333785500460, 0.923423524063983540, 0.923442712033907820, 0.923461897695225350, 0.923481081047888060, 0.923500262091848430, 0.923519440827057840, +0.923538617253468640, 0.923557791371033000, 0.923576963179702730, 0.923596132679430080, 0.923615299870167110, 0.923634464751865950, 0.923653627324478870, 0.923672787587957460, +0.923691945542254090, 0.923711101187320800, 0.923730254523109750, 0.923749405549573080, 0.923768554266662930, 0.923787700674331360, 0.923806844772530940, 0.923825986561213060, +0.923845126040330090, 0.923864263209834390, 0.923883398069678120, 0.923902530619813200, 0.923921660860192010, 0.923940788790767020, 0.923959914411489720, 0.923979037722312710, +0.923998158723188020, 0.924017277414067920, 0.924036393794904650, 0.924055507865650380, 0.924074619626257370, 0.924093729076678190, 0.924112836216864240, 0.924131941046768320, +0.924151043566342480, 0.924170143775538970, 0.924189241674310160, 0.924208337262608310, 0.924227430540385590, 0.924246521507594570, 0.924265610164186960, 0.924284696510115240, +0.924303780545331910, 0.924322862269788990, 0.924341941683439080, 0.924361018786234220, 0.924380093578127120, 0.924399166059069470, 0.924418236229013980, 0.924437304087912800, +0.924456369635718420, 0.924475432872383100, 0.924494493797859200, 0.924513552412099090, 0.924532608715055380, 0.924551662706679880, 0.924570714386925170, 0.924589763755743640, +0.924608810813087770, 0.924627855558909810, 0.924646897993162350, 0.924665938115797780, 0.924684975926768240, 0.924704011426026100, 0.924723044613523950, 0.924742075489214280, +0.924761104053049340, 0.924780130304981740, 0.924799154244963730, 0.924818175872948120, 0.924837195188886850, 0.924856212192732510, 0.924875226884437680, 0.924894239263954750, +0.924913249331236310, 0.924932257086234720, 0.924951262528902360, 0.924970265659192270, 0.924989266477056260, 0.925008264982447040, 0.925027261175317080, 0.925046255055618990, +0.925065246623305360, 0.925084235878328440, 0.925103222820641390, 0.925122207450195910, 0.925141189766944930, 0.925160169770841030, 0.925179147461836600, 0.925198122839884340, +0.925217095904936840, 0.925236066656946580, 0.925255035095866370, 0.925274001221648380, 0.925292965034245300, 0.925311926533609830, 0.925330885719694570, 0.925349842592452120, +0.925368797151834950, 0.925387749397795890, 0.925406699330287740, 0.925425646949262550, 0.925444592254673240, 0.925463535246472400, 0.925482475924612750, 0.925501414289046860, +0.925520350339727570, 0.925539284076607680, 0.925558215499639240, 0.925577144608775160, 0.925596071403968380, 0.925614995885171270, 0.925633918052336750, 0.925652837905417410, +0.925671755444366080, 0.925690670669135570, 0.925709583579678140, 0.925728494175946710, 0.925747402457894000, 0.925766308425472810, 0.925785212078635840, 0.925804113417335930, +0.925823012441525980, 0.925841909151158160, 0.925860803546185610, 0.925879695626561030, 0.925898585392237240, 0.925917472843166940, 0.925936357979303070, 0.925955240800598210, +0.925974121307005520, 0.925992999498477350, 0.926011875374966540, 0.926030748936426120, 0.926049620182808790, 0.926068489114067470, 0.926087355730154880, 0.926106220031023940, +0.926125082016627690, 0.926143941686918490, 0.926162799041849390, 0.926181654081373320, 0.926200506805443080, 0.926219357214011610, 0.926238205307031830, 0.926257051084456770, +0.926275894546238710, 0.926294735692331010, 0.926313574522686370, 0.926332411037257830, 0.926351245235998320, 0.926370077118860660, 0.926388906685797870, 0.926407733936763010, +0.926426558871708550, 0.926445381490587750, 0.926464201793353430, 0.926483019779958620, 0.926501835450356250, 0.926520648804499360, 0.926539459842340760, 0.926558268563833830, +0.926577074968931050, 0.926595879057585450, 0.926614680829750180, 0.926633480285378170, 0.926652277424422470, 0.926671072246836090, 0.926689864752572420, 0.926708654941583720, +0.926727442813823350, 0.926746228369244470, 0.926765011607799890, 0.926783792529442870, 0.926802571134126340, 0.926821347421803440, 0.926840121392427440, 0.926858893045950820, +0.926877662382326940, 0.926896429401508850, 0.926915194103449800, 0.926933956488102730, 0.926952716555420770, 0.926971474305357310, 0.926990229737864930, 0.927008982852896900, +0.927027733650406470, 0.927046482130346570, 0.927065228292670570, 0.927083972137331510, 0.927102713664282540, 0.927121452873477030, 0.927140189764867670, 0.927158924338407740, +0.927177656594050490, 0.927196386531749180, 0.927215114151456850, 0.927233839453126760, 0.927252562436712060, 0.927271283102166330, 0.927290001449441960, 0.927308717478492640, +0.927327431189271520, 0.927346142581731870, 0.927364851655826830, 0.927383558411509660, 0.927402262848733950, 0.927420964967452190, 0.927439664767618080, 0.927458362249184760, +0.927477057412105620, 0.927495750256333800, 0.927514440781822550, 0.927533128988525250, 0.927551814876395380, 0.927570498445385750, 0.927589179695449740, 0.927607858626540940, +0.927626535238612380, 0.927645209531617550, 0.927663881505509710, 0.927682551160242120, 0.927701218495768480, 0.927719883512041490, 0.927738546209014750, 0.927757206586641630, +0.927775864644875600, 0.927794520383669830, 0.927813173802977790, 0.927831824902753070, 0.927850473682948480, 0.927869120143517740, 0.927887764284414220, 0.927906406105591270, +0.927925045607002400, 0.927943682788600730, 0.927962317650339990, 0.927980950192173750, 0.927999580414054840, 0.928018208315936840, 0.928036833897773470, 0.928055457159517980, +0.928074078101123860, 0.928092696722544460, 0.928111313023733730, 0.928129927004644360, 0.928148538665230170, 0.928167148005444640, 0.928185755025241250, 0.928204359724573490, +0.928222962103394830, 0.928241562161658650, 0.928260159899318980, 0.928278755316328640, 0.928297348412641330, 0.928315939188210650, 0.928334527642990180, 0.928353113776933410, +0.928371697589993830, 0.928390279082124900, 0.928408858253280680, 0.928427435103414080, 0.928446009632478700, 0.928464581840428460, 0.928483151727216740, 0.928501719292797120, +0.928520284537123100, 0.928538847460148810, 0.928557408061827070, 0.928575966342111810, 0.928594522300956630, 0.928613075938315100, 0.928631627254140950, 0.928650176248387640, +0.928668722921008990, 0.928687267271958830, 0.928705809301190070, 0.928724349008656970, 0.928742886394312910, 0.928761421458111580, 0.928779954200006700, 0.928798484619952070, +0.928817012717901400, 0.928835538493807960, 0.928854061947625650, 0.928872583079308200, 0.928891101888809300, 0.928909618376082550, 0.928928132541081860, 0.928946644383760840, +0.928965153904073530, 0.928983661101972950, 0.929002165977413250, 0.929020668530348150, 0.929039168760731340, 0.929057666668516640, 0.929076162253657860, 0.929094655516108590, +0.929113146455822990, 0.929131635072754200, 0.929150121366856260, 0.929168605338083100, 0.929187086986388410, 0.929205566311726020, 0.929224043314049730, 0.929242517993313700, +0.929260990349470960, 0.929279460382475770, 0.929297928092281960, 0.929316393478843210, 0.929334856542113560, 0.929353317282046840, 0.929371775698596750, 0.929390231791717540, +0.929408685561362470, 0.929427137007485690, 0.929445586130041020, 0.929464032928982390, 0.929482477404263710, 0.929500919555838800, 0.929519359383661590, 0.929537796887686340, +0.929556232067866310, 0.929574664924155640, 0.929593095456508260, 0.929611523664878200, 0.929629949549219400, 0.929648373109485560, 0.929666794345631260, 0.929685213257609670, +0.929703629845374910, 0.929722044108881150, 0.929740456048082310, 0.929758865662932310, 0.929777272953385080, 0.929795677919394770, 0.929814080560915520, 0.929832480877900710, +0.929850878870304820, 0.929869274538081660, 0.929887667881185260, 0.929906058899569790, 0.929924447593189150, 0.929942833961997730, 0.929961218005948780, 0.929979599724996890, +0.929997979119095990, 0.930016356188200220, 0.930034730932263410, 0.930053103351239810, 0.930071473445083560, 0.930089841213748820, 0.930108206657189300, 0.930126569775359120, +0.930144930568212570, 0.930163289035703670, 0.930181645177786560, 0.930199998994415410, 0.930218350485544130, 0.930236699651127430, 0.930255046491118560, 0.930273391005472130, +0.930291733194142270, 0.930310073057083020, 0.930328410594248530, 0.930346745805593070, 0.930365078691071100, 0.930383409250636010, 0.930401737484242490, 0.930420063391844580, +0.930438386973396540, 0.930456708228852510, 0.930475027158166770, 0.930493343761293450, 0.930511658038187030, 0.930529969988801110, 0.930548279613090390, 0.930566586911008910, +0.930584891882510920, 0.930603194527550800, 0.930621494846082590, 0.930639792838060750, 0.930658088503439670, 0.930676381842173050, 0.930694672854215480, 0.930712961539521210, +0.930731247898044620, 0.930749531929739860, 0.930767813634561290, 0.930786093012463510, 0.930804370063400110, 0.930822644787325790, 0.930840917184194930, 0.930859187253961770, +0.930877454996580590, 0.930895720412005860, 0.930913983500191720, 0.930932244261093000, 0.930950502694663400, 0.930968758800857500, 0.930987012579629680, 0.931005264030934310, +0.931023513154725760, 0.931041759950958500, 0.931060004419587140, 0.931078246560565480, 0.931096486373848120, 0.931114723859389650, 0.931132959017144320, 0.931151191847066630, +0.931169422349110820, 0.931187650523231600, 0.931205876369383570, 0.931224099887520420, 0.931242321077597190, 0.931260539939568030, 0.931278756473387540, 0.931296970679010180, +0.931315182556390340, 0.931333392105482600, 0.931351599326241670, 0.931369804218621480, 0.931388006782576720, 0.931406207018061980, 0.931424404925031650, 0.931442600503440410, +0.931460793753242640, 0.931478984674393160, 0.931497173266845890, 0.931515359530555750, 0.931533543465477230, 0.931551725071564810, 0.931569904348773070, 0.931588081297056500, +0.931606255916369810, 0.931624428206667800, 0.931642598167904400, 0.931660765800034540, 0.931678931103012700, 0.931697094076793570, 0.931715254721331650, 0.931733413036581640, +0.931751569022498120, 0.931769722679036020, 0.931787874006149150, 0.931806023003792780, 0.931824169671921280, 0.931842314010489340, 0.931860456019451560, 0.931878595698762750, +0.931896733048377720, 0.931914868068250520, 0.931933000758336180, 0.931951131118589290, 0.931969259148964560, 0.931987384849416790, 0.932005508219900470, 0.932023629260370410, +0.932041747970781650, 0.932059864351088120, 0.932077978401244960, 0.932096090121206870, 0.932114199510928550, 0.932132306570364720, 0.932150411299470070, 0.932168513698199750, +0.932186613766507800, 0.932204711504349360, 0.932222806911679140, 0.932240899988451940, 0.932258990734622480, 0.932277079150145460, 0.932295165234975800, 0.932313248989068530, +0.932331330412377920, 0.932349409504858890, 0.932367486266466260, 0.932385560697155060, 0.932403632796879880, 0.932421702565595640, 0.932439770003257170, 0.932457835109819500, +0.932475897885236990, 0.932493958329464800, 0.932512016442457630, 0.932530072224170390, 0.932548125674558030, 0.932566176793575340, 0.932584225581177590, 0.932602272037318820, +0.932620316161954510, 0.932638357955039350, 0.932656397416528280, 0.932674434546376220, 0.932692469344538090, 0.932710501810968820, 0.932728531945623550, 0.932746559748456660, +0.932764585219423400, 0.932782608358478590, 0.932800629165577380, 0.932818647640674570, 0.932836663783725100, 0.932854677594683880, 0.932872689073506400, 0.932890698220146920, +0.932908705034560580, 0.932926709516702530, 0.932944711666527820, 0.932962711483991130, 0.932980708969047830, 0.932998704121652980, 0.933016696941761040, 0.933034687429327380, +0.933052675584307050, 0.933070661406654960, 0.933088644896326260, 0.933106626053275990, 0.933124604877459070, 0.933142581368830990, 0.933160555527346110, 0.933178527352959920, +0.933196496845627330, 0.933214464005303610, 0.933232428831943570, 0.933250391325502580, 0.933268351485935900, 0.933286309313198000, 0.933304264807244380, 0.933322217968030050, +0.933340168795510180, 0.933358117289639910, 0.933376063450374270, 0.933394007277668520, 0.933411948771478150, 0.933429887931757520, 0.933447824758462220, 0.933465759251547290, +0.933483691410967990, 0.933501621236679460, 0.933519548728636850, 0.933537473886795420, 0.933555396711110540, 0.933573317201536910, 0.933591235358030010, 0.933609151180544990, +0.933627064669037110, 0.933644975823461620, 0.933662884643773560, 0.933680791129928740, 0.933698695281881540, 0.933716597099587650, 0.933734496583002230, 0.933752393732080520, +0.933770288546777900, 0.933788181027049640, 0.933806071172850750, 0.933823958984137170, 0.933841844460863270, 0.933859727602984750, 0.933877608410456970, 0.933895486883235090, +0.933913363021274590, 0.933931236824530610, 0.933949108292958850, 0.933966977426514020, 0.933984844225151820, 0.934002708688827400, 0.934020570817496340, 0.934038430611113800, +0.934056288069635140, 0.934074143193015740, 0.934091995981211400, 0.934109846434176610, 0.934127694551867280, 0.934145540334238800, 0.934163383781246300, 0.934181224892845500, +0.934199063668991530, 0.934216900109639980, 0.934234734214746450, 0.934252565984265760, 0.934270395418153710, 0.934288222516365560, 0.934306047278857020, 0.934323869705583230, +0.934341689796499790, 0.934359507551562500, 0.934377322970726070, 0.934395136053946310, 0.934412946801178810, 0.934430755212378840, 0.934448561287501980, 0.934466365026503820, +0.934484166429339740, 0.934501965495965430, 0.934519762226336040, 0.934537556620407160, 0.934555348678134390, 0.934573138399473200, 0.934590925784379300, 0.934608710832807940, +0.934626493544714940, 0.934644273920055890, 0.934662051958785930, 0.934679827660860880, 0.934697601026236110, 0.934715372054867540, 0.934733140746710320, 0.934750907101720370, +0.934768671119853510, 0.934786432801064550, 0.934804192145309630, 0.934821949152544130, 0.934839703822723740, 0.934857456155804180, 0.934875206151740910, 0.934892953810489760, +0.934910699132006420, 0.934928442116246040, 0.934946182763164550, 0.934963921072717530, 0.934981657044860800, 0.934999390679549960, 0.935017121976740580, 0.935034850936388720, +0.935052577558449390, 0.935070301842878650, 0.935088023789632180, 0.935105743398665590, 0.935123460669934680, 0.935141175603395160, 0.935158888199002610, 0.935176598456713190, +0.935194306376482040, 0.935212011958264980, 0.935229715202018030, 0.935247416107696680, 0.935265114675256860, 0.935282810904654260, 0.935300504795844590, 0.935318196348783990, +0.935335885563427620, 0.935353572439731500, 0.935371256977651440, 0.935388939177143160, 0.935406619038162690, 0.935424296560665610, 0.935441971744608080, 0.935459644589945350, +0.935477315096633450, 0.935494983264628320, 0.935512649093885650, 0.935530312584361480, 0.935547973736011400, 0.935565632548791440, 0.935583289022657750, 0.935600943157565480, +0.935618594953470880, 0.935636244410329780, 0.935653891528098080, 0.935671536306731720, 0.935689178746186400, 0.935706818846418150, 0.935724456607383240, 0.935742092029036800, +0.935759725111335210, 0.935777355854234270, 0.935794984257689920, 0.935812610321658080, 0.935830234046094780, 0.935847855430956170, 0.935865474476197610, 0.935883091181775370, +0.935900705547645370, 0.935918317573763650, 0.935935927260086120, 0.935953534606568830, 0.935971139613167690, 0.935988742279838970, 0.936006342606538030, 0.936023940593221360, +0.936041536239844760, 0.936059129546364390, 0.936076720512736050, 0.936094309138916000, 0.936111895424860510, 0.936129479370524930, 0.936147060975865750, 0.936164640240838790, +0.936182217165400290, 0.936199791749506290, 0.936217363993112730, 0.936234933896175740, 0.936252501458651800, 0.936270066680496280, 0.936287629561665670, 0.936305190102115880, +0.936322748301803070, 0.936340304160683480, 0.936357857678713160, 0.936375408855848130, 0.936392957692044890, 0.936410504187259020, 0.936428048341446770, 0.936445590154564410, +0.936463129626568190, 0.936480666757414040, 0.936498201547058320, 0.936515733995457290, 0.936533264102566760, 0.936550791868342890, 0.936568317292742150, 0.936585840375720680, +0.936603361117234520, 0.936620879517239930, 0.936638395575693170, 0.936655909292550830, 0.936673420667768260, 0.936690929701302190, 0.936708436393108860, 0.936725940743144410, +0.936743442751365010, 0.936760942417727120, 0.936778439742186890, 0.936795934724700800, 0.936813427365224550, 0.936830917663714740, 0.936848405620127720, 0.936865891234419550, +0.936883374506546800, 0.936900855436465510, 0.936918334024132380, 0.936935810269503230, 0.936953284172534430, 0.936970755733182450, 0.936988224951403550, 0.937005691827154210, +0.937023156360390570, 0.937040618551069020, 0.937058078399146230, 0.937075535904577930, 0.937092991067320800, 0.937110443887331220, 0.937127894364565560, 0.937145342498980070, +0.937162788290531350, 0.937180231739175860, 0.937197672844869540, 0.937215111607568980, 0.937232548027230660, 0.937249982103810940, 0.937267413837266420, 0.937284843227553230, +0.937302270274627980, 0.937319694978447360, 0.937337117338967070, 0.937354537356144160, 0.937371955029934870, 0.937389370360295570, 0.937406783347182970, 0.937424193990553430, +0.937441602290363330, 0.937459008246569580, 0.937476411859128000, 0.937493813127995290, 0.937511212053128150, 0.937528608634482950, 0.937546002872016280, 0.937563394765684510, +0.937580784315444670, 0.937598171521252470, 0.937615556383064930, 0.937632938900838430, 0.937650319074529560, 0.937667696904095020, 0.937685072389491060, 0.937702445530674610, +0.937719816327602150, 0.937737184780230050, 0.937754550888514780, 0.937771914652413270, 0.937789276071882010, 0.937806635146877450, 0.937823991877356320, 0.937841346263275310, +0.937858698304591120, 0.937876048001259900, 0.937893395353238570, 0.937910740360483830, 0.937928083022952160, 0.937945423340600270, 0.937962761313384850, 0.937980096941262830, +0.937997430224190350, 0.938014761162124230, 0.938032089755021170, 0.938049416002837870, 0.938066739905531130, 0.938084061463057450, 0.938101380675373630, 0.938118697542436710, +0.938136012064202720, 0.938153324240628690, 0.938170634071671340, 0.938187941557287350, 0.938205246697433660, 0.938222549492066740, 0.938239849941143730, 0.938257148044620900, +0.938274443802455060, 0.938291737214603240, 0.938309028281022030, 0.938326317001668240, 0.938343603376498690, 0.938360887405470080, 0.938378169088539550, 0.938395448425663360, +0.938412725416798540, 0.938430000061901910, 0.938447272360930170, 0.938464542313840360, 0.938481809920589160, 0.938499075181133510, 0.938516338095430340, 0.938533598663436110, +0.938550856885107860, 0.938568112760402530, 0.938585366289276800, 0.938602617471687720, 0.938619866307592090, 0.938637112796947170, 0.938654356939709110, 0.938671598735835170, +0.938688838185282150, 0.938706075288007090, 0.938723310043966810, 0.938740542453118330, 0.938757772515418480, 0.938775000230824500, 0.938792225599292650, 0.938809448620780310, +0.938826669295244280, 0.938843887622641700, 0.938861103602929290, 0.938878317236064190, 0.938895528522003200, 0.938912737460703810, 0.938929944052122160, 0.938947148296215730, +0.938964350192941330, 0.938981549742256230, 0.938998746944117110, 0.939015941798481140, 0.939033134305305660, 0.939050324464547060, 0.939067512276162590, 0.939084697740109390, +0.939101880856344380, 0.939119061624824720, 0.939136240045507440, 0.939153416118349570, 0.939170589843308370, 0.939187761220340420, 0.939204930249403100, 0.939222096930453440, +0.939239261263448480, 0.939256423248345460, 0.939273582885101320, 0.939290740173673640, 0.939307895114018690, 0.939325047706094040, 0.939342197949856740, 0.939359345845263930, +0.939376491392272860, 0.939393634590840470, 0.939410775440924000, 0.939427913942480930, 0.939445050095467750, 0.939462183899841930, 0.939479315355560730, 0.939496444462581180, +0.939513571220860540, 0.939530695630355960, 0.939547817691024580, 0.939564937402824100, 0.939582054765710880, 0.939599169779642530, 0.939616282444576290, 0.939633392760469310, +0.939650500727278850, 0.939667606344962160, 0.939684709613476720, 0.939701810532779240, 0.939718909102827180, 0.939736005323577930, 0.939753099194988620, 0.939770190717016510, +0.939787279889618970, 0.939804366712753250, 0.939821451186376940, 0.939838533310446640, 0.939855613084920050, 0.939872690509754420, 0.939889765584907110, 0.939906838310335280, +0.939923908685996400, 0.939940976711848060, 0.939958042387846970, 0.939975105713950820, 0.939992166690116870, 0.940009225316302490, 0.940026281592465040, 0.940043335518561900, +0.940060387094550420, 0.940077436320388320, 0.940094483196032280, 0.940111527721440020, 0.940128569896569010, 0.940145609721376510, 0.940162647195819990, 0.940179682319856940, +0.940196715093444600, 0.940213745516540690, 0.940230773589102230, 0.940247799311086820, 0.940264822682451930, 0.940281843703154930, 0.940298862373153410, 0.940315878692404630, +0.940332892660866500, 0.940349904278495850, 0.940366913545250480, 0.940383920461087760, 0.940400925025965280, 0.940417927239840410, 0.940434927102670850, 0.940451924614413850, +0.940468919775027450, 0.940485912584468340, 0.940502903042694460, 0.940519891149663390, 0.940536876905332610, 0.940553860309659600, 0.940570841362601940, 0.940587820064117120, +0.940604796414163060, 0.940621770412696790, 0.940638742059676130, 0.940655711355058430, 0.940672678298801630, 0.940689642890863100, 0.940706605131200410, 0.940723565019771500, +0.940740522556533400, 0.940757477741444030, 0.940774430574460860, 0.940791381055541720, 0.940808329184644080, 0.940825274961725630, 0.940842218386744090, 0.940859159459657150, +0.940876098180422060, 0.940893034548996750, 0.940909968565338820, 0.940926900229406060, 0.940943829541155960, 0.940960756500546340, 0.940977681107535100, 0.940994603362079300, +0.941011523264137060, 0.941028440813665990, 0.941045356010623890, 0.941062268854968350, 0.941079179346657080, 0.941096087485647880, 0.941112993271898790, 0.941129896705366950, +0.941146797786010400, 0.941163696513786730, 0.941180592888653860, 0.941197486910569590, 0.941214378579491530, 0.941231267895377590, 0.941248154858185690, 0.941265039467873100, +0.941281921724397950, 0.941298801627718060, 0.941315679177791130, 0.941332554374574970, 0.941349427218027390, 0.941366297708106650, 0.941383165844769780, 0.941400031627975030, +0.941416895057680110, 0.941433756133843060, 0.941450614856421560, 0.941467471225373550, 0.941484325240656950, 0.941501176902229680, 0.941518026210049320, 0.941534873164073800, +0.941551717764261160, 0.941568560010569100, 0.941585399902955760, 0.941602237441378940, 0.941619072625796470, 0.941635905456166600, 0.941652735932446690, 0.941669564054594900, +0.941686389822569250, 0.941703213236327660, 0.941720034295827960, 0.941736853001028160, 0.941753669351886650, 0.941770483348360550, 0.941787294990408250, 0.941804104277987770, +0.941820911211057040, 0.941837715789573980, 0.941854518013496620, 0.941871317882783000, 0.941888115397391370, 0.941904910557279210, 0.941921703362404770, 0.941938493812725990, +0.941955281908200990, 0.941972067648787830, 0.941988851034444520, 0.942005632065129330, 0.942022410740799730, 0.942039187061414210, 0.942055961026930570, 0.942072732637307180, +0.942089501892501850, 0.942106268792472830, 0.942123033337178170, 0.942139795526576120, 0.942156555360624370, 0.942173312839281190, 0.942190067962504820, 0.942206820730253190, +0.942223571142484450, 0.942240319199156850, 0.942257064900228540, 0.942273808245657760, 0.942290549235402120, 0.942307287869420200, 0.942324024147670030, 0.942340758070109860, +0.942357489636697740, 0.942374218847391810, 0.942390945702150760, 0.942407670200931970, 0.942424392343694130, 0.942441112130395160, 0.942457829560993440, 0.942474544635447220, +0.942491257353714640, 0.942507967715753850, 0.942524675721523430, 0.942541381370981090, 0.942558084664085190, 0.942574785600794220, 0.942591484181066200, 0.942608180404859500, +0.942624874272132370, 0.942641565782842970, 0.942658254936949990, 0.942674941734411130, 0.942691626175184870, 0.942708308259229580, 0.942724987986503500, 0.942741665356964910, +0.942758340370572160, 0.942775013027283950, 0.942791683327057760, 0.942808351269852520, 0.942825016855626250, 0.942841680084337550, 0.942858340955944670, 0.942874999470405870, +0.942891655627679630, 0.942908309427724410, 0.942924960870498260, 0.942941609955959660, 0.942958256684067080, 0.942974901054778770, 0.942991543068053330, 0.943008182723848900, +0.943024820022124400, 0.943041454962837530, 0.943058087545947000, 0.943074717771411280, 0.943091345639188730, 0.943107971149237830, 0.943124594301517070, 0.943141215095984810, +0.943157833532599740, 0.943174449611319800, 0.943191063332103790, 0.943207674694910070, 0.943224283699697130, 0.943240890346423560, 0.943257494635047710, 0.943274096565528190, +0.943290696137823680, 0.943307293351892120, 0.943323888207692420, 0.943340480705182840, 0.943357070844322190, 0.943373658625068830, 0.943390244047381370, 0.943406827111218480, +0.943423407816538330, 0.943439986163299600, 0.943456562151460900, 0.943473135780980800, 0.943489707051817890, 0.943506275963930660, 0.943522842517277800, 0.943539406711818130, +0.943555968547509670, 0.943572528024311240, 0.943589085142181540, 0.943605639901079040, 0.943622192300962450, 0.943638742341790460, 0.943655290023521550, 0.943671835346114760, +0.943688378309528010, 0.943704918913720440, 0.943721457158650520, 0.943737993044276860, 0.943754526570558360, 0.943771057737453400, 0.943787586544921230, 0.943804112992919770, +0.943820637081407950, 0.943837158810344580, 0.943853678179688350, 0.943870195189397850, 0.943886709839431900, 0.943903222129749200, 0.943919732060308770, 0.943936239631068650, +0.943952744841987880, 0.943969247693025370, 0.943985748184139720, 0.944002246315289620, 0.944018742086433990, 0.944035235497531770, 0.944051726548541080, 0.944068215239421190, +0.944084701570130690, 0.944101185540628500, 0.944117667150873310, 0.944134146400824050, 0.944150623290439310, 0.944167097819678340, 0.944183569988499280, 0.944200039796861290, +0.944216507244723280, 0.944232972332043950, 0.944249435058782230, 0.944265895424896920, 0.944282353430346830, 0.944298809075091230, 0.944315262359088250, 0.944331713282297150, +0.944348161844676740, 0.944364608046185940, 0.944381051886783560, 0.944397493366428640, 0.944413932485080210, 0.944430369242696740, 0.944446803639237280, 0.944463235674660840, +0.944479665348926250, 0.944496092661992640, 0.944512517613818600, 0.944528940204363400, 0.944545360433586170, 0.944561778301445170, 0.944578193807899760, 0.944594606952908870, +0.944611017736431410, 0.944627426158426430, 0.944643832218852840, 0.944660235917670120, 0.944676637254836420, 0.944693036230311090, 0.944709432844053180, 0.944725827096021710, +0.944742218986175720, 0.944758608514474130, 0.944774995680875970, 0.944791380485340730, 0.944807762927826640, 0.944824143008293200, 0.944840520726699440, 0.944856896083004270, +0.944873269077166960, 0.944889639709146410, 0.944906007978901790, 0.944922373886392440, 0.944938737431576860, 0.944955098614414510, 0.944971457434864330, 0.944987813892885550, +0.945004167988437230, 0.945020519721478380, 0.945036869091968600, 0.945053216099866370, 0.945069560745131150, 0.945085903027722000, 0.945102242947598040, 0.945118580504718530, +0.945134915699042510, 0.945151248530529230, 0.945167578999138170, 0.945183907104827800, 0.945200232847557720, 0.945216556227287060, 0.945232877243974980, 0.945249195897580720, +0.945265512188063430, 0.945281826115382360, 0.945298137679497000, 0.945314446880366140, 0.945330753717949060, 0.945347058192205100, 0.945363360303093540, 0.945379660050573500, +0.945395957434604360, 0.945412252455145600, 0.945428545112155900, 0.945444835405594870, 0.945461123335421760, 0.945477408901595820, 0.945493692104076410, 0.945509972942822690, +0.945526251417794120, 0.945542527528950180, 0.945558801276249580, 0.945575072659652020, 0.945591341679116850, 0.945607608334603220, 0.945623872626070620, 0.945640134553478280, +0.945656394116785930, 0.945672651315952350, 0.945688906150937040, 0.945705158621699570, 0.945721408728199210, 0.945737656470395200, 0.945753901848247150, 0.945770144861714400, +0.945786385510756440, 0.945802623795332310, 0.945818859715401580, 0.945835093270923740, 0.945851324461858160, 0.945867553288164300, 0.945883779749801530, 0.945900003846729230, +0.945916225578907310, 0.945932444946294470, 0.945948661948850630, 0.945964876586535050, 0.945981088859307320, 0.945997298767126790, 0.946013506309953070, 0.946029711487745840, +0.946045914300464030, 0.946062114748067560, 0.946078312830515690, 0.946094508547768110, 0.946110701899784190, 0.946126892886523520, 0.946143081507945680, 0.946159267764010380, +0.946175451654676540, 0.946191633179904180, 0.946207812339652790, 0.946223989133881730, 0.946240163562550810, 0.946256335625619390, 0.946272505323047190, 0.946288672654793990, +0.946304837620818850, 0.946321000221081570, 0.946337160455541840, 0.946353318324159140, 0.946369473826893290, 0.946385626963703650, 0.946401777734550140, 0.946417926139392020, +0.946434072178189090, 0.946450215850900940, 0.946466357157487280, 0.946482496097907690, 0.946498632672121860, 0.946514766880089510, 0.946530898721770540, 0.946547028197124000, +0.946563155306109790, 0.946579280048687850, 0.946595402424817660, 0.946611522434458900, 0.946627640077571390, 0.946643755354115050, 0.946659868264049020, 0.946675978807333340, +0.946692086983927710, 0.946708192793791930, 0.946724296236885590, 0.946740397313168500, 0.946756496022600480, 0.946772592365141440, 0.946788686340750640, 0.946804777949388110, +0.946820867191013770, 0.946836954065587100, 0.946853038573068130, 0.946869120713416560, 0.946885200486592190, 0.946901277892555070, 0.946917352931264440, 0.946933425602680570, +0.946949495906763030, 0.946965563843471750, 0.946981629412766530, 0.946997692614607310, 0.947013753448954110, 0.947029811915766300, 0.947045868015003900, 0.947061921746626840, +0.947077973110594940, 0.947094022106868110, 0.947110068735406260, 0.947126112996169220, 0.947142154889117240, 0.947158194414209560, 0.947174231571406340, 0.947190266360667610, +0.947206298781953170, 0.947222328835223060, 0.947238356520437090, 0.947254381837555170, 0.947270404786537570, 0.947286425367343750, 0.947302443579933870, 0.947318459424267840, +0.947334472900305700, 0.947350484008007370, 0.947366492747332760, 0.947382499118242240, 0.947398503120695290, 0.947414504754651940, 0.947430504020072450, 0.947446500916916620, +0.947462495445144490, 0.947478487604716200, 0.947494477395591670, 0.947510464817731270, 0.947526449871094360, 0.947542432555641410, 0.947558412871332360, 0.947574390818127220, +0.947590366395986150, 0.947606339604869060, 0.947622310444736550, 0.947638278915547860, 0.947654245017263590, 0.947670208749843650, 0.947686170113248180, 0.947702129107437340, +0.947718085732371150, 0.947734039988009650, 0.947749991874313410, 0.947765941391241930, 0.947781888538755560, 0.947797833316814550, 0.947813775725378840, 0.947829715764408780, +0.947845653433864400, 0.947861588733705850, 0.947877521663893720, 0.947893452224387370, 0.947909380415147500, 0.947925306236134140, 0.947941229687307430, 0.947957150768627740, +0.947973069480055110, 0.947988985821550220, 0.948004899793072450, 0.948020811394582500, 0.948036720626040500, 0.948052627487406710, 0.948068531978641270, 0.948084434099704660, +0.948100333850556810, 0.948116231231158510, 0.948132126241469250, 0.948148018881449840, 0.948163909151060190, 0.948179797050260900, 0.948195682579012100, 0.948211565737274050, +0.948227446525007120, 0.948243324942171780, 0.948259200988727960, 0.948275074664636120, 0.948290945969856520, 0.948306814904349650, 0.948322681468075630, 0.948338545660994960, +0.948354407483068210, 0.948370266934255190, 0.948386124014516500, 0.948401978723812490, 0.948417831062103530, 0.948433681029350000, 0.948449528625512240, 0.948465373850550630, +0.948481216704425980, 0.948497057187097870, 0.948512895298527230, 0.948528731038674300, 0.948544564407499570, 0.948560395404963400, 0.948576224031026260, 0.948592050285648750, +0.948607874168791000, 0.948623695680413490, 0.948639514820476700, 0.948655331588941110, 0.948671145985767290, 0.948686958010915520, 0.948702767664346360, 0.948718574946020630, +0.948734379855898150, 0.948750182393939710, 0.948765982560105800, 0.948781780354357010, 0.948797575776653690, 0.948813368826956440, 0.948829159505225840, 0.948844947811422480, +0.948860733745506610, 0.948876517307438830, 0.948892298497179820, 0.948908077314689960, 0.948923853759929940, 0.948939627832860340, 0.948955399533441990, 0.948971168861634800, +0.948986935817399680, 0.949002700400697230, 0.949018462611488030, 0.949034222449732680, 0.949049979915391750, 0.949065735008425840, 0.949081487728795970, 0.949097238076462070, +0.949112986051385050, 0.949128731653525510, 0.949144474882844260, 0.949160215739301760, 0.949175954222858720, 0.949191690333476060, 0.949207424071113910, 0.949223155435733210, +0.949238884427294650, 0.949254611045758810, 0.949270335291086510, 0.949286057163238330, 0.949301776662174970, 0.949317493787857570, 0.949333208540246050, 0.949348920919301560, +0.949364630924984800, 0.949380338557256340, 0.949396043816077120, 0.949411746701407820, 0.949427447213209040, 0.949443145351442030, 0.949458841116066820, 0.949474534507044550, +0.949490225524335930, 0.949505914167901750, 0.949521600437702840, 0.949537284333699770, 0.949552965855853910, 0.949568645004125300, 0.949584321778475070, 0.949599996178864150, +0.949615668205253120, 0.949631337857602900, 0.949647005135874410, 0.949662670040028360, 0.949678332570025980, 0.949693992725827440, 0.949709650507393870, 0.949725305914686290, +0.949740958947665300, 0.949756609606292050, 0.949772257890527220, 0.949787903800331730, 0.949803547335666850, 0.949819188496492720, 0.949834827282770690, 0.949850463694461470, +0.949866097731526190, 0.949881729393925680, 0.949897358681620840, 0.949912985594572820, 0.949928610132742100, 0.949944232296089820, 0.949959852084577010, 0.949975469498164580, +0.949991084536813470, 0.950006697200484580, 0.950022307489139070, 0.950037915402737960, 0.950053520941241850, 0.950069124104611860, 0.950084724892809150, 0.950100323305794530, +0.950115919343529240, 0.950131513005973980, 0.950147104293090350, 0.950162693204838700, 0.950178279741180190, 0.950193863902076050, 0.950209445687487220, 0.950225025097374830, +0.950240602131699920, 0.950256176790423400, 0.950271749073506760, 0.950287318980910460, 0.950302886512595870, 0.950318451668524020, 0.950334014448656170, 0.950349574852953130, +0.950365132881376250, 0.950380688533886460, 0.950396241810445350, 0.950411792711013280, 0.950427341235551730, 0.950442887384021830, 0.950458431156384730, 0.950473972552601460, +0.950489511572633390, 0.950505048216441770, 0.950520582483987190, 0.950536114375231220, 0.950551643890135020, 0.950567171028659620, 0.950582695790766260, 0.950598218176416320, +0.950613738185570710, 0.950629255818191020, 0.950644771074237950, 0.950660283953672970, 0.950675794456457220, 0.950691302582552080, 0.950706808331918560, 0.950722311704518150, +0.950737812700311880, 0.950753311319261440, 0.950768807561327310, 0.950784301426471300, 0.950799792914654440, 0.950815282025838090, 0.950830768759983620, 0.950846253117052180, +0.950861735097005440, 0.950877214699804020, 0.950892691925409590, 0.950908166773783430, 0.950923639244886760, 0.950939109338681090, 0.950954577055127650, 0.950970042394187810, +0.950985505355823050, 0.951000965939994280, 0.951016424146663100, 0.951031879975790860, 0.951047333427338940, 0.951062784501268690, 0.951078233197541370, 0.951093679516118900, +0.951109123456961860, 0.951124565020032060, 0.951140004205290770, 0.951155441012699550, 0.951170875442219680, 0.951186307493812610, 0.951201737167439830, 0.951217164463062930, +0.951232589380642920, 0.951248011920141410, 0.951263432081519870, 0.951278849864739650, 0.951294265269762460, 0.951309678296549550, 0.951325088945062400, 0.951340497215262810, +0.951355903107111710, 0.951371306620570900, 0.951386707755601750, 0.951402106512165950, 0.951417502890224750, 0.951432896889739870, 0.951448288510672980, 0.951463677752985130, +0.951479064616638110, 0.951494449101593310, 0.951509831207812520, 0.951525210935257100, 0.951540588283888660, 0.951555963253668760, 0.951571335844559220, 0.951586706056521070, +0.951602073889516120, 0.951617439343505960, 0.951632802418452270, 0.951648163114316550, 0.951663521431060480, 0.951678877368645540, 0.951694230927033650, 0.951709582106185950, +0.951724930906064360, 0.951740277326630360, 0.951755621367845750, 0.951770963029672010, 0.951786302312070840, 0.951801639215004270, 0.951816973738433210, 0.951832305882319820, +0.951847635646625670, 0.951862963031312460, 0.951878288036341670, 0.951893610661675330, 0.951908930907274910, 0.951924248773102440, 0.951939564259119080, 0.951954877365286830, +0.951970188091567300, 0.951985496437922410, 0.952000802404313730, 0.952016105990702970, 0.952031407197052370, 0.952046706023322860, 0.952062002469476590, 0.952077296535475350, +0.952092588221280960, 0.952107877526855000, 0.952123164452159280, 0.952138448997155720, 0.952153731161806350, 0.952169010946072310, 0.952184288349915860, 0.952199563373298590, +0.952214836016182400, 0.952230106278529220, 0.952245374160300640, 0.952260639661458690, 0.952275902781965390, 0.952291163521782110, 0.952306421880870890, 0.952321677859193640, +0.952336931456712170, 0.952352182673388390, 0.952367431509184130, 0.952382677964061620, 0.952397922037982130, 0.952413163730907790, 0.952428403042800520, 0.952443639973622250, +0.952458874523335000, 0.952474106691900470, 0.952489336479280690, 0.952504563885437800, 0.952519788910333290, 0.952535011553929280, 0.952550231816187700, 0.952565449697070580, +0.952580665196539830, 0.952595878314557390, 0.952611089051085380, 0.952626297406085840, 0.952641503379520250, 0.952656706971350850, 0.952671908181539790, 0.952687107010048990, +0.952702303456840370, 0.952717497521875960, 0.952732689205118110, 0.952747878506528200, 0.952763065426068700, 0.952778249963701530, 0.952793432119388610, 0.952808611893092180, +0.952823789284774290, 0.952838964294396850, 0.952854136921922330, 0.952869307167312110, 0.952884475030528750, 0.952899640511534090, 0.952914803610290350, 0.952929964326759690, +0.952945122660904030, 0.952960278612685840, 0.952975432182066710, 0.952990583369008990, 0.953005732173474730, 0.953020878595426280, 0.953036022634825560, 0.953051164291634830, +0.953066303565816120, 0.953081440457331900, 0.953096574966143860, 0.953111707092214490, 0.953126836835505700, 0.953141964195979850, 0.953157089173599090, 0.953172211768325670, +0.953187331980121730, 0.953202449808949640, 0.953217565254771190, 0.953232678317548880, 0.953247788997244830, 0.953262897293821300, 0.953278003207240540, 0.953293106737464700, +0.953308207884456470, 0.953323306648177440, 0.953338403028590080, 0.953353497025656750, 0.953368588639339710, 0.953383677869601100, 0.953398764716403390, 0.953413849179708730, +0.953428931259479700, 0.953444010955678100, 0.953459088268266530, 0.953474163197207130, 0.953489235742462360, 0.953504305903994600, 0.953519373681765980, 0.953534439075739200, +0.953549502085875970, 0.953564562712139070, 0.953579620954490780, 0.953594676812893450, 0.953609730287309440, 0.953624781377701010, 0.953639830084030750, 0.953654876406261120, +0.953669920344354050, 0.953684961898272120, 0.953700001067977810, 0.953715037853433590, 0.953730072254601600, 0.953745104271444540, 0.953760133903924780, 0.953775161152004890, +0.953790186015646800, 0.953805208494813320, 0.953820228589466690, 0.953835246299569620, 0.953850261625084350, 0.953865274565973480, 0.953880285122199690, 0.953895293293724910, +0.953910299080511840, 0.953925302482523050, 0.953940303499721030, 0.953955302132068250, 0.953970298379527290, 0.953985292242060410, 0.954000283719630750, 0.954015272812200000, +0.954030259519731080, 0.954045243842186470, 0.954060225779528870, 0.954075205331720630, 0.954090182498724460, 0.954105157280502710, 0.954120129677018420, 0.954135099688233510, +0.954150067314110780, 0.954165032554613050, 0.954179995409702550, 0.954194955879342220, 0.954209913963494420, 0.954224869662122170, 0.954239822975187390, 0.954254773902653120, +0.954269722444481830, 0.954284668600636320, 0.954299612371079080, 0.954314553755772900, 0.954329492754680260, 0.954344429367764090, 0.954359363594986740, 0.954374295436310920, +0.954389224891699310, 0.954404151961114610, 0.954419076644519640, 0.954433998941876970, 0.954448918853149530, 0.954463836378299460, 0.954478751517289890, 0.954493664270083420, +0.954508574636642850, 0.954523482616930760, 0.954538388210909970, 0.954553291418543280, 0.954568192239793500, 0.954583090674623100, 0.954597986722994900, 0.954612880384871800, +0.954627771660216400, 0.954642660548991610, 0.954657547051160240, 0.954672431166684880, 0.954687312895528770, 0.954702192237654180, 0.954717069193024010, 0.954731943761601200, +0.954746815943348540, 0.954761685738228840, 0.954776553146205020, 0.954791418167239890, 0.954806280801296150, 0.954821141048336600, 0.954835998908324160, 0.954850854381221750, +0.954865707466992290, 0.954880558165598470, 0.954895406477003220, 0.954910252401169780, 0.954925095938060520, 0.954939937087638360, 0.954954775849866540, 0.954969612224707660, +0.954984446212124750, 0.954999277812080720, 0.955014107024538590, 0.955028933849461300, 0.955043758286811540, 0.955058580336552330, 0.955073399998646710, 0.955088217273057590, +0.955103032159747900, 0.955117844658680660, 0.955132654769819010, 0.955147462493125540, 0.955162267828563280, 0.955177070776095480, 0.955191871335684950, 0.955206669507294830, +0.955221465290887920, 0.955236258686427360, 0.955251049693876530, 0.955265838313197670, 0.955280624544354360, 0.955295408387309310, 0.955310189842025870, 0.955324968908466960, +0.955339745586595510, 0.955354519876375100, 0.955369291777768080, 0.955384061290737830, 0.955398828415247370, 0.955413593151259950, 0.955428355498738390, 0.955443115457646040, +0.955457873027945940, 0.955472628209601330, 0.955487381002575020, 0.955502131406830160, 0.955516879422329990, 0.955531625049037550, 0.955546368286916190, 0.955561109135928840, +0.955575847596038640, 0.955590583667209170, 0.955605317349403020, 0.955620048642583430, 0.955634777546713890, 0.955649504061757300, 0.955664228187676930, 0.955678949924436030, +0.955693669271998060, 0.955708386230325610, 0.955723100799382270, 0.955737812979131070, 0.955752522769535370, 0.955767230170558420, 0.955781935182163370, 0.955796637804313450, +0.955811338036972160, 0.955826035880102290, 0.955840731333667430, 0.955855424397630600, 0.955870115071955300, 0.955884803356604750, 0.955899489251542110, 0.955914172756730740, +0.955928853872134220, 0.955943532597715360, 0.955958208933437640, 0.955972882879264300, 0.955987554435158930, 0.956002223601084560, 0.956016890377004660, 0.956031554762882710, +0.956046216758681730, 0.956060876364365210, 0.956075533579896390, 0.956090188405238850, 0.956104840840355740, 0.956119490885210640, 0.956134138539766700, 0.956148783803987710, +0.956163426677836600, 0.956178067161276850, 0.956192705254271910, 0.956207340956785170, 0.956221974268780190, 0.956236605190220130, 0.956251233721068910, 0.956265859861289420, +0.956280483610845170, 0.956295104969699720, 0.956309723937816550, 0.956324340515159020, 0.956338954701690720, 0.956353566497375020, 0.956368175902175600, 0.956382782916055500, +0.956397387538978410, 0.956411989770907910, 0.956426589611807380, 0.956441187061640500, 0.956455782120370520, 0.956470374787961150, 0.956484965064376080, 0.956499552949578340, +0.956514138443531730, 0.956528721546199830, 0.956543302257546020, 0.956557880577533990, 0.956572456506127320, 0.956587030043289710, 0.956601601188984190, 0.956616169943174780, +0.956630736305824960, 0.956645300276898200, 0.956659861856358320, 0.956674421044168670, 0.956688977840293050, 0.956703532244695180, 0.956718084257338290, 0.956732633878186080, +0.956747181107202360, 0.956761725944350720, 0.956776268389594730, 0.956790808442897990, 0.956805346104224300, 0.956819881373537570, 0.956834414250800850, 0.956848944735978040, +0.956863472829032840, 0.956877998529929050, 0.956892521838630160, 0.956907042755100080, 0.956921561279302610, 0.956936077411200900, 0.956950591150759090, 0.956965102497940760, +0.956979611452709710, 0.956994118015029650, 0.957008622184864270, 0.957023123962177260, 0.957037623346932760, 0.957052120339094040, 0.957066614938624880, 0.957081107145489220, +0.957095596959650850, 0.957110084381073370, 0.957124569409720790, 0.957139052045557050, 0.957153532288545380, 0.957168010138649830, 0.957182485595834300, 0.957196958660062600, +0.957211429331298440, 0.957225897609505720, 0.957240363494648250, 0.957254826986690180, 0.957269288085594750, 0.957283746791326110, 0.957298203103848060, 0.957312657023124510, +0.957327108549119400, 0.957341557681796520, 0.957356004421119680, 0.957370448767053020, 0.957384890719560120, 0.957399330278604910, 0.957413767444151410, 0.957428202216163540, +0.957442634594604990, 0.957457064579440020, 0.957471492170632650, 0.957485917368146140, 0.957500340171944960, 0.957514760581992920, 0.957529178598253930, 0.957543594220692020, +0.957558007449271220, 0.957572418283955340, 0.957586826724708630, 0.957601232771494560, 0.957615636424277490, 0.957630037683021350, 0.957644436547690050, 0.957658833018247610, +0.957673227094658190, 0.957687618776885690, 0.957702008064894360, 0.957716394958647800, 0.957730779458110250, 0.957745161563245630, 0.957759541274018300, 0.957773918590391960, +0.957788293512330860, 0.957802666039799360, 0.957817036172760930, 0.957831403911179820, 0.957845769255020190, 0.957860132204246260, 0.957874492758821970, 0.957888850918711340, +0.957903206683878630, 0.957917560054288190, 0.957931911029903600, 0.957946259610689240, 0.957960605796609240, 0.957974949587627740, 0.957989290983708770, 0.958003629984816700, +0.958017966590915650, 0.958032300801969550, 0.958046632617942650, 0.958060962038799200, 0.958075289064503340, 0.958089613695019330, 0.958103935930311180, 0.958118255770343150, +0.958132573215079830, 0.958146888264484800, 0.958161200918522530, 0.958175511177157270, 0.958189819040353270, 0.958204124508074680, 0.958218427580285860, 0.958232728256950830, +0.958247026538034290, 0.958261322423500040, 0.958275615913312340, 0.958289907007435660, 0.958304195705834250, 0.958318482008472250, 0.958332765915314130, 0.958347047426324260, +0.958361326541466660, 0.958375603260705590, 0.958389877584005620, 0.958404149511330910, 0.958418419042645800, 0.958432686177914770, 0.958446950917101860, 0.958461213260171970, +0.958475473207088700, 0.958489730757816740, 0.958503985912320560, 0.958518238670564290, 0.958532489032512540, 0.958546736998129420, 0.958560982567379870, 0.958575225740227470, +0.958589466516637120, 0.958603704896572980, 0.958617940879999740, 0.958632174466881540, 0.958646405657182950, 0.958660634450868350, 0.958674860847902320, 0.958689084848249000, +0.958703306451872960, 0.958717525658738580, 0.958731742468810430, 0.958745956882052890, 0.958760168898430520, 0.958774378517907700, 0.958788585740449120, 0.958802790566018910, +0.958816992994581780, 0.958831193026102090, 0.958845390660544420, 0.958859585897873230, 0.958873778738053130, 0.958887969181048790, 0.958902157226824370, 0.958916342875344440, +0.958930526126573700, 0.958944706980476620, 0.958958885437017900, 0.958973061496161790, 0.958987235157873210, 0.959001406422116620, 0.959015575288856390, 0.959029741758057110, +0.959043905829683570, 0.959058067503700260, 0.959072226780071760, 0.959086383658762640, 0.959100538139737610, 0.959114690222961470, 0.959128839908398370, 0.959142987196013210, +0.959157132085770580, 0.959171274577635070, 0.959185414671571370, 0.959199552367544170, 0.959213687665518290, 0.959227820565457970, 0.959241951067328120, 0.959256079171093350, +0.959270204876718440, 0.959284328184167980, 0.959298449093406670, 0.959312567604399310, 0.959326683717110720, 0.959340797431505240, 0.959354908747547700, 0.959369017665202880, +0.959383124184435610, 0.959397228305210460, 0.959411330027492240, 0.959425429351245970, 0.959439526276435810, 0.959453620803026870, 0.959467712930983870, 0.959481802660271610, +0.959495889990854890, 0.959509974922698410, 0.959524057455766970, 0.959538137590025710, 0.959552215325438770, 0.959566290661971300, 0.959580363599588090, 0.959594434138254070, +0.959608502277933930, 0.959622568018592470, 0.959636631360194610, 0.959650692302705390, 0.959664750846089270, 0.959678806990311270, 0.959692860735336220, 0.959706912081129020, +0.959720961027654470, 0.959735007574877620, 0.959749051722763480, 0.959763093471276530, 0.959777132820381680, 0.959791169770044080, 0.959805204320228640, 0.959819236470900060, +0.959833266222023470, 0.959847293573563690, 0.959861318525485950, 0.959875341077754630, 0.959889361230334970, 0.959903378983191890, 0.959917394336290420, 0.959931407289595360, +0.959945417843071860, 0.959959425996684820, 0.959973431750399400, 0.959987435104180160, 0.960001436057992490, 0.960015434611801060, 0.960029430765571120, 0.960043424519267500, +0.960057415872855420, 0.960071404826300050, 0.960085391379565940, 0.960099375532618260, 0.960113357285422240, 0.960127336637942700, 0.960141313590144870, 0.960155288141993800, +0.960169260293454510, 0.960183230044492350, 0.960197197395071810, 0.960211162345158240, 0.960225124894716900, 0.960239085043712580, 0.960253042792110660, 0.960266998139876040, +0.960280951086974310, 0.960294901633369840, 0.960308849779028200, 0.960322795523914310, 0.960336738867993530, 0.960350679811230900, 0.960364618353591550, 0.960378554495040730, +0.960392488235543680, 0.960406419575065120, 0.960420348513570610, 0.960434275051025190, 0.960448199187394100, 0.960462120922642490, 0.960476040256735610, 0.960489957189638590, +0.960503871721316900, 0.960517783851735360, 0.960531693580859320, 0.960545600908654040, 0.960559505835084760, 0.960573408360116730, 0.960587308483715210, 0.960601206205845660, +0.960615101526472780, 0.960628994445562270, 0.960642884963079150, 0.960656773078988890, 0.960670658793256640, 0.960684542105847750, 0.960698423016727590, 0.960712301525861510, +0.960726177633214550, 0.960740051338752070, 0.960753922642439420, 0.960767791544241970, 0.960781658044125080, 0.960795522142054100, 0.960809383837994300, 0.960823243131911250, +0.960837100023769760, 0.960850954513535640, 0.960864806601174130, 0.960878656286650590, 0.960892503569930390, 0.960906348450978890, 0.960920190929761890, 0.960934031006244080, +0.960947868680391170, 0.960961703952168620, 0.960975536821541800, 0.960989367288476170, 0.961003195352937100, 0.961017021014890060, 0.961030844274300630, 0.961044665131133960, +0.961058483585355620, 0.961072299636930970, 0.961086113285825610, 0.961099924532004990, 0.961113733375434600, 0.961127539816080120, 0.961141343853906480, 0.961155145488879480, +0.961168944720964700, 0.961182741550127510, 0.961196535976333480, 0.961210327999547980, 0.961224117619736810, 0.961237904836865550, 0.961251689650899350, 0.961265472061803790, +0.961279252069544680, 0.961293029674087360, 0.961306804875397440, 0.961320577673440590, 0.961334348068182300, 0.961348116059588360, 0.961361881647623820, 0.961375644832254680, +0.961389405613446320, 0.961403163991164540, 0.961416919965374820, 0.961430673536042830, 0.961444424703134290, 0.961458173466614550, 0.961471919826449420, 0.961485663782604360, +0.961499405335045190, 0.961513144483737480, 0.961526881228647050, 0.961540615569739240, 0.961554347506980210, 0.961568077040335090, 0.961581804169769790, 0.961595528895249910, +0.961609251216741230, 0.961622971134209470, 0.961636688647620310, 0.961650403756939330, 0.961664116462132570, 0.961677826763165380, 0.961691534660003570, 0.961705240152612940, +0.961718943240959190, 0.961732643925008120, 0.961746342204725320, 0.961760038080077040, 0.961773731551028410, 0.961787422617545350, 0.961801111279593890, 0.961814797537139500, +0.961828481390148200, 0.961842162838585700, 0.961855841882417790, 0.961869518521610510, 0.961883192756129210, 0.961896864585939810, 0.961910534011008340, 0.961924201031300610, +0.961937865646782300, 0.961951527857419330, 0.961965187663177850, 0.961978845064022980, 0.961992500059921210, 0.962006152650838110, 0.962019802836739600, 0.962033450617591600, +0.962047095993359910, 0.962060738964010560, 0.962074379529509580, 0.962088017689822440, 0.962101653444915160, 0.962115286794753890, 0.962128917739304310, 0.962142546278532460, +0.962156172412404250, 0.962169796140885600, 0.962183417463942650, 0.962197036381540970, 0.962210652893646710, 0.962224267000225900, 0.962237878701244220, 0.962251487996668040, +0.962265094886463060, 0.962278699370595510, 0.962292301449031110, 0.962305901121735860, 0.962319498388675920, 0.962333093249817200, 0.962346685705125720, 0.962360275754567510, +0.962373863398108710, 0.962387448635715460, 0.962401031467353230, 0.962414611892988600, 0.962428189912587270, 0.962441765526115600, 0.962455338733539500, 0.962468909534825000, +0.962482477929938460, 0.962496043918845580, 0.962509607501512490, 0.962523168677905440, 0.962536727447990460, 0.962550283811733580, 0.962563837769101040, 0.962577389320058980, +0.962590938464573660, 0.962604485202610660, 0.962618029534136550, 0.962631571459117370, 0.962645110977519150, 0.962658648089308230, 0.962672182794450770, 0.962685715092912670, +0.962699244984660640, 0.962712772469660250, 0.962726297547877970, 0.962739820219279840, 0.962753340483832210, 0.962766858341501330, 0.962780373792253120, 0.962793886836054380, +0.962807397472870590, 0.962820905702668320, 0.962834411525413820, 0.962847914941073250, 0.962861415949612940, 0.962874914550999050, 0.962888410745197820, 0.962901904532175950, +0.962915395911899010, 0.962928884884333480, 0.962942371449445830, 0.962955855607202320, 0.962969337357569070, 0.962982816700512450, 0.962996293635998920, 0.963009768163994750, +0.963023240284466060, 0.963036709997379110, 0.963050177302700480, 0.963063642200396420, 0.963077104690433280, 0.963090564772777320, 0.963104022447395240, 0.963117477714252820, +0.963130930573316670, 0.963144381024553240, 0.963157829067928910, 0.963171274703409910, 0.963184717930962830, 0.963198158750553810, 0.963211597162149770, 0.963225033165716390, +0.963238466761220490, 0.963251897948628420, 0.963265326727906660, 0.963278753099021560, 0.963292177061939480, 0.963305598616627230, 0.963319017763050840, 0.963332434501176890, +0.963345848830971740, 0.963359260752402080, 0.963372670265434160, 0.963386077370034680, 0.963399482066169990, 0.963412884353806790, 0.963426284232911100, 0.963439681703449740, +0.963453076765389270, 0.963466469418695960, 0.963479859663336600, 0.963493247499277450, 0.963506632926485310, 0.963520015944926760, 0.963533396554567930, 0.963546774755375650, +0.963560150547316470, 0.963573523930356890, 0.963586894904463480, 0.963600263469602810, 0.963613629625741710, 0.963626993372846300, 0.963640354710883380, 0.963653713639819660, +0.963667070159621610, 0.963680424270255910, 0.963693775971689150, 0.963707125263887910, 0.963720472146819110, 0.963733816620448990, 0.963747158684744250, 0.963760498339671590, +0.963773835585197690, 0.963787170421289250, 0.963800502847912850, 0.963813832865035190, 0.963827160472623180, 0.963840485670642950, 0.963853808459061660, 0.963867128837845750, +0.963880446806962050, 0.963893762366377250, 0.963907075516058030, 0.963920386255971320, 0.963933694586083470, 0.963947000506361400, 0.963960304016771800, 0.963973605117281360, +0.963986903807857010, 0.964000200088465430, 0.964013493959073210, 0.964026785419647590, 0.964040074470154720, 0.964053361110561720, 0.964066645340835300, 0.964079927160942260, +0.964093206570849400, 0.964106483570523530, 0.964119758159931670, 0.964133030339040300, 0.964146300107816210, 0.964159567466226440, 0.964172832414237680, 0.964186094951816840, +0.964199355078930840, 0.964212612795546380, 0.964225868101630690, 0.964239120997150030, 0.964252371482071660, 0.964265619556362360, 0.964278865219988960, 0.964292108472918350, +0.964305349315117470, 0.964318587746553320, 0.964331823767192840, 0.964345057377002600, 0.964358288575949740, 0.964371517364001170, 0.964384743741123710, 0.964397967707284480, +0.964411189262450290, 0.964424408406588380, 0.964437625139665240, 0.964450839461648000, 0.964464051372503680, 0.964477260872199200, 0.964490467960701700, 0.964503672637977870, +0.964516874903994960, 0.964530074758719990, 0.964543272202119660, 0.964556467234161220, 0.964569659854811470, 0.964582850064037660, 0.964596037861806700, 0.964609223248085730, +0.964622406222841570, 0.964635586786041670, 0.964648764937652610, 0.964661940677641660, 0.964675114005975830, 0.964688284922622150, 0.964701453427547870, 0.964714619520719910, +0.964727783202105620, 0.964740944471671580, 0.964754103329385270, 0.964767259775213600, 0.964780413809123940, 0.964793565431083080, 0.964806714641058380, 0.964819861439016990, +0.964833005824926040, 0.964846147798752440, 0.964859287360463340, 0.964872424510026190, 0.964885559247407820, 0.964898691572575680, 0.964911821485496700, 0.964924948986138450, +0.964938074074467630, 0.964951196750451600, 0.964964317014057600, 0.964977434865252780, 0.964990550304004380, 0.965003663330279650, 0.965016773944045610, 0.965029882145270080, +0.965042987933919520, 0.965056091309961390, 0.965069192273363190, 0.965082290824091920, 0.965095386962114940, 0.965108480687399520, 0.965121571999912890, 0.965134660899622520, +0.965147747386495230, 0.965160831460498690, 0.965173913121599950, 0.965186992369766570, 0.965200069204965590, 0.965213143627164480, 0.965226215636330710, 0.965239285232431300, +0.965252352415433500, 0.965265417185304900, 0.965278479542012850, 0.965291539485524490, 0.965304597015807290, 0.965317652132828610, 0.965330704836556030, 0.965343755126956470, +0.965356803003997510, 0.965369848467646510, 0.965382891517870930, 0.965395932154638150, 0.965408970377915510, 0.965422006187670380, 0.965435039583870560, 0.965448070566482850, +0.965461099135475060, 0.965474125290814440, 0.965487149032468460, 0.965500170360404700, 0.965513189274590510, 0.965526205774993600, 0.965539219861580870, 0.965552231534320130, +0.965565240793178740, 0.965578247638124280, 0.965591252069124220, 0.965604254086146140, 0.965617253689157300, 0.965630250878125600, 0.965643245653017960, 0.965656238013802290, +0.965669227960445960, 0.965682215492916660, 0.965695200611181750, 0.965708183315208910, 0.965721163604965740, 0.965734141480419470, 0.965747116941537920, 0.965760089988288440, +0.965773060620638830, 0.965786028838556580, 0.965798994642009250, 0.965811958030964420, 0.965824919005389910, 0.965837877565252860, 0.965850833710521160, 0.965863787441162300, +0.965876738757144080, 0.965889687658433970, 0.965902634144999660, 0.965915578216808730, 0.965928519873828990, 0.965941459116027910, 0.965954395943373070, 0.965967330355832270, +0.965980262353373090, 0.965993191935963340, 0.966006119103570590, 0.966019043856162770, 0.966031966193707130, 0.966044886116171450, 0.966057803623523670, 0.966070718715731360, +0.966083631392762320, 0.966096541654584140, 0.966109449501164620, 0.966122354932471670, 0.966135257948472550, 0.966148158549135380, 0.966161056734427870, 0.966173952504317590, +0.966186845858772460, 0.966199736797760280, 0.966212625321248960, 0.966225511429205760, 0.966238395121598930, 0.966251276398396030, 0.966264155259564880, 0.966277031705073400, +0.966289905734889380, 0.966302777348980620, 0.966315646547315050, 0.966328513329860140, 0.966341377696584010, 0.966354239647454480, 0.966367099182439240, 0.966379956301506300, +0.966392811004623490, 0.966405663291758590, 0.966418513162879740, 0.966431360617954540, 0.966444205656950770, 0.966457048279836580, 0.966469888486579780, 0.966482726277148150, +0.966495561651509850, 0.966508394609632780, 0.966521225151484530, 0.966534053277033230, 0.966546878986246690, 0.966559702279093050, 0.966572523155540210, 0.966585341615555980, +0.966598157659108390, 0.966610971286165690, 0.966623782496695230, 0.966636591290665370, 0.966649397668044030, 0.966662201628799230, 0.966675003172898890, 0.966687802300311150, +0.966700599011003800, 0.966713393304945210, 0.966726185182102850, 0.966738974642445070, 0.966751761685939790, 0.966764546312555260, 0.966777328522259280, 0.966790108315019990, +0.966802885690805640, 0.966815660649583800, 0.966828433191322830, 0.966841203315990880, 0.966853971023555860, 0.966866736313985900, 0.966879499187249030, 0.966892259643313490, +0.966905017682147540, 0.966917773303718860, 0.966930526507995710, 0.966943277294946220, 0.966956025664538530, 0.966968771616740770, 0.966981515151521090, 0.966994256268847830, +0.967006994968688800, 0.967019731251012150, 0.967032465115786220, 0.967045196562979160, 0.967057925592559100, 0.967070652204494290, 0.967083376398752750, 0.967096098175303060, +0.967108817534112820, 0.967121534475150590, 0.967134248998384520, 0.967146961103782840, 0.967159670791313710, 0.967172378060945470, 0.967185082912646270, 0.967197785346384560, +0.967210485362128170, 0.967223182959845550, 0.967235878139504960, 0.967248570901074740, 0.967261261244523050, 0.967273949169818240, 0.967286634676928770, 0.967299317765822450, +0.967311998436467870, 0.967324676688833260, 0.967337352522887000, 0.967350025938597420, 0.967362696935932690, 0.967375365514861250, 0.967388031675351590, 0.967400695417371610, +0.967413356740889910, 0.967426015645874830, 0.967438672132294730, 0.967451326200117980, 0.967463977849312820, 0.967476627079847830, 0.967489273891691370, 0.967501918284811580, +0.967514560259176930, 0.967527199814755990, 0.967539836951516910, 0.967552471669428370, 0.967565103968458630, 0.967577733848576260, 0.967590361309749400, 0.967602986351946640, +0.967615608975136430, 0.967628229179287150, 0.967640846964367360, 0.967653462330345440, 0.967666075277189730, 0.967678685804869270, 0.967691293913351740, 0.967703899602605940, +0.967716502872600470, 0.967729103723303790, 0.967741702154684250, 0.967754298166710550, 0.967766891759351270, 0.967779482932574540, 0.967792071686349060, 0.967804658020643420, +0.967817241935426180, 0.967829823430665810, 0.967842402506330910, 0.967854979162389940, 0.967867553398811810, 0.967880125215564550, 0.967892694612616960, 0.967905261589937730, +0.967917826147495220, 0.967930388285258240, 0.967942948003195250, 0.967955505301274830, 0.967968060179465910, 0.967980612637736600, 0.967993162676055840, 0.968005710294392090, +0.968018255492714140, 0.968030798270990480, 0.968043338629189900, 0.968055876567281090, 0.968068412085232530, 0.968080945183012800, 0.968093475860590800, 0.968106004117935020, +0.968118529955014240, 0.968131053371797170, 0.968143574368252490, 0.968156092944349010, 0.968168609100055200, 0.968181122835339750, 0.968193634150171570, 0.968206143044519240, +0.968218649518351680, 0.968231153571637360, 0.968243655204345190, 0.968256154416444190, 0.968268651207902510, 0.968281145578689160, 0.968293637528772950, 0.968306127058122690, +0.968318614166707170, 0.968331098854495090, 0.968343581121455350, 0.968356060967556550, 0.968368538392767600, 0.968381013397057290, 0.968393485980394430, 0.968405956142747940, +0.968418423884086500, 0.968430889204378920, 0.968443352103594450, 0.968455812581701330, 0.968468270638668690, 0.968480726274465460, 0.968493179489060330, 0.968505630282422200, +0.968518078654520000, 0.968530524605322960, 0.968542968134799230, 0.968555409242918160, 0.968567847929648560, 0.968580284194959340, 0.968592718038819410, 0.968605149461197690, +0.968617578462063090, 0.968630005041384750, 0.968642429199131240, 0.968654850935271590, 0.968667270249774840, 0.968679687142609880, 0.968692101613745750, 0.968704513663151360, +0.968716923290795620, 0.968729330496647890, 0.968741735280676530, 0.968754137642850900, 0.968766537583139910, 0.968778935101512580, 0.968791330197937840, 0.968803722872384920, +0.968816113124822740, 0.968828500955220220, 0.968840886363546370, 0.968853269349770230, 0.968865649913861040, 0.968878028055787710, 0.968890403775519270, 0.968902777073024860, +0.968915147948273600, 0.968927516401234420, 0.968939882431876340, 0.968952246040168610, 0.968964607226080240, 0.968976965989580390, 0.968989322330638060, 0.969001676249222510, +0.969014027745302870, 0.969026376818848070, 0.969038723469827220, 0.969051067698209700, 0.969063409503964410, 0.969075748887060610, 0.969088085847467420, 0.969100420385154200, +0.969112752500089770, 0.969125082192243470, 0.969137409461584440, 0.969149734308081930, 0.969162056731705080, 0.969174376732423020, 0.969186694310205100, 0.969199009465020580, +0.969211322196838370, 0.969223632505627820, 0.969235940391358190, 0.969248245853998820, 0.969260548893518650, 0.969272849509887240, 0.969285147703073950, 0.969297443473047470, +0.969309736819777390, 0.969322027743233060, 0.969334316243383620, 0.969346602320198310, 0.969358885973646610, 0.969371167203697650, 0.969383446010321000, 0.969395722393485480, +0.969407996353160660, 0.969420267889315900, 0.969432537001920450, 0.969444803690943660, 0.969457067956354780, 0.969469329798123390, 0.969481589216218740, 0.969493846210609970, +0.969506100781266640, 0.969518352928157910, 0.969530602651253460, 0.969542849950522420, 0.969555094825934270, 0.969567337277458590, 0.969579577305064280, 0.969591814908721150, +0.969604050088398450, 0.969616282844065650, 0.969628513175692100, 0.969640741083247270, 0.969652966566700520, 0.969665189626021660, 0.969677410261179600, 0.969689628472144020, +0.969701844258884280, 0.969714057621370080, 0.969726268559570670, 0.969738477073455510, 0.969750683162994510, 0.969762886828156480, 0.969775088068911330, 0.969787286885228420, +0.969799483277077210, 0.969811677244427410, 0.969823868787248360, 0.969836057905509640, 0.969848244599180950, 0.969860428868231540, 0.969872610712630980, 0.969884790132348850, +0.969896967127354850, 0.969909141697618440, 0.969921313843109090, 0.969933483563796490, 0.969945650859650340, 0.969957815730639990, 0.969969978176735030, 0.969982138197905130, +0.969994295794119780, 0.970006450965348770, 0.970018603711561680, 0.970030754032728320, 0.970042901928817700, 0.970055047399799970, 0.970067190445644600, 0.970079331066321160, +0.970091469261799570, 0.970103605032049180, 0.970115738377039790, 0.970127869296741220, 0.970139997791122920, 0.970152123860154480, 0.970164247503805810, 0.970176368722046490, +0.970188487514846210, 0.970200603882174770, 0.970212717824001760, 0.970224829340297190, 0.970236938431030430, 0.970249045096171270, 0.970261149335689410, 0.970273251149554760, +0.970285350537737010, 0.970297447500205750, 0.970309542036931210, 0.970321634147882640, 0.970333723833029850, 0.970345811092342860, 0.970357895925791250, 0.970369978333344930, +0.970382058314973710, 0.970394135870647380, 0.970406211000335750, 0.970418283704008510, 0.970430353981635570, 0.970442421833186740, 0.970454487258631810, 0.970466550257940710, +0.970478610831083220, 0.970490668978029380, 0.970502724698748650, 0.970514777993211180, 0.970526828861386750, 0.970538877303245170, 0.970550923318756480, 0.970562966907890460, +0.970575008070617030, 0.970587046806906220, 0.970599083116727710, 0.970611117000051430, 0.970623148456847270, 0.970635177487085390, 0.970647204090735460, 0.970659228267767630, +0.970671250018151580, 0.970683269341857780, 0.970695286238855480, 0.970707300709114930, 0.970719312752606260, 0.970731322369299270, 0.970743329559163870, 0.970755334322170200, +0.970767336658288520, 0.970779336567488160, 0.970791334049739500, 0.970803329105012550, 0.970815321733277230, 0.970827311934503560, 0.970839299708661670, 0.970851285055721490, +0.970863267975653370, 0.970875248468426880, 0.970887226534012160, 0.970899202172379460, 0.970911175383498690, 0.970923146167340100, 0.970935114523873600, 0.970947080453069210, +0.970959043954897410, 0.970971005029327760, 0.970982963676330630, 0.970994919895876160, 0.971006873687934260, 0.971018825052475280, 0.971030773989469130, 0.971042720498886400, +0.971054664580696560, 0.971066606234870070, 0.971078545461377060, 0.971090482260187680, 0.971102416631272170, 0.971114348574600550, 0.971126278090143070, 0.971138205177870080, +0.971150129837751400, 0.971162052069757360, 0.971173971873858230, 0.971185889250024140, 0.971197804198225320, 0.971209716718432040, 0.971221626810614640, 0.971233534474743030, +0.971245439710787470, 0.971257342518718430, 0.971269242898506020, 0.971281140850120410, 0.971293036373532040, 0.971304929468711050, 0.971316820135627920, 0.971328708374252560, +0.971340594184555430, 0.971352477566506780, 0.971364358520076960, 0.971376237045236230, 0.971388113141954950, 0.971399986810203340, 0.971411858049952000, 0.971423726861170730, +0.971435593243830220, 0.971447457197900710, 0.971459318723352560, 0.971471177820156130, 0.971483034488281770, 0.971494888727700070, 0.971506740538380820, 0.971518589920294830, +0.971530436873412230, 0.971542281397703710, 0.971554123493139300, 0.971565963159689680, 0.971577800397325220, 0.971589635206016380, 0.971601467585733290, 0.971613297536446430, +0.971625125058126480, 0.971636950150743580, 0.971648772814268420, 0.971660593048671250, 0.971672410853922640, 0.971684226229993180, 0.971696039176852990, 0.971707849694472660, +0.971719657782822770, 0.971731463441873670, 0.971743266671595940, 0.971755067471959940, 0.971766865842936590, 0.971778661784495900, 0.971790455296608460, 0.971802246379244950, +0.971814035032375840, 0.971825821255971610, 0.971837605050002720, 0.971849386414439960, 0.971861165349253930, 0.971872941854414750, 0.971884715929893230, 0.971896487575659940, +0.971908256791685350, 0.971920023577940160, 0.971931787934394940, 0.971943549861020380, 0.971955309357786850, 0.971967066424665020, 0.971978821061625480, 0.971990573268638910, +0.972002323045675910, 0.972014070392707040, 0.972025815309703110, 0.972037557796634810, 0.972049297853472380, 0.972061035480186630, 0.972072770676748470, 0.972084503443128240, +0.972096233779296770, 0.972107961685224730, 0.972119687160882820, 0.972131410206241940, 0.972143130821272240, 0.972154849005944730, 0.972166564760230110, 0.972178278084099070, +0.972189988977522400, 0.972201697440470690, 0.972213403472914960, 0.972225107074825570, 0.972236808246173310, 0.972248506986929110, 0.972260203297063530, 0.972271897176547610, +0.972283588625351800, 0.972295277643447140, 0.972306964230804430, 0.972318648387394120, 0.972330330113187150, 0.972342009408154410, 0.972353686272266590, 0.972365360705494510, +0.972377032707809170, 0.972388702279181170, 0.972400369419581630, 0.972412034128980920, 0.972423696407350160, 0.972435356254660150, 0.972447013670881820, 0.972458668655985850, +0.972470321209943260, 0.972481971332725070, 0.972493619024301760, 0.972505264284644460, 0.972516907113723960, 0.972528547511511080, 0.972540185477976940, 0.972551821013092340, +0.972563454116828210, 0.972575084789155550, 0.972586713030045070, 0.972598338839467670, 0.972609962217394600, 0.972621583163796540, 0.972633201678644530, 0.972644817761909470, +0.972656431413562620, 0.972668042633574540, 0.972679651421916260, 0.972691257778558920, 0.972702861703473310, 0.972714463196630690, 0.972726062258001840, 0.972737658887557810, +0.972749253085269940, 0.972760844851108700, 0.972772434185045330, 0.972784021087050870, 0.972795605557096320, 0.972807187595152830, 0.972818767201191310, 0.972830344375182900, +0.972841919117098830, 0.972853491426909800, 0.972865061304586940, 0.972876628750101500, 0.972888193763424500, 0.972899756344526970, 0.972911316493380140, 0.972922874209955160, +0.972934429494222710, 0.972945982346154260, 0.972957532765720940, 0.972969080752893680, 0.972980626307643700, 0.972992169429942270, 0.973003710119760280, 0.973015248377069320, +0.973026784201839970, 0.973038317594043690, 0.973049848553651620, 0.973061377080635000, 0.973072903174964860, 0.973084426836612450, 0.973095948065549000, 0.973107466861745870, +0.973118983225173870, 0.973130497155804460, 0.973142008653608670, 0.973153517718557960, 0.973165024350623460, 0.973176528549776430, 0.973188030315988220, 0.973199529649229730, +0.973211026549472450, 0.973222521016687600, 0.973234013050846450, 0.973245502651920340, 0.973256989819880400, 0.973268474554697890, 0.973279956856344500, 0.973291436724791010, +0.973302914160008910, 0.973314389161969550, 0.973325861730644280, 0.973337331866004240, 0.973348799568020890, 0.973360264836665820, 0.973371727671909830, 0.973383188073724480, +0.973394646042081260, 0.973406101576951290, 0.973417554678306150, 0.973429005346117200, 0.973440453580355580, 0.973451899380993190, 0.973463342748000730, 0.973474783681349990, +0.973486222181012220, 0.973497658246958890, 0.973509091879161460, 0.973520523077591290, 0.973531951842219860, 0.973543378173018730, 0.973554802069958920, 0.973566223533012030, +0.973577642562149740, 0.973589059157343280, 0.973600473318564140, 0.973611885045783780, 0.973623294338973990, 0.973634701198105800, 0.973646105623150790, 0.973657507614080540, +0.973668907170866520, 0.973680304293480180, 0.973691698981893120, 0.973703091236076790, 0.973714481056003000, 0.973725868441642770, 0.973737253392967790, 0.973748635909949760, +0.973760015992560120, 0.973771393640770480, 0.973782768854552390, 0.973794141633877450, 0.973805511978717010, 0.973816879889042860, 0.973828245364826480, 0.973839608406039450, +0.973850969012653440, 0.973862327184639940, 0.973873682921970630, 0.973885036224617420, 0.973896387092551330, 0.973907735525744280, 0.973919081524167840, 0.973930425087793820, +0.973941766216593670, 0.973953104910539100, 0.973964441169601790, 0.973975774993753540, 0.973987106382965710, 0.973998435337210090, 0.974009761856458380, 0.974021085940682260, +0.974032407589853430, 0.974043726803943580, 0.974055043582924610, 0.974066357926767770, 0.974077669835445080, 0.974088979308928240, 0.974100286347189040, 0.974111590950198950, +0.974122893117929990, 0.974134192850353740, 0.974145490147442230, 0.974156785009166910, 0.974168077435499490, 0.974179367426411870, 0.974190654981875850, 0.974201940101863230, +0.974213222786345810, 0.974224503035295290, 0.974235780848683670, 0.974247056226482440, 0.974258329168663510, 0.974269599675198770, 0.974280867746060040, 0.974292133381219230, +0.974303396580648020, 0.974314657344318550, 0.974325915672202170, 0.974337171564271020, 0.974348425020496900, 0.974359676040851830, 0.974370924625307500, 0.974382170773835930, +0.974393414486408820, 0.974404655762998400, 0.974415894603576250, 0.974427131008114290, 0.974438364976584430, 0.974449596508958790, 0.974460825605209080, 0.974472052265307310, +0.974483276489225610, 0.974494498276935570, 0.974505717628409210, 0.974516934543618650, 0.974528149022535710, 0.974539361065132390, 0.974550570671380620, 0.974561777841252530, +0.974572982574720030, 0.974584184871755020, 0.974595384732329540, 0.974606582156415490, 0.974617777143985120, 0.974628969695010230, 0.974640159809462950, 0.974651347487315300, +0.974662532728539420, 0.974673715533107000, 0.974684895900990280, 0.974696073832161390, 0.974707249326592250, 0.974718422384255100, 0.974729593005121740, 0.974740761189164750, +0.974751926936355590, 0.974763090246666520, 0.974774251120069880, 0.974785409556537470, 0.974796565556041660, 0.974807719118554350, 0.974818870244047790, 0.974830018932494210, +0.974841165183865430, 0.974852308998133800, 0.974863450375271330, 0.974874589315250170, 0.974885725818042560, 0.974896859883620740, 0.974907991511956730, 0.974919120703022890, +0.974930247456791020, 0.974941371773233590, 0.974952493652322730, 0.974963613094030680, 0.974974730098329470, 0.974985844665191560, 0.974996956794589200, 0.975008066486494180, +0.975019173740879100, 0.975030278557716070, 0.975041380936977230, 0.975052480878635050, 0.975063578382661670, 0.975074673449029320, 0.975085766077710470, 0.975096856268677040, +0.975107944021901480, 0.975119029337355950, 0.975130112215013000, 0.975141192654844670, 0.975152270656823420, 0.975163346220921600, 0.975174419347111240, 0.975185490035364920, +0.975196558285654770, 0.975207624097953360, 0.975218687472232730, 0.975229748408465550, 0.975240806906623850, 0.975251862966680430, 0.975262916588607090, 0.975273967772376520, +0.975285016517960960, 0.975296062825332880, 0.975307106694464630, 0.975318148125328690, 0.975329187117897290, 0.975340223672143130, 0.975351257788038330, 0.975362289465555250, +0.975373318704666480, 0.975384345505344470, 0.975395369867561590, 0.975406391791290180, 0.975417411276503050, 0.975428428323172230, 0.975439442931270380, 0.975450455100769780, +0.975461464831643200, 0.975472472123862900, 0.975483476977401340, 0.975494479392231220, 0.975505479368324990, 0.975516476905654910, 0.975527472004193650, 0.975538464663913700, +0.975549454884787500, 0.975560442666787760, 0.975571428009886940, 0.975582410914057510, 0.975593391379272260, 0.975604369405503320, 0.975615344992723400, 0.975626318140905170, +0.975637288850021210, 0.975648257120043990, 0.975659222950946090, 0.975670186342700310, 0.975681147295278990, 0.975692105808654620, 0.975703061882800090, 0.975714015517687990, +0.975724966713290790, 0.975735915469581050, 0.975746861786531690, 0.975757805664115300, 0.975768747102304210, 0.975779686101071240, 0.975790622660389070, 0.975801556780230280, +0.975812488460567670, 0.975823417701373820, 0.975834344502621630, 0.975845268864283360, 0.975856190786331900, 0.975867110268740070, 0.975878027311480320, 0.975888941914525580, +0.975899854077848520, 0.975910763801421830, 0.975921671085218320, 0.975932575929210570, 0.975943478333371250, 0.975954378297673290, 0.975965275822089470, 0.975976170906592390, +0.975987063551154830, 0.975997953755749600, 0.976008841520349830, 0.976019726844927660, 0.976030609729456210, 0.976041490173908180, 0.976052368178256470, 0.976063243742473770, +0.976074116866533000, 0.976084987550407180, 0.976095855794068660, 0.976106721597490570, 0.976117584960645600, 0.976128445883506670, 0.976139304366046570, 0.976150160408238320, +0.976161014010054620, 0.976171865171468590, 0.976182713892452700, 0.976193560172980090, 0.976204404013023440, 0.976215245412555890, 0.976226084371550230, 0.976236920889979260, +0.976247754967816020, 0.976258586605033620, 0.976269415801604650, 0.976280242557502010, 0.976291066872698840, 0.976301888747167950, 0.976312708180882340, 0.976323525173814930, +0.976334339725938970, 0.976345151837226920, 0.976355961507652030, 0.976366768737187200, 0.976377573525805560, 0.976388375873479820, 0.976399175780183200, 0.976409973245888740, +0.976420768270569450, 0.976431560854198020, 0.976442350996747700, 0.976453138698191610, 0.976463923958502570, 0.976474706777653690, 0.976485487155618110, 0.976496265092368980, +0.976507040587879070, 0.976517813642121420, 0.976528584255069390, 0.976539352426695760, 0.976550118156973790, 0.976560881445876610, 0.976571642293377120, 0.976582400699448790, +0.976593156664064210, 0.976603910187196830, 0.976614661268819570, 0.976625409908905670, 0.976636156107428270, 0.976646899864360480, 0.976657641179675460, 0.976668380053346550, +0.976679116485346440, 0.976689850475648600, 0.976700582024226050, 0.976711311131052140, 0.976722037796099900, 0.976732762019342560, 0.976743483800753490, 0.976754203140305590, +0.976764920037972110, 0.976775634493726400, 0.976786346507541480, 0.976797056079390820, 0.976807763209247450, 0.976818467897084710, 0.976829170142875960, 0.976839869946594110, +0.976850567308212630, 0.976861262227704750, 0.976871954705043620, 0.976882644740202700, 0.976893332333155010, 0.976904017483874340, 0.976914700192333400, 0.976925380458505630, +0.976936058282364520, 0.976946733663883180, 0.976957406603035090, 0.976968077099793390, 0.976978745154131520, 0.976989410766023080, 0.977000073935440750, 0.977010734662358330, +0.977021392946749060, 0.977032048788586400, 0.977042702187843500, 0.977053353144493930, 0.977064001658510930, 0.977074647729868070, 0.977085291358538500, 0.977095932544495670, +0.977106571287712940, 0.977117207588163780, 0.977127841445821650, 0.977138472860660020, 0.977149101832652240, 0.977159728361771560, 0.977170352447991550, 0.977180974091285790, +0.977191593291627410, 0.977202210048990110, 0.977212824363347330, 0.977223436234672450, 0.977234045662939250, 0.977244652648120660, 0.977255257190190460, 0.977265859289122130, +0.977276458944889130, 0.977287056157464920, 0.977297650926823190, 0.977308243252937300, 0.977318833135780940, 0.977329420575327350, 0.977340005571550210, 0.977350588124422990, +0.977361168233919390, 0.977371745900012860, 0.977382321122676980, 0.977392893901885440, 0.977403464237611490, 0.977414032129828800, 0.977424597578511190, 0.977435160583632000, +0.977445721145164930, 0.977456279263083540, 0.977466834937361420, 0.977477388167972470, 0.977487938954889830, 0.977498487298087300, 0.977509033197538570, 0.977519576653217310, +0.977530117665097120, 0.977540656233151560, 0.977551192357354550, 0.977561726037679430, 0.977572257274100020, 0.977582786066589880, 0.977593312415122820, 0.977603836319672510, +0.977614357780212550, 0.977624876796716720, 0.977635393369158830, 0.977645907497512350, 0.977656419181751060, 0.977666928421848770, 0.977677435217779170, 0.977687939569515940, +0.977698441477032780, 0.977708940940303580, 0.977719437959302270, 0.977729932534002200, 0.977740424664377160, 0.977750914350401180, 0.977761401592047830, 0.977771886389291020, +0.977782368742104560, 0.977792848650462230, 0.977803326114337730, 0.977813801133704860, 0.977824273708537420, 0.977834743838809420, 0.977845211524494440, 0.977855676765566510, +0.977866139561999410, 0.977876599913767080, 0.977887057820843060, 0.977897513283201400, 0.977907966300816000, 0.977918416873660660, 0.977928865001709280, 0.977939310684935780, +0.977949753923313960, 0.977960194716817940, 0.977970633065421200, 0.977981068969097980, 0.977991502427822070, 0.978001933441567380, 0.978012362010307830, 0.978022788134017330, +0.978033211812670110, 0.978043633046239760, 0.978054051834700180, 0.978064468178025610, 0.978074882076189760, 0.978085293529166730, 0.978095702536930460, 0.978106109099454950, +0.978116513216714440, 0.978126914888682310, 0.978137314115333000, 0.978147710896640320, 0.978158105232578400, 0.978168497123121260, 0.978178886568242810, 0.978189273567917410, +0.978199658122118620, 0.978210040230820590, 0.978220419893997550, 0.978230797111623530, 0.978241171883672320, 0.978251544210118400, 0.978261914090935440, 0.978272281526098020, +0.978282646515579610, 0.978293009059354570, 0.978303369157397130, 0.978313726809681090, 0.978324082016180930, 0.978334434776870430, 0.978344785091723850, 0.978355132960715520, +0.978365478383819260, 0.978375821361009200, 0.978386161892259580, 0.978396499977544630, 0.978406835616838390, 0.978417168810115090, 0.978427499557348980, 0.978437827858513960, +0.978448153713584400, 0.978458477122534420, 0.978468798085338260, 0.978479116601970180, 0.978489432672404290, 0.978499746296614740, 0.978510057474576090, 0.978520366206262040, +0.978530672491647050, 0.978540976330705470, 0.978551277723411440, 0.978561576669739200, 0.978571873169662990, 0.978582167223157050, 0.978592458830195970, 0.978602747990753530, +0.978613034704804210, 0.978623318972322350, 0.978633600793282210, 0.978643880167658020, 0.978654157095424030, 0.978664431576555030, 0.978674703611024600, 0.978684973198807540, +0.978695240339877980, 0.978705505034210280, 0.978715767281778890, 0.978726027082558070, 0.978736284436522160, 0.978746539343645750, 0.978756791803902740, 0.978767041817267810, +0.978777289383715220, 0.978787534503219540, 0.978797777175754890, 0.978808017401295860, 0.978818255179817020, 0.978828490511292280, 0.978838723395696330, 0.978848953833003520, +0.978859181823188430, 0.978869407366225300, 0.978879630462088700, 0.978889851110753000, 0.978900069312192870, 0.978910285066382340, 0.978920498373296200, 0.978930709232908700, +0.978940917645194530, 0.978951123610128040, 0.978961327127683690, 0.978971528197836060, 0.978981726820559730, 0.978991922995828930, 0.979002116723618370, 0.979012308003902490, +0.979022496836655880, 0.979032683221853000, 0.979042867159468420, 0.979053048649476840, 0.979063227691852500, 0.979073404286569970, 0.979083578433604050, 0.979093750132929100, +0.979103919384519910, 0.979114086188350830, 0.979124250544396450, 0.979134412452631770, 0.979144571913030840, 0.979154728925568430, 0.979164883490219240, 0.979175035606957840, +0.979185185275758820, 0.979195332496596850, 0.979205477269446620, 0.979215619594282830, 0.979225759471079700, 0.979235896899812270, 0.979246031880455110, 0.979256164412982910, +0.979266294497370240, 0.979276422133591900, 0.979286547321622570, 0.979296670061436720, 0.979306790353009270, 0.979316908196314780, 0.979327023591328060, 0.979337136538023790, +0.979347247036376660, 0.979357355086361350, 0.979367460687952880, 0.979377563841125620, 0.979387664545854350, 0.979397762802113990, 0.979407858609879220, 0.979417951969124840, +0.979428042879825540, 0.979438131341956340, 0.979448217355491590, 0.979458300920406310, 0.979468382036675300, 0.979478460704273360, 0.979488536923175170, 0.979498610693355750, +0.979508682014789690, 0.979518750887452220, 0.979528817311317580, 0.979538881286361020, 0.979548942812557220, 0.979559001889880990, 0.979569058518307330, 0.979579112697810950, +0.979589164428366850, 0.979599213709950070, 0.979609260542534940, 0.979619304926096720, 0.979629346860610320, 0.979639386346050410, 0.979649423382392140, 0.979659457969610290, +0.979669490107680010, 0.979679519796575750, 0.979689547036272760, 0.979699571826745830, 0.979709594167969990, 0.979719614059920140, 0.979729631502571310, 0.979739646495898400, +0.979749659039876540, 0.979759669134480320, 0.979769676779684960, 0.979779681975465500, 0.979789684721796730, 0.979799685018653780, 0.979809682866011560, 0.979819678263845310, +0.979829671212129830, 0.979839661710840030, 0.979849649759951150, 0.979859635359438100, 0.979869618509276010, 0.979879599209439790, 0.979889577459904680, 0.979899553260645710, +0.979909526611637660, 0.979919497512855900, 0.979929465964275330, 0.979939431965871190, 0.979949395517618390, 0.979959356619492070, 0.979969315271467360, 0.979979271473519600, +0.979989225225623480, 0.979999176527754260, 0.980009125379887160, 0.980019071781997210, 0.980029015734059540, 0.980038957236049390, 0.980048896287942010, 0.980058832889712180, +0.980068767041335280, 0.980078698742786520, 0.980088627994040950, 0.980098554795073800, 0.980108479145860300, 0.980118401046375600, 0.980128320496595040, 0.980138237496493540, +0.980148152046046440, 0.980158064145228990, 0.980167973794016320, 0.980177880992383790, 0.980187785740306520, 0.980197688037759750, 0.980207587884718960, 0.980217485281159040, +0.980227380227055470, 0.980237272722383370, 0.980247162767118100, 0.980257050361234890, 0.980266935504709110, 0.980276818197516110, 0.980286698439630900, 0.980296576231028950, +0.980306451571685610, 0.980316324461576130, 0.980326194900675850, 0.980336062888960020, 0.980345928426404110, 0.980355791512983470, 0.980365652148673220, 0.980375510333448830, +0.980385366067285660, 0.980395219350159050, 0.980405070182044480, 0.980414918562917180, 0.980424764492752730, 0.980434607971526260, 0.980444448999213240, 0.980454287575789120, +0.980464123701229260, 0.980473957375509020, 0.980483788598603970, 0.980493617370489460, 0.980503443691141060, 0.980513267560533810, 0.980523088978643490, 0.980532907945445450, +0.980542724460915060, 0.980552538525027880, 0.980562350137759390, 0.980572159299085030, 0.980581966008980400, 0.980591770267420730, 0.980601572074381590, 0.980611371429838560, +0.980621168333767110, 0.980630962786142700, 0.980640754786940900, 0.980650544336137410, 0.980660331433707340, 0.980670116079626510, 0.980679898273870370, 0.980689678016414380, +0.980699455307234350, 0.980709230146305620, 0.980719002533603780, 0.980728772469104610, 0.980738539952783370, 0.980748304984615740, 0.980758067564577400, 0.980767827692643810, +0.980777585368790780, 0.980787340592993660, 0.980797093365228250, 0.980806843685470330, 0.980816591553695050, 0.980826336969878310, 0.980836079933995690, 0.980845820446022980, +0.980855558505935640, 0.980865294113709370, 0.980875027269320080, 0.980884757972743100, 0.980894486223954140, 0.980904212022928990, 0.980913935369643330, 0.980923656264072850, +0.980933374706193240, 0.980943090695980180, 0.980952804233409580, 0.980962515318456680, 0.980972223951097620, 0.980981930131307970, 0.980991633859063520, 0.981001335134339850, +0.981011033957112980, 0.981020730327358700, 0.981030424245052380, 0.981040115710170020, 0.981049804722687320, 0.981059491282580080, 0.981069175389824190, 0.981078857044395350, +0.981088536246269350, 0.981098212995422210, 0.981107887291829410, 0.981117559135466830, 0.981127228526310290, 0.981136895464335800, 0.981146559949519050, 0.981156221981835830, +0.981165881561262050, 0.981175538687773850, 0.981185193361346570, 0.981194845581956240, 0.981204495349578880, 0.981214142664190270, 0.981223787525766330, 0.981233429934282860, +0.981243069889715990, 0.981252707392041290, 0.981262342441234890, 0.981271975037272480, 0.981281605180130300, 0.981291232869784040, 0.981300858106209710, 0.981310480889383220, +0.981320101219280700, 0.981329719095877740, 0.981339334519150450, 0.981348947489074860, 0.981358558005626990, 0.981368166068782630, 0.981377771678517810, 0.981387374834808650, +0.981396975537631170, 0.981406573786961170, 0.981416169582774670, 0.981425762925047680, 0.981435353813756460, 0.981444942248876680, 0.981454528230384590, 0.981464111758256430, +0.981473692832467770, 0.981483271452994850, 0.981492847619813810, 0.981502421332900670, 0.981511992592231320, 0.981521561397782130, 0.981531127749529000, 0.981540691647448280, +0.981550253091515560, 0.981559812081707280, 0.981569368617999370, 0.981578922700368170, 0.981588474328789600, 0.981598023503239880, 0.981607570223695160, 0.981617114490131450, +0.981626656302524990, 0.981636195660851810, 0.981645732565088140, 0.981655267015210220, 0.981664799011194080, 0.981674328553015840, 0.981683855640652080, 0.981693380274078490, +0.981702902453271410, 0.981712422178207090, 0.981721939448861770, 0.981731454265211580, 0.981740966627232760, 0.981750476534901440, 0.981759983988194200, 0.981769488987086710, +0.981778991531555680, 0.981788491621577000, 0.981797989257127130, 0.981807484438182330, 0.981816977164718830, 0.981826467436713090, 0.981835955254140910, 0.981845440616978870, +0.981854923525203320, 0.981864403978790380, 0.981873881977716410, 0.981883357521957770, 0.981892830611490690, 0.981902301246291740, 0.981911769426336840, 0.981921235151602570, +0.981930698422065260, 0.981940159237701060, 0.981949617598486530, 0.981959073504398040, 0.981968526955411810, 0.981977977951504430, 0.981987426492651920, 0.981996872578830840, +0.982006316210017550, 0.982015757386188510, 0.982025196107320090, 0.982034632373388620, 0.982044066184370790, 0.982053497540242630, 0.982062926440980700, 0.982072352886561470, +0.982081776876961410, 0.982091198412156750, 0.982100617492124290, 0.982110034116840170, 0.982119448286281170, 0.982128860000423320, 0.982138269259243410, 0.982147676062717800, +0.982157080410822950, 0.982166482303535430, 0.982175881740831700, 0.982185278722688460, 0.982194673249081830, 0.982204065319988610, 0.982213454935385140, 0.982222842095248020, +0.982232226799553800, 0.982241609048279060, 0.982250988841400270, 0.982260366178894120, 0.982269741060736950, 0.982279113486905440, 0.982288483457376180, 0.982297850972125630, +0.982307216031130470, 0.982316578634367280, 0.982325938781812620, 0.982335296473443310, 0.982344651709235570, 0.982354004489166210, 0.982363354813211910, 0.982372702681349130, +0.982382048093554670, 0.982391391049805000, 0.982400731550077120, 0.982410069594347180, 0.982419405182592080, 0.982428738314788390, 0.982438068990913020, 0.982447397210942320, +0.982456722974853200, 0.982466046282622240, 0.982475367134226450, 0.982484685529641970, 0.982494001468845800, 0.982503314951814530, 0.982512625978525070, 0.982521934548954090, +0.982531240663078180, 0.982540544320874450, 0.982549845522319050, 0.982559144267389110, 0.982568440556061300, 0.982577734388312420, 0.982587025764119160, 0.982596314683458430, +0.982605601146306800, 0.982614885152641390, 0.982624166702438570, 0.982633445795675350, 0.982642722432328530, 0.982651996612374900, 0.982661268335791260, 0.982670537602554410, +0.982679804412641240, 0.982689068766028790, 0.982698330662693520, 0.982707590102612330, 0.982716847085762240, 0.982726101612119930, 0.982735353681662430, 0.982744603294366530, +0.982753850450209350, 0.982763095149167380, 0.982772337391217610, 0.982781577176336960, 0.982790814504502450, 0.982800049375690880, 0.982809281789879140, 0.982818511747044270, +0.982827739247163270, 0.982836964290212720, 0.982846186876169760, 0.982855407005011390, 0.982864624676714540, 0.982873839891255980, 0.982883052648612980, 0.982892262948762200, +0.982901470791681000, 0.982910676177345950, 0.982919879105734200, 0.982929079576822740, 0.982938277590588600, 0.982947473147008810, 0.982956666246060370, 0.982965856887720310, +0.982975045071965540, 0.982984230798773060, 0.982993414068120130, 0.983002594879983540, 0.983011773234340520, 0.983020949131168110, 0.983030122570443200, 0.983039293552143260, +0.983048462076244860, 0.983057628142725350, 0.983066791751561750, 0.983075952902731200, 0.983085111596210700, 0.983094267831977510, 0.983103421610008740, 0.983112572930281310, +0.983121721792772460, 0.983130868197459210, 0.983140012144318900, 0.983149153633328550, 0.983158292664465190, 0.983167429237706280, 0.983176563353028830, 0.983185695010409870, +0.983194824209826620, 0.983203950951256340, 0.983213075234676160, 0.983222197060063310, 0.983231316427395030, 0.983240433336648350, 0.983249547787800830, 0.983258659780829270, +0.983267769315711030, 0.983276876392423340, 0.983285981010943550, 0.983295083171248700, 0.983304182873316220, 0.983313280117123380, 0.983322374902647290, 0.983331467229865200, +0.983340557098754340, 0.983349644509292190, 0.983358729461455970, 0.983367811955222940, 0.983376891990570320, 0.983385969567475590, 0.983395044685915760, 0.983404117345868410, +0.983413187547310770, 0.983422255290220090, 0.983431320574573830, 0.983440383400349230, 0.983449443767523750, 0.983458501676074740, 0.983467557125979330, 0.983476610117214990, +0.983485660649759170, 0.983494708723589240, 0.983503754338682530, 0.983512797495016410, 0.983521838192568440, 0.983530876431315650, 0.983539912211235820, 0.983548945532306100, +0.983557976394504040, 0.983567004797807010, 0.983576030742192580, 0.983585054227637980, 0.983594075254120900, 0.983603093821618480, 0.983612109930108390, 0.983621123579567990, +0.983630134769974740, 0.983639143501306210, 0.983648149773539760, 0.983657153586653180, 0.983666154940623480, 0.983675153835428470, 0.983684150271045500, 0.983693144247452130, +0.983702135764626060, 0.983711124822544520, 0.983720111421185210, 0.983729095560525680, 0.983738077240543410, 0.983747056461215850, 0.983756033222520700, 0.983765007524435410, +0.983773979366937670, 0.983782948750004940, 0.983791915673614790, 0.983800880137745140, 0.983809842142372990, 0.983818801687476370, 0.983827758773032630, 0.983836713399019570, +0.983845665565414640, 0.983854615272195640, 0.983863562519340260, 0.983872507306825740, 0.983881449634629980, 0.983890389502730670, 0.983899326911105270, 0.983908261859731570, +0.983917194348587270, 0.983926124377650040, 0.983935051946897570, 0.983943977056307320, 0.983952899705857090, 0.983961819895524670, 0.983970737625287750, 0.983979652895123900, +0.983988565705010920, 0.983997476054926600, 0.984006383944848630, 0.984015289374754690, 0.984024192344622460, 0.984033092854429750, 0.984041990904154230, 0.984050886493773810, +0.984059779623266180, 0.984068670292609250, 0.984077558501780470, 0.984086444250757750, 0.984095327539519000, 0.984104208368041910, 0.984113086736304380, 0.984121962644283980, +0.984130836091958730, 0.984139707079306540, 0.984148575606304980, 0.984157441672931950, 0.984166305279165380, 0.984175166424982930, 0.984184025110362630, 0.984192881335282270, +0.984201735099719870, 0.984210586403652890, 0.984219435247059570, 0.984228281629917600, 0.984237125552204880, 0.984245967013899440, 0.984254806014979060, 0.984263642555421540, +0.984272476635205230, 0.984281308254307490, 0.984290137412706550, 0.984298964110380200, 0.984307788347306480, 0.984316610123463280, 0.984325429438828500, 0.984334246293380180, +0.984343060687096430, 0.984351872619954940, 0.984360682091933610, 0.984369489103010700, 0.984378293653163980, 0.984387095742371600, 0.984395895370611450, 0.984404692537861670, +0.984413487244100050, 0.984422279489304720, 0.984431069273453700, 0.984439856596525000, 0.984448641458496640, 0.984457423859346650, 0.984466203799053140, 0.984474981277594360, +0.984483756294947890, 0.984492528851091950, 0.984501298946004800, 0.984510066579664330, 0.984518831752048800, 0.984527594463136090, 0.984536354712904460, 0.984545112501332030, +0.984553867828396710, 0.984562620694076740, 0.984571371098350130, 0.984580119041195130, 0.984588864522589870, 0.984597607542512470, 0.984606348100941160, 0.984615086197853870, +0.984623821833228830, 0.984632555007044160, 0.984641285719278230, 0.984650013969909030, 0.984658739758914820, 0.984667463086273730, 0.984676183951964210, 0.984684902355963950, +0.984693618298251530, 0.984702331778805060, 0.984711042797602690, 0.984719751354622750, 0.984728457449843500, 0.984737161083243160, 0.984745862254799760, 0.984754560964491770, +0.984763257212297400, 0.984771950998194810, 0.984780642322162450, 0.984789331184178440, 0.984798017584221030, 0.984806701522268790, 0.984815382998299630, 0.984824062012292000, +0.984832738564224260, 0.984841412654074650, 0.984850084281821530, 0.984858753447443110, 0.984867420150917880, 0.984876084392224290, 0.984884746171340250, 0.984893405488244330, +0.984902062342915000, 0.984910716735330480, 0.984919368665469140, 0.984928018133309440, 0.984936665138829710, 0.984945309682008330, 0.984953951762823520, 0.984962591381253970, +0.984971228537277920, 0.984979863230873720, 0.984988495462019940, 0.984997125230694830, 0.985005752536877170, 0.985014377380544870, 0.985022999761676730, 0.985031619680250990, +0.985040237136246330, 0.985048852129640990, 0.985057464660413550, 0.985066074728542460, 0.985074682334006300, 0.985083287476783200, 0.985091890156852060, 0.985100490374191120, +0.985109088128778840, 0.985117683420594030, 0.985126276249614910, 0.985134866615820280, 0.985143454519188280, 0.985152039959697690, 0.985160622937326980, 0.985169203452054720, +0.985177781503859480, 0.985186357092719730, 0.985194930218614150, 0.985203500881521420, 0.985212069081419670, 0.985220634818287810, 0.985229198092104410, 0.985237758902847930, +0.985246317250497160, 0.985254873135030460, 0.985263426556426850, 0.985271977514664440, 0.985280526009722160, 0.985289072041578560, 0.985297615610212230, 0.985306156715601840, +0.985314695357726090, 0.985323231536563650, 0.985331765252093210, 0.985340296504293220, 0.985348825293142490, 0.985357351618619810, 0.985365875480703650, 0.985374396879372780, +0.985382915814605910, 0.985391432286381820, 0.985399946294679310, 0.985408457839476730, 0.985416966920752980, 0.985425473538486860, 0.985433977692657060, 0.985442479383242250, +0.985450978610221350, 0.985459475373573150, 0.985467969673275990, 0.985476461509309010, 0.985484950881650890, 0.985493437790280310, 0.985501922235176190, 0.985510404216317190, +0.985518883733682240, 0.985527360787250230, 0.985535835376999740, 0.985544307502909560, 0.985552777164958590, 0.985561244363125750, 0.985569709097389830, 0.985578171367729630, +0.985586631174124040, 0.985595088516551860, 0.985603543394991900, 0.985611995809423050, 0.985620445759824220, 0.985628893246174310, 0.985637338268452120, 0.985645780826636560, +0.985654220920706760, 0.985662658550641280, 0.985671093716419140, 0.985679526418019260, 0.985687956655420530, 0.985696384428601970, 0.985704809737542380, 0.985713232582220880, +0.985721652962616270, 0.985730070878707560, 0.985738486330473560, 0.985746899317893390, 0.985755309840945950, 0.985763717899610260, 0.985772123493865230, 0.985780526623690090, +0.985788927289063420, 0.985797325489964460, 0.985805721226372220, 0.985814114498265730, 0.985822505305623880, 0.985830893648425690, 0.985839279526650400, 0.985847662940277040, +0.985856043889284270, 0.985864422373651460, 0.985872798393357620, 0.985881171948381760, 0.985889543038703020, 0.985897911664300410, 0.985906277825152940, 0.985914641521239980, +0.985923002752540300, 0.985931361519033040, 0.985939717820697450, 0.985948071657512530, 0.985956423029457410, 0.985964771936511220, 0.985973118378653310, 0.985981462355862370, +0.985989803868117850, 0.985998142915398890, 0.986006479497684380, 0.986014813614953800, 0.986023145267186150, 0.986031474454360680, 0.986039801176456620, 0.986048125433452990, +0.986056447225329040, 0.986064766552063880, 0.986073083413636860, 0.986081397810027130, 0.986089709741213900, 0.986098019207176550, 0.986106326207893960, 0.986114630743345600, +0.986122932813510600, 0.986131232418368310, 0.986139529557897960, 0.986147824232078810, 0.986156116440890070, 0.986164406184311230, 0.986172693462321170, 0.986180978274899370, +0.986189260622025170, 0.986197540503677690, 0.986205817919836520, 0.986214092870480790, 0.986222365355589710, 0.986230635375142990, 0.986238902929119420, 0.986247168017498680, +0.986255430640260000, 0.986263690797382740, 0.986271948488846250, 0.986280203714629990, 0.986288456474713190, 0.986296706769075220, 0.986304954597695400, 0.986313199960553330, +0.986321442857628130, 0.986329683288899360, 0.986337921254346380, 0.986346156753948660, 0.986354389787685640, 0.986362620355536460, 0.986370848457480800, 0.986379074093498010, +0.986387297263567440, 0.986395517967668780, 0.986403736205781260, 0.986411951977884340, 0.986420165283957710, 0.986428376123980600, 0.986436584497932480, 0.986444790405792920, +0.986452993847541370, 0.986461194823157310, 0.986469393332620400, 0.986477589375910010, 0.986485782953005490, 0.986493974063886610, 0.986502162708532750, 0.986510348886923460, +0.986518532599038320, 0.986526713844856910, 0.986534892624358670, 0.986543068937523300, 0.986551242784330150, 0.986559414164758900, 0.986567583078789110, 0.986575749526400370, +0.986583913507572240, 0.986592075022284300, 0.986600234070516340, 0.986608390652247700, 0.986616544767458080, 0.986624696416127040, 0.986632845598234280, 0.986640992313759460, +0.986649136562682050, 0.986657278344981850, 0.986665417660638640, 0.986673554509631680, 0.986681688891940860, 0.986689820807545860, 0.986697950256426260, 0.986706077238561740, +0.986714201753932100, 0.986722323802517010, 0.986730443384296160, 0.986738560499249020, 0.986746675147355590, 0.986754787328595450, 0.986762897042948280, 0.986771004290393880, +0.986779109070912040, 0.986787211384482550, 0.986795311231084770, 0.986803408610698820, 0.986811503523304380, 0.986819595968881140, 0.986827685947408880, 0.986835773458867420, +0.986843858503236530, 0.986851941080496230, 0.986860021190625770, 0.986868098833605380, 0.986876174009414740, 0.986884246718033540, 0.986892316959441910, 0.986900384733619300, +0.986908450040545840, 0.986916512880201440, 0.986924573252565550, 0.986932631157618200, 0.986940686595339290, 0.986948739565708720, 0.986956790068706180, 0.986964838104311790, +0.986972883672505350, 0.986980926773266650, 0.986988967406575600, 0.986997005572412100, 0.987005041270756170, 0.987013074501587600, 0.987021105264886290, 0.987029133560632270, +0.987037159388805540, 0.987045182749385690, 0.987053203642353050, 0.987061222067687320, 0.987069238025368500, 0.987077251515376620, 0.987085262537691580, 0.987093271092293610, +0.987101277179162180, 0.987109280798277640, 0.987117281949619900, 0.987125280633168960, 0.987133276848904840, 0.987141270596807560, 0.987149261876857030, 0.987157250689033480, +0.987165237033316710, 0.987173220909686840, 0.987181202318123900, 0.987189181258607880, 0.987197157731119050, 0.987205131735637290, 0.987213103272142620, 0.987221072340615400, +0.987229038941035310, 0.987237003073382690, 0.987244964737637560, 0.987252923933779950, 0.987260880661790070, 0.987268834921647960, 0.987276786713333960, 0.987284736036827870, +0.987292682892109920, 0.987300627279160240, 0.987308569197958950, 0.987316508648486300, 0.987324445630722300, 0.987332380144647300, 0.987340312190241430, 0.987348241767484590, +0.987356168876357240, 0.987364093516839400, 0.987372015688911420, 0.987379935392553310, 0.987387852627745420, 0.987395767394467880, 0.987403679692701040, 0.987411589522424800, +0.987419496883619740, 0.987427401776265870, 0.987435304200343420, 0.987443204155832750, 0.987451101642714100, 0.987458996660967810, 0.987466889210573910, 0.987474779291512840, +0.987482666903764740, 0.987490552047310070, 0.987498434722128950, 0.987506314928201730, 0.987514192665508660, 0.987522067934030410, 0.987529940733746780, 0.987537811064638230, +0.987545678926685210, 0.987553544319867970, 0.987561407244166970, 0.987569267699562330, 0.987577125686034730, 0.987584981203564080, 0.987592834252131070, 0.987600684831716040, +0.987608532942299110, 0.987616378583860980, 0.987624221756381870, 0.987632062459842250, 0.987639900694222580, 0.987647736459502990, 0.987655569755664150, 0.987663400582686310, +0.987671228940549930, 0.987679054829235570, 0.987686878248723480, 0.987694699198994220, 0.987702517680028480, 0.987710333691806160, 0.987718147234308060, 0.987725958307514530, +0.987733766911406240, 0.987741573045963440, 0.987749376711166690, 0.987757177906996690, 0.987764976633433540, 0.987772772890458060, 0.987780566678050590, 0.987788357996191690, +0.987796146844861830, 0.987803933224041700, 0.987811717133711740, 0.987819498573852540, 0.987827277544444550, 0.987835054045468340, 0.987842828076904490, 0.987850599638733560, +0.987858368730936130, 0.987866135353492770, 0.987873899506384270, 0.987881661189590750, 0.987889420403093240, 0.987897177146872090, 0.987904931420908070, 0.987912683225181660, +0.987920432559673540, 0.987928179424364280, 0.987935923819234780, 0.987943665744265400, 0.987951405199436690, 0.987959142184729580, 0.987966876700124620, 0.987974608745602500, +0.987982338321143790, 0.987990065426729290, 0.987997790062339680, 0.988005512227955520, 0.988013231923557500, 0.988020949149126530, 0.988028663904643060, 0.988036376190087990, +0.988044086005442020, 0.988051793350685940, 0.988059498225800190, 0.988067200630765810, 0.988074900565563350, 0.988082598030173620, 0.988090293024577400, 0.988097985548755500, +0.988105675602688580, 0.988113363186357670, 0.988121048299743230, 0.988128730942826050, 0.988136411115587140, 0.988144088818007190, 0.988151764050066990, 0.988159436811747450, +0.988167107103029240, 0.988174774923893380, 0.988182440274320560, 0.988190103154291570, 0.988197763563787300, 0.988205421502788670, 0.988213076971276470, 0.988220729969231600, +0.988228380496634970, 0.988236028553467260, 0.988243674139709590, 0.988251317255342650, 0.988258957900347350, 0.988266596074704800, 0.988274231778395680, 0.988281865011401030, +0.988289495773701730, 0.988297124065278700, 0.988304749886112830, 0.988312373236185040, 0.988319994115476330, 0.988327612523967610, 0.988335228461639900, 0.988342841928474210, +0.988350452924451340, 0.988358061449552410, 0.988365667503758210, 0.988373271087049870, 0.988380872199408290, 0.988388470840814600, 0.988396067011249710, 0.988403660710694850, +0.988411251939130600, 0.988418840696538290, 0.988426426982898840, 0.988434010798193370, 0.988441592142402790, 0.988449171015508330, 0.988456747417490900, 0.988464321348331730, +0.988471892808011620, 0.988479461796511800, 0.988487028313813300, 0.988494592359897230, 0.988502153934744720, 0.988509713038336790, 0.988517269670654790, 0.988524823831679390, +0.988532375521391950, 0.988539924739773590, 0.988547471486805440, 0.988555015762468510, 0.988562557566744160, 0.988570096899613280, 0.988577633761057450, 0.988585168151057350, +0.988592700069594210, 0.988600229516649500, 0.988607756492204110, 0.988615280996239410, 0.988622803028736400, 0.988630322589676420, 0.988637839679040840, 0.988645354296810440, +0.988652866442966680, 0.988660376117490800, 0.988667883320363930, 0.988675388051567290, 0.988682890311082250, 0.988690390098890150, 0.988697887414971890, 0.988705382259309040, +0.988712874631882620, 0.988720364532673980, 0.988727851961664460, 0.988735336918835310, 0.988742819404167860, 0.988750299417643470, 0.988757776959243160, 0.988765252028948490, +0.988772724626740600, 0.988780194752601040, 0.988787662406510840, 0.988795127588451560, 0.988802590298404560, 0.988810050536350960, 0.988817508302272220, 0.988824963596149800, +0.988832416417964930, 0.988839866767698970, 0.988847314645333380, 0.988854760050849490, 0.988862202984228780, 0.988869643445452470, 0.988877081434502150, 0.988884516951359040, +0.988891949996004600, 0.988899380568420310, 0.988906808668587600, 0.988914234296487840, 0.988921657452102700, 0.988929078135413200, 0.988936496346401020, 0.988943912085047620, +0.988951325351334450, 0.988958736145242880, 0.988966144466754570, 0.988973550315850990, 0.988980953692513490, 0.988988354596723520, 0.988995753028462650, 0.989003148987712350, +0.989010542474454300, 0.989017933488669840, 0.989025322030340550, 0.989032708099448100, 0.989040091695973730, 0.989047472819899130, 0.989054851471205860, 0.989062227649875500, +0.989069601355889510, 0.989076972589229550, 0.989084341349877110, 0.989091707637813950, 0.989099071453021450, 0.989106432795481270, 0.989113791665174990, 0.989121148062084180, +0.989128501986190620, 0.989135853437475680, 0.989143202415921350, 0.989150548921508780, 0.989157892954219850, 0.989165234514036260, 0.989172573600939580, 0.989179910214911360, +0.989187244355933410, 0.989194576023987420, 0.989201905219055040, 0.989209231941117870, 0.989216556190157580, 0.989223877966155850, 0.989231197269094480, 0.989238514098955020, +0.989245828455719400, 0.989253140339369290, 0.989260449749886140, 0.989267756687251980, 0.989275061151448360, 0.989282363142456990, 0.989289662660259860, 0.989296959704838550, +0.989304254276174850, 0.989311546374250560, 0.989318835999047350, 0.989326123150547020, 0.989333407828731360, 0.989340690033582270, 0.989347969765081440, 0.989355247023210650, +0.989362521807951700, 0.989369794119286610, 0.989377063957196930, 0.989384331321664590, 0.989391596212671360, 0.989398858630199160, 0.989406118574229890, 0.989413376044745220, +0.989420631041727280, 0.989427883565157650, 0.989435133615018340, 0.989442381191291130, 0.989449626293958050, 0.989456868923000890, 0.989464109078401430, 0.989471346760141810, +0.989478581968203930, 0.989485814702569470, 0.989493044963220550, 0.989500272750138850, 0.989507498063306620, 0.989514720902705540, 0.989521941268317720, 0.989529159160125070, +0.989536374578109610, 0.989543587522253130, 0.989550797992537650, 0.989558005988945060, 0.989565211511457600, 0.989572414560057070, 0.989579615134725480, 0.989586813235445060, +0.989594008862197390, 0.989601202014964710, 0.989608392693729130, 0.989615580898472460, 0.989622766629176920, 0.989629949885824420, 0.989637130668396980, 0.989644308976876940, +0.989651484811245870, 0.989658658171486240, 0.989665829057579940, 0.989672997469508990, 0.989680163407255620, 0.989687326870801740, 0.989694487860129810, 0.989701646375221400, +0.989708802416058960, 0.989715955982624520, 0.989723107074900190, 0.989730255692867990, 0.989737401836510270, 0.989744545505809040, 0.989751686700746540, 0.989758825421304670, +0.989765961667465780, 0.989773095439211990, 0.989780226736525440, 0.989787355559388240, 0.989794481907782740, 0.989801605781691070, 0.989808727181095470, 0.989815846105977950, +0.989822962556320740, 0.989830076532106200, 0.989837188033316440, 0.989844297059933710, 0.989851403611940240, 0.989858507689318490, 0.989865609292050250, 0.989872708420117990, +0.989879805073503930, 0.989886899252190310, 0.989893990956159600, 0.989901080185393800, 0.989908166939875380, 0.989915251219586570, 0.989922333024509600, 0.989929412354626730, +0.989936489209920280, 0.989943563590372720, 0.989950635495966180, 0.989957704926683110, 0.989964771882505870, 0.989971836363416570, 0.989978898369397790, 0.989985957900431650, +0.989993014956500610, 0.990000069537587010, 0.990007121643673330, 0.990014171274741780, 0.990021218430774950, 0.990028263111754960, 0.990035305317664260, 0.990042345048485320, +0.990049382304200590, 0.990056417084792310, 0.990063449390243040, 0.990070479220535150, 0.990077506575651190, 0.990084531455573290, 0.990091553860284130, 0.990098573789766070, +0.990105591244001550, 0.990112606222973040, 0.990119618726662990, 0.990126628755054080, 0.990133636308128450, 0.990140641385868770, 0.990147643988257390, 0.990154644115276980, +0.990161641766909910, 0.990168636943138840, 0.990175629643946010, 0.990182619869314330, 0.990189607619226030, 0.990196592893663690, 0.990203575692609750, 0.990210556016047020, +0.990217533863957830, 0.990224509236324770, 0.990231482133130500, 0.990238452554357610, 0.990245420499988540, 0.990252385970005870, 0.990259348964392160, 0.990266309483130100, +0.990273267526202370, 0.990280223093591430, 0.990287176185280060, 0.990294126801250620, 0.990301074941485780, 0.990308020605968340, 0.990314963794680870, 0.990321904507605930, +0.990328842744726210, 0.990335778506024500, 0.990342711791483370, 0.990349642601085380, 0.990356570934813220, 0.990363496792649680, 0.990370420174577440, 0.990377341080579070, +0.990384259510637350, 0.990391175464735210, 0.990398088942854860, 0.990404999944979440, 0.990411908471091400, 0.990418814521173640, 0.990425718095208850, 0.990432619193179710, +0.990439517815069110, 0.990446413960859750, 0.990453307630534300, 0.990460198824075540, 0.990467087541466400, 0.990473973782689420, 0.990480857547727520, 0.990487738836563490, +0.990494617649180120, 0.990501493985560310, 0.990508367845686630, 0.990515239229542100, 0.990522108137109390, 0.990528974568371520, 0.990535838523311060, 0.990542700001911140, +0.990549559004154530, 0.990556415530023940, 0.990563269579502250, 0.990570121152572370, 0.990576970249217310, 0.990583816869419760, 0.990590661013162620, 0.990597502680428900, +0.990604341871201500, 0.990611178585463100, 0.990618012823196840, 0.990624844584385490, 0.990631673869011960, 0.990638500677059390, 0.990645325008510550, 0.990652146863348350, +0.990658966241555810, 0.990665783143115930, 0.990672597568011400, 0.990679409516225460, 0.990686218987741010, 0.990693025982541050, 0.990699830500608500, 0.990706632541926480, +0.990713432106477780, 0.990720229194245410, 0.990727023805212600, 0.990733815939362160, 0.990740605596677200, 0.990747392777140630, 0.990754177480735690, 0.990760959707445380, +0.990767739457252610, 0.990774516730140500, 0.990781291526091960, 0.990788063845090330, 0.990794833687118510, 0.990801601052159530, 0.990808365940196720, 0.990815128351212880, +0.990821888285191240, 0.990828645742114930, 0.990835400721966850, 0.990842153224730460, 0.990848903250388550, 0.990855650798924460, 0.990862395870321320, 0.990869138464562040, +0.990875878581629950, 0.990882616221508080, 0.990889351384179770, 0.990896084069628150, 0.990902814277836220, 0.990909542008787230, 0.990916267262464510, 0.990922990038851090, +0.990929710337930090, 0.990936428159684860, 0.990943143504098620, 0.990949856371154400, 0.990956566760835660, 0.990963274673125620, 0.990969980108007190, 0.990976683065463830, +0.990983383545478770, 0.990990081548035250, 0.990996777073116510, 0.991003470120705890, 0.991010160690786510, 0.991016848783341950, 0.991023534398355110, 0.991030217535809440, +0.991036898195688190, 0.991043576377974690, 0.991050252082652290, 0.991056925309704240, 0.991063596059113870, 0.991070264330864650, 0.991076930124939580, 0.991083593441322240, +0.991090254279995970, 0.991096912640944020, 0.991103568524149820, 0.991110221929596640, 0.991116872857268020, 0.991123521307147200, 0.991130167279217430, 0.991136810773462380, +0.991143451789865180, 0.991150090328409390, 0.991156726389078480, 0.991163359971855670, 0.991169991076724540, 0.991176619703668330, 0.991183245852670590, 0.991189869523714790, +0.991196490716784280, 0.991203109431862520, 0.991209725668933060, 0.991216339427979260, 0.991222950708984580, 0.991229559511932590, 0.991236165836806630, 0.991242769683590260, +0.991249371052266960, 0.991255969942820170, 0.991262566355233580, 0.991269160289490640, 0.991275751745574700, 0.991282340723469320, 0.991288927223158090, 0.991295511244624670, +0.991302092787852310, 0.991308671852824790, 0.991315248439525680, 0.991321822547938440, 0.991328394178046520, 0.991334963329833730, 0.991341530003283400, 0.991348094198379330, +0.991354655915104970, 0.991361215153444110, 0.991367771913380210, 0.991374326194896740, 0.991380877997977470, 0.991387427322606100, 0.991393974168766070, 0.991400518536441070, +0.991407060425614880, 0.991413599836270980, 0.991420136768393250, 0.991426671221964930, 0.991433203196970040, 0.991439732693392140, 0.991446259711214920, 0.991452784250422050, +0.991459306310997100, 0.991465825892924090, 0.991472342996186470, 0.991478857620767930, 0.991485369766652250, 0.991491879433823110, 0.991498386622264300, 0.991504891331959510, +0.991511393562892530, 0.991517893315047140, 0.991524390588407020, 0.991530885382955750, 0.991537377698677340, 0.991543867535555570, 0.991550354893574020, 0.991556839772716580, +0.991563322172967050, 0.991569802094309450, 0.991576279536727110, 0.991582754500204060, 0.991589226984724180, 0.991595696990271170, 0.991602164516829030, 0.991608629564381450, +0.991615092132912320, 0.991621552222405440, 0.991628009832844600, 0.991634464964213810, 0.991640917616496750, 0.991647367789677550, 0.991653815483739760, 0.991660260698667530, +0.991666703434444850, 0.991673143691055190, 0.991679581468482670, 0.991686016766711200, 0.991692449585724670, 0.991698879925507090, 0.991705307786042270, 0.991711733167314200, +0.991718156069306910, 0.991724576492004070, 0.991730994435389810, 0.991737409899448030, 0.991743822884162740, 0.991750233389517950, 0.991756641415497580, 0.991763046962085730, +0.991769450029266090, 0.991775850617022780, 0.991782248725339930, 0.991788644354201440, 0.991795037503591330, 0.991801428173493590, 0.991807816363892370, 0.991814202074771670, +0.991820585306115390, 0.991826966057907540, 0.991833344330132370, 0.991839720122773880, 0.991846093435815980, 0.991852464269242890, 0.991858832623038760, 0.991865198497187460, +0.991871561891673140, 0.991877922806479910, 0.991884281241591890, 0.991890637196993110, 0.991896990672667790, 0.991903341668600060, 0.991909690184773930, 0.991916036221173640, +0.991922379777783080, 0.991928720854586720, 0.991935059451568460, 0.991941395568712640, 0.991947729206003270, 0.991954060363424590, 0.991960389040960840, 0.991966715238596030, +0.991973038956314500, 0.991979360194100270, 0.991985678951937680, 0.991991995229810850, 0.991998309027704140, 0.992004620345601660, 0.992010929183487540, 0.992017235541346130, +0.992023539419161660, 0.992029840816918360, 0.992036139734600360, 0.992042436172192010, 0.992048730129677650, 0.992055021607041620, 0.992061310604267830, 0.992067597121340740, +0.992073881158244690, 0.992080162714964020, 0.992086441791482860, 0.992092718387785570, 0.992098992503856470, 0.992105264139680140, 0.992111533295240380, 0.992117799970521850, +0.992124064165508910, 0.992130325880185680, 0.992136585114536730, 0.992142841868546290, 0.992149096142198820, 0.992155347935478440, 0.992161597248369830, 0.992167844080857120, +0.992174088432924870, 0.992180330304557430, 0.992186569695739040, 0.992192806606454370, 0.992199041036687660, 0.992205272986423360, 0.992211502455645820, 0.992217729444339500, +0.992223953952488860, 0.992230175980078340, 0.992236395527092420, 0.992242612593515540, 0.992248827179332160, 0.992255039284526630, 0.992261248909083520, 0.992267456052987160, +0.992273660716222360, 0.992279862898773240, 0.992286062600624570, 0.992292259821760840, 0.992298454562166370, 0.992304646821825730, 0.992310836600723390, 0.992317023898844130, +0.992323208716172190, 0.992329391052692240, 0.992335570908388860, 0.992341748283246620, 0.992347923177249960, 0.992354095590383460, 0.992360265522631680, 0.992366432973979310, +0.992372597944410790, 0.992378760433910820, 0.992384920442463960, 0.992391077970054770, 0.992397233016667930, 0.992403385582288020, 0.992409535666899600, 0.992415683270487240, +0.992421828393035830, 0.992427971034529730, 0.992434111194953950, 0.992440248874292610, 0.992446384072530830, 0.992452516789652960, 0.992458647025643790, 0.992464774780488110, +0.992470900054170380, 0.992477022846675490, 0.992483143157988130, 0.992489260988092760, 0.992495376336974270, 0.992501489204617340, 0.992507599591006760, 0.992513707496127110, +0.992519812919963160, 0.992525915862499830, 0.992532016323721570, 0.992538114303613270, 0.992544209802159740, 0.992550302819345640, 0.992556393355155770, 0.992562481409574930, +0.992568566982587890, 0.992574650074179550, 0.992580730684334500, 0.992586808813037620, 0.992592884460273720, 0.992598957626027570, 0.992605028310283970, 0.992611096513027920, +0.992617162234244230, 0.992623225473917460, 0.992629286232032610, 0.992635344508574600, 0.992641400303528210, 0.992647453616878340, 0.992653504448609780, 0.992659552798707550, +0.992665598667156530, 0.992671642053941320, 0.992677682959047130, 0.992683721382458640, 0.992689757324160870, 0.992695790784138720, 0.992701821762377090, 0.992707850258860880, +0.992713876273575210, 0.992719899806504660, 0.992725920857634450, 0.992731939426949370, 0.992737955514434440, 0.992743969120074680, 0.992749980243854970, 0.992755988885760330, +0.992761995045775780, 0.992767998723886100, 0.992773999920076530, 0.992779998634331860, 0.992785994866637210, 0.992791988616977710, 0.992797979885338130, 0.992803968671703620, +0.992809954976059170, 0.992815938798389920, 0.992821920138680760, 0.992827898996916700, 0.992833875373082990, 0.992839849267164620, 0.992845820679146620, 0.992851789609014100, +0.992857756056751970, 0.992863720022345570, 0.992869681505779810, 0.992875640507039910, 0.992881597026110780, 0.992887551062977770, 0.992893502617625990, 0.992899451690040240, +0.992905398280205960, 0.992911342388108190, 0.992917284013732030, 0.992923223157062610, 0.992929159818085270, 0.992935093996784920, 0.992941025693146910, 0.992946954907156340, +0.992952881638798360, 0.992958805888058070, 0.992964727654920940, 0.992970646939371870, 0.992976563741396200, 0.992982478060979170, 0.992988389898106010, 0.992994299252761730, +0.993000206124931780, 0.993006110514601190, 0.993012012421755410, 0.993017911846379660, 0.993023808788459080, 0.993029703247979010, 0.993035595224924680, 0.993041484719281330, +0.993047371731034300, 0.993053256260168830, 0.993059138306670140, 0.993065017870523700, 0.993070894951714630, 0.993076769550228500, 0.993082641666050310, 0.993088511299165530, +0.993094378449559500, 0.993100243117217450, 0.993106105302124840, 0.993111965004266910, 0.993117822223629210, 0.993123676960196880, 0.993129529213955360, 0.993135378984890020, +0.993141226272986180, 0.993147071078229300, 0.993152913400604740, 0.993158753240097950, 0.993164590596694370, 0.993170425470379150, 0.993176257861137830, 0.993182087768956000, +0.993187915193818880, 0.993193740135711930, 0.993199562594620720, 0.993205382570530590, 0.993211200063427000, 0.993217015073295410, 0.993222827600121260, 0.993228637643890020, +0.993234445204587260, 0.993240250282198310, 0.993246052876708750, 0.993251852988104140, 0.993257650616369840, 0.993263445761491390, 0.993269238423454380, 0.993275028602244150, +0.993280816297846480, 0.993286601510246720, 0.993292384239430450, 0.993298164485383330, 0.993303942248090710, 0.993309717527538160, 0.993315490323711360, 0.993321260636595870, +0.993327028466177260, 0.993332793812441000, 0.993338556675372850, 0.993344317054958290, 0.993350074951182880, 0.993355830364032300, 0.993361583293492110, 0.993367333739548000, +0.993373081702185520, 0.993378827181390370, 0.993384570177148210, 0.993390310689444610, 0.993396048718265150, 0.993401784263595600, 0.993407517325421650, 0.993413247903728760, +0.993418975998502930, 0.993424701609729510, 0.993430424737394510, 0.993436145381483390, 0.993441863541981830, 0.993447579218875610, 0.993453292412150410, 0.993459003121792140, +0.993464711347786240, 0.993470417090118630, 0.993476120348774970, 0.993481821123740950, 0.993487519415002350, 0.993493215222545080, 0.993498908546354700, 0.993504599386417000, +0.993510287742717880, 0.993515973615243020, 0.993521657003978210, 0.993527337908909350, 0.993533016330022000, 0.993538692267302180, 0.993544365720735570, 0.993550036690308170, +0.993555705176005550, 0.993561371177813850, 0.993567034695718500, 0.993572695729705750, 0.993578354279761160, 0.993584010345870630, 0.993589663928020170, 0.993595315026195470, +0.993600963640382640, 0.993606609770567250, 0.993612253416735420, 0.993617894578872950, 0.993623533256965620, 0.993629169450999550, 0.993634803160960530, 0.993640434386834580, +0.993646063128607590, 0.993651689386265360, 0.993657313159793890, 0.993662934449179080, 0.993668553254406950, 0.993674169575463510, 0.993679783412334650, 0.993685394765006390, +0.993691003633464520, 0.993696610017695160, 0.993702213917684320, 0.993707815333417900, 0.993713414264881910, 0.993719010712062480, 0.993724604674945500, 0.993730196153516990, +0.993735785147763060, 0.993741371657669510, 0.993746955683222690, 0.993752537224408370, 0.993758116281212690, 0.993763692853621760, 0.993769266941621600, 0.993774838545198440, +0.993780407664338060, 0.993785974299026600, 0.993791538449250170, 0.993797100114995000, 0.993802659296247000, 0.993808215992992410, 0.993813770205217330, 0.993819321932907780, +0.993824871176049900, 0.993830417934629780, 0.993835962208633680, 0.993841503998047720, 0.993847043302858000, 0.993852580123050560, 0.993858114458611830, 0.993863646309527730, +0.993869175675784480, 0.993874702557368320, 0.993880226954265370, 0.993885748866461970, 0.993891268293944030, 0.993896785236698110, 0.993902299694710110, 0.993907811667966380, +0.993913321156453140, 0.993918828160156530, 0.993924332679062880, 0.993929834713158430, 0.993935334262429420, 0.993940831326862060, 0.993946325906442610, 0.993951818001157280, +0.993957307610992550, 0.993962794735934410, 0.993968279375969320, 0.993973761531083520, 0.993979241201263350, 0.993984718386495160, 0.993990193086765060, 0.993995665302059520, +0.994001135032364760, 0.994006602277667240, 0.994012067037953080, 0.994017529313208860, 0.994022989103420910, 0.994028446408575350, 0.994033901228658760, 0.994039353563657360, +0.994044803413557500, 0.994050250778345750, 0.994055695658008330, 0.994061138052531710, 0.994066577961902230, 0.994072015386106340, 0.994077450325130290, 0.994082882778960730, +0.994088312747583910, 0.994093740230986290, 0.994099165229154310, 0.994104587742074440, 0.994110007769733240, 0.994115425312116940, 0.994120840369212000, 0.994126252941004980, +0.994131663027482350, 0.994137070628630550, 0.994142475744436040, 0.994147878374885500, 0.994153278519965160, 0.994158676179661580, 0.994164071353961340, 0.994169464042850890, +0.994174854246316800, 0.994180241964345620, 0.994185627196923720, 0.994191009944037970, 0.994196390205674520, 0.994201767981820140, 0.994207143272461290, 0.994212516077584650, +0.994217886397176680, 0.994223254231224040, 0.994228619579713310, 0.994233982442630950, 0.994239342819963620, 0.994244700711698020, 0.994250056117820580, 0.994255409038317990, +0.994260759473176940, 0.994266107422383970, 0.994271452885925780, 0.994276795863788920, 0.994282136355960080, 0.994287474362425820, 0.994292809883172920, 0.994298142918188080, +0.994303473467457730, 0.994308801530968790, 0.994314127108707920, 0.994319450200661590, 0.994324770806816690, 0.994330088927159910, 0.994335404561677900, 0.994340717710357260, +0.994346028373184980, 0.994351336550147620, 0.994356642241231770, 0.994361945446424420, 0.994367246165712260, 0.994372544399081850, 0.994377840146520200, 0.994383133408013880, +0.994388424183549670, 0.994393712473114590, 0.994398998276695090, 0.994404281594278070, 0.994409562425850440, 0.994414840771398860, 0.994420116630910120, 0.994425390004371130, +0.994430660891768680, 0.994435929293089660, 0.994441195208320750, 0.994446458637448850, 0.994451719580460750, 0.994456978037343450, 0.994462234008083650, 0.994467487492668220, +0.994472738491084200, 0.994477987003318240, 0.994483233029357370, 0.994488476569188260, 0.994493717622798150, 0.994498956190173590, 0.994504192271301710, 0.994509425866169420, +0.994514656974763600, 0.994519885597070940, 0.994525111733078670, 0.994530335382773690, 0.994535556546142780, 0.994540775223172970, 0.994545991413851250, 0.994551205118164640, +0.994556416336099920, 0.994561625067644120, 0.994566831312784340, 0.994572035071507490, 0.994577236343800460, 0.994582435129650390, 0.994587631429044270, 0.994592825241969130, +0.994598016568411850, 0.994603205408359450, 0.994608391761799050, 0.994613575628717770, 0.994618757009102520, 0.994623935902940290, 0.994629112310218330, 0.994634286230923650, +0.994639457665043140, 0.994644626612564030, 0.994649793073473230, 0.994654957047758080, 0.994660118535405480, 0.994665277536402660, 0.994670434050736630, 0.994675588078394510, +0.994680739619363320, 0.994685888673630390, 0.994691035241182740, 0.994696179322007380, 0.994701320916091650, 0.994706460023422670, 0.994711596643987560, 0.994716730777773340, +0.994721862424767340, 0.994726991584956700, 0.994732118258328630, 0.994737242444870160, 0.994742364144568620, 0.994747483357411140, 0.994752600083385170, 0.994757714322477500, +0.994762826074675590, 0.994767935339966550, 0.994773042118337720, 0.994778146409776240, 0.994783248214269440, 0.994788347531804560, 0.994793444362368830, 0.994798538705949360, +0.994803630562533630, 0.994808719932108840, 0.994813806814662250, 0.994818891210181080, 0.994823973118652670, 0.994829052540064480, 0.994834129474403530, 0.994839203921657260, +0.994844275881813010, 0.994849345354858030, 0.994854412340779760, 0.994859476839565330, 0.994864538851202410, 0.994869598375678010, 0.994874655412979590, 0.994879709963094610, +0.994884762026010280, 0.994889811601714080, 0.994894858690193340, 0.994899903291435520, 0.994904945405427950, 0.994909985032158000, 0.994915022171612980, 0.994920056823780490, +0.994925088988647840, 0.994930118666202400, 0.994935145856431720, 0.994940170559323270, 0.994945192774864370, 0.994950212503042390, 0.994955229743844980, 0.994960244497259390, +0.994965256763273190, 0.994970266541873930, 0.994975273833048960, 0.994980278636785840, 0.994985280953072040, 0.994990280781895000, 0.994995278123242290, 0.995000272977101250, +0.995005265343459680, 0.995010255222304910, 0.995015242613624510, 0.995020227517406040, 0.995025209933636860, 0.995030189862304740, 0.995035167303397140, 0.995040142256901630, +0.995045114722805770, 0.995050084701097130, 0.995055052191763270, 0.995060017194791870, 0.995064979710170270, 0.995069939737886270, 0.995074897277927420, 0.995079852330281400, +0.995084804894935670, 0.995089754971877900, 0.995094702561095890, 0.995099647662577080, 0.995104590276309040, 0.995109530402279560, 0.995114468040476320, 0.995119403190886880, +0.995124335853498910, 0.995129266028300100, 0.995134193715278230, 0.995139118914420750, 0.995144041625715460, 0.995148961849150140, 0.995153879584712350, 0.995158794832389890, +0.995163707592170430, 0.995168617864041870, 0.995173525647991550, 0.995178430944007490, 0.995183333752077350, 0.995188234072188930, 0.995193131904329900, 0.995198027248487940, +0.995202920104650950, 0.995207810472806820, 0.995212698352943010, 0.995217583745047540, 0.995222466649107960, 0.995227347065112400, 0.995232224993048310, 0.995237100432903700, +0.995241973384666360, 0.995246843848324180, 0.995251711823864850, 0.995256577311276150, 0.995261440310546090, 0.995266300821662340, 0.995271158844612920, 0.995276014379385620, +0.995280867425968330, 0.995285717984348730, 0.995290566054514940, 0.995295411636454630, 0.995300254730155820, 0.995305095335606400, 0.995309933452794280, 0.995314769081707240, +0.995319602222333400, 0.995324432874660550, 0.995329261038676470, 0.995334086714369290, 0.995338909901727020, 0.995343730600737330, 0.995348548811388350, 0.995353364533668070, +0.995358177767564300, 0.995362988513065150, 0.995367796770158410, 0.995372602538832310, 0.995377405819074630, 0.995382206610873400, 0.995387004914216720, 0.995391800729092610, +0.995396594055488970, 0.995401384893393690, 0.995406173242795010, 0.995410959103680940, 0.995415742476039480, 0.995420523359858640, 0.995425301755126450, 0.995430077661831230, +0.995434851079960550, 0.995439622009502870, 0.995444390450446080, 0.995449156402778310, 0.995453919866487680, 0.995458680841562190, 0.995463439327990200, 0.995468195325759360, +0.995472948834858150, 0.995477699855274570, 0.995482448386996730, 0.995487194430012770, 0.995491937984310790, 0.995496679049879040, 0.995501417626705520, 0.995506153714778570, +0.995510887314086100, 0.995515618424616440, 0.995520347046357720, 0.995525073179298170, 0.995529796823426020, 0.995534517978729270, 0.995539236645196280, 0.995543952822815160, +0.995548666511574140, 0.995553377711461460, 0.995558086422465350, 0.995562792644574030, 0.995567496377775750, 0.995572197622058840, 0.995576896377411310, 0.995581592643821510, +0.995586286421277780, 0.995590977709768230, 0.995595666509281330, 0.995600352819805190, 0.995605036641328270, 0.995609717973838790, 0.995614396817325000, 0.995619073171775120, +0.995623747037177600, 0.995628418413520680, 0.995633087300792700, 0.995637753698982110, 0.995642417608077150, 0.995647079028066040, 0.995651737958937240, 0.995656394400679100, +0.995661048353280060, 0.995665699816728260, 0.995670348791012350, 0.995674995276120470, 0.995679639272041170, 0.995684280778762810, 0.995688919796273610, 0.995693556324562130, +0.995698190363616840, 0.995702821913426070, 0.995707450973978170, 0.995712077545261700, 0.995716701627265110, 0.995721323219976640, 0.995725942323384960, 0.995730558937478310, +0.995735173062245350, 0.995739784697674430, 0.995744393843754020, 0.995749000500472770, 0.995753604667818930, 0.995758206345781050, 0.995762805534347590, 0.995767402233507240, +0.995771996443248320, 0.995776588163559410, 0.995781177394429060, 0.995785764135845740, 0.995790348387798010, 0.995794930150274430, 0.995799509423263560, 0.995804086206753870, +0.995808660500733910, 0.995813232305192360, 0.995817801620117680, 0.995822368445498650, 0.995826932781323610, 0.995831494627581250, 0.995836053984260120, 0.995840610851348780, +0.995845165228836040, 0.995849717116710330, 0.995854266514960340, 0.995858813423574740, 0.995863357842541990, 0.995867899771850970, 0.995872439211490050, 0.995876976161448100, +0.995881510621713820, 0.995886042592275640, 0.995890572073122480, 0.995895099064242780, 0.995899623565625340, 0.995904145577258810, 0.995908665099132010, 0.995913182131233480, +0.995917696673551900, 0.995922208726076290, 0.995926718288795090, 0.995931225361697090, 0.995935729944770980, 0.995940232038005520, 0.995944731641389520, 0.995949228754911650, +0.995953723378560810, 0.995958215512325660, 0.995962705156194890, 0.995967192310157400, 0.995971676974201970, 0.995976159148317270, 0.995980638832492220, 0.995985116026715470, +0.995989590730976040, 0.995994062945262710, 0.995998532669564060, 0.996002999903869090, 0.996007464648166700, 0.996011926902445670, 0.996016386666694680, 0.996020843940902840, +0.996025298725058960, 0.996029751019151700, 0.996034200823170070, 0.996038648137102970, 0.996043092960939290, 0.996047535294667830, 0.996051975138277480, 0.996056412491757250, +0.996060847355096150, 0.996065279728282740, 0.996069709611306140, 0.996074137004155260, 0.996078561906819090, 0.996082984319286550, 0.996087404241546400, 0.996091821673587900, +0.996096236615399810, 0.996100649066971160, 0.996105059028290720, 0.996109466499347730, 0.996113871480131090, 0.996118273970629800, 0.996122673970832760, 0.996127071480729210, +0.996131466500307820, 0.996135859029557810, 0.996140249068468100, 0.996144636617027790, 0.996149021675225900, 0.996153404243051430, 0.996157784320493400, 0.996162161907541140, +0.996166537004183230, 0.996170909610409110, 0.996175279726207670, 0.996179647351568050, 0.996184012486479250, 0.996188375130930500, 0.996192735284910810, 0.996197092948409190, +0.996201448121414980, 0.996205800803916960, 0.996210150995904600, 0.996214498697366780, 0.996218843908292740, 0.996223186628671600, 0.996227526858492580, 0.996231864597744600, +0.996236199846416980, 0.996240532604498960, 0.996244862871979550, 0.996249190648847870, 0.996253515935093370, 0.996257838730705060, 0.996262159035672170, 0.996266476849983820, +0.996270792173629240, 0.996275105006597770, 0.996279415348878540, 0.996283723200460660, 0.996288028561333580, 0.996292331431486430, 0.996296631810908440, 0.996300929699588830, +0.996305225097516840, 0.996309518004681930, 0.996313808421073090, 0.996318096346679780, 0.996322381781491240, 0.996326664725496910, 0.996330945178685700, 0.996335223141047170, +0.996339498612570650, 0.996343771593245280, 0.996348042083060600, 0.996352310082005750, 0.996356575590070070, 0.996360838607243120, 0.996365099133513900, 0.996369357168871980, +0.996373612713306710, 0.996377865766807420, 0.996382116329363350, 0.996386364400964060, 0.996390609981599010, 0.996394853071257190, 0.996399093669928400, 0.996403331777601760, +0.996407567394266840, 0.996411800519913070, 0.996416031154529700, 0.996420259298106290, 0.996424484950632290, 0.996428708112097050, 0.996432928782490010, 0.996437146961800630, +0.996441362650018370, 0.996445575847132780, 0.996449786553133210, 0.996453994768009220, 0.996458200491750160, 0.996462403724345690, 0.996466604465785170, 0.996470802716058040, +0.996474998475153970, 0.996479191743062430, 0.996483382519772980, 0.996487570805275060, 0.996491756599558130, 0.996495939902611760, 0.996500120714425620, 0.996504299034989160, +0.996508474864291950, 0.996512648202323660, 0.996516819049073630, 0.996520987404531660, 0.996525153268687070, 0.996529316641529660, 0.996533477523048990, 0.996537635913234630, +0.996541791812076140, 0.996545945219563190, 0.996550096135685460, 0.996554244560432400, 0.996558390493793690, 0.996562533935759000, 0.996566674886318120, 0.996570813345460380, +0.996574949313175700, 0.996579082789453620, 0.996583213774283940, 0.996587342267656110, 0.996591468269559910, 0.996595591779985130, 0.996599712798921230, 0.996603831326358210, +0.996607947362285530, 0.996612060906693080, 0.996616171959570310, 0.996620280520907230, 0.996624386590693410, 0.996628490168918630, 0.996632591255572580, 0.996636689850645130, +0.996640785954125860, 0.996644879566004780, 0.996648970686271340, 0.996653059314915550, 0.996657145451927070, 0.996661229097295820, 0.996665310251011350, 0.996669388913063670, +0.996673465083442570, 0.996677538762137830, 0.996681609949139240, 0.996685678644436580, 0.996689744848019640, 0.996693808559878440, 0.996697869780002740, 0.996701928508382240, +0.996705984745007050, 0.996710038489866830, 0.996714089742951610, 0.996718138504251060, 0.996722184773755180, 0.996726228551453870, 0.996730269837336920, 0.996734308631394340, +0.996738344933616130, 0.996742378743991850, 0.996746410062511750, 0.996750438889165590, 0.996754465223943290, 0.996758489066834840, 0.996762510417830150, 0.996766529276919220, +0.996770545644092070, 0.996774559519338470, 0.996778570902648430, 0.996782579794011970, 0.996786586193419090, 0.996790590100859690, 0.996794591516323880, 0.996798590439801570, +0.996802586871282760, 0.996806580810757570, 0.996810572258215900, 0.996814561213647750, 0.996818547677043140, 0.996822531648392300, 0.996826513127685000, 0.996830492114911590, +0.996834468610061750, 0.996838442613125930, 0.996842414124093800, 0.996846383142955820, 0.996850349669701760, 0.996854313704321870, 0.996858275246806260, 0.996862234297144930, +0.996866190855327900, 0.996870144921345510, 0.996874096495187770, 0.996878045576844670, 0.996881992166306570, 0.996885936263563480, 0.996889877868605500, 0.996893816981422880, +0.996897753602005720, 0.996901687730344150, 0.996905619366428300, 0.996909548510248490, 0.996913475161794740, 0.996917399321057270, 0.996921320988026440, 0.996925240162692240, +0.996929156845045020, 0.996933071035074780, 0.996936982732771870, 0.996940891938126520, 0.996944798651128950, 0.996948702871769510, 0.996952604600038210, 0.996956503835925380, +0.996960400579421260, 0.996964294830516180, 0.996968186589200390, 0.996972075855464100, 0.996975962629297660, 0.996979846910691300, 0.996983728699635250, 0.996987607996119960, +0.996991484800135660, 0.996995359111672590, 0.996999230930721180, 0.997003100257271570, 0.997006967091314310, 0.997010831432839750, 0.997014693281837890, 0.997018552638299420, +0.997022409502214550, 0.997026263873573630, 0.997030115752367110, 0.997033965138585220, 0.997037812032218530, 0.997041656433257260, 0.997045498341691760, 0.997049337757512590, +0.997053174680710090, 0.997057009111274590, 0.997060841049196570, 0.997064670494466570, 0.997068497447074820, 0.997072321907011780, 0.997076143874268020, 0.997079963348833860, +0.997083780330699780, 0.997087594819856200, 0.997091406816293710, 0.997095216320002750, 0.997099023330973670, 0.997102827849197020, 0.997106629874663360, 0.997110429407363050, +0.997114226447286760, 0.997118020994424810, 0.997121813048767790, 0.997125602610306360, 0.997129389679030860, 0.997133174254931980, 0.997136956338000040, 0.997140735928225720, +0.997144513025599590, 0.997148287630112210, 0.997152059741754030, 0.997155829360515830, 0.997159596486387970, 0.997163361119361100, 0.997167123259425800, 0.997170882906572740, +0.997174640060792480, 0.997178394722075590, 0.997182146890412850, 0.997185896565794590, 0.997189643748211620, 0.997193388437654590, 0.997197130634113970, 0.997200870337580650, +0.997204607548045070, 0.997208342265498040, 0.997212074489930210, 0.997215804221332050, 0.997219531459694440, 0.997223256205008070, 0.997226978457263490, 0.997230698216451380, +0.997234415482562640, 0.997238130255587830, 0.997241842535517730, 0.997245552322343020, 0.997249259616054370, 0.997252964416642680, 0.997256666724098410, 0.997260366538412660, +0.997264063859575890, 0.997267758687579000, 0.997271451022412660, 0.997275140864067770, 0.997278828212534880, 0.997282513067805020, 0.997286195429868960, 0.997289875298717270, +0.997293552674340940, 0.997297227556730780, 0.997300899945877560, 0.997304569841771960, 0.997308237244405090, 0.997311902153767530, 0.997315564569850270, 0.997319224492643990, +0.997322881922139800, 0.997326536858328390, 0.997330189301200540, 0.997333839250747260, 0.997337486706959320, 0.997341131669827740, 0.997344774139343300, 0.997348414115497020, +0.997352051598279670, 0.997355686587682140, 0.997359319083695350, 0.997362949086310290, 0.997366576595517970, 0.997370201611309070, 0.997373824133674700, 0.997377444162605760, +0.997381061698093370, 0.997384676740128210, 0.997388289288701270, 0.997391899343803680, 0.997395506905426330, 0.997399111973560240, 0.997402714548196400, 0.997406314629325720, +0.997409912216939310, 0.997413507311028070, 0.997417099911583000, 0.997420690018595240, 0.997424277632055770, 0.997427862751955610, 0.997431445378285760, 0.997435025511037470, +0.997438603150201390, 0.997442178295768870, 0.997445750947730910, 0.997449321106078650, 0.997452888770802960, 0.997456453941895080, 0.997460016619346130, 0.997463576803147120, +0.997467134493289160, 0.997470689689763380, 0.997474242392560770, 0.997477792601672690, 0.997481340317090020, 0.997484885538804100, 0.997488428266805950, 0.997491968501086680, +0.997495506241637520, 0.997499041488449590, 0.997502574241514010, 0.997506104500822000, 0.997509632266364800, 0.997513157538133520, 0.997516680316119290, 0.997520200600313430, +0.997523718390706970, 0.997527233687291350, 0.997530746490057460, 0.997534256798996880, 0.997537764614100490, 0.997541269935359850, 0.997544772762765990, 0.997548273096310220, +0.997551770935983680, 0.997555266281777710, 0.997558759133683640, 0.997562249491692700, 0.997565737355796010, 0.997569222725985140, 0.997572705602251200, 0.997576185984585420, +0.997579663872979140, 0.997583139267423700, 0.997586612167910450, 0.997590082574430710, 0.997593550486975730, 0.997597015905536950, 0.997600478830105500, 0.997603939260672920, +0.997607397197230460, 0.997610852639769560, 0.997614305588281460, 0.997617756042757710, 0.997621204003189540, 0.997624649469568300, 0.997628092441885440, 0.997631532920132290, +0.997634970904300420, 0.997638406394381060, 0.997641839390365770, 0.997645269892245780, 0.997648697900012760, 0.997652123413657830, 0.997655546433172670, 0.997658966958548610, +0.997662384989777110, 0.997665800526849720, 0.997669213569757800, 0.997672624118492890, 0.997676032173046350, 0.997679437733409720, 0.997682840799574590, 0.997686241371532280, +0.997689639449274360, 0.997693035032792390, 0.997696428122077820, 0.997699818717122210, 0.997703206817917020, 0.997706592424453810, 0.997709975536724140, 0.997713356154719460, +0.997716734278431440, 0.997720109907851650, 0.997723483042971430, 0.997726853683782670, 0.997730221830276710, 0.997733587482445230, 0.997736950640279670, 0.997740311303771830, +0.997743669472913150, 0.997747025147695310, 0.997750378328109980, 0.997753729014148720, 0.997757077205803090, 0.997760422903064660, 0.997763766105925320, 0.997767106814376530, +0.997770445028409950, 0.997773780748017150, 0.997777113973190130, 0.997780444703920130, 0.997783772940199150, 0.997787098682018650, 0.997790421929370400, 0.997793742682246190, +0.997797060940637580, 0.997800376704536250, 0.997803689973934090, 0.997807000748822670, 0.997810309029193650, 0.997813614815038940, 0.997816918106350200, 0.997820218903119120, +0.997823517205337570, 0.997826813012997250, 0.997830106326089820, 0.997833397144607170, 0.997836685468540980, 0.997839971297883040, 0.997843254632625240, 0.997846535472759260, +0.997849813818276980, 0.997853089669170190, 0.997856363025430680, 0.997859633887050120, 0.997862902254020630, 0.997866168126333890, 0.997869431503981660, 0.997872692386955860, +0.997875950775248380, 0.997879206668850880, 0.997882460067755490, 0.997885710971953890, 0.997888959381438070, 0.997892205296199820, 0.997895448716231040, 0.997898689641523730, +0.997901928072069680, 0.997905164007860780, 0.997908397448888930, 0.997911628395146130, 0.997914856846624180, 0.997918082803315180, 0.997921306265210920, 0.997924527232303400, +0.997927745704584650, 0.997930961682046420, 0.997934175164680860, 0.997937386152479840, 0.997940594645435270, 0.997943800643539380, 0.997947004146783830, 0.997950205155160860, +0.997953403668662360, 0.997956599687280340, 0.997959793211006920, 0.997962984239833870, 0.997966172773753430, 0.997969358812757500, 0.997972542356838300, 0.997975723405987610, +0.997978901960197670, 0.997982078019460480, 0.997985251583768160, 0.997988422653112610, 0.997991591227486040, 0.997994757306880480, 0.997997920891288030, 0.998001081980700810, +0.998004240575110830, 0.998007396674510330, 0.998010550278891300, 0.998013701388245860, 0.998016850002566120, 0.998019996121844330, 0.998023139746072600, 0.998026280875242920, +0.998029419509347650, 0.998032555648378780, 0.998035689292328440, 0.998038820441188970, 0.998041949094952360, 0.998045075253610970, 0.998048198917156900, 0.998051320085582280, +0.998054438758879450, 0.998057554937040400, 0.998060668620057490, 0.998063779807922940, 0.998066888500628970, 0.998069994698167710, 0.998073098400531490, 0.998076199607712540, +0.998079298319703100, 0.998082394536495390, 0.998085488258081740, 0.998088579484454290, 0.998091668215605470, 0.998094754451527510, 0.998097838192212540, 0.998100919437653000, +0.998103998187841230, 0.998107074442769360, 0.998110148202429940, 0.998113219466815080, 0.998116288235917140, 0.998119354509728550, 0.998122418288241550, 0.998125479571448480, +0.998128538359341790, 0.998131594651913590, 0.998134648449156560, 0.998137699751062810, 0.998140748557624910, 0.998143794868835090, 0.998146838684685790, 0.998149880005169350, +0.998152918830278240, 0.998155955160004880, 0.998158988994341520, 0.998162020333280830, 0.998165049176815030, 0.998168075524936580, 0.998171099377637930, 0.998174120734911520, +0.998177139596749920, 0.998180155963145350, 0.998183169834090500, 0.998186181209577580, 0.998189190089599390, 0.998192196474148140, 0.998195200363216300, 0.998198201756796630, +0.998201200654881270, 0.998204197057463110, 0.998207190964534250, 0.998210182376087610, 0.998213171292115400, 0.998216157712610300, 0.998219141637564760, 0.998222123066971450, +0.998225102000822820, 0.998228078439111320, 0.998231052381829740, 0.998234023828970530, 0.998236992780526240, 0.998239959236489450, 0.998242923196852710, 0.998245884661608680, +0.998248843630750060, 0.998251800104269170, 0.998254754082158910, 0.998257705564411730, 0.998260654551020310, 0.998263601041977200, 0.998266545037275080, 0.998269486536906610, +0.998272425540864480, 0.998275362049141250, 0.998278296061729580, 0.998281227578622250, 0.998284156599811730, 0.998287083125290910, 0.998290007155052340, 0.998292928689088810, +0.998295847727392880, 0.998298764269957340, 0.998301678316774970, 0.998304589867838430, 0.998307498923140300, 0.998310405482673470, 0.998313309546430610, 0.998316211114404490, +0.998319110186587810, 0.998322006762973450, 0.998324900843554080, 0.998327792428322370, 0.998330681517271110, 0.998333568110393310, 0.998336452207681520, 0.998339333809128540, +0.998342212914727250, 0.998345089524470540, 0.998347963638350990, 0.998350835256361590, 0.998353704378495130, 0.998356571004744290, 0.998359435135102060, 0.998362296769561340, +0.998365155908114810, 0.998368012550755470, 0.998370866697475990, 0.998373718348269380, 0.998376567503128420, 0.998379414162046120, 0.998382258325015260, 0.998385099992028740, +0.998387939163079550, 0.998390775838160380, 0.998393610017264340, 0.998396441700384330, 0.998399270887513120, 0.998402097578643840, 0.998404921773769160, 0.998407743472882300, +0.998410562675976050, 0.998413379383043420, 0.998416193594077290, 0.998419005309070680, 0.998421814528016590, 0.998424621250908030, 0.998427425477737770, 0.998430227208499050, +0.998433026443184770, 0.998435823181787920, 0.998438617424301400, 0.998441409170718440, 0.998444198421031940, 0.998446985175234890, 0.998449769433320420, 0.998452551195281530, +0.998455330461111350, 0.998458107230802750, 0.998460881504348860, 0.998463653281742800, 0.998466422562977570, 0.998469189348046290, 0.998471953636942080, 0.998474715429658040, +0.998477474726187090, 0.998480231526522540, 0.998482985830657420, 0.998485737638584720, 0.998488486950297790, 0.998491233765789630, 0.998493978085053360, 0.998496719908082090, +0.998499459234869160, 0.998502196065407470, 0.998504930399690350, 0.998507662237710810, 0.998510391579462200, 0.998513118424937620, 0.998515842774130190, 0.998518564627033140, +0.998521283983639710, 0.998524000843943100, 0.998526715207936450, 0.998529427075613100, 0.998532136446966030, 0.998534843321988720, 0.998537547700674380, 0.998540249583016020, +0.998542948969007080, 0.998545645858640810, 0.998548340251910420, 0.998551032148809140, 0.998553721549330200, 0.998556408453467160, 0.998559092861213030, 0.998561774772561030, +0.998564454187504720, 0.998567131106037230, 0.998569805528152000, 0.998572477453842140, 0.998575146883101120, 0.998577813815922260, 0.998580478252298900, 0.998583140192224270, +0.998585799635691830, 0.998588456582694910, 0.998591111033226730, 0.998593762987280860, 0.998596412444850650, 0.998599059405929300, 0.998601703870510390, 0.998604345838587150, +0.998606985310153130, 0.998609622285201560, 0.998612256763726000, 0.998614888745719690, 0.998617518231176280, 0.998620145220089020, 0.998622769712451450, 0.998625391708256930, +0.998628011207498890, 0.998630628210170790, 0.998633242716266190, 0.998635854725778430, 0.998638464238701170, 0.998641071255027660, 0.998643675774751440, 0.998646277797866080, +0.998648877324364910, 0.998651474354241620, 0.998654068887489750, 0.998656660924102660, 0.998659250464073890, 0.998661837507396900, 0.998664422054065470, 0.998667004104072830, +0.998669583657412760, 0.998672160714078830, 0.998674735274064360, 0.998677307337363150, 0.998679876903968640, 0.998682443973874400, 0.998685008547074090, 0.998687570623561170, +0.998690130203329420, 0.998692687286372280, 0.998695241872683550, 0.998697793962256550, 0.998700343555085190, 0.998702890651162910, 0.998705435250483390, 0.998707977353040290, +0.998710516958827290, 0.998713054067837950, 0.998715588680066050, 0.998718120795505150, 0.998720650414148920, 0.998723177535991050, 0.998725702161025300, 0.998728224289245240, +0.998730743920644650, 0.998733261055217200, 0.998735775692956570, 0.998738287833856540, 0.998740797477910780, 0.998743304625112960, 0.998745809275456970, 0.998748311428936390, +0.998750811085545090, 0.998753308245276750, 0.998755802908125050, 0.998758295074083980, 0.998760784743147110, 0.998763271915308230, 0.998765756590561220, 0.998768238768899860, +0.998770718450317840, 0.998773195634809040, 0.998775670322367250, 0.998778142512986360, 0.998780612206660030, 0.998783079403382180, 0.998785544103146570, 0.998788006305947220, +0.998790466011777790, 0.998792923220632180, 0.998795377932504280, 0.998797830147387990, 0.998800279865277090, 0.998802727086165460, 0.998805171810047020, 0.998807614036915650, +0.998810053766765350, 0.998812490999589800, 0.998814925735383110, 0.998817357974138950, 0.998819787715851560, 0.998822214960514600, 0.998824639708122080, 0.998827061958668110, +0.998829481712146360, 0.998831898968550960, 0.998834313727875790, 0.998836725990114860, 0.998839135755262060, 0.998841543023311410, 0.998843947794257000, 0.998846350068092750, +0.998848749844812530, 0.998851147124410370, 0.998853541906880470, 0.998855934192216630, 0.998858323980412970, 0.998860711271463590, 0.998863096065362390, 0.998865478362103380, +0.998867858161680780, 0.998870235464088490, 0.998872610269320500, 0.998874982577371170, 0.998877352388234270, 0.998879719701904030, 0.998882084518374460, 0.998884446837639770, +0.998886806659693870, 0.998889163984530980, 0.998891518812145110, 0.998893871142530590, 0.998896220975681200, 0.998898568311591410, 0.998900913150255200, 0.998903255491666700, +0.998905595335820020, 0.998907932682709390, 0.998910267532328810, 0.998912599884672740, 0.998914929739735060, 0.998917257097510000, 0.998919581957991910, 0.998921904321174890, +0.998924224187053070, 0.998926541555620660, 0.998928856426871900, 0.998931168800801020, 0.998933478677402120, 0.998935786056669660, 0.998938090938597760, 0.998940393323180520, +0.998942693210412290, 0.998944990600287410, 0.998947285492799990, 0.998949577887944360, 0.998951867785714880, 0.998954155186105640, 0.998956440089111110, 0.998958722494725390, +0.998961002402942830, 0.998963279813757770, 0.998965554727164640, 0.998967827143157460, 0.998970097061730790, 0.998972364482878960, 0.998974629406596090, 0.998976891832876750, +0.998979151761715150, 0.998981409193105630, 0.998983664127042540, 0.998985916563520430, 0.998988166502533410, 0.998990413944076060, 0.998992658888142590, 0.998994901334727570, +0.998997141283825220, 0.998999378735429990, 0.999001613689536440, 0.999003846146138690, 0.999006076105231510, 0.999008303566809030, 0.999010528530865800, 0.999012750997396280, +0.999014970966394800, 0.999017188437856030, 0.999019403411774200, 0.999021615888143870, 0.999023825866959480, 0.999026033348215600, 0.999028238331906570, 0.999030440818026940, +0.999032640806571280, 0.999034838297533920, 0.999037033290909540, 0.999039225786692580, 0.999041415784877480, 0.999043603285458940, 0.999045788288431270, 0.999047970793789260, +0.999050150801527260, 0.999052328311639930, 0.999054503324121710, 0.999056675838967290, 0.999058845856171110, 0.999061013375727840, 0.999063178397632030, 0.999065340921878380, +0.999067500948461310, 0.999069658477375390, 0.999071813508615400, 0.999073966042176020, 0.999076116078051580, 0.999078263616236860, 0.999080408656726430, 0.999082551199515060, +0.999084691244597310, 0.999086828791967750, 0.999088963841621270, 0.999091096393552200, 0.999093226447755560, 0.999095354004225670, 0.999097479062957540, 0.999099601623945620, +0.999101721687184810, 0.999103839252669660, 0.999105954320394840, 0.999108066890355250, 0.999110176962545340, 0.999112284536960100, 0.999114389613594110, 0.999116492192442140, +0.999118592273498970, 0.999120689856759390, 0.999122784942217960, 0.999124877529869560, 0.999126967619709090, 0.999129055211731120, 0.999131140305930530, 0.999133222902302000, +0.999135303000840520, 0.999137380601540780, 0.999139455704397550, 0.999141528309405720, 0.999143598416560090, 0.999145666025855420, 0.999147731137286500, 0.999149793750848340, +0.999151853866535710, 0.999153911484343520, 0.999155966604266420, 0.999158019226299430, 0.999160069350437440, 0.999162116976675230, 0.999164162105007800, 0.999166204735429830, +0.999168244867936540, 0.999170282502522490, 0.999172317639182790, 0.999174350277912240, 0.999176380418705820, 0.999178408061558550, 0.999180433206465100, 0.999182455853420690, +0.999184476002420220, 0.999186493653458350, 0.999188508806530430, 0.999190521461631120, 0.999192531618755540, 0.999194539277898590, 0.999196544439055370, 0.999198547102220780, +0.999200547267389830, 0.999202544934557510, 0.999204540103718730, 0.999206532774868710, 0.999208522948002330, 0.999210510623114610, 0.999212495800200660, 0.999214478479255490, +0.999216458660273980, 0.999218436343251470, 0.999220411528182860, 0.999222384215063150, 0.999224354403887460, 0.999226322094651010, 0.999228287287348690, 0.999230249981975630, +0.999232210178526930, 0.999234167876997810, 0.999236123077383190, 0.999238075779678270, 0.999240025983878180, 0.999241973689978020, 0.999243918897972930, 0.999245861607858000, +0.999247801819628470, 0.999249739533279340, 0.999251674748805940, 0.999253607466203400, 0.999255537685466710, 0.999257465406591330, 0.999259390629572250, 0.999261313354404600, +0.999263233581083710, 0.999265151309604800, 0.999267066539962890, 0.999268979272153410, 0.999270889506171490, 0.999272797242012350, 0.999274702479671210, 0.999276605219143190, +0.999278505460423850, 0.999280403203508080, 0.999282298448391450, 0.999284191195068950, 0.999286081443536030, 0.999287969193787930, 0.999289854445819860, 0.999291737199627160, +0.999293617455205170, 0.999295495212549010, 0.999297370471654230, 0.999299243232515950, 0.999301113495129620, 0.999302981259490570, 0.999304846525593930, 0.999306709293435240, +0.999308569563009730, 0.999310427334312860, 0.999312282607339950, 0.999314135382086240, 0.999315985658547290, 0.999317833436718320, 0.999319678716594770, 0.999321521498171990, +0.999323361781445430, 0.999325199566410530, 0.999327034853062510, 0.999328867641396950, 0.999330697931409270, 0.999332525723094830, 0.999334351016449070, 0.999336173811467440, +0.999337994108145390, 0.999339811906478250, 0.999341627206461690, 0.999343440008091060, 0.999345250311361790, 0.999347058116269450, 0.999348863422809370, 0.999350666230977240, +0.999352466540768370, 0.999354264352178330, 0.999356059665202580, 0.999357852479836880, 0.999359642796076360, 0.999361430613916800, 0.999363215933353640, 0.999364998754382450, +0.999366779076998780, 0.999368556901198190, 0.999370332226976130, 0.999372105054328390, 0.999373875383250180, 0.999375643213737400, 0.999377408545785490, 0.999379171379390140, +0.999380931714546780, 0.999382689551251090, 0.999384444889498620, 0.999386197729285160, 0.999387948070606160, 0.999389695913457280, 0.999391441257834190, 0.999393184103732460, +0.999394924451147750, 0.999396662300075730, 0.999398397650512080, 0.999400130502452470, 0.999401860855892550, 0.999403588710827910, 0.999405314067254300, 0.999407036925167410, +0.999408757284563020, 0.999410475145436570, 0.999412190507784070, 0.999413903371601080, 0.999415613736883260, 0.999417321603626510, 0.999419026971826390, 0.999420729841478670, +0.999422430212579150, 0.999424128085123600, 0.999425823459107690, 0.999427516334527200, 0.999429206711378030, 0.999430894589655730, 0.999432579969356190, 0.999434262850475210, +0.999435943233008660, 0.999437621116952220, 0.999439296502301680, 0.999440969389052910, 0.999442639777201710, 0.999444307666743970, 0.999445973057675460, 0.999447635949991970, +0.999449296343689400, 0.999450954238763620, 0.999452609635210320, 0.999454262533025610, 0.999455912932205260, 0.999457560832745060, 0.999459206234641020, 0.999460849137889020, +0.999462489542484840, 0.999464127448424390, 0.999465762855703650, 0.999467395764318530, 0.999469026174264810, 0.999470654085538700, 0.999472279498135770, 0.999473902412052250, +0.999475522827284020, 0.999477140743826990, 0.999478756161677030, 0.999480369080830160, 0.999481979501282370, 0.999483587423029670, 0.999485192846067960, 0.999486795770393340, +0.999488396196001720, 0.999489994122889080, 0.999491589551051440, 0.999493182480484910, 0.999494772911185380, 0.999496360843148860, 0.999497946276371450, 0.999499529210849280, +0.999501109646578230, 0.999502687583554320, 0.999504263021773750, 0.999505835961232550, 0.999507406401926700, 0.999508974343852440, 0.999510539787005660, 0.999512102731382580, +0.999513663176979210, 0.999515221123791650, 0.999516776571816150, 0.999518329521048580, 0.999519879971485280, 0.999521427923122260, 0.999522973375955640, 0.999524516329981630, +0.999526056785196240, 0.999527594741595800, 0.999529130199176330, 0.999530663157934040, 0.999532193617865160, 0.999533721578965690, 0.999535247041231980, 0.999536770004660120, +0.999538290469246360, 0.999539808434986910, 0.999541323901877890, 0.999542836869915520, 0.999544347339096140, 0.999545855309415860, 0.999547360780870920, 0.999548863753457640, +0.999550364227172140, 0.999551862202010750, 0.999553357677969710, 0.999554850655045240, 0.999556341133233660, 0.999557829112531330, 0.999559314592934340, 0.999560797574439050, +0.999562278057041790, 0.999563756040738770, 0.999565231525526450, 0.999566704511401060, 0.999568174998358820, 0.999569642986396170, 0.999571108475509450, 0.999572571465695000, +0.999574031956949050, 0.999575489949268040, 0.999576945442648300, 0.999578398437086180, 0.999579848932578120, 0.999581296929120340, 0.999582742426709410, 0.999584185425341550, +0.999585625925013320, 0.999587063925720940, 0.999588499427460970, 0.999589932430229760, 0.999591362934023620, 0.999592790938839130, 0.999594216444672720, 0.999595639451520630, +0.999597059959379530, 0.999598477968245860, 0.999599893478115840, 0.999601306488986150, 0.999602717000853240, 0.999604125013713540, 0.999605530527563510, 0.999606933542399600, +0.999608334058218360, 0.999609732075016360, 0.999611127592789920, 0.999612520611535830, 0.999613911131250310, 0.999615299151930040, 0.999616684673571450, 0.999618067696171230, +0.999619448219725930, 0.999620826244231870, 0.999622201769685750, 0.999623574796084210, 0.999624945323423720, 0.999626313351700820, 0.999627678880912090, 0.999629041911054280, +0.999630402442123760, 0.999631760474117280, 0.999633116007031420, 0.999634469040862840, 0.999635819575607990, 0.999637167611263530, 0.999638513147826260, 0.999639856185292610, +0.999641196723659480, 0.999642534762923200, 0.999643870303080660, 0.999645203344128430, 0.999646533886063170, 0.999647861928881660, 0.999649187472580360, 0.999650510517156250, +0.999651831062605690, 0.999653149108925660, 0.999654464656112740, 0.999655777704163690, 0.999657088253075200, 0.999658396302843920, 0.999659701853466750, 0.999661004904940250, +0.999662305457261200, 0.999663603510426490, 0.999664899064432680, 0.999666192119276650, 0.999667482674955200, 0.999668770731464980, 0.999670056288802790, 0.999671339346965500, +0.999672619905949910, 0.999673897965752790, 0.999675173526370920, 0.999676446587800970, 0.999677717150040060, 0.999678985213084850, 0.999680250776932120, 0.999681513841578770, +0.999682774407021580, 0.999684032473257540, 0.999685288040283450, 0.999686541108096070, 0.999687791676692310, 0.999689039746069150, 0.999690285316223390, 0.999691528387151810, +0.999692768958851510, 0.999694007031319280, 0.999695242604552000, 0.999696475678546690, 0.999697706253300120, 0.999698934328809300, 0.999700159905071110, 0.999701382982082550, +0.999702603559840530, 0.999703821638342040, 0.999705037217583970, 0.999706250297563210, 0.999707460878277000, 0.999708668959721990, 0.999709874541895420, 0.999711077624794050, +0.999712278208415130, 0.999713476292755420, 0.999714671877812040, 0.999715864963582000, 0.999717055550062180, 0.999718243637249810, 0.999719429225141900, 0.999720612313735320, +0.999721792903027320, 0.999722970993014770, 0.999724146583694680, 0.999725319675064390, 0.999726490267120680, 0.999727658359860880, 0.999728823953281890, 0.999729987047380810, +0.999731147642154760, 0.999732305737600860, 0.999733461333716100, 0.999734614430497830, 0.999735765027942920, 0.999736913126048620, 0.999738058724812140, 0.999739201824230370, +0.999740342424300650, 0.999741480525020100, 0.999742616126385820, 0.999743749228395040, 0.999744879831044870, 0.999746007934332440, 0.999747133538255060, 0.999748256642809860, +0.999749377247993950, 0.999750495353804670, 0.999751610960239120, 0.999752724067294540, 0.999753834674968140, 0.999754942783257160, 0.999756048392158920, 0.999757151501670440, +0.999758252111789040, 0.999759350222512170, 0.999760445833836830, 0.999761538945760360, 0.999762629558279990, 0.999763717671393160, 0.999764803285096980, 0.999765886399388900, +0.999766967014265930, 0.999768045129725610, 0.999769120745765290, 0.999770193862381970, 0.999771264479573320, 0.999772332597336440, 0.999773398215668800, 0.999774461334567600, +0.999775521954030300, 0.999776580074054120, 0.999777635694636510, 0.999778688815774810, 0.999779739437466450, 0.999780787559708670, 0.999781833182498910, 0.999782876305834620, +0.999783916929713130, 0.999784955054131900, 0.999785990679088240, 0.999787023804579510, 0.999788054430603370, 0.999789082557157040, 0.999790108184237970, 0.999791131311843610, +0.999792151939971510, 0.999793170068619010, 0.999794185697783560, 0.999795198827462590, 0.999796209457653680, 0.999797217588354270, 0.999798223219561800, 0.999799226351273720, +0.999800226983487580, 0.999801225116200950, 0.999802220749411270, 0.999803213883115990, 0.999804204517312670, 0.999805192651998850, 0.999806178287172000, 0.999807161422829770, +0.999808142058969620, 0.999809120195589100, 0.999810095832685760, 0.999811068970257290, 0.999812039608301010, 0.999813007746814700, 0.999813973385795920, 0.999814936525242120, +0.999815897165150960, 0.999816855305520110, 0.999817810946347140, 0.999818764087629600, 0.999819714729365150, 0.999820662871551470, 0.999821608514186110, 0.999822551657266740, +0.999823492300790930, 0.999824430444756440, 0.999825366089160840, 0.999826299234001900, 0.999827229879277190, 0.999828158024984370, 0.999829083671121110, 0.999830006817685190, +0.999830927464674280, 0.999831845612086050, 0.999832761259918160, 0.999833674408168390, 0.999834585056834420, 0.999835493205914030, 0.999836398855404870, 0.999837302005304740, +0.999838202655611300, 0.999839100806322430, 0.999839996457435820, 0.999840889608949120, 0.999841780260860240, 0.999842668413166940, 0.999843554065866890, 0.999844437218958100, +0.999845317872438130, 0.999846196026304870, 0.999847071680556090, 0.999847944835189680, 0.999848815490203320, 0.999849683645595010, 0.999850549301362520, 0.999851412457503530, +0.999852273114016140, 0.999853131270898030, 0.999853986928147090, 0.999854840085761200, 0.999855690743738150, 0.999856538902075930, 0.999857384560772330, 0.999858227719825240, +0.999859068379232660, 0.999859906538992370, 0.999860742199102260, 0.999861575359560330, 0.999862406020364470, 0.999863234181512680, 0.999864059843002640, 0.999864883004832560, +0.999865703667000340, 0.999866521829503750, 0.999867337492340910, 0.999868150655509600, 0.999868961319008040, 0.999869769482834010, 0.999870575146985630, 0.999871378311460780, +0.999872178976257460, 0.999872977141373800, 0.999873772806807560, 0.999874565972556970, 0.999875356638619930, 0.999876144804994540, 0.999876930471678690, 0.999877713638670620, +0.999878494305968200, 0.999879272473569560, 0.999880048141472800, 0.999880821309675820, 0.999881591978176830, 0.999882360146973960, 0.999883125816065090, 0.999883888985448440, +0.999884649655122030, 0.999885407825083950, 0.999886163495332440, 0.999886916665865490, 0.999887667336681220, 0.999888415507777850, 0.999889161179153390, 0.999889904350806050, +0.999890645022733950, 0.999891383194935200, 0.999892118867408030, 0.999892852040150550, 0.999893582713160980, 0.999894310886437430, 0.999895036559978020, 0.999895759733781090, +0.999896480407844850, 0.999897198582167300, 0.999897914256746790, 0.999898627431581420, 0.999899338106669530, 0.999900046282009350, 0.999900751957598980, 0.999901455133436760, +0.999902155809520910, 0.999902853985849660, 0.999903549662421340, 0.999904242839234070, 0.999904933516286180, 0.999905621693576000, 0.999906307371101750, 0.999906990548861780, +0.999907671226854310, 0.999908349405077670, 0.999909025083530080, 0.999909698262209990, 0.999910368941115620, 0.999911037120245430, 0.999911702799597510, 0.999912365979170440, +0.999913026658962420, 0.999913684838971810, 0.999914340519197030, 0.999914993699636320, 0.999915644380288130, 0.999916292561150890, 0.999916938242222940, 0.999917581423502620, +0.999918222104988370, 0.999918860286678530, 0.999919495968571550, 0.999920129150665750, 0.999920759832959800, 0.999921388015451830, 0.999922013698140380, 0.999922636881023900, +0.999923257564100940, 0.999923875747369740, 0.999924491430828840, 0.999925104614476700, 0.999925715298311870, 0.999926323482332680, 0.999926929166537800, 0.999927532350925460, +0.999928133035494330, 0.999928731220242950, 0.999929326905169670, 0.999929920090273040, 0.999930510775551620, 0.999931098961003960, 0.999931684646628630, 0.999932267832423950, +0.999932848518388710, 0.999933426704521230, 0.999934002390820310, 0.999934575577284270, 0.999935146263911890, 0.999935714450701620, 0.999936280137652010, 0.999936843324761740, +0.999937404012029350, 0.999937962199453520, 0.999938517887032700, 0.999939071074765650, 0.999939621762650830, 0.999940169950687020, 0.999940715638872770, 0.999941258827206750, +0.999941799515687510, 0.999942337704313840, 0.999942873393084410, 0.999943406581997650, 0.999943937271052460, 0.999944465460247400, 0.999944991149581130, 0.999945514339052430, +0.999946035028659970, 0.999946553218402310, 0.999947068908278450, 0.999947582098286820, 0.999948092788426220, 0.999948600978695420, 0.999949106669093090, 0.999949609859618000, +0.999950110550268830, 0.999950608741044470, 0.999951104431943570, 0.999951597622964930, 0.999952088314107200, 0.999952576505369390, 0.999953062196750060, 0.999953545388248100, +0.999954026079862280, 0.999954504271591380, 0.999954979963434190, 0.999955453155389580, 0.999955923847456350, 0.999956392039633270, 0.999956857731919220, 0.999957320924313000, +0.999957781616813590, 0.999958239809419670, 0.999958695502130120, 0.999959148694943840, 0.999959599387859720, 0.999960047580876530, 0.999960493273993280, 0.999960936467208740, +0.999961377160521910, 0.999961815353931690, 0.999962251047436860, 0.999962684241036400, 0.999963114934729220, 0.999963543128514320, 0.999963968822390580, 0.999964392016356780, +0.999964812710412150, 0.999965230904555470, 0.999965646598785620, 0.999966059793101710, 0.999966470487502650, 0.999966878681987410, 0.999967284376554910, 0.999967687571204240, +0.999968088265934420, 0.999968486460744320, 0.999968882155633070, 0.999969275350599540, 0.999969666045642860, 0.999970054240762020, 0.999970439935956020, 0.999970823131223870, +0.999971203826564680, 0.999971582021977560, 0.999971957717461500, 0.999972330913015410, 0.999972701608638600, 0.999973069804329980, 0.999973435500088770, 0.999973798695913850, +0.999974159391804560, 0.999974517587759790, 0.999974873283778760, 0.999975226479860590, 0.999975577176004270, 0.999975925372209030, 0.999976271068473980, 0.999976614264798220, +0.999976954961181000, 0.999977293157621410, 0.999977628854118450, 0.999977962050671580, 0.999978292747279670, 0.999978620943942080, 0.999978946640658010, 0.999979269837426470, +0.999979590534246790, 0.999979908731118080, 0.999980224428039690, 0.999980537625010710, 0.999980848322030380, 0.999981156519097910, 0.999981462216212650, 0.999981765413373580, +0.999982066110580270, 0.999982364307831610, 0.999982660005127140, 0.999982953202466000, 0.999983243899847500, 0.999983532097270870, 0.999983817794735440, 0.999984100992240440, +0.999984381689785210, 0.999984659887369070, 0.999984935584991130, 0.999985208782650960, 0.999985479480347770, 0.999985747678080910, 0.999986013375849580, 0.999986276573653240, +0.999986537271491230, 0.999986795469362980, 0.999987051167267600, 0.999987304365204670, 0.999987555063173380, 0.999987803261173310, 0.999988048959203680, 0.999988292157263920, +0.999988532855353500, 0.999988771053471730, 0.999989006751617950, 0.999989239949791720, 0.999989470647992370, 0.999989698846219350, 0.999989924544472110, 0.999990147742750080, +0.999990368441052600, 0.999990586639379230, 0.999990802337729410, 0.999991015536102590, 0.999991226234498210, 0.999991434432915720, 0.999991640131354780, 0.999991843329814610, +0.999992044028294890, 0.999992242226795060, 0.999992437925314560, 0.999992631123853060, 0.999992821822409890, 0.999993010020984730, 0.999993195719577120, 0.999993378918186400, +0.999993559616812240, 0.999993737815454200, 0.999993913514111820, 0.999994086712784670, 0.999994257411472300, 0.999994425610174260, 0.999994591308890230, 0.999994754507619650, +0.999994915206362190, 0.999995073405117510, 0.999995229103885050, 0.999995382302664600, 0.999995533001455610, 0.999995681200257840, 0.999995826899070850, 0.999995970097894320, +0.999996110796727900, 0.999996248995571160, 0.999996384694423760, 0.999996517893285470, 0.999996648592155870, 0.999996776791034600, 0.999996902489921460, 0.999997025688815990, +0.999997146387717970, 0.999997264586627080, 0.999997380285543080, 0.999997493484465540, 0.999997604183394340, 0.999997712382329150, 0.999997818081269640, 0.999997921280215580, +0.999998021979166760, 0.999998120178122840, 0.999998215877083600, 0.999998309076048920, 0.999998399775018370, 0.999998487973991820, 0.999998573672969180, 0.999998656871950000, +0.999998737570934160, 0.999998815769921560, 0.999998891468911850, 0.999998964667904940, 0.999999035366900600, 0.999999103565898610, 0.999999169264898960, 0.999999232463901320, +0.999999293162905700, 0.999999351361911760, 0.999999407060919500, 0.999999460259928700, 0.999999510958939240, 0.999999559157951020, 0.999999604856963820, 0.999999648055977740, +0.999999688754992460, 0.999999726954007960, 0.999999762653024150, 0.999999795852040910, 0.999999826551058240, 0.999999854750076020, 0.999999880449094050, 0.999999903648112530, +0.999999924347131140, 0.999999942546149990, 0.999999958245168960, 0.999999971444187950, 0.999999982143207180, 0.999999990342226310, 0.999999996041245560, 0.999999999240264840, +0.999999999939284010, 0.999999998138303310, 0.999999993837322520, 0.999999987036341740, 0.999999977735361090, 0.999999965934380450, 0.999999951633399830, 0.999999934832419330, +0.999999915531439080, 0.999999893730459060, 0.999999869429479270, 0.999999842628499720, 0.999999813327520640, 0.999999781526542010, 0.999999747225563950, 0.999999710424586570, +0.999999671123609770, 0.999999629322633980, 0.999999585021658980, 0.999999538220684990, 0.999999488919712240, 0.999999437118740730, 0.999999382817770680, 0.999999326016802190, +0.999999266715835280, 0.999999204914870270, 0.999999140613907270, 0.999999073812946390, 0.999999004511987750, 0.999998932711031690, 0.999998858410078300, 0.999998781609127700, +0.999998702308180220, 0.999998620507235980, 0.999998536206295090, 0.999998449405357980, 0.999998360104424670, 0.999998268303495470, 0.999998174002570630, 0.999998077201650350, +0.999997977900734860, 0.999997876099824490, 0.999997771798919350, 0.999997664998019790, 0.999997555697126120, 0.999997443896238570, 0.999997329595357360, 0.999997212794482840, +0.999997093493615210, 0.999996971692754920, 0.999996847391902310, 0.999996720591057380, 0.999996591290220780, 0.999996459489392640, 0.999996325188573400, 0.999996188387763390, +0.999996049086962820, 0.999995907286172160, 0.999995762985391720, 0.999995616184621850, 0.999995466883862980, 0.999995315083115450, 0.999995160782379600, 0.999995003981655860, +0.999994844680944570, 0.999994682880246290, 0.999994518579561230, 0.999994351778889850, 0.999994182478232570, 0.999994010677589860, 0.999993836376962150, 0.999993659576349890, +0.999993480275753410, 0.999993298475173260, 0.999993114174609790, 0.999992927374063640, 0.999992738073535170, 0.999992546273024810, 0.999992351972533110, 0.999992155172060530, +0.999991955871607500, 0.999991754071174580, 0.999991549770762320, 0.999991342970371180, 0.999991133670001700, 0.999990921869654440, 0.999990707569329840, 0.999990490769028350, +0.999990271468750750, 0.999990049668497470, 0.999989825368269080, 0.999989598568066020, 0.999989369267889060, 0.999989137467738650, 0.999988903167615460, 0.999988666367519930, +0.999988427067452720, 0.999988185267414510, 0.999987940967405840, 0.999987694167427280, 0.999987444867479480, 0.999987193067563120, 0.999986938767678750, 0.999986681967826920, +0.999986422668008520, 0.999986160868224010, 0.999985896568474140, 0.999985629768759490, 0.999985360469080820, 0.999985088669438690, 0.999984814369833890, 0.999984537570267060, +0.999984258270738780, 0.999983976471249920, 0.999983692171801160, 0.999983405372393160, 0.999983116073026590, 0.999982824273702330, 0.999982529974420940, 0.999982233175183200, +0.999981933875989880, 0.999981632076841760, 0.999981327777739630, 0.999981020978684020, 0.999980711679675950, 0.999980399880716190, 0.999980085581805290, 0.999979768782944260, +0.999979449484133750, 0.999979127685374560, 0.999978803386667670, 0.999978476588013750, 0.999978147289413590, 0.999977815490868170, 0.999977481192378060, 0.999977144393944360, +0.999976805095567740, 0.999976463297249100, 0.999976118998989420, 0.999975772200789260, 0.999975422902649850, 0.999975071104571730, 0.999974716806556030, 0.999974360008603510, +0.999974000710715070, 0.999973638912891700, 0.999973274615134190, 0.999972907817443410, 0.999972538519820490, 0.999972166722266190, 0.999971792424781400, 0.999971415627367240, +0.999971036330024490, 0.999970654532754130, 0.999970270235557180, 0.999969883438434510, 0.999969494141387140, 0.999969102344416050, 0.999968708047522140, 0.999968311250706510, +0.999967911953970170, 0.999967510157314000, 0.999967105860739000, 0.999966699064246290, 0.999966289767836860, 0.999965877971511600, 0.999965463675271730, 0.999965046879118250, +0.999964627583052050, 0.999964205787074350, 0.999963781491186030, 0.999963354695388440, 0.999962925399682350, 0.999962493604068970, 0.999962059308549310, 0.999961622513124480, +0.999961183217795700, 0.999960741422563860, 0.999960297127430290, 0.999959850332395870, 0.999959401037461840, 0.999958949242629290, 0.999958494947899460, 0.999958038153273330, +0.999957578858752140, 0.999957117064336990, 0.999956652770028990, 0.999956185975829470, 0.999955716681739330, 0.999955244887760000, 0.999954770593892590, 0.999954293800138230, +0.999953814506498120, 0.999953332712973490, 0.999952848419565440, 0.999952361626275320, 0.999951872333104340, 0.999951380540053610, 0.999950886247124470, 0.999950389454318130, +0.999949890161635820, 0.999949388369078760, 0.999948884076648280, 0.999948377284345600, 0.999947867992171830, 0.999947356200128530, 0.999946841908216810, 0.999946325116438000, +0.999945805824793310, 0.999945284033284200, 0.999944759741911770, 0.999944232950677580, 0.999943703659582630, 0.999943171868628580, 0.999942637577816540, 0.999942100787147850, +0.999941561496624050, 0.999941019706246270, 0.999940475416015940, 0.999939928625934390, 0.999939379336002960, 0.999938827546223210, 0.999938273256596340, 0.999937716467123820, +0.999937157177806960, 0.999936595388647210, 0.999936031099646020, 0.999935464310804710, 0.999934895022124850, 0.999934323233607650, 0.999933748945254660, 0.999933172157067230, +0.999932592869046900, 0.999932011081195120, 0.999931426793513320, 0.999930840006002960, 0.999930250718665480, 0.999929658931502430, 0.999929064644515140, 0.999928467857705280, +0.999927868571074190, 0.999927266784623400, 0.999926662498354490, 0.999926055712268890, 0.999925446426368270, 0.999924834640653960, 0.999924220355127510, 0.999923603569790490, +0.999922984284644540, 0.999922362499691130, 0.999921738214931800, 0.999921111430368100, 0.999920482146001710, 0.999919850361833950, 0.999919216077866710, 0.999918579294101440, +0.999917940010539570, 0.999917298227183000, 0.999916653944033060, 0.999916007161091640, 0.999915357878360060, 0.999914706095840210, 0.999914051813533540, 0.999913395031441720, +0.999912735749566410, 0.999912073967909270, 0.999911409686471960, 0.999910742905256060, 0.999910073624263430, 0.999909401843495530, 0.999908727562954120, 0.999908050782640890, +0.999907371502557600, 0.999906689722705800, 0.999906005443087280, 0.999905318663703800, 0.999904629384557040, 0.999903937605648660, 0.999903243326980440, 0.999902546548554150, +0.999901847270371460, 0.999901145492434140, 0.999900441214743970, 0.999899734437302730, 0.999899025160112090, 0.999898313383173920, 0.999897599106490010, 0.999896882330062020, +0.999896163053891950, 0.999895441277981360, 0.999894717002332230, 0.999893990226946250, 0.999893260951825290, 0.999892529176971250, 0.999891794902385780, 0.999891058128070890, +0.999890318854028350, 0.999889577080260050, 0.999888832806767770, 0.999888086033553390, 0.999887336760618920, 0.999886584987966010, 0.999885830715596560, 0.999885073943512670, +0.999884314671716010, 0.999883552900208580, 0.999882788628992270, 0.999882021858069070, 0.999881252587440650, 0.999880480817109230, 0.999879706547076590, 0.999878929777344600, +0.999878150507915400, 0.999877368738790740, 0.999876584469972740, 0.999875797701463180, 0.999875008433264270, 0.999874216665377680, 0.999873422397805630, 0.999872625630550020, +0.999871826363612830, 0.999871024596996060, 0.999870220330701830, 0.999869413564731910, 0.999868604299088530, 0.999867792533773670, 0.999866978268789230, 0.999866161504137430, +0.999865342239820270, 0.999864520475839620, 0.999863696212197730, 0.999862869448896570, 0.999862040185938270, 0.999861208423324930, 0.999860374161058550, 0.999859537399141130, +0.999858698137575000, 0.999857856376362040, 0.999857012115504480, 0.999856165355004320, 0.999855316094863780, 0.999854464335084960, 0.999853610075669970, 0.999852753316621050, +0.999851894057940170, 0.999851032299629460, 0.999850168041691360, 0.999849301284127740, 0.999848432026940850, 0.999847560270132880, 0.999846686013705970, 0.999845809257662420, +0.999844930002004360, 0.999844048246734010, 0.999843163991853470, 0.999842277237364960, 0.999841387983270820, 0.999840496229573270, 0.999839601976274420, 0.999838705223376590, +0.999837805970882010, 0.999836904218792790, 0.999835999967111480, 0.999835093215840080, 0.999834183964980920, 0.999833272214536330, 0.999832357964508640, 0.999831441214899970, +0.999830521965712760, 0.999829600216949220, 0.999828675968611580, 0.999827749220702390, 0.999826819973223760, 0.999825888226178020, 0.999824953979567720, 0.999824017233394870, +0.999823077987662120, 0.999822136242371600, 0.999821191997525730, 0.999820245253126960, 0.999819296009177520, 0.999818344265679840, 0.999817390022636250, 0.999816433280049210, +0.999815474037921150, 0.999814512296254400, 0.999813548055051290, 0.999812581314314390, 0.999811612074046010, 0.999810640334248600, 0.999809666094924500, 0.999808689356076360, +0.999807710117706420, 0.999806728379817320, 0.999805744142411300, 0.999804757405490910, 0.999803768169058690, 0.999802776433116990, 0.999801782197668350, 0.999800785462715340, +0.999799786228260270, 0.999798784494305810, 0.999797780260854310, 0.999796773527908410, 0.999795764295470570, 0.999794752563543330, 0.999793738332129260, 0.999792721601230780, +0.999791702370850470, 0.999790680640990970, 0.999789656411654740, 0.999788629682844320, 0.999787600454562390, 0.999786568726811380, 0.999785534499594060, 0.999784497772912890, +0.999783458546770420, 0.999782416821169310, 0.999781372596112110, 0.999780325871601590, 0.999779276647640210, 0.999778224924230630, 0.999777170701375510, 0.999776113979077400, +0.999775054757339080, 0.999773993036163100, 0.999772928815552130, 0.999771862095508830, 0.999770792876035870, 0.999769721157136030, 0.999768646938811730, 0.999767570221065880, +0.999766491003901140, 0.999765409287320160, 0.999764325071325620, 0.999763238355920290, 0.999762149141106840, 0.999761057426888140, 0.999759963213266660, 0.999758866500245260, +0.999757767287826840, 0.999756665576013840, 0.999755561364809250, 0.999754454654215750, 0.999753345444236110, 0.999752233734873100, 0.999751119526129610, 0.999750002818008190, +0.999748883610511840, 0.999747761903643230, 0.999746637697405240, 0.999745510991800650, 0.999744381786832230, 0.999743250082502980, 0.999742115878815450, 0.999740979175772760, +0.999739839973377560, 0.999738698271632750, 0.999737554070541210, 0.999736407370105830, 0.999735258170329380, 0.999734106471214860, 0.999732952272764930, 0.999731795574982820, +0.999730636377871070, 0.999729474681432690, 0.999728310485670790, 0.999727143790588020, 0.999725974596187390, 0.999724802902471790, 0.999723628709444310, 0.999722452017107630, +0.999721272825464860, 0.999720091134518870, 0.999718906944272680, 0.999717720254729270, 0.999716531065891530, 0.999715339377762470, 0.999714145190345070, 0.999712948503642230, +0.999711749317657160, 0.999710547632392640, 0.999709343447851780, 0.999708136764037470, 0.999706927580952920, 0.999705715898601020, 0.999704501716984770, 0.999703285036107280, +0.999702065855971660, 0.999700844176580890, 0.999699619997937880, 0.999698393320045950, 0.999697164142907990, 0.999695932466527100, 0.999694698290906400, 0.999693461616048880, +0.999692222441957770, 0.999690980768636160, 0.999689736596087060, 0.999688489924313580, 0.999687240753318940, 0.999685989083106130, 0.999684734913678370, 0.999683478245038780, +0.999682219077190460, 0.999680957410136630, 0.999679693243880400, 0.999678426578424980, 0.999677157413773390, 0.999675885749929050, 0.999674611586894860, 0.999673334924674250, +0.999672055763270230, 0.999670774102686120, 0.999669489942925040, 0.999668203283990200, 0.999666914125884930, 0.999665622468612350, 0.999664328312175670, 0.999663031656578220, +0.999661732501823220, 0.999660430847913780, 0.999659126694853350, 0.999657820042645140, 0.999656510891292260, 0.999655199240798150, 0.999653885091166040, 0.999652568442399250, +0.999651249294501110, 0.999649927647474730, 0.999648603501323560, 0.999647276856050930, 0.999645947711660040, 0.999644616068154250, 0.999643281925536980, 0.999641945283811560, +0.999640606142981230, 0.999639264503049300, 0.999637920364019330, 0.999636573725894540, 0.999635224588678260, 0.999633872952373940, 0.999632518816985010, 0.999631162182514690, +0.999629803048966540, 0.999628441416343770, 0.999627077284649950, 0.999625710653888500, 0.999624341524062650, 0.999622969895176070, 0.999621595767232090, 0.999620219140234020, +0.999618840014185440, 0.999617458389089770, 0.999616074264950360, 0.999614687641770860, 0.999613298519554610, 0.999611906898305150, 0.999610512778025930, 0.999609116158720390, +0.999607717040392090, 0.999606315423044460, 0.999604911306681050, 0.999603504691305430, 0.999602095576920920, 0.999600683963531300, 0.999599269851139890, 0.999597853239750370, +0.999596434129366160, 0.999595012519990830, 0.999593588411628040, 0.999592161804281230, 0.999590732697954070, 0.999589301092650100, 0.999587866988372880, 0.999586430385125850, +0.999584991282912890, 0.999583549681737460, 0.999582105581602990, 0.999580658982513360, 0.999579209884472130, 0.999577758287482850, 0.999576304191549190, 0.999574847596674700, +0.999573388502863150, 0.999571926910118090, 0.999570462818443200, 0.999568996227842230, 0.999567527138318760, 0.999566055549876430, 0.999564581462518920, 0.999563104876250110, +0.999561625791073440, 0.999560144206992680, 0.999558660124011510, 0.999557173542133800, 0.999555684461363110, 0.999554192881703220, 0.999552698803157890, 0.999551202225730790, +0.999549703149425590, 0.999548201574246290, 0.999546697500196310, 0.999545190927279780, 0.999543681855500130, 0.999542170284861360, 0.999540656215367140, 0.999539139647021240, +0.999537620579827530, 0.999536099013789700, 0.999534574948911740, 0.999533048385197300, 0.999531519322650160, 0.999529987761274330, 0.999528453701073460, 0.999526917142051440, +0.999525378084212270, 0.999523836527559490, 0.999522292472097230, 0.999520745917829130, 0.999519196864759210, 0.999517645312891330, 0.999516091262229400, 0.999514534712777180, +0.999512975664538560, 0.999511414117517540, 0.999509850071718000, 0.999508283527143830, 0.999506714483799020, 0.999505142941687350, 0.999503568900812820, 0.999501992361179430, +0.999500413322790940, 0.999498831785651460, 0.999497247749765010, 0.999495661215135330, 0.999494072181766560, 0.999492480649662560, 0.999490886618827350, 0.999489290089264900, +0.999487691060979340, 0.999486089533974440, 0.999484485508254420, 0.999482878983823150, 0.999481269960684650, 0.999479658438843010, 0.999478044418302130, 0.999476427899066210, +0.999474808881139270, 0.999473187364525280, 0.999471563349228260, 0.999469936835252430, 0.999468307822601650, 0.999466676311280170, 0.999465042301291960, 0.999463405792641150, +0.999461766785331940, 0.999460125279368230, 0.999458481274754120, 0.999456834771493940, 0.999455185769591580, 0.999453534269051370, 0.999451880269877190, 0.999450223772073380, +0.999448564775644030, 0.999446903280593270, 0.999445239286925190, 0.999443572794644020, 0.999441903803753970, 0.999440232314259160, 0.999438558326163680, 0.999436881839471880, +0.999435202854187850, 0.999433521370315820, 0.999431837387860010, 0.999430150906824630, 0.999428461927213800, 0.999426770449031830, 0.999425076472282960, 0.999423379996971390, +0.999421681023101360, 0.999419979550677180, 0.999418275579703090, 0.999416569110183170, 0.999414860142121890, 0.999413148675523440, 0.999411434710392180, 0.999409718246732300, +0.999407999284548150, 0.999406277823843950, 0.999404553864624120, 0.999402827406892790, 0.999401098450654500, 0.999399366995913470, 0.999397633042673930, 0.999395896590940410, +0.999394157640717040, 0.999392416192008360, 0.999390672244818590, 0.999388925799152170, 0.999387176855013440, 0.999385425412406820, 0.999383671471336550, 0.999381915031807180, +0.999380156093822910, 0.999378394657388310, 0.999376630722507820, 0.999374864289185650, 0.999373095357426240, 0.999371323927234270, 0.999369549998613830, 0.999367773571569580, +0.999365994646105980, 0.999364213222227350, 0.999362429299938130, 0.999360642879242870, 0.999358853960146010, 0.999357062542652000, 0.999355268626765270, 0.999353472212490490, +0.999351673299831990, 0.999349871888794320, 0.999348067979381920, 0.999346261571599340, 0.999344452665451130, 0.999342641260941860, 0.999340827358075940, 0.999339010956857950, +0.999337192057292430, 0.999335370659383940, 0.999333546763137020, 0.999331720368556110, 0.999329891475646100, 0.999328060084411220, 0.999326226194856230, 0.999324389806985680, +0.999322550920804240, 0.999320709536316350, 0.999318865653526680, 0.999317019272439770, 0.999315170393060390, 0.999313319015393110, 0.999311465139442580, 0.999309608765213350, +0.999307749892709980, 0.999305888521937360, 0.999304024652899910, 0.999302158285602540, 0.999300289420049670, 0.999298418056246200, 0.999296544194196560, 0.999294667833905640, +0.999292788975377990, 0.999290907618618380, 0.999289023763631490, 0.999287137410422080, 0.999285248558994810, 0.999283357209354350, 0.999281463361505580, 0.999279567015453170, +0.999277668171201780, 0.999275766828756300, 0.999273862988121380, 0.999271956649301680, 0.999270047812302220, 0.999268136477127640, 0.999266222643782620, 0.999264306312272140, +0.999262387482600880, 0.999260466154773600, 0.999258542328795190, 0.999256616004670420, 0.999254687182404180, 0.999252755862001130, 0.999250822043466270, 0.999248885726804260, +0.999246946912020100, 0.999245005599118550, 0.999243061788104510, 0.999241115478982760, 0.999239166671758270, 0.999237215366435840, 0.999235261563020450, 0.999233305261516770, +0.999231346461929900, 0.999229385164264630, 0.999227421368525940, 0.999225455074718720, 0.999223486282847850, 0.999221514992918220, 0.999219541204934840, 0.999217564918902570, +0.999215586134826420, 0.999213604852711270, 0.999211621072562230, 0.999209634794383960, 0.999207646018181790, 0.999205654743960390, 0.999203660971724860, 0.999201664701480200, +0.999199665933231280, 0.999197664666983340, 0.999195660902741150, 0.999193654640509910, 0.999191645880294410, 0.999189634622099860, 0.999187620865931270, 0.999185604611793510, +0.999183585859691800, 0.999181564609631150, 0.999179540861616530, 0.999177514615653070, 0.999175485871745870, 0.999173454629899930, 0.999171420890120340, 0.999169384652412230, +0.999167345916780690, 0.999165304683230730, 0.999163260951767440, 0.999161214722396160, 0.999159165995121780, 0.999157114769949390, 0.999155061046884340, 0.999153004825931500, +0.999150946107096320, 0.999148884890383670, 0.999146821175798780, 0.999144754963346980, 0.999142686253033150, 0.999140615044862620, 0.999138541338840610, 0.999136465134972230, +0.999134386433262690, 0.999132305233717210, 0.999130221536340900, 0.999128135341139090, 0.999126046648116880, 0.999123955457279610, 0.999121861768632380, 0.999119765582180630, +0.999117666897929360, 0.999115565715884000, 0.999113462036049670, 0.999111355858431690, 0.999109247183035290, 0.999107136009865780, 0.999105022338928510, 0.999102906170228680, +0.999100787503771510, 0.999098666339562350, 0.999096542677606610, 0.999094416517909530, 0.999092287860476320, 0.999090156705312430, 0.999088023052423170, 0.999085886901813770, +0.999083748253489780, 0.999081607107456300, 0.999079463463718900, 0.999077317322282780, 0.999075168683153380, 0.999073017546336040, 0.999070863911836190, 0.999068707779659170, +0.999066549149810410, 0.999064388022295250, 0.999062224397119110, 0.999060058274287450, 0.999057889653805600, 0.999055718535679090, 0.999053544919913160, 0.999051368806513460, +0.999049190195485330, 0.999047009086834300, 0.999044825480565610, 0.999042639376684920, 0.999040450775197650, 0.999038259676109150, 0.999036066079425080, 0.999033869985150870, +0.999031671393291960, 0.999029470303853920, 0.999027266716842170, 0.999025060632262150, 0.999022852050119650, 0.999020640970419870, 0.999018427393168600, 0.999016211318371260, +0.999013992746033310, 0.999011771676160510, 0.999009548108758190, 0.999007322043831910, 0.999005093481387440, 0.999002862421430220, 0.999000628863965900, 0.998998392808999940, +0.998996154256537980, 0.998993913206585700, 0.998991669659148540, 0.998989423614232260, 0.998987175071842430, 0.998984924031984690, 0.998982670494664600, 0.998980414459887830, +0.998978155927660040, 0.998975894897986880, 0.998973631370873920, 0.998971365346326910, 0.998969096824351530, 0.998966825804953440, 0.998964552288138190, 0.998962276273911650, +0.998959997762279280, 0.998957716753247070, 0.998955433246820460, 0.998953147243005320, 0.998950858741807330, 0.998948567743232150, 0.998946274247285550, 0.998943978253973300, +0.998941679763301060, 0.998939378775274610, 0.998937075289899830, 0.998934769307182280, 0.998932460827127830, 0.998930149849742150, 0.998927836375031130, 0.998925520403000640, +0.998923201933656250, 0.998920880967003820, 0.998918557503049250, 0.998916231541798210, 0.998913903083256670, 0.998911572127430310, 0.998909238674325130, 0.998906902723946780, +0.998904564276301140, 0.998902223331394110, 0.998899879889231570, 0.998897533949819280, 0.998895185513163140, 0.998892834579269140, 0.998890481148142940, 0.998888125219790650, +0.998885766794217920, 0.998883405871430870, 0.998881042451435270, 0.998878676534237010, 0.998876308119842180, 0.998873937208256460, 0.998871563799486050, 0.998869187893536630, +0.998866809490414180, 0.998864428590124810, 0.998862045192674300, 0.998859659298068750, 0.998857270906313930, 0.998854880017416070, 0.998852486631380930, 0.998850090748214630, +0.998847692367923030, 0.998845291490512270, 0.998842888115988200, 0.998840482244356950, 0.998838073875624510, 0.998835663009796980, 0.998833249646880140, 0.998830833786880200, +0.998828415429803270, 0.998825994575655240, 0.998823571224442210, 0.998821145376170280, 0.998818717030845460, 0.998816286188473850, 0.998813852849061550, 0.998811417012614560, +0.998808978679139090, 0.998806537848641150, 0.998804094521126840, 0.998801648696602370, 0.998799200375073750, 0.998796749556547180, 0.998794296241028560, 0.998791840428524310, +0.998789382119040450, 0.998786921312583180, 0.998784458009158600, 0.998781992208772840, 0.998779523911432100, 0.998777053117142600, 0.998774579825910340, 0.998772104037741750, +0.998769625752642940, 0.998767144970619910, 0.998764661691679210, 0.998762175915826720, 0.998759687643068770, 0.998757196873411690, 0.998754703606861580, 0.998752207843424670, +0.998749709583107270, 0.998747208825915610, 0.998744705571856020, 0.998742199820934600, 0.998739691573157560, 0.998737180828531360, 0.998734667587062310, 0.998732151848756520, +0.998729633613620330, 0.998727112881660050, 0.998724589652882020, 0.998722063927292570, 0.998719535704897910, 0.998717004985704370, 0.998714471769718280, 0.998711936056946080, +0.998709397847394100, 0.998706857141068550, 0.998704313937975870, 0.998701768238122400, 0.998699220041514570, 0.998696669348158590, 0.998694116158061030, 0.998691560471228090, +0.998689002287666330, 0.998686441607382070, 0.998683878430381640, 0.998681312756671490, 0.998678744586258160, 0.998676173919147870, 0.998673600755347170, 0.998671025094862500, +0.998668446937700290, 0.998665866283867000, 0.998663283133368940, 0.998660697486212780, 0.998658109342404730, 0.998655518701951460, 0.998652925564859410, 0.998650329931135120, +0.998647731800784920, 0.998645131173815480, 0.998642528050233120, 0.998639922430044400, 0.998637314313255970, 0.998634703699874170, 0.998632090589905760, 0.998629474983356970, +0.998626856880234560, 0.998624236280545090, 0.998621613184294880, 0.998618987591490700, 0.998616359502139010, 0.998613728916246560, 0.998611095833819680, 0.998608460254865050, +0.998605822179389310, 0.998603181607399030, 0.998600538538900740, 0.998597892973901110, 0.998595244912406700, 0.998592594354424270, 0.998589941299960370, 0.998587285749021560, +0.998584627701614600, 0.998581967157745940, 0.998579304117422460, 0.998576638580650710, 0.998573970547437350, 0.998571300017789150, 0.998568626991712560, 0.998565951469214450, +0.998563273450301490, 0.998560592934980340, 0.998557909923257770, 0.998555224415140330, 0.998552536410634790, 0.998549845909748050, 0.998547152912486640, 0.998544457418857330, +0.998541759428866920, 0.998539058942522040, 0.998536355959829480, 0.998533650480796120, 0.998530942505428620, 0.998528232033733750, 0.998525519065718290, 0.998522803601389120, +0.998520085640752900, 0.998517365183816400, 0.998514642230586500, 0.998511916781069990, 0.998509188835273730, 0.998506458393204510, 0.998503725454869100, 0.998500990020274480, +0.998498252089427220, 0.998495511662334410, 0.998492768739002830, 0.998490023319439370, 0.998487275403650790, 0.998484524991643970, 0.998481772083425920, 0.998479016679003520, +0.998476258778383420, 0.998473498381572730, 0.998470735488578340, 0.998467970099407020, 0.998465202214065870, 0.998462431832561670, 0.998459658954901410, 0.998456883581091970, +0.998454105711140350, 0.998451325345053430, 0.998448542482838210, 0.998445757124501680, 0.998442969270050720, 0.998440178919492330, 0.998437386072833500, 0.998434590730081230, +0.998431792891242510, 0.998428992556324220, 0.998426189725333480, 0.998423384398277270, 0.998420576575162700, 0.998417766255996540, 0.998414953440786010, 0.998412138129538110, +0.998409320322259820, 0.998406500018958360, 0.998403677219640520, 0.998400851924313600, 0.998398024132984400, 0.998395193845660330, 0.998392361062348080, 0.998389525783055070, +0.998386688007788180, 0.998383847736554530, 0.998381004969361330, 0.998378159706215680, 0.998375311947124480, 0.998372461692095150, 0.998369608941134470, 0.998366753694249990, +0.998363895951448480, 0.998361035712737270, 0.998358172978123460, 0.998355307747614270, 0.998352440021216810, 0.998349569798938190, 0.998346697080785610, 0.998343821866766400, +0.998340944156887570, 0.998338063951156430, 0.998335181249580090, 0.998332296052165780, 0.998329408358920810, 0.998326518169852290, 0.998323625484967340, 0.998320730304273480, +0.998317832627777730, 0.998314932455487410, 0.998312029787409850, 0.998309124623552150, 0.998306216963921630, 0.998303306808525530, 0.998300394157371150, 0.998297479010465840, +0.998294561367816800, 0.998291641229431480, 0.998288718595316870, 0.998285793465480630, 0.998282865839929870, 0.998279935718671800, 0.998277003101713970, 0.998274067989063710, +0.998271130380728230, 0.998268190276714980, 0.998265247677031180, 0.998262302581684250, 0.998259354990681640, 0.998256404904030560, 0.998253452321738450, 0.998250497243812870, +0.998247539670260920, 0.998244579601090140, 0.998241617036307870, 0.998238651975921650, 0.998235684419938710, 0.998232714368366580, 0.998229741821212710, 0.998226766778484540, +0.998223789240189400, 0.998220809206334710, 0.998217826676928040, 0.998214841651976830, 0.998211854131488500, 0.998208864115470500, 0.998205871603930370, 0.998202876596875680, +0.998199879094313620, 0.998196879096251990, 0.998193876602698090, 0.998190871613659490, 0.998187864129143730, 0.998184854149158360, 0.998181841673710820, 0.998178826702808660, +0.998175809236459430, 0.998172789274670680, 0.998169766817449950, 0.998166741864804810, 0.998163714416742790, 0.998160684473271550, 0.998157652034398550, 0.998154617100131540, +0.998151579670477850, 0.998148539745445260, 0.998145497325041320, 0.998142452409273570, 0.998139404998149790, 0.998136355091677420, 0.998133302689864220, 0.998130247792717750, +0.998127190400245670, 0.998124130512455630, 0.998121068129355080, 0.998118003250952120, 0.998114935877253970, 0.998111866008268620, 0.998108793644003510, 0.998105718784466520, +0.998102641429665090, 0.998099561579607110, 0.998096479234300230, 0.998093394393752220, 0.998090307057970640, 0.998087217226963360, 0.998084124900737950, 0.998081030079302380, +0.998077932762664100, 0.998074832950830990, 0.998071730643810830, 0.998068625841611380, 0.998065518544240300, 0.998062408751705490, 0.998059296464014590, 0.998056181681175490, +0.998053064403195970, 0.998049944630083670, 0.998046822361846610, 0.998043697598492430, 0.998040570340029130, 0.998037440586464260, 0.998034308337805930, 0.998031173594061680, +0.998028036355239620, 0.998024896621347410, 0.998021754392392930, 0.998018609668384070, 0.998015462449328820, 0.998012312735234830, 0.998009160526110000, 0.998006005821962310, +0.998002848622799530, 0.997999688928629780, 0.997996526739460710, 0.997993362055300310, 0.997990194876156590, 0.997987025202037300, 0.997983853032950560, 0.997980678368904140, +0.997977501209905920, 0.997974321555963990, 0.997971139407086370, 0.997967954763280820, 0.997964767624555330, 0.997961577990918000, 0.997958385862376730, 0.997955191238939500, +0.997951994120614190, 0.997948794507409030, 0.997945592399331780, 0.997942387796390550, 0.997939180698593440, 0.997935971105948340, 0.997932759018463340, 0.997929544436146340, +0.997926327359005550, 0.997923107787048960, 0.997919885720284560, 0.997916661158720460, 0.997913434102364770, 0.997910204551225370, 0.997906972505310570, 0.997903737964628280, +0.997900500929186700, 0.997897261398993820, 0.997894019374057750, 0.997890774854386710, 0.997887527839988690, 0.997884278330871900, 0.997881026327044340, 0.997877771828514230, +0.997874514835289770, 0.997871255347378970, 0.997867993364790040, 0.997864728887531080, 0.997861461915610310, 0.997858192449035950, 0.997854920487815990, 0.997851646031958860, +0.997848369081472560, 0.997845089636365310, 0.997841807696645430, 0.997838523262320920, 0.997835236333400210, 0.997831946909891410, 0.997828654991802620, 0.997825360579142170, +0.997822063671918500, 0.997818764270139600, 0.997815462373813690, 0.997812157982949310, 0.997808851097554350, 0.997805541717637360, 0.997802229843206430, 0.997798915474270020, +0.997795598610836330, 0.997792279252913580, 0.997788957400510210, 0.997785633053634440, 0.997782306212294470, 0.997778976876498860, 0.997775645046255710, 0.997772310721573460, +0.997768973902460550, 0.997765634588925090, 0.997762292780975610, 0.997758948478620340, 0.997755601681867830, 0.997752252390726070, 0.997748900605203830, 0.997745546325309430, +0.997742189551050980, 0.997738830282437260, 0.997735468519476370, 0.997732104262176730, 0.997728737510546800, 0.997725368264595120, 0.997721996524330020, 0.997718622289759940, +0.997715245560893300, 0.997711866337738560, 0.997708484620304150, 0.997705100408598500, 0.997701713702630060, 0.997698324502407470, 0.997694932807938970, 0.997691538619233100, +0.997688141936298510, 0.997684742759143540, 0.997681341087776620, 0.997677936922206410, 0.997674530262441240, 0.997671121108489880, 0.997667709460360760, 0.997664295318062220, +0.997660878681603020, 0.997657459550991720, 0.997654037926236640, 0.997650613807346430, 0.997647187194329770, 0.997643758087195080, 0.997640326485951130, 0.997636892390606270, +0.997633455801169130, 0.997630016717648390, 0.997626575140052710, 0.997623131068390400, 0.997619684502670360, 0.997616235442901120, 0.997612783889091360, 0.997609329841249610, +0.997605873299384440, 0.997602414263504710, 0.997598952733618760, 0.997595488709735580, 0.997592022191863710, 0.997588553180011720, 0.997585081674188360, 0.997581607674402290, +0.997578131180662190, 0.997574652192976810, 0.997571170711354700, 0.997567686735804650, 0.997564200266335520, 0.997560711302955870, 0.997557219845674360, 0.997553725894499870, +0.997550229449441050, 0.997546730510506570, 0.997543229077705320, 0.997539725151046050, 0.997536218730537440, 0.997532709816188250, 0.997529198408007360, 0.997525684506003430, +0.997522168110185240, 0.997518649220561660, 0.997515127837141470, 0.997511603959933430, 0.997508077588946440, 0.997504548724189260, 0.997501017365670760, 0.997497483513399620, +0.997493947167384820, 0.997490408327635030, 0.997486866994159340, 0.997483323166966420, 0.997479776846065260, 0.997476228031464630, 0.997472676723173410, 0.997469122921200490, +0.997465566625554740, 0.997462007836245170, 0.997458446553280530, 0.997454882776669830, 0.997451316506421830, 0.997447747742545630, 0.997444176485050020, 0.997440602733943970, +0.997437026489236380, 0.997433447750936230, 0.997429866519052410, 0.997426282793594020, 0.997422696574569940, 0.997419107861989060, 0.997415516655860480, 0.997411922956193080, +0.997408326762995730, 0.997404728076277670, 0.997401126896047870, 0.997397523222315230, 0.997393917055088730, 0.997390308394377480, 0.997386697240190360, 0.997383083592536580, +0.997379467451425030, 0.997375848816864920, 0.997372227688865130, 0.997368604067434770, 0.997364977952582830, 0.997361349344318530, 0.997357718242650850, 0.997354084647588790, +0.997350448559141680, 0.997346809977318280, 0.997343168902128040, 0.997339525333579720, 0.997335879271682660, 0.997332230716445940, 0.997328579667878580, 0.997324926125989660, +0.997321270090788640, 0.997317611562284380, 0.997313950540485990, 0.997310287025402810, 0.997306621017043930, 0.997302952515418450, 0.997299281520535600, 0.997295608032404580, +0.997291932051034500, 0.997288253576434580, 0.997284572608614140, 0.997280889147582170, 0.997277203193348010, 0.997273514745920740, 0.997269823805309710, 0.997266130371524230, +0.997262434444573410, 0.997258736024466460, 0.997255035111212720, 0.997251331704821280, 0.997247625805301570, 0.997243917412662830, 0.997240206526914250, 0.997236493148065170, +0.997232777276124920, 0.997229058911102580, 0.997225338053007730, 0.997221614701849560, 0.997217888857637290, 0.997214160520380140, 0.997210429690087770, 0.997206696366769400, +0.997202960550434110, 0.997199222241091590, 0.997195481438750920, 0.997191738143421550, 0.997187992355112800, 0.997184244073834100, 0.997180493299594790, 0.997176740032404200, +0.997172984272271860, 0.997169226019206990, 0.997165465273219140, 0.997161702034317530, 0.997157936302511590, 0.997154168077810990, 0.997150397360224930, 0.997146624149762850, +0.997142848446434190, 0.997139070250248390, 0.997135289561215000, 0.997131506379343340, 0.997127720704642840, 0.997123932537123170, 0.997120141876793540, 0.997116348723663730, +0.997112553077742940, 0.997108754939040720, 0.997104954307566740, 0.997101151183330310, 0.997097345566340890, 0.997093537456608230, 0.997089726854141660, 0.997085913758950840, +0.997082098171045320, 0.997078280090434420, 0.997074459517127810, 0.997070636451135030, 0.997066810892465740, 0.997062982841129490, 0.997059152297135710, 0.997055319260493960, +0.997051483731213990, 0.997047645709305370, 0.997043805194777530, 0.997039962187640240, 0.997036116687903040, 0.997032268695575490, 0.997028418210667340, 0.997024565233188160, +0.997020709763147490, 0.997016851800555100, 0.997012991345420540, 0.997009128397753570, 0.997005262957563750, 0.997001395024860740, 0.996997524599654290, 0.996993651681953970, +0.996989776271769660, 0.996985898369110780, 0.996982017973987110, 0.996978135086408420, 0.996974249706384490, 0.996970361833924960, 0.996966471469039380, 0.996962578611737760, +0.996958683262029630, 0.996954785419924770, 0.996950885085432950, 0.996946982258563930, 0.996943076939327490, 0.996939169127733280, 0.996935258823791190, 0.996931346027510990, +0.996927430738902440, 0.996923512957975210, 0.996919592684739180, 0.996915669919204330, 0.996911744661380220, 0.996907816911276720, 0.996903886668903730, 0.996899953934271000, +0.996896018707388420, 0.996892080988265650, 0.996888140776912790, 0.996884198073339610, 0.996880252877555990, 0.996876305189571600, 0.996872355009396530, 0.996868402337040550, +0.996864447172513550, 0.996860489515825400, 0.996856529366986100, 0.996852566726005420, 0.996848601592893350, 0.996844633967659770, 0.996840663850314670, 0.996836691240867820, +0.996832716139329220, 0.996828738545708860, 0.996824758460016720, 0.996820775882262590, 0.996816790812456670, 0.996812803250608610, 0.996808813196728650, 0.996804820650826650, +0.996800825612912500, 0.996796828082996300, 0.996792828061088150, 0.996788825547197830, 0.996784820541335550, 0.996780813043511070, 0.996776803053734730, 0.996772790572016180, +0.996768775598365740, 0.996764758132793420, 0.996760738175309190, 0.996756715725923060, 0.996752690784645230, 0.996748663351485600, 0.996744633426454360, 0.996740601009561410, +0.996736566100817070, 0.996732528700231320, 0.996728488807814280, 0.996724446423575940, 0.996720401547526500, 0.996716354179676080, 0.996712304320034770, 0.996708251968612680, +0.996704197125419910, 0.996700139790466790, 0.996696079963763190, 0.996692017645319450, 0.996687952835145660, 0.996683885533252050, 0.996679815739648590, 0.996675743454345730, +0.996671668677353460, 0.996667591408682000, 0.996663511648341550, 0.996659429396342330, 0.996655344652694560, 0.996651257417408450, 0.996647167690494110, 0.996643075471961850, +0.996638980761822000, 0.996634883560084670, 0.996630783866760180, 0.996626681681858640, 0.996622577005390480, 0.996618469837365790, 0.996614360177794920, 0.996610248026688180, +0.996606133384055790, 0.996602016249908180, 0.996597896624255460, 0.996593774507107950, 0.996589649898476090, 0.996585522798369980, 0.996581393206800170, 0.996577261123776870, +0.996573126549310410, 0.996568989483411110, 0.996564849926089400, 0.996560707877355510, 0.996556563337219870, 0.996552416305692800, 0.996548266782784630, 0.996544114768505910, +0.996539960262866840, 0.996535803265877980, 0.996531643777549440, 0.996527481797891970, 0.996523317326915570, 0.996519150364631010, 0.996514980911048620, 0.996510808966178720, +0.996506634530031850, 0.996502457602618350, 0.996498278183948650, 0.996494096274033400, 0.996489911872882720, 0.996485724980507360, 0.996481535596917770, 0.996477343722124260, +0.996473149356137400, 0.996468952498967610, 0.996464753150625550, 0.996460551311121550, 0.996456346980466150, 0.996452140158669900, 0.996447930845743230, 0.996443719041696820, +0.996439504746541190, 0.996435287960286690, 0.996431068682943950, 0.996426846914523550, 0.996422622655036120, 0.996418395904491990, 0.996414166662902060, 0.996409934930276520, +0.996405700706626260, 0.996401463991961720, 0.996397224786293560, 0.996392983089632200, 0.996388738901988540, 0.996384492223373000, 0.996380243053796240, 0.996375991393268820, +0.996371737241801500, 0.996367480599404720, 0.996363221466089240, 0.996358959841865840, 0.996354695726744950, 0.996350429120737350, 0.996346160023853680, 0.996341888436104610, +0.996337614357500790, 0.996333337788053000, 0.996329058727771670, 0.996324777176667900, 0.996320493134752130, 0.996316206602035130, 0.996311917578527550, 0.996307626064240280, +0.996303332059183980, 0.996299035563369180, 0.996294736576806890, 0.996290435099507770, 0.996286131131482570, 0.996281824672741960, 0.996277515723296920, 0.996273204283158020, +0.996268890352336120, 0.996264573930841890, 0.996260255018686310, 0.996255933615880160, 0.996251609722434090, 0.996247283338358990, 0.996242954463665730, 0.996238623098365080, +0.996234289242467930, 0.996229952895984930, 0.996225614058927070, 0.996221272731305230, 0.996216928913130180, 0.996212582604412810, 0.996208233805164100, 0.996203882515394710, +0.996199528735115520, 0.996195172464337530, 0.996190813703071720, 0.996186452451328860, 0.996182088709119840, 0.996177722476455640, 0.996173353753347040, 0.996168982539805130, +0.996164608835840680, 0.996160232641464800, 0.996155853956688260, 0.996151472781522160, 0.996147089115977380, 0.996142702960064910, 0.996138314313795630, 0.996133923177180520, +0.996129529550230600, 0.996125133432956830, 0.996120734825370340, 0.996116333727481980, 0.996111930139302770, 0.996107524060843800, 0.996103115492115940, 0.996098704433130310, +0.996094290883897890, 0.996089874844429790, 0.996085456314736990, 0.996081035294830500, 0.996076611784721510, 0.996072185784421030, 0.996067757293939930, 0.996063326313289530, +0.996058892842480730, 0.996054456881524830, 0.996050018430432730, 0.996045577489215630, 0.996041134057884530, 0.996036688136450630, 0.996032239724924940, 0.996027788823318660, +0.996023335431642900, 0.996018879549908860, 0.996014421178127660, 0.996009960316310280, 0.996005496964468160, 0.996001031122612180, 0.995996562790753550, 0.995992091968903700, +0.995987618657073530, 0.995983142855274340, 0.995978664563517250, 0.995974183781813570, 0.995969700510174420, 0.995965214748610990, 0.995960726497134410, 0.995956235755756090, +0.995951742524487260, 0.995947246803339010, 0.995942748592322680, 0.995938247891449470, 0.995933744700730710, 0.995929239020177490, 0.995924730849801150, 0.995920220189613010, +0.995915707039624400, 0.995911191399846410, 0.995906673270290480, 0.995902152650967930, 0.995897629541889980, 0.995893103943067850, 0.995888575854513070, 0.995884045276236750, +0.995879512208250440, 0.995874976650565240, 0.995870438603192690, 0.995865898066144010, 0.995861355039430630, 0.995856809523063770, 0.995852261517054860, 0.995847711021415450, +0.995843158036156640, 0.995838602561289980, 0.995834044596826900, 0.995829484142778610, 0.995824921199156550, 0.995820355765972280, 0.995815787843237100, 0.995811217430962460, +0.995806644529159790, 0.995802069137840420, 0.995797491257016000, 0.995792910886697750, 0.995788328026897210, 0.995783742677625930, 0.995779154838895340, 0.995774564510716780, +0.995769971693101770, 0.995765376386062000, 0.995760778589608650, 0.995756178303753400, 0.995751575528507570, 0.995746970263882920, 0.995742362509890900, 0.995737752266542930, +0.995733139533850560, 0.995728524311825350, 0.995723906600478830, 0.995719286399822430, 0.995714663709867940, 0.995710038530626780, 0.995705410862110620, 0.995700780704330770, +0.995696148057299110, 0.995691512921026980, 0.995686875295526130, 0.995682235180808010, 0.995677592576884260, 0.995672947483766670, 0.995668299901466660, 0.995663649829995890, +0.995658997269366020, 0.995654342219588710, 0.995649684680675500, 0.995645024652637930, 0.995640362135487900, 0.995635697129237050, 0.995631029633896940, 0.995626359649479210, +0.995621687175995530, 0.995617012213457770, 0.995612334761877270, 0.995607654821266120, 0.995602972391635750, 0.995598287472997940, 0.995593600065364570, 0.995588910168747070, +0.995584217783157310, 0.995579522908606960, 0.995574825545107790, 0.995570125692671560, 0.995565423351310150, 0.995560718521035120, 0.995556011201858220, 0.995551301393791330, +0.995546589096846240, 0.995541874311034580, 0.995537157036368360, 0.995532437272859120, 0.995527715020518840, 0.995522990279359310, 0.995518263049392280, 0.995513533330629640, +0.995508801123083150, 0.995504066426764480, 0.995499329241685830, 0.995494589567858860, 0.995489847405295340, 0.995485102754007260, 0.995480355614006380, 0.995475605985304600, +0.995470853867913900, 0.995466099261845930, 0.995461342167112790, 0.995456582583726270, 0.995451820511698340, 0.995447055951040880, 0.995442288901765670, 0.995437519363884800, +0.995432747337410160, 0.995427972822353620, 0.995423195818727180, 0.995418416326542710, 0.995413634345812200, 0.995408849876547650, 0.995404062918760930, 0.995399273472464040, +0.995394481537668960, 0.995389687114387690, 0.995384890202632320, 0.995380090802414630, 0.995375288913746710, 0.995370484536640570, 0.995365677671108170, 0.995360868317161640, +0.995356056474812840, 0.995351242144074000, 0.995346425324957100, 0.995341606017474120, 0.995336784221637070, 0.995331959937458040, 0.995327133164949140, 0.995322303904122350, +0.995317472154989890, 0.995312637917563750, 0.995307801191856020, 0.995302961977878710, 0.995298120275644130, 0.995293276085164160, 0.995288429406451010, 0.995283580239516690, +0.995278728584373500, 0.995273874441033550, 0.995269017809508830, 0.995264158689811550, 0.995259297081953930, 0.995254432985948070, 0.995249566401806060, 0.995244697329540240, +0.995239825769162590, 0.995234951720685430, 0.995230075184120880, 0.995225196159481240, 0.995220314646778510, 0.995215430646025020, 0.995210544157232760, 0.995205655180414370, +0.995200763715581750, 0.995195869762747320, 0.995190973321923080, 0.995186074393121570, 0.995181172976354780, 0.995176269071635030, 0.995171362678974550, 0.995166453798385750, +0.995161542429880860, 0.995156628573472090, 0.995151712229171760, 0.995146793396992080, 0.995141872076945490, 0.995136948269044090, 0.995132021973300420, 0.995127093189726700, +0.995122161918335250, 0.995117228159138390, 0.995112291912148450, 0.995107353177377860, 0.995102411954838730, 0.995097468244543590, 0.995092522046504890, 0.995087573360734830, +0.995082622187245860, 0.995077668526050400, 0.995072712377160660, 0.995067753740589200, 0.995062792616348220, 0.995057829004450390, 0.995052862904907910, 0.995047894317733330, +0.995042923242939080, 0.995037949680537490, 0.995032973630541000, 0.995027995092962030, 0.995023014067813020, 0.995018030555106630, 0.995013044554855060, 0.995008056067070880, +0.995003065091766610, 0.994998071628954710, 0.994993075678647590, 0.994988077240857800, 0.994983076315597680, 0.994978072902880100, 0.994973067002717150, 0.994968058615121610, +0.994963047740106020, 0.994958034377682710, 0.994953018527864330, 0.994948000190663320, 0.994942979366092330, 0.994937956054163910, 0.994932930254890710, 0.994927901968285070, +0.994922871194359740, 0.994917837933127270, 0.994912802184600100, 0.994907763948790880, 0.994902723225712380, 0.994897680015377040, 0.994892634317797510, 0.994887586132986330, +0.994882535460956290, 0.994877482301719910, 0.994872426655289740, 0.994867368521678450, 0.994862307900898800, 0.994857244792963450, 0.994852179197884930, 0.994847111115675920, +0.994842040546349280, 0.994836967489917460, 0.994831891946393100, 0.994826813915789090, 0.994821733398118080, 0.994816650393392730, 0.994811564901625810, 0.994806476922829970, +0.994801386457017880, 0.994796293504202290, 0.994791198064395980, 0.994786100137611710, 0.994780999723862140, 0.994775896823160140, 0.994770791435518390, 0.994765683560949630, +0.994760573199466760, 0.994755460351082310, 0.994750345015809280, 0.994745227193660430, 0.994740106884648420, 0.994734984088786240, 0.994729858806086550, 0.994724731036562230, +0.994719600780226030, 0.994714468037090850, 0.994709332807169440, 0.994704195090474810, 0.994699054887019710, 0.994693912196816910, 0.994688767019879410, 0.994683619356219850, +0.994678469205851350, 0.994673316568786550, 0.994668161445038560, 0.994663003834620140, 0.994657843737544290, 0.994652681153823770, 0.994647516083471570, 0.994642348526500570, +0.994637178482923660, 0.994632005952753810, 0.994626830936004010, 0.994621653432687050, 0.994616473442816010, 0.994611290966403770, 0.994606106003463330, 0.994600918554007670, +0.994595728618049570, 0.994590536195602230, 0.994585341286678530, 0.994580143891291460, 0.994574944009454120, 0.994569741641179390, 0.994564536786480270, 0.994559329445369840, +0.994554119617861000, 0.994548907303966940, 0.994543692503700560, 0.994538475217075060, 0.994533255444103310, 0.994528033184798430, 0.994522808439173400, 0.994517581207241320, +0.994512351489015400, 0.994507119284508630, 0.994501884593734010, 0.994496647416704630, 0.994491407753433700, 0.994486165603934210, 0.994480920968219380, 0.994475673846302090, +0.994470424238195760, 0.994465172143913280, 0.994459917563467970, 0.994454660496872810, 0.994449400944141030, 0.994444138905285710, 0.994438874380319970, 0.994433607369257120, +0.994428337872110270, 0.994423065888892620, 0.994417791419617280, 0.994412514464297460, 0.994407235022946260, 0.994401953095577110, 0.994396668682202890, 0.994391381782837150, +0.994386092397492980, 0.994380800526183490, 0.994375506168922010, 0.994370209325721840, 0.994364909996596100, 0.994359608181558110, 0.994354303880620960, 0.994348997093798200, +0.994343687821102940, 0.994338376062548380, 0.994333061818147960, 0.994327745087914880, 0.994322425871862480, 0.994317104170003850, 0.994311779982352540, 0.994306453308921760, +0.994301124149724940, 0.994295792504775290, 0.994290458374086140, 0.994285121757670810, 0.994279782655542730, 0.994274441067715120, 0.994269096994201410, 0.994263750435015030, +0.994258401390169190, 0.994253049859677440, 0.994247695843553100, 0.994242339341809390, 0.994236980354459950, 0.994231618881517900, 0.994226254922996880, 0.994220888478910330, +0.994215519549271450, 0.994210148134093810, 0.994204774233390820, 0.994199397847175810, 0.994194018975462330, 0.994188637618263820, 0.994183253775593690, 0.994177867447465500, +0.994172478633892580, 0.994167087334888570, 0.994161693550466800, 0.994156297280640700, 0.994150898525423820, 0.994145497284829820, 0.994140093558872010, 0.994134687347564050, +0.994129278650919380, 0.994123867468951430, 0.994118453801673850, 0.994113037649100080, 0.994107619011243780, 0.994102197888118380, 0.994096774279737530, 0.994091348186114780, +0.994085919607263560, 0.994080488543197640, 0.994075054993930450, 0.994069618959475540, 0.994064180439846680, 0.994058739435057400, 0.994053295945121260, 0.994047849970051910, +0.994042401509862890, 0.994036950564567870, 0.994031497134180490, 0.994026041218714180, 0.994020582818182950, 0.994015121932600220, 0.994009658561979760, 0.994004192706335110, +0.993998724365679930, 0.993993253540027990, 0.993987780229392830, 0.993982304433788320, 0.993976826153228020, 0.993971345387725690, 0.993965862137294990, 0.993960376401949670, +0.993954888181703300, 0.993949397476569850, 0.993943904286562650, 0.993938408611695910, 0.993932910451983060, 0.993927409807437990, 0.993921906678074450, 0.993916401063906110, +0.993910892964946720, 0.993905382381210070, 0.993899869312709900, 0.993894353759460230, 0.993888835721474570, 0.993883315198766940, 0.993877792191350860, 0.993872266699240450, +0.993866738722449240, 0.993861208260991220, 0.993855675314880170, 0.993850139884130070, 0.993844601968754460, 0.993839061568767450, 0.993833518684182790, 0.993827973315014270, +0.993822425461275860, 0.993816875122981220, 0.993811322300144570, 0.993805766992779560, 0.993800209200900180, 0.993794648924520300, 0.993789086163653690, 0.993783520918314460, +0.993777953188516250, 0.993772382974273390, 0.993766810275599430, 0.993761235092508580, 0.993755657425014480, 0.993750077273131360, 0.993744494636872980, 0.993738909516253430, +0.993733321911286490, 0.993727731821986370, 0.993722139248366830, 0.993716544190441970, 0.993710946648225790, 0.993705346621732270, 0.993699744110975280, 0.993694139115969040, +0.993688531636727320, 0.993682921673264330, 0.993677309225594050, 0.993671694293730480, 0.993666076877687710, 0.993660456977479730, 0.993654834593120650, 0.993649209724624340, +0.993643582372005120, 0.993637952535276980, 0.993632320214453910, 0.993626685409550010, 0.993621048120579500, 0.993615408347556350, 0.993609766090494560, 0.993604121349408340, +0.993598474124311900, 0.993592824415219340, 0.993587172222144650, 0.993581517545102040, 0.993575860384105610, 0.993570200739169570, 0.993564538610307910, 0.993558873997535060, +0.993553206900865020, 0.993547537320311870, 0.993541865255889940, 0.993536190707613340, 0.993530513675496270, 0.993524834159552950, 0.993519152159797360, 0.993513467676244040, +0.993507780708907110, 0.993502091257800650, 0.993496399322938980, 0.993490704904336330, 0.993485008002006900, 0.993479308615964900, 0.993473606746224540, 0.993467902392800360, +0.993462195555706360, 0.993456486234956860, 0.993450774430566170, 0.993445060142548520, 0.993439343370918220, 0.993433624115689470, 0.993427902376876840, 0.993422178154494410, +0.993416451448556500, 0.993410722259077450, 0.993404990586071570, 0.993399256429553290, 0.993393519789536830, 0.993387780666036500, 0.993382039059066750, 0.993376294968641990, +0.993370548394776450, 0.993364799337484560, 0.993359047796780640, 0.993353293772679110, 0.993347537265194420, 0.993341778274340670, 0.993336016800132620, 0.993330252842584580, +0.993324486401710780, 0.993318717477525870, 0.993312946070044170, 0.993307172179280110, 0.993301395805248010, 0.993295616947962420, 0.993289835607437890, 0.993284051783688730, +0.993278265476729480, 0.993272476686574590, 0.993266685413238480, 0.993260891656735590, 0.993255095417080460, 0.993249296694287630, 0.993243495488371650, 0.993237691799346840, +0.993231885627227860, 0.993226076972029140, 0.993220265833765210, 0.993214452212450530, 0.993208636108099730, 0.993202817520727480, 0.993196996450348090, 0.993191172896976340, +0.993185346860626540, 0.993179518341313460, 0.993173687339051540, 0.993167853853855200, 0.993162017885739430, 0.993156179434718680, 0.993150338500807360, 0.993144495084020250, +0.993138649184371890, 0.993132800801876940, 0.993126949936549930, 0.993121096588405530, 0.993115240757458380, 0.993109382443723150, 0.993103521647214490, 0.993097658367947060, +0.993091792605935500, 0.993085924361194360, 0.993080053633738410, 0.993074180423582420, 0.993068304730740930, 0.993062426555228690, 0.993056545897060380, 0.993050662756250760, +0.993044777132814360, 0.993038889026766180, 0.993032998438120540, 0.993027105366892540, 0.993021209813096830, 0.993015311776748070, 0.993009411257861020, 0.993003508256450450, +0.992997602772531020, 0.992991694806117710, 0.992985784357225070, 0.992979871425867970, 0.992973956012061290, 0.992968038115819680, 0.992962117737157920, 0.992956194876090880, +0.992950269532633430, 0.992944341706800130, 0.992938411398606170, 0.992932478608066100, 0.992926543335194810, 0.992920605580007280, 0.992914665342518150, 0.992908722622742320, +0.992902777420694770, 0.992896829736390150, 0.992890879569843570, 0.992884926921069780, 0.992878971790083660, 0.992873014176900100, 0.992867054081533970, 0.992861091504000260, +0.992855126444313730, 0.992849158902489480, 0.992843188878542280, 0.992837216372487230, 0.992831241384339090, 0.992825263914112740, 0.992819283961823280, 0.992813301527485700, +0.992807316611114650, 0.992801329212725570, 0.992795339332332990, 0.992789346969952140, 0.992783352125597980, 0.992777354799285310, 0.992771354991029310, 0.992765352700844980, +0.992759347928747090, 0.992753340674750960, 0.992747330938871570, 0.992741318721123700, 0.992735304021522660, 0.992729286840083320, 0.992723267176820690, 0.992717245031749850, +0.992711220404886020, 0.992705193296244070, 0.992699163705839220, 0.992693131633686440, 0.992687097079800850, 0.992681060044197430, 0.992675020526891380, 0.992668978527897710, +0.992662934047231720, 0.992656887084908400, 0.992650837640942860, 0.992644785715350200, 0.992638731308145510, 0.992632674419344110, 0.992626615048960990, 0.992620553197011150, +0.992614488863510110, 0.992608422048472880, 0.992602352751914550, 0.992596280973850330, 0.992590206714295430, 0.992584129973264950, 0.992578050750774100, 0.992571969046838200, +0.992565884861472460, 0.992559798194691870, 0.992553709046511860, 0.992547617416947640, 0.992541523306014310, 0.992535426713727190, 0.992529327640101380, 0.992523226085152310, +0.992517122048895310, 0.992511015531345350, 0.992504906532517990, 0.992498795052428220, 0.992492681091091570, 0.992486564648523140, 0.992480445724738260, 0.992474324319752350, +0.992468200433580640, 0.992462074066238430, 0.992455945217741050, 0.992449813888103830, 0.992443680077341960, 0.992437543785470890, 0.992431405012506040, 0.992425263758462740, +0.992419120023356190, 0.992412973807201840, 0.992406825110015100, 0.992400673931811310, 0.992394520272605770, 0.992388364132413820, 0.992382205511251110, 0.992376044409132850, +0.992369880826074580, 0.992363714762091510, 0.992357546217199180, 0.992351375191413030, 0.992345201684748270, 0.992339025697220660, 0.992332847228845400, 0.992326666279638060, +0.992320482849614160, 0.992314296938788920, 0.992308108547177990, 0.992301917674796810, 0.992295724321660690, 0.992289528487785400, 0.992283330173186260, 0.992277129377878820, +0.992270926101878500, 0.992264720345200970, 0.992258512107861530, 0.992252301389875860, 0.992246088191259370, 0.992239872512027720, 0.992233654352196460, 0.992227433711781020, +0.992221210590796930, 0.992214984989259860, 0.992208756907185350, 0.992202526344588830, 0.992196293301486070, 0.992190057777892600, 0.992183819773823970, 0.992177579289295840, +0.992171336324323750, 0.992165090878923240, 0.992158842953110080, 0.992152592546899690, 0.992146339660307960, 0.992140084293350320, 0.992133826446042530, 0.992127566118400140, +0.992121303310438800, 0.992115038022174270, 0.992108770253621990, 0.992102500004797940, 0.992096227275717560, 0.992089952066396720, 0.992083674376850970, 0.992077394207095950, +0.992071111557147560, 0.992064826427021320, 0.992058538816732890, 0.992052248726298270, 0.992045956155732990, 0.992039661105052820, 0.992033363574273520, 0.992027063563410860, +0.992020761072480490, 0.992014456101498190, 0.992008148650479700, 0.992001838719440920, 0.991995526308397490, 0.991989211417365290, 0.991982894046360090, 0.991976574195397640, +0.991970251864493720, 0.991963927053664100, 0.991957599762924750, 0.991951269992291440, 0.991944937741779940, 0.991938603011406130, 0.991932265801185760, 0.991925926111134730, +0.991919583941268890, 0.991913239291604020, 0.991906892162156110, 0.991900542552940910, 0.991894190463974420, 0.991887835895272520, 0.991881478846850960, 0.991875119318725740, +0.991868757310912730, 0.991862392823427590, 0.991856025856286740, 0.991849656409505730, 0.991843284483100660, 0.991836910077087300, 0.991830533191481730, 0.991824153826299740, +0.991817771981557290, 0.991811387657270620, 0.991805000853455350, 0.991798611570127610, 0.991792219807303370, 0.991785825564998610, 0.991779428843229230, 0.991773029642011310, +0.991766627961360610, 0.991760223801293580, 0.991753817161825980, 0.991747408042973790, 0.991740996444753110, 0.991734582367179930, 0.991728165810270230, 0.991721746774040120, +0.991715325258505700, 0.991708901263682940, 0.991702474789587950, 0.991696045836236720, 0.991689614403645450, 0.991683180491830130, 0.991676744100806860, 0.991670305230591630, +0.991663863881200760, 0.991657420052650120, 0.991650973744956030, 0.991644524958134490, 0.991638073692201690, 0.991631619947173640, 0.991625163723066530, 0.991618705019896460, +0.991612243837679650, 0.991605780176432310, 0.991599314036170520, 0.991592845416910400, 0.991586374318668140, 0.991579900741460070, 0.991573424685302070, 0.991566946150210570, +0.991560465136201770, 0.991553981643291780, 0.991547495671496800, 0.991541007220833160, 0.991534516291316950, 0.991528022882964490, 0.991521526995791770, 0.991515028629815440, +0.991508527785051500, 0.991502024461516250, 0.991495518659225920, 0.991489010378196810, 0.991482499618445150, 0.991475986379987240, 0.991469470662839300, 0.991462952467017880, +0.991456431792538950, 0.991449908639418950, 0.991443383007674210, 0.991436854897320920, 0.991430324308375630, 0.991423791240854340, 0.991417255694773680, 0.991410717670149990, +0.991404177166999360, 0.991397634185338330, 0.991391088725183220, 0.991384540786550470, 0.991377990369456290, 0.991371437473916980, 0.991364882099949330, 0.991358324247569310, +0.991351763916793580, 0.991345201107638460, 0.991338635820120270, 0.991332068054255560, 0.991325497810060520, 0.991318925087551820, 0.991312349886745880, 0.991305772207659030, +0.991299192050307700, 0.991292609414708430, 0.991286024300877640, 0.991279436708831780, 0.991272846638587280, 0.991266254090160670, 0.991259659063568500, 0.991253061558827200, +0.991246461575953200, 0.991239859114963040, 0.991233254175873270, 0.991226646758700310, 0.991220036863460720, 0.991213424490171020, 0.991206809638847890, 0.991200192309507620, +0.991193572502167000, 0.991186950216842330, 0.991180325453550280, 0.991173698212307390, 0.991167068493130300, 0.991160436296035560, 0.991153801621039830, 0.991147164468159430, +0.991140524837411220, 0.991133882728811640, 0.991127238142377460, 0.991120591078125000, 0.991113941536071130, 0.991107289516232500, 0.991100635018625550, 0.991093978043267040, +0.991087318590173630, 0.991080656659361960, 0.991073992250848470, 0.991067325364650030, 0.991060656000783410, 0.991053984159265160, 0.991047309840111800, 0.991040633043340340, +0.991033953768967190, 0.991027272017009240, 0.991020587787482920, 0.991013901080405210, 0.991007211895792880, 0.991000520233662360, 0.990993826094030640, 0.990987129476914360, +0.990980430382330300, 0.990973728810295110, 0.990967024760825430, 0.990960318233938380, 0.990953609229650480, 0.990946897747978620, 0.990940183788939440, 0.990933467352549830, +0.990926748438826550, 0.990920027047786370, 0.990913303179446150, 0.990906576833822660, 0.990899848010932780, 0.990893116710793280, 0.990886382933420910, 0.990879646678832660, +0.990872907947045300, 0.990866166738075480, 0.990859423051940410, 0.990852676888656750, 0.990845928248241470, 0.990839177130711350, 0.990832423536083250, 0.990825667464374060, +0.990818908915600760, 0.990812147889780110, 0.990805384386929110, 0.990798618407064740, 0.990791849950203750, 0.990785079016363150, 0.990778305605559910, 0.990771529717810790, +0.990764751353132910, 0.990757970511543130, 0.990751187193058440, 0.990744401397695820, 0.990737613125472150, 0.990730822376404530, 0.990724029150509720, 0.990717233447804930, +0.990710435268306930, 0.990703634612033040, 0.990696831478999900, 0.990690025869224830, 0.990683217782724610, 0.990676407219516330, 0.990669594179617090, 0.990662778663043750, +0.990655960669813540, 0.990649140199943430, 0.990642317253450530, 0.990635491830351820, 0.990628663930664290, 0.990621833554405140, 0.990615000701591470, 0.990608165372240170, +0.990601327566368540, 0.990594487283993570, 0.990587644525132480, 0.990580799289802140, 0.990573951578019860, 0.990567101389802750, 0.990560248725167900, 0.990553393584132190, +0.990546535966713270, 0.990539675872927900, 0.990532813302793300, 0.990525948256326780, 0.990519080733545330, 0.990512210734466160, 0.990505338259106470, 0.990498463307483480, +0.990491585879614280, 0.990484705975516190, 0.990477823595206200, 0.990470938738701840, 0.990464051406020010, 0.990457161597178120, 0.990450269312193150, 0.990443374551082670, +0.990436477313863640, 0.990429577600553500, 0.990422675411169460, 0.990415770745728730, 0.990408863604248510, 0.990401953986746130, 0.990395041893238790, 0.990388127323744040, +0.990381210278278860, 0.990374290756860680, 0.990367368759506710, 0.990360444286234380, 0.990353517337061010, 0.990346587912003700, 0.990339656011079980, 0.990332721634307080, +0.990325784781702410, 0.990318845453283410, 0.990311903649067180, 0.990304959369071150, 0.990298012613312850, 0.990291063381809280, 0.990284111674578190, 0.990277157491636920, +0.990270200833002660, 0.990263241698692950, 0.990256280088725130, 0.990249316003116500, 0.990242349441884610, 0.990235380405046880, 0.990228408892620760, 0.990221434904623550, +0.990214458441072810, 0.990207479501985840, 0.990200498087380310, 0.990193514197273420, 0.990186527831682710, 0.990179538990625720, 0.990172547674119890, 0.990165553882182750, +0.990158557614831740, 0.990151558872084280, 0.990144557653957920, 0.990137553960470210, 0.990130547791638450, 0.990123539147480410, 0.990116528028013640, 0.990109514433255460, +0.990102498363223500, 0.990095479817935330, 0.990088458797408480, 0.990081435301660260, 0.990074409330708670, 0.990067380884571020, 0.990060349963264970, 0.990053316566807950, +0.990046280695217720, 0.990039242348511710, 0.990032201526707680, 0.990025158229822950, 0.990018112457875520, 0.990011064210882810, 0.990004013488862360, 0.989996960291831930, +0.989989904619809070, 0.989982846472811540, 0.989975785850856770, 0.989968722753962530, 0.989961657182146460, 0.989954589135426330, 0.989947518613819800, 0.989940445617344400, +0.989933370146017900, 0.989926292199857950, 0.989919211778882090, 0.989912128883108420, 0.989905043512554370, 0.989897955667237820, 0.989890865347176300, 0.989883772552387580, +0.989876677282889530, 0.989869579538699700, 0.989862479319835840, 0.989855376626315840, 0.989848271458157460, 0.989841163815378460, 0.989834053697996490, 0.989826941106029310, +0.989819826039494920, 0.989812708498410740, 0.989805588482794980, 0.989798465992665190, 0.989791341028039230, 0.989784213588934980, 0.989777083675370210, 0.989769951287362670, +0.989762816424930250, 0.989755679088090700, 0.989748539276862020, 0.989741396991262070, 0.989734252231308620, 0.989727104997019440, 0.989719955288412610, 0.989712803105505800, +0.989705648448317100, 0.989698491316864050, 0.989691331711164970, 0.989684169631237510, 0.989677005077099660, 0.989669838048769290, 0.989662668546264280, 0.989655496569602610, +0.989648322118802160, 0.989641145193880910, 0.989633965794856850, 0.989626783921747850, 0.989619599574572020, 0.989612412753347100, 0.989605223458091100, 0.989598031688822100, +0.989590837445557870, 0.989583640728316730, 0.989576441537116440, 0.989569239871974980, 0.989562035732910570, 0.989554829119940970, 0.989547620033084270, 0.989540408472358470, +0.989533194437781760, 0.989525977929372020, 0.989518758947147360, 0.989511537491125860, 0.989504313561325400, 0.989497087157764300, 0.989489858280460430, 0.989482626929431670, +0.989475393104696680, 0.989468156806273090, 0.989460918034179020, 0.989453676788432770, 0.989446433069052330, 0.989439186876055810, 0.989431938209461290, 0.989424687069286770, +0.989417433455550670, 0.989410177368271080, 0.989402918807466000, 0.989395657773153530, 0.989388394265351970, 0.989381128284079540, 0.989373859829354000, 0.989366588901194000, +0.989359315499617530, 0.989352039624642800, 0.989344761276287900, 0.989337480454571150, 0.989330197159510760, 0.989322911391124830, 0.989315623149431440, 0.989308332434449160, +0.989301039246196060, 0.989293743584690350, 0.989286445449950260, 0.989279144841994080, 0.989271841760840040, 0.989264536206506340, 0.989257228179011290, 0.989249917678373230, +0.989242604704610340, 0.989235289257740960, 0.989227971337783400, 0.989220650944755860, 0.989213328078676790, 0.989206002739564160, 0.989198674927436630, 0.989191344642312510, +0.989184011884210010, 0.989176676653147460, 0.989169338949143270, 0.989161998772215670, 0.989154656122383070, 0.989147310999663690, 0.989139963404076280, 0.989132613335638840, +0.989125260794369910, 0.989117905780287800, 0.989110548293410940, 0.989103188333757770, 0.989095825901346370, 0.989088460996195630, 0.989081093618323750, 0.989073723767749050, +0.989066351444490180, 0.989058976648565350, 0.989051599379993100, 0.989044219638791740, 0.989036837424979830, 0.989029452738575900, 0.989022065579598380, 0.989014675948065690, +0.989007283843996280, 0.988999889267408670, 0.988992492218321310, 0.988985092696752830, 0.988977690702721350, 0.988970286236245830, 0.988962879297344610, 0.988955469886036220, +0.988948058002339090, 0.988940643646271880, 0.988933226817853010, 0.988925807517101020, 0.988918385744034570, 0.988910961498672080, 0.988903534781032320, 0.988896105591133720, +0.988888673928994820, 0.988881239794634160, 0.988873803188070500, 0.988866364109322160, 0.988858922558408130, 0.988851478535346610, 0.988844032040156580, 0.988836583072856380, +0.988829131633464750, 0.988821677722000250, 0.988814221338481620, 0.988806762482927200, 0.988799301155356080, 0.988791837355786680, 0.988784371084237780, 0.988776902340727900, +0.988769431125275710, 0.988761957437899960, 0.988754481278619200, 0.988747002647452410, 0.988739521544418020, 0.988732037969534900, 0.988724551922821710, 0.988717063404297100, +0.988709572413979830, 0.988702078951888660, 0.988694583018042140, 0.988687084612459240, 0.988679583735158740, 0.988672080386159170, 0.988664574565479400, 0.988657066273138320, +0.988649555509154450, 0.988642042273546680, 0.988634526566333770, 0.988627008387534700, 0.988619487737168010, 0.988611964615252690, 0.988604439021807390, 0.988596910956850980, +0.988589380420402340, 0.988581847412480120, 0.988574311933103410, 0.988566773982290870, 0.988559233560061480, 0.988551690666433890, 0.988544145301427200, 0.988536597465060060, +0.988529047157351460, 0.988521494378320150, 0.988513939127985130, 0.988506381406365380, 0.988498821213479540, 0.988491258549346830, 0.988483693413985790, 0.988476125807415620, +0.988468555729654970, 0.988460983180723060, 0.988453408160638760, 0.988445830669420930, 0.988438250707088460, 0.988430668273660440, 0.988423083369155630, 0.988415495993593240, +0.988407906146991920, 0.988400313829370880, 0.988392719040749210, 0.988385121781145680, 0.988377522050579270, 0.988369919849069190, 0.988362315176634200, 0.988354708033293510, +0.988347098419065870, 0.988339486333970620, 0.988331871778026620, 0.988324254751253070, 0.988316635253668750, 0.988309013285292860, 0.988301388846144490, 0.988293761936242520, +0.988286132555606270, 0.988278500704254600, 0.988270866382206740, 0.988263229589481760, 0.988255590326098670, 0.988247948592076540, 0.988240304387434710, 0.988232657712191820, +0.988225008566367520, 0.988217356949980590, 0.988209702863050320, 0.988202046305595830, 0.988194387277636200, 0.988186725779190640, 0.988179061810278040, 0.988171395370918030, +0.988163726461129490, 0.988156055080931630, 0.988148381230343650, 0.988140704909384660, 0.988133026118073960, 0.988125344856430670, 0.988117661124473860, 0.988109974922223080, +0.988102286249697310, 0.988094595106915890, 0.988086901493898000, 0.988079205410662740, 0.988071506857229550, 0.988063805833617640, 0.988056102339845980, 0.988048396375934220, +0.988040687941901470, 0.988032977037767050, 0.988025263663550150, 0.988017547819270090, 0.988009829504946200, 0.988002108720597570, 0.987994385466243850, 0.987986659741904140, +0.987978931547597750, 0.987971200883344000, 0.987963467749162330, 0.987955732145071930, 0.987947994071092240, 0.987940253527242460, 0.987932510513542140, 0.987924765030010480, +0.987917017076667010, 0.987909266653530960, 0.987901513760621740, 0.987893758397958680, 0.987886000565561310, 0.987878240263448840, 0.987870477491640810, 0.987862712250156650, +0.987854944539015680, 0.987847174358237320, 0.987839401707841010, 0.987831626587846290, 0.987823848998272360, 0.987816068939138870, 0.987808286410465250, 0.987800501412270830, +0.987792713944575240, 0.987784924007397920, 0.987777131600758200, 0.987769336724675710, 0.987761539379169660, 0.987753739564259940, 0.987745937279965960, 0.987738132526307040, +0.987730325303302740, 0.987722515610972680, 0.987714703449336430, 0.987706888818413180, 0.987699071718222910, 0.987691252148784840, 0.987683430110118720, 0.987675605602244100, +0.987667778625180290, 0.987659949178947170, 0.987652117263564170, 0.987644282879050710, 0.987636446025426660, 0.987628606702711580, 0.987620764910924880, 0.987612920650086320, +0.987605073920215460, 0.987597224721331820, 0.987589373053455290, 0.987581518916605060, 0.987573662310801240, 0.987565803236063240, 0.987557941692410730, 0.987550077679863360, +0.987542211198440770, 0.987534342248162720, 0.987526470829048650, 0.987518596941118540, 0.987510720584391930, 0.987502841758888470, 0.987494960464628040, 0.987487076701630050, +0.987479190469914500, 0.987471301769500930, 0.987463410600408990, 0.987455516962658540, 0.987447620856269470, 0.987439722281261200, 0.987431821237653720, 0.987423917725466670, +0.987416011744719820, 0.987408103295432830, 0.987400192377625660, 0.987392278991317980, 0.987384363136529660, 0.987376444813280460, 0.987368524021590140, 0.987360600761478470, +0.987352675032965310, 0.987344746836070320, 0.987336816170813700, 0.987328883037214890, 0.987320947435293970, 0.987313009365070720, 0.987305068826564880, 0.987297125819796340, +0.987289180344784970, 0.987281232401550520, 0.987273281990113220, 0.987265329110492700, 0.987257373762708830, 0.987249415946781510, 0.987241455662730580, 0.987233492910576160, +0.987225527690337780, 0.987217560002035750, 0.987209589845689740, 0.987201617221319830, 0.987193642128945890, 0.987185664568587810, 0.987177684540265550, 0.987169702043999120, +0.987161717079808270, 0.987153729647713310, 0.987145739747734010, 0.987137747379890350, 0.987129752544202320, 0.987121755240689900, 0.987113755469373190, 0.987105753230271940, +0.987097748523406260, 0.987089741348796350, 0.987081731706462070, 0.987073719596423430, 0.987065705018700500, 0.987057687973313280, 0.987049668460281970, 0.987041646479626220, +0.987033622031366580, 0.987025595115522790, 0.987017565732115080, 0.987009533881163410, 0.987001499562688010, 0.986993462776708740, 0.986985423523245920, 0.986977381802319310, +0.986969337613949450, 0.986961290958156210, 0.986953241834959690, 0.986945190244380210, 0.986937136186437640, 0.986929079661152290, 0.986921020668544040, 0.986912959208633420, +0.986904895281440320, 0.986896828886985160, 0.986888760025287800, 0.986880688696368580, 0.986872614900247580, 0.986864538636945120, 0.986856459906481080, 0.986848378708876100, +0.986840295044150160, 0.986832208912323480, 0.986824120313416380, 0.986816029247448820, 0.986807935714441250, 0.986799839714413870, 0.986791741247386670, 0.986783640313380390, +0.986775536912414930, 0.986767431044510590, 0.986759322709687690, 0.986751211907966550, 0.986743098639367380, 0.986734982903910260, 0.986726864701615860, 0.986718744032504260, +0.986710620896595780, 0.986702495293910850, 0.986694367224469570, 0.986686236688292470, 0.986678103685399770, 0.986669968215811540, 0.986661830279548680, 0.986653689876631160, +0.986645547007079520, 0.986637401670913960, 0.986629253868154810, 0.986621103598822600, 0.986612950862937650, 0.986604795660520170, 0.986596637991590810, 0.986588477856169880, +0.986580315254277700, 0.986572150185934800, 0.986563982651161520, 0.986555812649978270, 0.986547640182405370, 0.986539465248463480, 0.986531287848172900, 0.986523107981554180, +0.986514925648627640, 0.986506740849413810, 0.986498553583933120, 0.986490363852206010, 0.986482171654252890, 0.986473976990094540, 0.986465779859751150, 0.986457580263243370, +0.986449378200591640, 0.986441173671816380, 0.986432966676938250, 0.986424757215977550, 0.986416545288955060, 0.986408330895891310, 0.986400114036806720, 0.986391894711721730, +0.986383672920657100, 0.986375448663633250, 0.986367221940670840, 0.986358992751790180, 0.986350761097012140, 0.986342526976357270, 0.986334290389846100, 0.986326051337499180, +0.986317809819337030, 0.986309565835380430, 0.986301319385650020, 0.986293070470166010, 0.986284819088949490, 0.986276565242021010, 0.986268308929401090, 0.986260050151110400, +0.986251788907169580, 0.986243525197599280, 0.986235259022419930, 0.986226990381652730, 0.986218719275318010, 0.986210445703436410, 0.986202169666028810, 0.986193891163115730, +0.986185610194717950, 0.986177326760856120, 0.986169040861550770, 0.986160752496823000, 0.986152461666693460, 0.986144168371182680, 0.986135872610311440, 0.986127574384100590, +0.986119273692570800, 0.986110970535742700, 0.986102664913637180, 0.986094356826275110, 0.986086046273677130, 0.986077733255864010, 0.986069417772856620, 0.986061099824675600, +0.986052779411341840, 0.986044456532876090, 0.986036131189299230, 0.986027803380632120, 0.986019473106895530, 0.986011140368110220, 0.986002805164296950, 0.985994467495476810, +0.985986127361670460, 0.985977784762898660, 0.985969439699182490, 0.985961092170542730, 0.985952742177000240, 0.985944389718576010, 0.985936034795290680, 0.985927677407165250, +0.985919317554220580, 0.985910955236477650, 0.985902590453957450, 0.985894223206680740, 0.985885853494668400, 0.985877481317941510, 0.985869106676520830, 0.985860729570427470, +0.985852349999682190, 0.985843967964306070, 0.985835583464319990, 0.985827196499745040, 0.985818807070602100, 0.985810415176912150, 0.985802020818696170, 0.985793623995975030, +0.985785224708769840, 0.985776822957101670, 0.985768418740991410, 0.985760012060460040, 0.985751602915528770, 0.985743191306218460, 0.985734777232550210, 0.985726360694544780, +0.985717941692223600, 0.985709520225607650, 0.985701096294717800, 0.985692669899575270, 0.985684241040201140, 0.985675809716616280, 0.985667375928841900, 0.985658939676898990, +0.985650500960808860, 0.985642059780592490, 0.985633616136270980, 0.985625170027865430, 0.985616721455396920, 0.985608270418886660, 0.985599816918355630, 0.985591360953824940, +0.985582902525316110, 0.985574441632849910, 0.985565978276447650, 0.985557512456130440, 0.985549044171919460, 0.985540573423835830, 0.985532100211900630, 0.985523624536135290, +0.985515146396561010, 0.985506665793198790, 0.985498182726069930, 0.985489697195195520, 0.985481209200597010, 0.985472718742295360, 0.985464225820311790, 0.985455730434667830, +0.985447232585384580, 0.985438732272483130, 0.985430229495985020, 0.985421724255911240, 0.985413216552283090, 0.985404706385121900, 0.985396193754448980, 0.985387678660285650, +0.985379161102653000, 0.985370641081572570, 0.985362118597065460, 0.985353593649153090, 0.985345066237856780, 0.985336536363197620, 0.985328004025197270, 0.985319469223876810, +0.985310931959257790, 0.985302392231361400, 0.985293850040209080, 0.985285305385822150, 0.985276758268221920, 0.985268208687429590, 0.985259656643466930, 0.985251102136355140, +0.985242545166115650, 0.985233985732769660, 0.985225423836338820, 0.985216859476844340, 0.985208292654307650, 0.985199723368750280, 0.985191151620193660, 0.985182577408659220, +0.985174000734168280, 0.985165421596742360, 0.985156839996402800, 0.985148255933171240, 0.985139669407068870, 0.985131080418117370, 0.985122488966338250, 0.985113895051752950, +0.985105298674382900, 0.985096699834249630, 0.985088098531374470, 0.985079494765779050, 0.985070888537485030, 0.985062279846513730, 0.985053668692886800, 0.985045055076625650, +0.985036438997751840, 0.985027820456287010, 0.985019199452252580, 0.985010575985669990, 0.985001950056561100, 0.984993321664947350, 0.984984690810850380, 0.984976057494291620, +0.984967421715292720, 0.984958783473875220, 0.984950142770060770, 0.984941499603870900, 0.984932853975327370, 0.984924205884451620, 0.984915555331265510, 0.984906902315790480, +0.984898246838048160, 0.984889588898060220, 0.984880928495848070, 0.984872265631433930, 0.984863600304838990, 0.984854932516085140, 0.984846262265193890, 0.984837589552187030, +0.984828914377086200, 0.984820236739913040, 0.984811556640689200, 0.984802874079436560, 0.984794189056176770, 0.984785501570931480, 0.984776811623722440, 0.984768119214571410, +0.984759424343500060, 0.984750727010530120, 0.984742027215683270, 0.984733324958981470, 0.984724620240446270, 0.984715913060099650, 0.984707203417963250, 0.984698491314058730, +0.984689776748408070, 0.984681059721032810, 0.984672340231955050, 0.984663618281196420, 0.984654893868778800, 0.984646166994723850, 0.984637437659053540, 0.984628705861789630, +0.984619971602954000, 0.984611234882568190, 0.984602495700654500, 0.984593754057234590, 0.984585009952330230, 0.984576263385963490, 0.984567514358155930, 0.984558762868929630, +0.984550008918306350, 0.984541252506308080, 0.984532493632956810, 0.984523732298274170, 0.984514968502282260, 0.984506202245002960, 0.984497433526458130, 0.984488662346669760, +0.984479888705659500, 0.984471112603449770, 0.984462334040062110, 0.984453553015518730, 0.984444769529841500, 0.984435983583052290, 0.984427195175173080, 0.984418404306225960, +0.984409610976232590, 0.984400815185215380, 0.984392016933196220, 0.984383216220196980, 0.984374413046239630, 0.984365607411346270, 0.984356799315538880, 0.984347988758839440, +0.984339175741270060, 0.984330360262852810, 0.984321542323609580, 0.984312721923562560, 0.984303899062733740, 0.984295073741145220, 0.984286245958818970, 0.984277415715776870, +0.984268583012041450, 0.984259747847634590, 0.984250910222578380, 0.984242070136894910, 0.984233227590606160, 0.984224382583734460, 0.984215535116301670, 0.984206685188329990, +0.984197832799841740, 0.984188977950858910, 0.984180120641403590, 0.984171260871497980, 0.984162398641164280, 0.984153533950424600, 0.984144666799300790, 0.984135797187815520, +0.984126925115990870, 0.984118050583848820, 0.984109173591411590, 0.984100294138701480, 0.984091412225740700, 0.984082527852551350, 0.984073641019155510, 0.984064751725575730, +0.984055859971833980, 0.984046965757952700, 0.984038069083953970, 0.984029169949860120, 0.984020268355693230, 0.984011364301475620, 0.984002457787229720, 0.983993548812977630, +0.983984637378741760, 0.983975723484544210, 0.983966807130407410, 0.983957888316353560, 0.983948967042404980, 0.983940043308583870, 0.983931117114912770, 0.983922188461413880, +0.983913257348109530, 0.983904323775022020, 0.983895387742173670, 0.983886449249586900, 0.983877508297284040, 0.983868564885287180, 0.983859619013619180, 0.983850670682302030, +0.983841719891358270, 0.983832766640810100, 0.983823810930680160, 0.983814852760990570, 0.983805892131763730, 0.983796929043022290, 0.983787963494788590, 0.983778995487085030, +0.983770025019933820, 0.983761052093357740, 0.983752076707378850, 0.983743098862019830, 0.983734118557302970, 0.983725135793250940, 0.983716150569886040, 0.983707162887230810, +0.983698172745307580, 0.983689180144138970, 0.983680185083747440, 0.983671187564155500, 0.983662187585385260, 0.983653185147459920, 0.983644180250401460, 0.983635172894232630, +0.983626163078975770, 0.983617150804653620, 0.983608136071288500, 0.983599118878902940, 0.983590099227519720, 0.983581077117161250, 0.983572052547850180, 0.983563025519608840, +0.983553996032459970, 0.983544964086426220, 0.983535929681529920, 0.983526892817793710, 0.983517853495240350, 0.983508811713892480, 0.983499767473772550, 0.983490720774903070, +0.983481671617306930, 0.983472620001006550, 0.983463565926024460, 0.983454509392383660, 0.983445450400106560, 0.983436388949215920, 0.983427325039734180, 0.983418258671684200, +0.983409189845088520, 0.983400118559969890, 0.983391044816350760, 0.983381968614254310, 0.983372889953702870, 0.983363808834719190, 0.983354725257325920, 0.983345639221545940, +0.983336550727401780, 0.983327459774916310, 0.983318366364112070, 0.983309270495011930, 0.983300172167638760, 0.983291071382015100, 0.983281968138163710, 0.983272862436107450, +0.983263754275869100, 0.983254643657471170, 0.983245530580936780, 0.983236415046288450, 0.983227297053549280, 0.983218176602741690, 0.983209053693888780, 0.983199928327013200, +0.983190800502137810, 0.983181670219285260, 0.983172537478478660, 0.983163402279740750, 0.983154264623094300, 0.983145124508562170, 0.983135981936167250, 0.983126836905932390, +0.983117689417880470, 0.983108539472034140, 0.983099387068416600, 0.983090232207050610, 0.983081074887959040, 0.983071915111164870, 0.983062752876690760, 0.983053588184559900, +0.983044421034794840, 0.983035251427418880, 0.983026079362454790, 0.983016904839925540, 0.983007727859854020, 0.982998548422263200, 0.982989366527175950, 0.982980182174615360, +0.982970995364604080, 0.982961806097165440, 0.982952614372322400, 0.982943420190097730, 0.982934223550514630, 0.982925024453595860, 0.982915822899364520, 0.982906618887843480, +0.982897412419056150, 0.982888203493025190, 0.982878992109773810, 0.982869778269324870, 0.982860561971701460, 0.982851343216926690, 0.982842122005023630, 0.982832898336014950, +0.982823672209924280, 0.982814443626774500, 0.982805212586588480, 0.982795979089389540, 0.982786743135200540, 0.982777504724044790, 0.982768263855945180, 0.982759020530924790, +0.982749774749007040, 0.982740526510214820, 0.982731275814571310, 0.982722022662099630, 0.982712767052822840, 0.982703508986764170, 0.982694248463946480, 0.982684985484393430, +0.982675720048127870, 0.982666452155173010, 0.982657181805552060, 0.982647908999288110, 0.982638633736404480, 0.982629356016924140, 0.982620075840870300, 0.982610793208266500, +0.982601508119135600, 0.982592220573501040, 0.982582930571385900, 0.982573638112813400, 0.982564343197806830, 0.982555045826389310, 0.982545745998584130, 0.982536443714414730, +0.982527138973904200, 0.982517831777075860, 0.982508522123952900, 0.982499210014558640, 0.982489895448916290, 0.982480578427049170, 0.982471258948980690, 0.982461937014734050, +0.982452612624332590, 0.982443285777799600, 0.982433956475158410, 0.982424624716432330, 0.982415290501644670, 0.982405953830818630, 0.982396614703977880, 0.982387273121145600, +0.982377929082345110, 0.982368582587599740, 0.982359233636933000, 0.982349882230368120, 0.982340528367928400, 0.982331172049637600, 0.982321813275518820, 0.982312452045595470, +0.982303088359891000, 0.982293722218428810, 0.982284353621232340, 0.982274982568324910, 0.982265609059729930, 0.982256233095471170, 0.982246854675571710, 0.982237473800055110, +0.982228090468944880, 0.982218704682264350, 0.982209316440037170, 0.982199925742286650, 0.982190532589036100, 0.982181136980309510, 0.982171738916129970, 0.982162338396521120, +0.982152935421506390, 0.982143529991109320, 0.982134122105353450, 0.982124711764262080, 0.982115298967859210, 0.982105883716168030, 0.982096466009212080, 0.982087045847015010, +0.982077623229600350, 0.982068198156991530, 0.982058770629212320, 0.982049340646286020, 0.982039908208236500, 0.982030473315087190, 0.982021035966861740, 0.982011596163583690, +0.982002153905276560, 0.981992709191964240, 0.981983262023669810, 0.981973812400417480, 0.981964360322230560, 0.981954905789132800, 0.981945448801147760, 0.981935989358299070, +0.981926527460610380, 0.981917063108105450, 0.981907596300807590, 0.981898127038741020, 0.981888655321929040, 0.981879181150395520, 0.981869704524164000, 0.981860225443258240, +0.981850743907701880, 0.981841259917518690, 0.981831773472732210, 0.981822284573366400, 0.981812793219444810, 0.981803299410991430, 0.981793803148029660, 0.981784304430583400, +0.981774803258676390, 0.981765299632332280, 0.981755793551575050, 0.981746285016428240, 0.981736774026915840, 0.981727260583061480, 0.981717744684888930, 0.981708226332422050, +0.981698705525684500, 0.981689182264700140, 0.981679656549492960, 0.981670128380086600, 0.981660597756505050, 0.981651064678771830, 0.981641529146911050, 0.981631991160946460, +0.981622450720901930, 0.981612907826801000, 0.981603362478667970, 0.981593814676526620, 0.981584264420400700, 0.981574711710314070, 0.981565156546290730, 0.981555598928354420, +0.981546038856529020, 0.981536476330838630, 0.981526911351307100, 0.981517343917958310, 0.981507774030816130, 0.981498201689904540, 0.981488626895247410, 0.981479049646868720, +0.981469469944792230, 0.981459887789042250, 0.981450303179642550, 0.981440716116617100, 0.981431126599989770, 0.981421534629784760, 0.981411940206025850, 0.981402343328736880, +0.981392743997942300, 0.981383142213665850, 0.981373537975931520, 0.981363931284763290, 0.981354322140185360, 0.981344710542221500, 0.981335096490896010, 0.981325479986232430, +0.981315861028255410, 0.981306239616988820, 0.981296615752456520, 0.981286989434682730, 0.981277360663691420, 0.981267729439506690, 0.981258095762152730, 0.981248459631653300, +0.981238821048032950, 0.981229180011315430, 0.981219536521525050, 0.981209890578685790, 0.981200242182821870, 0.981190591333957360, 0.981180938032116150, 0.981171282277322750, +0.981161624069601170, 0.981151963408975480, 0.981142300295469890, 0.981132634729108610, 0.981122966709915720, 0.981113296237915430, 0.981103623313131610, 0.981093947935589020, +0.981084270105311520, 0.981074589822323430, 0.981064907086648730, 0.981055221898311850, 0.981045534257336980, 0.981035844163748120, 0.981026151617569560, 0.981016456618825750, +0.981006759167540880, 0.980997059263739040, 0.980987356907444650, 0.980977652098681710, 0.980967944837474740, 0.980958235123847720, 0.980948522957825310, 0.980938808339431590, +0.980929091268690770, 0.980919371745627380, 0.980909649770265400, 0.980899925342629380, 0.980890198462743500, 0.980880469130631980, 0.980870737346319470, 0.980861003109830150, +0.980851266421188250, 0.980841527280418180, 0.980831785687544370, 0.980822041642591010, 0.980812295145582440, 0.980802546196543280, 0.980792794795497750, 0.980783040942470260, +0.980773284637485140, 0.980763525880566810, 0.980753764671739690, 0.980744001011028100, 0.980734234898456460, 0.980724466334049310, 0.980714695317830950, 0.980704921849825940, +0.980695145930058580, 0.980685367558553400, 0.980675586735334730, 0.980665803460427200, 0.980656017733854910, 0.980646229555642730, 0.980636438925815090, 0.980626645844396180, +0.980616850311410770, 0.980607052326883280, 0.980597251890838020, 0.980587449003299530, 0.980577643664292680, 0.980567835873841550, 0.980558025631970920, 0.980548212938705310, +0.980538397794069040, 0.980528580198086750, 0.980518760150783100, 0.980508937652182390, 0.980499112702309490, 0.980489285301188730, 0.980479455448844850, 0.980469623145302280, +0.980459788390585670, 0.980449951184719670, 0.980440111527728700, 0.980430269419637290, 0.980420424860470320, 0.980410577850252430, 0.980400728389007940, 0.980390876476761710, +0.980381022113538390, 0.980371165299362410, 0.980361306034258310, 0.980351444318251160, 0.980341580151365410, 0.980331713533625690, 0.980321844465056660, 0.980311972945683060, +0.980302098975529560, 0.980292222554620780, 0.980282343682981170, 0.980272462360636030, 0.980262578587609680, 0.980252692363926870, 0.980242803689612360, 0.980232912564690810, +0.980223018989186960, 0.980213122963125460, 0.980203224486531190, 0.980193323559429010, 0.980183420181843460, 0.980173514353799400, 0.980163606075321490, 0.980153695346434590, +0.980143782167163470, 0.980133866537532650, 0.980123948457567450, 0.980114027927292300, 0.980104104946732060, 0.980094179515911600, 0.980084251634855800, 0.980074321303589180, +0.980064388522136840, 0.980054453290523430, 0.980044515608773930, 0.980034575476913190, 0.980024632894966110, 0.980014687862957310, 0.980004740380911900, 0.979994790448854510, +0.979984838066810030, 0.979974883234803640, 0.979964925952860110, 0.979954966221004200, 0.979945004039260880, 0.979935039407655030, 0.979925072326211620, 0.979915102794955530, +0.979905130813911400, 0.979895156383104760, 0.979885179502560160, 0.979875200172302560, 0.979865218392357070, 0.979855234162748450, 0.979845247483501880, 0.979835258354642020, +0.979825266776193970, 0.979815272748182810, 0.979805276270633630, 0.979795277343571080, 0.979785275967020470, 0.979775272141006570, 0.979765265865554570, 0.979755257140689230, +0.979745245966435860, 0.979735232342819450, 0.979725216269864860, 0.979715197747597300, 0.979705176776041740, 0.979695153355223280, 0.979685127485166900, 0.979675099165897460, +0.979665068397440500, 0.979655035179820890, 0.979644999513063720, 0.979634961397193970, 0.979624920832236850, 0.979614877818217430, 0.979604832355160720, 0.979594784443092000, +0.979584734082036390, 0.979574681272018850, 0.979564626013064710, 0.979554568305198940, 0.979544508148446740, 0.979534445542833310, 0.979524380488383640, 0.979514312985123040, +0.979504243033076820, 0.979494170632269960, 0.979484095782727550, 0.979474018484475020, 0.979463938737537450, 0.979453856541939950, 0.979443771897707700, 0.979433684804866140, +0.979423595263440470, 0.979413503273455780, 0.979403408834937260, 0.979393311947910240, 0.979383212612400020, 0.979373110828431480, 0.979363006596030370, 0.979352899915221790, +0.979342790786030930, 0.979332679208483100, 0.979322565182603630, 0.979312448708417600, 0.979302329785950550, 0.979292208415227570, 0.979282084596274080, 0.979271958329115510, +0.979261829613777060, 0.979251698450283930, 0.979241564838661650, 0.979231428778935320, 0.979221290271130360, 0.979211149315272310, 0.979201005911386370, 0.979190860059497960, +0.979180711759632390, 0.979170561011815100, 0.979160407816071280, 0.979150252172426570, 0.979140094080905960, 0.979129933541535320, 0.979119770554339850, 0.979109605119344970, +0.979099437236576000, 0.979089266906058580, 0.979079094127817910, 0.979068918901879410, 0.979058741228268530, 0.979048561107011000, 0.979038378538132030, 0.979028193521657150, +0.979018006057611800, 0.979007816146021390, 0.978997623786911460, 0.978987428980307330, 0.978977231726234740, 0.978967032024719020, 0.978956829875785810, 0.978946625279460520, +0.978936418235768710, 0.978926208744735790, 0.978915996806387300, 0.978905782420748770, 0.978895565587845850, 0.978885346307704070, 0.978875124580348870, 0.978864900405805870, +0.978854673784100740, 0.978844444715258780, 0.978834213199305750, 0.978823979236267070, 0.978813742826168510, 0.978803503969035700, 0.978793262664894080, 0.978783018913769290, +0.978772772715687080, 0.978762524070672770, 0.978752272978752000, 0.978742019439950760, 0.978731763454294580, 0.978721505021808880, 0.978711244142519420, 0.978700980816451850, +0.978690715043631810, 0.978680446824084950, 0.978670176157836910, 0.978659903044913570, 0.978649627485340460, 0.978639349479143220, 0.978629069026347720, 0.978618786126979500, +0.978608500781064210, 0.978598212988627590, 0.978587922749695640, 0.978577630064293880, 0.978567334932447960, 0.978557037354183870, 0.978546737329527020, 0.978536434858503390, +0.978526129941138630, 0.978515822577458510, 0.978505512767488870, 0.978495200511255490, 0.978484885808784120, 0.978474568660100520, 0.978464249065230440, 0.978453927024199870, +0.978443602537034440, 0.978433275603759700, 0.978422946224402070, 0.978412614398987080, 0.978402280127540490, 0.978391943410088280, 0.978381604246656210, 0.978371262637270030, +0.978360918581955620, 0.978350572080739060, 0.978340223133645990, 0.978329871740702520, 0.978319517901934280, 0.978309161617367250, 0.978298802887027310, 0.978288441710940320, +0.978278078089132140, 0.978267712021628880, 0.978257343508456390, 0.978246972549640550, 0.978236599145207220, 0.978226223295182380, 0.978215844999592020, 0.978205464258462000, +0.978195081071818180, 0.978184695439686890, 0.978174307362093880, 0.978163916839065010, 0.978153523870626370, 0.978143128456803960, 0.978132730597623620, 0.978122330293111350, +0.978111927543293460, 0.978101522348195700, 0.978091114707844160, 0.978080704622264820, 0.978070292091483770, 0.978059877115527000, 0.978049459694420480, 0.978039039828190070, +0.978028617516862320, 0.978018192760463090, 0.978007765559018250, 0.977997335912554110, 0.977986903821096540, 0.977976469284671750, 0.977966032303305590, 0.977955592877024600, +0.977945151005854550, 0.977934706689821630, 0.977924259928951930, 0.977913810723271660, 0.977903359072806790, 0.977892904977583520, 0.977882448437627840, 0.977871989452966270, +0.977861528023624690, 0.977851064149629190, 0.977840597831006190, 0.977830129067781550, 0.977819657859981710, 0.977809184207632630, 0.977798708110760420, 0.977788229569391710, +0.977777748583552380, 0.977767265153268620, 0.977756779278566750, 0.977746290959472960, 0.977735800196013360, 0.977725306988214140, 0.977714811336101830, 0.977704313239702530, +0.977693812699042430, 0.977683309714147740, 0.977672804285044770, 0.977662296411759830, 0.977651786094319130, 0.977641273332748860, 0.977630758127075560, 0.977620240477325320, +0.977609720383524450, 0.977599197845699370, 0.977588672863876180, 0.977578145438081410, 0.977567615568341260, 0.977557083254681820, 0.977546548497129960, 0.977536011295711660, +0.977525471650453340, 0.977514929561381420, 0.977504385028522100, 0.977493838051901820, 0.977483288631546770, 0.977472736767483700, 0.977462182459738700, 0.977451625708338320, +0.977441066513308860, 0.977430504874676750, 0.977419940792468410, 0.977409374266710150, 0.977398805297428290, 0.977388233884649680, 0.977377660028400430, 0.977367083728706950, +0.977356504985595900, 0.977345923799093460, 0.977335340169226300, 0.977324754096020600, 0.977314165579503120, 0.977303574619700300, 0.977292981216638550, 0.977282385370344290, +0.977271787080844170, 0.977261186348164500, 0.977250583172331820, 0.977239977553372550, 0.977229369491313560, 0.977218758986181160, 0.977208146038001770, 0.977197530646802040, +0.977186912812608500, 0.977176292535447690, 0.977165669815346140, 0.977155044652330270, 0.977144417046426960, 0.977133786997662510, 0.977123154506063680, 0.977112519571657010, +0.977101882194468920, 0.977091242374526270, 0.977080600111855270, 0.977069955406482890, 0.977059308258435680, 0.977048658667740160, 0.977038006634422970, 0.977027352158510890, +0.977016695240030320, 0.977006035879008030, 0.976995374075470550, 0.976984709829444740, 0.976974043140957150, 0.976963374010034520, 0.976952702436703400, 0.976942028420990540, +0.976931351962922580, 0.976920673062526280, 0.976909991719828060, 0.976899307934855130, 0.976888621707633800, 0.976877933038191040, 0.976867241926553390, 0.976856548372747710, +0.976845852376800550, 0.976835153938738650, 0.976824453058589000, 0.976813749736378250, 0.976803043972133130, 0.976792335765880430, 0.976781625117646770, 0.976770912027459140, +0.976760196495344290, 0.976749478521328650, 0.976738758105439530, 0.976728035247703570, 0.976717309948147430, 0.976706582206798070, 0.976695852023682250, 0.976685119398826850, +0.976674384332258390, 0.976663646824004190, 0.976652906874090900, 0.976642164482545260, 0.976631419649394260, 0.976620672374664770, 0.976609922658383530, 0.976599170500577430, +0.976588415901273320, 0.976577658860498300, 0.976566899378279230, 0.976556137454642760, 0.976545373089616090, 0.976534606283225860, 0.976523837035499160, 0.976513065346462870, +0.976502291216143850, 0.976491514644569180, 0.976480735631765630, 0.976469954177760390, 0.976459170282580220, 0.976448383946252110, 0.976437595168803020, 0.976426803950259830, +0.976416010290649730, 0.976405214189999700, 0.976394415648336510, 0.976383614665687350, 0.976372811242079200, 0.976362005377539030, 0.976351197072093720, 0.976340386325770360, +0.976329573138596140, 0.976318757510598050, 0.976307939441803050, 0.976297118932238140, 0.976286295981930510, 0.976275470590907140, 0.976264642759194780, 0.976253812486821080, +0.976242979773812910, 0.976232144620197250, 0.976221307026001180, 0.976210466991251910, 0.976199624515976530, 0.976188779600202010, 0.976177932243955330, 0.976167082447264020, +0.976156230210154960, 0.976145375532655460, 0.976134518414792370, 0.976123658856593130, 0.976112796858084610, 0.976101932419294220, 0.976091065540248710, 0.976080196220975750, +0.976069324461502410, 0.976058450261855560, 0.976047573622062740, 0.976036694542150920, 0.976025813022147410, 0.976014929062079100, 0.976004042661973710, 0.975993153821858250, +0.975982262541759900, 0.975971368821705880, 0.975960472661723370, 0.975949574061839690, 0.975938673022082150, 0.975927769542477730, 0.975916863623053970, 0.975905955263838170, +0.975895044464857420, 0.975884131226139150, 0.975873215547710450, 0.975862297429598740, 0.975851376871831320, 0.975840453874435190, 0.975829528437438200, 0.975818600560867330, +0.975807670244750010, 0.975796737489113440, 0.975785802293985150, 0.975774864659392230, 0.975763924585361990, 0.975752982071922180, 0.975742037119099900, 0.975731089726922460, +0.975720139895417390, 0.975709187624611900, 0.975698232914533500, 0.975687275765209530, 0.975676316176667060, 0.975665354148934070, 0.975654389682037770, 0.975643422776005350, +0.975632453430864470, 0.975621481646642420, 0.975610507423366750, 0.975599530761064540, 0.975588551659763660, 0.975577570119491420, 0.975566586140275360, 0.975555599722142670, +0.975544610865121120, 0.975533619569238010, 0.975522625834520760, 0.975511629660996920, 0.975500631048694110, 0.975489629997639660, 0.975478626507861210, 0.975467620579386190, +0.975456612212242110, 0.975445601406456530, 0.975434588162056860, 0.975423572479070630, 0.975412554357525610, 0.975401533797449210, 0.975390510798868960, 0.975379485361812400, +0.975368457486307180, 0.975357427172380830, 0.975346394420060660, 0.975335359229374750, 0.975324321600350430, 0.975313281533015330, 0.975302239027396990, 0.975291194083523050, +0.975280146701421160, 0.975269096881118850, 0.975258044622643650, 0.975246989926023540, 0.975235932791285950, 0.975224873218458520, 0.975213811207568890, 0.975202746758644820, +0.975191679871713730, 0.975180610546803490, 0.975169538783941640, 0.975158464583156030, 0.975147387944474310, 0.975136308867924130, 0.975125227353533130, 0.975114143401329070, +0.975103057011339700, 0.975091968183592450, 0.975080876918115400, 0.975069783214936310, 0.975058687074082610, 0.975047588495582260, 0.975036487479463030, 0.975025384025752450, +0.975014278134478500, 0.975003169805668590, 0.974992059039351040, 0.974980945835553280, 0.974969830194303170, 0.974958712115628460, 0.974947591599557020, 0.974936468646116490, +0.974925343255334750, 0.974914215427239770, 0.974903085161859200, 0.974891952459221000, 0.974880817319352940, 0.974869679742282780, 0.974858539728038380, 0.974847397276647710, +0.974836252388138310, 0.974825105062538500, 0.974813955299875910, 0.974802803100178420, 0.974791648463473990, 0.974780491389790390, 0.974769331879155490, 0.974758169931597360, +0.974747005547143550, 0.974735838725822480, 0.974724669467661790, 0.974713497772689450, 0.974702323640933340, 0.974691147072421440, 0.974679968067181600, 0.974668786625241700, +0.974657602746630050, 0.974646416431374400, 0.974635227679502720, 0.974624036491042900, 0.974612842866023010, 0.974601646804471030, 0.974590448306414950, 0.974579247371882510, +0.974568044000902130, 0.974556838193501700, 0.974545629949709170, 0.974534419269552530, 0.974523206153059870, 0.974511990600259280, 0.974500772611178620, 0.974489552185845760, +0.974478329324289350, 0.974467104026537020, 0.974455876292616980, 0.974444646122557210, 0.974433413516385900, 0.974422178474131040, 0.974410940995820480, 0.974399701081482770, +0.974388458731145880, 0.974377213944837780, 0.974365966722586680, 0.974354717064420670, 0.974343464970367830, 0.974332210440456370, 0.974320953474714150, 0.974309694073169700, +0.974298432235851110, 0.974287167962786360, 0.974275901254003760, 0.974264632109531400, 0.974253360529397370, 0.974242086513629870, 0.974230810062257310, 0.974219531175307680, +0.974208249852809290, 0.974196966094790230, 0.974185679901278690, 0.974174391272303100, 0.974163100207891430, 0.974151806708071780, 0.974140510772872890, 0.974129212402322750, +0.974117911596449450, 0.974106608355281510, 0.974095302678846920, 0.974083994567174210, 0.974072684020291460, 0.974061371038226760, 0.974050055621008880, 0.974038737768665790, +0.974027417481225900, 0.974016094758717530, 0.974004769601168880, 0.973993442008608270, 0.973982111981063880, 0.973970779518564480, 0.973959444621138040, 0.973948107288812980, +0.973936767521617730, 0.973925425319580480, 0.973914080682729670, 0.973902733611093700, 0.973891384104700770, 0.973880032163579430, 0.973868677787758100, 0.973857320977265070, +0.973845961732128670, 0.973834600052377430, 0.973823235938039770, 0.973811869389143880, 0.973800500405718190, 0.973789128987791460, 0.973777755135391890, 0.973766378848547890, +0.973755000127288000, 0.973743618971640520, 0.973732235381634110, 0.973720849357296860, 0.973709460898657620, 0.973698070005744820, 0.973686676678586770, 0.973675280917212120, +0.973663882721649280, 0.973652482091926670, 0.973641079028072840, 0.973629673530116090, 0.973618265598085400, 0.973606855232009070, 0.973595442431915650, 0.973584027197833550, +0.973572609529791300, 0.973561189427817660, 0.973549766891940840, 0.973538341922189690, 0.973526914518592860, 0.973515484681178660, 0.973504052409975620, 0.973492617705012610, +0.973481180566318050, 0.973469740993920470, 0.973458298987848410, 0.973446854548130740, 0.973435407674795970, 0.973423958367872650, 0.973412506627389430, 0.973401052453374940, +0.973389595845857940, 0.973378136804866840, 0.973366675330430200, 0.973355211422577080, 0.973343745081335920, 0.973332276306735470, 0.973320805098804250, 0.973309331457571040, +0.973297855383064460, 0.973286376875313050, 0.973274895934346020, 0.973263412560191670, 0.973251926752878750, 0.973240438512436020, 0.973228947838892240, 0.973217454732276050, +0.973205959192616320, 0.973194461219941350, 0.973182960814280570, 0.973171457975662290, 0.973159952704115370, 0.973148444999668570, 0.973136934862350760, 0.973125422292190460, +0.973113907289216540, 0.973102389853457980, 0.973090869984943430, 0.973079347683701750, 0.973067822949761680, 0.973056295783152110, 0.973044766183901680, 0.973033234152039460, +0.973021699687593890, 0.973010162790594270, 0.972998623461069250, 0.972987081699047680, 0.972975537504558340, 0.972963990877630190, 0.972952441818292100, 0.972940890326572940, +0.972929336402501340, 0.972917780046106520, 0.972906221257417330, 0.972894660036462520, 0.972883096383271080, 0.972871530297871990, 0.972859961780293990, 0.972848390830565850, +0.972836817448716970, 0.972825241634776130, 0.972813663388772070, 0.972802082710733870, 0.972790499600690530, 0.972778914058670900, 0.972767326084703950, 0.972755735678818570, +0.972744142841044050, 0.972732547571409030, 0.972720949869942840, 0.972709349736674110, 0.972697747171632040, 0.972686142174845720, 0.972674534746343910, 0.972662924886155580, +0.972651312594310260, 0.972639697870836480, 0.972628080715763570, 0.972616461129120480, 0.972604839110936200, 0.972593214661239820, 0.972581587780060210, 0.972569958467426780, +0.972558326723368500, 0.972546692547914370, 0.972535055941093570, 0.972523416902935090, 0.972511775433468120, 0.972500131532721630, 0.972488485200724620, 0.972476836437506600, +0.972465185243096550, 0.972453531617523570, 0.972441875560816630, 0.972430217073005030, 0.972418556154117990, 0.972406892804184240, 0.972395227023233550, 0.972383558811294790, +0.972371888168397040, 0.972360215094569710, 0.972348539589841690, 0.972336861654242380, 0.972325181287800990, 0.972313498490546380, 0.972301813262508200, 0.972290125603715530, +0.972278435514197570, 0.972266742993983520, 0.972255048043102480, 0.972243350661583960, 0.972231650849457060, 0.972219948606750760, 0.972208243933494810, 0.972196536829718290, +0.972184827295450420, 0.972173115330720480, 0.972161400935557700, 0.972149684109991470, 0.972137964854050800, 0.972126243167765520, 0.972114519051164530, 0.972102792504277220, +0.972091063527133040, 0.972079332119761050, 0.972067598282190800, 0.972055862014451600, 0.972044123316572530, 0.972032382188583340, 0.972020638630513130, 0.972008892642391430, +0.971997144224247430, 0.971985393376110670, 0.971973640098010350, 0.971961884389975880, 0.971950126252036580, 0.971938365684222090, 0.971926602686561720, 0.971914837259084900, +0.971903069401820920, 0.971891299114799320, 0.971879526398049420, 0.971867751251600520, 0.971855973675482490, 0.971844193669724520, 0.971832411234356040, 0.971820626369406470, +0.971808839074905450, 0.971797049350882180, 0.971785257197366410, 0.971773462614387240, 0.971761665601974630, 0.971749866160157900, 0.971738064288966470, 0.971726259988429870, +0.971714453258577640, 0.971702644099439290, 0.971690832511044160, 0.971679018493422090, 0.971667202046602510, 0.971655383170614840, 0.971643561865488840, 0.971631738131253810, +0.971619911967939510, 0.971608083375575360, 0.971596252354190890, 0.971584418903815970, 0.971572583024480020, 0.971560744716212570, 0.971548903979043250, 0.971537060813001730, +0.971525215218117520, 0.971513367194420270, 0.971501516741939410, 0.971489663860704900, 0.971477808550746280, 0.971465950812093190, 0.971454090644775170, 0.971442228048821850, +0.971430363024263110, 0.971418495571128140, 0.971406625689447250, 0.971394753379249740, 0.971382878640565270, 0.971371001473423700, 0.971359121877854560, 0.971347239853887710, +0.971335355401552690, 0.971323468520879140, 0.971311579211897040, 0.971299687474636020, 0.971287793309125850, 0.971275896715396050, 0.971263997693476600, 0.971252096243397260, +0.971240192365187550, 0.971228286058877120, 0.971216377324496280, 0.971204466162074450, 0.971192552571641500, 0.971180636553227060, 0.971168718106861120, 0.971156797232573420, +0.971144873930393390, 0.971132948200351450, 0.971121020042477130, 0.971109089456800300, 0.971097156443350820, 0.971085221002158330, 0.971073283133252810, 0.971061342836664010, +0.971049400112421800, 0.971037454960556160, 0.971025507381096940, 0.971013557374074020, 0.971001604939517150, 0.970989650077456190, 0.970977692787921230, 0.970965733070941810, +0.970953770926548220, 0.970941806354770120, 0.970929839355637700, 0.970917869929180500, 0.970905898075428710, 0.970893923794412190, 0.970881947086160820, 0.970869967950704460, +0.970857986388073300, 0.970846002398297210, 0.970834015981406060, 0.970822027137429930, 0.970810035866398800, 0.970798042168342420, 0.970786046043291000, 0.970774047491274270, +0.970762046512322670, 0.970750043106465950, 0.970738037273734090, 0.970726029014157170, 0.970714018327765050, 0.970702005214588050, 0.970689989674655700, 0.970677971707998630, +0.970665951314646720, 0.970653928494629840, 0.970641903247978170, 0.970629875574721690, 0.970617845474890610, 0.970605812948514780, 0.970593777995624300, 0.970581740616249580, +0.970569700810420600, 0.970557658578167230, 0.970545613919519770, 0.970533566834508310, 0.970521517323162830, 0.970509465385513640, 0.970497411021590590, 0.970485354231424120, +0.970473295015044310, 0.970461233372481360, 0.970449169303765240, 0.970437102808926260, 0.970425033887994390, 0.970412962540999850, 0.970400888767973040, 0.970388812568944050, +0.970376733943943080, 0.970364652893000220, 0.970352569416145670, 0.970340483513409740, 0.970328395184822610, 0.970316304430414280, 0.970304211250215490, 0.970292115644255990, +0.970280017612566330, 0.970267917155176570, 0.970255814272117050, 0.970243708963418050, 0.970231601229109450, 0.970219491069222120, 0.970207378483786130, 0.970195263472831580, +0.970183146036388890, 0.970171026174488360, 0.970158903887160310, 0.970146779174434930, 0.970134652036342420, 0.970122522472913530, 0.970110390484178240, 0.970098256070167090, +0.970086119230910150, 0.970073979966438070, 0.970061838276780940, 0.970049694161969290, 0.970037547622033090, 0.970025398657003320, 0.970013247266909960, 0.970001093451783650, +0.969988937211654470, 0.969976778546552950, 0.969964617456509530, 0.969952453941554380, 0.969940288001718280, 0.969928119637031410, 0.969915948847524300, 0.969903775633227270, +0.969891599994170850, 0.969879421930385340, 0.969867241441901400, 0.969855058528749090, 0.969842873190959300, 0.969830685428562430, 0.969818495241588810, 0.969806302630068950, +0.969794107594033280, 0.969781910133512340, 0.969769710248536750, 0.969757507939136510, 0.969745303205342800, 0.969733096047185830, 0.969720886464696120, 0.969708674457904210, +0.969696460026840620, 0.969684243171535790, 0.969672023892020230, 0.969659802188324820, 0.969647578060479850, 0.969635351508515990, 0.969623122532463740, 0.969610891132353660, +0.969598657308216370, 0.969586421060082420, 0.969574182387982210, 0.969561941291946730, 0.969549697772006500, 0.969537451828191950, 0.969525203460533720, 0.969512952669062570, +0.969500699453809010, 0.969488443814803480, 0.969476185752077060, 0.969463925265660160, 0.969451662355583550, 0.969439397021877650, 0.969427129264573310, 0.969414859083701170, +0.969402586479291890, 0.969390311451375890, 0.969378033999984230, 0.969365754125147690, 0.969353471826896570, 0.969341187105261960, 0.969328899960274270, 0.969316610391964370, +0.969304318400362910, 0.969292023985500410, 0.969279727147408180, 0.969267427886116530, 0.969255126201656330, 0.969242822094058320, 0.969230515563353270, 0.969218206609571920, +0.969205895232744810, 0.969193581432903240, 0.969181265210077750, 0.969168946564298970, 0.969156625495597890, 0.969144302004005250, 0.969131976089551820, 0.969119647752268550, +0.969107316992185890, 0.969094983809335120, 0.969082648203746900, 0.969070310175452090, 0.969057969724481440, 0.969045626850865930, 0.969033281554636310, 0.969020933835823330, +0.969008583694458190, 0.968996231130571650, 0.968983876144194460, 0.968971518735357580, 0.968959158904091900, 0.968946796650428380, 0.968934431974397880, 0.968922064876031050, +0.968909695355359200, 0.968897323412413190, 0.968884949047223890, 0.968872572259822150, 0.968860193050239070, 0.968847811418505510, 0.968835427364652340, 0.968823040888710410, +0.968810651990711040, 0.968798260670685200, 0.968785866928663530, 0.968773470764677350, 0.968761072178757400, 0.968748671170934770, 0.968736267741240220, 0.968723861889705270, +0.968711453616360680, 0.968699042921237430, 0.968686629804366590, 0.968674214265779150, 0.968661796305506200, 0.968649375923578690, 0.968636953120027620, 0.968624527894884400, +0.968612100248179790, 0.968599670179944860, 0.968587237690210930, 0.968574802779008760, 0.968562365446369640, 0.968549925692324680, 0.968537483516904610, 0.968525038920140970, +0.968512591902064850, 0.968500142462707210, 0.968487690602099270, 0.968475236320271990, 0.968462779617256690, 0.968450320493084220, 0.968437858947786220, 0.968425394981393460, +0.968412928593937350, 0.968400459785448860, 0.968387988555959200, 0.968375514905499560, 0.968363038834101130, 0.968350560341794900, 0.968338079428612500, 0.968325596094584910, +0.968313110339743320, 0.968300622164118940, 0.968288131567742960, 0.968275638550646690, 0.968263143112861210, 0.968250645254417950, 0.968238144975348100, 0.968225642275682970, +0.968213137155453650, 0.968200629614691550, 0.968188119653427880, 0.968175607271693830, 0.968163092469520590, 0.968150575246939820, 0.968138055603982580, 0.968125533540680320, +0.968113009057064100, 0.968100482153165460, 0.968087952829015610, 0.968075421084645840, 0.968062886920087240, 0.968050350335371680, 0.968037811330530350, 0.968025269905594340, +0.968012726060595300, 0.968000179795564300, 0.967987631110532990, 0.967975080005532230, 0.967962526480594110, 0.967949970535749600, 0.967937412171030240, 0.967924851386467330, +0.967912288182092300, 0.967899722557936440, 0.967887154514031400, 0.967874584050408160, 0.967862011167098800, 0.967849435864134300, 0.967836858141546300, 0.967824277999366100, +0.967811695437625240, 0.967799110456355140, 0.967786523055587210, 0.967773933235352770, 0.967761340995683780, 0.967748746336611340, 0.967736149258167090, 0.967723549760382440, +0.967710947843288930, 0.967698343506918080, 0.967685736751301100, 0.967673127576470060, 0.967660515982456170, 0.967647901969290960, 0.967635285537006060, 0.967622666685632900, +0.967610045415203120, 0.967597421725748250, 0.967584795617299490, 0.967572167089889020, 0.967559536143548170, 0.967546902778308460, 0.967534266994201420, 0.967521628791258800, +0.967508988169512140, 0.967496345128992630, 0.967483699669732580, 0.967471051791763290, 0.967458401495116420, 0.967445748779823480, 0.967433093645916120, 0.967420436093426090, +0.967407776122385040, 0.967395113732824160, 0.967382448924775870, 0.967369781698271370, 0.967357112053342520, 0.967344439990020730, 0.967331765508337990, 0.967319088608325720, +0.967306409290015770, 0.967293727553439680, 0.967281043398629300, 0.967268356825616400, 0.967255667834432620, 0.967242976425109700, 0.967230282597679290, 0.967217586352173250, +0.967204887688623010, 0.967192186607060630, 0.967179483107517890, 0.967166777190026530, 0.967154068854618080, 0.967141358101324510, 0.967128644930177580, 0.967115929341208940, +0.967103211334450320, 0.967090490909933930, 0.967077768067691300, 0.967065042807754180, 0.967052315130154550, 0.967039585034924040, 0.967026852522094640, 0.967014117591698090, +0.967001380243766030, 0.966988640478330770, 0.966975898295423850, 0.966963153695077130, 0.966950406677322680, 0.966937657242192160, 0.966924905389717430, 0.966912151119930230, +0.966899394432862880, 0.966886635328547130, 0.966873873807014730, 0.966861109868297650, 0.966848343512427770, 0.966835574739437040, 0.966822803549357350, 0.966810029942220430, +0.966797253918058710, 0.966784475476903940, 0.966771694618787870, 0.966758911343742480, 0.966746125651799960, 0.966733337542992070, 0.966720547017350550, 0.966707754074908050, +0.966694958715696000, 0.966682160939746680, 0.966669360747091870, 0.966656558137763740, 0.966643753111794070, 0.966630945669215150, 0.966618135810058620, 0.966605323534356910, +0.966592508842141980, 0.966579691733445710, 0.966566872208300290, 0.966554050266737570, 0.966541225908789880, 0.966528399134488960, 0.966515569943866890, 0.966502738336956210, +0.966489904313788560, 0.966477067874396130, 0.966464229018811130, 0.966451387747065520, 0.966438544059191500, 0.966425697955220820, 0.966412849435186130, 0.966399998499119280, +0.966387145147052480, 0.966374289379017810, 0.966361431195047470, 0.966348570595173540, 0.966335707579428100, 0.966322842147843250, 0.966309974300451510, 0.966297104037284750, +0.966284231358375270, 0.966271356263755270, 0.966258478753456830, 0.966245598827512260, 0.966232716485953660, 0.966219831728812980, 0.966206944556122990, 0.966194054967915660, +0.966181162964223180, 0.966168268545077760, 0.966155371710511690, 0.966142472460557180, 0.966129570795246310, 0.966116666714611720, 0.966103760218685490, 0.966090851307499830, +0.966077939981087040, 0.966065026239479320, 0.966052110082709080, 0.966039191510808640, 0.966026270523809960, 0.966013347121745800, 0.966000421304648360, 0.965987493072549720, +0.965974562425482520, 0.965961629363478740, 0.965948693886571010, 0.965935755994791310, 0.965922815688172400, 0.965909872966746460, 0.965896927830545820, 0.965883980279602870, +0.965871030313950050, 0.965858077933619550, 0.965845123138643900, 0.965832165929055300, 0.965819206304886380, 0.965806244266169460, 0.965793279812936940, 0.965780312945221260, +0.965767343663054830, 0.965754371966469960, 0.965741397855499170, 0.965728421330174780, 0.965715442390529420, 0.965702461036595520, 0.965689477268405480, 0.965676491085991630, +0.965663502489386700, 0.965650511478622910, 0.965637518053732660, 0.965624522214748810, 0.965611523961703690, 0.965598523294629810, 0.965585520213559590, 0.965572514718525570, +0.965559506809560150, 0.965546496486696100, 0.965533483749965500, 0.965520468599401440, 0.965507451035036320, 0.965494431056902470, 0.965481408665032510, 0.965468383859459100, +0.965455356640214650, 0.965442327007331680, 0.965429294960843070, 0.965416260500781220, 0.965403223627178670, 0.965390184340068180, 0.965377142639482160, 0.965364098525453240, +0.965351051998014190, 0.965338003057197190, 0.965324951703035450, 0.965311897935561270, 0.965298841754807400, 0.965285783160806490, 0.965272722153591060, 0.965259658733193750, +0.965246592899647430, 0.965233524652984290, 0.965220453993237640, 0.965207380920439780, 0.965194305434623480, 0.965181227535821470, 0.965168147224066410, 0.965155064499390920, +0.965141979361827550, 0.965128891811409480, 0.965115801848169140, 0.965102709472139390, 0.965089614683352750, 0.965076517481842200, 0.965063417867640270, 0.965050315840779830, +0.965037211401293280, 0.965024104549214060, 0.965010995284574570, 0.964997883607407460, 0.964984769517745810, 0.964971653015622160, 0.964958534101069350, 0.964945412774120270, +0.964932289034807320, 0.964919162883163930, 0.964906034319222730, 0.964892903343016360, 0.964879769954577690, 0.964866634153939700, 0.964853495941135010, 0.964840355316196390, +0.964827212279157130, 0.964814066830049890, 0.964800918968907410, 0.964787768695762660, 0.964774616010648510, 0.964761460913597820, 0.964748303404643460, 0.964735143483818060, +0.964721981151155040, 0.964708816406687150, 0.964695649250447150, 0.964682479682468120, 0.964669307702782810, 0.964656133311424190, 0.964642956508425130, 0.964629777293818820, +0.964616595667638020, 0.964603411629915810, 0.964590225180685160, 0.964577036319978820, 0.964563845047829880, 0.964550651364271430, 0.964537455269335990, 0.964524256763057200, +0.964511055845467810, 0.964497852516600810, 0.964484646776489040, 0.964471438625165820, 0.964458228062663900, 0.964445015089016370, 0.964431799704256190, 0.964418581908416670, +0.964405361701530680, 0.964392139083631310, 0.964378914054751620, 0.964365686614924610, 0.964352456764183350, 0.964339224502560820, 0.964325989830090440, 0.964312752746805060, +0.964299513252737770, 0.964286271347921660, 0.964273027032389930, 0.964259780306175650, 0.964246531169311920, 0.964233279621831580, 0.964220025663768300, 0.964206769295155030, +0.964193510516024750, 0.964180249326410670, 0.964166985726346070, 0.964153719715863940, 0.964140451294997480, 0.964127180463779650, 0.964113907222244220, 0.964100631570423920, +0.964087353508352060, 0.964074073036061850, 0.964060790153586480, 0.964047504860959030, 0.964034217158212690, 0.964020927045381000, 0.964007634522496940, 0.963994339589593910, +0.963981042246704890, 0.963967742493863410, 0.963954440331102450, 0.963941135758455530, 0.963927828775955400, 0.963914519383636040, 0.963901207581530310, 0.963887893369671510, +0.963874576748093070, 0.963861257716828180, 0.963847936275910140, 0.963834612425372050, 0.963821286165247650, 0.963807957495570020, 0.963794626416372480, 0.963781292927688330, +0.963767957029550980, 0.963754618721993860, 0.963741278005050050, 0.963727934878752860, 0.963714589343136030, 0.963701241398232770, 0.963687891044076480, 0.963674538280700380, +0.963661183108137860, 0.963647825526422470, 0.963634465535587510, 0.963621103135666180, 0.963607738326692330, 0.963594371108699050, 0.963581001481719880, 0.963567629445788220, +0.963554255000937500, 0.963540878147201130, 0.963527498884612310, 0.963514117213205010, 0.963500733133012430, 0.963487346644067990, 0.963473957746405210, 0.963460566440057510, +0.963447172725058420, 0.963433776601441360, 0.963420378069239640, 0.963406977128487220, 0.963393573779217300, 0.963380168021463530, 0.963366759855259320, 0.963353349280638200, +0.963339936297633700, 0.963326520906279350, 0.963313103106608450, 0.963299682898655090, 0.963286260282452460, 0.963272835258034200, 0.963259407825433840, 0.963245977984685030, +0.963232545735821180, 0.963219111078875810, 0.963205674013882910, 0.963192234540875770, 0.963178792659888040, 0.963165348370953360, 0.963151901674105250, 0.963138452569377470, +0.963125001056803540, 0.963111547136416780, 0.963098090808251480, 0.963084632072340960, 0.963071170928718860, 0.963057707377418800, 0.963044241418474440, 0.963030773051919530, +0.963017302277787480, 0.963003829096112260, 0.962990353506927630, 0.962976875510267120, 0.962963395106164350, 0.962949912294653100, 0.962936427075767100, 0.962922939449539990, +0.962909449416005310, 0.962895956975197250, 0.962882462127149230, 0.962868964871895110, 0.962855465209468630, 0.962841963139903450, 0.962828458663233410, 0.962814951779492170, +0.962801442488713240, 0.962787930790931060, 0.962774416686179020, 0.962760900174490900, 0.962747381255900650, 0.962733859930441800, 0.962720336198148340, 0.962706810059053900, +0.962693281513192560, 0.962679750560598070, 0.962666217201304190, 0.962652681435344770, 0.962639143262753570, 0.962625602683564670, 0.962612059697811610, 0.962598514305528230, +0.962584966506748850, 0.962571416301507000, 0.962557863689836650, 0.962544308671771540, 0.962530751247345770, 0.962517191416593090, 0.962503629179547350, 0.962490064536242420, +0.962476497486712490, 0.962462928030991320, 0.962449356169112870, 0.962435781901111010, 0.962422205227019710, 0.962408626146872950, 0.962395044660704250, 0.962381460768548250, +0.962367874470438590, 0.962354285766409360, 0.962340694656494300, 0.962327101140727500, 0.962313505219142940, 0.962299906891774580, 0.962286306158656290, 0.962272703019822480, +0.962259097475306910, 0.962245489525143550, 0.962231879169366480, 0.962218266408009780, 0.962204651241107320, 0.962191033668693070, 0.962177413690801450, 0.962163791307466320, +0.962150166518721650, 0.962136539324601640, 0.962122909725140140, 0.962109277720371470, 0.962095643310329600, 0.962082006495048380, 0.962068367274562460, 0.962054725648905480, +0.962041081618111750, 0.962027435182215340, 0.962013786341250340, 0.962000135095250840, 0.961986481444251030, 0.961972825388284770, 0.961959166927386700, 0.961945506061590680, +0.961931842790930910, 0.961918177115441590, 0.961904509035156790, 0.961890838550110590, 0.961877165660337210, 0.961863490365871150, 0.961849812666746300, 0.961836132562996940, +0.961822450054657270, 0.961808765141761500, 0.961795077824343700, 0.961781388102438290, 0.961767695976079250, 0.961754001445301100, 0.961740304510137920, 0.961726605170624030, +0.961712903426793610, 0.961699199278680970, 0.961685492726320310, 0.961671783769745710, 0.961658072408991820, 0.961644358644092810, 0.961630642475082900, 0.961616923901996380, +0.961603202924867560, 0.961589479543730750, 0.961575753758620140, 0.961562025569569930, 0.961548294976614980, 0.961534561979789260, 0.961520826579127070, 0.961507088774662950, +0.961493348566430980, 0.961479605954465690, 0.961465860938801380, 0.961452113519472240, 0.961438363696512920, 0.961424611469957830, 0.961410856839841180, 0.961397099806197360, +0.961383340369060810, 0.961369578528465830, 0.961355814284446720, 0.961342047637038340, 0.961328278586274790, 0.961314507132190580, 0.961300733274820130, 0.961286957014197860, +0.961273178350358080, 0.961259397283335430, 0.961245613813164090, 0.961231827939878940, 0.961218039663514160, 0.961204248984104280, 0.961190455901683840, 0.961176660416287240, +0.961162862527948910, 0.961149062236703600, 0.961135259542585270, 0.961121454445629020, 0.961107646945869140, 0.961093837043340170, 0.961080024738076630, 0.961066210030113060, +0.961052392919483860, 0.961038573406223450, 0.961024751490366920, 0.961010927171948470, 0.960997100451002730, 0.960983271327564230, 0.960969439801667490, 0.960955605873347270, +0.960941769542637990, 0.960927930809573950, 0.960914089674190450, 0.960900246136521700, 0.960886400196602320, 0.960872551854466850, 0.960858701110150150, 0.960844847963686630, +0.960830992415110720, 0.960817134464457600, 0.960803274111761700, 0.960789411357057530, 0.960775546200379860, 0.960761678641763320, 0.960747808681242540, 0.960733936318852290, +0.960720061554626970, 0.960706184388601780, 0.960692304820811030, 0.960678422851289570, 0.960664538480072050, 0.960650651707193210, 0.960636762532687700, 0.960622870956590270, +0.960608976978935440, 0.960595080599758510, 0.960581181819093690, 0.960567280636976050, 0.960553377053440240, 0.960539471068520890, 0.960525562682252860, 0.960511651894670690, +0.960497738705809680, 0.960483823115704350, 0.960469905124389340, 0.960455984731899640, 0.960442061938269980, 0.960428136743535220, 0.960414209147730010, 0.960400279150889100, +0.960386346753047790, 0.960372411954240500, 0.960358474754502200, 0.960344535153867750, 0.960330593152372010, 0.960316648750049740, 0.960302701946935790, 0.960288752743064910, +0.960274801138472410, 0.960260847133192820, 0.960246890727261220, 0.960232931920712350, 0.960218970713581090, 0.960205007105902510, 0.960191041097711030, 0.960177072689042290, +0.960163101879930920, 0.960149128670411690, 0.960135153060519660, 0.960121175050289820, 0.960107194639756910, 0.960093211828956130, 0.960079226617922000, 0.960065239006690160, +0.960051248995295150, 0.960037256583772040, 0.960023261772155690, 0.960009264560481300, 0.959995264948783730, 0.959981262937097730, 0.959967258525458830, 0.959953251713901780, +0.959939242502461540, 0.959925230891173320, 0.959911216880071970, 0.959897200469192580, 0.959883181658570120, 0.959869160448239560, 0.959855136838236200, 0.959841110828595130, +0.959827082419351330, 0.959813051610539650, 0.959799018402195500, 0.959784982794353760, 0.959770944787049500, 0.959756904380317690, 0.959742861574193860, 0.959728816368712880, +0.959714768763909820, 0.959700718759819880, 0.959686666356478150, 0.959672611553919700, 0.959658554352179500, 0.959644494751293210, 0.959630432751295670, 0.959616368352221970, +0.959602301554107420, 0.959588232356987090, 0.959574160760896190, 0.959560086765869900, 0.959546010371943200, 0.959531931579151620, 0.959517850387530240, 0.959503766797114240, +0.959489680807938840, 0.959475592420039210, 0.959461501633450680, 0.959447408448208310, 0.959433312864347190, 0.959419214881903070, 0.959405114500910820, 0.959391011721405840, +0.959376906543423340, 0.959362798966998610, 0.959348688992166850, 0.959334576618963150, 0.959320461847423140, 0.959306344677582130, 0.959292225109475210, 0.959278103143137660, +0.959263978778604920, 0.959249852015912170, 0.959235722855094840, 0.959221591296188000, 0.959207457339227300, 0.959193320984248030, 0.959179182231285510, 0.959165041080375040, +0.959150897531551920, 0.959136751584851450, 0.959122603240309070, 0.959108452497960280, 0.959094299357840410, 0.959080143819984740, 0.959065985884428710, 0.959051825551207830, +0.959037662820357300, 0.959023497691912640, 0.959009330165908950, 0.958995160242382180, 0.958980987921367540, 0.958966813202900450, 0.958952636087016310, 0.958938456573750540, +0.958924274663138680, 0.958910090355216130, 0.958895903650018090, 0.958881714547580530, 0.958867523047938650, 0.958853329151128090, 0.958839132857184140, 0.958824934166142340, +0.958810733078038210, 0.958796529592906950, 0.958782323710784650, 0.958768115431706590, 0.958753904755708210, 0.958739691682825020, 0.958725476213092680, 0.958711258346546690, +0.958697038083222490, 0.958682815423155370, 0.958668590366381520, 0.958654362912936260, 0.958640133062855000, 0.958625900816173490, 0.958611666172927150, 0.958597429133151710, +0.958583189696882610, 0.958568947864155360, 0.958554703635005940, 0.958540457009469880, 0.958526207987582590, 0.958511956569379820, 0.958497702754897100, 0.958483446544170170, +0.958469187937234350, 0.958454926934125710, 0.958440663534879890, 0.958426397739532420, 0.958412129548118940, 0.958397858960675090, 0.958383585977236610, 0.958369310597839140, +0.958355032822518220, 0.958340752651309910, 0.958326470084249650, 0.958312185121373390, 0.958297897762716570, 0.958283608008315020, 0.958269315858204410, 0.958255021312420240, +0.958240724370998830, 0.958226425033975590, 0.958212123301386280, 0.958197819173266740, 0.958183512649652510, 0.958169203730579680, 0.958154892416083650, 0.958140578706200290, +0.958126262600965670, 0.958111944100415340, 0.958097623204585250, 0.958083299913511040, 0.958068974227228590, 0.958054646145773740, 0.958040315669182240, 0.958025982797489740, +0.958011647530732540, 0.957997309868946160, 0.957982969812166460, 0.957968627360429430, 0.957954282513770790, 0.957939935272226540, 0.957925585635832080, 0.957911233604623940, +0.957896879178637750, 0.957882522357909380, 0.957868163142474690, 0.957853801532369540, 0.957839437527629900, 0.957825071128291740, 0.957810702334390580, 0.957796331145962850, +0.957781957563044410, 0.957767581585671100, 0.957753203213878690, 0.957738822447703360, 0.957724439287180980, 0.957710053732347300, 0.957695665783238730, 0.957681275439890900, +0.957666882702339910, 0.957652487570621710, 0.957638090044772290, 0.957623690124827730, 0.957609287810823880, 0.957594883102796610, 0.957580476000782330, 0.957566066504816790, +0.957551654614936190, 0.957537240331176490, 0.957522823653573550, 0.957508404582163690, 0.957493983116982750, 0.957479559258066600, 0.957465133005451770, 0.957450704359174230, +0.957436273319269840, 0.957421839885774780, 0.957407404058725040, 0.957392965838156920, 0.957378525224106050, 0.957364082216609180, 0.957349636815702070, 0.957335189021420900, +0.957320738833801750, 0.957306286252880720, 0.957291831278693990, 0.957277373911277650, 0.957262914150667670, 0.957248451996900670, 0.957233987450012540, 0.957219520510039450, +0.957205051177017490, 0.957190579450982960, 0.957176105331971950, 0.957161628820020650, 0.957147149915165030, 0.957132668617441840, 0.957118184926887050, 0.957103698843536630, +0.957089210367427110, 0.957074719498594460, 0.957060226237075100, 0.957045730582904870, 0.957031232536120550, 0.957016732096758190, 0.957002229264853900, 0.956987724040444190, +0.956973216423565030, 0.956958706414252960, 0.956944194012544050, 0.956929679218474380, 0.956915162032080820, 0.956900642453399340, 0.956886120482466240, 0.956871596119317820, +0.956857069363990400, 0.956842540216520380, 0.956828008676943730, 0.956813474745297320, 0.956798938421617230, 0.956784399705939760, 0.956769858598301330, 0.956755315098738120, +0.956740769207286790, 0.956726220923983520, 0.956711670248864390, 0.956697117181966260, 0.956682561723325440, 0.956668003872978230, 0.956653443630961050, 0.956638880997310090, +0.956624315972062100, 0.956609748555253270, 0.956595178746919790, 0.956580606547098640, 0.956566031955825900, 0.956551454973138200, 0.956536875599071750, 0.956522293833663160, +0.956507709676948870, 0.956493123128965060, 0.956478534189748600, 0.956463942859335890, 0.956449349137763250, 0.956434753025067310, 0.956420154521284480, 0.956405553626451300, +0.956390950340604170, 0.956376344663779410, 0.956361736596014090, 0.956347126137344410, 0.956332513287806880, 0.956317898047438050, 0.956303280416274550, 0.956288660394352790, +0.956274037981709400, 0.956259413178380700, 0.956244785984403660, 0.956230156399814680, 0.956215524424650300, 0.956200890058947150, 0.956186253302741760, 0.956171614156070770, +0.956156972618970370, 0.956142328691477860, 0.956127682373629550, 0.956113033665462080, 0.956098382567011960, 0.956083729078315850, 0.956069073199410480, 0.956054414930332390, +0.956039754271118090, 0.956025091221804570, 0.956010425782428340, 0.955995757953026050, 0.955981087733634330, 0.955966415124289930, 0.955951740125029590, 0.955937062735889520, +0.955922382956907010, 0.955907700788118710, 0.955893016229561020, 0.955878329281270810, 0.955863639943284830, 0.955848948215639700, 0.955834254098372190, 0.955819557591518820, +0.955804858695116890, 0.955790157409202700, 0.955775453733813120, 0.955760747668984890, 0.955746039214754870, 0.955731328371159710, 0.955716615138236250, 0.955701899516021030, +0.955687181504551230, 0.955672461103863500, 0.955657738313994700, 0.955643013134981460, 0.955628285566860750, 0.955613555609669320, 0.955598823263443700, 0.955584088528221300, +0.955569351404038650, 0.955554611890932710, 0.955539869988940140, 0.955525125698098000, 0.955510379018442930, 0.955495629950012030, 0.955480878492841690, 0.955466124646969450, +0.955451368412431950, 0.955436609789265920, 0.955421848777508460, 0.955407085377196320, 0.955392319588366570, 0.955377551411055960, 0.955362780845301130, 0.955348007891139720, +0.955333232548608250, 0.955318454817743690, 0.955303674698583020, 0.955288892191163090, 0.955274107295520980, 0.955259320011693450, 0.955244530339717680, 0.955229738279630760, +0.955214943831469430, 0.955200146995270670, 0.955185347771071670, 0.955170546158909170, 0.955155742158820380, 0.955140935770842030, 0.955126126995011540, 0.955111315831365660, +0.955096502279941580, 0.955081686340776170, 0.955066868013906610, 0.955052047299369880, 0.955037224197202830, 0.955022398707442880, 0.955007570830126990, 0.954992740565292150, +0.954977907912975430, 0.954963072873213910, 0.954948235446044790, 0.954933395631505140, 0.954918553429631610, 0.954903708840462050, 0.954888861864033100, 0.954874012500382060, +0.954859160749546020, 0.954844306611562050, 0.954829450086467360, 0.954814591174299010, 0.954799729875093870, 0.954784866188889800, 0.954770000115723440, 0.954755131655632190, +0.954740260808653040, 0.954725387574823170, 0.954710511954179890, 0.954695633946760160, 0.954680753552601510, 0.954665870771741030, 0.954650985604215800, 0.954636098050063110, +0.954621208109320270, 0.954606315782024370, 0.954591421068212600, 0.954576523967922140, 0.954561624481190530, 0.954546722608054950, 0.954531818348552500, 0.954516911702720460, +0.954502002670596260, 0.954487091252216980, 0.954472177447620030, 0.954457261256842270, 0.954442342679921670, 0.954427421716895210, 0.954412498367800290, 0.954397572632674000, +0.954382644511553860, 0.954367714004477060, 0.954352781111480700, 0.954337845832602730, 0.954322908167880010, 0.954307968117350190, 0.954293025681050340, 0.954278080859017890, +0.954263133651290340, 0.954248184057904900, 0.954233232078898760, 0.954218277714309780, 0.954203320964175150, 0.954188361828532170, 0.954173400307418370, 0.954158436400870950, +0.954143470108927530, 0.954128501431625090, 0.954113530369001710, 0.954098556921094580, 0.954083581087940890, 0.954068602869578400, 0.954053622266044290, 0.954038639277376200, +0.954023653903611550, 0.954008666144787410, 0.953993676000941870, 0.953978683472112120, 0.953963688558335800, 0.953948691259650090, 0.953933691576092760, 0.953918689507701200, +0.953903685054512840, 0.953888678216565090, 0.953873668993895920, 0.953858657386542520, 0.953843643394542420, 0.953828627017933360, 0.953813608256752650, 0.953798587111037930, +0.953783563580826390, 0.953768537666156320, 0.953753509367064930, 0.953738478683589630, 0.953723445615768270, 0.953708410163638280, 0.953693372327237170, 0.953678332106602690, +0.953663289501772150, 0.953648244512783630, 0.953633197139674430, 0.953618147382482300, 0.953603095241244760, 0.953588040715999560, 0.953572983806784240, 0.953557924513636410, +0.953542862836593510, 0.953527798775693710, 0.953512732330974440, 0.953497663502473340, 0.953482592290228140, 0.953467518694276370, 0.953452442714655790, 0.953437364351403920, +0.953422283604558940, 0.953407200474158170, 0.953392114960239350, 0.953377027062840330, 0.953361936781998760, 0.953346844117752280, 0.953331749070138730, 0.953316651639195540, +0.953301551824960900, 0.953286449627472440, 0.953271345046767920, 0.953256238082884950, 0.953241128735861420, 0.953226017005735060, 0.953210902892543400, 0.953195786396324850, +0.953180667517116720, 0.953165546254956860, 0.953150422609883250, 0.953135296581933520, 0.953120168171145640, 0.953105037377557250, 0.953089904201206100, 0.953074768642130370, +0.953059630700367700, 0.953044490375955950, 0.953029347668933100, 0.953014202579336780, 0.952999055107204950, 0.952983905252575480, 0.952968753015486000, 0.952953598395974930, +0.952938441394079790, 0.952923282009838670, 0.952908120243289190, 0.952892956094469560, 0.952877789563417510, 0.952862620650170580, 0.952847449354767510, 0.952832275677245820, +0.952817099617643380, 0.952801921175998160, 0.952786740352348230, 0.952771557146731340, 0.952756371559185690, 0.952741183589748800, 0.952725993238459190, 0.952710800505354620, +0.952695605390473040, 0.952680407893852440, 0.952665208015530780, 0.952650005755546150, 0.952634801113936170, 0.952619594090739600, 0.952604384685993950, 0.952589172899737320, +0.952573958732007790, 0.952558742182843420, 0.952543523252282090, 0.952528301940361980, 0.952513078247120840, 0.952497852172597300, 0.952482623716829120, 0.952467392879854380, +0.952452159661711260, 0.952436924062437630, 0.952421686082071670, 0.952406445720651580, 0.952391202978215000, 0.952375957854800780, 0.952360710350446670, 0.952345460465190750, +0.952330208199071100, 0.952314953552126030, 0.952299696524393610, 0.952284437115911600, 0.952269175326718730, 0.952253911156852980, 0.952238644606352550, 0.952223375675255390, +0.952208104363599820, 0.952192830671423910, 0.952177554598766070, 0.952162276145663950, 0.952146995312156520, 0.952131712098281510, 0.952116426504077240, 0.952101138529581890, +0.952085848174833770, 0.952070555439870960, 0.952055260324731760, 0.952039962829454240, 0.952024662954076950, 0.952009360698638060, 0.951994056063175780, 0.951978749047728390, +0.951963439652334100, 0.951948127877031200, 0.951932813721857670, 0.951917497186852370, 0.951902178272053370, 0.951886856977498970, 0.951871533303227380, 0.951856207249277000, +0.951840878815686020, 0.951825548002492860, 0.951810214809735600, 0.951794879237453100, 0.951779541285683320, 0.951764200954464790, 0.951748858243835700, 0.951733513153834480, +0.951718165684499410, 0.951702815835868800, 0.951687463607981290, 0.951672109000875180, 0.951656752014588770, 0.951641392649160480, 0.951626030904628720, 0.951610666781031900, +0.951595300278408330, 0.951579931396796310, 0.951564560136234800, 0.951549186496761790, 0.951533810478415790, 0.951518432081235320, 0.951503051305258810, 0.951487668150524660, +0.951472282617071290, 0.951456894704937000, 0.951441504414160640, 0.951426111744780640, 0.951410716696835300, 0.951395319270363140, 0.951379919465402680, 0.951364517281992560, +0.951349112720170750, 0.951333705779976450, 0.951318296461447830, 0.951302884764623550, 0.951287470689542110, 0.951272054236241840, 0.951256635404761570, 0.951241214195139630, +0.951225790607414410, 0.951210364641625010, 0.951194936297809710, 0.951179505576007060, 0.951164072476255560, 0.951148636998593980, 0.951133199143060830, 0.951117758909694520, +0.951102316298533700, 0.951086871309617330, 0.951071423942983720, 0.951055974198671610, 0.951040522076719520, 0.951025067577166210, 0.951009610700050190, 0.950994151445409770, +0.950978689813284370, 0.950963225803712180, 0.950947759416731930, 0.950932290652382380, 0.950916819510701950, 0.950901345991729600, 0.950885870095503850, 0.950870391822063120, +0.950854911171446720, 0.950839428143693040, 0.950823942738840740, 0.950808454956928560, 0.950792964797995350, 0.950777472262079650, 0.950761977349220080, 0.950746480059455720, +0.950730980392825220, 0.950715478349367320, 0.950699973929120650, 0.950684467132124070, 0.950668957958416330, 0.950653446408036170, 0.950637932481022240, 0.950622416177413610, +0.950606897497249030, 0.950591376440567130, 0.950575853007406880, 0.950560327197806920, 0.950544799011806110, 0.950529268449443410, 0.950513735510757130, 0.950498200195786900, +0.950482662504571140, 0.950467122437148700, 0.950451579993558560, 0.950436035173839340, 0.950420487978030140, 0.950404938406169350, 0.950389386458296510, 0.950373832134450260, +0.950358275434669330, 0.950342716358992810, 0.950327154907459450, 0.950311591080108210, 0.950296024876977950, 0.950280456298107420, 0.950264885343536040, 0.950249312013302430, +0.950233736307445450, 0.950218158226004190, 0.950202577769017620, 0.950186994936524480, 0.950171409728563950, 0.950155822145174580, 0.950140232186395870, 0.950124639852266690, +0.950109045142825900, 0.950093448058112470, 0.950077848598165350, 0.950062246763023640, 0.950046642552726080, 0.950031035967312200, 0.950015427006820730, 0.949999815671290660, +0.949984201960761050, 0.949968585875270890, 0.949952967414859350, 0.949937346579565410, 0.949921723369427710, 0.949906097784486090, 0.949890469824779200, 0.949874839490346120, +0.949859206781225930, 0.949843571697457700, 0.949827934239080630, 0.949812294406133350, 0.949796652198655610, 0.949781007616686380, 0.949765360660264510, 0.949749711329429200, +0.949734059624219750, 0.949718405544675020, 0.949702749090834410, 0.949687090262736570, 0.949671429060421230, 0.949655765483927380, 0.949640099533294200, 0.949624431208560660, +0.949608760509766060, 0.949593087436949590, 0.949577411990150330, 0.949561734169407370, 0.949546053974760220, 0.949530371406248070, 0.949514686463909910, 0.949498999147785020, +0.949483309457912710, 0.949467617394332050, 0.949451922957082140, 0.949436226146202600, 0.949420526961732620, 0.949404825403711290, 0.949389121472177800, 0.949373415167171660, +0.949357706488731860, 0.949341995436897790, 0.949326282011708540, 0.949310566213203870, 0.949294848041422720, 0.949279127496404420, 0.949263404578188360, 0.949247679286813750, +0.949231951622319990, 0.949216221584746390, 0.949200489174131910, 0.949184754390516420, 0.949169017233939090, 0.949153277704439250, 0.949137535802056180, 0.949121791526829290, +0.949106044878797910, 0.949090295858001200, 0.949074544464478920, 0.949058790698270370, 0.949043034559414860, 0.949027276047951670, 0.949011515163920350, 0.948995751907360190, +0.948979986278310710, 0.948964218276810990, 0.948948447902900890, 0.948932675156619830, 0.948916900038006990, 0.948901122547101910, 0.948885342683944090, 0.948869560448572850, +0.948853775841027370, 0.948837988861347850, 0.948822199509573250, 0.948806407785743210, 0.948790613689897140, 0.948774817222074570, 0.948759018382314910, 0.948743217170657790, +0.948727413587142300, 0.948711607631808510, 0.948695799304695720, 0.948679988605843460, 0.948664175535291250, 0.948648360093078510, 0.948632542279244980, 0.948616722093829970, +0.948600899536872990, 0.948585074608414010, 0.948569247308492350, 0.948553417637147510, 0.948537585594419250, 0.948521751180346870, 0.948505914394970230, 0.948490075238328510, +0.948474233710461800, 0.948458389811409620, 0.948442543541211380, 0.948426694899906830, 0.948410843887535490, 0.948394990504137110, 0.948379134749751220, 0.948363276624417220, +0.948347416128175300, 0.948331553261064770, 0.948315688023125490, 0.948299820414396870, 0.948283950434918750, 0.948268078084730790, 0.948252203363872390, 0.948236326272383630, +0.948220446810304150, 0.948204564977673580, 0.948188680774531560, 0.948172794200917820, 0.948156905256872020, 0.948141013942434110, 0.948125120257643280, 0.948109224202539960, +0.948093325777163540, 0.948077424981553900, 0.948061521815750650, 0.948045616279793560, 0.948029708373722470, 0.948013798097577130, 0.947997885451396960, 0.947981970435222370, +0.947966053049092870, 0.947950133293048340, 0.947934211167128280, 0.947918286671372790, 0.947902359805821600, 0.947886430570514250, 0.947870498965491030, 0.947854564990791570, +0.947838628646455740, 0.947822689932523390, 0.947806748849034260, 0.947790805396028220, 0.947774859573545240, 0.947758911381624710, 0.947742960820307290, 0.947727007889632490, +0.947711052589640060, 0.947695094920370070, 0.947679134881862280, 0.947663172474156770, 0.947647207697293270, 0.947631240551311430, 0.947615271036251870, 0.947599299152154020, +0.947583324899057940, 0.947567348277003620, 0.947551369286030900, 0.947535387926179750, 0.947519404197489810, 0.947503418100001720, 0.947487429633754990, 0.947471438798789810, +0.947455445595145940, 0.947439450022863450, 0.947423452081982420, 0.947407451772542710, 0.947391449094584060, 0.947375444048147110, 0.947359436633271490, 0.947343426849997280, +0.947327414698364570, 0.947311400178413310, 0.947295383290183590, 0.947279364033715040, 0.947263342409048410, 0.947247318416223450, 0.947231292055280120, 0.947215263326258610, +0.947199232229198880, 0.947183198764141140, 0.947167162931125460, 0.947151124730191470, 0.947135084161380040, 0.947119041224730780, 0.947102995920284020, 0.947086948248079820, +0.947070898208158150, 0.947054845800559210, 0.947038791025323290, 0.947022733882490030, 0.947006674372100180, 0.946990612494193700, 0.946974548248810670, 0.946958481635991280, +0.946942412655775610, 0.946926341308203970, 0.946910267593316200, 0.946894191511153060, 0.946878113061754400, 0.946862032245160520, 0.946845949061411510, 0.946829863510547650, +0.946813775592609150, 0.946797685307636190, 0.946781592655668750, 0.946765497636747550, 0.946749400250912700, 0.946733300498204260, 0.946717198378662640, 0.946701093892327930, +0.946684987039240530, 0.946668877819440760, 0.946652766232968460, 0.946636652279864490, 0.946620535960168820, 0.946604417273921970, 0.946588296221163920, 0.946572172801935290, +0.946556047016276050, 0.946539918864226500, 0.946523788345827510, 0.946507655461118920, 0.946491520210141270, 0.946475382592934840, 0.946459242609539950, 0.946443100259996890, +0.946426955544346080, 0.946410808462627710, 0.946394659014882510, 0.946378507201150690, 0.946362353021472540, 0.946346196475888580, 0.946330037564439120, 0.946313876287164570, +0.946297712644105000, 0.946281546635301400, 0.946265378260794040, 0.946249207520623250, 0.946233034414829310, 0.946216858943452870, 0.946200681106534320, 0.946184500904113990, +0.946168318336232160, 0.946152133402929810, 0.946135946104247120, 0.946119756440224500, 0.946103564410902600, 0.946087370016321820, 0.946071173256522460, 0.946054974131545270, +0.946038772641430330, 0.946022568786218820, 0.946006362565950830, 0.945990153980666880, 0.945973943030407600, 0.945957729715213520, 0.945941514035125050, 0.945925295990182490, +0.945909075580427030, 0.945892852805898850, 0.945876627666638490, 0.945860400162686690, 0.945844170294083740, 0.945827938060870510, 0.945811703463087290, 0.945795466500774620, +0.945779227173973560, 0.945762985482724420, 0.945746741427067830, 0.945730495007044310, 0.945714246222694620, 0.945697995074059380, 0.945681741561179010, 0.945665485684094140, +0.945649227442845740, 0.945632966837474330, 0.945616703868020550, 0.945600438534524910, 0.945584170837028170, 0.945567900775571070, 0.945551628350193910, 0.945535353560937990, +0.945519076407843610, 0.945502796890951620, 0.945486515010302560, 0.945470230765937280, 0.945453944157896410, 0.945437655186220690, 0.945421363850950550, 0.945405070152127270, +0.945388774089791270, 0.945372475663983410, 0.945356174874744330, 0.945339871722114760, 0.945323566206135560, 0.945307258326847140, 0.945290948084290930, 0.945274635478507320, +0.945258320509537060, 0.945242003177421020, 0.945225683482200040, 0.945209361423914760, 0.945193037002606150, 0.945176710218314620, 0.945160381071081580, 0.945144049560947660, +0.945127715687953620, 0.945111379452140190, 0.945095040853548450, 0.945078699892219040, 0.945062356568192820, 0.945046010881510520, 0.945029662832213460, 0.945013312420342140, +0.944996959645937660, 0.944980604509040760, 0.944964247009692280, 0.944947887147933210, 0.944931524923804170, 0.944915160337346570, 0.944898793388601170, 0.944882424077608700, +0.944866052404410130, 0.944849678369046540, 0.944833301971558680, 0.944816923211987510, 0.944800542090373900, 0.944784158606759130, 0.944767772761183950, 0.944751384553689340, +0.944734993984316260, 0.944718601053105790, 0.944702205760098780, 0.944685808105336200, 0.944669408088858800, 0.944653005710708200, 0.944636600970925170, 0.944620193869550540, +0.944603784406625400, 0.944587372582190940, 0.944570958396287910, 0.944554541848957260, 0.944538122940240530, 0.944521701670178460, 0.944505278038812120, 0.944488852046182710, +0.944472423692331090, 0.944455992977298430, 0.944439559901125710, 0.944423124463853900, 0.944406686665524520, 0.944390246506178420, 0.944373803985856800, 0.944357359104600500, +0.944340911862450950, 0.944324462259449100, 0.944308010295635710, 0.944291555971052630, 0.944275099285740720, 0.944258640239741040, 0.944242178833094690, 0.944225715065842960, +0.944209248938026930, 0.944192780449687800, 0.944176309600866400, 0.944159836391604500, 0.944143360821942950, 0.944126882891923150, 0.944110402601586070, 0.944093919950972920, +0.944077434940125080, 0.944060947569083650, 0.944044457837889480, 0.944027965746584430, 0.944011471295209570, 0.943994974483805980, 0.943978475312414970, 0.943961973781077820, +0.943945469889835630, 0.943928963638729580, 0.943912455027801300, 0.943895944057091980, 0.943879430726642820, 0.943862915036495000, 0.943846396986689930, 0.943829876577268800, +0.943813353808273030, 0.943796828679743680, 0.943780301191722400, 0.943763771344250490, 0.943747239137369020, 0.943730704571119520, 0.943714167645543280, 0.943697628360681610, +0.943681086716575580, 0.943664542713267160, 0.943647996350797320, 0.943631447629207480, 0.943614896548539140, 0.943598343108833390, 0.943581787310131870, 0.943565229152475870, +0.943548668635906580, 0.943532105760465870, 0.943515540526194800, 0.943498972933135010, 0.943482402981327680, 0.943465830670814460, 0.943449256001636540, 0.943432678973835540, +0.943416099587452540, 0.943399517842529620, 0.943382933739107870, 0.943366347277228790, 0.943349758456933810, 0.943333167278264550, 0.943316573741262210, 0.943299977845968310, +0.943283379592424590, 0.943266778980672570, 0.943250176010753560, 0.943233570682709080, 0.943216962996580640, 0.943200352952409890, 0.943183740550238130, 0.943167125790106860, +0.943150508672057960, 0.943133889196132840, 0.943117267362373000, 0.943100643170819990, 0.943084016621515420, 0.943067387714500720, 0.943050756449817620, 0.943034122827507320, +0.943017486847612000, 0.943000848510172850, 0.942984207815231730, 0.942967564762830060, 0.942950919353009450, 0.942934271585811560, 0.942917621461277670, 0.942900968979450080, +0.942884314140369990, 0.942867656944079150, 0.942850997390619170, 0.942834335480031700, 0.942817671212358490, 0.942801004587640930, 0.942784335605920680, 0.942767664267239900, +0.942750990571639910, 0.942734314519162450, 0.942717636109849160, 0.942700955343741760, 0.942684272220882020, 0.942667586741311350, 0.942650898905072030, 0.942634208712205380, +0.942617516162753240, 0.942600821256757260, 0.942584123994259280, 0.942567424375301060, 0.942550722399924100, 0.942534018068170170, 0.942517311380081440, 0.942500602335699540, +0.942483890935066020, 0.942467177178222810, 0.942450461065211580, 0.942433742596074260, 0.942417021770852630, 0.942400298589588070, 0.942383573052323120, 0.942366845159099300, +0.942350114909958240, 0.942333382304941900, 0.942316647344092150, 0.942299910027450840, 0.942283170355059370, 0.942266428326960280, 0.942249683943195190, 0.942232937203805850, +0.942216188108834120, 0.942199436658321950, 0.942182682852311220, 0.942165926690843760, 0.942149168173961100, 0.942132407301706000, 0.942115644074119740, 0.942098878491244410, +0.942082110553121850, 0.942065340259794050, 0.942048567611302960, 0.942031792607690430, 0.942015015248998000, 0.941998235535268400, 0.941981453466543270, 0.941964669042864470, +0.941947882264273950, 0.941931093130813800, 0.941914301642525880, 0.941897507799451920, 0.941880711601634450, 0.941863913049115320, 0.941847112141936280, 0.941830308880139520, +0.941813503263766890, 0.941796695292860590, 0.941779884967462570, 0.941763072287614580, 0.941746257253359140, 0.941729439864738000, 0.941712620121793350, 0.941695798024567150, +0.941678973573101370, 0.941662146767438200, 0.941645317607619380, 0.941628486093687540, 0.941611652225684550, 0.941594816003652360, 0.941577977427633160, 0.941561136497669040, +0.941544293213802060, 0.941527447576074320, 0.941510599584527650, 0.941493749239204810, 0.941476896540147660, 0.941460041487398150, 0.941443184080998700, 0.941426324320991160, +0.941409462207417840, 0.941392597740320800, 0.941375730919742030, 0.941358861745724250, 0.941341990218309330, 0.941325116337539350, 0.941308240103456710, 0.941291361516103380, +0.941274480575521650, 0.941257597281753400, 0.941240711634841460, 0.941223823634827820, 0.941206933281754530, 0.941190040575664020, 0.941173145516598250, 0.941156248104599750, +0.941139348339710580, 0.941122446221972720, 0.941105541751429130, 0.941088634928121560, 0.941071725752092520, 0.941054814223384110, 0.941037900342038600, 0.941020984108098420, +0.941004065521605760, 0.940987144582602690, 0.940970221291131950, 0.940953295647235730, 0.940936367650956340, 0.940919437302335960, 0.940902504601416890, 0.940885569548241650, +0.940868632142852210, 0.940851692385291430, 0.940834750275601480, 0.940817805813824680, 0.940800859000003320, 0.940783909834179810, 0.940766958316396450, 0.940750004446695760, +0.940733048225119830, 0.940716089651711500, 0.940699128726512960, 0.940682165449566620, 0.940665199820914900, 0.940648231840600090, 0.940631261508664720, 0.940614288825150970, +0.940597313790101700, 0.940580336403559200, 0.940563356665565900, 0.940546374576164080, 0.940529390135396490, 0.940512403343305330, 0.940495414199933100, 0.940478422705322110, +0.940461428859515450, 0.940444432662555060, 0.940427434114483710, 0.940410433215343680, 0.940393429965177610, 0.940376424364028020, 0.940359416411937320, 0.940342406108947700, +0.940325393455102470, 0.940308378450443790, 0.940291361095014100, 0.940274341388856020, 0.940257319332012060, 0.940240294924524770, 0.940223268166436530, 0.940206239057790330, +0.940189207598628670, 0.940172173788993870, 0.940155137628928660, 0.940138099118475570, 0.940121058257677330, 0.940104015046576370, 0.940086969485215080, 0.940069921573636780, +0.940052871311883530, 0.940035818699998190, 0.940018763738023290, 0.940001706426001450, 0.939984646763975310, 0.939967584751987610, 0.939950520390080650, 0.939933453678297610, +0.939916384616681030, 0.939899313205273530, 0.939882239444117640, 0.939865163333256200, 0.939848084872731860, 0.939831004062587020, 0.939813920902864860, 0.939796835393608030, +0.939779747534859040, 0.939762657326660760, 0.939745564769055690, 0.939728469862086800, 0.939711372605796740, 0.939694273000228010, 0.939677171045423810, 0.939660066741426660, +0.939642960088279410, 0.939625851086024810, 0.939608739734705490, 0.939591626034364300, 0.939574509985043770, 0.939557391586787300, 0.939540270839637310, 0.939523147743636770, +0.939506022298828180, 0.939488894505254630, 0.939471764362958870, 0.939454631871983640, 0.939437497032371560, 0.939420359844166050, 0.939403220307409530, 0.939386078422145050, +0.939368934188415380, 0.939351787606263370, 0.939334638675731970, 0.939317487396863830, 0.939300333769701790, 0.939283177794289160, 0.939266019470668570, 0.939248858798882870, +0.939231695778975140, 0.939214530410988120, 0.939197362694964790, 0.939180192630947760, 0.939163020218980570, 0.939145845459105840, 0.939128668351366440, 0.939111488895805310, +0.939094307092465550, 0.939077122941390010, 0.939059936442621650, 0.939042747596203210, 0.939025556402178110, 0.939008362860589200, 0.938991166971479330, 0.938973968734891580, +0.938956768150868930, 0.938939565219454210, 0.938922359940690400, 0.938905152314621020, 0.938887942341288690, 0.938870730020736510, 0.938853515353007540, 0.938836298338144750, +0.938819078976191210, 0.938801857267190010, 0.938784633211183880, 0.938767406808216460, 0.938750178058330500, 0.938732946961569060, 0.938715713517975340, 0.938698477727592300, +0.938681239590463010, 0.938663999106630680, 0.938646756276138030, 0.938629511099028810, 0.938612263575345770, 0.938595013705132100, 0.938577761488430970, 0.938560506925285360, +0.938543250015738460, 0.938525990759833120, 0.938508729157613190, 0.938491465209121410, 0.938474198914400980, 0.938456930273494970, 0.938439659286446680, 0.938422385953299300, +0.938405110274095900, 0.938387832248879450, 0.938370551877693690, 0.938353269160581480, 0.938335984097586230, 0.938318696688751010, 0.938301406934119010, 0.938284114833733420, +0.938266820387637650, 0.938249523595874550, 0.938232224458487860, 0.938214922975520560, 0.938197619147016050, 0.938180312973017520, 0.938163004453568150, 0.938145693588711250, +0.938128380378489890, 0.938111064822947820, 0.938093746922128100, 0.938076426676074050, 0.938059104084828840, 0.938041779148436010, 0.938024451866938610, 0.938007122240380190, +0.937989790268803580, 0.937972455952252760, 0.937955119290770910, 0.937937780284401220, 0.937920438933187000, 0.937903095237171750, 0.937885749196398780, 0.937868400810911160, +0.937851050080752760, 0.937833697005966750, 0.937816341586596550, 0.937798983822685450, 0.937781623714276980, 0.937764261261414320, 0.937746896464141110, 0.937729529322500310, +0.937712159836536000, 0.937694788006291250, 0.937677413831809580, 0.937660037313134410, 0.937642658450309030, 0.937625277243377080, 0.937607893692381960, 0.937590507797366750, +0.937573119558375630, 0.937555728975451700, 0.937538336048638450, 0.937520940777979320, 0.937503543163517810, 0.937486143205297550, 0.937468740903361520, 0.937451336257754010, +0.937433929268518100, 0.937416519935697410, 0.937399108259335480, 0.937381694239475700, 0.937364277876161720, 0.937346859169436940, 0.937329438119344880, 0.937312014725929400, +0.937294588989233900, 0.937277160909302020, 0.937259730486177170, 0.937242297719902970, 0.937224862610523070, 0.937207425158080980, 0.937189985362620100, 0.937172543224184530, +0.937155098742817550, 0.937137651918562800, 0.937120202751464020, 0.937102751241564720, 0.937085297388908440, 0.937067841193538700, 0.937050382655499670, 0.937032921774834660, +0.937015458551587300, 0.936997992985801330, 0.936980525077520390, 0.936963054826788210, 0.936945582233648320, 0.936928107298144130, 0.936910630020320050, 0.936893150400219250, +0.936875668437885720, 0.936858184133362970, 0.936840697486694850, 0.936823208497924890, 0.936805717167096600, 0.936788223494254390, 0.936770727479441570, 0.936753229122701870, +0.936735728424079150, 0.936718225383617150, 0.936700720001359620, 0.936683212277350190, 0.936665702211632480, 0.936648189804250800, 0.936630675055248660, 0.936613157964669820, +0.936595638532558120, 0.936578116758957300, 0.936560592643911230, 0.936543066187463640, 0.936525537389658050, 0.936508006250538980, 0.936490472770149850, 0.936472936948534510, +0.936455398785736910, 0.936437858281800710, 0.936420315436769960, 0.936402770250688080, 0.936385222723599590, 0.936367672855548010, 0.936350120646577300, 0.936332566096731210, +0.936315009206053820, 0.936297449974588860, 0.936279888402380190, 0.936262324489471660, 0.936244758235907470, 0.936227189641731460, 0.936209618706987490, 0.936192045431719410, +0.936174469815971300, 0.936156891859786900, 0.936139311563210400, 0.936121728926285200, 0.936104143949056060, 0.936086556631566590, 0.936068966973860660, 0.936051374975982340, +0.936033780637975600, 0.936016183959884400, 0.935998584941752370, 0.935980983583624250, 0.935963379885543680, 0.935945773847554620, 0.935928165469701150, 0.935910554752027220, +0.935892941694576930, 0.935875326297394340, 0.935857708560523080, 0.935840088484007900, 0.935822466067892430, 0.935804841312220860, 0.935787214217037140, 0.935769584782385370, +0.935751953008309710, 0.935734318894853810, 0.935716682442062410, 0.935699043649979360, 0.935681402518648620, 0.935663759048114390, 0.935646113238420840, 0.935628465089611950, +0.935610814601731900, 0.935593161774824540, 0.935575506608934520, 0.935557849104105780, 0.935540189260382400, 0.935522527077808590, 0.935504862556428400, 0.935487195696286130, +0.935469526497425760, 0.935451854959891360, 0.935434181083727560, 0.935416504868978430, 0.935398826315687940, 0.935381145423900380, 0.935363462193659960, 0.935345776625010950, +0.935328088717997110, 0.935310398472663400, 0.935292705889053670, 0.935275010967212220, 0.935257313707183240, 0.935239614109010910, 0.935221912172739640, 0.935204207898413520, +0.935186501286076610, 0.935168792335773660, 0.935151081047548850, 0.935133367421446260, 0.935115651457510300, 0.935097933155785150, 0.935080212516315230, 0.935062489539144840, +0.935044764224317810, 0.935027036571879240, 0.935009306581872980, 0.934991574254343540, 0.934973839589335110, 0.934956102586892210, 0.934938363247058920, 0.934920621569879430, +0.934902877555398800, 0.934885131203660900, 0.934867382514710130, 0.934849631488590900, 0.934831878125347630, 0.934814122425024710, 0.934796364387666450, 0.934778604013317030, +0.934760841302021310, 0.934743076253823470, 0.934725308868768030, 0.934707539146899300, 0.934689767088261680, 0.934671992692899690, 0.934654215960857400, 0.934636436892179790, +0.934618655486911250, 0.934600871745095980, 0.934583085666778500, 0.934565297252003320, 0.934547506500814970, 0.934529713413257750, 0.934511917989376050, 0.934494120229214740, +0.934476320132818230, 0.934458517700230920, 0.934440712931497220, 0.934422905826661880, 0.934405096385769180, 0.934387284608863780, 0.934369470495989840, 0.934351654047192560, +0.934333835262516010, 0.934316014142005050, 0.934298190685703970, 0.934280364893657400, 0.934262536765909980, 0.934244706302505890, 0.934226873503490320, 0.934209038368907560, +0.934191200898802250, 0.934173361093218910, 0.934155518952202170, 0.934137674475796650, 0.934119827664046890, 0.934101978516997280, 0.934084127034693010, 0.934066273217178500, +0.934048417064498260, 0.934030558576696920, 0.934012697753819230, 0.933994834595909820, 0.933976969103013310, 0.933959101275174120, 0.933941231112437430, 0.933923358614847650, +0.933905483782449530, 0.933887606615287690, 0.933869727113406770, 0.933851845276851610, 0.933833961105666410, 0.933816074599896680, 0.933798185759586840, 0.933780294584781510, +0.933762401075525330, 0.933744505231863250, 0.933726607053839920, 0.933708706541500070, 0.933690803694888110, 0.933672898514049440, 0.933654990999028490, 0.933637081149870100, +0.933619168966619010, 0.933601254449320070, 0.933583337598017930, 0.933565418412757090, 0.933547496893583070, 0.933529573040540290, 0.933511646853673600, 0.933493718333027860, +0.933475787478647680, 0.933457854290578150, 0.933439918768863900, 0.933421980913549550, 0.933404040724680640, 0.933386098202301560, 0.933368153346457290, 0.933350206157192550, +0.933332256634552330, 0.933314304778581460, 0.933296350589324810, 0.933278394066827110, 0.933260435211133550, 0.933242474022288990, 0.933224510500338280, 0.933206544645326260, +0.933188576457297910, 0.933170605936298080, 0.933152633082371400, 0.933134657895563490, 0.933116680375918990, 0.933098700523482650, 0.933080718338299640, 0.933062733820414820, +0.933044746969873160, 0.933026757786719730, 0.933008766270998930, 0.932990772422756630, 0.932972776242037450, 0.932954777728886240, 0.932936776883348080, 0.932918773705468050, +0.932900768195291000, 0.932882760352861770, 0.932864750178225900, 0.932846737671428230, 0.932828722832513720, 0.932810705661527350, 0.932792686158514180, 0.932774664323519410, +0.932756640156587880, 0.932738613657764450, 0.932720584827094860, 0.932702553664623730, 0.932684520170396270, 0.932666484344457540, 0.932648446186852500, 0.932630405697626450, +0.932612362876824360, 0.932594317724490970, 0.932576270240672130, 0.932558220425412700, 0.932540168278757630, 0.932522113800752230, 0.932504056991441450, 0.932485997850870610, +0.932467936379084430, 0.932449872576128660, 0.932431806442048260, 0.932413737976888310, 0.932395667180694110, 0.932377594053510620, 0.932359518595383240, 0.932341440806357060, +0.932323360686476920, 0.932305278235788680, 0.932287193454337300, 0.932269106342167860, 0.932251016899325770, 0.932232925125856090, 0.932214831021804020, 0.932196734587214970, +0.932178635822133780, 0.932160534726606200, 0.932142431300677420, 0.932124325544392510, 0.932106217457796760, 0.932088107040935480, 0.932069994293853840, 0.932051879216597050, +0.932033761809210830, 0.932015642071740150, 0.931997520004230420, 0.931979395606726930, 0.931961268879274880, 0.931943139821919670, 0.931925008434706600, 0.931906874717680740, +0.931888738670887950, 0.931870600294373410, 0.931852459588182300, 0.931834316552360040, 0.931816171186952040, 0.931798023492003580, 0.931779873467559640, 0.931761721113666510, +0.931743566430368930, 0.931725409417712540, 0.931707250075742620, 0.931689088404504480, 0.931670924404043750, 0.931652758074405620, 0.931634589415635260, 0.931616418427778760, +0.931598245110881300, 0.931580069464988170, 0.931561891490144900, 0.931543711186396780, 0.931525528553789560, 0.931507343592368420, 0.931489156302178540, 0.931470966683266230, +0.931452774735676340, 0.931434580459454710, 0.931416383854646420, 0.931398184921297330, 0.931379983659452740, 0.931361780069157820, 0.931343574150458870, 0.931325365903400870, +0.931307155328029550, 0.931288942424390310, 0.931270727192528680, 0.931252509632490290, 0.931234289744320540, 0.931216067528064850, 0.931197842983769180, 0.931179616111479040, +0.931161386911239840, 0.931143155383097110, 0.931124921527096470, 0.931106685343283560, 0.931088446831704000, 0.931070205992402980, 0.931051962825426680, 0.931033717330820520, +0.931015469508630120, 0.930997219358901010, 0.930978966881678920, 0.930960712077009260, 0.930942454944937660, 0.930924195485510090, 0.930905933698772170, 0.930887669584769320, +0.930869403143547380, 0.930851134375151880, 0.930832863279628550, 0.930814589857023030, 0.930796314107380730, 0.930778036030748050, 0.930759755627170170, 0.930741472896692960, +0.930723187839362030, 0.930704900455223140, 0.930686610744322020, 0.930668318706704080, 0.930650024342415620, 0.930631727651502150, 0.930613428634009310, 0.930595127289982840, +0.930576823619468700, 0.930558517622512400, 0.930540209299159820, 0.930521898649456450, 0.930503585673448600, 0.930485270371181780, 0.930466952742701860, 0.930448632788054450, +0.930430310507285530, 0.930411985900440830, 0.930393658967566100, 0.930375329708706960, 0.930356998123909820, 0.930338664213220200, 0.930320327976683850, 0.930301989414346720, +0.930283648526254670, 0.930265305312453440, 0.930246959772988660, 0.930228611907906730, 0.930210261717253300, 0.930191909201074310, 0.930173554359415400, 0.930155197192322760, +0.930136837699842010, 0.930118475882019120, 0.930100111738899840, 0.930081745270530560, 0.930063376476956920, 0.930045005358224870, 0.930026631914380290, 0.930008256145469110, +0.929989878051537320, 0.929971497632630760, 0.929953114888795170, 0.929934729820077190, 0.929916342426522320, 0.929897952708176660, 0.929879560665086040, 0.929861166297296540, +0.929842769604854120, 0.929824370587804430, 0.929805969246194190, 0.929787565580069030, 0.929769159589474930, 0.929750751274457940, 0.929732340635064050, 0.929713927671339310, +0.929695512383329810, 0.929677094771081070, 0.929658674834640040, 0.929640252574052250, 0.929621827989363880, 0.929603401080621010, 0.929584971847869480, 0.929566540291155600, +0.929548106410525100, 0.929529670206024620, 0.929511231677699890, 0.929492790825597210, 0.929474347649762440, 0.929455902150241870, 0.929437454327081470, 0.929419004180327520, +0.929400551710025670, 0.929382096916222870, 0.929363639798964750, 0.929345180358297500, 0.929326718594267300, 0.929308254506920340, 0.929289788096302800, 0.929271319362460660, +0.929252848305439970, 0.929234374925287490, 0.929215899222049170, 0.929197421195770980, 0.929178940846499210, 0.929160458174280170, 0.929141973179159920, 0.929123485861184430, +0.929104996220400550, 0.929086504256854240, 0.929068009970591580, 0.929049513361658970, 0.929031014430102610, 0.929012513175968560, 0.928994009599303340, 0.928975503700152800, +0.928956995478563700, 0.928938484934582200, 0.928919972068254500, 0.928901456879626890, 0.928882939368745550, 0.928864419535656900, 0.928845897380407240, 0.928827372903042510, +0.928808846103609590, 0.928790316982154640, 0.928771785538723860, 0.928753251773363650, 0.928734715686120320, 0.928716177277040140, 0.928697636546169210, 0.928679093493554490, +0.928660548119242040, 0.928642000423278270, 0.928623450405709480, 0.928604898066582090, 0.928586343405942480, 0.928567786423836970, 0.928549227120311630, 0.928530665495413520, +0.928512101549188840, 0.928493535281683880, 0.928474966692945050, 0.928456395783018860, 0.928437822551951620, 0.928419246999789500, 0.928400669126579590, 0.928382088932368070, +0.928363506417201330, 0.928344921581125800, 0.928326334424187880, 0.928307744946434200, 0.928289153147911160, 0.928270559028664950, 0.928251962588742650, 0.928233363828190440, +0.928214762747054720, 0.928196159345382240, 0.928177553623219300, 0.928158945580612400, 0.928140335217608300, 0.928121722534252850, 0.928103107530593550, 0.928084490206676490, +0.928065870562548190, 0.928047248598255160, 0.928028624313844030, 0.928009997709361320, 0.927991368784853330, 0.927972737540367240, 0.927954103975949240, 0.927935468091646070, +0.927916829887504240, 0.927898189363570270, 0.927879546519890800, 0.927860901356512560, 0.927842253873481740, 0.927823604070845520, 0.927804951948650310, 0.927786297506942750, +0.927767640745769450, 0.927748981665177050, 0.927730320265212180, 0.927711656545921250, 0.927692990507351430, 0.927674322149549150, 0.927655651472561020, 0.927636978476433890, +0.927618303161214190, 0.927599625526948750, 0.927580945573684310, 0.927562263301467180, 0.927543578710344650, 0.927524891800363240, 0.927506202571569570, 0.927487511024010390, +0.927468817157732440, 0.927450120972782450, 0.927431422469207070, 0.927412721647052910, 0.927394018506367270, 0.927375313047196560, 0.927356605269587630, 0.927337895173587110, +0.927319182759241860, 0.927300468026598600, 0.927281750975703980, 0.927263031606605170, 0.927244309919348920, 0.927225585913981850, 0.927206859590550710, 0.927188130949102570, +0.927169399989684060, 0.927150666712342030, 0.927131931117123000, 0.927113193204074370, 0.927094452973242890, 0.927075710424675290, 0.927056965558418320, 0.927038218374519050, +0.927019468873024110, 0.927000717053980570, 0.926981962917434950, 0.926963206463434660, 0.926944447692026440, 0.926925686603257030, 0.926906923197173490, 0.926888157473822580, +0.926869389433251260, 0.926850619075506140, 0.926831846400634870, 0.926813071408683960, 0.926794294099700270, 0.926775514473730970, 0.926756732530822800, 0.926737948271022850, +0.926719161694378070, 0.926700372800934980, 0.926681581590741320, 0.926662788063843720, 0.926643992220289150, 0.926625194060124560, 0.926606393583397030, 0.926587590790153400, +0.926568785680440540, 0.926549978254306070, 0.926531168511796730, 0.926512356452959370, 0.926493542077841070, 0.926474725386489010, 0.926455906378950140, 0.926437085055271450, +0.926418261415499770, 0.926399435459682730, 0.926380607187867080, 0.926361776600100000, 0.926342943696428330, 0.926324108476899390, 0.926305270941560230, 0.926286431090457830, +0.926267588923639030, 0.926248744441151570, 0.926229897643042310, 0.926211048529358320, 0.926192197100146660, 0.926173343355454430, 0.926154487295328900, 0.926135628919816930, +0.926116768228966050, 0.926097905222823310, 0.926079039901435920, 0.926060172264850820, 0.926041302313115320, 0.926022430046276490, 0.926003555464381730, 0.925984678567477680, +0.925965799355612180, 0.925946917828832320, 0.925928033987185040, 0.925909147830717760, 0.925890259359477550, 0.925871368573511820, 0.925852475472867530, 0.925833580057591750, +0.925814682327732340, 0.925795782283336250, 0.925776879924450790, 0.925757975251123020, 0.925739068263400360, 0.925720158961329980, 0.925701247344958960, 0.925682333414335030, +0.925663417169505400, 0.925644498610517120, 0.925625577737417600, 0.925606654550254260, 0.925587729049074160, 0.925568801233924820, 0.925549871104853090, 0.925530938661907050, +0.925512003905133550, 0.925493066834580210, 0.925474127450294120, 0.925455185752322660, 0.925436241740713370, 0.925417295415512990, 0.925398346776769800, 0.925379395824530770, +0.925360442558843200, 0.925341486979754490, 0.925322529087312050, 0.925303568881563400, 0.925284606362555720, 0.925265641530336300, 0.925246674384953010, 0.925227704926453120, +0.925208733154883830, 0.925189759070292880, 0.925170782672727450, 0.925151803962235060, 0.925132822938863120, 0.925113839602658920, 0.925094853953670300, 0.925075865991944580, +0.925056875717529260, 0.925037883130471750, 0.925018888230819460, 0.924999891018620010, 0.924980891493920490, 0.924961889656769070, 0.924942885507212930, 0.924923879045299600, +0.924904870271076600, 0.924885859184591320, 0.924866845785891400, 0.924847830075024470, 0.924828812052037600, 0.924809791716978970, 0.924790769069895880, 0.924771744110835850, +0.924752716839846500, 0.924733687256975360, 0.924714655362270040, 0.924695621155777970, 0.924676584637546650, 0.924657545807624160, 0.924638504666057680, 0.924619461212895070, +0.924600415448183830, 0.924581367371971500, 0.924562316984305690, 0.924543264285233810, 0.924524209274804170, 0.924505151953063930, 0.924486092320060850, 0.924467030375842440, +0.924447966120456540, 0.924428899553950690, 0.924409830676372610, 0.924390759487769720, 0.924371685988190080, 0.924352610177681330, 0.924333532056291100, 0.924314451624067000, +0.924295368881056680, 0.924276283827308090, 0.924257196462868300, 0.924238106787785950, 0.924219014802108330, 0.924199920505883180, 0.924180823899158230, 0.924161724981981240, +0.924142623754399820, 0.924123520216461940, 0.924104414368214890, 0.924085306209707190, 0.924066195740986140, 0.924047082962099700, 0.924027967873095490, 0.924008850474021370, +0.923989730764925080, 0.923970608745854570, 0.923951484416857150, 0.923932357777981330, 0.923913228829274620, 0.923894097570784890, 0.923874964002559860, 0.923855828124647390, +0.923836689937095450, 0.923817549439951420, 0.923798406633263850, 0.923779261517080230, 0.923760114091448430, 0.923740964356416390, 0.923721812312031990, 0.923702657958342940, +0.923683501295397340, 0.923664342323242680, 0.923645181041927390, 0.923626017451499190, 0.923606851552005950, 0.923587683343495610, 0.923568512826016040, 0.923549339999615190, +0.923530164864341030, 0.923510987420241070, 0.923491807667364050, 0.923472625605757380, 0.923453441235469240, 0.923434254556547480, 0.923415065569040070, 0.923395874272995080, +0.923376680668460010, 0.923357484755483520, 0.923338286534113320, 0.923319086004397490, 0.923299883166383890, 0.923280678020120590, 0.923261470565655660, 0.923242260803036950, +0.923223048732312310, 0.923203834353530370, 0.923184617666738870, 0.923165398671985770, 0.923146177369319140, 0.923126953758787170, 0.923107727840437820, 0.923088499614318710, +0.923069269080478820, 0.923050036238965640, 0.923030801089827490, 0.923011563633112210, 0.922992323868868090, 0.922973081797143100, 0.922953837417985530, 0.922934590731442910, +0.922915341737564180, 0.922896090436397200, 0.922876836827989820, 0.922857580912390450, 0.922838322689647160, 0.922819062159808020, 0.922799799322921220, 0.922780534179034610, +0.922761266728196920, 0.922741996970456110, 0.922722724905860380, 0.922703450534457680, 0.922684173856296530, 0.922664894871424890, 0.922645613579890610, 0.922626329981742650, +0.922607044077028870, 0.922587755865797550, 0.922568465348096780, 0.922549172523974840, 0.922529877393480020, 0.922510579956660530, 0.922491280213564190, 0.922471978164239980, +0.922452673808735860, 0.922433367147100000, 0.922414058179380820, 0.922394746905626390, 0.922375433325885120, 0.922356117440204960, 0.922336799248634880, 0.922317478751222720, +0.922298155948016900, 0.922278830839065700, 0.922259503424417430, 0.922240173704120370, 0.922220841678222940, 0.922201507346772980, 0.922182170709819670, 0.922162831767410870, +0.922143490519594990, 0.922124146966420420, 0.922104801107935470, 0.922085452944188530, 0.922066102475227910, 0.922046749701101790, 0.922027394621859120, 0.922008037237547870, +0.921988677548216560, 0.921969315553913590, 0.921949951254687370, 0.921930584650586190, 0.921911215741658240, 0.921891844527952590, 0.921872471009517300, 0.921853095186400910, +0.921833717058651690, 0.921814336626318290, 0.921794953889448990, 0.921775568848092200, 0.921756181502296320, 0.921736791852110220, 0.921717399897582170, 0.921698005638760700, +0.921678609075694100, 0.921659210208431000, 0.921639809037019920, 0.921620405561509260, 0.921600999781947320, 0.921581591698383160, 0.921562181310865090, 0.921542768619441510, +0.921523353624160930, 0.921503936325072100, 0.921484516722223420, 0.921465094815663080, 0.921445670605440250, 0.921426244091603340, 0.921406815274200870, 0.921387384153281250, +0.921367950728893210, 0.921348515001085390, 0.921329076969906180, 0.921309636635403880, 0.921290193997627900, 0.921270749056626540, 0.921251301812448190, 0.921231852265141590, +0.921212400414755380, 0.921192946261338190, 0.921173489804938180, 0.921154031045604890, 0.921134569983386500, 0.921115106618331740, 0.921095640950489130, 0.921076172979907510, +0.921056702706635420, 0.921037230130721470, 0.921017755252214300, 0.920998278071162970, 0.920978798587615890, 0.920959316801621910, 0.920939832713229540, 0.920920346322487650, +0.920900857629444960, 0.920881366634150100, 0.920861873336651370, 0.920842377736998400, 0.920822879835239470, 0.920803379631423340, 0.920783877125598730, 0.920764372317814490, +0.920744865208119270, 0.920725355796561560, 0.920705844083190780, 0.920686330068055340, 0.920666813751204180, 0.920647295132685950, 0.920627774212549490, 0.920608250990843540, +0.920588725467617050, 0.920569197642918340, 0.920549667516797010, 0.920530135089301590, 0.920510600360480710, 0.920491063330383330, 0.920471523999058410, 0.920451982366554570, +0.920432438432920770, 0.920412892198205550, 0.920393343662458510, 0.920373792825728070, 0.920354239688063070, 0.920334684249512590, 0.920315126510125370, 0.920295566469950250, +0.920276004129035980, 0.920256439487431970, 0.920236872545186930, 0.920217303302349630, 0.920197731758969130, 0.920178157915094270, 0.920158581770774030, 0.920139003326057360, +0.920119422580992770, 0.920099839535630020, 0.920080254190017710, 0.920060666544204710, 0.920041076598240080, 0.920021484352172680, 0.920001889806051580, 0.919982292959925510, +0.919962693813843990, 0.919943092367855760, 0.919923488622009790, 0.919903882576355030, 0.919884274230940660, 0.919864663585815530, 0.919845050641028840, 0.919825435396629090, +0.919805817852666130, 0.919786198009188590, 0.919766575866245550, 0.919746951423886180, 0.919727324682159340, 0.919707695641114210, 0.919688064300799860, 0.919668430661264910, +0.919648794722559340, 0.919629156484731760, 0.919609515947831250, 0.919589873111906990, 0.919570227977008050, 0.919550580543183500, 0.919530930810482210, 0.919511278778953890, +0.919491624448647400, 0.919471967819611820, 0.919452308891896330, 0.919432647665550110, 0.919412984140622220, 0.919393318317161980, 0.919373650195218000, 0.919353979774840240, +0.919334307056077550, 0.919314632038979010, 0.919294954723594020, 0.919275275109971530, 0.919255593198160970, 0.919235908988211390, 0.919216222480171650, 0.919196533674091710, +0.919176842570020410, 0.919157149168007060, 0.919137453468100830, 0.919117755470350910, 0.919098055174806690, 0.919078352581516930, 0.919058647690531690, 0.919038940501899710, +0.919019231015670510, 0.918999519231893160, 0.918979805150617060, 0.918960088771891390, 0.918940370095765570, 0.918920649122288440, 0.918900925851510060, 0.918881200283479300, +0.918861472418245560, 0.918841742255858240, 0.918822009796366410, 0.918802275039819700, 0.918782537986266860, 0.918762798635758050, 0.918743056988342240, 0.918723313044068730, +0.918703566802987040, 0.918683818265146450, 0.918664067430596250, 0.918644314299385870, 0.918624558871564360, 0.918604801147181790, 0.918585041126287250, 0.918565278808930130, +0.918545514195159730, 0.918525747285025670, 0.918505978078577150, 0.918486206575863660, 0.918466432776934400, 0.918446656681839340, 0.918426878290627640, 0.918407097603348820, +0.918387314620052190, 0.918367529340787250, 0.918347741765603520, 0.918327951894550080, 0.918308159727677100, 0.918288365265033770, 0.918268568506669490, 0.918248769452633780, +0.918228968102976160, 0.918209164457746140, 0.918189358516993240, 0.918169550280766520, 0.918149739749116290, 0.918129926922091720, 0.918110111799742330, 0.918090294382117640, +0.918070474669267280, 0.918050652661240750, 0.918030828358087470, 0.918011001759856840, 0.917991172866599040, 0.917971341678363360, 0.917951508195199220, 0.917931672417156450, +0.917911834344284360, 0.917891993976632790, 0.917872151314250820, 0.917852306357188840, 0.917832459105496160, 0.917812609559222280, 0.917792757718416840, 0.917772903583129570, +0.917753047153410000, 0.917733188429307840, 0.917713327410872300, 0.917693464098153780, 0.917673598491201670, 0.917653730590065610, 0.917633860394795110, 0.917613987905440020, +0.917594113122049970, 0.917574236044674250, 0.917554356673363270, 0.917534475008166430, 0.917514591049133470, 0.917494704796314010, 0.917474816249757690, 0.917454925409514340, +0.917435032275633830, 0.917415136848165220, 0.917395239127159260, 0.917375339112665110, 0.917355436804732640, 0.917335532203411570, 0.917315625308751660, 0.917295716120802630, +0.917275804639614440, 0.917255890865236290, 0.917235974797718790, 0.917216056437111350, 0.917196135783463820, 0.917176212836825930, 0.917156287597247430, 0.917136360064778280, +0.917116430239467870, 0.917096498121366730, 0.917076563710524370, 0.917056627006990640, 0.917036688010815280, 0.917016746722048250, 0.916996803140739280, 0.916976857266938340, +0.916956909100694830, 0.916936958642059490, 0.916917005891081720, 0.916897050847811480, 0.916877093512298620, 0.916857133884593000, 0.916837171964744460, 0.916817207752802730, +0.916797241248818340, 0.916777272452840800, 0.916757301364920170, 0.916737327985106210, 0.916717352313448970, 0.916697374349998320, 0.916677394094804200, 0.916657411547916250, +0.916637426709385190, 0.916617439579260450, 0.916597450157592200, 0.916577458444430390, 0.916557464439824780, 0.916537468143825640, 0.916517469556482720, 0.916497468677845870, +0.916477465507965720, 0.916457460046891770, 0.916437452294674330, 0.916417442251363120, 0.916397429917008340, 0.916377415291660060, 0.916357398375367780, 0.916337379168182480, +0.916317357670153650, 0.916297333881331390, 0.916277307801765860, 0.916257279431507140, 0.916237248770605080, 0.916217215819109980, 0.916197180577071450, 0.916177143044540340, +0.916157103221566290, 0.916137061108199590, 0.916117016704490190, 0.916096970010488290, 0.916076921026243940, 0.916056869751807330, 0.916036816187228100, 0.916016760332557300, +0.915996702187844460, 0.915976641753139980, 0.915956579028493810, 0.915936514013956260, 0.915916446709577390, 0.915896377115407060, 0.915876305231496210, 0.915856231057894490, +0.915836154594652290, 0.915816075841819570, 0.915795994799446730, 0.915775911467583970, 0.915755825846281350, 0.915735737935588820, 0.915715647735557360, 0.915695555246236690, +0.915675460467677230, 0.915655363399929030, 0.915635264043042520, 0.915615162397067750, 0.915595058462054800, 0.915574952238054520, 0.915554843725116860, 0.915534732923292020, +0.915514619832630490, 0.915494504453182260, 0.915474386784997930, 0.915454266828127470, 0.915434144582621070, 0.915414020048529680, 0.915393893225903250, 0.915373764114792100, +0.915353632715246500, 0.915333499027316750, 0.915313363051053370, 0.915293224786506540, 0.915273084233726330, 0.915252941392763700, 0.915232796263668710, 0.915212648846491780, +0.915192499141283200, 0.915172347148093370, 0.915152192866972690, 0.915132036297971240, 0.915111877441139980, 0.915091716296528970, 0.915071552864188730, 0.915051387144169670, +0.915031219136522080, 0.915011048841296470, 0.914990876258543140, 0.914970701388312380, 0.914950524230655150, 0.914930344785621630, 0.914910163053262340, 0.914889979033627570, +0.914869792726767830, 0.914849604132733530, 0.914829413251575410, 0.914809220083343200, 0.914789024628088420, 0.914768826885861140, 0.914748626856711660, 0.914728424540690700, +0.914708219937848680, 0.914688013048235990, 0.914667803871903050, 0.914647592408900920, 0.914627378659279790, 0.914607162623090160, 0.914586944300382680, 0.914566723691207840, +0.914546500795616170, 0.914526275613658290, 0.914506048145384390, 0.914485818390845640, 0.914465586350092450, 0.914445352023175230, 0.914425115410144600, 0.914404876511051180, +0.914384635325945610, 0.914364391854878170, 0.914344146097899930, 0.914323898055061420, 0.914303647726413260, 0.914283395112005850, 0.914263140211890040, 0.914242883026116230, +0.914222623554735380, 0.914202361797797570, 0.914182097755354190, 0.914161831427455550, 0.914141562814152380, 0.914121291915495180, 0.914101018731534930, 0.914080743262322030, +0.914060465507907200, 0.914040185468340980, 0.914019903143674650, 0.913999618533958500, 0.913979331639243390, 0.913959042459579820, 0.913938750995018760, 0.913918457245610720, +0.913898161211406320, 0.913877862892456760, 0.913857562288812540, 0.913837259400524520, 0.913816954227643200, 0.913796646770219660, 0.913776337028304410, 0.913756025001948300, +0.913735710691201850, 0.913715394096116350, 0.913695075216742540, 0.913674754053130920, 0.913654430605332470, 0.913634104873397910, 0.913613776857378100, 0.913593446557323770, +0.913573113973285560, 0.913552779105314960, 0.913532441953462280, 0.913512102517778590, 0.913491760798314620, 0.913471416795121230, 0.913451070508249360, 0.913430721937749430, +0.913410371083673070, 0.913390017946070780, 0.913369662524993410, 0.913349304820491930, 0.913328944832617060, 0.913308582561420000, 0.913288218006951370, 0.913267851169261900, +0.913247482048403110, 0.913227110644425630, 0.913206736957380420, 0.913186360987318310, 0.913165982734290280, 0.913145602198347390, 0.913125219379540050, 0.913104834277920110, +0.913084446893537960, 0.913064057226444790, 0.913043665276691450, 0.913023271044328900, 0.913002874529408310, 0.912982475731980440, 0.912962074652096000, 0.912941671289806740, +0.912921265645163290, 0.912900857718216720, 0.912880447509017980, 0.912860035017618140, 0.912839620244068170, 0.912819203188419250, 0.912798783850721880, 0.912778362231027930, +0.912757938329388120, 0.912737512145853410, 0.912717083680474880, 0.912696652933303710, 0.912676219904390850, 0.912655784593787160, 0.912635347001544360, 0.912614907127713090, +0.912594464972344640, 0.912574020535489970, 0.912553573817200370, 0.912533124817526690, 0.912512673536520320, 0.912492219974231800, 0.912471764130713180, 0.912451306006015090, +0.912430845600188830, 0.912410382913285360, 0.912389917945355950, 0.912369450696451700, 0.912348981166623880, 0.912328509355923250, 0.912308035264401740, 0.912287558892110110, +0.912267080239099530, 0.912246599305421290, 0.912226116091126580, 0.912205630596266580, 0.912185142820892140, 0.912164652765055210, 0.912144160428806640, 0.912123665812197610, +0.912103168915279430, 0.912082669738103370, 0.912062168280720620, 0.912041664543182470, 0.912021158525539780, 0.912000650227844600, 0.911980139650147680, 0.911959626792500530, +0.911939111654954230, 0.911918594237560280, 0.911898074540369750, 0.911877552563433610, 0.911857028306804040, 0.911836501770531880, 0.911815972954668430, 0.911795441859265090, +0.911774908484373150, 0.911754372830043900, 0.911733834896328750, 0.911713294683278660, 0.911692752190945700, 0.911672207419380820, 0.911651660368635430, 0.911631111038760930, +0.911610559429808620, 0.911590005541829900, 0.911569449374876270, 0.911548890928998490, 0.911528330204248950, 0.911507767200678610, 0.911487201918338760, 0.911466634357280920, +0.911446064517556500, 0.911425492399217000, 0.911404918002313380, 0.911384341326897720, 0.911363762373021300, 0.911343181140735430, 0.911322597630091710, 0.911302011841141350, +0.911281423773936060, 0.911260833428527260, 0.911240240804965910, 0.911219645903304290, 0.911199048723593700, 0.911178449265885320, 0.911157847530230990, 0.911137243516681910, +0.911116637225289790, 0.911096028656106060, 0.911075417809181890, 0.911054804684569450, 0.911034189282320160, 0.911013571602485310, 0.910992951645116510, 0.910972329410265400, +0.910951704897983380, 0.910931078108321860, 0.910910449041332890, 0.910889817697067890, 0.910869184075578260, 0.910848548176915740, 0.910827910001131840, 0.910807269548278060, +0.910786626818406280, 0.910765981811567430, 0.910745334527814030, 0.910724684967197380, 0.910704033129768890, 0.910683379015580390, 0.910662722624683400, 0.910642063957129650, +0.910621403012970340, 0.910600739792257970, 0.910580074295043620, 0.910559406521379120, 0.910538736471316220, 0.910518064144906330, 0.910497389542201390, 0.910476712663252920, +0.910456033508112330, 0.910435352076832020, 0.910414668369463280, 0.910393982386057840, 0.910373294126667560, 0.910352603591343960, 0.910331910780138860, 0.910311215693104030, +0.910290518330290840, 0.910269818691751610, 0.910249116777537840, 0.910228412587701370, 0.910207706122293850, 0.910186997381366990, 0.910166286364972650, 0.910145573073162240, +0.910124857505988370, 0.910104139663502230, 0.910083419545755780, 0.910062697152800750, 0.910041972484688990, 0.910021245541472350, 0.910000516323202560, 0.909979784829931140, +0.909959051061710600, 0.909938315018592460, 0.909917576700628450, 0.909896836107870530, 0.909876093240370660, 0.909855348098180360, 0.909834600681351470, 0.909813850989936390, +0.909793099023986640, 0.909772344783554180, 0.909751588268690850, 0.909730829479448610, 0.909710068415879200, 0.909689305078034690, 0.909668539465966490, 0.909647771579727320, +0.909627001419368810, 0.909606228984942700, 0.909585454276501060, 0.909564677294095740, 0.909543898037778800, 0.909523116507602090, 0.909502332703617130, 0.909481546625876880, +0.909460758274432620, 0.909439967649336540, 0.909419174750640490, 0.909398379578396530, 0.909377582132656630, 0.909356782413472400, 0.909335980420896580, 0.909315176154980810, +0.909294369615777140, 0.909273560803337430, 0.909252749717713860, 0.909231936358958490, 0.909211120727123290, 0.909190302822259880, 0.909169482644420990, 0.909148660193658480, +0.909127835470024290, 0.909107008473570620, 0.909086179204349310, 0.909065347662412650, 0.909044513847812490, 0.909023677760600780, 0.909002839400830150, 0.908981998768552570, +0.908961155863819870, 0.908940310686684350, 0.908919463237197970, 0.908898613515413010, 0.908877761521381110, 0.908856907255155220, 0.908836050716786970, 0.908815191906328760, +0.908794330823832430, 0.908773467469350280, 0.908752601842934490, 0.908731733944637240, 0.908710863774510160, 0.908689991332606420, 0.908669116618977650, 0.908648239633676140, +0.908627360376753960, 0.908606478848263400, 0.908585595048256640, 0.908564708976785540, 0.908543820633903040, 0.908522930019661000, 0.908502037134111600, 0.908481141977307120, +0.908460244549299740, 0.908439344850141770, 0.908418442879885490, 0.908397538638582750, 0.908376632126286500, 0.908355723343048590, 0.908334812288921540, 0.908313898963957310, +0.908292983368208410, 0.908272065501727010, 0.908251145364565420, 0.908230222956775690, 0.908209298278410680, 0.908188371329522460, 0.908167442110163430, 0.908146510620385650, +0.908125576860241650, 0.908104640829783700, 0.908083702529063790, 0.908062761958134960, 0.908041819117049180, 0.908020874005858960, 0.907999926624616480, 0.907978976973374150, +0.907958025052184480, 0.907937070861099760, 0.907916114400171840, 0.907895155669454110, 0.907874194668998550, 0.907853231398857430, 0.907832265859083280, 0.907811298049728380, +0.907790327970845250, 0.907769355622486400, 0.907748381004703670, 0.907727404117550370, 0.907706424961078670, 0.907685443535340860, 0.907664459840389350, 0.907643473876276750, +0.907622485643055590, 0.907601495140777700, 0.907580502369496500, 0.907559507329263940, 0.907538510020132750, 0.907517510442155230, 0.907496508595383890, 0.907475504479871350, +0.907454498095670030, 0.907433489442832090, 0.907412478521410830, 0.907391465331458310, 0.907370449873027170, 0.907349432146169810, 0.907328412150938960, 0.907307389887387130, +0.907286365355566390, 0.907265338555530150, 0.907244309487330480, 0.907223278151020110, 0.907202244546651440, 0.907181208674277320, 0.907160170533950040, 0.907139130125722450, +0.907118087449646620, 0.907097042505775830, 0.907075995294162610, 0.907054945814859350, 0.907033894067918680, 0.907012840053393220, 0.906991783771335820, 0.906970725221798890, +0.906949664404834710, 0.906928601320496800, 0.906907535968837440, 0.906886468349909160, 0.906865398463764680, 0.906844326310456750, 0.906823251890038100, 0.906802175202560790, +0.906781096248078460, 0.906760015026643500, 0.906738931538308420, 0.906717845783125980, 0.906696757761149000, 0.906675667472430000, 0.906654574917021950, 0.906633480094977020, +0.906612383006348830, 0.906591283651189680, 0.906570182029552310, 0.906549078141489440, 0.906527971987053930, 0.906506863566298390, 0.906485752879275800, 0.906464639926038430, +0.906443524706639800, 0.906422407221132430, 0.906401287469568940, 0.906380165452002280, 0.906359041168485200, 0.906337914619070540, 0.906316785803810700, 0.906295654722759300, +0.906274521375968760, 0.906253385763491900, 0.906232247885381590, 0.906211107741690670, 0.906189965332471870, 0.906168820657778260, 0.906147673717662250, 0.906126524512177340, +0.906105373041376170, 0.906084219305311580, 0.906063063304036410, 0.906041905037603620, 0.906020744506066070, 0.905999581709476250, 0.905978416647887920, 0.905957249321353460, +0.905936079729925960, 0.905914907873658140, 0.905893733752603180, 0.905872557366813820, 0.905851378716343030, 0.905830197801243520, 0.905809014621568820, 0.905787829177371550, +0.905766641468704780, 0.905745451495621360, 0.905724259258174350, 0.905703064756416710, 0.905681867990401400, 0.905660668960181050, 0.905639467665809380, 0.905618264107339030, +0.905597058284822950, 0.905575850198314320, 0.905554639847866110, 0.905533427233531140, 0.905512212355362390, 0.905490995213413360, 0.905469775807736910, 0.905448554138386100, +0.905427330205413770, 0.905406104008873220, 0.905384875548817300, 0.905363644825299300, 0.905342411838371720, 0.905321176588088530, 0.905299939074502350, 0.905278699297666360, +0.905257457257633620, 0.905236212954457330, 0.905214966388190430, 0.905193717558886110, 0.905172466466597100, 0.905151213111377250, 0.905129957493279510, 0.905108699612356740, +0.905087439468662320, 0.905066177062249230, 0.905044912393170750, 0.905023645461479620, 0.905002376267229680, 0.904981104810473890, 0.904959831091265320, 0.904938555109657150, +0.904917276865702560, 0.904895996359454840, 0.904874713590967160, 0.904853428560292270, 0.904832141267484120, 0.904810851712595680, 0.904789559895680110, 0.904768265816790600, +0.904746969475980540, 0.904725670873302910, 0.904704370008810880, 0.904683066882558170, 0.904661761494597870, 0.904640453844983150, 0.904619143933767190, 0.904597831761003500, +0.904576517326745270, 0.904555200631045660, 0.904533881673957650, 0.904512560455535300, 0.904491236975831670, 0.904469911234899840, 0.904448583232793310, 0.904427252969565280, +0.904405920445269130, 0.904384585659958160, 0.904363248613685330, 0.904341909306504820, 0.904320567738469470, 0.904299223909632690, 0.904277877820047980, 0.904256529469768420, +0.904235178858847630, 0.904213825987338460, 0.904192470855295190, 0.904171113462770680, 0.904149753809818320, 0.904128391896491750, 0.904107027722844010, 0.904085661288928870, +0.904064292594799480, 0.904042921640509030, 0.904021548426111600, 0.904000172951660350, 0.903978795217208590, 0.903957415222809920, 0.903936032968517660, 0.903914648454385410, +0.903893261680466020, 0.903871872646814010, 0.903850481353482230, 0.903829087800524180, 0.903807691987993490, 0.903786293915943670, 0.903764893584427910, 0.903743490993500040, +0.903722086143213030, 0.903700679033621280, 0.903679269664777740, 0.903657858036736040, 0.903636444149549690, 0.903615028003272200, 0.903593609597957200, 0.903572188933658090, +0.903550766010428270, 0.903529340828321810, 0.903507913387392000, 0.903486483687692470, 0.903465051729276710, 0.903443617512198260, 0.903422181036510840, 0.903400742302267520, +0.903379301309522820, 0.903357858058329800, 0.903336412548742080, 0.903314964780813410, 0.903293514754597290, 0.903272062470147460, 0.903250607927517430, 0.903229151126760500, +0.903207692067931060, 0.903186230751082400, 0.903164767176268150, 0.903143301343541930, 0.903121833252957580, 0.903100362904568520, 0.903078890298428690, 0.903057415434591170, +0.903035938313110460, 0.903014458934039980, 0.902992977297433330, 0.902971493403344150, 0.902950007251826390, 0.902928518842933460, 0.902907028176718970, 0.902885535253237230, +0.902864040072541730, 0.902842542634686000, 0.902821042939723980, 0.902799540987709430, 0.902778036778695950, 0.902756530312737390, 0.902735021589887170, 0.902713510610199670, +0.902691997373728410, 0.902670481880527230, 0.902648964130649880, 0.902627444124149970, 0.902605921861081570, 0.902584397341497980, 0.902562870565453700, 0.902541341533002360, +0.902519810244197580, 0.902498276699093220, 0.902476740897743320, 0.902455202840201420, 0.902433662526521680, 0.902412119956757300, 0.902390575130962990, 0.902369028049192280, +0.902347478711498900, 0.902325927117936910, 0.902304373268560170, 0.902282817163422400, 0.902261258802577570, 0.902239698186079300, 0.902218135313982090, 0.902196570186339590, +0.902175002803205620, 0.902153433164634260, 0.902131861270679240, 0.902110287121394520, 0.902088710716833720, 0.902067132057051580, 0.902045551142101500, 0.902023967972037650, +0.902002382546913890, 0.901980794866784060, 0.901959204931702340, 0.901937612741722570, 0.901916018296898380, 0.901894421597284610, 0.901872822642934670, 0.901851221433902730, +0.901829617970242750, 0.901808012252008680, 0.901786404279254720, 0.901764794052034580, 0.901743181570402120, 0.901721566834412070, 0.901699949844118160, 0.901678330599574360, +0.901656709100834730, 0.901635085347953340, 0.901613459340984250, 0.901591831079981090, 0.901570200564998700, 0.901548567796090830, 0.901526932773311640, 0.901505295496714990, +0.901483655966355160, 0.901462014182286220, 0.901440370144562130, 0.901418723853236850, 0.901397075308365100, 0.901375424510000630, 0.901353771458197730, 0.901332116153010230, +0.901310458594492550, 0.901288798782698740, 0.901267136717682440, 0.901245472399498810, 0.901223805828201390, 0.901202137003844550, 0.901180465926482270, 0.901158792596168820, +0.901137117012958510, 0.901115439176905290, 0.901093759088063220, 0.901072076746487040, 0.901050392152230710, 0.901028705305348290, 0.901007016205894180, 0.900985324853922580, +0.900963631249487640, 0.900941935392643670, 0.900920237283444390, 0.900898536921944880, 0.900876834308199090, 0.900855129442261200, 0.900833422324185510, 0.900811712954026290, +0.900790001331837730, 0.900768287457673790, 0.900746571331589530, 0.900724852953638800, 0.900703132323876000, 0.900681409442355310, 0.900659684309131130, 0.900637956924257740, +0.900616227287789450, 0.900594495399780200, 0.900572761260285180, 0.900551024869358120, 0.900529286227053640, 0.900507545333425810, 0.900485802188529250, 0.900464056792418140, +0.900442309145146780, 0.900420559246769340, 0.900398807097340990, 0.900377052696915480, 0.900355296045547430, 0.900333537143291010, 0.900311775990200850, 0.900290012586331230, +0.900268246931736240, 0.900246479026470920, 0.900224708870589470, 0.900202936464146290, 0.900181161807195650, 0.900159384899792190, 0.900137605741990310, 0.900115824333844290, +0.900094040675408440, 0.900072254766737800, 0.900050466607886570, 0.900028676198909140, 0.900006883539860030, 0.899985088630793740, 0.899963291471764680, 0.899941492062827030, +0.899919690404036080, 0.899897886495445780, 0.899876080337110860, 0.899854271929085740, 0.899832461271424910, 0.899810648364183010, 0.899788833207414320, 0.899767015801173350, +0.899745196145515070, 0.899723374240493870, 0.899701550086164260, 0.899679723682580760, 0.899657895029797980, 0.899636064127870340, 0.899614230976852670, 0.899592395576798930, +0.899570557927764750, 0.899548718029804070, 0.899526875882971530, 0.899505031487321860, 0.899483184842909680, 0.899461335949789500, 0.899439484808015500, 0.899417631417643300, +0.899395775778726980, 0.899373917891321150, 0.899352057755480660, 0.899330195371259910, 0.899308330738713750, 0.899286463857896680, 0.899264594728863110, 0.899242723351668440, +0.899220849726366960, 0.899198973853013390, 0.899177095731662380, 0.899155215362368640, 0.899133332745186810, 0.899111447880171610, 0.899089560767377560, 0.899067671406859840, +0.899045779798673060, 0.899023885942871750, 0.899001989839510740, 0.898980091488644770, 0.898958190890328580, 0.898936288044616450, 0.898914382951564120, 0.898892475611225760, +0.898870566023656110, 0.898848654188910250, 0.898826740107042670, 0.898804823778108220, 0.898782905202161640, 0.898760984379257550, 0.898739061309451250, 0.898717135992797460, +0.898695208429350690, 0.898673278619165910, 0.898651346562298060, 0.898629412258801660, 0.898607475708731450, 0.898585536912142930, 0.898563595869090630, 0.898541652579629260, +0.898519707043813790, 0.898497759261699060, 0.898475809233339920, 0.898453856958791210, 0.898431902438107550, 0.898409945671344470, 0.898387986658556460, 0.898366025399798600, +0.898344061895125610, 0.898322096144592570, 0.898300128148254220, 0.898278157906165500, 0.898256185418381040, 0.898234210684956460, 0.898212233705946490, 0.898190254481405770, +0.898168273011389570, 0.898146289295952530, 0.898124303335149920, 0.898102315129036040, 0.898080324677666850, 0.898058331981096750, 0.898036337039380910, 0.898014339852574170, +0.897992340420731620, 0.897970338743908190, 0.897948334822158970, 0.897926328655538450, 0.897904320244102610, 0.897882309587905820, 0.897860296687003400, 0.897838281541450180, +0.897816264151301220, 0.897794244516611610, 0.897772222637436060, 0.897750198513830310, 0.897728172145848990, 0.897706143533547270, 0.897684112676980340, 0.897662079576202920, +0.897640044231270420, 0.897618006642237790, 0.897595966809159760, 0.897573924732092190, 0.897551880411089800, 0.897529833846207770, 0.897507785037501060, 0.897485733985024960, +0.897463680688834530, 0.897441625148984850, 0.897419567365530750, 0.897397507338528080, 0.897375445068031690, 0.897353380554096640, 0.897331313796778220, 0.897309244796131390, +0.897287173552211550, 0.897265100065073320, 0.897243024334772770, 0.897220946361364740, 0.897198866144904180, 0.897176783685446620, 0.897154698983047010, 0.897132612037760620, +0.897110522849642770, 0.897088431418748170, 0.897066337745132890, 0.897044241828851780, 0.897022143669960140, 0.897000043268513010, 0.896977940624565930, 0.896955835738173830, +0.896933728609392240, 0.896911619238275890, 0.896889507624880960, 0.896867393769262170, 0.896845277671474930, 0.896823159331574530, 0.896801038749616140, 0.896778915925655280, +0.896756790859746690, 0.896734663551946420, 0.896712534002309550, 0.896690402210891470, 0.896668268177747250, 0.896646131902932410, 0.896623993386502230, 0.896601852628512000, +0.896579709629016790, 0.896557564388072770, 0.896535416905734790, 0.896513267182058260, 0.896491115217098570, 0.896468961010911000, 0.896446804563551190, 0.896424645875073870, +0.896402484945535320, 0.896380321774990610, 0.896358156363495140, 0.896335988711104200, 0.896313818817873310, 0.896291646683857860, 0.896269472309113360, 0.896247295693694660, +0.896225116837658260, 0.896202935741059030, 0.896180752403952340, 0.896158566826393940, 0.896136379008439010, 0.896114188950143160, 0.896091996651561810, 0.896069802112750110, +0.896047605333764370, 0.896025406314659540, 0.896003205055491140, 0.895981001556314770, 0.895958795817185960, 0.895936587838160100, 0.895914377619292380, 0.895892165160639190, +0.895869950462255480, 0.895847733524196890, 0.895825514346519030, 0.895803292929277410, 0.895781069272527430, 0.895758843376324940, 0.895736615240724790, 0.895714384865783590, +0.895692152251556410, 0.895669917398098870, 0.895647680305466600, 0.895625440973714990, 0.895603199402899900, 0.895580955593076710, 0.895558709544300720, 0.895536461256628450, +0.895514210730114950, 0.895491957964815950, 0.895469702960787100, 0.895447445718083990, 0.895425186236762260, 0.895402924516877090, 0.895380660558485090, 0.895358394361641330, +0.895336125926401660, 0.895313855252821700, 0.895291582340957070, 0.895269307190863510, 0.895247029802596740, 0.895224750176211840, 0.895202468311765640, 0.895180184209313110, +0.895157897868910200, 0.895135609290612530, 0.895113318474475840, 0.895091025420555850, 0.895068730128907860, 0.895046432599588600, 0.895024132832653140, 0.895001830828157320, +0.894979526586156980, 0.894957220106707750, 0.894934911389865580, 0.894912600435685990, 0.894890287244224590, 0.894867971815537900, 0.894845654149681200, 0.894823334246710460, +0.894801012106681390, 0.894778687729649750, 0.894756361115671360, 0.894734032264802080, 0.894711701177097310, 0.894689367852613660, 0.894667032291406650, 0.894644694493532010, +0.894622354459045700, 0.894600012188003450, 0.894577667680461210, 0.894555320936474390, 0.894532971956099710, 0.894510620739392470, 0.894488267286408840, 0.894465911597204450, +0.894443553671835260, 0.894421193510357200, 0.894398831112826250, 0.894376466479297690, 0.894354099609828480, 0.894331730504473900, 0.894309359163290130, 0.894286985586332910, +0.894264609773658180, 0.894242231725321910, 0.894219851441380160, 0.894197468921888340, 0.894175084166903170, 0.894152697176480380, 0.894130307950675830, 0.894107916489545460, +0.894085522793145350, 0.894063126861531440, 0.894040728694759370, 0.894018328292885740, 0.893995925655966420, 0.893973520784057230, 0.893951113677214140, 0.893928704335493430, +0.893906292758950840, 0.893883878947642540, 0.893861462901624270, 0.893839044620952650, 0.893816624105683410, 0.893794201355872620, 0.893771776371576230, 0.893749349152850540, +0.893726919699751380, 0.893704488012334600, 0.893682054090656930, 0.893659617934774220, 0.893637179544742420, 0.893614738920617710, 0.893592296062456050, 0.893569850970313720, +0.893547403644246670, 0.893524954084310870, 0.893502502290562940, 0.893480048263058820, 0.893457592001854590, 0.893435133507006430, 0.893412672778570390, 0.893390209816602670, +0.893367744621159420, 0.893345277192296390, 0.893322807530070540, 0.893300335634537700, 0.893277861505754060, 0.893255385143775670, 0.893232906548658940, 0.893210425720459830, +0.893187942659234400, 0.893165457365039380, 0.893142969837930730, 0.893120480077964740, 0.893097988085197470, 0.893075493859685320, 0.893052997401484360, 0.893030498710650880, +0.893007997787240830, 0.892985494631311160, 0.892962989242917730, 0.892940481622116920, 0.892917971768964810, 0.892895459683517800, 0.892872945365832060, 0.892850428815964100, +0.892827910033969550, 0.892805389019905690, 0.892782865773828370, 0.892760340295793870, 0.892737812585858490, 0.892715282644078620, 0.892692750470510550, 0.892670216065210130, +0.892647679428234640, 0.892625140559639930, 0.892602599459482390, 0.892580056127818320, 0.892557510564704120, 0.892534962770196060, 0.892512412744350670, 0.892489860487223900, +0.892467305998872810, 0.892444749279353470, 0.892422190328722280, 0.892399629147035630, 0.892377065734349940, 0.892354500090721480, 0.892331932216206440, 0.892309362110861870, +0.892286789774744070, 0.892264215207909110, 0.892241638410413710, 0.892219059382314270, 0.892196478123667090, 0.892173894634528790, 0.892151308914955310, 0.892128720965003950, +0.892106130784730780, 0.892083538374192300, 0.892060943733444910, 0.892038346862545240, 0.892015747761549680, 0.891993146430514750, 0.891970542869496620, 0.891947937078552470, +0.891925329057738470, 0.891902718807111140, 0.891880106326726980, 0.891857491616642630, 0.891834874676914580, 0.891812255507598910, 0.891789634108752890, 0.891767010480432940, +0.891744384622695340, 0.891721756535596930, 0.891699126219194000, 0.891676493673543290, 0.891653858898701300, 0.891631221894724320, 0.891608582661669760, 0.891585941199593670, +0.891563297508552680, 0.891540651588603520, 0.891518003439802700, 0.891495353062206840, 0.891472700455872240, 0.891450045620856280, 0.891427388557215260, 0.891404729265005690, +0.891382067744284300, 0.891359403995107710, 0.891336738017532770, 0.891314069811615870, 0.891291399377413310, 0.891268726714982810, 0.891246051824380440, 0.891223374705662930, +0.891200695358887020, 0.891178013784109320, 0.891155329981386580, 0.891132643950775520, 0.891109955692332530, 0.891087265206114920, 0.891064572492179190, 0.891041877550582060, +0.891019180381380280, 0.890996480984630470, 0.890973779360389570, 0.890951075508713660, 0.890928369429660580, 0.890905661123286510, 0.890882950589648390, 0.890860237828802860, +0.890837522840806640, 0.890814805625716690, 0.890792086183589740, 0.890769364514482080, 0.890746640618451550, 0.890723914495554330, 0.890701186145847260, 0.890678455569387300, +0.890655722766231280, 0.890632987736435840, 0.890610250480057930, 0.890587510997154050, 0.890564769287781830, 0.890542025351997560, 0.890519279189858290, 0.890496530801420880, +0.890473780186742060, 0.890451027345878890, 0.890428272278887660, 0.890405514985826210, 0.890382755466750940, 0.890359993721718810, 0.890337229750786660, 0.890314463554011450, +0.890291695131450010, 0.890268924483159420, 0.890246151609196070, 0.890223376509617800, 0.890200599184481020, 0.890177819633842790, 0.890155037857760070, 0.890132253856289690, +0.890109467629488620, 0.890086679177413580, 0.890063888500122190, 0.890041095597671080, 0.890018300470117210, 0.889995503117517630, 0.889972703539929300, 0.889949901737409180, +0.889927097710014330, 0.889904291457801370, 0.889881482980828030, 0.889858672279150940, 0.889835859352827270, 0.889813044201913870, 0.889790226826467910, 0.889767407226546350, +0.889744585402206250, 0.889721761353504340, 0.889698935080498470, 0.889676106583245140, 0.889653275861801650, 0.889630442916224950, 0.889607607746572100, 0.889584770352900290, +0.889561930735266020, 0.889539088893727460, 0.889516244828341130, 0.889493398539164200, 0.889470550026253750, 0.889447699289666940, 0.889424846329460950, 0.889401991145692740, +0.889379133738419260, 0.889356274107698240, 0.889333412253586640, 0.889310548176141410, 0.889287681875419840, 0.889264813351479110, 0.889241942604376280, 0.889219069634168640, +0.889196194440912910, 0.889173317024667060, 0.889150437385487940, 0.889127555523432810, 0.889104671438558650, 0.889081785130922950, 0.889058896600582680, 0.889036005847594790, +0.889013112872017340, 0.888990217673907070, 0.888967320253321260, 0.888944420610317200, 0.888921518744951960, 0.888898614657283040, 0.888875708347367510, 0.888852799815262440, +0.888829889061025670, 0.888806976084714150, 0.888784060886385170, 0.888761143466096140, 0.888738223823904220, 0.888715301959866700, 0.888692377874040540, 0.888669451566483910, +0.888646523037253560, 0.888623592286406970, 0.888600659314001340, 0.888577724120094060, 0.888554786704742530, 0.888531847068004030, 0.888508905209935420, 0.888485961130594970, +0.888463014830039750, 0.888440066308326840, 0.888417115565513840, 0.888394162601658040, 0.888371207416816850, 0.888348250011047560, 0.888325290384407330, 0.888302328536954230, +0.888279364468745340, 0.888256398179838040, 0.888233429670289730, 0.888210458940157930, 0.888187485989499810, 0.888164510818372670, 0.888141533426834660, 0.888118553814942870, +0.888095571982754570, 0.888072587930327510, 0.888049601657718850, 0.888026613164986210, 0.888003622452187000, 0.887980629519378390, 0.887957634366618560, 0.887934636993964690, +0.887911637401474270, 0.887888635589204720, 0.887865631557213540, 0.887842625305558240, 0.887819616834296440, 0.887796606143485210, 0.887773593233182940, 0.887750578103446600, +0.887727560754333790, 0.887704541185902140, 0.887681519398209050, 0.887658495391312250, 0.887635469165268810, 0.887612440720137010, 0.887589410055974140, 0.887566377172837820, +0.887543342070785450, 0.887520304749874870, 0.887497265210163370, 0.887474223451708790, 0.887451179474568310, 0.887428133278800100, 0.887405084864461680, 0.887382034231610550, +0.887358981380304330, 0.887335926310600650, 0.887312869022557240, 0.887289809516231150, 0.887266747791680910, 0.887243683848963900, 0.887220617688137540, 0.887197549309259760, +0.887174478712388080, 0.887151405897580240, 0.887128330864893840, 0.887105253614386190, 0.887082174146115790, 0.887059092460140030, 0.887036008556516540, 0.887012922435302940, +0.886989834096557180, 0.886966743540336670, 0.886943650766699450, 0.886920555775702610, 0.886897458567404760, 0.886874359141863300, 0.886851257499135960, 0.886828153639280470, +0.886805047562354680, 0.886781939268416090, 0.886758828757522320, 0.886735716029732000, 0.886712601085102300, 0.886689483923691070, 0.886666364545556140, 0.886643242950755360, +0.886620119139346350, 0.886596993111387180, 0.886573864866935010, 0.886550734406048590, 0.886527601728785420, 0.886504466835203230, 0.886481329725359870, 0.886458190399313170, +0.886435048857120990, 0.886411905098841160, 0.886388759124531190, 0.886365610934249700, 0.886342460528054210, 0.886319307906002550, 0.886296153068152680, 0.886272996014562440, +0.886249836745289680, 0.886226675260391890, 0.886203511559927830, 0.886180345643954980, 0.886157177512531200, 0.886134007165714550, 0.886110834603562990, 0.886087659826134240, +0.886064482833486270, 0.886041303625676790, 0.886018122202764440, 0.885994938564806710, 0.885971752711861790, 0.885948564643987300, 0.885925374361241520, 0.885902181863682300, +0.885878987151367260, 0.885855790224355010, 0.885832591082703400, 0.885809389726470280, 0.885786186155713700, 0.885762980370491610, 0.885739772370862100, 0.885716562156883210, +0.885693349728612470, 0.885670135086108700, 0.885646918229429650, 0.885623699158633370, 0.885600477873777710, 0.885577254374920960, 0.885554028662121070, 0.885530800735436000, +0.885507570594923690, 0.885484338240642770, 0.885461103672650960, 0.885437866891006450, 0.885414627895767190, 0.885391386686991470, 0.885368143264737230, 0.885344897629062210, +0.885321649780025480, 0.885298399717684430, 0.885275147442097570, 0.885251892953322740, 0.885228636251418120, 0.885205377336442000, 0.885182116208452440, 0.885158852867507170, +0.885135587313665150, 0.885112319546984220, 0.885089049567522430, 0.885065777375337980, 0.885042502970489140, 0.885019226353034090, 0.884995947523030900, 0.884972666480537410, +0.884949383225612780, 0.884926097758314660, 0.884902810078701200, 0.884879520186830800, 0.884856228082761540, 0.884832933766551810, 0.884809637238259230, 0.884786338497942970, +0.884763037545660990, 0.884739734381471240, 0.884716429005432350, 0.884693121417602260, 0.884669811618039370, 0.884646499606801970, 0.884623185383947910, 0.884599868949536350, +0.884576550303625030, 0.884553229446272350, 0.884529906377536700, 0.884506581097476150, 0.884483253606149210, 0.884459923903613720, 0.884436591989928860, 0.884413257865152460, +0.884389921529342930, 0.884366582982558660, 0.884343242224857830, 0.884319899256298950, 0.884296554076940410, 0.884273206686839950, 0.884249857086056860, 0.884226505274649190, +0.884203151252675350, 0.884179795020193500, 0.884156436577262170, 0.884133075923939860, 0.884109713060284740, 0.884086347986354990, 0.884062980702209790, 0.884039611207907080, +0.884016239503505390, 0.883992865589063090, 0.883969489464638600, 0.883946111130290420, 0.883922730586076510, 0.883899347832056260, 0.883875962868287510, 0.883852575694829000, +0.883829186311739010, 0.883805794719075940, 0.883782400916898530, 0.883759004905265040, 0.883735606684233680, 0.883712206253863710, 0.883688803614213200, 0.883665398765340670, +0.883641991707304620, 0.883618582440163670, 0.883595170963976220, 0.883571757278800440, 0.883548341384695620, 0.883524923281720050, 0.883501502969932130, 0.883478080449390470, +0.883454655720153580, 0.883431228782279980, 0.883407799635828380, 0.883384368280856870, 0.883360934717424940, 0.883337498945590550, 0.883314060965412430, 0.883290620776949200, +0.883267178380259370, 0.883243733775401660, 0.883220286962434600, 0.883196837941416350, 0.883173386712406530, 0.883149933275463090, 0.883126477630644890, 0.883103019778010530, +0.883079559717618650, 0.883056097449527840, 0.883032632973796310, 0.883009166290483650, 0.882985697399648050, 0.882962226301348240, 0.882938752995642840, 0.882915277482590580, +0.882891799762250180, 0.882868319834680170, 0.882844837699939040, 0.882821353358086200, 0.882797866809179930, 0.882774378053279070, 0.882750887090442250, 0.882727393920728190, +0.882703898544195620, 0.882680400960903280, 0.882656901170909670, 0.882633399174274080, 0.882609894971055020, 0.882586388561311220, 0.882562879945101520, 0.882539369122484540, +0.882515856093519240, 0.882492340858263780, 0.882468823416777900, 0.882445303769120000, 0.882421781915348810, 0.882398257855523170, 0.882374731589701920, 0.882351203117943790, +0.882327672440307630, 0.882304139556851940, 0.882280604467636340, 0.882257067172719120, 0.882233527672159350, 0.882209985966015740, 0.882186442054347150, 0.882162895937212420, +0.882139347614670060, 0.882115797086779670, 0.882092244353599900, 0.882068689415189460, 0.882045132271607300, 0.882021572922912390, 0.881998011369163450, 0.881974447610419540, +0.881950881646739070, 0.881927313478181870, 0.881903743104806240, 0.881880170526671340, 0.881856595743836010, 0.881833018756359220, 0.881809439564299910, 0.881785858167716930, +0.881762274566668890, 0.881738688761215640, 0.881715100751415680, 0.881691510537327860, 0.881667918119011350, 0.881644323496525000, 0.881620726669927860, 0.881597127639278550, +0.881573526404636710, 0.881549922966061160, 0.881526317323610750, 0.881502709477344550, 0.881479099427321610, 0.881455487173600890, 0.881431872716241460, 0.881408256055301930, +0.881384637190842150, 0.881361016122920840, 0.881337392851596960, 0.881313767376929570, 0.881290139698977850, 0.881266509817800750, 0.881242877733457330, 0.881219243446006330, +0.881195606955507580, 0.881171968262019820, 0.881148327365602220, 0.881124684266313740, 0.881101038964213660, 0.881077391459360810, 0.881053741751814170, 0.881030089841633560, +0.881006435728877710, 0.880982779413605810, 0.880959120895877020, 0.880935460175750310, 0.880911797253285060, 0.880888132128540220, 0.880864464801574650, 0.880840795272448410, +0.880817123541220100, 0.880793449607949030, 0.880769773472694250, 0.880746095135515160, 0.880722414596470720, 0.880698731855619870, 0.880675046913022670, 0.880651359768737760, +0.880627670422824530, 0.880603978875342030, 0.880580285126349670, 0.880556589175906620, 0.880532891024072060, 0.880509190670904830, 0.880485488116464990, 0.880461783360811490, +0.880438076404003510, 0.880414367246100450, 0.880390655887161370, 0.880366942327245660, 0.880343226566412620, 0.880319508604721080, 0.880295788442231110, 0.880272066079001770, +0.880248341515092240, 0.880224614750561910, 0.880200885785469960, 0.880177154619875780, 0.880153421253838330, 0.880129685687417780, 0.880105947920672980, 0.880082207953663430, +0.880058465786448200, 0.880034721419086900, 0.880010974851638710, 0.879987226084163130, 0.879963475116719020, 0.879939721949366760, 0.879915966582165090, 0.879892209015173510, +0.879868449248451530, 0.879844687282058340, 0.879820923116053420, 0.879797156750496190, 0.879773388185445590, 0.879749617420962030, 0.879725844457104440, 0.879702069293932130, +0.879678291931504820, 0.879654512369881680, 0.879630730609122220, 0.879606946649285510, 0.879583160490431950, 0.879559372132620480, 0.879535581575910500, 0.879511788820361630, +0.879487993866033270, 0.879464196712984920, 0.879440397361275990, 0.879416595810965760, 0.879392792062114400, 0.879368986114781090, 0.879345177969025340, 0.879321367624906650, +0.879297555082484530, 0.879273740341818490, 0.879249923402967700, 0.879226104265992570, 0.879202282930952150, 0.879178459397905950, 0.879154633666913710, 0.879130805738034820, +0.879106975611328890, 0.879083143286855550, 0.879059308764673970, 0.879035472044844560, 0.879011633127426360, 0.878987792012479120, 0.878963948700062450, 0.878940103190235860, +0.878916255483059070, 0.878892405578591610, 0.878868553476892630, 0.878844699178022770, 0.878820842682041190, 0.878796983989007520, 0.878773123098981370, 0.878749260012022360, +0.878725394728190220, 0.878701527247544130, 0.878677657570144710, 0.878653785696051130, 0.878629911625323110, 0.878606035358020290, 0.878582156894202380, 0.878558276233929010, +0.878534393377260030, 0.878510508324254700, 0.878486621074973440, 0.878462731629475630, 0.878438839987821020, 0.878414946150069320, 0.878391050116280160, 0.878367151886513490, +0.878343251460828920, 0.878319348839285750, 0.878295444021944590, 0.878271537008864960, 0.878247627800106350, 0.878223716395728720, 0.878199802795791800, 0.878175887000355430, +0.878151969009478890, 0.878128048823222820, 0.878104126441646700, 0.878080201864810170, 0.878056275092773180, 0.878032346125595440, 0.878008414963336930, 0.877984481606057350, +0.877960546053816130, 0.877936608306673970, 0.877912668364690290, 0.877888726227925020, 0.877864781896437800, 0.877840835370288670, 0.877816886649537500, 0.877792935734243660, +0.877768982624467900, 0.877745027320269710, 0.877721069821708940, 0.877697110128845550, 0.877673148241739250, 0.877649184160450120, 0.877625217885038110, 0.877601249415562610, +0.877577278752084360, 0.877553305894662960, 0.877529330843358270, 0.877505353598230230, 0.877481374159338800, 0.877457392526744040, 0.877433408700505680, 0.877409422680683450, +0.877385434467338080, 0.877361444060529070, 0.877337451460316500, 0.877313456666760310, 0.877289459679920450, 0.877265460499856990, 0.877241459126629320, 0.877217455560298510, +0.877193449800924060, 0.877169441848566040, 0.877145431703284410, 0.877121419365139100, 0.877097404834190300, 0.877073388110498060, 0.877049369194121800, 0.877025348085122670, +0.877001324783560080, 0.876977299289494190, 0.876953271602985080, 0.876929241724092810, 0.876905209652877330, 0.876881175389398470, 0.876857138933717200, 0.876833100285892900, +0.876809059445985970, 0.876785016414056370, 0.876760971190164160, 0.876736923774369630, 0.876712874166732710, 0.876688822367313160, 0.876664768376172020, 0.876640712193369030, +0.876616653818964140, 0.876592593253017750, 0.876568530495589690, 0.876544465546740480, 0.876520398406530070, 0.876496329075018180, 0.876472257552265880, 0.876448183838333010, +0.876424107933279630, 0.876400029837166030, 0.876375949550052380, 0.876351867071998750, 0.876327782403065080, 0.876303695543312440, 0.876279606492800460, 0.876255515251589510, +0.876231421819739790, 0.876207326197311450, 0.876183228384364800, 0.876159128380960220, 0.876135026187157220, 0.876110921803017200, 0.876086815228599770, 0.876062706463965330, +0.876038595509174180, 0.876014482364286580, 0.875990367029362730, 0.875966249504462890, 0.875942129789647030, 0.875918007884976310, 0.875893883790510590, 0.875869757506310130, +0.875845629032435240, 0.875821498368946290, 0.875797365515903700, 0.875773230473367190, 0.875749093241398050, 0.875724953820056110, 0.875700812209401770, 0.875676668409495540, +0.875652522420397480, 0.875628374242168220, 0.875604223874868030, 0.875580071318556860, 0.875555916573295900, 0.875531759639145090, 0.875507600516164940, 0.875483439204415850, +0.875459275703958100, 0.875435110014852190, 0.875410942137157980, 0.875386772070936960, 0.875362599816248980, 0.875338425373154540, 0.875314248741713930, 0.875290069921987770, +0.875265888914036450, 0.875241705717920370, 0.875217520333699590, 0.875193332761435410, 0.875169143001187980, 0.875144951053017710, 0.875120756916984990, 0.875096560593150330, +0.875072362081574350, 0.875048161382317450, 0.875023958495439680, 0.874999753421002560, 0.874975546159065920, 0.874951336709690500, 0.874927125072936680, 0.874902911248865100, +0.874878695237536250, 0.874854477039010200, 0.874830256653348350, 0.874806034080610970, 0.874781809320858360, 0.874757582374151350, 0.874733353240550350, 0.874709121920115960, +0.874684888412908700, 0.874660652718988850, 0.874636414838417810, 0.874612174771255750, 0.874587932517563280, 0.874563688077400920, 0.874539441450829290, 0.874515192637909110, +0.874490941638701000, 0.874466688453265030, 0.874442433081662810, 0.874418175523954510, 0.874393915780200760, 0.874369653850462170, 0.874345389734799580, 0.874321123433273390, +0.874296854945944000, 0.874272584272872910, 0.874248311414120290, 0.874224036369746990, 0.874199759139813630, 0.874175479724380810, 0.874151198123509280, 0.874126914337259750, +0.874102628365692520, 0.874078340208869100, 0.874054049866849870, 0.874029757339695570, 0.874005462627466810, 0.873981165730224440, 0.873956866648029180, 0.873932565380941220, +0.873908261929022380, 0.873883956292332840, 0.873859648470933340, 0.873835338464884810, 0.873811026274247890, 0.873786711899083410, 0.873762395339452210, 0.873738076595414580, +0.873713755667032130, 0.873689432554365260, 0.873665107257474930, 0.873640779776421740, 0.873616450111266650, 0.873592118262070390, 0.873567784228893920, 0.873543448011797510, +0.873519109610842890, 0.873494769026090470, 0.873470426257601180, 0.873446081305435880, 0.873421734169655290, 0.873397384850320370, 0.873373033347491500, 0.873348679661230640, +0.873324323791597970, 0.873299965738654540, 0.873275605502461080, 0.873251243083078780, 0.873226878480568240, 0.873202511694990520, 0.873178142726406150, 0.873153771574876840, +0.873129398240463090, 0.873105022723225880, 0.873080645023226020, 0.873056265140524590, 0.873031883075182540, 0.873007498827260810, 0.872983112396819800, 0.872958723783921480, +0.872934332988626330, 0.872909940010995420, 0.872885544851089600, 0.872861147508969930, 0.872836747984697460, 0.872812346278332600, 0.872787942389937290, 0.872763536319572150, +0.872739128067298250, 0.872714717633176430, 0.872690305017267850, 0.872665890219633480, 0.872641473240334480, 0.872617054079431240, 0.872592632736985950, 0.872568209213059000, +0.872543783507711450, 0.872519355621004580, 0.872494925552999230, 0.872470493303756590, 0.872446058873337260, 0.872421622261803200, 0.872397183469215130, 0.872372742495634120, +0.872348299341121240, 0.872323854005737530, 0.872299406489544290, 0.872274956792602470, 0.872250504914972910, 0.872226050856717450, 0.872201594617896810, 0.872177136198572290, +0.872152675598804940, 0.872128212818655820, 0.872103747858186230, 0.872079280717457220, 0.872054811396529630, 0.872030339895465410, 0.872005866214325300, 0.871981390353170570, +0.871956912312062400, 0.871932432091061860, 0.871907949690230330, 0.871883465109628440, 0.871858978349318360, 0.871834489409360810, 0.871809998289816980, 0.871785504990748250, +0.871761009512215690, 0.871736511854280690, 0.871712012017004320, 0.871687510000447530, 0.871663005804672380, 0.871638499429739700, 0.871613990875710900, 0.871589480142646920, +0.871564967230609390, 0.871540452139659360, 0.871515934869858230, 0.871491415421266850, 0.871466893793947370, 0.871442369987960650, 0.871417844003367970, 0.871393315840230720, +0.871368785498610190, 0.871344252978567660, 0.871319718280164080, 0.871295181403461630, 0.871270642348521250, 0.871246101115404240, 0.871221557704171980, 0.871197012114885870, +0.871172464347607200, 0.871147914402397360, 0.871123362279317300, 0.871098807978429200, 0.871074251499794230, 0.871049692843473560, 0.871025132009528580, 0.871000568998020810, +0.870976003809011750, 0.870951436442562120, 0.870926866898734330, 0.870902295177589440, 0.870877721279188720, 0.870853145203593800, 0.870828566950865970, 0.870803986521066720, +0.870779403914257450, 0.870754819130499350, 0.870730232169854570, 0.870705643032384180, 0.870681051718149690, 0.870656458227212600, 0.870631862559634430, 0.870607264715476560, +0.870582664694800500, 0.870558062497667320, 0.870533458124139510, 0.870508851574277930, 0.870484242848144300, 0.870459631945800120, 0.870435018867306790, 0.870410403612725920, +0.870385786182118590, 0.870361166575547300, 0.870336544793072990, 0.870311920834757390, 0.870287294700661910, 0.870262666390848260, 0.870238035905377960, 0.870213403244312510, +0.870188768407713200, 0.870164131395642300, 0.870139492208161110, 0.870114850845331240, 0.870090207307214200, 0.870065561593871720, 0.870040913705365180, 0.870016263641756100, +0.869991611403106660, 0.869966956989478240, 0.869942300400932460, 0.869917641637530940, 0.869892980699335180, 0.869868317586407150, 0.869843652298808220, 0.869818984836599700, +0.869794315199844180, 0.869769643388602850, 0.869744969402937550, 0.869720293242909670, 0.869695614908581160, 0.869670934400013530, 0.869646251717268610, 0.869621566860407590, +0.869596879829493190, 0.869572190624586460, 0.869547499245749370, 0.869522805693043410, 0.869498109966530540, 0.869473412066272380, 0.869448711992330200, 0.869424009744766750, +0.869399305323643180, 0.869374598729021450, 0.869349889960963180, 0.869325179019530100, 0.869300465904784160, 0.869275750616787080, 0.869251033155600150, 0.869226313521286100, +0.869201591713906210, 0.869176867733522430, 0.869152141580196380, 0.869127413253990010, 0.869102682754965160, 0.869077950083183560, 0.869053215238706710, 0.869028478221597120, +0.869003739031916410, 0.868978997669726420, 0.868954254135088870, 0.868929508428065710, 0.868904760548718790, 0.868880010497109500, 0.868855258273300570, 0.868830503877353610, +0.868805747309330250, 0.868780988569292640, 0.868756227657302540, 0.868731464573421870, 0.868706699317712490, 0.868681931890236010, 0.868657162291055050, 0.868632390520231220, +0.868607616577826370, 0.868582840463902550, 0.868558062178521610, 0.868533281721745490, 0.868508499093635700, 0.868483714294255190, 0.868458927323665360, 0.868434138181928270, +0.868409346869105760, 0.868384553385259880, 0.868359757730452600, 0.868334959904745960, 0.868310159908201480, 0.868285357740882000, 0.868260553402849130, 0.868235746894164940, +0.868210938214891370, 0.868186127365090490, 0.868161314344824240, 0.868136499154154690, 0.868111681793143460, 0.868086862261853500, 0.868062040560346300, 0.868037216688684050, +0.868012390646928810, 0.867987562435142520, 0.867962732053387360, 0.867937899501724950, 0.867913064780218240, 0.867888227888928830, 0.867863388827918800, 0.867838547597250320, +0.867813704196985560, 0.867788858627186470, 0.867764010887915220, 0.867739160979233540, 0.867714308901204380, 0.867689454653889470, 0.867664598237350980, 0.867639739651650870, +0.867614878896851520, 0.867590015973014880, 0.867565150880203250, 0.867540283618478240, 0.867515414187903120, 0.867490542588539300, 0.867465668820449180, 0.867440792883694910, +0.867415914778338680, 0.867391034504442550, 0.867366152062068460, 0.867341267451279490, 0.867316380672137340, 0.867291491724704100, 0.867266600609042260, 0.867241707325213880, +0.867216811873281260, 0.867191914253306660, 0.867167014465351720, 0.867142112509479700, 0.867117208385752460, 0.867092302094232160, 0.867067393634981200, 0.867042483008061640, +0.867017570213535870, 0.866992655251465740, 0.866967738121914520, 0.866942818824943840, 0.866917897360616200, 0.866892973728993770, 0.866868047930138830, 0.866843119964113900, +0.866818189830981130, 0.866793257530802390, 0.866768323063641040, 0.866743386429558840, 0.866718447628618160, 0.866693506660881300, 0.866668563526410750, 0.866643618225268810, +0.866618670757517750, 0.866593721123219640, 0.866568769322437650, 0.866543815355233730, 0.866518859221670270, 0.866493900921809670, 0.866468940455714320, 0.866443977823446620, +0.866419013025068520, 0.866394046060643410, 0.866369076930233130, 0.866344105633900070, 0.866319132171706860, 0.866294156543715780, 0.866269178749989320, 0.866244198790589890, +0.866219216665579550, 0.866194232375021580, 0.866169245918978040, 0.866144257297511430, 0.866119266510684160, 0.866094273558558610, 0.866069278441197520, 0.866044281158663170, +0.866019281711017720, 0.865994280098324460, 0.865969276320645580, 0.865944270378043450, 0.865919262270580580, 0.865894251998319600, 0.865869239561323000, 0.865844224959652850, +0.865819208193372660, 0.865794189262544370, 0.865769168167230600, 0.865744144907493960, 0.865719119483396970, 0.865694091895002130, 0.865669062142372050, 0.865644030225568910, +0.865618996144656090, 0.865593959899695900, 0.865568921490750710, 0.865543880917883150, 0.865518838181156050, 0.865493793280631700, 0.865468746216372490, 0.865443696988441920, +0.865418645596902070, 0.865393592041815540, 0.865368536323245170, 0.865343478441253370, 0.865318418395902840, 0.865293356187256220, 0.865268291815375900, 0.865243225280325270, +0.865218156582166500, 0.865193085720962430, 0.865168012696775570, 0.865142937509668750, 0.865117860159704600, 0.865092780646945720, 0.865067698971454410, 0.865042615133294390, +0.865017529132527830, 0.864992440969217460, 0.864967350643425890, 0.864942258155215970, 0.864917163504650530, 0.864892066691791640, 0.864866967716703020, 0.864841866579446950, +0.864816763280086280, 0.864791657818683720, 0.864766550195301910, 0.864741440410003780, 0.864716328462852070, 0.864691214353909170, 0.864666098083238580, 0.864640979650902700, +0.864615859056964480, 0.864590736301486530, 0.864565611384531810, 0.864540484306163040, 0.864515355066443060, 0.864490223665434150, 0.864465090103200270, 0.864439954379803590, +0.864414816495307050, 0.864389676449773490, 0.864364534243265650, 0.864339389875846580, 0.864314243347578560, 0.864289094658525330, 0.864263943808749380, 0.864238790798313560, +0.864213635627280820, 0.864188478295713990, 0.864163318803675920, 0.864138157151229550, 0.864112993338437390, 0.864087827365363160, 0.864062659232069370, 0.864037488938618870, +0.864012316485074710, 0.863987141871499830, 0.863961965097956970, 0.863936786164508860, 0.863911605071219110, 0.863886421818150450, 0.863861236405365720, 0.863836048832927860, +0.863810859100899940, 0.863785667209344800, 0.863760473158325490, 0.863735276947904640, 0.863710078578145970, 0.863684878049112090, 0.863659675360866070, 0.863634470513470860, +0.863609263506989410, 0.863584054341484890, 0.863558843017020130, 0.863533629533657860, 0.863508413891462050, 0.863483196090495060, 0.863457976130820200, 0.863432754012500300, +0.863407529735598640, 0.863382303300178070, 0.863357074706301300, 0.863331843954032290, 0.863306611043433650, 0.863281375974568550, 0.863256138747499960, 0.863230899362291030, +0.863205657819004930, 0.863180414117704630, 0.863155168258452840, 0.863129920241313520, 0.863104670066349500, 0.863079417733623730, 0.863054163243199390, 0.863028906595139760, +0.863003647789507780, 0.862978386826366290, 0.862953123705779260, 0.862927858427809390, 0.862902590992519870, 0.862877321399973860, 0.862852049650234540, 0.862826775743365190, +0.862801499679428870, 0.862776221458488310, 0.862750941080607680, 0.862725658545849710, 0.862700373854277560, 0.862675087005954410, 0.862649798000943660, 0.862624506839308360, +0.862599213521111800, 0.862573918046416810, 0.862548620415287350, 0.862523320627786470, 0.862498018683977240, 0.862472714583922940, 0.862447408327686850, 0.862422099915332250, +0.862396789346921990, 0.862371476622520230, 0.862346161742189700, 0.862320844705993790, 0.862295525513995800, 0.862270204166258880, 0.862244880662846550, 0.862219555003822080, +0.862194227189248210, 0.862168897219189210, 0.862143565093707930, 0.862118230812867760, 0.862092894376732090, 0.862067555785364090, 0.862042215038827280, 0.862016872137184920, +0.861991527080499860, 0.861966179868836500, 0.861940830502257670, 0.861915478980826770, 0.861890125304607070, 0.861864769473662200, 0.861839411488055320, 0.861814051347849500, +0.861788689053109010, 0.861763324603896820, 0.861737958000276310, 0.861712589242310870, 0.861687218330063900, 0.861661845263599010, 0.861636470042979500, 0.861611092668268300, +0.861585713139529810, 0.861560331456827090, 0.861534947620223530, 0.861509561629782540, 0.861484173485567720, 0.861458783187642460, 0.861433390736069730, 0.861407996130914010, +0.861382599372238270, 0.861357200460106110, 0.861331799394580930, 0.861306396175726240, 0.861280990803605540, 0.861255583278282330, 0.861230173599819790, 0.861204761768282200, +0.861179347783732730, 0.861153931646234880, 0.861128513355852280, 0.861103092912648300, 0.861077670316686690, 0.861052245568030840, 0.861026818666743910, 0.861001389612890410, +0.860975958406533400, 0.860950525047736500, 0.860925089536563330, 0.860899651873077380, 0.860874212057342380, 0.860848770089421400, 0.860823325969378830, 0.860797879697278060, +0.860772431273182480, 0.860746980697155940, 0.860721527969261930, 0.860696073089563970, 0.860670616058126000, 0.860645156875010970, 0.860619695540283500, 0.860594232054006760, +0.860568766416244470, 0.860543298627060250, 0.860517828686517830, 0.860492356594680820, 0.860466882351612840, 0.860441405957377280, 0.860415927412038650, 0.860390446715660230, +0.860364963868305630, 0.860339478870038700, 0.860313991720923040, 0.860288502421022280, 0.860263010970399920, 0.860237517369120570, 0.860212021617247300, 0.860186523714844050, +0.860161023661974440, 0.860135521458702310, 0.860110017105091270, 0.860084510601205390, 0.860059001947107600, 0.860033491142862760, 0.860007978188534360, 0.859982463084185910, +0.859956945829881250, 0.859931426425684320, 0.859905904871658740, 0.859880381167868020, 0.859854855314376780, 0.859829327311248390, 0.859803797158546710, 0.859778264856335460, +0.859752730404678590, 0.859727193803639930, 0.859701655053283220, 0.859676114153671960, 0.859650571104870860, 0.859625025906943340, 0.859599478559953330, 0.859573929063964460, +0.859548377419040890, 0.859522823625246350, 0.859497267682644780, 0.859471709591299480, 0.859446149351275500, 0.859420586962636010, 0.859395022425445190, 0.859369455739766750, +0.859343886905664660, 0.859318315923202850, 0.859292742792444830, 0.859267167513455330, 0.859241590086297970, 0.859216010511036690, 0.859190428787735330, 0.859164844916457840, +0.859139258897268280, 0.859113670730230710, 0.859088080415408300, 0.859062487952866220, 0.859036893342667970, 0.859011296584877400, 0.858985697679558680, 0.858960096626775640, +0.858934493426592450, 0.858908888079072950, 0.858883280584280760, 0.858857670942280940, 0.858832059153136760, 0.858806445216912630, 0.858780829133672260, 0.858755210903479840, +0.858729590526399410, 0.858703968002494490, 0.858678343331830240, 0.858652716514469950, 0.858627087550478010, 0.858601456439918360, 0.858575823182854970, 0.858550187779352100, +0.858524550229473720, 0.858498910533283530, 0.858473268690846500, 0.858447624702226350, 0.858421978567487030, 0.858396330286692820, 0.858370679859907890, 0.858345027287196080, +0.858319372568621340, 0.858293715704248620, 0.858268056694141630, 0.858242395538364460, 0.858216732236981360, 0.858191066790056410, 0.858165399197653780, 0.858139729459837630, +0.858114057576671700, 0.858088383548221150, 0.858062707374549590, 0.858037029055721210, 0.858011348591800390, 0.857985665982851090, 0.857959981228937680, 0.857934294330124250, +0.857908605286474720, 0.857882914098054060, 0.857857220764926100, 0.857831525287155120, 0.857805827664805400, 0.857780127897941000, 0.857754425986626320, 0.857728721930925090, +0.857703015730902570, 0.857677307386622510, 0.857651596898149180, 0.857625884265546870, 0.857600169488879850, 0.857574452568212300, 0.857548733503608720, 0.857523012295132840, +0.857497288942849820, 0.857471563446823630, 0.857445835807118530, 0.857420106023798920, 0.857394374096928980, 0.857368640026573090, 0.857342903812795540, 0.857317165455660390, +0.857291424955232690, 0.857265682311576520, 0.857239937524756020, 0.857214190594835830, 0.857188441521880010, 0.857162690305953160, 0.857136936947119120, 0.857111181445443290, +0.857085423800989400, 0.857059664013821940, 0.857033902084005430, 0.857008138011604030, 0.856982371796682350, 0.856956603439304800, 0.856930832939535200, 0.856905060297438960, +0.856879285513080120, 0.856853508586522980, 0.856827729517832150, 0.856801948307072010, 0.856776164954306970, 0.856750379459601090, 0.856724591823019740, 0.856698802044626780, +0.856673010124486930, 0.856647216062664580, 0.856621419859224130, 0.856595621514230080, 0.856569821027747040, 0.856544018399839070, 0.856518213630571350, 0.856492406720008260, +0.856466597668213980, 0.856440786475253350, 0.856414973141190640, 0.856389157666090580, 0.856363340050017570, 0.856337520293035780, 0.856311698395210710, 0.856285874356606300, +0.856260048177287290, 0.856234219857318070, 0.856208389396763360, 0.856182556795687670, 0.856156722054155160, 0.856130885172231240, 0.856105046149980060, 0.856079204987466370, +0.856053361684754650, 0.856027516241909540, 0.856001668658995520, 0.855975818936077440, 0.855949967073219350, 0.855924113070486770, 0.855898256927943970, 0.855872398645655450, +0.855846538223685950, 0.855820675662100180, 0.855794810960962660, 0.855768944120338100, 0.855743075140290690, 0.855717204020886140, 0.855691330762188510, 0.855665455364262640, +0.855639577827173040, 0.855613698150984540, 0.855587816335761750, 0.855561932381568970, 0.855536046288471910, 0.855510158056534630, 0.855484267685821980, 0.855458375176398670, +0.855432480528329430, 0.855406583741678990, 0.855380684816512080, 0.855354783752893090, 0.855328880550887400, 0.855302975210559650, 0.855277067731974430, 0.855251158115196590, +0.855225246360290850, 0.855199332467321940, 0.855173416436354250, 0.855147498267453510, 0.855121577960684000, 0.855095655516110550, 0.855069730933797900, 0.855043804213810990, +0.855017875356214540, 0.854991944361073510, 0.854966011228452060, 0.854940075958416030, 0.854914138551029820, 0.854888199006358260, 0.854862257324466300, 0.854836313505418550, +0.854810367549280080, 0.854784419456115720, 0.854758469225989860, 0.854732516858968230, 0.854706562355115330, 0.854680605714496000, 0.854654646937175190, 0.854628686023217840, +0.854602722972688690, 0.854576757785652230, 0.854550790462174410, 0.854524821002319630, 0.854498849406152730, 0.854472875673738750, 0.854446899805142550, 0.854420921800429060, +0.854394941659663340, 0.854368959382909800, 0.854342974970234260, 0.854316988421701340, 0.854290999737375990, 0.854265008917323150, 0.854239015961607670, 0.854213020870294710, +0.854187023643448780, 0.854161024281135720, 0.854135022783420020, 0.854109019150366850, 0.854083013382041180, 0.854057005478507820, 0.854030995439832070, 0.854004983266078880, +0.853978968957312620, 0.853952952513599480, 0.853926933935003960, 0.853900913221591120, 0.853874890373426010, 0.853848865390573590, 0.853822838273099020, 0.853796809021067470, +0.853770777634543340, 0.853744744113592690, 0.853718708458280240, 0.853692670668671050, 0.853666630744830180, 0.853640588686822690, 0.853614544494713750, 0.853588498168567970, +0.853562449708451410, 0.853536399114428690, 0.853510346386565090, 0.853484291524925550, 0.853458234529575250, 0.853432175400579360, 0.853406114138003160, 0.853380050741911030, +0.853353985212369380, 0.853327917549442700, 0.853301847753196290, 0.853275775823695180, 0.853249701761004680, 0.853223625565189820, 0.853197547236316020, 0.853171466774447880, +0.853145384179651470, 0.853119299451991610, 0.853093212591533590, 0.853067123598342470, 0.853041032472483530, 0.853014939214022050, 0.852988843823022760, 0.852962746299551820, +0.852936646643673970, 0.852910544855454590, 0.852884440934958740, 0.852858334882251820, 0.852832226697399110, 0.852806116380465770, 0.852780003931516760, 0.852753889350618130, +0.852727772637834840, 0.852701653793232040, 0.852675532816875140, 0.852649409708829410, 0.852623284469160250, 0.852597157097932270, 0.852571027595211970, 0.852544895961063980, +0.852518762195553890, 0.852492626298746780, 0.852466488270708140, 0.852440348111503270, 0.852414205821197650, 0.852388061399855900, 0.852361914847544530, 0.852335766164328380, +0.852309615350272720, 0.852283462405443170, 0.852257307329904900, 0.852231150123723300, 0.852204990786963880, 0.852178829319691580, 0.852152665721972570, 0.852126499993871910, +0.852100332135455000, 0.852074162146787330, 0.852047990027934190, 0.852021815778961080, 0.851995639399932950, 0.851969460890916300, 0.851943280251975850, 0.851917097483177340, +0.851890912584585940, 0.851864725556267350, 0.851838536398286990, 0.851812345110710250, 0.851786151693602060, 0.851759956147029150, 0.851733758471056150, 0.851707558665748880, +0.851681356731172730, 0.851655152667393220, 0.851628946474475730, 0.851602738152485880, 0.851576527701488730, 0.851550315121550770, 0.851524100412736960, 0.851497883575113020, +0.851471664608744240, 0.851445443513696330, 0.851419220290034810, 0.851392994937824830, 0.851366767457132800, 0.851340537848023770, 0.851314306110563470, 0.851288072244817400, +0.851261836250851170, 0.851235598128730400, 0.851209357878520480, 0.851183115500286800, 0.851156870994095870, 0.851130624360012630, 0.851104375598102810, 0.851078124708432140, +0.851051871691066220, 0.851025616546070450, 0.850999359273510340, 0.850973099873452150, 0.850946838345961300, 0.850920574691103380, 0.850894308908944020, 0.850868040999548820, +0.850841770962983520, 0.850815498799313840, 0.850789224508604840, 0.850762948090923340, 0.850736669546334530, 0.850710388874903910, 0.850684106076697420, 0.850657821151780680, +0.850631534100219300, 0.850605244922079120, 0.850578953617425300, 0.850552660186324690, 0.850526364628842350, 0.850500066945044100, 0.850473767134995780, 0.850447465198762910, +0.850421161136411420, 0.850394854948006600, 0.850368546633615050, 0.850342236193302180, 0.850315923627133710, 0.850289608935175470, 0.850263292117493190, 0.850236973174152590, +0.850210652105219620, 0.850184328910759570, 0.850158003590839150, 0.850131676145523760, 0.850105346574879130, 0.850079014878971080, 0.850052681057865580, 0.850026345111628330, +0.850000007040325300, 0.849973666844021760, 0.849947324522784430, 0.849920980076678930, 0.849894633505770880, 0.849868284810126220, 0.849841933989810890, 0.849815581044890740, +0.849789225975431160, 0.849762868781498980, 0.849736509463159590, 0.849710148020479060, 0.849683784453522990, 0.849657418762357560, 0.849631050947048600, 0.849604681007661950, +0.849578308944263120, 0.849551934756919040, 0.849525558445695110, 0.849499180010657270, 0.849472799451871490, 0.849446416769403800, 0.849420031963319940, 0.849393645033685530, +0.849367255980567610, 0.849340864804031370, 0.849314471504143080, 0.849288076080968570, 0.849261678534573900, 0.849235278865025030, 0.849208877072388010, 0.849182473156728230, +0.849156067118112760, 0.849129658956607190, 0.849103248672277380, 0.849076836265189480, 0.849050421735409570, 0.849024005083003570, 0.848997586308037460, 0.848971165410577040, +0.848944742390689070, 0.848918317248439360, 0.848891889983893750, 0.848865460597118540, 0.848839029088179540, 0.848812595457143050, 0.848786159704074560, 0.848759721829041140, +0.848733281832108500, 0.848706839713342600, 0.848680395472809490, 0.848653949110575570, 0.848627500626706670, 0.848601050021269070, 0.848574597294328380, 0.848548142445951560, +0.848521685476204550, 0.848495226385153180, 0.848468765172863850, 0.848442301839402500, 0.848415836384835530, 0.848389368809228880, 0.848362899112648390, 0.848336427295161010, +0.848309953356832680, 0.848283477297729460, 0.848256999117917520, 0.848230518817463030, 0.848204036396432380, 0.848177551854891080, 0.848151065192906390, 0.848124576410543950, +0.848098085507870140, 0.848071592484951120, 0.848045097341853180, 0.848018600078642380, 0.847992100695385110, 0.847965599192147200, 0.847939095568995720, 0.847912589825996490, +0.847886081963215800, 0.847859571980719820, 0.847833059878575050, 0.847806545656847540, 0.847780029315603150, 0.847753510854909240, 0.847726990274831560, 0.847700467575436380, +0.847673942756790090, 0.847647415818958860, 0.847620886762009080, 0.847594355586007150, 0.847567822291018790, 0.847541286877111390, 0.847514749344350780, 0.847488209692803360, +0.847461667922535300, 0.847435124033613100, 0.847408578026103140, 0.847382029900071720, 0.847355479655584660, 0.847328927292709480, 0.847302372811511990, 0.847275816212058500, +0.847249257494415490, 0.847222696658649350, 0.847196133704826490, 0.847169568633012740, 0.847143001443275590, 0.847116432135681000, 0.847089860710295240, 0.847063287167184930, +0.847036711506416240, 0.847010133728055890, 0.846983553832170280, 0.846956971818825120, 0.846930387688088150, 0.846903801440025190, 0.846877213074702650, 0.846850622592187130, +0.846824029992545020, 0.846797435275842950, 0.846770838442146730, 0.846744239491523890, 0.846717638424040460, 0.846691035239762860, 0.846664429938757790, 0.846637822521091540, +0.846611212986830840, 0.846584601336042080, 0.846557987568791300, 0.846531371685146030, 0.846504753685172420, 0.846478133568936860, 0.846451511336505870, 0.846424886987946270, +0.846398260523324340, 0.846371631942706810, 0.846345001246159740, 0.846318368433750630, 0.846291733505545540, 0.846265096461611190, 0.846238457302014080, 0.846211816026820830, +0.846185172636097940, 0.846158527129911800, 0.846131879508329690, 0.846105229771418000, 0.846078577919243120, 0.846051923951871900, 0.846025267869370820, 0.845998609671806510, +0.845971949359245800, 0.845945286931754640, 0.845918622389400850, 0.845891955732250400, 0.845865286960370110, 0.845838616073826600, 0.845811943072686480, 0.845785267957016580, +0.845758590726883530, 0.845731911382353490, 0.845705229923494060, 0.845678546350371760, 0.845651860663052870, 0.845625172861604430, 0.845598482946093190, 0.845571790916585520, +0.845545096773148040, 0.845518400515848260, 0.845491702144752440, 0.845465001659927440, 0.845438299061439860, 0.845411594349356530, 0.845384887523744300, 0.845358178584669770, +0.845331467532199340, 0.845304754366400730, 0.845278039087340230, 0.845251321695084660, 0.845224602189700750, 0.845197880571255330, 0.845171156839815250, 0.845144430995446780, +0.845117703038217650, 0.845090972968194350, 0.845064240785443620, 0.845037506490032180, 0.845010770082027070, 0.844984031561495040, 0.844957290928502910, 0.844930548183117080, +0.844903803325405380, 0.844877056355434090, 0.844850307273270260, 0.844823556078980520, 0.844796802772632030, 0.844770047354291510, 0.844743289824025800, 0.844716530181901510, +0.844689768427986270, 0.844663004562346660, 0.844636238585049440, 0.844609470496161750, 0.844582700295750330, 0.844555927983882130, 0.844529153560623640, 0.844502377026042810, +0.844475598380206030, 0.844448817623180140, 0.844422034755032300, 0.844395249775829470, 0.844368462685638370, 0.844341673484526160, 0.844314882172559230, 0.844288088749805650, +0.844261293216331810, 0.844234495572204760, 0.844207695817491440, 0.844180893952258930, 0.844154089976574150, 0.844127283890504180, 0.844100475694115500, 0.844073665387476080, +0.844046852970652520, 0.844020038443711870, 0.843993221806721090, 0.843966403059747240, 0.843939582202857360, 0.843912759236118080, 0.843885934159597450, 0.843859106973361860, +0.843832277677478590, 0.843805446272014590, 0.843778612757037030, 0.843751777132612850, 0.843724939398809210, 0.843698099555692860, 0.843671257603331610, 0.843644413541792320, +0.843617567371142020, 0.843590719091447780, 0.843563868702776660, 0.843537016205195940, 0.843510161598772120, 0.843483304883573480, 0.843456446059666520, 0.843429585127118410, +0.843402722085996430, 0.843375856936367630, 0.843348989678299080, 0.843322120311858160, 0.843295248837111490, 0.843268375254127120, 0.843241499562971790, 0.843214621763712760, +0.843187741856417090, 0.843160859841152190, 0.843133975717984980, 0.843107089486982990, 0.843080201148212800, 0.843053310701742500, 0.843026418147638900, 0.842999523485969290, +0.842972626716800950, 0.842945727840200940, 0.842918826856236650, 0.842891923764974790, 0.842865018566483660, 0.842838111260829970, 0.842811201848081000, 0.842784290328303930, +0.842757376701566250, 0.842730460967935020, 0.842703543127477750, 0.842676623180261150, 0.842649701126353400, 0.842622776965821440, 0.842595850698732440, 0.842568922325153900, +0.842541991845153100, 0.842515059258797220, 0.842488124566153740, 0.842461187767289510, 0.842434248862272690, 0.842407307851170350, 0.842380364734049760, 0.842353419510978090, +0.842326472182023060, 0.842299522747251730, 0.842272571206731160, 0.842245617560529620, 0.842218661808714080, 0.842191703951351900, 0.842164743988510380, 0.842137781920257010, +0.842110817746659190, 0.842083851467784420, 0.842056883083699410, 0.842029912594472800, 0.842002940000171280, 0.841975965300862490, 0.841948988496613810, 0.841922009587492640, +0.841895028573566350, 0.841868045454902130, 0.841841060231568240, 0.841814072903631640, 0.841787083471159940, 0.841760091934220520, 0.841733098292880790, 0.841706102547208460, +0.841679104697270810, 0.841652104743134900, 0.841625102684869120, 0.841598098522540750, 0.841571092256217070, 0.841544083885965580, 0.841517073411854000, 0.841490060833949620, +0.841463046152320150, 0.841436029367032660, 0.841409010478155420, 0.841381989485755820, 0.841354966389901150, 0.841327941190659010, 0.841300913888097130, 0.841273884482282910, +0.841246852973283500, 0.841219819361167520, 0.841192783646001920, 0.841165745827854310, 0.841138705906792410, 0.841111663882883720, 0.841084619756195860, 0.841057573526796440, +0.841030525194752740, 0.841003474760133040, 0.840976422223004730, 0.840949367583435300, 0.840922310841492490, 0.840895251997244020, 0.840868191050757270, 0.840841128002100090, +0.840814062851339640, 0.840786995598544420, 0.840759926243781820, 0.840732854787119340, 0.840705781228624720, 0.840678705568365660, 0.840651627806409900, 0.840624547942824480, +0.840597465977678260, 0.840570381911038390, 0.840543295742972480, 0.840516207473548380, 0.840489117102833690, 0.840462024630896360, 0.840434930057803790, 0.840407833383623570, +0.840380734608424110, 0.840353633732272900, 0.840326530755237560, 0.840299425677386020, 0.840272318498785810, 0.840245209219504740, 0.840218097839610320, 0.840190984359171060, +0.840163868778254330, 0.840136751096927870, 0.840109631315259620, 0.840082509433317300, 0.840055385451168650, 0.840028259368881590, 0.840001131186523310, 0.839974000904162740, +0.839946868521867170, 0.839919734039704440, 0.839892597457742470, 0.839865458776048900, 0.839838317994691660, 0.839811175113738590, 0.839784030133257200, 0.839756883053316190, +0.839729733873982980, 0.839702582595325380, 0.839675429217411450, 0.839648273740308810, 0.839621116164085520, 0.839593956488808970, 0.839566794714548090, 0.839539630841370070, +0.839512464869343060, 0.839485296798534900, 0.839458126629013530, 0.839430954360846800, 0.839403779994102650, 0.839376603528848570, 0.839349424965153520, 0.839322244303084890, +0.839295061542710610, 0.839267876684098750, 0.839240689727317140, 0.839213500672433830, 0.839186309519516340, 0.839159116268633490, 0.839131920919852780, 0.839104723473242390, +0.839077523928870140, 0.839050322286804100, 0.839023118547112200, 0.838995912709862620, 0.838968704775122640, 0.838941494742961420, 0.838914282613446580, 0.838887068386645950, +0.838859852062627590, 0.838832633641459660, 0.838805413123210110, 0.838778190507947110, 0.838750965795738050, 0.838723738986652090, 0.838696510080756850, 0.838669279078120280, +0.838642045978810540, 0.838614810782895680, 0.838587573490443770, 0.838560334101522420, 0.838533092616200680, 0.838505849034546280, 0.838478603356627270, 0.838451355582511830, +0.838424105712267890, 0.838396853745963620, 0.838369599683667310, 0.838342343525446560, 0.838315085271370330, 0.838287824921506440, 0.838260562475923070, 0.838233297934688150, +0.838206031297870080, 0.838178762565536920, 0.838151491737756830, 0.838124218814597530, 0.838096943796128090, 0.838069666682416450, 0.838042387473530550, 0.838015106169538670, +0.837987822770509090, 0.837960537276509880, 0.837933249687608850, 0.837905960003875180, 0.837878668225376710, 0.837851374352181490, 0.837824078384357800, 0.837796780321974020, +0.837769480165098220, 0.837742177913798680, 0.837714873568143230, 0.837687567128201140, 0.837660258594040140, 0.837632947965728400, 0.837605635243334420, 0.837578320426926260, +0.837551003516572300, 0.837523684512340380, 0.837496363414299670, 0.837469040222518110, 0.837441714937063990, 0.837414387558005460, 0.837387058085411030, 0.837359726519348980, +0.837332392859887590, 0.837305057107094800, 0.837277719261039780, 0.837250379321790470, 0.837223037289415160, 0.837195693163982350, 0.837168346945560300, 0.837140998634217310, +0.837113648230021880, 0.837086295733041830, 0.837058941143346560, 0.837031584461003900, 0.837004225686082240, 0.836976864818650080, 0.836949501858775700, 0.836922136806527610, +0.836894769661973740, 0.836867400425183370, 0.836840029096224460, 0.836812655675165610, 0.836785280162074980, 0.836757902557021200, 0.836730522860072660, 0.836703141071297840, +0.836675757190764700, 0.836648371218542630, 0.836620983154699570, 0.836593592999304140, 0.836566200752424720, 0.836538806414129700, 0.836511409984487810, 0.836484011463567320, +0.836456610851436300, 0.836429208148164240, 0.836401803353819200, 0.836374396468469560, 0.836346987492184060, 0.836319576425031070, 0.836292163267079000, 0.836264748018396230, +0.836237330679051930, 0.836209911249114370, 0.836182489728652060, 0.836155066117733490, 0.836127640416427180, 0.836100212624801830, 0.836072782742925960, 0.836045350770867610, +0.836017916708696410, 0.835990480556480400, 0.835963042314288310, 0.835935601982188410, 0.835908159560249660, 0.835880715048540450, 0.835853268447128930, 0.835825819756084830, +0.835798368975476100, 0.835770916105371460, 0.835743461145839530, 0.835716004096948910, 0.835688544958768320, 0.835661083731366380, 0.835633620414811260, 0.835606155009172570, +0.835578687514518470, 0.835551217930917690, 0.835523746258438840, 0.835496272497150530, 0.835468796647121700, 0.835441318708420750, 0.835413838681116070, 0.835386356565277270, +0.835358872360972620, 0.835331386068270730, 0.835303897687240450, 0.835276407217950380, 0.835248914660469240, 0.835221420014865430, 0.835193923281208450, 0.835166424459566790, +0.835138923550008960, 0.835111420552603900, 0.835083915467420220, 0.835056408294526760, 0.835028899033992360, 0.835001387685885170, 0.834973874250275030, 0.834946358727230110, +0.834918841116819350, 0.834891321419111490, 0.834863799634175340, 0.834836275762079640, 0.834808749802893320, 0.834781221756684570, 0.834753691623523310, 0.834726159403477830, +0.834698625096616960, 0.834671088703009430, 0.834643550222724300, 0.834616009655830270, 0.834588467002395640, 0.834560922262490460, 0.834533375436182890, 0.834505826523541880, +0.834478275524636270, 0.834450722439535000, 0.834423167268307010, 0.834395610011021030, 0.834368050667745550, 0.834340489238550420, 0.834312925723504020, 0.834285360122675400, +0.834257792436133290, 0.834230222663946750, 0.834202650806184720, 0.834175076862915480, 0.834147500834209080, 0.834119922720133910, 0.834092342520758920, 0.834064760236153060, +0.834037175866385370, 0.834009589411524700, 0.833982000871639980, 0.833954410246799950, 0.833926817537074210, 0.833899222742531480, 0.833871625863240820, 0.833844026899270950, +0.833816425850691050, 0.833788822717570040, 0.833761217499977000, 0.833733610197980420, 0.833706000811650360, 0.833678389341055310, 0.833650775786264230, 0.833623160147346280, +0.833595542424370280, 0.833567922617405640, 0.833540300726520520, 0.833512676751785200, 0.833485050693268170, 0.833457422551038610, 0.833429792325165340, 0.833402160015717760, +0.833374525622764590, 0.833346889146375220, 0.833319250586618150, 0.833291609943563440, 0.833263967217279690, 0.833236322407835960, 0.833208675515301530, 0.833181026539745350, +0.833153375481236580, 0.833125722339844500, 0.833098067115637500, 0.833070409808685850, 0.833042750419058180, 0.833015088946823630, 0.832987425392051390, 0.832959759754810510, +0.832932092035170270, 0.832904422233199380, 0.832876750348967800, 0.832849076382544460, 0.832821400333998430, 0.832793722203398760, 0.832766041990814940, 0.832738359696315930, +0.832710675319971010, 0.832682988861848990, 0.832655300322019950, 0.832627609700552610, 0.832599916997516340, 0.832572222212980220, 0.832544525347013510, 0.832516826399685490, +0.832489125371065010, 0.832461422261222110, 0.832433717070225730, 0.832406009798145050, 0.832378300445049350, 0.832350589011007780, 0.832322875496089850, 0.832295159900364730, +0.832267442223901140, 0.832239722466769580, 0.832212000629038550, 0.832184276710777660, 0.832156550712055960, 0.832128822632942970, 0.832101092473507940, 0.832073360233820060, +0.832045625913948370, 0.832017889513963160, 0.831990151033933150, 0.831962410473927720, 0.831934667834016370, 0.831906923114268280, 0.831879176314752940, 0.831851427435539080, +0.831823676476697190, 0.831795923438296110, 0.831768168320405230, 0.831740411123093940, 0.831712651846431620, 0.831684890490487660, 0.831657127055331460, 0.831629361541031950, +0.831601593947659530, 0.831573824275283150, 0.831546052523972290, 0.831518278693796130, 0.831490502784824390, 0.831462724797126350, 0.831434944730770950, 0.831407162585828810, +0.831379378362368640, 0.831351592060460170, 0.831323803680172560, 0.831296013221575540, 0.831268220684738490, 0.831240426069730810, 0.831212629376621660, 0.831184830605481430, +0.831157029756379060, 0.831129226829384060, 0.831101421824566140, 0.831073614741994590, 0.831045805581739020, 0.831017994343868920, 0.830990181028453350, 0.830962365635562810, +0.830934548165266350, 0.830906728617633590, 0.830878906992733920, 0.830851083290637060, 0.830823257511412390, 0.830795429655129200, 0.830767599721857870, 0.830739767711667580, +0.830711933624627810, 0.830684097460808180, 0.830656259220278410, 0.830628418903107900, 0.830600576509366470, 0.830572732039122960, 0.830544885492448200, 0.830517036869411250, +0.830489186170081610, 0.830461333394529100, 0.830433478542823120, 0.830405621615033620, 0.830377762611229970, 0.830349901531481470, 0.830322038375858610, 0.830294173144430770, +0.830266305837267460, 0.830238436454438290, 0.830210564996013090, 0.830182691462061580, 0.830154815852652720, 0.830126938167857430, 0.830099058407744670, 0.830071176572384380, +0.830043292661846070, 0.830015406676199550, 0.829987518615514450, 0.829959628479860710, 0.829931736269307270, 0.829903841983924970, 0.829875945623783200, 0.829848047188951440, +0.829820146679499660, 0.829792244095497460, 0.829764339437014660, 0.829736432704120450, 0.829708523896885760, 0.829680613015379650, 0.829652700059672070, 0.829624785029832830, +0.829596867925931460, 0.829568948748037990, 0.829541027496222160, 0.829513104170553350, 0.829485178771102170, 0.829457251297938010, 0.829429321751130820, 0.829401390130750320, +0.829373456436866330, 0.829345520669548590, 0.829317582828867140, 0.829289642914891270, 0.829261700927691800, 0.829233756867338020, 0.829205810733899870, 0.829177862527447180, +0.829149912248049790, 0.829121959895777750, 0.829094005470700220, 0.829066048972888160, 0.829038090402410940, 0.829010129759338630, 0.828982167043740840, 0.828954202255687720, +0.828926235395249120, 0.828898266462494980, 0.828870295457494580, 0.828842322380318960, 0.828814347231037530, 0.828786370009720220, 0.828758390716436980, 0.828730409351257750, +0.828702425914252580, 0.828674440405491320, 0.828646452825043460, 0.828618463172979940, 0.828590471449370260, 0.828562477654284370, 0.828534481787792320, 0.828506483849964060, +0.828478483840869640, 0.828450481760578450, 0.828422477609161540, 0.828394471386688540, 0.828366463093229250, 0.828338452728853870, 0.828310440293632320, 0.828282425787634780, +0.828254409210931080, 0.828226390563590820, 0.828198369845685180, 0.828170347057283540, 0.828142322198456070, 0.828114295269272720, 0.828086266269803750, 0.828058235200119010, +0.828030202060288210, 0.828002166850382420, 0.827974129570471230, 0.827946090220624710, 0.827918048800913020, 0.827890005311406110, 0.827861959752174250, 0.827833912123287500, +0.827805862424815350, 0.827777810656829200, 0.827749756819398440, 0.827721700912593230, 0.827693642936483950, 0.827665582891140450, 0.827637520776632880, 0.827609456593031640, +0.827581390340406340, 0.827553322018827920, 0.827525251628366210, 0.827497179169091490, 0.827469104641073700, 0.827441028044383240, 0.827412949379090160, 0.827384868645264170, +0.827356785842976560, 0.827328700972296940, 0.827300614033295580, 0.827272525026042760, 0.827244433950608540, 0.827216340807063300, 0.827188245595477100, 0.827160148315919890, +0.827132048968462820, 0.827103947553175510, 0.827075844070128460, 0.827047738519391730, 0.827019630901035700, 0.826991521215130530, 0.826963409461746620, 0.826935295640953690, +0.826907179752823020, 0.826879061797424320, 0.826850941774827990, 0.826822819685104400, 0.826794695528323630, 0.826766569304556280, 0.826738441013871840, 0.826710310656341930, +0.826682178232036160, 0.826654043741025020, 0.826625907183378690, 0.826597768559167670, 0.826569627868462110, 0.826541485111332630, 0.826513340287848840, 0.826485193398082240, +0.826457044442102660, 0.826428893419980380, 0.826400740331786010, 0.826372585177589710, 0.826344427957461880, 0.826316268671472560, 0.826288107319693040, 0.826259943902193370, +0.826231778419043720, 0.826203610870314690, 0.826175441256076560, 0.826147269576399830, 0.826119095831355010, 0.826090920021011810, 0.826062742145441950, 0.826034562204715160, +0.826006380198902050, 0.825978196128072880, 0.825950009992298280, 0.825921821791648640, 0.825893631526194440, 0.825865439196005640, 0.825837244801153840, 0.825809048341708870, +0.825780849817741250, 0.825752649229321570, 0.825724446576520220, 0.825696241859407710, 0.825668035078054200, 0.825639826232530960, 0.825611615322908280, 0.825583402349256530, +0.825555187311646230, 0.825526970210148090, 0.825498751044832390, 0.825470529815769850, 0.825442306523030520, 0.825414081166685910, 0.825385853746806060, 0.825357624263461600, +0.825329392716723120, 0.825301159106661130, 0.825272923433346240, 0.825244685696848950, 0.825216445897239640, 0.825188204034589590, 0.825159960108968970, 0.825131714120448610, +0.825103466069098790, 0.825075215954990450, 0.825046963778193980, 0.825018709538779650, 0.824990453236819080, 0.824962194872382320, 0.824933934445540080, 0.824905671956363000, +0.824877407404921770, 0.824849140791287020, 0.824820872115529350, 0.824792601377719150, 0.824764328577927810, 0.824736053716225710, 0.824707776792683370, 0.824679497807371710, +0.824651216760361240, 0.824622933651722790, 0.824594648481526530, 0.824566361249844060, 0.824538071956745780, 0.824509780602302180, 0.824481487186584210, 0.824453191709662580, +0.824424894171607910, 0.824396594572490930, 0.824368292912382120, 0.824339989191352980, 0.824311683409473920, 0.824283375566815520, 0.824255065663448860, 0.824226753699444430, +0.824198439674873160, 0.824170123589805790, 0.824141805444312590, 0.824113485238465390, 0.824085162972334470, 0.824056838645990660, 0.824028512259504690, 0.824000183812947480, +0.823971853306389890, 0.823943520739902070, 0.823915186113555960, 0.823886849427421850, 0.823858510681570680, 0.823830169876073270, 0.823801827011000350, 0.823773482086422870, +0.823745135102411760, 0.823716786059037310, 0.823688434956371340, 0.823660081794484240, 0.823631726573446970, 0.823603369293330450, 0.823575009954205410, 0.823546648556142900, +0.823518285099213760, 0.823489919583488490, 0.823461552009038810, 0.823433182375935320, 0.823404810684248870, 0.823376436934050270, 0.823348061125410700, 0.823319683258400990, +0.823291303333091530, 0.823262921349554260, 0.823234537307859780, 0.823206151208078940, 0.823177763050282670, 0.823149372834542040, 0.823120980560927970, 0.823092586229511420, +0.823064189840363000, 0.823035791393554430, 0.823007390889156530, 0.822978988327240150, 0.822950583707876220, 0.822922177031135900, 0.822893768297090040, 0.822865357505809360, +0.822836944657365790, 0.822808529751829720, 0.822780112789272540, 0.822751693769764870, 0.822723272693378080, 0.822694849560183130, 0.822666424370250950, 0.822637997123652260, +0.822609567820459130, 0.822581136460742050, 0.822552703044572180, 0.822524267572020460, 0.822495830043158070, 0.822467390458056170, 0.822438948816785810, 0.822410505119417490, +0.822382059366023490, 0.822353611556674300, 0.822325161691441100, 0.822296709770394930, 0.822268255793607070, 0.822239799761148580, 0.822211341673090070, 0.822182881529503580, +0.822154419330460070, 0.822125955076030370, 0.822097488766285970, 0.822069020401297700, 0.822040549981136850, 0.822012077505874680, 0.821983602975581820, 0.821955126390330530, +0.821926647750191310, 0.821898167055235440, 0.821869684305534310, 0.821841199501158860, 0.821812712642180370, 0.821784223728669660, 0.821755732760698910, 0.821727239738338830, +0.821698744661660600, 0.821670247530735590, 0.821641748345634860, 0.821613247106429910, 0.821584743813191690, 0.821556238465991130, 0.821527731064900510, 0.821499221609990560, +0.821470710101332550, 0.821442196538997860, 0.821413680923057550, 0.821385163253583130, 0.821356643530645750, 0.821328121754316240, 0.821299597924666890, 0.821271072041768630, +0.821242544105692640, 0.821214014116510400, 0.821185482074292980, 0.821156947979111980, 0.821128411831038020, 0.821099873630143580, 0.821071333376499400, 0.821042791070176970, +0.821014246711247450, 0.820985700299782460, 0.820957151835853050, 0.820928601319530940, 0.820900048750886620, 0.820871494129992830, 0.820842937456920270, 0.820814378731740350, +0.820785817954524540, 0.820757255125344140, 0.820728690244270640, 0.820700123311375320, 0.820671554326729340, 0.820642983290404860, 0.820614410202472940, 0.820585835063004980, +0.820557257872072450, 0.820528678629746770, 0.820500097336099410, 0.820471513991201330, 0.820442928595124910, 0.820414341147941210, 0.820385751649721720, 0.820357160100537720, +0.820328566500460930, 0.820299970849562630, 0.820271373147914430, 0.820242773395587380, 0.820214171592653860, 0.820185567739184830, 0.820156961835252000, 0.820128353880926640, +0.820099743876280480, 0.820071131821384910, 0.820042517716311090, 0.820013901561131410, 0.819985283355916920, 0.819956663100739340, 0.819928040795670050, 0.819899416440780680, +0.819870790036142720, 0.819842161581827880, 0.819813531077907000, 0.819784898524452910, 0.819756263921536550, 0.819727627269229430, 0.819698988567603370, 0.819670347816729760, +0.819641705016680320, 0.819613060167526660, 0.819584413269339840, 0.819555764322192350, 0.819527113326155580, 0.819498460281301020, 0.819469805187700300, 0.819441148045425010, +0.819412488854546870, 0.819383827615137060, 0.819355164327268180, 0.819326498991011400, 0.819297831606438320, 0.819269162173620670, 0.819240490692630050, 0.819211817163538300, +0.819183141586417030, 0.819154463961337290, 0.819125784288372020, 0.819097102567592160, 0.819068418799069660, 0.819039732982876020, 0.819011045119083180, 0.818982355207762640, +0.818953663248986220, 0.818924969242825100, 0.818896273189352100, 0.818867575088638390, 0.818838874940755800, 0.818810172745775940, 0.818781468503770760, 0.818752762214811860, +0.818724053878970510, 0.818695343496319560, 0.818666631066930270, 0.818637916590874370, 0.818609200068223690, 0.818580481499050050, 0.818551760883425070, 0.818523038221420810, +0.818494313513108420, 0.818465586758560740, 0.818436857957849150, 0.818408127111045380, 0.818379394218221260, 0.818350659279448720, 0.818321922294799500, 0.818293183264344970, +0.818264442188157970, 0.818235699066309890, 0.818206953898872550, 0.818178206685917790, 0.818149457427517550, 0.818120706123743660, 0.818091952774668060, 0.818063197380362040, +0.818034439940898530, 0.818005680456348920, 0.817976918926785030, 0.817948155352278940, 0.817919389732902460, 0.817890622068727420, 0.817861852359825890, 0.817833080606269250, +0.817804306808130320, 0.817775530965480720, 0.817746753078392290, 0.817717973146936950, 0.817689191171186660, 0.817660407151213350, 0.817631621087088640, 0.817602832978885250, +0.817574042826674900, 0.817545250630529410, 0.817516456390520730, 0.817487660106720910, 0.817458861779202020, 0.817430061408035980, 0.817401258993294190, 0.817372454535049810, +0.817343648033374340, 0.817314839488339720, 0.817286028900017890, 0.817257216268481130, 0.817228401593801280, 0.817199584876050490, 0.817170766115300150, 0.817141945311623430, +0.817113122465091820, 0.817084297575777390, 0.817055470643752280, 0.817026641669088450, 0.816997810651858060, 0.816968977592132610, 0.816940142489985140, 0.816911305345487390, +0.816882466158711410, 0.816853624929729240, 0.816824781658613050, 0.816795936345434790, 0.816767088990266840, 0.816738239593180590, 0.816709388154249210, 0.816680534673544400, +0.816651679151138230, 0.816622821587102870, 0.816593961981510460, 0.816565100334433190, 0.816536236645942550, 0.816507370916111920, 0.816478503145012800, 0.816449633332717470, +0.816420761479298100, 0.816391887584826730, 0.816363011649375750, 0.816334133673017100, 0.816305253655822740, 0.816276371597865700, 0.816247487499217720, 0.816218601359951060, +0.816189713180137890, 0.816160822959850370, 0.816131930699160900, 0.816103036398141520, 0.816074140056864070, 0.816045241675401710, 0.816016341253826380, 0.815987438792210140, +0.815958534290625260, 0.815929627749144130, 0.815900719167838790, 0.815871808546781320, 0.815842895886044750, 0.815813981185700920, 0.815785064445822110, 0.815756145666480690, +0.815727224847748960, 0.815698301989699060, 0.815669377092403500, 0.815640450155933890, 0.815611521180363730, 0.815582590165764730, 0.815553657112209280, 0.815524722019769670, +0.815495784888518370, 0.815466845718527460, 0.815437904509869530, 0.815408961262616310, 0.815380015976841070, 0.815351068652615970, 0.815322119290013080, 0.815293167889105000, +0.815264214449963890, 0.815235258972662360, 0.815206301457272020, 0.815177341903866590, 0.815148380312517680, 0.815119416683297900, 0.815090451016279530, 0.815061483311535050, +0.815032513569136860, 0.815003541789157460, 0.814974567971668560, 0.814945592116743890, 0.814916614224455160, 0.814887634294874870, 0.814858652328075530, 0.814829668324129620, +0.814800682283109530, 0.814771694205087100, 0.814742704090136050, 0.814713711938328200, 0.814684717749736160, 0.814655721524432220, 0.814626723262488970, 0.814597722963978920, +0.814568720628974670, 0.814539716257547950, 0.814510709849772590, 0.814481701405720400, 0.814452690925463910, 0.814423678409075810, 0.814394663856628400, 0.814365647268194380, +0.814336628643846260, 0.814307607983655980, 0.814278585287697250, 0.814249560556042030, 0.814220533788762910, 0.814191504985932510, 0.814162474147623330, 0.814133441273907970, +0.814104406364858480, 0.814075369420548480, 0.814046330441050010, 0.814017289426435810, 0.813988246376778360, 0.813959201292150160, 0.813930154172624150, 0.813901105018272620, +0.813872053829167940, 0.813843000605383500, 0.813813945346991700, 0.813784888054064900, 0.813755828726675960, 0.813726767364897460, 0.813697703968802030, 0.813668638538461720, +0.813639571073950460, 0.813610501575340320, 0.813581430042703780, 0.813552356476113680, 0.813523280875642740, 0.813494203241363680, 0.813465123573348990, 0.813436041871670960, +0.813406958136403400, 0.813377872367618490, 0.813348784565388840, 0.813319694729787270, 0.813290602860886390, 0.813261508958759040, 0.813232413023477930, 0.813203315055115230, +0.813174215053744760, 0.813145113019438810, 0.813116008952270100, 0.813086902852311330, 0.813057794719635240, 0.813028684554314760, 0.812999572356421950, 0.812970458126030860, +0.812941341863213540, 0.812912223568042820, 0.812883103240591650, 0.812853980880932640, 0.812824856489138710, 0.812795730065282610, 0.812766601609436700, 0.812737471121674830, +0.812708338602069260, 0.812679204050692830, 0.812650067467618360, 0.812620928852918810, 0.812591788206666890, 0.812562645528935420, 0.812533500819796920, 0.812504354079325200, +0.812475205307592540, 0.812446054504671890, 0.812416901670636070, 0.812387746805558030, 0.812358589909510600, 0.812329430982566160, 0.812300270024798770, 0.812271107036280580, +0.812241942017084770, 0.812212774967283950, 0.812183605886951270, 0.812154434776159560, 0.812125261634981780, 0.812096086463490300, 0.812066909261759060, 0.812037730029860680, +0.812008548767867880, 0.811979365475853810, 0.811950180153891200, 0.811920992802053210, 0.811891803420412230, 0.811862612009042190, 0.811833418568015720, 0.811804223097405630, +0.811775025597284980, 0.811745826067726830, 0.811716624508804110, 0.811687420920589760, 0.811658215303156410, 0.811629007656577970, 0.811599797980927070, 0.811570586276276650, +0.811541372542699760, 0.811512156780269440, 0.811482938989058770, 0.811453719169140770, 0.811424497320587860, 0.811395273443474290, 0.811366047537872560, 0.811336819603855620, +0.811307589641496630, 0.811278357650868750, 0.811249123632044930, 0.811219887585097780, 0.811190649510101450, 0.811161409407128550, 0.811132167276252040, 0.811102923117545170, +0.811073676931080900, 0.811044428716932500, 0.811015178475173130, 0.810985926205875170, 0.810956671909112910, 0.810927415584958950, 0.810898157233486570, 0.810868896854768710, +0.810839634448878630, 0.810810370015889510, 0.810781103555874410, 0.810751835068906020, 0.810722564555058530, 0.810693292014404760, 0.810664017447017660, 0.810634740852970490, +0.810605462232336540, 0.810576181585188960, 0.810546898911600370, 0.810517614211644920, 0.810488327485395570, 0.810459038732925460, 0.810429747954307670, 0.810400455149615560, +0.810371160318922200, 0.810341863462300970, 0.810312564579824700, 0.810283263671567440, 0.810253960737602030, 0.810224655778001730, 0.810195348792839720, 0.810166039782189370, +0.810136728746123970, 0.810107415684716230, 0.810078100598040420, 0.810048783486169380, 0.810019464349176380, 0.809990143187134690, 0.809960820000117710, 0.809931494788198700, +0.809902167551450840, 0.809872838289947160, 0.809843507003761840, 0.809814173692967710, 0.809784838357638260, 0.809755500997846660, 0.809726161613666280, 0.809696820205170530, +0.809667476772432670, 0.809638131315525640, 0.809608783834523840, 0.809579434329499970, 0.809550082800527650, 0.809520729247680040, 0.809491373671030630, 0.809462016070652820, +0.809432656446619440, 0.809403294799004860, 0.809373931127882140, 0.809344565433324560, 0.809315197715405500, 0.809285827974198570, 0.809256456209776930, 0.809227082422214310, +0.809197706611583300, 0.809168328777958630, 0.809138948921413140, 0.809109567042020310, 0.809080183139853530, 0.809050797214986290, 0.809021409267492110, 0.808992019297444240, +0.808962627304915970, 0.808933233289981570, 0.808903837252714200, 0.808874439193187130, 0.808845039111473980, 0.808815637007648250, 0.808786232881783420, 0.808756826733952440, +0.808727418564229920, 0.808698008372688900, 0.808668596159402900, 0.808639181924445280, 0.808609765667889780, 0.808580347389809880, 0.808550927090279090, 0.808521504769370570, +0.808492080427158700, 0.808462654063716650, 0.808433225679117910, 0.808403795273436200, 0.808374362846744910, 0.808344928399117760, 0.808315491930627790, 0.808286053441349630, +0.808256612931356200, 0.808227170400721340, 0.808197725849518540, 0.808168279277821530, 0.808138830685703690, 0.808109380073238850, 0.808079927440499950, 0.808050472787561810, +0.808021016114497500, 0.807991557421380620, 0.807962096708284890, 0.807932633975283810, 0.807903169222451310, 0.807873702449860790, 0.807844233657585510, 0.807814762845700200, +0.807785290014277900, 0.807755815163392340, 0.807726338293117350, 0.807696859403526530, 0.807667378494693500, 0.807637895566691520, 0.807608410619595320, 0.807578923653478050, +0.807549434668413560, 0.807519943664475440, 0.807490450641737520, 0.807460955600273420, 0.807431458540156850, 0.807401959461461200, 0.807372458364261190, 0.807342955248629980, +0.807313450114641510, 0.807283942962369270, 0.807254433791887220, 0.807224922603269060, 0.807195409396588630, 0.807165894171919200, 0.807136376929335490, 0.807106857668910880, +0.807077336390719100, 0.807047813094833980, 0.807018287781329220, 0.806988760450278900, 0.806959231101756050, 0.806929699735835730, 0.806900166352591100, 0.806870630952096100, +0.806841093534424570, 0.806811554099650220, 0.806782012647846990, 0.806752469179088720, 0.806722923693448780, 0.806693376191002120, 0.806663826671821900, 0.806634275135982180, +0.806604721583556780, 0.806575166014619540, 0.806545608429244390, 0.806516048827504720, 0.806486487209475470, 0.806456923575229910, 0.806427357924842100, 0.806397790258385980, +0.806368220575935270, 0.806338648877564010, 0.806309075163346160, 0.806279499433355080, 0.806249921687665850, 0.806220341926351840, 0.806190760149486870, 0.806161176357145020, +0.806131590549400200, 0.806102002726326480, 0.806072412887997690, 0.806042821034487320, 0.806013227165870540, 0.805983631282220610, 0.805954033383611600, 0.805924433470117550, +0.805894831541812410, 0.805865227598770110, 0.805835621641064370, 0.805806013668769920, 0.805776403681960570, 0.805746791680710170, 0.805717177665092770, 0.805687561635182400, +0.805657943591053250, 0.805628323532779130, 0.805598701460433770, 0.805569077374092110, 0.805539451273827760, 0.805509823159714760, 0.805480193031827160, 0.805450560890239250, +0.805420926735024860, 0.805391290566257580, 0.805361652384012580, 0.805332012188363480, 0.805302369979384420, 0.805272725757149370, 0.805243079521732460, 0.805213431273207990, +0.805183781011649780, 0.805154128737131770, 0.805124474449728790, 0.805094818149514780, 0.805065159836563570, 0.805035499510949550, 0.805005837172746760, 0.804976172822029380, +0.804946506458871560, 0.804916838083347020, 0.804887167695530810, 0.804857495295496770, 0.804827820883318950, 0.804798144459071610, 0.804768466022828810, 0.804738785574664940, +0.804709103114653600, 0.804679418642869960, 0.804649732159387730, 0.804620043664281300, 0.804590353157624620, 0.804560660639492160, 0.804530966109958000, 0.804501269569096510, +0.804471571016981190, 0.804441870453687540, 0.804412167879289260, 0.804382463293860540, 0.804352756697475630, 0.804323048090208830, 0.804293337472134380, 0.804263624843326590, +0.804233910203859260, 0.804204193553807680, 0.804174474893245560, 0.804144754222247290, 0.804115031540887150, 0.804085306849239400, 0.804055580147378430, 0.804025851435377970, +0.803996120713313390, 0.803966387981258520, 0.803936653239287650, 0.803906916487475140, 0.803877177725895400, 0.803847436954622680, 0.803817694173731390, 0.803787949383295340, +0.803758202583389920, 0.803728453774088970, 0.803698702955466970, 0.803668950127598090, 0.803639195290556940, 0.803609438444417790, 0.803579679589254470, 0.803549918725142480, +0.803520155852155750, 0.803490390970368560, 0.803460624079855410, 0.803430855180690790, 0.803401084272948870, 0.803371311356704370, 0.803341536432031100, 0.803311759499004350, +0.803281980557698280, 0.803252199608187280, 0.803222416650545830, 0.803192631684848220, 0.803162844711169170, 0.803133055729582930, 0.803103264740163470, 0.803073471742986490, +0.803043676738125710, 0.803013879725655850, 0.802984080705651190, 0.802954279678186440, 0.802924476643335880, 0.802894671601173670, 0.802864864551775300, 0.802835055495214830, +0.802805244431566640, 0.802775431360905340, 0.802745616283305430, 0.802715799198841510, 0.802685980107588180, 0.802656159009619290, 0.802626335905010540, 0.802596510793835980, +0.802566683676170120, 0.802536854552087450, 0.802507023421662800, 0.802477190284970550, 0.802447355142085320, 0.802417517993081140, 0.802387678838033750, 0.802357837677017070, +0.802327994510105840, 0.802298149337374640, 0.802268302158898110, 0.802238452974750720, 0.802208601785006750, 0.802178748589741810, 0.802148893389029950, 0.802119036182945890, +0.802089176971564230, 0.802059315754959590, 0.802029452533206790, 0.801999587306380210, 0.801969720074554250, 0.801939850837804390, 0.801909979596205020, 0.801880106349830650, +0.801850231098755970, 0.801820353843055830, 0.801790474582804720, 0.801760593318076920, 0.801730710048948140, 0.801700824775492650, 0.801670937497785060, 0.801641048215900100, +0.801611156929912580, 0.801581263639897120, 0.801551368345928440, 0.801521471048080910, 0.801491571746430150, 0.801461670441050540, 0.801431767132016800, 0.801401861819403540, +0.801371954503285580, 0.801342045183737860, 0.801312133860835000, 0.801282220534651260, 0.801252305205262470, 0.801222387872742910, 0.801192468537167410, 0.801162547198610800, +0.801132623857147670, 0.801102698512853100, 0.801072771165801220, 0.801042841816068000, 0.801012910463727580, 0.800982977108855020, 0.800953041751524930, 0.800923104391812140, +0.800893165029791690, 0.800863223665538300, 0.800833280299126370, 0.800803334930631720, 0.800773387560128840, 0.800743438187692340, 0.800713486813397380, 0.800683533437318570, +0.800653578059530970, 0.800623620680109500, 0.800593661299128350, 0.800563699916663650, 0.800533736532789700, 0.800503771147581420, 0.800473803761113660, 0.800443834373461340, +0.800413862984699520, 0.800383889594902480, 0.800353914204146260, 0.800323936812505240, 0.800293957420054380, 0.800263976026868720, 0.800233992633022970, 0.800204007238592310, +0.800174019843651660, 0.800144030448275420, 0.800114039052539640, 0.800084045656518690, 0.800054050260287640, 0.800024052863921530, 0.799994053467495300, 0.799964052071083900, +0.799934048674761810, 0.799904043278605200, 0.799874035882688350, 0.799844026487086520, 0.799814015091874660, 0.799784001697127600, 0.799753986302920720, 0.799723968909328730, +0.799693949516426360, 0.799663928124289660, 0.799633904732993120, 0.799603879342611790, 0.799573851953220840, 0.799543822564895200, 0.799513791177710040, 0.799483757791740410, +0.799453722407060810, 0.799423685023747390, 0.799393645641874870, 0.799363604261518200, 0.799333560882752430, 0.799303515505652820, 0.799273468130294430, 0.799243418756751870, +0.799213367385101290, 0.799183314015417200, 0.799153258647774980, 0.799123201282249450, 0.799093141918916010, 0.799063080557849690, 0.799033017199125670, 0.799002951842818670, +0.798972884489004720, 0.798942815137758560, 0.798912743789155330, 0.798882670443270330, 0.798852595100178590, 0.798822517759955390, 0.798792438422675890, 0.798762357088414810, +0.798732273757248310, 0.798702188429251110, 0.798672101104498490, 0.798642011783065600, 0.798611920465027710, 0.798581827150460000, 0.798551731839437170, 0.798521634532035510, +0.798491535228329830, 0.798461433928395300, 0.798431330632307090, 0.798401225340140690, 0.798371118051971140, 0.798341008767873840, 0.798310897487923500, 0.798280784212196390, +0.798250668940767350, 0.798220551673711640, 0.798190432411104540, 0.798160311153021440, 0.798130187899537490, 0.798100062650727530, 0.798069935406667930, 0.798039806167433530, +0.798009674933099600, 0.797979541703741520, 0.797949406479434580, 0.797919269260254030, 0.797889130046275490, 0.797858988837573450, 0.797828845634224510, 0.797798700436303410, +0.797768553243885630, 0.797738404057046440, 0.797708252875861220, 0.797678099700405370, 0.797647944530754270, 0.797617787366982740, 0.797587628209167400, 0.797557467057382840, +0.797527303911704790, 0.797497138772208290, 0.797466971638969070, 0.797436802512062390, 0.797406631391563200, 0.797376458277547880, 0.797346283170091490, 0.797316106069269390, +0.797285926975156990, 0.797255745887829770, 0.797225562807363230, 0.797195377733832760, 0.797165190667313280, 0.797135001607881420, 0.797104810555612000, 0.797074617510580510, +0.797044422472862560, 0.797014225442533530, 0.796984026419668920, 0.796953825404343790, 0.796923622396634500, 0.796893417396616230, 0.796863210404364470, 0.796833001419954610, +0.796802790443462250, 0.796772577474963000, 0.796742362514532230, 0.796712145562245010, 0.796681926618177940, 0.796651705682406060, 0.796621482755004990, 0.796591257836050120, +0.796561030925617250, 0.796530802023781680, 0.796500571130619120, 0.796470338246204610, 0.796440103370614770, 0.796409866503924760, 0.796379627646209950, 0.796349386797546190, +0.796319143958008850, 0.796288899127673750, 0.796258652306615860, 0.796228403494911860, 0.796198152692636830, 0.796167899899866470, 0.796137645116676280, 0.796107388343141990, +0.796077129579339290, 0.796046868825343700, 0.796016606081230480, 0.795986341347076130, 0.795956074622956140, 0.795925805908945790, 0.795895535205121020, 0.795865262511557310, +0.795834987828330620, 0.795804711155516320, 0.795774432493189690, 0.795744151841427660, 0.795713869200305180, 0.795683584569897960, 0.795653297950281830, 0.795623009341532410, +0.795592718743725500, 0.795562426156936290, 0.795532131581241590, 0.795501835016716450, 0.795471536463436820, 0.795441235921478310, 0.795410933390916620, 0.795380628871827700, +0.795350322364287270, 0.795320013868370370, 0.795289703384154060, 0.795259390911713380, 0.795229076451124280, 0.795198760002462590, 0.795168441565803910, 0.795138121141224060, +0.795107798728798440, 0.795077474328603870, 0.795047147940715630, 0.795016819565209420, 0.794986489202161310, 0.794956156851646890, 0.794925822513742110, 0.794895486188522790, +0.794865147876064100, 0.794834807576443200, 0.794804465289735250, 0.794774121016016080, 0.794743774755361730, 0.794713426507847820, 0.794683076273550390, 0.794652724052545280, +0.794622369844907860, 0.794592013650714970, 0.794561655470042090, 0.794531295302965070, 0.794500933149559830, 0.794470569009902320, 0.794440202884068250, 0.794409834772133230, +0.794379464674174090, 0.794349092590266310, 0.794318718520485860, 0.794288342464908540, 0.794257964423610410, 0.794227584396667300, 0.794197202384155250, 0.794166818386149780, +0.794136432402727690, 0.794106044433964490, 0.794075654479936220, 0.794045262540718830, 0.794014868616388260, 0.793984472707020550, 0.793954074812691650, 0.793923674933477040, +0.793893273069453790, 0.793862869220697260, 0.793832463387283640, 0.793802055569288840, 0.793771645766788940, 0.793741233979859960, 0.793710820208577190, 0.793680404453018020, +0.793649986713257930, 0.793619566989372750, 0.793589145281438650, 0.793558721589531670, 0.793528295913727980, 0.793497868254103510, 0.793467438610733770, 0.793437006983696010, +0.793406573373065750, 0.793376137778919130, 0.793345700201332100, 0.793315260640380830, 0.793284819096141350, 0.793254375568689270, 0.793223930058101880, 0.793193482564454650, +0.793163033087823650, 0.793132581628285150, 0.793102128185915080, 0.793071672760789830, 0.793041215352985330, 0.793010755962577200, 0.792980294589642810, 0.792949831234257660, +0.792919365896497920, 0.792888898576439740, 0.792858429274159390, 0.792827957989732930, 0.792797484723236520, 0.792767009474745880, 0.792736532244338270, 0.792706053032089410, +0.792675571838075350, 0.792645088662372380, 0.792614603505056640, 0.792584116366204410, 0.792553627245891400, 0.792523136144194780, 0.792492643061190380, 0.792462147996954360, +0.792431650951562980, 0.792401151925092420, 0.792370650917619050, 0.792340147929219030, 0.792309642959968090, 0.792279136009943600, 0.792248627079221170, 0.792218116167877300, +0.792187603275988140, 0.792157088403629860, 0.792126571550878960, 0.792096052717811580, 0.792065531904503570, 0.792035009111032310, 0.792004484337473390, 0.791973957583903320, +0.791943428850398480, 0.791912898137034920, 0.791882365443889120, 0.791851830771036940, 0.791821294118555730, 0.791790755486521220, 0.791760214875009800, 0.791729672284097850, +0.791699127713861860, 0.791668581164377880, 0.791638032635722520, 0.791607482127971610, 0.791576929641202410, 0.791546375175490980, 0.791515818730913480, 0.791485260307546510, +0.791454699905466460, 0.791424137524749600, 0.791393573165471880, 0.791363006827710660, 0.791332438511542110, 0.791301868217042290, 0.791271295944287910, 0.791240721693355240, +0.791210145464320780, 0.791179567257261020, 0.791148987072251670, 0.791118404909370470, 0.791087820768693330, 0.791057234650296540, 0.791026646554256700, 0.790996056480650190, +0.790965464429553620, 0.790934870401043270, 0.790904274395195280, 0.790873676412087170, 0.790843076451794860, 0.790812474514394850, 0.790781870599963630, 0.790751264708577710, +0.790720656840313670, 0.790690046995247480, 0.790659435173456710, 0.790628821375017330, 0.790598205600005820, 0.790567587848498900, 0.790536968120572950, 0.790506346416304680, +0.790475722735770380, 0.790445097079046420, 0.790414469446210080, 0.790383839837337730, 0.790353208252505660, 0.790322574691790570, 0.790291939155269190, 0.790261301643017780, +0.790230662155113170, 0.790200020691631420, 0.790169377252650130, 0.790138731838245460, 0.790108084448493790, 0.790077435083472060, 0.790046783743256650, 0.790016130427924400, +0.789985475137551240, 0.789954817872214890, 0.789924158631991500, 0.789893497416957690, 0.789862834227190170, 0.789832169062765540, 0.789801501923760530, 0.789770832810251730, +0.789740161722315430, 0.789709488660029100, 0.789678813623469140, 0.789648136612712160, 0.789617457627834750, 0.789586776668913750, 0.789556093736025750, 0.789525408829247040, +0.789494721948655330, 0.789464033094326890, 0.789433342266338320, 0.789402649464766350, 0.789371954689687790, 0.789341257941179380, 0.789310559219317700, 0.789279858524179150, +0.789249155855841540, 0.789218451214381060, 0.789187744599874400, 0.789157036012398390, 0.789126325452029760, 0.789095612918845330, 0.789064898412921820, 0.789034181934335610, +0.789003463483164410, 0.788972743059484620, 0.788942020663372930, 0.788911296294906310, 0.788880569954161340, 0.788849841641214860, 0.788819111356143350, 0.788788379099024660, +0.788757644869934940, 0.788726908668951120, 0.788696170496149930, 0.788665430351608520, 0.788634688235403390, 0.788603944147611590, 0.788573198088309280, 0.788542450057574620, +0.788511700055483880, 0.788480948082113780, 0.788450194137541360, 0.788419438221843460, 0.788388680335097010, 0.788357920477378740, 0.788327158648765240, 0.788296394849334340, +0.788265629079162420, 0.788234861338326540, 0.788204091626903410, 0.788173319944970090, 0.788142546292603500, 0.788111770669879920, 0.788080993076877510, 0.788050213513672550, +0.788019431980342080, 0.787988648476963040, 0.787957863003612480, 0.787927075560367120, 0.787896286147304230, 0.787865494764499960, 0.787834701412032490, 0.787803906089978300, +0.787773108798414330, 0.787742309537417640, 0.787711508307065040, 0.787680705107433820, 0.787649899938600240, 0.787619092800642460, 0.787588283693636980, 0.787557472617660740, +0.787526659572790780, 0.787495844559104260, 0.787465027576678130, 0.787434208625589330, 0.787403387705914560, 0.787372564817731880, 0.787341739961117670, 0.787310913136149200, +0.787280084342903420, 0.787249253581457480, 0.787218420851888310, 0.787187586154273200, 0.787156749488688520, 0.787125910855212440, 0.787095070253921670, 0.787064227684893260, +0.787033383148204260, 0.787002536643931830, 0.786971688172152910, 0.786940837732944320, 0.786909985326384230, 0.786879130952549130, 0.786848274611516190, 0.786817416303362550, +0.786786556028165500, 0.786755693786001850, 0.786724829576949110, 0.786693963401083770, 0.786663095258483990, 0.786632225149226480, 0.786601353073388410, 0.786570479031047040, +0.786539603022279320, 0.786508725047162740, 0.786477845105773680, 0.786446963198190630, 0.786416079324490200, 0.786385193484749450, 0.786354305679045850, 0.786323415907456360, +0.786292524170058460, 0.786261630466929210, 0.786230734798145310, 0.786199837163785050, 0.786168937563925360, 0.786138035998643180, 0.786107132468016000, 0.786076226972120980, +0.786045319511035400, 0.786014410084836410, 0.785983498693600960, 0.785952585337407310, 0.785921670016332170, 0.785890752730452840, 0.785859833479846670, 0.785828912264590950, +0.785797989084762840, 0.785767063940439270, 0.785736136831698520, 0.785705207758617520, 0.785674276721273430, 0.785643343719743760, 0.785612408754105650, 0.785581471824436490, +0.785550532930813670, 0.785519592073314010, 0.785488649252015890, 0.785457704466996140, 0.785426757718332260, 0.785395809006101290, 0.785364858330380830, 0.785333905691248390, +0.785302951088781010, 0.785271994523055740, 0.785241035994151070, 0.785210075502143830, 0.785179113047111300, 0.785148148629131070, 0.785117182248280530, 0.785086213904636950, +0.785055243598277270, 0.785024271329279990, 0.784993297097722140, 0.784962320903681010, 0.784931342747234080, 0.784900362628458750, 0.784869380547432600, 0.784838396504232930, +0.784807410498936760, 0.784776422531622610, 0.784745432602367400, 0.784714440711248520, 0.784683446858343680, 0.784652451043730160, 0.784621453267485450, 0.784590453529686700, +0.784559451830412200, 0.784528448169739210, 0.784497442547745010, 0.784466434964507300, 0.784435425420103360, 0.784404413914611020, 0.784373400448107550, 0.784342385020670000, +0.784311367632377080, 0.784280348283305730, 0.784249326973533560, 0.784218303703138050, 0.784187278472196710, 0.784156251280787250, 0.784125222128987160, 0.784094191016873500, +0.784063157944524860, 0.784032122912018290, 0.784001085919431520, 0.783970046966841920, 0.783939006054327200, 0.783907963181965100, 0.783876918349832420, 0.783845871558008000, +0.783814822806569000, 0.783783772095592800, 0.783752719425157230, 0.783721664795339890, 0.783690608206218390, 0.783659549657870440, 0.783628489150372980, 0.783597426683804830, +0.783566362258243050, 0.783535295873765470, 0.783504227530449680, 0.783473157228373300, 0.783442084967613920, 0.783411010748249480, 0.783379934570356820, 0.783348856434014970, +0.783317776339301000, 0.783286694286292500, 0.783255610275067290, 0.783224524305703110, 0.783193436378277540, 0.783162346492867870, 0.783131254649552910, 0.783100160848409830, +0.783069065089516240, 0.783037967372950060, 0.783006867698789020, 0.782975766067110720, 0.782944662477992990, 0.782913556931513100, 0.782882449427749870, 0.782851339966780580, +0.782820228548682830, 0.782789115173534560, 0.782757999841413480, 0.782726882552397420, 0.782695763306563650, 0.782664642103991000, 0.782633518944756630, 0.782602393828938590, +0.782571266756614480, 0.782540137727862350, 0.782509006742759690, 0.782477873801384670, 0.782446738903814330, 0.782415602050127720, 0.782384463240402010, 0.782353322474715230, +0.782322179753145220, 0.782291035075769690, 0.782259888442666470, 0.782228739853913610, 0.782197589309588380, 0.782166436809769720, 0.782135282354535000, 0.782104125943962060, +0.782072967578128720, 0.782041807257113030, 0.782010644980992820, 0.781979480749845470, 0.781948314563749910, 0.781917146422783650, 0.781885976327024390, 0.781854804276550300, +0.781823630271439200, 0.781792454311769030, 0.781761276397617610, 0.781730096529062560, 0.781698914706182800, 0.781667730929055730, 0.781636545197759270, 0.781605357512371590, +0.781574167872970400, 0.781542976279633870, 0.781511782732439820, 0.781480587231465850, 0.781449389776790900, 0.781418190368492470, 0.781386989006648710, 0.781355785691337350, +0.781324580422636530, 0.781293373200624200, 0.781262164025377960, 0.781230952896976860, 0.781199739815498400, 0.781168524781020500, 0.781137307793621450, 0.781106088853378950, +0.781074867960371400, 0.781043645114676500, 0.781012420316372080, 0.780981193565537080, 0.780949964862249100, 0.780918734206586310, 0.780887501598626520, 0.780856267038448130, +0.780825030526128950, 0.780793792061746710, 0.780762551645380550, 0.780731309277107990, 0.780700064957007170, 0.780668818685156250, 0.780637570461633180, 0.780606320286516220, +0.780575068159883420, 0.780543814081812390, 0.780512558052382510, 0.780481300071671160, 0.780450040139756500, 0.780418778256716790, 0.780387514422630100, 0.780356248637574690, +0.780324980901628610, 0.780293711214869570, 0.780262439577376730, 0.780231165989227820, 0.780199890450501090, 0.780168612961274490, 0.780137333521626400, 0.780106052131635090, +0.780074768791377940, 0.780043483500934550, 0.780012196260382320, 0.779980907069799720, 0.779949615929264820, 0.779918322838855870, 0.779887027798651040, 0.779855730808728720, +0.779824431869166500, 0.779793130980043770, 0.779761828141438240, 0.779730523353428070, 0.779699216616091650, 0.779667907929507240, 0.779636597293752900, 0.779605284708907220, +0.779573970175047700, 0.779542653692253840, 0.779511335260603230, 0.779480014880174380, 0.779448692551045540, 0.779417368273294890, 0.779386042047000900, 0.779354713872241200, +0.779323383749095270, 0.779292051677640820, 0.779260717657956350, 0.779229381690120020, 0.779198043774210310, 0.779166703910305400, 0.779135362098483770, 0.779104018338823150, +0.779072672631403120, 0.779041324976301300, 0.779009975373596290, 0.778978623823366250, 0.778947270325689670, 0.778915914880644930, 0.778884557488309760, 0.778853198148763860, +0.778821836862084950, 0.778790473628351410, 0.778759108447641730, 0.778727741320034310, 0.778696372245607390, 0.778665001224439710, 0.778633628256608870, 0.778602253342194570, +0.778570876481274540, 0.778539497673927490, 0.778508116920231590, 0.778476734220265420, 0.778445349574107380, 0.778413962981835960, 0.778382574443529100, 0.778351183959266390, +0.778319791529125670, 0.778288397153185430, 0.778257000831524270, 0.778225602564220690, 0.778194202351352950, 0.778162800192999220, 0.778131396089239090, 0.778099990040150400, +0.778068582045811750, 0.778037172106301630, 0.778005760221698540, 0.777974346392081180, 0.777942930617527840, 0.777911512898116660, 0.777880093233927260, 0.777848671625037680, +0.777817248071526300, 0.777785822573471840, 0.777754395130952900, 0.777722965744047980, 0.777691534412835010, 0.777660101137393700, 0.777628665917802220, 0.777597228754139060, +0.777565789646482930, 0.777534348594912220, 0.777502905599505630, 0.777471460660341900, 0.777440013777498830, 0.777408564951056260, 0.777377114181092340, 0.777345661467685690, +0.777314206810914790, 0.777282750210858460, 0.777251291667595210, 0.777219831181203750, 0.777188368751762120, 0.777156904379350140, 0.777125438064045880, 0.777093969805928040, +0.777062499605075230, 0.777031027461566270, 0.776999553375479660, 0.776968077346893660, 0.776936599375887990, 0.776905119462540820, 0.776873637606930960, 0.776842153809136900, +0.776810668069237490, 0.776779180387311310, 0.776747690763437300, 0.776716199197693520, 0.776684705690159680, 0.776653210240914160, 0.776621712850035560, 0.776590213517602820, +0.776558712243694440, 0.776527209028389230, 0.776495703871766030, 0.776464196773903100, 0.776432687734880170, 0.776401176754775490, 0.776369663833667900, 0.776338148971636110, +0.776306632168759060, 0.776275113425115350, 0.776243592740783250, 0.776212070115842810, 0.776180545550372190, 0.776149019044450220, 0.776117490598155600, 0.776085960211567390, +0.776054427884764200, 0.776022893617824950, 0.775991357410827920, 0.775959819263853050, 0.775928279176978600, 0.775896737150283510, 0.775865193183846500, 0.775833647277746620, +0.775802099432062580, 0.775770549646872640, 0.775738997922256980, 0.775707444258293850, 0.775675888655061980, 0.775644331112640530, 0.775612771631108200, 0.775581210210543940, +0.775549646851026670, 0.775518081552634690, 0.775486514315448020, 0.775454945139545160, 0.775423374025004940, 0.775391800971906190, 0.775360225980328050, 0.775328649050349260, +0.775297070182048850, 0.775265489375505210, 0.775233906630798500, 0.775202321948006980, 0.775170735327209590, 0.775139146768485390, 0.775107556271913300, 0.775075963837572380, +0.775044369465541010, 0.775012773155899230, 0.774981174908725530, 0.774949574724098870, 0.774917972602098270, 0.774886368542802790, 0.774854762546291380, 0.774823154612642950, +0.774791544741936230, 0.774759932934251160, 0.774728319189666230, 0.774696703508260480, 0.774665085890112960, 0.774633466335302830, 0.774601844843908930, 0.774570221416010510, +0.774538596051685960, 0.774506968751015430, 0.774475339514077430, 0.774443708340951220, 0.774412075231715620, 0.774380440186449910, 0.774348803205233030, 0.774317164288143680, +0.774285523435261910, 0.774253880646666340, 0.774222235922436110, 0.774190589262650270, 0.774158940667387880, 0.774127290136728210, 0.774095637670750290, 0.774063983269532740, +0.774032326933155820, 0.774000668661698030, 0.773969008455238640, 0.773937346313856580, 0.773905682237631340, 0.773874016226641760, 0.773842348280966650, 0.773810678400686180, +0.773779006585879060, 0.773747332836624450, 0.773715657153001390, 0.773683979535089270, 0.773652299982967250, 0.773620618496714370, 0.773588935076409470, 0.773557249722132690, +0.773525562433962870, 0.773493873211979150, 0.773462182056260720, 0.773430488966886820, 0.773398793943936740, 0.773367096987489620, 0.773335398097624300, 0.773303697274420940, +0.773271994517958360, 0.773240289828315830, 0.773208583205572510, 0.773176874649807780, 0.773145164161100910, 0.773113451739530500, 0.773081737385177050, 0.773050021098119270, +0.773018302878436430, 0.772986582726207790, 0.772954860641512750, 0.772923136624430570, 0.772891410675040410, 0.772859682793421320, 0.772827952979653570, 0.772796221233815860, +0.772764487555987590, 0.772732751946248130, 0.772701014404676870, 0.772669274931352960, 0.772637533526356000, 0.772605790189764500, 0.772574044921659150, 0.772542297722118690, +0.772510548591222480, 0.772478797529049910, 0.772447044535680360, 0.772415289611193100, 0.772383532755667180, 0.772351773969182980, 0.772320013251819200, 0.772288250603655580, +0.772256486024771150, 0.772224719515245630, 0.772192951075158280, 0.772161180704588610, 0.772129408403615320, 0.772097634172319140, 0.772065858010778870, 0.772034079919073910, +0.772002299897283860, 0.771970517945487880, 0.771938734063765790, 0.771906948252196190, 0.771875160510859800, 0.771843370839835560, 0.771811579239202850, 0.771779785709041160, +0.771747990249430080, 0.771716192860449010, 0.771684393542177440, 0.771652592294694300, 0.771620789118080300, 0.771588984012414270, 0.771557176977775820, 0.771525368014244430, +0.771493557121899600, 0.771461744300820820, 0.771429929551087800, 0.771398112872779260, 0.771366294265976140, 0.771334473730757140, 0.771302651267202100, 0.771270826875390390, +0.771239000555401510, 0.771207172307315280, 0.771175342131210420, 0.771143510027167860, 0.771111675995266530, 0.771079840035585940, 0.771048002148205790, 0.771016162333205690, +0.770984320590665130, 0.770952476920663710, 0.770920631323280590, 0.770888783798596490, 0.770856934346690450, 0.770825082967641960, 0.770793229661530850, 0.770761374428436620, +0.770729517268438970, 0.770697658181617510, 0.770665797168051390, 0.770633934227821340, 0.770602069361006390, 0.770570202567686380, 0.770538333847940790, 0.770506463201849350, +0.770474590629491750, 0.770442716130947170, 0.770410839706296310, 0.770378961355618340, 0.770347081078992970, 0.770315198876499910, 0.770283314748218870, 0.770251428694229580, +0.770219540714611630, 0.770187650809444290, 0.770155758978808500, 0.770123865222783200, 0.770091969541448210, 0.770060071934883350, 0.770028172403168340, 0.769996270946382790, +0.769964367564606180, 0.769932462257919110, 0.769900555026400870, 0.769868645870131260, 0.769836734789190010, 0.769804821783656950, 0.769772906853611880, 0.769740989999134430, +0.769709071220303960, 0.769677150517201540, 0.769645227889906080, 0.769613303338497530, 0.769581376863055830, 0.769549448463660690, 0.769517518140391930, 0.769485585893329270, +0.769453651722552090, 0.769421715628141430, 0.769389777610176460, 0.769357837668737000, 0.769325895803902980, 0.769293952015754230, 0.769262006304370580, 0.769230058669831410, +0.769198109112217640, 0.769166157631608560, 0.769134204228084100, 0.769102248901724070, 0.769070291652608540, 0.769038332480817210, 0.769006371386430020, 0.768974408369526460, +0.768942443430187250, 0.768910476568492100, 0.768878507784520710, 0.768846537078353040, 0.768814564450069020, 0.768782589899748570, 0.768750613427471090, 0.768718635033317720, +0.768686654717367630, 0.768654672479700980, 0.768622688320397710, 0.768590702239537630, 0.768558714237200790, 0.768526724313467250, 0.768494732468416260, 0.768462738702129000, +0.768430743014684950, 0.768398745406163930, 0.768366745876646220, 0.768334744426211520, 0.768302741054940010, 0.768270735762911610, 0.768238728550205810, 0.768206719416903770, +0.768174708363084880, 0.768142695388829290, 0.768110680494216940, 0.768078663679327870, 0.768046644944242240, 0.768014624289039330, 0.767982601713800390, 0.767950577218605050, +0.767918550803533220, 0.767886522468665070, 0.767854492214080530, 0.767822460039859770, 0.767790425946082930, 0.767758389932829300, 0.767726352000180470, 0.767694312148215600, +0.767662270377015070, 0.767630226686658810, 0.767598181077226990, 0.767566133548799660, 0.767534084101457070, 0.767502032735278620, 0.767469979450345790, 0.767437924246737960, +0.767405867124535180, 0.767373808083817940, 0.767341747124666070, 0.767309684247159840, 0.767277619451378850, 0.767245552737404360, 0.767213484105315980, 0.767181413555193980, +0.767149341087118300, 0.767117266701169420, 0.767085190397427290, 0.767053112175972160, 0.767021032036883770, 0.766988949980243250, 0.766956866006130440, 0.766924780114625390, +0.766892692305808480, 0.766860602579759850, 0.766828510936559680, 0.766796417376287560, 0.766764321899025100, 0.766732224504851790, 0.766700125193847890, 0.766668023966093680, +0.766635920821669540, 0.766603815760655500, 0.766571708783131860, 0.766539599889178410, 0.766507489078876560, 0.766475376352306000, 0.766443261709547020, 0.766411145150679870, +0.766379026675784840, 0.766346906284942180, 0.766314783978232380, 0.766282659755734950, 0.766250533617531480, 0.766218405563701690, 0.766186275594325950, 0.766154143709484430, +0.766122009909257500, 0.766089874193725650, 0.766057736562968490, 0.766025597017067630, 0.765993455556102650, 0.765961312180154060, 0.765929166889302240, 0.765897019683627560, +0.765864870563210290, 0.765832719528130810, 0.765800566578468960, 0.765768411714306320, 0.765736254935722620, 0.765704096242798230, 0.765671935635613640, 0.765639773114249240, +0.765607608678785300, 0.765575442329302520, 0.765543274065880410, 0.765511103888600770, 0.765478931797543340, 0.765446757792788590, 0.765414581874416910, 0.765382404042508790, +0.765350224297144610, 0.765318042638404420, 0.765285859066369590, 0.765253673581120180, 0.765221486182736670, 0.765189296871299220, 0.765157105646888660, 0.765124912509585360, +0.765092717459469720, 0.765060520496621770, 0.765028321621123110, 0.764996120833053570, 0.764963918132493760, 0.764931713519524160, 0.764899506994225260, 0.764867298556677570, +0.764835088206961110, 0.764802875945157500, 0.764770661771346670, 0.764738445685609220, 0.764706227688025650, 0.764674007778676450, 0.764641785957642320, 0.764609562225003650, +0.764577336580840480, 0.764545109025234650, 0.764512879558265970, 0.764480648180015150, 0.764448414890562700, 0.764416179689989210, 0.764383942578375160, 0.764351703555801400, +0.764319462622347730, 0.764287219778095990, 0.764254975023126230, 0.764222728357519030, 0.764190479781355010, 0.764158229294714770, 0.764125976897678920, 0.764093722590327600, +0.764061466372742530, 0.764029208245003870, 0.763996948207192110, 0.763964686259387960, 0.763932422401672140, 0.763900156634125250, 0.763867888956828000, 0.763835619369860440, +0.763803347873304390, 0.763771074467239910, 0.763738799151747920, 0.763706521926908800, 0.763674242792803380, 0.763641961749512380, 0.763609678797116500, 0.763577393935695790, +0.763545107165332190, 0.763512818486105860, 0.763480527898097390, 0.763448235401387730, 0.763415940996057360, 0.763383644682187220, 0.763351346459857360, 0.763319046329149710, +0.763286744290144540, 0.763254440342922340, 0.763222134487564150, 0.763189826724150590, 0.763157517052762470, 0.763125205473480510, 0.763092891986385080, 0.763060576591557900, +0.763028259289079360, 0.762995940079030040, 0.762963618961490900, 0.762931295936542850, 0.762898971004266400, 0.762866644164742040, 0.762834315418051690, 0.762801984764275410, +0.762769652203494240, 0.762737317735789010, 0.762704981361240320, 0.762672643079929320, 0.762640302891936630, 0.762607960797342720, 0.762575616796229430, 0.762543270888677020, +0.762510923074766530, 0.762478573354578690, 0.762446221728194430, 0.762413868195694570, 0.762381512757160040, 0.762349155412671230, 0.762316796162310070, 0.762284435006156950, +0.762252071944292680, 0.762219706976798190, 0.762187340103754550, 0.762154971325242570, 0.762122600641342520, 0.762090228052136550, 0.762057853557704950, 0.762025477158128850, +0.761993098853488980, 0.761960718643866390, 0.761928336529342000, 0.761895952509996640, 0.761863566585911030, 0.761831178757166990, 0.761798789023845010, 0.761766397386026030, +0.761734003843791090, 0.761701608397221120, 0.761669211046397180, 0.761636811791400080, 0.761604410632310550, 0.761572007569210400, 0.761539602602180340, 0.761507195731301320, +0.761474786956654160, 0.761442376278320120, 0.761409963696380140, 0.761377549210914720, 0.761345132822005890, 0.761312714529734260, 0.761280294334180980, 0.761247872235426780, +0.761215448233553030, 0.761183022328640550, 0.761150594520770610, 0.761118164810023590, 0.761085733196481650, 0.761053299680225500, 0.761020864261336080, 0.760988426939894440, +0.760955987715981720, 0.760923546589679090, 0.760891103561067040, 0.760858658630227720, 0.760826211797241750, 0.760793763062190380, 0.760761312425154430, 0.760728859886215300, +0.760696405445454030, 0.760663949102951760, 0.760631490858789010, 0.760599030713048130, 0.760566568665809630, 0.760534104717154770, 0.760501638867164600, 0.760469171115920270, +0.760436701463503170, 0.760404229909994230, 0.760371756455474060, 0.760339281100025130, 0.760306803843728060, 0.760274324686664000, 0.760241843628914000, 0.760209360670559550, +0.760176875811681580, 0.760144389052360920, 0.760111900392679730, 0.760079409832718930, 0.760046917372559580, 0.760014423012282950, 0.759981926751970180, 0.759949428591702670, +0.759916928531561560, 0.759884426571627470, 0.759851922711982990, 0.759819416952708710, 0.759786909293885810, 0.759754399735595780, 0.759721888277919640, 0.759689374920938800, +0.759656859664733950, 0.759624342509387480, 0.759591823454980220, 0.759559302501593430, 0.759526779649308370, 0.759494254898206210, 0.759461728248368550, 0.759429199699876540, +0.759396669252811020, 0.759364136907254350, 0.759331602663287360, 0.759299066520991330, 0.759266528480447620, 0.759233988541737630, 0.759201446704942610, 0.759168902970144050, +0.759136357337422680, 0.759103809806860870, 0.759071260378539670, 0.759038709052540230, 0.759006155828944040, 0.758973600707832490, 0.758941043689286830, 0.758908484773388130, +0.758875923960218750, 0.758843361249859520, 0.758810796642391930, 0.758778230137897250, 0.758745661736457080, 0.758713091438152800, 0.758680519243065680, 0.758647945151276760, +0.758615369162868540, 0.758582791277921940, 0.758550211496518360, 0.758517629818739160, 0.758485046244665950, 0.758452460774380110, 0.758419873407963130, 0.758387284145495830, +0.758354692987060930, 0.758322099932739360, 0.758289504982612490, 0.758256908136761830, 0.758224309395268970, 0.758191708758215290, 0.758159106225681720, 0.758126501797750980, +0.758093895474504120, 0.758061287256022400, 0.758028677142387530, 0.757996065133680900, 0.757963451229984100, 0.757930835431378740, 0.757898217737945630, 0.757865598149767620, +0.757832976666925620, 0.757800353289501130, 0.757767728017575750, 0.757735100851231080, 0.757702471790548620, 0.757669840835609510, 0.757637207986496250, 0.757604573243290110, +0.757571936606072470, 0.757539298074924930, 0.757506657649929190, 0.757474015331166760, 0.757441371118719340, 0.757408725012667980, 0.757376077013095280, 0.757343427120082400, +0.757310775333711050, 0.757278121654062720, 0.757245466081219010, 0.757212808615261630, 0.757180149256272310, 0.757147488004331960, 0.757114824859523640, 0.757082159821928060, +0.757049492891627150, 0.757016824068702520, 0.756984153353235770, 0.756951480745308710, 0.756918806245002410, 0.756886129852399670, 0.756853451567581550, 0.756820771390629750, +0.756788089321626110, 0.756755405360652110, 0.756722719507789470, 0.756690031763120220, 0.756657342126725970, 0.756624650598688330, 0.756591957179088780, 0.756559261868009590, +0.756526564665532360, 0.756493865571738590, 0.756461164586709870, 0.756428461710528580, 0.756395756943276100, 0.756363050285034030, 0.756330341735884540, 0.756297631295909210, +0.756264918965189770, 0.756232204743807810, 0.756199488631845610, 0.756166770629384640, 0.756134050736506860, 0.756101328953293520, 0.756068605279827220, 0.756035879716189460, +0.756003152262461840, 0.755970422918726180, 0.755937691685064750, 0.755904958561559040, 0.755872223548290980, 0.755839486645341950, 0.755806747852794670, 0.755774007170730400, +0.755741264599231190, 0.755708520138378530, 0.755675773788254790, 0.755643025548941690, 0.755610275420520620, 0.755577523403074270, 0.755544769496684140, 0.755512013701431950, +0.755479256017399510, 0.755446496444669210, 0.755413734983322760, 0.755380971633441870, 0.755348206395108250, 0.755315439268404390, 0.755282670253412000, 0.755249899350212920, +0.755217126558888730, 0.755184351879522150, 0.755151575312194570, 0.755118796856988130, 0.755086016513984330, 0.755053234283265870, 0.755020450164914260, 0.754987664159011200, +0.754954876265639400, 0.754922086484880350, 0.754889294816815990, 0.754856501261528260, 0.754823705819099410, 0.754790908489611390, 0.754758109273146130, 0.754725308169785230, +0.754692505179611390, 0.754659700302706240, 0.754626893539151910, 0.754594084889030010, 0.754561274352423260, 0.754528461929413250, 0.754495647620082140, 0.754462831424511540, +0.754430013342784140, 0.754397193374981790, 0.754364371521186180, 0.754331547781479930, 0.754298722155944730, 0.754265894644662760, 0.754233065247715830, 0.754200233965186430, +0.754167400797156500, 0.754134565743708070, 0.754101728804922880, 0.754068889980883730, 0.754036049271672340, 0.754003206677370750, 0.753970362198060910, 0.753937515833825510, +0.753904667584746280, 0.753871817450905370, 0.753838965432384600, 0.753806111529266690, 0.753773255741633560, 0.753740398069567270, 0.753707538513149760, 0.753674677072463610, +0.753641813747590760, 0.753608948538613150, 0.753576081445613500, 0.753543212468673510, 0.753510341607875560, 0.753477468863301470, 0.753444594235033960, 0.753411717723155070, +0.753378839327746740, 0.753345959048891120, 0.753313076886670820, 0.753280192841167870, 0.753247306912464440, 0.753214419100642460, 0.753181529405784760, 0.753148637827973140, +0.753115744367290010, 0.753082849023817280, 0.753049951797637560, 0.753017052688833120, 0.752984151697485670, 0.752951248823678140, 0.752918344067492470, 0.752885437429010930, +0.752852528908315550, 0.752819618505489060, 0.752786706220613610, 0.752753792053771350, 0.752720876005044340, 0.752687958074515500, 0.752655038262266650, 0.752622116568380290, +0.752589192992938250, 0.752556267536023670, 0.752523340197718270, 0.752490410978104650, 0.752457479877264630, 0.752424546895281150, 0.752391612032236370, 0.752358675288212320, +0.752325736663291830, 0.752292796157556950, 0.752259853771090060, 0.752226909503973310, 0.752193963356289630, 0.752161015328120960, 0.752128065419549800, 0.752095113630658170, +0.752062159961529030, 0.752029204412244520, 0.751996246982886920, 0.751963287673538480, 0.751930326484282150, 0.751897363415199970, 0.751864398466374320, 0.751831431637887460, +0.751798462929822220, 0.751765492342260980, 0.751732519875285550, 0.751699545528979220, 0.751666569303424010, 0.751633591198702320, 0.751600611214896410, 0.751567629352089320, +0.751534645610363090, 0.751501659989800120, 0.751468672490482880, 0.751435683112494200, 0.751402691855916350, 0.751369698720831810, 0.751336703707322640, 0.751303706815471980, +0.751270708045362110, 0.751237707397075520, 0.751204704870694240, 0.751171700466301660, 0.751138694183979600, 0.751105686023811000, 0.751072675985877790, 0.751039664070263240, +0.751006650277049490, 0.750973634606318940, 0.750940617058154510, 0.750907597632638480, 0.750874576329853440, 0.750841553149881770, 0.750808528092806520, 0.750775501158709830, +0.750742472347674550, 0.750709441659782590, 0.750676409095117460, 0.750643374653761300, 0.750610338335796710, 0.750577300141305860, 0.750544260070372230, 0.750511218123077860, +0.750478174299505470, 0.750445128599737330, 0.750412081023856700, 0.750379031571945740, 0.750345980244087050, 0.750312927040363680, 0.750279871960857990, 0.750246815005652600, +0.750213756174829880, 0.750180695468473100, 0.750147632886664530, 0.750114568429486870, 0.750081502097022510, 0.750048433889354720, 0.750015363806565860, 0.749982291848738440, +0.749949218015955150, 0.749916142308299060, 0.749883064725852640, 0.749849985268698500, 0.749816903936919240, 0.749783820730597910, 0.749750735649816980, 0.749717648694659070, +0.749684559865207210, 0.749651469161543900, 0.749618376583752080, 0.749585282131914000, 0.749552185806112830, 0.749519087606431380, 0.749485987532952150, 0.749452885585757620, +0.749419781764931290, 0.749386676070555310, 0.749353568502712840, 0.749320459061486030, 0.749287347746958490, 0.749254234559212470, 0.749221119498330920, 0.749188002564396220, +0.749154883757491840, 0.749121763077700180, 0.749088640525104270, 0.749055516099786270, 0.749022389801830000, 0.748989261631317630, 0.748956131588331740, 0.748922999672955950, +0.748889865885272510, 0.748856730225364590, 0.748823592693314440, 0.748790453289205570, 0.748757312013120680, 0.748724168865142480, 0.748691023845353460, 0.748657876953837230, +0.748624728190676380, 0.748591577555953620, 0.748558425049751670, 0.748525270672153910, 0.748492114423243040, 0.748458956303101890, 0.748425796311813050, 0.748392634449459910, +0.748359470716125300, 0.748326305111891690, 0.748293137636842580, 0.748259968291060670, 0.748226797074628800, 0.748193623987629670, 0.748160449030146670, 0.748127272202262720, +0.748094093504060530, 0.748060912935622710, 0.748027730497032970, 0.747994546188373910, 0.747961360009728570, 0.747928171961179440, 0.747894982042810240, 0.747861790254703450, +0.747828596596942340, 0.747795401069609290, 0.747762203672788120, 0.747729004406561430, 0.747695803271012040, 0.747662600266223330, 0.747629395392278130, 0.747596188649259360, +0.747562980037249970, 0.747529769556333320, 0.747496557206592360, 0.747463342988109900, 0.747430126900968880, 0.747396908945252790, 0.747363689121044340, 0.747330467428426680, +0.747297243867482750, 0.747264018438295820, 0.747230791140948920, 0.747197561975525000, 0.747164330942106880, 0.747131098040778370, 0.747097863271621980, 0.747064626634720620, +0.747031388130158010, 0.746998147758016980, 0.746964905518380570, 0.746931661411331490, 0.746898415436953680, 0.746865167595329730, 0.746831917886543020, 0.746798666310676150, +0.746765412867812840, 0.746732157558036120, 0.746698900381428830, 0.746665641338074120, 0.746632380428055580, 0.746599117651456030, 0.746565853008358760, 0.746532586498846570, +0.746499318123003190, 0.746466047880911530, 0.746432775772654770, 0.746399501798315710, 0.746366225957978190, 0.746332948251725140, 0.746299668679639370, 0.746266387241804830, +0.746233103938304220, 0.746199818769220920, 0.746166531734637760, 0.746133242834638550, 0.746099952069306240, 0.746066659438724080, 0.746033364942974900, 0.746000068582142630, +0.745966770356310200, 0.745933470265560890, 0.745900168309977630, 0.745866864489644120, 0.745833558804643530, 0.745800251255059000, 0.745766941840973590, 0.745733630562471110, +0.745700317419634610, 0.745667002412546910, 0.745633685541292060, 0.745600366805952990, 0.745567046206613070, 0.745533723743355140, 0.745500399416263230, 0.745467073225420270, +0.745433745170909770, 0.745400415252814420, 0.745367083471218490, 0.745333749826204710, 0.745300414317856760, 0.745267076946257270, 0.745233737711490480, 0.745200396613639350, +0.745167053652787240, 0.745133708829017190, 0.745100362142413150, 0.745067013593058160, 0.745033663181035370, 0.745000310906428710, 0.744966956769321340, 0.744933600769796530, +0.744900242907937440, 0.744866883183827990, 0.744833521597551450, 0.744800158149190980, 0.744766792838829850, 0.744733425666552100, 0.744700056632440770, 0.744666685736579240, +0.744633312979050670, 0.744599938359939210, 0.744566561879327790, 0.744533183537300140, 0.744499803333939060, 0.744466421269328830, 0.744433037343552590, 0.744399651556693740, +0.744366263908835420, 0.744332874400061790, 0.744299483030455900, 0.744266089800101120, 0.744232694709081380, 0.744199297757479840, 0.744165898945380100, 0.744132498272865320, +0.744099095740019530, 0.744065691346926020, 0.744032285093668370, 0.743998876980329630, 0.743965467006994060, 0.743932055173744720, 0.743898641480665310, 0.743865225927838990, +0.743831808515349910, 0.743798389243281340, 0.743764968111716660, 0.743731545120739470, 0.743698120270433580, 0.743664693560882380, 0.743631264992169250, 0.743597834564378110, +0.743564402277592570, 0.743530968131895900, 0.743497532127371570, 0.743464094264103540, 0.743430654542175500, 0.743397212961670720, 0.743363769522672580, 0.743330324225265350, +0.743296877069532290, 0.743263428055557120, 0.743229977183422990, 0.743196524453214270, 0.743163069865014240, 0.743129613418906490, 0.743096155114974510, 0.743062694953302350, +0.743029232933973380, 0.742995769057071210, 0.742962303322679760, 0.742928835730882640, 0.742895366281763340, 0.742861894975405450, 0.742828421811893010, 0.742794946791309640, +0.742761469913738810, 0.742727991179264020, 0.742694510587969540, 0.742661028139938840, 0.742627543835255530, 0.742594057674003110, 0.742560569656265710, 0.742527079782127060, +0.742493588051670650, 0.742460094464979850, 0.742426599022139260, 0.742393101723232140, 0.742359602568341990, 0.742326101557553080, 0.742292598690948880, 0.742259093968613340, +0.742225587390629600, 0.742192078957082280, 0.742158568668054740, 0.742125056523630810, 0.742091542523893870, 0.742058026668928390, 0.742024508958817890, 0.741990989393646050, +0.741957467973496490, 0.741923944698453570, 0.741890419568600800, 0.741856892584021880, 0.741823363744800510, 0.741789833051020970, 0.741756300502766970, 0.741722766100122110, +0.741689229843170090, 0.741655691731995300, 0.741622151766681230, 0.741588609947311460, 0.741555066273970610, 0.741521520746741940, 0.741487973365709600, 0.741454424130956860, +0.741420873042568430, 0.741387320100627910, 0.741353765305219010, 0.741320208656425450, 0.741286650154331590, 0.741253089799021160, 0.741219527590577960, 0.741185963529085720, +0.741152397614628810, 0.741118829847290940, 0.741085260227155930, 0.741051688754307490, 0.741018115428830230, 0.740984540250807620, 0.740950963220323280, 0.740917384337461900, +0.740883803602307100, 0.740850221014942690, 0.740816636575452490, 0.740783050283921000, 0.740749462140431910, 0.740715872145069070, 0.740682280297916380, 0.740648686599058250, +0.740615091048578260, 0.740581493646560670, 0.740547894393089100, 0.740514293288248030, 0.740480690332121270, 0.740447085524792660, 0.740413478866346120, 0.740379870356866250, +0.740346259996436550, 0.740312647785141050, 0.740279033723064140, 0.740245417810289740, 0.740211800046901680, 0.740178180432983890, 0.740144558968620970, 0.740110935653896520, +0.740077310488894910, 0.740043683473699640, 0.740010054608395420, 0.739976423893066060, 0.739942791327795720, 0.739909156912668120, 0.739875520647767850, 0.739841882533178730, +0.739808242568985030, 0.739774600755270350, 0.739740957092119510, 0.739707311579616220, 0.739673664217844750, 0.739640015006888700, 0.739606363946832990, 0.739572711037761340, +0.739539056279757690, 0.739505399672906630, 0.739471741217291980, 0.739438080912998120, 0.739404418760108760, 0.739370754758708500, 0.739337088908881500, 0.739303421210711800, +0.739269751664283100, 0.739236080269680460, 0.739202407026987580, 0.739168731936288630, 0.739135054997667630, 0.739101376211209190, 0.739067695576997470, 0.739034013095116290, +0.739000328765649920, 0.738966642588683050, 0.738932954564299530, 0.738899264692583270, 0.738865572973619210, 0.738831879407491290, 0.738798183994283540, 0.738764486734080130, +0.738730787626965760, 0.738697086673024470, 0.738663383872340320, 0.738629679224997560, 0.738595972731080800, 0.738562264390674180, 0.738528554203861880, 0.738494842170727810, +0.738461128291357130, 0.738427412565833440, 0.738393694994241350, 0.738359975576664660, 0.738326254313188320, 0.738292531203896370, 0.738258806248872750, 0.738225079448202480, +0.738191350801969510, 0.738157620310258110, 0.738123887973152430, 0.738090153790737280, 0.738056417763096720, 0.738022679890315110, 0.737988940172476520, 0.737955198609665960, +0.737921455201967280, 0.737887709949465060, 0.737853962852243250, 0.737820213910386770, 0.737786463123979770, 0.737752710493106640, 0.737718956017851420, 0.737685199698299150, +0.737651441534533880, 0.737617681526639650, 0.737583919674701600, 0.737550155978803690, 0.737516390439030390, 0.737482623055465860, 0.737448853828195030, 0.737415082757302050, +0.737381309842871420, 0.737347535084987180, 0.737313758483734370, 0.737279980039197150, 0.737246199751460110, 0.737212417620607190, 0.737178633646723420, 0.737144847829893310, +0.737111060170200890, 0.737077270667730540, 0.737043479322567420, 0.737009686134795450, 0.736975891104499350, 0.736942094231763270, 0.736908295516672250, 0.736874494959310460, +0.736840692559762030, 0.736806888318112250, 0.736773082234445260, 0.736739274308845560, 0.736705464541397400, 0.736671652932185840, 0.736637839481295130, 0.736604024188809880, +0.736570207054814240, 0.736536388079393370, 0.736502567262631520, 0.736468744604613420, 0.736434920105423000, 0.736401093765145510, 0.736367265583865450, 0.736333435561667080, +0.736299603698634900, 0.736265769994854050, 0.736231934450408690, 0.736198097065383190, 0.736164257839862830, 0.736130416773931760, 0.736096573867674690, 0.736062729121175870, +0.736028882534520480, 0.735995034107792990, 0.735961183841077780, 0.735927331734459460, 0.735893477788023050, 0.735859622001852950, 0.735825764376033750, 0.735791904910649830, +0.735758043605786560, 0.735724180461528100, 0.735690315477959160, 0.735656448655164220, 0.735622579993228440, 0.735588709492236090, 0.735554837152271770, 0.735520962973420730, +0.735487086955767140, 0.735453209099395930, 0.735419329404391360, 0.735385447870838700, 0.735351564498822440, 0.735317679288427390, 0.735283792239737720, 0.735249903352839020, +0.735216012627815330, 0.735182120064751810, 0.735148225663732610, 0.735114329424843120, 0.735080431348167920, 0.735046531433791510, 0.735012629681798480, 0.734978726092274210, +0.734944820665303090, 0.734910913400970030, 0.734877004299359320, 0.734843093360556420, 0.734809180584645730, 0.734775265971711830, 0.734741349521840110, 0.734707431235114950, +0.734673511111621160, 0.734639589151443450, 0.734605665354666980, 0.734571739721376350, 0.734537812251656370, 0.734503882945591550, 0.734469951803267350, 0.734436018824768280, +0.734402084010179150, 0.734368147359584440, 0.734334208873069770, 0.734300268550719500, 0.734266326392618570, 0.734232382398851470, 0.734198436569503790, 0.734164488904660130, +0.734130539404404760, 0.734096588068823390, 0.734062634898000610, 0.734028679892021140, 0.733994723050969800, 0.733960764374931850, 0.733926803863992010, 0.733892841518235190, +0.733858877337746020, 0.733824911322609850, 0.733790943472911410, 0.733756973788735720, 0.733723002270167180, 0.733689028917291490, 0.733655053730193240, 0.733621076708957260, +0.733587097853668380, 0.733553117164412070, 0.733519134641272940, 0.733485150284335700, 0.733451164093685830, 0.733417176069408040, 0.733383186211587380, 0.733349194520308330, +0.733315200995656720, 0.733281205637717040, 0.733247208446574430, 0.733213209422313380, 0.733179208565019720, 0.733145205874777940, 0.733111201351673290, 0.733077194995790160, +0.733043186807214480, 0.733009176786030730, 0.732975164932324060, 0.732941151246179310, 0.732907135727681850, 0.732873118376916600, 0.732839099193968170, 0.732805078178922380, +0.732771055331863820, 0.732737030652877760, 0.732703004142048700, 0.732668975799462440, 0.732634945625203820, 0.732600913619357750, 0.732566879782009180, 0.732532844113243600, +0.732498806613146040, 0.732464767281801320, 0.732430726119294500, 0.732396683125711160, 0.732362638301136020, 0.732328591645654340, 0.732294543159350830, 0.732260492842311430, +0.732226440694620620, 0.732192386716363770, 0.732158330907625610, 0.732124273268492050, 0.732090213799047710, 0.732056152499377500, 0.732022089369567250, 0.731988024409701900, +0.731953957619866370, 0.731919889000145600, 0.731885818550625510, 0.731851746271390710, 0.731817672162526690, 0.731783596224118150, 0.731749518456251020, 0.731715438859009910, +0.731681357432480310, 0.731647274176747020, 0.731613189091895770, 0.731579102178011700, 0.731545013435179750, 0.731510922863484960, 0.731476830463013260, 0.731442736233849370, +0.731408640176078430, 0.731374542289786160, 0.731340442575057480, 0.731306341031977780, 0.731272237660631870, 0.731238132461105690, 0.731204025433484170, 0.731169916577852570, +0.731135805894295940, 0.731101693382900100, 0.731067579043749970, 0.731033462876930830, 0.730999344882527820, 0.730965225060626780, 0.730931103411312620, 0.730896979934670730, +0.730862854630786040, 0.730828727499744590, 0.730794598541631310, 0.730760467756531140, 0.730726335144530230, 0.730692200705713390, 0.730658064440166120, 0.730623926347973350, +0.730589786429221010, 0.730555644683994250, 0.730521501112378460, 0.730487355714458550, 0.730453208490320470, 0.730419059440049480, 0.730384908563730840, 0.730350755861449600, +0.730316601333291790, 0.730282444979342360, 0.730248286799686900, 0.730214126794410450, 0.730179964963598940, 0.730145801307337640, 0.730111635825711700, 0.730077468518806390, +0.730043299386707760, 0.730009128429500830, 0.729974955647270880, 0.729940781040103740, 0.729906604608084650, 0.729872426351299010, 0.729838246269832180, 0.729804064363769880, +0.729769880633197480, 0.729735695078200350, 0.729701507698863660, 0.729667318495273550, 0.729633127467515070, 0.729598934615673930, 0.729564739939835060, 0.729530543440084610, +0.729496345116507740, 0.729462144969190150, 0.729427942998216890, 0.729393739203674010, 0.729359533585646760, 0.729325326144220410, 0.729291116879481120, 0.729256905791513920, +0.729222692880404530, 0.729188478146237990, 0.729154261589100680, 0.729120043209077640, 0.729085823006254570, 0.729051600980716640, 0.729017377132549880, 0.728983151461839900, +0.728948923968671840, 0.728914694653131300, 0.728880463515304220, 0.728846230555276090, 0.728811995773132270, 0.728777759168958150, 0.728743520742840100, 0.728709280494863050, +0.728675038425112610, 0.728640794533674920, 0.728606548820635140, 0.728572301286078970, 0.728538051930091910, 0.728503800752759890, 0.728469547754168390, 0.728435292934403010, +0.728401036293549130, 0.728366777831693010, 0.728332517548919810, 0.728298255445315460, 0.728263991520964990, 0.728229725775955020, 0.728195458210370680, 0.728161188824297700, +0.728126917617821330, 0.728092644591028180, 0.728058369744003290, 0.728024093076832470, 0.727989814589601100, 0.727955534282395570, 0.727921252155301120, 0.727886968208403370, +0.727852682441788360, 0.727818394855541670, 0.727784105449749030, 0.727749814224495920, 0.727715521179868490, 0.727681226315952220, 0.727646929632832840, 0.727612631130595930, +0.727578330809327770, 0.727544028669113720, 0.727509724710039610, 0.727475418932190920, 0.727441111335653920, 0.727406801920514210, 0.727372490686857390, 0.727338177634769160, +0.727303862764335670, 0.727269546075642650, 0.727235227568775460, 0.727200907243820360, 0.727166585100863070, 0.727132261139989410, 0.727097935361284640, 0.727063607764835470, +0.727029278350727170, 0.726994947119045780, 0.726960614069876660, 0.726926279203306320, 0.726891942519420240, 0.726857604018304350, 0.726823263700044130, 0.726788921564726080, +0.726754577612435670, 0.726720231843258850, 0.726685884257281200, 0.726651534854589000, 0.726617183635268060, 0.726582830599403980, 0.726548475747082920, 0.726514119078390700, +0.726479760593413350, 0.726445400292236140, 0.726411038174945790, 0.726376674241627770, 0.726342308492368140, 0.726307940927252480, 0.726273571546367180, 0.726239200349797940, +0.726204827337630810, 0.726170452509951270, 0.726136075866845810, 0.726101697408400250, 0.726067317134700410, 0.726032935045832000, 0.725998551141881610, 0.725964165422934740, +0.725929777889077200, 0.725895388540395480, 0.725860997376975290, 0.725826604398902680, 0.725792209606263120, 0.725757812999143440, 0.725723414577629230, 0.725689014341806440, +0.725654612291760870, 0.725620208427579020, 0.725585802749346700, 0.725551395257149840, 0.725516985951074170, 0.725482574831206370, 0.725448161897632170, 0.725413747150437490, +0.725379330589708160, 0.725344912215530880, 0.725310492027991250, 0.725276070027175420, 0.725241646213169110, 0.725207220586058910, 0.725172793145930750, 0.725138363892870230, +0.725103932826964170, 0.725069499948298280, 0.725035065256958600, 0.725000628753030950, 0.724966190436602040, 0.724931750307757690, 0.724897308366583950, 0.724862864613166620, +0.724828419047592430, 0.724793971669947190, 0.724759522480317050, 0.724725071478787840, 0.724690618665446150, 0.724656164040377910, 0.724621707603669400, 0.724587249355406190, +0.724552789295675240, 0.724518327424562240, 0.724483863742153120, 0.724449398248534710, 0.724414930943792830, 0.724380461828013520, 0.724345990901282820, 0.724311518163687440, +0.724277043615313310, 0.724242567256246470, 0.724208089086572970, 0.724173609106379510, 0.724139127315752030, 0.724104643714776790, 0.724070158303539600, 0.724035671082127300, +0.724001182050625800, 0.723966691209121490, 0.723932198557699970, 0.723897704096448380, 0.723863207825452550, 0.723828709744798290, 0.723794209854572550, 0.723759708154861350, +0.723725204645750850, 0.723690699327327100, 0.723656192199676810, 0.723621683262886120, 0.723587172517041190, 0.723552659962227950, 0.723518145598533560, 0.723483629426043610, +0.723449111444844690, 0.723414591655022640, 0.723380070056664380, 0.723345546649856060, 0.723311021434683840, 0.723276494411233760, 0.723241965579592640, 0.723207434939846740, +0.723172902492082210, 0.723138368236385110, 0.723103832172842460, 0.723069294301540100, 0.723034754622564280, 0.723000213136001820, 0.722965669841938880, 0.722931124740461840, +0.722896577831656620, 0.722862029115610150, 0.722827478592408700, 0.722792926262138650, 0.722758372124885810, 0.722723816180737440, 0.722689258429779490, 0.722654698872098430, +0.722620137507780310, 0.722585574336912170, 0.722551009359580050, 0.722516442575870440, 0.722481873985869380, 0.722447303589664020, 0.722412731387340300, 0.722378157378984480, +0.722343581564683590, 0.722309003944523800, 0.722274424518591470, 0.722239843286972660, 0.722205260249754620, 0.722170675407023510, 0.722136088758865590, 0.722101500305367240, +0.722066910046615380, 0.722032317982696290, 0.721997724113696340, 0.721963128439701900, 0.721928530960799790, 0.721893931677076490, 0.721859330588618290, 0.721824727695511430, +0.721790122997843180, 0.721755516495699470, 0.721720908189166680, 0.721686298078332070, 0.721651686163281570, 0.721617072444102000, 0.721582456920879300, 0.721547839593700830, +0.721513220462652760, 0.721478599527821560, 0.721443976789293620, 0.721409352247156080, 0.721374725901495100, 0.721340097752397380, 0.721305467799948970, 0.721270836044237360, +0.721236202485348590, 0.721201567123369250, 0.721166929958385830, 0.721132290990485260, 0.721097650219754030, 0.721063007646278290, 0.721028363270145410, 0.720993717091441550, +0.720959069110253540, 0.720924419326667510, 0.720889767740770630, 0.720855114352649370, 0.720820459162390460, 0.720785802170079930, 0.720751143375805260, 0.720716482779652720, +0.720681820381709030, 0.720647156182060430, 0.720612490180794210, 0.720577822377996840, 0.720543152773754910, 0.720508481368154820, 0.720473808161283700, 0.720439133153228160, +0.720404456344074800, 0.720369777733909870, 0.720335097322820970, 0.720300415110894270, 0.720265731098216120, 0.720231045284874140, 0.720196357670954360, 0.720161668256543820, +0.720126977041728680, 0.720092284026596530, 0.720057589211233640, 0.720022892595726720, 0.719988194180162240, 0.719953493964627710, 0.719918791949209380, 0.719884088133994070, +0.719849382519068160, 0.719814675104519130, 0.719779965890433580, 0.719745254876897890, 0.719710542063998870, 0.719675827451823790, 0.719641111040459140, 0.719606392829991390, +0.719571672820508050, 0.719536951012095470, 0.719502227404840490, 0.719467501998829580, 0.719432774794150240, 0.719398045790889060, 0.719363314989132750, 0.719328582388967800, +0.719293847990481680, 0.719259111793761010, 0.719224373798892480, 0.719189634005962810, 0.719154892415059250, 0.719120149026268530, 0.719085403839677450, 0.719050656855372510, +0.719015908073441290, 0.718981157493970180, 0.718946405117045990, 0.718911650942756110, 0.718876894971187010, 0.718842137202425730, 0.718807377636558780, 0.718772616273673610, +0.718737853113857070, 0.718703088157195750, 0.718668321403776460, 0.718633552853686690, 0.718598782507013030, 0.718564010363842430, 0.718529236424261470, 0.718494460688357760, +0.718459683156217890, 0.718424903827928780, 0.718390122703577050, 0.718355339783250500, 0.718320555067035400, 0.718285768555019020, 0.718250980247287950, 0.718216190143929680, +0.718181398245030910, 0.718146604550678360, 0.718111809060959620, 0.718077011775961390, 0.718042212695770620, 0.718007411820473900, 0.717972609150159040, 0.717937804684912750, +0.717902998424821750, 0.717868190369973070, 0.717833380520454200, 0.717798568876351960, 0.717763755437753170, 0.717728940204744760, 0.717694123177414320, 0.717659304355848460, +0.717624483740134430, 0.717589661330358840, 0.717554837126609500, 0.717520011128973010, 0.717485183337536190, 0.717450353752386640, 0.717415522373611280, 0.717380689201297050, +0.717345854235530880, 0.717311017476400360, 0.717276178923992310, 0.717241338578393780, 0.717206496439691590, 0.717171652507973540, 0.717136806783326250, 0.717101959265836970, +0.717067109955592530, 0.717032258852680630, 0.716997405957188080, 0.716962551269201940, 0.716927694788809130, 0.716892836516097480, 0.716857976451153680, 0.716823114594064670, +0.716788250944918160, 0.716753385503800970, 0.716718518270800350, 0.716683649246003140, 0.716648778429497150, 0.716613905821369190, 0.716579031421706420, 0.716544155230595780, +0.716509277248125080, 0.716474397474381130, 0.716439515909451210, 0.716404632553422350, 0.716369747406382040, 0.716334860468417430, 0.716299971739615680, 0.716265081220063600, +0.716230188909849240, 0.716195294809059300, 0.716160398917780940, 0.716125501236101750, 0.716090601764108880, 0.716055700501889490, 0.716020797449530620, 0.715985892607119980, +0.715950985974744600, 0.715916077552491760, 0.715881167340448490, 0.715846255338702610, 0.715811341547341050, 0.715776425966451080, 0.715741508596119740, 0.715706589436435060, +0.715671668487483760, 0.715636745749353430, 0.715601821222130900, 0.715566894905903970, 0.715531966800759920, 0.715497036906786010, 0.715462105224069170, 0.715427171752697320, +0.715392236492757630, 0.715357299444336900, 0.715322360607523300, 0.715287419982403860, 0.715252477569065850, 0.715217533367596300, 0.715182587378083160, 0.715147639600613670, +0.715112690035275000, 0.715077738682154410, 0.715042785541339710, 0.715007830612917950, 0.714972873896976720, 0.714937915393603070, 0.714902955102884820, 0.714867993024909220, +0.714833029159763540, 0.714798063507535050, 0.714763096068311790, 0.714728126842180790, 0.714693155829229100, 0.714658183029544760, 0.714623208443215030, 0.714588232070327400, +0.714553253910968690, 0.714518273965227270, 0.714483292233190070, 0.714448308714944800, 0.714413323410578280, 0.714378336320178890, 0.714343347443833540, 0.714308356781629960, +0.714273364333655070, 0.714238370099997130, 0.714203374080743190, 0.714168376275980840, 0.714133376685797350, 0.714098375310280640, 0.714063372149517980, 0.714028367203596640, +0.713993360472604640, 0.713958351956629160, 0.713923341655757990, 0.713888329570077970, 0.713853315699677580, 0.713818300044643860, 0.713783282605064410, 0.713748263381026370, +0.713713242372618020, 0.713678219579926610, 0.713643195003039520, 0.713608168642044240, 0.713573140497028800, 0.713538110568080590, 0.713503078855287080, 0.713468045358735540, +0.713433010078514120, 0.713397973014710310, 0.713362934167411480, 0.713327893536705000, 0.713292851122679150, 0.713257806925421180, 0.713222760945018350, 0.713187713181558940, +0.713152663635130190, 0.713117612305819830, 0.713082559193715100, 0.713047504298904400, 0.713012447621474750, 0.712977389161514100, 0.712942328919109690, 0.712907266894349690, +0.712872203087321580, 0.712837137498112950, 0.712802070126811180, 0.712767000973504540, 0.712731930038280390, 0.712696857321226340, 0.712661782822429980, 0.712626706541979350, +0.712591628479962050, 0.712556548636465340, 0.712521467011577480, 0.712486383605386080, 0.712451298417978610, 0.712416211449442670, 0.712381122699866530, 0.712346032169337450, +0.712310939857943470, 0.712275845765771630, 0.712240749892910640, 0.712205652239447760, 0.712170552805470700, 0.712135451591066950, 0.712100348596324870, 0.712065243821331960, +0.712030137266175920, 0.711995028930944240, 0.711959918815725290, 0.711924806920606560, 0.711889693245675530, 0.711854577791020460, 0.711819460556729070, 0.711784341542888940, +0.711749220749587690, 0.711714098176913670, 0.711678973824954490, 0.711643847693797850, 0.711608719783531240, 0.711573590094243150, 0.711538458626021050, 0.711503325378952890, +0.711468190353126030, 0.711433053548629070, 0.711397914965549380, 0.711362774603975010, 0.711327632463993330, 0.711292488545692820, 0.711257342849161200, 0.711222195374485830, +0.711187046121755320, 0.711151895091057250, 0.711116742282479340, 0.711081587696109410, 0.711046431332035710, 0.711011273190345960, 0.710976113271127970, 0.710940951574469460, +0.710905788100458900, 0.710870622849183790, 0.710835455820732150, 0.710800287015191600, 0.710765116432650500, 0.710729944073196780, 0.710694769936918160, 0.710659594023902330, +0.710624416334237790, 0.710589236868012120, 0.710554055625313490, 0.710518872606229370, 0.710483687810848360, 0.710448501239258180, 0.710413312891546410, 0.710378122767801660, +0.710342930868111510, 0.710307737192564130, 0.710272541741247100, 0.710237344514249140, 0.710202145511657610, 0.710166944733560790, 0.710131742180046380, 0.710096537851202750, +0.710061331747117940, 0.710026123867879780, 0.709990914213575960, 0.709955702784295210, 0.709920489580125100, 0.709885274601153800, 0.709850057847469020, 0.709814839319159450, +0.709779619016312810, 0.709744396939016700, 0.709709173087359920, 0.709673947461430310, 0.709638720061315790, 0.709603490887104060, 0.709568259938884060, 0.709533027216743380, +0.709497792720770070, 0.709462556451051940, 0.709427318407677810, 0.709392078590735390, 0.709356837000312710, 0.709321593636497720, 0.709286348499378990, 0.709251101589044360, +0.709215852905581980, 0.709180602449079770, 0.709145350219626320, 0.709110096217309360, 0.709074840442217020, 0.709039582894437800, 0.709004323574059630, 0.708969062481170640, +0.708933799615858780, 0.708898534978212650, 0.708863268568320160, 0.708828000386269590, 0.708792730432148630, 0.708757458706046120, 0.708722185208050080, 0.708686909938248450, +0.708651632896729280, 0.708616354083581370, 0.708581073498892660, 0.708545791142751070, 0.708510507015244870, 0.708475221116462550, 0.708439933446492360, 0.708404644005422250, +0.708369352793340120, 0.708334059810335040, 0.708298765056494810, 0.708263468531907250, 0.708228170236661400, 0.708192870170845200, 0.708157568334546790, 0.708122264727854110, +0.708086959350856080, 0.708051652203640640, 0.708016343286296150, 0.707981032598910430, 0.707945720141572420, 0.707910405914370040, 0.707875089917391790, 0.707839772150725470, +0.707804452614460010, 0.707769131308683350, 0.707733808233483970, 0.707698483388949700, 0.707663156775169560, 0.707627828392231480, 0.707592498240223630, 0.707557166319234820, +0.707521832629352980, 0.707486497170666690, 0.707451159943263800, 0.707415820947233210, 0.707380480182663200, 0.707345137649641910, 0.707309793348257500, 0.707274447278599010, +0.707239099440754250, 0.707203749834811820, 0.707168398460859770, 0.707133045318986910, 0.707097690409281500, 0.707062333731831800, 0.707026975286726090, 0.706991615074053170, +0.706956253093901200, 0.706920889346358330, 0.706885523831513480, 0.706850156549454820, 0.706814787500270820, 0.706779416684049530, 0.706744044100880100, 0.706708669750850450, +0.706673293634049070, 0.706637915750564230, 0.706602536100484960, 0.706567154683899300, 0.706531771500895630, 0.706496386551562440, 0.706460999835988420, 0.706425611354261960, +0.706390221106471540, 0.706354829092705190, 0.706319435313052080, 0.706284039767600460, 0.706248642456438260, 0.706213243379654960, 0.706177842537338400, 0.706142439929577260, +0.706107035556459820, 0.706071629418075000, 0.706036221514511180, 0.706000811845856720, 0.705965400412199910, 0.705929987213629980, 0.705894572250235110, 0.705859155522103770, +0.705823737029324220, 0.705788316771985610, 0.705752894750176220, 0.705717470963984630, 0.705682045413498990, 0.705646618098808580, 0.705611189020001640, 0.705575758177166780, +0.705540325570392150, 0.705504891199767000, 0.705469455065379720, 0.705434017167318350, 0.705398577505672360, 0.705363136080529920, 0.705327692891979500, 0.705292247940109700, +0.705256801225009560, 0.705221352746767340, 0.705185902505471750, 0.705150450501211170, 0.705114996734074740, 0.705079541204150840, 0.705044083911528060, 0.705008624856294790, +0.704973164038540160, 0.704937701458352770, 0.704902237115821010, 0.704866771011033450, 0.704831303144079160, 0.704795833515046710, 0.704760362124024380, 0.704724888971101300, +0.704689414056366200, 0.704653937379907450, 0.704618458941813520, 0.704582978742173790, 0.704547496781076640, 0.704512013058610660, 0.704476527574864450, 0.704441040329927160, +0.704405551323887380, 0.704370060556833600, 0.704334568028854410, 0.704299073740039080, 0.704263577690476090, 0.704228079880254150, 0.704192580309461750, 0.704157078978188130, +0.704121575886521800, 0.704086071034551340, 0.704050564422365910, 0.704015056050054100, 0.703979545917704620, 0.703944034025405950, 0.703908520373247580, 0.703873004961317880, +0.703837487789705670, 0.703801968858499440, 0.703766448167788550, 0.703730925717661600, 0.703695401508207310, 0.703659875539514260, 0.703624347811671710, 0.703588818324768380, +0.703553287078892970, 0.703517754074134080, 0.703482219310581080, 0.703446682788322560, 0.703411144507447240, 0.703375604468043810, 0.703340062670201660, 0.703304519114009490, +0.703268973799555550, 0.703233426726929570, 0.703197877896220010, 0.703162327307515710, 0.703126774960905250, 0.703091220856478240, 0.703055664994323150, 0.703020107374528910, +0.702984547997184130, 0.702948986862378280, 0.702913423970199850, 0.702877859320737990, 0.702842292914081180, 0.702806724750318800, 0.702771154829539670, 0.702735583151832710, +0.702700009717286520, 0.702664434525990590, 0.702628857578033510, 0.702593278873503980, 0.702557698412491600, 0.702522116195084980, 0.702486532221373030, 0.702450946491444460, +0.702415359005388870, 0.702379769763294860, 0.702344178765251350, 0.702308586011347160, 0.702272991501671770, 0.702237395236314010, 0.702201797215362690, 0.702166197438906510, +0.702130595907035190, 0.702094992619837430, 0.702059387577402160, 0.702023780779818090, 0.701988172227174910, 0.701952561919561240, 0.701916949857065870, 0.701881336039778540, +0.701845720467787700, 0.701810103141182750, 0.701774484060052050, 0.701738863224485640, 0.701703240634571900, 0.701667616290400090, 0.701631990192059020, 0.701596362339638180, +0.701560732733226500, 0.701525101372913020, 0.701489468258786440, 0.701453833390936480, 0.701418196769451940, 0.701382558394421870, 0.701346918265935200, 0.701311276384081420, +0.701275632748949550, 0.701239987360628200, 0.701204340219207300, 0.701168691324775440, 0.701133040677421990, 0.701097388277235560, 0.701061734124305950, 0.701026078218721980, +0.700990420560572810, 0.700954761149947370, 0.700919099986935250, 0.700883437071625370, 0.700847772404107010, 0.700812105984468750, 0.700776437812800630, 0.700740767889191480, +0.700705096213730340, 0.700669422786506120, 0.700633747607608660, 0.700598070677126870, 0.700562391995149910, 0.700526711561766600, 0.700491029377066870, 0.700455345441139520, +0.700419659754073610, 0.700383972315958720, 0.700348283126884020, 0.700312592186938530, 0.700276899496211300, 0.700241205054792150, 0.700205508862769890, 0.700169810920233890, +0.700134111227273090, 0.700098409783977300, 0.700062706590435460, 0.700027001646736920, 0.699991294952970520, 0.699955586509226290, 0.699919876315592940, 0.699884164372160060, +0.699848450679016350, 0.699812735236251760, 0.699777018043955420, 0.699741299102216270, 0.699705578411124130, 0.699669855970768030, 0.699634131781237350, 0.699598405842621010, +0.699562678155008940, 0.699526948718490190, 0.699491217533154020, 0.699455484599089570, 0.699419749916386670, 0.699384013485134350, 0.699348275305422100, 0.699312535377338840, +0.699276793700974510, 0.699241050276418140, 0.699205305103759220, 0.699169558183086790, 0.699133809514490670, 0.699098059098060110, 0.699062306933884050, 0.699026553022052520, +0.698990797362654570, 0.698955039955779680, 0.698919280801516880, 0.698883519899956230, 0.698847757251186640, 0.698811992855297830, 0.698776226712378600, 0.698740458822519230, +0.698704689185808640, 0.698668917802336310, 0.698633144672191400, 0.698597369795463940, 0.698561593172242980, 0.698525814802618110, 0.698490034686678470, 0.698454252824513900, +0.698418469216213870, 0.698382683861867530, 0.698346896761564250, 0.698311107915393970, 0.698275317323445940, 0.698239524985809320, 0.698203730902574150, 0.698167935073829680, +0.698132137499665410, 0.698096338180170470, 0.698060537115435030, 0.698024734305548230, 0.697988929750599560, 0.697953123450678280, 0.697917315405874430, 0.697881505616277380, +0.697845694081976610, 0.697809880803061170, 0.697774065779621420, 0.697738249011746530, 0.697702430499525960, 0.697666610243048990, 0.697630788242405760, 0.697594964497685650, +0.697559139008977810, 0.697523311776372390, 0.697487482799958760, 0.697451652079826400, 0.697415819616064580, 0.697379985408763560, 0.697344149458012490, 0.697308311763901180, +0.697272472326518680, 0.697236631145955240, 0.697200788222300360, 0.697164943555643510, 0.697129097146073850, 0.697093248993681860, 0.697057399098556800, 0.697021547460788150, +0.696985694080465400, 0.696949838957678590, 0.696913982092517310, 0.696878123485070720, 0.696842263135429190, 0.696806401043681970, 0.696770537209918660, 0.696734671634228750, +0.696698804316702500, 0.696662935257429280, 0.696627064456498690, 0.696591191913999990, 0.696555317630023760, 0.696519441604659280, 0.696483563837996140, 0.696447684330123720, +0.696411803081132490, 0.696375920091111710, 0.696340035360151100, 0.696304148888340140, 0.696268260675769080, 0.696232370722527420, 0.696196479028704520, 0.696160585594390650, +0.696124690419675400, 0.696088793504648470, 0.696052894849399140, 0.696016994454017880, 0.695981092318594170, 0.695945188443217730, 0.695909282827978040, 0.695873375472965460, +0.695837466378269380, 0.695801555543979710, 0.695765642970185730, 0.695729728656978020, 0.695693812604445960, 0.695657894812679480, 0.695621975281767830, 0.695586054011801620, +0.695550131002870220, 0.695514206255063550, 0.695478279768470990, 0.695442351543183120, 0.695406421579289220, 0.695370489876879110, 0.695334556436043030, 0.695298621256870590, +0.695262684339451600, 0.695226745683875550, 0.695190805290232920, 0.695154863158613300, 0.695118919289106520, 0.695082973681802160, 0.695047026336790720, 0.695011077254161670, +0.694975126434004940, 0.694939173876410020, 0.694903219581467500, 0.694867263549266980, 0.694831305779898270, 0.694795346273450960, 0.694759385030015660, 0.694723422049681850, +0.694687457332539230, 0.694651490878678170, 0.694615522688188490, 0.694579552761159900, 0.694543581097682220, 0.694507607697845810, 0.694471632561740490, 0.694435655689455980, +0.694399677081082080, 0.694363696736709280, 0.694327714656427290, 0.694291730840325920, 0.694255745288494990, 0.694219758001024980, 0.694183768978005490, 0.694147778219526670, +0.694111785725678110, 0.694075791496550410, 0.694039795532233160, 0.694003797832816180, 0.693967798398389960, 0.693931797229044300, 0.693895794324869030, 0.693859789685954080, +0.693823783312389920, 0.693787775204266380, 0.693751765361673380, 0.693715753784700520, 0.693679740473438720, 0.693643725427977480, 0.693607708648407040, 0.693571690134816900, +0.693535669887297870, 0.693499647905939760, 0.693463624190832410, 0.693427598742065830, 0.693391571559730410, 0.693355542643916190, 0.693319511994712980, 0.693283479612210820, +0.693247445496500190, 0.693211409647670920, 0.693175372065812920, 0.693139332751016690, 0.693103291703372150, 0.693067248922969450, 0.693031204409898290, 0.692995158164249390, +0.692959110186112670, 0.692923060475578060, 0.692887009032735590, 0.692850955857675870, 0.692814900950488810, 0.692778844311264350, 0.692742785940092640, 0.692706725837064160, +0.692670664002268950, 0.692634600435797050, 0.692598535137738390, 0.692562468108183560, 0.692526399347222710, 0.692490328854945440, 0.692454256631442670, 0.692418182676804330, +0.692382106991120460, 0.692346029574481100, 0.692309950426976960, 0.692273869548697850, 0.692237786939734150, 0.692201702600175660, 0.692165616530113210, 0.692129528729636730, +0.692093439198836370, 0.692057347937802160, 0.692021254946624920, 0.691985160225394470, 0.691949063774201180, 0.691912965593134870, 0.691876865682286570, 0.691840764041745990, +0.691804660671603180, 0.691768555571949050, 0.691732448742873540, 0.691696340184467020, 0.691660229896819190, 0.691624117880021090, 0.691588004134162770, 0.691551888659334480, +0.691515771455626040, 0.691479652523128600, 0.691443531861931970, 0.691407409472126530, 0.691371285353802210, 0.691335159507050050, 0.691299031931959960, 0.691262902628622220, +0.691226771597126980, 0.691190638837565150, 0.691154504350026680, 0.691118368134601700, 0.691082230191381040, 0.691046090520454850, 0.691009949121913380, 0.690973805995846790, +0.690937661142345890, 0.690901514561500950, 0.690865366253402220, 0.690829216218139750, 0.690793064455804460, 0.690756910966486610, 0.690720755750276470, 0.690684598807264070, +0.690648440137540560, 0.690612279741195990, 0.690576117618320610, 0.690539953769004680, 0.690503788193339130, 0.690467620891414220, 0.690431451863320110, 0.690395281109147160, +0.690359108628986310, 0.690322934422927580, 0.690286758491061360, 0.690250580833478460, 0.690214401450269130, 0.690178220341523870, 0.690142037507332610, 0.690105852947786590, +0.690069666662976090, 0.690033478652991250, 0.689997288917922450, 0.689961097457860830, 0.689924904272896430, 0.689888709363119630, 0.689852512728620910, 0.689816314369491200, +0.689780114285820640, 0.689743912477699840, 0.689707708945218930, 0.689671503688469080, 0.689635296707540420, 0.689599088002523230, 0.689562877573508650, 0.689526665420586830, +0.689490451543848470, 0.689454235943383510, 0.689418018619283310, 0.689381799571638140, 0.689345578800538480, 0.689309356306074480, 0.689273132088337400, 0.689236906147417510, +0.689200678483405380, 0.689164449096391300, 0.689128217986466280, 0.689091985153720720, 0.689055750598245310, 0.689019514320130200, 0.688983276319466540, 0.688947036596344710, +0.688910795150854960, 0.688874551983088560, 0.688838307093135760, 0.688802060481087270, 0.688765812147033250, 0.688729562091065060, 0.688693310313272860, 0.688657056813747560, +0.688620801592579100, 0.688584544649859080, 0.688548285985677630, 0.688512025600125590, 0.688475763493292980, 0.688439499665271400, 0.688403234116151120, 0.688366966846022610, +0.688330697854976470, 0.688294427143103850, 0.688258154710495230, 0.688221880557241210, 0.688185604683432150, 0.688149327089159320, 0.688113047774513320, 0.688076766739584290, +0.688040483984463710, 0.688004199509241850, 0.687967913314009530, 0.687931625398857110, 0.687895335763875960, 0.687859044409156460, 0.687822751334789320, 0.687786456540865010, +0.687750160027474910, 0.687713861794709390, 0.687677561842659160, 0.687641260171414800, 0.687604956781067480, 0.687568651671707890, 0.687532344843426620, 0.687496036296314170, +0.687459726030461900, 0.687423414045960410, 0.687387100342900070, 0.687350784921372250, 0.687314467781467430, 0.687278148923276540, 0.687241828346889850, 0.687205506052398940, +0.687169182039894300, 0.687132856309466740, 0.687096528861206650, 0.687060199695205600, 0.687023868811553970, 0.686987536210342810, 0.686951201891662370, 0.686914865855604240, +0.686878528102259020, 0.686842188631717420, 0.686805847444070140, 0.686769504539408440, 0.686733159917823020, 0.686696813579404370, 0.686660465524244090, 0.686624115752432540, +0.686587764264060760, 0.686551411059219240, 0.686515056137999460, 0.686478699500492010, 0.686442341146787930, 0.686405981076977590, 0.686369619291152700, 0.686333255789403740, +0.686296890571821640, 0.686260523638496880, 0.686224154989521270, 0.686187784624985200, 0.686151412544979690, 0.686115038749595340, 0.686078663238923750, 0.686042286013055390, +0.686005907072081420, 0.685969526416092320, 0.685933144045179690, 0.685896759959434330, 0.685860374158946630, 0.685823986643808280, 0.685787597414110110, 0.685751206469942810, +0.685714813811397320, 0.685678419438565000, 0.685642023351536570, 0.685605625550403270, 0.685569226035255500, 0.685532824806184940, 0.685496421863282300, 0.685460017206638740, +0.685423610836344730, 0.685387202752491990, 0.685350792955171210, 0.685314381444473540, 0.685277968220489590, 0.685241553283310930, 0.685205136633028510, 0.685168718269732910, +0.685132298193515840, 0.685095876404468010, 0.685059452902680440, 0.685023027688243970, 0.684986600761250290, 0.684950172121789990, 0.684913741769954340, 0.684877309705834050, +0.684840875929520700, 0.684804440441105220, 0.684768003240678660, 0.684731564328331820, 0.684695123704156310, 0.684658681368242930, 0.684622237320682950, 0.684585791561566960, +0.684549344090986890, 0.684512894909033550, 0.684476444015797550, 0.684439991411370690, 0.684403537095843890, 0.684367081069308330, 0.684330623331854680, 0.684294163883574890, +0.684257702724559550, 0.684221239854900020, 0.684184775274687020, 0.684148308984012470, 0.684111840982967180, 0.684075371271642200, 0.684038899850128560, 0.684002426718517850, +0.683965951876901230, 0.683929475325369630, 0.683892997064014070, 0.683856517092926270, 0.683820035412197270, 0.683783552021917760, 0.683747066922179790, 0.683710580113074170, +0.683674091594691950, 0.683637601367124370, 0.683601109430462930, 0.683564615784798880, 0.683528120430223150, 0.683491623366826890, 0.683455124594701810, 0.683418624113939050, +0.683382121924629660, 0.683345618026864550, 0.683309112420735780, 0.683272605106334250, 0.683236096083751240, 0.683199585353077680, 0.683163072914405370, 0.683126558767825460, +0.683090042913429120, 0.683053525351307370, 0.683017006081552140, 0.682980485104254350, 0.682943962419505060, 0.682907438027396290, 0.682870911928018740, 0.682834384121464020, +0.682797854607822940, 0.682761323387187650, 0.682724790459648960, 0.682688255825298350, 0.682651719484226760, 0.682615181436526220, 0.682578641682287660, 0.682542100221602550, +0.682505557054561840, 0.682469012181257550, 0.682432465601780840, 0.682395917316222840, 0.682359367324674730, 0.682322815627228520, 0.682286262223975370, 0.682249707115006210, +0.682213150300412960, 0.682176591780287000, 0.682140031554719580, 0.682103469623801640, 0.682066905987625430, 0.682030340646281870, 0.681993773599862570, 0.681957204848458450, +0.681920634392161660, 0.681884062231063240, 0.681847488365254770, 0.681810912794827080, 0.681774335519872540, 0.681737756540482190, 0.681701175856747390, 0.681664593468759410, +0.681628009376610170, 0.681591423580390930, 0.681554836080192850, 0.681518246876107960, 0.681481655968227520, 0.681445063356642900, 0.681408469041445250, 0.681371873022726840, +0.681335275300578690, 0.681298675875092410, 0.681262074746359030, 0.681225471914470800, 0.681188867379519000, 0.681152261141594880, 0.681115653200789820, 0.681079043557196060, +0.681042432210904660, 0.681005819162007090, 0.680969204410594720, 0.680932587956759590, 0.680895969800593080, 0.680859349942186550, 0.680822728381631380, 0.680786105119019710, +0.680749480154442810, 0.680712853487991820, 0.680676225119759120, 0.680639595049835730, 0.680602963278313490, 0.680566329805283420, 0.680529694630837900, 0.680493057755068080, +0.680456419178065650, 0.680419778899921890, 0.680383136920728940, 0.680346493240578170, 0.680309847859561170, 0.680273200777769200, 0.680236551995294650, 0.680199901512228640, +0.680163249328662900, 0.680126595444688680, 0.680089939860398340, 0.680053282575883160, 0.680016623591234380, 0.679979962906544390, 0.679943300521904550, 0.679906636437406340, +0.679869970653141360, 0.679833303169201650, 0.679796633985678800, 0.679759963102664290, 0.679723290520249600, 0.679686616238526890, 0.679649940257587740, 0.679613262577523750, +0.679576583198426290, 0.679539902120387620, 0.679503219343499220, 0.679466534867852800, 0.679429848693539730, 0.679393160820652380, 0.679356471249282000, 0.679319779979520200, +0.679283087011459340, 0.679246392345190690, 0.679209695980806050, 0.679172997918396910, 0.679136298158055540, 0.679099596699873410, 0.679062893543942340, 0.679026188690353690, +0.678989482139199960, 0.678952773890572400, 0.678916063944562940, 0.678879352301263060, 0.678842638960765130, 0.678805923923160530, 0.678769207188541170, 0.678732488756998430, +0.678695768628624800, 0.678659046803511750, 0.678622323281750760, 0.678585598063434330, 0.678548871148653810, 0.678512142537501250, 0.678475412230067910, 0.678438680226446380, +0.678401946526728140, 0.678365211131005120, 0.678328474039368690, 0.678291735251911330, 0.678254994768724640, 0.678218252589900540, 0.678181508715530510, 0.678144763145706930, +0.678108015880521500, 0.678071266920066030, 0.678034516264432120, 0.677997763913712140, 0.677961009867997790, 0.677924254127381000, 0.677887496691953140, 0.677850737561806920, +0.677813976737033810, 0.677777214217725410, 0.677740450003974430, 0.677703684095872230, 0.677666916493510850, 0.677630147196981780, 0.677593376206377720, 0.677556603521790260, +0.677519829143311210, 0.677483053071032290, 0.677446275305046090, 0.677409495845444190, 0.677372714692318630, 0.677335931845760800, 0.677299147305863600, 0.677262361072718530, +0.677225573146417400, 0.677188783527052250, 0.677151992214715340, 0.677115199209498360, 0.677078404511493150, 0.677041608120792280, 0.677004810037487360, 0.676968010261670420, +0.676931208793433160, 0.676894405632868070, 0.676857600780067070, 0.676820794235122090, 0.676783985998124840, 0.676747176069167790, 0.676710364448342980, 0.676673551135742120, +0.676636736131457140, 0.676599919435580620, 0.676563101048204270, 0.676526280969420140, 0.676489459199320020, 0.676452635737996630, 0.676415810585541680, 0.676378983742046750, +0.676342155207604770, 0.676305324982307330, 0.676268493066246700, 0.676231659459514470, 0.676194824162203330, 0.676157987174405230, 0.676121148496212080, 0.676084308127715810, +0.676047466069009010, 0.676010622320183610, 0.675973776881331640, 0.675936929752544930, 0.675900080933916180, 0.675863230425537200, 0.675826378227500250, 0.675789524339896920, +0.675752668762820140, 0.675715811496361730, 0.675678952540613830, 0.675642091895668040, 0.675605229561617500, 0.675568365538553820, 0.675531499826569020, 0.675494632425755690, +0.675457763336205770, 0.675420892558011410, 0.675384020091264640, 0.675347145936058050, 0.675310270092483570, 0.675273392560633460, 0.675236513340599530, 0.675199632432474610, +0.675162749836350720, 0.675125865552319790, 0.675088979580473980, 0.675052091920905980, 0.675015202573707840, 0.674978311538971700, 0.674941418816789370, 0.674904524407253790, +0.674867628310456990, 0.674830730526490790, 0.674793831055448100, 0.674756929897420750, 0.674720027052501110, 0.674683122520781110, 0.674646216302353660, 0.674609308397310590, +0.674572398805744270, 0.674535487527746720, 0.674498574563410670, 0.674461659912828140, 0.674424743576091500, 0.674387825553292800, 0.674350905844524730, 0.674313984449879440, +0.674277061369449200, 0.674240136603325930, 0.674203210151602670, 0.674166282014371450, 0.674129352191724100, 0.674092420683753750, 0.674055487490552330, 0.674018552612212220, +0.673981616048825340, 0.673944677800484840, 0.673907737867282640, 0.673870796249311010, 0.673833852946662090, 0.673796907959428930, 0.673759961287703430, 0.673723012931577990, +0.673686062891144740, 0.673649111166496730, 0.673612157757725870, 0.673575202664924650, 0.673538245888185010, 0.673501287427600180, 0.673464327283262110, 0.673427365455262830, +0.673390401943695590, 0.673353436748652220, 0.673316469870225310, 0.673279501308506890, 0.673242531063590110, 0.673205559135566900, 0.673168585524529850, 0.673131610230571000, +0.673094633253783380, 0.673057654594259260, 0.673020674252091000, 0.672983692227370760, 0.672946708520191560, 0.672909723130645570, 0.672872736058825360, 0.672835747304822870, +0.672798756868731470, 0.672761764750643090, 0.672724770950650310, 0.672687775468845280, 0.672650778305321160, 0.672613779460170090, 0.672576778933484220, 0.672539776725356700, +0.672502772835879780, 0.672465767265145950, 0.672428760013247250, 0.672391751080277160, 0.672354740466327590, 0.672317728171491160, 0.672280714195860110, 0.672243698539527590, +0.672206681202585870, 0.672169662185127410, 0.672132641487244500, 0.672095619109030260, 0.672058595050576970, 0.672021569311977320, 0.671984541893323240, 0.671947512794708210, +0.671910482016224500, 0.671873449557964130, 0.671836415420020480, 0.671799379602485810, 0.671762342105452710, 0.671725302929013330, 0.671688262073261160, 0.671651219538288210, +0.671614175324187320, 0.671577129431050630, 0.671540081858971400, 0.671503032608042010, 0.671465981678355030, 0.671428929070002730, 0.671391874783078490, 0.671354818817674560, +0.671317761173883530, 0.671280701851797890, 0.671243640851510670, 0.671206578173114470, 0.671169513816701420, 0.671132447782364920, 0.671095380070197310, 0.671058310680291310, +0.671021239612739070, 0.670984166867634180, 0.670947092445068890, 0.670910016345135810, 0.670872938567927400, 0.670835859113536940, 0.670798777982056780, 0.670761695173579750, +0.670724610688198110, 0.670687524526005330, 0.670650436687093680, 0.670613347171555960, 0.670576255979484560, 0.670539163110972840, 0.670502068566113160, 0.670464972344998470, +0.670427874447720900, 0.670390774874373930, 0.670353673625050050, 0.670316570699841740, 0.670279466098842260, 0.670242359822144080, 0.670205251869840040, 0.670168142242022590, +0.670131030938785120, 0.670093917960220000, 0.670056803306420150, 0.670019686977477820, 0.669982568973486740, 0.669945449294539250, 0.669908327940728080, 0.669871204912145800, +0.669834080208885800, 0.669796953831040650, 0.669759825778703080, 0.669722696051965550, 0.669685564650921660, 0.669648431575663890, 0.669611296826284730, 0.669574160402877540, +0.669537022305535130, 0.669499882534350000, 0.669462741089414950, 0.669425597970823350, 0.669388453178667690, 0.669351306713040990, 0.669314158574035640, 0.669277008761745230, +0.669239857276262230, 0.669202704117679680, 0.669165549286090070, 0.669128392781586760, 0.669091234604262670, 0.669054074754210410, 0.669016913231522570, 0.668979750036292840, +0.668942585168613710, 0.668905418628577770, 0.668868250416278620, 0.668831080531808840, 0.668793908975261480, 0.668756735746728890, 0.668719560846304790, 0.668682384274081890, +0.668645206030152870, 0.668608026114610680, 0.668570844527548670, 0.668533661269059550, 0.668496476339236260, 0.668459289738171480, 0.668422101465958820, 0.668384911522690860, +0.668347719908460650, 0.668310526623360770, 0.668273331667484930, 0.668236135040925830, 0.668198936743775950, 0.668161736776129110, 0.668124535138077900, 0.668087331829715360, +0.668050126851134190, 0.668012920202428080, 0.667975711883689540, 0.667938501895011800, 0.667901290236487480, 0.667864076908210260, 0.667826861910272850, 0.667789645242768290, +0.667752426905789290, 0.667715206899429540, 0.667677985223781740, 0.667640761878939060, 0.667603536864994070, 0.667566310182040600, 0.667529081830171340, 0.667491851809479340, +0.667454620120057520, 0.667417386761999350, 0.667380151735397660, 0.667342915040345370, 0.667305676676936080, 0.667268436645262700, 0.667231194945418160, 0.667193951577495280, +0.667156706541587870, 0.667119459837788640, 0.667082211466190840, 0.667044961426887180, 0.667007709719971360, 0.666970456345536310, 0.666933201303675170, 0.666895944594480650, +0.666858686218046560, 0.666821426174465830, 0.666784164463831490, 0.666746901086236470, 0.666709636041774470, 0.666672369330538420, 0.666635100952621020, 0.666597830908116310, +0.666560559197116990, 0.666523285819716320, 0.666486010776007000, 0.666448734066083070, 0.666411455690037240, 0.666374175647962750, 0.666336893939952550, 0.666299610566100430, +0.666262325526499330, 0.666225038821242400, 0.666187750450422560, 0.666150460414133620, 0.666113168712468510, 0.666075875345520490, 0.666038580313382480, 0.666001283616148300, +0.665963985253910980, 0.665926685226763350, 0.665889383534799320, 0.665852080178111820, 0.665814775156794210, 0.665777468470939220, 0.665740160120640970, 0.665702850105992280, +0.665665538427086420, 0.665628225084016420, 0.665590910076876210, 0.665553593405758810, 0.665516275070757280, 0.665478955071964750, 0.665441633409475260, 0.665404310083381630, +0.665366985093777230, 0.665329658440754980, 0.665292330124408910, 0.665255000144832080, 0.665217668502117830, 0.665180335196358890, 0.665143000227649610, 0.665105663596082700, +0.665068325301751420, 0.665030985344749580, 0.664993643725170220, 0.664956300443106940, 0.664918955498652430, 0.664881608891900840, 0.664844260622945330, 0.664806910691879140, +0.664769559098795320, 0.664732205843787890, 0.664694850926950020, 0.664657494348374960, 0.664620136108155850, 0.664582776206386840, 0.664545414643160750, 0.664508051418571170, +0.664470686532711130, 0.664433319985674790, 0.664395951777555060, 0.664358581908445100, 0.664321210378439050, 0.664283837187629960, 0.664246462336111290, 0.664209085823976090, +0.664171707651318610, 0.664134327818231780, 0.664096946324809200, 0.664059563171143900, 0.664022178357329910, 0.663984791883460600, 0.663947403749629240, 0.663910013955929080, +0.663872622502454270, 0.663835229389297840, 0.663797834616553280, 0.663760438184313850, 0.663723040092673690, 0.663685640341725950, 0.663648238931563660, 0.663610835862281200, +0.663573431133971710, 0.663536024746728570, 0.663498616700645030, 0.663461206995815230, 0.663423795632332450, 0.663386382610290260, 0.663348967929781710, 0.663311551590901050, +0.663274133593741540, 0.663236713938396670, 0.663199292624959800, 0.663161869653524970, 0.663124445024185330, 0.663087018737034790, 0.663049590792166190, 0.663012161189674100, +0.662974729929651450, 0.662937297012191730, 0.662899862437389080, 0.662862426205336860, 0.662824988316128460, 0.662787548769857350, 0.662750107566617560, 0.662712664706502700, +0.662675220189606010, 0.662637774016020980, 0.662600326185841860, 0.662562876699162030, 0.662525425556074850, 0.662487972756673820, 0.662450518301053280, 0.662413062189306290, +0.662375604421526760, 0.662338144997807850, 0.662300683918243930, 0.662263221182928240, 0.662225756791954610, 0.662188290745416190, 0.662150823043407330, 0.662113353686021420, +0.662075882673351820, 0.662038410005492910, 0.662000935682537930, 0.661963459704580590, 0.661925982071714270, 0.661888502784033330, 0.661851021841631140, 0.661813539244601400, +0.661776054993037490, 0.661738569087033770, 0.661701081526683610, 0.661663592312080720, 0.661626101443318570, 0.661588608920491540, 0.661551114743692880, 0.661513618913016520, +0.661476121428555720, 0.661438622290404950, 0.661401121498657710, 0.661363619053407240, 0.661326114954748020, 0.661288609202773660, 0.661251101797577730, 0.661213592739253620, +0.661176082027895910, 0.661138569663597960, 0.661101055646453720, 0.661063539976556420, 0.661026022654000570, 0.660988503678879740, 0.660950983051287630, 0.660913460771317630, +0.660875936839064430, 0.660838411254621390, 0.660800884018082240, 0.660763355129540650, 0.660725824589090900, 0.660688292396826580, 0.660650758552841280, 0.660613223057229360, +0.660575685910084420, 0.660538147111500270, 0.660500606661570400, 0.660463064560389390, 0.660425520808050610, 0.660387975404648110, 0.660350428350275350, 0.660312879645026830, +0.660275329288996130, 0.660237777282277060, 0.660200223624963220, 0.660162668317149200, 0.660125111358928480, 0.660087552750394990, 0.660049992491642310, 0.660012430582764930, +0.659974867023856550, 0.659937301815010980, 0.659899734956321820, 0.659862166447883540, 0.659824596289789960, 0.659787024482134550, 0.659749451025011920, 0.659711875918515540, +0.659674299162739560, 0.659636720757777570, 0.659599140703724050, 0.659561559000672700, 0.659523975648717450, 0.659486390647951890, 0.659448803998470720, 0.659411215700367540, +0.659373625753736260, 0.659336034158670590, 0.659298440915265240, 0.659260846023613790, 0.659223249483810170, 0.659185651295948080, 0.659148051460122230, 0.659110449976426320, +0.659072846844953820, 0.659035242065799660, 0.658997635639057330, 0.658960027564820860, 0.658922417843184060, 0.658884806474241520, 0.658847193458086950, 0.658809578794814500, +0.658771962484517640, 0.658734344527291290, 0.658696724923229060, 0.658659103672424970, 0.658621480774972850, 0.658583856230967380, 0.658546230040502170, 0.658508602203671470, +0.658470972720568870, 0.658433341591289190, 0.658395708815926240, 0.658358074394573610, 0.658320438327326120, 0.658282800614277570, 0.658245161255522020, 0.658207520251153140, +0.658169877601265880, 0.658132233305953940, 0.658094587365311350, 0.658056939779432030, 0.658019290548410680, 0.657981639672341020, 0.657943987151317410, 0.657906332985433330, +0.657868677174783920, 0.657831019719462670, 0.657793360619563950, 0.657755699875181450, 0.657718037486410110, 0.657680373453343630, 0.657642707776075920, 0.657605040454701690, +0.657567371489314880, 0.657529700880009730, 0.657492028626879940, 0.657454354730020450, 0.657416679189524960, 0.657379002005487820, 0.657341323178002870, 0.657303642707165010, +0.657265960593067970, 0.657228276835805980, 0.657190591435473090, 0.657152904392163890, 0.657115215705972530, 0.657077525376993150, 0.657039833405319570, 0.657002139791046820, +0.656964444534268610, 0.656926747635079410, 0.656889049093572930, 0.656851348909844200, 0.656813647083987040, 0.656775943616095480, 0.656738238506264340, 0.656700531754587650, +0.656662823361159660, 0.656625113326074210, 0.656587401649426420, 0.656549688331310000, 0.656511973371819440, 0.656474256771048540, 0.656436538529092340, 0.656398818646044880, +0.656361097122000300, 0.656323373957052650, 0.656285649151296950, 0.656247922704827120, 0.656210194617737440, 0.656172464890121930, 0.656134733522075630, 0.656097000513692460, +0.656059265865066470, 0.656021529576292670, 0.655983791647465010, 0.655946052078677950, 0.655908310870025320, 0.655870568021602370, 0.655832823533502920, 0.655795077405821440, +0.655757329638651850, 0.655719580232089320, 0.655681829186227860, 0.655644076501161850, 0.655606322176985330, 0.655568566213793220, 0.655530808611679780, 0.655493049370739380, +0.655455288491065930, 0.655417525972754600, 0.655379761815899520, 0.655341996020594620, 0.655304228586935040, 0.655266459515014940, 0.655228688804928790, 0.655190916456770410, +0.655153142470635160, 0.655115366846617090, 0.655077589584810550, 0.655039810685309700, 0.655002030148209680, 0.654964247973604640, 0.654926464161588840, 0.654888678712256640, +0.654850891625703090, 0.654813102902022210, 0.654775312541308720, 0.654737520543656530, 0.654699726909160900, 0.654661931637915860, 0.654624134730016130, 0.654586336185555620, +0.654548536004629700, 0.654510734187332410, 0.654472930733757900, 0.654435125644001410, 0.654397318918157110, 0.654359510556319580, 0.654321700558582850, 0.654283888925042300, +0.654246075655791960, 0.654208260750926420, 0.654170444210539940, 0.654132626034727660, 0.654094806223583850, 0.654056984777202980, 0.654019161695679310, 0.653981336979108100, +0.653943510627583490, 0.653905682641200190, 0.653867853020052240, 0.653830021764235100, 0.653792188873842830, 0.653754354348969780, 0.653716518189711220, 0.653678680396161280, +0.653640840968414680, 0.653602999906565670, 0.653565157210709510, 0.653527312880940460, 0.653489466917352990, 0.653451619320041700, 0.653413770089101620, 0.653375919224627120, +0.653338066726712800, 0.653300212595453010, 0.653262356830943030, 0.653224499433277090, 0.653186640402549920, 0.653148779738855880, 0.653110917442290220, 0.653073053512947200, +0.653035187950921300, 0.652997320756307680, 0.652959451929200800, 0.652921581469695260, 0.652883709377885420, 0.652845835653866670, 0.652807960297733360, 0.652770083309580080, +0.652732204689501330, 0.652694324437592450, 0.652656442553947610, 0.652618559038661730, 0.652580673891829170, 0.652542787113545190, 0.652504898703904270, 0.652467008663001110, +0.652429116990930090, 0.652391223687786680, 0.652353328753665140, 0.652315432188659950, 0.652277533992866480, 0.652239634166379200, 0.652201732709292830, 0.652163829621701830, +0.652125924903701580, 0.652088018555386450, 0.652050110576851360, 0.652012200968190570, 0.651974289729499670, 0.651936376860873130, 0.651898462362405560, 0.651860546234191430, +0.651822628476326440, 0.651784709088904730, 0.651746788072021350, 0.651708865425770560, 0.651670941150248040, 0.651633015245548060, 0.651595087711765660, 0.651557158548995100, +0.651519227757332060, 0.651481295336870940, 0.651443361287706190, 0.651405425609933420, 0.651367488303647100, 0.651329549368942050, 0.651291608805912750, 0.651253666614654780, +0.651215722795262630, 0.651177777347831220, 0.651139830272455030, 0.651101881569229550, 0.651063931238249460, 0.651025979279609480, 0.650988025693404190, 0.650950070479729190, +0.650912113638679070, 0.650874155170348630, 0.650836195074832480, 0.650798233352226090, 0.650760270002624150, 0.650722305026121270, 0.650684338422812920, 0.650646370192793700, +0.650608400336158630, 0.650570428853002090, 0.650532455743420000, 0.650494481007506620, 0.650456504645357090, 0.650418526657066010, 0.650380547042728850, 0.650342565802440430, +0.650304582936295450, 0.650266598444388830, 0.650228612326815950, 0.650190624583671610, 0.650152635215050620, 0.650114644221047810, 0.650076651601758650, 0.650038657357277950, +0.650000661487700190, 0.649962663993121080, 0.649924664873635430, 0.649886664129338040, 0.649848661760323630, 0.649810657766688000, 0.649772652148525640, 0.649734644905931690, +0.649696636039000740, 0.649658625547828610, 0.649620613432509870, 0.649582599693139580, 0.649544584329812550, 0.649506567342624240, 0.649468548731669590, 0.649430528497043640, +0.649392506638840960, 0.649354483157157380, 0.649316458052087600, 0.649278431323726530, 0.649240402972169230, 0.649202372997511160, 0.649164341399847240, 0.649126308179272080, +0.649088273335881480, 0.649050236869770150, 0.649012198781033330, 0.648974159069765630, 0.648936117736062860, 0.648898074780019820, 0.648860030201731550, 0.648821984001292870, +0.648783936178799590, 0.648745886734346520, 0.648707835668028700, 0.648669782979940930, 0.648631728670179040, 0.648593672738837830, 0.648555615186012460, 0.648517556011797720, +0.648479495216289340, 0.648441432799582330, 0.648403368761771400, 0.648365303102952370, 0.648327235823220050, 0.648289166922669580, 0.648251096401396000, 0.648213024259494900, +0.648174950497061310, 0.648136875114190270, 0.648098798110976810, 0.648060719487516650, 0.648022639243904690, 0.647984557380236080, 0.647946473896605760, 0.647908388793109640, +0.647870302069842530, 0.647832213726899590, 0.647794123764375840, 0.647756032182367210, 0.647717938980968410, 0.647679844160274350, 0.647641747720381080, 0.647603649661383510, +0.647565549983376790, 0.647527448686455840, 0.647489345770716600, 0.647451241236253970, 0.647413135083163230, 0.647375027311539400, 0.647336917921478290, 0.647298806913074840, +0.647260694286424410, 0.647222580041621920, 0.647184464178763300, 0.647146346697943580, 0.647108227599257900, 0.647070106882801310, 0.647031984548669840, 0.646993860596958400, +0.646955735027762050, 0.646917607841176580, 0.646879479037297140, 0.646841348616219000, 0.646803216578037190, 0.646765082922847620, 0.646726947650745340, 0.646688810761825720, +0.646650672256183780, 0.646612532133915340, 0.646574390395115770, 0.646536247039880110, 0.646498102068303490, 0.646459955480481960, 0.646421807276510550, 0.646383657456484630, +0.646345506020499230, 0.646307352968650490, 0.646269198301033240, 0.646231042017743060, 0.646192884118874880, 0.646154724604524830, 0.646116563474788070, 0.646078400729759420, +0.646040236369535230, 0.646002070394210430, 0.645963902803880390, 0.645925733598640250, 0.645887562778586170, 0.645849390343813170, 0.645811216294416730, 0.645773040630491790, +0.645734863352134700, 0.645696684459440400, 0.645658503952504460, 0.645620321831421820, 0.645582138096288840, 0.645543952747200440, 0.645505765784252120, 0.645467577207539110, +0.645429387017157460, 0.645391195213202320, 0.645353001795768930, 0.645314806764953340, 0.645276610120850690, 0.645238411863556570, 0.645200211993166130, 0.645162010509775400, +0.645123807413479630, 0.645085602704374430, 0.645047396382554820, 0.645009188448117170, 0.644970978901156400, 0.644932767741768220, 0.644894554970047880, 0.644856340586091430, +0.644818124589994100, 0.644779906981851390, 0.644741687761758660, 0.644703466929812060, 0.644665244486106850, 0.644627020430738050, 0.644588794763802150, 0.644550567485394190, +0.644512338595609860, 0.644474108094544420, 0.644435875982293900, 0.644397642258953800, 0.644359406924619460, 0.644321169979386380, 0.644282931423350690, 0.644244691256607660, +0.644206449479252980, 0.644168206091381700, 0.644129961093090400, 0.644091714484474000, 0.644053466265628430, 0.644015216436648830, 0.643976964997631570, 0.643938711948671920, +0.643900457289865450, 0.643862201021307420, 0.643823943143094320, 0.643785683655321410, 0.643747422558083810, 0.643709159851478140, 0.643670895535599420, 0.643632629610543570, +0.643594362076405750, 0.643556092933282420, 0.643517822181268850, 0.643479549820460740, 0.643441275850953340, 0.643403000272843140, 0.643364723086225390, 0.643326444291195900, +0.643288163887849930, 0.643249881876283850, 0.643211598256593130, 0.643173313028873370, 0.643135026193220050, 0.643096737749729530, 0.643058447698497070, 0.643020156039618150, +0.642981862773189250, 0.642943567899305620, 0.642905271418063080, 0.642866973329557110, 0.642828673633883960, 0.642790372331139110, 0.642752069421418380, 0.642713764904817130, +0.642675458781431840, 0.642637151051357880, 0.642598841714691060, 0.642560530771526750, 0.642522218221961430, 0.642483904066090680, 0.642445588304010110, 0.642407270935815180, +0.642368951961602490, 0.642330631381467290, 0.642292309195505280, 0.642253985403812840, 0.642215660006485440, 0.642177333003618900, 0.642139004395308580, 0.642100674181651180, +0.642062342362742070, 0.642024008938677060, 0.641985673909551750, 0.641947337275462600, 0.641908999036505110, 0.641870659192775080, 0.641832317744368110, 0.641793974691380660, +0.641755630033908340, 0.641717283772046840, 0.641678935905891870, 0.641640586435539890, 0.641602235361086400, 0.641563882682627320, 0.641525528400258230, 0.641487172514075610, +0.641448815024175060, 0.641410455930652160, 0.641372095233603500, 0.641333732933124570, 0.641295369029311280, 0.641257003522259340, 0.641218636412065110, 0.641180267698824300, +0.641141897382632830, 0.641103525463586290, 0.641065151941781370, 0.641026776817313460, 0.640988400090278580, 0.640950021760772430, 0.640911641828891600, 0.640873260294731570, +0.640834877158388380, 0.640796492419957730, 0.640758106079536200, 0.640719718137219400, 0.640681328593102890, 0.640642937447283400, 0.640604544699856620, 0.640566150350918460, +0.640527754400564640, 0.640489356848891740, 0.640450957695995470, 0.640412556941971740, 0.640374154586916270, 0.640335750630925850, 0.640297345074095970, 0.640258937916522770, +0.640220529158301850, 0.640182118799530020, 0.640143706840302860, 0.640105293280716410, 0.640066878120866380, 0.640028461360849450, 0.639990043000761450, 0.639951623040697970, +0.639913201480755810, 0.639874778321030570, 0.639836353561618500, 0.639797927202615080, 0.639759499244117350, 0.639721069686220670, 0.639682638529021410, 0.639644205772615270, +0.639605771417098850, 0.639567335462568050, 0.639528897909118930, 0.639490458756847180, 0.639452018005849720, 0.639413575656222140, 0.639375131708060600, 0.639336686161460890, +0.639298239016519830, 0.639259790273333240, 0.639221339931996700, 0.639182887992607250, 0.639144434455260590, 0.639105979320052750, 0.639067522587079660, 0.639029064256438240, +0.638990604328223970, 0.638952142802533320, 0.638913679679461890, 0.638875214959106600, 0.638836748641563370, 0.638798280726928120, 0.638759811215296900, 0.638721340106766510, +0.638682867401432760, 0.638644393099391920, 0.638605917200739670, 0.638567439705572950, 0.638528960613987670, 0.638490479926079990, 0.638451997641945710, 0.638413513761681870, +0.638375028285384170, 0.638336541213148530, 0.638298052545071990, 0.638259562281250250, 0.638221070421779670, 0.638182576966755950, 0.638144081916276250, 0.638105585270436260, +0.638067087029332350, 0.638028587193060440, 0.637990085761717340, 0.637951582735398980, 0.637913078114201730, 0.637874571898221390, 0.637836064087555000, 0.637797554682298480, +0.637759043682547990, 0.637720531088399660, 0.637682016899950190, 0.637643501117295840, 0.637604983740532320, 0.637566464769756650, 0.637527944205064870, 0.637489422046553230, +0.637450898294317670, 0.637412372948455210, 0.637373846009061880, 0.637335317476233840, 0.637296787350067230, 0.637258255630658970, 0.637219722318105090, 0.637181187412501850, +0.637142650913945290, 0.637104112822532540, 0.637065573138359430, 0.637027031861522430, 0.636988488992117460, 0.636949944530241670, 0.636911398475990990, 0.636872850829461430, +0.636834301590750160, 0.636795750759953090, 0.636757198337166710, 0.636718644322486930, 0.636680088716010890, 0.636641531517834650, 0.636602972728054550, 0.636564412346766640, +0.636525850374068170, 0.636487286810054950, 0.636448721654823580, 0.636410154908470080, 0.636371586571091500, 0.636333016642783970, 0.636294445123643860, 0.636255872013767320, +0.636217297313251380, 0.636178721022192310, 0.636140143140686340, 0.636101563668829750, 0.636062982606719560, 0.636024399954451920, 0.635985815712122870, 0.635947229879829660, +0.635908642457668430, 0.635870053445735550, 0.635831462844127280, 0.635792870652940540, 0.635754276872271710, 0.635715681502217240, 0.635677084542873190, 0.635638485994336700, +0.635599885856704020, 0.635561284130071740, 0.635522680814535780, 0.635484075910193510, 0.635445469417140970, 0.635406861335474860, 0.635368251665291210, 0.635329640406687270, +0.635291027559759300, 0.635252413124603340, 0.635213797101316760, 0.635175179489995580, 0.635136560290736510, 0.635097939503635690, 0.635059317128790380, 0.635020693166296830, +0.634982067616251420, 0.634943440478750620, 0.634904811753891460, 0.634866181441770430, 0.634827549542483770, 0.634788916056127970, 0.634750280982800170, 0.634711644322596750, +0.634673006075614170, 0.634634366241948800, 0.634595724821697790, 0.634557081814957400, 0.634518437221824110, 0.634479791042394940, 0.634441143276766370, 0.634402493925035000, +0.634363842987296980, 0.634325190463649660, 0.634286536354189410, 0.634247880659012830, 0.634209223378216170, 0.634170564511896790, 0.634131904060150960, 0.634093242023075490, +0.634054578400766510, 0.634015913193321400, 0.633977246400836520, 0.633938578023408580, 0.633899908061133830, 0.633861236514109640, 0.633822563382432370, 0.633783888666198280, +0.633745212365504850, 0.633706534480448450, 0.633667855011125660, 0.633629173957632850, 0.633590491320067510, 0.633551807098525990, 0.633513121293104890, 0.633474433903900680, +0.633435744931010620, 0.633397054374531310, 0.633358362234559320, 0.633319668511191040, 0.633280973204524030, 0.633242276314654570, 0.633203577841679350, 0.633164877785694860, +0.633126176146798560, 0.633087472925086820, 0.633048768120656360, 0.633010061733603640, 0.632971353764026130, 0.632932644212020220, 0.632893933077682380, 0.632855220361109970, +0.632816506062399590, 0.632777790181648040, 0.632739072718951470, 0.632700353674407690, 0.632661633048112960, 0.632622910840164200, 0.632584187050657780, 0.632545461679691280, +0.632506734727361080, 0.632468006193764090, 0.632429276078996680, 0.632390544383156450, 0.632351811106339870, 0.632313076248643750, 0.632274339810164680, 0.632235601791000020, +0.632196862191246380, 0.632158121011000220, 0.632119378250359130, 0.632080633909419490, 0.632041887988278430, 0.632003140487032210, 0.631964391405778540, 0.631925640744613770, +0.631886888503635060, 0.631848134682938660, 0.631809379282622260, 0.631770622302782470, 0.631731863743516200, 0.631693103604919810, 0.631654341887091020, 0.631615578590126400, +0.631576813714122890, 0.631538047259176950, 0.631499279225386180, 0.631460509612847280, 0.631421738421656720, 0.631382965651912210, 0.631344191303710220, 0.631305415377147790, +0.631266637872321510, 0.631227858789328970, 0.631189078128266750, 0.631150295889231770, 0.631111512072320860, 0.631072726677631370, 0.631033939705260230, 0.630995151155304130, +0.630956361027859790, 0.630917569323024900, 0.630878776040896150, 0.630839981181570360, 0.630801184745144350, 0.630762386731715700, 0.630723587141381100, 0.630684785974237490, +0.630645983230381680, 0.630607178909911140, 0.630568373012922680, 0.630529565539513000, 0.630490756489779700, 0.630451945863819470, 0.630413133661729460, 0.630374319883606260, +0.630335504529547560, 0.630296687599650070, 0.630257869094010940, 0.630219049012726740, 0.630180227355895290, 0.630141404123613300, 0.630102579315977680, 0.630063752933085360, +0.630024924975034040, 0.629986095441920410, 0.629947264333841410, 0.629908431650894050, 0.629869597393175830, 0.629830761560783770, 0.629791924153814350, 0.629753085172365500, +0.629714244616533910, 0.629675402486416740, 0.629636558782110670, 0.629597713503713630, 0.629558866651322210, 0.629520018225033670, 0.629481168224944710, 0.629442316651153240, +0.629403463503755980, 0.629364608782850050, 0.629325752488532180, 0.629286894620900370, 0.629248035180051240, 0.629209174166082020, 0.629170311579089650, 0.629131447419171710, +0.629092581686425230, 0.629053714380946930, 0.629014845502834600, 0.628975975052185280, 0.628937103029096000, 0.628898229433663580, 0.628859354265985940, 0.628820477526159880, +0.628781599214282670, 0.628742719330451120, 0.628703837874763140, 0.628664954847315550, 0.628626070248205600, 0.628587184077530110, 0.628548296335387000, 0.628509407021873080, +0.628470516137085710, 0.628431623681121710, 0.628392729654079000, 0.628353834056054380, 0.628314936887144900, 0.628276038147448480, 0.628237137837061920, 0.628198235956082480, +0.628159332504607090, 0.628120427482733780, 0.628081520890559350, 0.628042612728181180, 0.628003702995696080, 0.627964791693202070, 0.627925878820796090, 0.627886964378575390, +0.627848048366636990, 0.627809130785078830, 0.627770211633997710, 0.627731290913491220, 0.627692368623656070, 0.627653444764590400, 0.627614519336391010, 0.627575592339155390, +0.627536663772980450, 0.627497733637964240, 0.627458801934203670, 0.627419868661795670, 0.627380933820838370, 0.627341997411428820, 0.627303059433664270, 0.627264119887641640, +0.627225178773459070, 0.627186236091213600, 0.627147291841002490, 0.627108346022922870, 0.627069398637072670, 0.627030449683549040, 0.626991499162449230, 0.626952547073870380, +0.626913593417910420, 0.626874638194666600, 0.626835681404236070, 0.626796723046716080, 0.626757763122204550, 0.626718801630798630, 0.626679838572595350, 0.626640873947692860, +0.626601907756188180, 0.626562939998178690, 0.626523970673761530, 0.626484999783034850, 0.626446027326095670, 0.626407053303041360, 0.626368077713969070, 0.626329100558976950, +0.626290121838162020, 0.626251141551621870, 0.626212159699453430, 0.626173176281755060, 0.626134191298623690, 0.626095204750156790, 0.626056216636451610, 0.626017226957606200, +0.625978235713717690, 0.625939242904883340, 0.625900248531201080, 0.625861252592768370, 0.625822255089682480, 0.625783256022040550, 0.625744255389940830, 0.625705253193480470, +0.625666249432757060, 0.625627244107867630, 0.625588237218910330, 0.625549228765982620, 0.625510218749181670, 0.625471207168604940, 0.625432194024350570, 0.625393179316515610, +0.625354163045197750, 0.625315145210494140, 0.625276125812503030, 0.625237104851321560, 0.625198082327047320, 0.625159058239777580, 0.625120032589610460, 0.625081005376643350, +0.625041976600973380, 0.625002946262698810, 0.624963914361916780, 0.624924880898725110, 0.624885845873220820, 0.624846809285502180, 0.624807771135666660, 0.624768731423811620, +0.624729690150034430, 0.624690647314433360, 0.624651602917105640, 0.624612556958148990, 0.624573509437660550, 0.624534460355738670, 0.624495409712480740, 0.624456357507984120, +0.624417303742346390, 0.624378248415665690, 0.624339191528039410, 0.624300133079564780, 0.624261073070340180, 0.624222011500462860, 0.624182948370030520, 0.624143883679140530, +0.624104817427891030, 0.624065749616379620, 0.624026680244703760, 0.623987609312960930, 0.623948536821249400, 0.623909462769666520, 0.623870387158310000, 0.623831309987277090, +0.623792231256666270, 0.623753150966574910, 0.623714069117100700, 0.623674985708340900, 0.623635900740394100, 0.623596814213357440, 0.623557726127328400, 0.623518636482405460, +0.623479545278685880, 0.623440452516267450, 0.623401358195247560, 0.623362262315724560, 0.623323164877795930, 0.623284065881559490, 0.623244965327112380, 0.623205863214553290, +0.623166759543979490, 0.623127654315488890, 0.623088547529178750, 0.623049439185147550, 0.623010329283492760, 0.622971217824312200, 0.622932104807703220, 0.622892990233764320, +0.622853874102592960, 0.622814756414286630, 0.622775637168943690, 0.622736516366661610, 0.622697394007538320, 0.622658270091671180, 0.622619144619158680, 0.622580017590098290, +0.622540889004587930, 0.622501758862724960, 0.622462627164607980, 0.622423493910334360, 0.622384359100002120, 0.622345222733708510, 0.622306084811552250, 0.622266945333630810, +0.622227804300041990, 0.622188661710883270, 0.622149517566253250, 0.622110371866249400, 0.622071224610969750, 0.622032075800511560, 0.621992925434973640, 0.621953773514453360, +0.621914620039048180, 0.621875465008856930, 0.621836308423977080, 0.621797150284506330, 0.621757990590542380, 0.621718829342183810, 0.621679666539528220, 0.621640502182673420, +0.621601336271716990, 0.621562168806757630, 0.621522999787892830, 0.621483829215220500, 0.621444657088838230, 0.621405483408844720, 0.621366308175337560, 0.621327131388414560, +0.621287953048173300, 0.621248773154712610, 0.621209591708129950, 0.621170408708523030, 0.621131224155990310, 0.621092038050629620, 0.621052850392538770, 0.621013661181815560, +0.620974470418558470, 0.620935278102865200, 0.620896084234833780, 0.620856888814561690, 0.620817691842147860, 0.620778493317689750, 0.620739293241285410, 0.620700091613032410, +0.620660888433029690, 0.620621683701374600, 0.620582477418165410, 0.620543269583499590, 0.620504060197475950, 0.620464849260192190, 0.620425636771746000, 0.620386422732235990, +0.620347207141759950, 0.620307990000415920, 0.620268771308301600, 0.620229551065515690, 0.620190329272155780, 0.620151105928320230, 0.620111881034106420, 0.620072654589613360, +0.620033426594938540, 0.619994197050180220, 0.619954965955436090, 0.619915733310804850, 0.619876499116384320, 0.619837263372272520, 0.619798026078567150, 0.619758787235367150, +0.619719546842770200, 0.619680304900874330, 0.619641061409777370, 0.619601816369578120, 0.619562569780374270, 0.619523321642263650, 0.619484071955345160, 0.619444820719716400, +0.619405567935475630, 0.619366313602720540, 0.619327057721550060, 0.619287800292061990, 0.619248541314354360, 0.619209280788525000, 0.619170018714672810, 0.619130755092895610, +0.619091489923291550, 0.619052223205958320, 0.619012954940994950, 0.618973685128499150, 0.618934413768569170, 0.618895140861302820, 0.618855866406798900, 0.618816590405155350, +0.618777312856469970, 0.618738033760841690, 0.618698753118368310, 0.618659470929148080, 0.618620187193278710, 0.618580901910859350, 0.618541615081987680, 0.618502326706761970, +0.618463036785280140, 0.618423745317640990, 0.618384452303942460, 0.618345157744282890, 0.618305861638760000, 0.618266563987472930, 0.618227264790519370, 0.618187964047997580, +0.618148661760005600, 0.618109357926642340, 0.618070052548005620, 0.618030745624193470, 0.617991437155304800, 0.617952127141437550, 0.617912815582689960, 0.617873502479159950, +0.617834187830946570, 0.617794871638147720, 0.617755553900861680, 0.617716234619186460, 0.617676913793220870, 0.617637591423063180, 0.617598267508811420, 0.617558942050563610, +0.617519615048418790, 0.617480286502475000, 0.617440956412830480, 0.617401624779583160, 0.617362291602832180, 0.617322956882675470, 0.617283620619210940, 0.617244282812537850, +0.617204943462753900, 0.617165602569957670, 0.617126260134247100, 0.617086916155721200, 0.617047570634478020, 0.617008223570615910, 0.616968874964232920, 0.616929524815428070, +0.616890173124299390, 0.616850819890945370, 0.616811465115463810, 0.616772108797954080, 0.616732750938513980, 0.616693391537242010, 0.616654030594236290, 0.616614668109595750, +0.616575304083418540, 0.616535938515803130, 0.616496571406847440, 0.616457202756650720, 0.616417832565311020, 0.616378460832926360, 0.616339087559595990, 0.616299712745417730, +0.616260336390490380, 0.616220958494911650, 0.616181579058781010, 0.616142198082196390, 0.616102815565256260, 0.616063431508058650, 0.616024045910702920, 0.615984658773287120, +0.615945270095909600, 0.615905879878668520, 0.615866488121663220, 0.615827094824991540, 0.615787699988752270, 0.615748303613043340, 0.615708905697963990, 0.615669506243612390, +0.615630105250086660, 0.615590702717485950, 0.615551298645908630, 0.615511893035452950, 0.615472485886217170, 0.615433077198300650, 0.615393666971801310, 0.615354255206817860, +0.615314841903448430, 0.615275427061792280, 0.615236010681947550, 0.615196592764012730, 0.615157173308086060, 0.615117752314266910, 0.615078329782653310, 0.615038905713343960, +0.614999480106436900, 0.614960052962031490, 0.614920624280226090, 0.614881194061118630, 0.614841762304808580, 0.614802329011394090, 0.614762894180973850, 0.614723457813646010, +0.614684019909509830, 0.614644580468663660, 0.614605139491205990, 0.614565696977235180, 0.614526252926850370, 0.614486807340150040, 0.614447360217232670, 0.614407911558196520, +0.614368461363140940, 0.614329009632164190, 0.614289556365364970, 0.614250101562841430, 0.614210645224693040, 0.614171187351018060, 0.614131727941915060, 0.614092266997482430, +0.614052804517819520, 0.614013340503024470, 0.613973874953195890, 0.613934407868432790, 0.613894939248833760, 0.613855469094497400, 0.613815997405522060, 0.613776524182007010, +0.613737049424050610, 0.613697573131751660, 0.613658095305208430, 0.613618615944520270, 0.613579135049785560, 0.613539652621102990, 0.613500168658571040, 0.613460683162288970, +0.613421196132355240, 0.613381707568868450, 0.613342217471926960, 0.613302725841630480, 0.613263232678077030, 0.613223737981365200, 0.613184241751594360, 0.613144743988862980, +0.613105244693269660, 0.613065743864912970, 0.613026241503892180, 0.612986737610305750, 0.612947232184252620, 0.612907725225830920, 0.612868216735140360, 0.612828706712279180, +0.612789195157346310, 0.612749682070440000, 0.612710167451659960, 0.612670651301104430, 0.612631133618872340, 0.612591614405061930, 0.612552093659772920, 0.612512571383103670, +0.612473047575152640, 0.612433522236019320, 0.612393995365802300, 0.612354466964600160, 0.612314937032511610, 0.612275405569636000, 0.612235872576071930, 0.612196338051918090, +0.612156801997273070, 0.612117264412236460, 0.612077725296906630, 0.612038184651382490, 0.611998642475762630, 0.611959098770146430, 0.611919553534632450, 0.611880006769319640, +0.611840458474306460, 0.611800908649692500, 0.611761357295576240, 0.611721804412056260, 0.611682249999232150, 0.611642694057202400, 0.611603136586065800, 0.611563577585921170, +0.611524017056867870, 0.611484454999004500, 0.611444891412429970, 0.611405326297242980, 0.611365759653542900, 0.611326191481428530, 0.611286621780998680, 0.611247050552351840, +0.611207477795587710, 0.611167903510804970, 0.611128327698102440, 0.611088750357578810, 0.611049171489333580, 0.611009591093465420, 0.610970009170073270, 0.610930425719255710, +0.610890840741112550, 0.610851254235742270, 0.610811666203243450, 0.610772076643715800, 0.610732485557258010, 0.610692892943969000, 0.610653298803947360, 0.610613703137292910, +0.610574105944104110, 0.610534507224480110, 0.610494906978519490, 0.610455305206321850, 0.610415701907986110, 0.610376097083610960, 0.610336490733295320, 0.610296882857138790, +0.610257273455240060, 0.610217662527698050, 0.610178050074611680, 0.610138436096080430, 0.610098820592203110, 0.610059203563078410, 0.610019585008806040, 0.609979964929484700, +0.609940343325213520, 0.609900720196091100, 0.609861095542217120, 0.609821469363690530, 0.609781841660610220, 0.609742212433074910, 0.609702581681184520, 0.609662949405037620, +0.609623315604733370, 0.609583680280370470, 0.609544043432048600, 0.609504405059866810, 0.609464765163923890, 0.609425123744318790, 0.609385480801151180, 0.609345836334519890, +0.609306190344523600, 0.609266542831262250, 0.609226893794834520, 0.609187243235339570, 0.609147591152876090, 0.609107937547544110, 0.609068282419442220, 0.609028625768669560, +0.608988967595325060, 0.608949307899508520, 0.608909646681318640, 0.608869983940854680, 0.608830319678215440, 0.608790653893500730, 0.608750986586809370, 0.608711317758240500, +0.608671647407893040, 0.608631975535866790, 0.608592302142260680, 0.608552627227173740, 0.608512950790704890, 0.608473272832954050, 0.608433593354019920, 0.608393912354001530, +0.608354229832998690, 0.608314545791110330, 0.608274860228435580, 0.608235173145073360, 0.608195484541123490, 0.608155794416684990, 0.608116102771856900, 0.608076409606738260, +0.608036714921428970, 0.607997018716027850, 0.607957320990634150, 0.607917621745346910, 0.607877920980265940, 0.607838218695490040, 0.607798514891118690, 0.607758809567250700, +0.607719102723986100, 0.607679394361423600, 0.607639684479662430, 0.607599973078802310, 0.607560260158942270, 0.607520545720181550, 0.607480829762619080, 0.607441112286355000, +0.607401393291488010, 0.607361672778117590, 0.607321950746342760, 0.607282227196263240, 0.607242502127978260, 0.607202775541586970, 0.607163047437188410, 0.607123317814882490, +0.607083586674768360, 0.607043854016945270, 0.607004119841512150, 0.606964384148569120, 0.606924646938215130, 0.606884908210549190, 0.606845167965671340, 0.606805426203680500, +0.606765682924676140, 0.606725938128757190, 0.606686191816023790, 0.606646443986574970, 0.606606694640509870, 0.606566943777927860, 0.606527191398928740, 0.606487437503611670, +0.606447682092076000, 0.606407925164420770, 0.606368166720746000, 0.606328406761150960, 0.606288645285734780, 0.606248882294596720, 0.606209117787836820, 0.606169351765553980, +0.606129584227847570, 0.606089815174817530, 0.606050044606562870, 0.606010272523183180, 0.605970498924777390, 0.605930723811445750, 0.605890947183287290, 0.605851169040401480, +0.605811389382887370, 0.605771608210845080, 0.605731825524373880, 0.605692041323573020, 0.605652255608541750, 0.605612468379380210, 0.605572679636187550, 0.605532889379063130, +0.605493097608106100, 0.605453304323416710, 0.605413509525094100, 0.605373713213237630, 0.605333915387946560, 0.605294116049321040, 0.605254315197460310, 0.605214512832463410, +0.605174708954430600, 0.605134903563460890, 0.605095096659654000, 0.605055288243109060, 0.605015478313926210, 0.604975666872204720, 0.604935853918043940, 0.604896039451543240, +0.604856223472802880, 0.604816405981921880, 0.604776586978999830, 0.604736766464135990, 0.604696944437430610, 0.604657120898982820, 0.604617295848892340, 0.604577469287258200, +0.604537641214180630, 0.604497811629759130, 0.604457980534092610, 0.604418147927281660, 0.604378313809425190, 0.604338478180622920, 0.604298641040974190, 0.604258802390579160, +0.604218962229537190, 0.604179120557947760, 0.604139277375910220, 0.604099432683524840, 0.604059586480890860, 0.604019738768107880, 0.603979889545275260, 0.603940038812493140, +0.603900186569861110, 0.603860332817478530, 0.603820477555444660, 0.603780620783860080, 0.603740762502823940, 0.603700902712435480, 0.603661041412795200, 0.603621178604002220, +0.603581314286156360, 0.603541448459356870, 0.603501581123704110, 0.603461712279297350, 0.603421841926236270, 0.603381970064620350, 0.603342096694549750, 0.603302221816124030, +0.603262345429442680, 0.603222467534605070, 0.603182588131711770, 0.603142707220861940, 0.603102824802155270, 0.603062940875691230, 0.603023055441570200, 0.602983168499891530, +0.602943280050754930, 0.602903390094259860, 0.602863498630506590, 0.602823605659594590, 0.602783711181623220, 0.602743815196692960, 0.602703917704903060, 0.602664018706353440, +0.602624118201143370, 0.602584216189373410, 0.602544312671142950, 0.602504407646551670, 0.602464501115698940, 0.602424593078685460, 0.602384683535610370, 0.602344772486573590, +0.602304859931674600, 0.602264945871013760, 0.602225030304690550, 0.602185113232804770, 0.602145194655455910, 0.602105274572744320, 0.602065352984769600, 0.602025429891631100, +0.601985505293429420, 0.601945579190264040, 0.601905651582234640, 0.601865722469440700, 0.601825791851982930, 0.601785859729960570, 0.601745926103473660, 0.601705990972621560, +0.601666054337504750, 0.601626116198222820, 0.601586176554875670, 0.601546235407562690, 0.601506292756384560, 0.601466348601440550, 0.601426402942830780, 0.601386455780654640, +0.601346507115012700, 0.601306556946004430, 0.601266605273729440, 0.601226652098288290, 0.601186697419780590, 0.601146741238306030, 0.601106783553964410, 0.601066824366856100, +0.601026863677080690, 0.600986901484738210, 0.600946937789928030, 0.600906972592750940, 0.600867005893306330, 0.600827037691694210, 0.600787067988014290, 0.600747096782366930, +0.600707124074851830, 0.600667149865568910, 0.600627174154617860, 0.600587196942099170, 0.600547218228112410, 0.600507238012757290, 0.600467256296134510, 0.600427273078343540, +0.600387288359484410, 0.600347302139656700, 0.600307314418961010, 0.600267325197497150, 0.600227334475364920, 0.600187342252664010, 0.600147348529495030, 0.600107353305957770, +0.600067356582152040, 0.600027358358177660, 0.599987358634135210, 0.599947357410124390, 0.599907354686245120, 0.599867350462597090, 0.599827344739281120, 0.599787337516396680, +0.599747328794044020, 0.599707318572322620, 0.599667306851333290, 0.599627293631175730, 0.599587278911949520, 0.599547262693755470, 0.599507244976693280, 0.599467225760862980, +0.599427205046364260, 0.599387182833297840, 0.599347159121763510, 0.599307133911861300, 0.599267107203690920, 0.599227078997353060, 0.599187049292947530, 0.599147018090574360, +0.599106985390333360, 0.599066951192325230, 0.599026915496649660, 0.598986878303406800, 0.598946839612696460, 0.598906799424619330, 0.598866757739275220, 0.598826714556763840, +0.598786669877185980, 0.598746623700641580, 0.598706576027230540, 0.598666526857052680, 0.598626476190208920, 0.598586424026798960, 0.598546370366922930, 0.598506315210680540, +0.598466258558172810, 0.598426200409499450, 0.598386140764760490, 0.598346079624055950, 0.598306016987486420, 0.598265952855151940, 0.598225887227152640, 0.598185820103588120, +0.598145751484559510, 0.598105681370166510, 0.598065609760508930, 0.598025536655687700, 0.597985462055802610, 0.597945385960953810, 0.597905308371241230, 0.597865229286765780, +0.597825148707627260, 0.597785066633925830, 0.597744983065761400, 0.597704898003234790, 0.597664811446446010, 0.597624723395495220, 0.597584633850482220, 0.597544542811508040, +0.597504450278672490, 0.597464356252075720, 0.597424260731817870, 0.597384163717999630, 0.597344065210720920, 0.597303965210082110, 0.597263863716183120, 0.597223760729124640, +0.597183656249006930, 0.597143550275929580, 0.597103442809993830, 0.597063333851299390, 0.597023223399946730, 0.596983111456035550, 0.596942998019666990, 0.596902883090940860, +0.596862766669957630, 0.596822648756817120, 0.596782529351620240, 0.596742408454467130, 0.596702286065457940, 0.596662162184692700, 0.596622036812272440, 0.596581909948297070, +0.596541781592866970, 0.596501651746081940, 0.596461520408043230, 0.596421387578850770, 0.596381253258604360, 0.596341117447405260, 0.596300980145353380, 0.596260841352548980, +0.596220701069092080, 0.596180559295083960, 0.596140416030624290, 0.596100271275813660, 0.596060125030751900, 0.596019977295540240, 0.595979828070278720, 0.595939677355067480, +0.595899525150006770, 0.595859371455197630, 0.595819216270739970, 0.595779059596734380, 0.595738901433280680, 0.595698741780480210, 0.595658580638432800, 0.595618418007238580, +0.595578253886998700, 0.595538088277813180, 0.595497921179782400, 0.595457752593006480, 0.595417582517586590, 0.595377410953622620, 0.595337237901215290, 0.595297063360464400, +0.595256887331471200, 0.595216709814335830, 0.595176530809158670, 0.595136350316039840, 0.595096168335080500, 0.595055984866380670, 0.595015799910040940, 0.594975613466161350, +0.594935425534843020, 0.594895236116186220, 0.594855045210291310, 0.594814852817258320, 0.594774658937188730, 0.594734463570182340, 0.594694266716339510, 0.594654068375761400, +0.594613868548548030, 0.594573667234800100, 0.594533464434617520, 0.594493260148101780, 0.594453054375352790, 0.594412847116471130, 0.594372638371557070, 0.594332428140711740, +0.594292216424035400, 0.594252003221628520, 0.594211788533591130, 0.594171572360024710, 0.594131354701029400, 0.594091135556705670, 0.594050914927153780, 0.594010692812474980, +0.593970469212769410, 0.593930244128137220, 0.593890017558679870, 0.593849789504497520, 0.593809559965690630, 0.593769328942359450, 0.593729096434605360, 0.593688862442528500, +0.593648626966229550, 0.593608390005808560, 0.593568151561367000, 0.593527911633005110, 0.593487670220823380, 0.593447427324922170, 0.593407182945402730, 0.593366937082365320, +0.593326689735910630, 0.593286440906138800, 0.593246190593151200, 0.593205938797048190, 0.593165685517929920, 0.593125430755897850, 0.593085174511052140, 0.593044916783493580, +0.593004657573322320, 0.592964396880639730, 0.592924134705546170, 0.592883871048142330, 0.592843605908528360, 0.592803339286805840, 0.592763071183074920, 0.592722801597436290, +0.592682530529990310, 0.592642257980838360, 0.592601983950080900, 0.592561708437818300, 0.592521431444151150, 0.592481152969180800, 0.592440873013007520, 0.592400591575731660, +0.592360308657454810, 0.592320024258277120, 0.592279738378299390, 0.592239451017621880, 0.592199162176346160, 0.592158871854572500, 0.592118580052401700, 0.592078286769934130, +0.592037992007271140, 0.591997695764513110, 0.591957398041760950, 0.591917098839114920, 0.591876798156676490, 0.591836495994546020, 0.591796192352824320, 0.591755887231611880, +0.591715580631009930, 0.591675272551119180, 0.591634962992040100, 0.591594651953873400, 0.591554339436720310, 0.591514025440681430, 0.591473709965857130, 0.591433393012348870, +0.591393074580257250, 0.591352754669682850, 0.591312433280726140, 0.591272110413488820, 0.591231786068071140, 0.591191460244574030, 0.591151132943097960, 0.591110804163744400, +0.591070473906613710, 0.591030142171806940, 0.590989808959424550, 0.590949474269567790, 0.590909138102337470, 0.590868800457834300, 0.590828461336158740, 0.590788120737412380, +0.590747778661695810, 0.590707435109109280, 0.590667090079754600, 0.590626743573732240, 0.590586395591143010, 0.590546046132087390, 0.590505695196666960, 0.590465342784982420, +0.590424988897134460, 0.590384633533223680, 0.590344276693351660, 0.590303918377618860, 0.590263558586126450, 0.590223197318974660, 0.590182834576265300, 0.590142470358098750, +0.590102104664576130, 0.590061737495797820, 0.590021368851865620, 0.589980998732879900, 0.589940627138941350, 0.589900254070151680, 0.589859879526611230, 0.589819503508421160, +0.589779126015681940, 0.589738747048495380, 0.589698366606961840, 0.589657984691182360, 0.589617601301257620, 0.589577216437289220, 0.589536830099377740, 0.589496442287624320, +0.589456053002129330, 0.589415662242994580, 0.589375270010320640, 0.589334876304208550, 0.589294481124758910, 0.589254084472073500, 0.589213686346252820, 0.589173286747397880, +0.589132885675609400, 0.589092483130989050, 0.589052079113637550, 0.589011673623655470, 0.588971266661144520, 0.588930858226205390, 0.588890448318939220, 0.588850036939446490, +0.588809624087829000, 0.588769209764187560, 0.588728793968622990, 0.588688376701236080, 0.588647957962128650, 0.588607537751401290, 0.588567116069155130, 0.588526692915490760, +0.588486268290510100, 0.588445842194313730, 0.588405414627002690, 0.588364985588677780, 0.588324555079440810, 0.588284123099392490, 0.588243689648633380, 0.588203254727265530, +0.588162818335389410, 0.588122380473106390, 0.588081941140516930, 0.588041500337723070, 0.588001058064825390, 0.587960614321925150, 0.587920169109122930, 0.587879722426520650, +0.587839274274219110, 0.587798824652319360, 0.587758373560922200, 0.587717921000129540, 0.587677466970041970, 0.587637011470760750, 0.587596554502386680, 0.587556096065021570, +0.587515636158766230, 0.587475174783721350, 0.587434711939988970, 0.587394247627669900, 0.587353781846865040, 0.587313314597675440, 0.587272845880202900, 0.587232375694548340, +0.587191904040812670, 0.587151430919097050, 0.587110956329503160, 0.587070480272131820, 0.587030002747084280, 0.586989523754461450, 0.586949043294365150, 0.586908561366896180, +0.586868077972155900, 0.586827593110245020, 0.586787106781265440, 0.586746618985318210, 0.586706129722504020, 0.586665638992924900, 0.586625146796681650, 0.586584653133875530, +0.586544158004607460, 0.586503661408979250, 0.586463163347092030, 0.586422663819046840, 0.586382162824944600, 0.586341660364887330, 0.586301156438975850, 0.586260651047311620, +0.586220144189995240, 0.586179635867128960, 0.586139126078813580, 0.586098614825150470, 0.586058102106240320, 0.586017587922185390, 0.585977072273086370, 0.585936555159044750, +0.585896036580161320, 0.585855516536538220, 0.585814995028276390, 0.585774472055476610, 0.585733947618241050, 0.585693421716670600, 0.585652894350866540, 0.585612365520929990, +0.585571835226962770, 0.585531303469066120, 0.585490770247341090, 0.585450235561888800, 0.585409699412811290, 0.585369161800209590, 0.585328622724184840, 0.585288082184838300, +0.585247540182271870, 0.585206996716586600, 0.585166451787883850, 0.585125905396264630, 0.585085357541831000, 0.585044808224683850, 0.585004257444924460, 0.584963705202654730, +0.584923151497975800, 0.584882596330988940, 0.584842039701795270, 0.584801481610496720, 0.584760922057194650, 0.584720361041990210, 0.584679798564984420, 0.584639234626279650, +0.584598669225976700, 0.584558102364177050, 0.584517534040981830, 0.584476964256493090, 0.584436393010812070, 0.584395820304039910, 0.584355246136277980, 0.584314670507628200, +0.584274093418191810, 0.584233514868069740, 0.584192934857364230, 0.584152353386176440, 0.584111770454607830, 0.584071186062759320, 0.584030600210733280, 0.583990012898630730, +0.583949424126553150, 0.583908833894601580, 0.583868242202878360, 0.583827649051484540, 0.583787054440521590, 0.583746458370090540, 0.583705860840293860, 0.583665261851232460, +0.583624661403007840, 0.583584059495721340, 0.583543456129475000, 0.583502851304369960, 0.583462245020507810, 0.583421637277989680, 0.583381028076917940, 0.583340417417393510, +0.583299805299517750, 0.583259191723392690, 0.583218576689119810, 0.583177960196800460, 0.583137342246535790, 0.583096722838428170, 0.583056101972578730, 0.583015479649089060, +0.582974855868060300, 0.582934230629594710, 0.582893603933793640, 0.582852975780758560, 0.582812346170590630, 0.582771715103392210, 0.582731082579264430, 0.582690448598309100, +0.582649813160627140, 0.582609176266321030, 0.582568537915492010, 0.582527898108241350, 0.582487256844671290, 0.582446614124882970, 0.582405969948978200, 0.582365324317058120, +0.582324677229225210, 0.582284028685580490, 0.582243378686225670, 0.582202727231262100, 0.582162074320792030, 0.582121419954916840, 0.582080764133738100, 0.582040106857356960, +0.581999448125876010, 0.581958787939396480, 0.581918126298019980, 0.581877463201847740, 0.581836798650982260, 0.581796132645524660, 0.581755465185576530, 0.581714796271240010, +0.581674125902616470, 0.581633454079807710, 0.581592780802914880, 0.581552106072040440, 0.581511429887285880, 0.581470752248752550, 0.581430073156542160, 0.581389392610756840, +0.581348710611498070, 0.581308027158867540, 0.581267342252966500, 0.581226655893897550, 0.581185968081761930, 0.581145278816661340, 0.581104588098697250, 0.581063895927972030, +0.581023202304587150, 0.580982507228643860, 0.580941810700244640, 0.580901112719490850, 0.580860413286484300, 0.580819712401326350, 0.580779010064119580, 0.580738306274965250, +0.580697601033965060, 0.580656894341220590, 0.580616186196834190, 0.580575476600907360, 0.580534765553541890, 0.580494053054839030, 0.580453339104901490, 0.580412623703830620, +0.580371906851728130, 0.580331188548695480, 0.580290468794835260, 0.580249747590248940, 0.580209024935038120, 0.580168300829304480, 0.580127575273150400, 0.580086848266677450, +0.580046119809986880, 0.580005389903181510, 0.579964658546362590, 0.579923925739632030, 0.579883191483091310, 0.579842455776843010, 0.579801718620988500, 0.579760980015629700, +0.579720239960868080, 0.579679498456806330, 0.579638755503545710, 0.579598011101188250, 0.579557265249835420, 0.579516517949589800, 0.579475769200552880, 0.579435019002826460, +0.579394267356512230, 0.579353514261712670, 0.579312759718529250, 0.579272003727063670, 0.579231246287418400, 0.579190487399695030, 0.579149727063995370, 0.579108965280421110, +0.579068202049074720, 0.579027437370057910, 0.578986671243472470, 0.578945903669420000, 0.578905134648003080, 0.578864364179323410, 0.578823592263482790, 0.578782818900582810, +0.578742044090726160, 0.578701267834014430, 0.578660490130549540, 0.578619710980432970, 0.578578930383767620, 0.578538148340654870, 0.578497364851196290, 0.578456579915494820, +0.578415793533651800, 0.578375005705769380, 0.578334216431949040, 0.578293425712293470, 0.578252633546904370, 0.578211839935883760, 0.578171044879333130, 0.578130248377355160, +0.578089450430051670, 0.578048651037524560, 0.578007850199875440, 0.577967047917207100, 0.577926244189621130, 0.577885439017219450, 0.577844632400103860, 0.577803824338377070, +0.577763014832140760, 0.577722203881496870, 0.577681391486547180, 0.577640577647394290, 0.577599762364139900, 0.577558945636885810, 0.577518127465734830, 0.577477307850788320, +0.577436486792148650, 0.577395664289917400, 0.577354840344197370, 0.577314014955090270, 0.577273188122698010, 0.577232359847122510, 0.577191530128466470, 0.577150698966831580, +0.577109866362319980, 0.577069032315033260, 0.577028196825074450, 0.576987359892545020, 0.576946521517547330, 0.576905681700182860, 0.576864840440554530, 0.576823997738764250, +0.576783153594913500, 0.576742308009105200, 0.576701460981441150, 0.576660612512023500, 0.576619762600953930, 0.576578911248335380, 0.576538058454269420, 0.576497204218858420, +0.576456348542203960, 0.576415491424409070, 0.576374632865575440, 0.576333772865805230, 0.576292911425200230, 0.576252048543863250, 0.576211184221896210, 0.576170318459401140, +0.576129451256479960, 0.576088582613235590, 0.576047712529769610, 0.576006841006184160, 0.575965968042581820, 0.575925093639064630, 0.575884217795734730, 0.575843340512693810, +0.575802461790045020, 0.575761581627890040, 0.575720700026331130, 0.575679816985469990, 0.575638932505409760, 0.575598046586252240, 0.575557159228099580, 0.575516270431053580, +0.575475380195217380, 0.575434488520692680, 0.575393595407581730, 0.575352700855986440, 0.575311804866009860, 0.575270907437753660, 0.575230008571319780, 0.575189108266811360, +0.575148206524330070, 0.575107303343978420, 0.575066398725857960, 0.575025492670071970, 0.574984585176722240, 0.574943676245911030, 0.574902765877740360, 0.574861854072313050, +0.574820940829731120, 0.574780026150096820, 0.574739110033512080, 0.574698192480079920, 0.574657273489902360, 0.574616353063081560, 0.574575431199719540, 0.574534507899919220, +0.574493583163782740, 0.574452656991412240, 0.574411729382909740, 0.574370800338378280, 0.574329869857919890, 0.574288937941636380, 0.574248004589630880, 0.574207069802005420, +0.574166133578862260, 0.574125195920303420, 0.574084256826431940, 0.574043316297349840, 0.574002374333159480, 0.573961430933962680, 0.573920486099862790, 0.573879539830961630, +0.573838592127361660, 0.573797642989164910, 0.573756692416474310, 0.573715740409391990, 0.573674786968020320, 0.573633832092461330, 0.573592875782818150, 0.573551918039192810, +0.573510958861687240, 0.573469998250404680, 0.573429036205447050, 0.573388072726916940, 0.573347107814916160, 0.573306141469548060, 0.573265173690914560, 0.573224204479118150, +0.573183233834260950, 0.573142261756445890, 0.573101288245775220, 0.573060313302351410, 0.573019336926276380, 0.572978359117653380, 0.572937379876584440, 0.572896399203172150, +0.572855417097518420, 0.572814433559726500, 0.572773448589898540, 0.572732462188136560, 0.572691474354543820, 0.572650485089222450, 0.572609494392274820, 0.572568502263803070, +0.572527508703910450, 0.572486513712698990, 0.572445517290271270, 0.572404519436729430, 0.572363520152176730, 0.572322519436715080, 0.572281517290447180, 0.572240513713475170, +0.572199508705902190, 0.572158502267830490, 0.572117494399362550, 0.572076485100600380, 0.572035474371647480, 0.571994462212605860, 0.571953448623578110, 0.571912433604666370, +0.571871417155973890, 0.571830399277602820, 0.571789379969655510, 0.571748359232234990, 0.571707337065443630, 0.571666313469383900, 0.571625288444158050, 0.571584261989869340, +0.571543234106620000, 0.571502204794512520, 0.571461174053649270, 0.571420141884133370, 0.571379108286067080, 0.571338073259553100, 0.571297036804693460, 0.571255998921591730, +0.571214959610349850, 0.571173918871070720, 0.571132876703856370, 0.571091833108810180, 0.571050788086034380, 0.571009741635631340, 0.570968693757704200, 0.570927644452355440, +0.570886593719687420, 0.570845541559802720, 0.570804487972804480, 0.570763432958794950, 0.570722376517876830, 0.570681318650152480, 0.570640259355725150, 0.570599198634697210, +0.570558136487171240, 0.570517072913249600, 0.570476007913035650, 0.570434941486631650, 0.570393873634140290, 0.570352804355663820, 0.570311733651305830, 0.570270661521168450, +0.570229587965354060, 0.570188512983966110, 0.570147436577106760, 0.570106358744878920, 0.570065279487384720, 0.570024198804727770, 0.569983116697010290, 0.569942033164335120, +0.569900948206804370, 0.569859861824521640, 0.569818774017589290, 0.569777684786110020, 0.569736594130186180, 0.569695502049921140, 0.569654408545417380, 0.569613313616777580, +0.569572217264104230, 0.569531119487500570, 0.569490020287069190, 0.569448919662912330, 0.569407817615133590, 0.569366714143835330, 0.569325609249120230, 0.569284502931090790, +0.569243395189850450, 0.569202286025501600, 0.569161175438147040, 0.569120063427889230, 0.569078949994831550, 0.569037835139076580, 0.568996718860726890, 0.568955601159885080, +0.568914482036654730, 0.568873361491138100, 0.568832239523438090, 0.568791116133657070, 0.568749991321898630, 0.568708865088265240, 0.568667737432859700, 0.568626608355784490, +0.568585477857143080, 0.568544345937037950, 0.568503212595571570, 0.568462077832847630, 0.568420941648968390, 0.568379804044036870, 0.568338665018155440, 0.568297524571427680, +0.568256382703956180, 0.568215239415843620, 0.568174094707192710, 0.568132948578106810, 0.568091801028688610, 0.568050652059040930, 0.568009501669266230, 0.567968349859468200, +0.567927196629749220, 0.567886041980212310, 0.567844885910959830, 0.567803728422095590, 0.567762569513721950, 0.567721409185941610, 0.567680247438858030, 0.567639084272573920, +0.567597919687192090, 0.567556753682815000, 0.567515586259546460, 0.567474417417488940, 0.567433247156745370, 0.567392075477418320, 0.567350902379611500, 0.567309727863427370, +0.567268551928968970, 0.567227374576338760, 0.567186195805640450, 0.567145015616976720, 0.567103834010450500, 0.567062650986164260, 0.567021466544221700, 0.566980280684725610, +0.566939093407778370, 0.566897904713483780, 0.566856714601944420, 0.566815523073263220, 0.566774330127542970, 0.566733135764887150, 0.566691939985398570, 0.566650742789180040, +0.566609544176334360, 0.566568344146965220, 0.566527142701175210, 0.566485939839067250, 0.566444735560744150, 0.566403529866309600, 0.566362322755866180, 0.566321114229517030, +0.566279904287364630, 0.566238692929512900, 0.566197480156064300, 0.566156265967122210, 0.566115050362788970, 0.566073833343168410, 0.566032614908363430, 0.565991395058476400, +0.565950173793611340, 0.565908951113870850, 0.565867727019357950, 0.565826501510175330, 0.565785274586426800, 0.565744046248215170, 0.565702816495643360, 0.565661585328814280, +0.565620352747831400, 0.565579118752797760, 0.565537883343816270, 0.565496646520989740, 0.565455408284421980, 0.565414168634215670, 0.565372927570473970, 0.565331685093299560, +0.565290441202796370, 0.565249195899066970, 0.565207949182214290, 0.565166701052342010, 0.565125451509553070, 0.565084200553950480, 0.565042948185636940, 0.565001694404716480, +0.564960439211291800, 0.564919182605466030, 0.564877924587341870, 0.564836665157023350, 0.564795404314613060, 0.564754142060214350, 0.564712878393929920, 0.564671613315863570, +0.564630346826118230, 0.564589078924797040, 0.564547809612002790, 0.564506538887839420, 0.564465266752409600, 0.564423993205816270, 0.564382718248163440, 0.564341441879553710, +0.564300164100090430, 0.564258884909876300, 0.564217604309015350, 0.564176322297610390, 0.564135038875764660, 0.564093754043580970, 0.564052467801163250, 0.564011180148614290, +0.563969891086037460, 0.563928600613535560, 0.563887308731212400, 0.563846015439171120, 0.563804720737514750, 0.563763424626346100, 0.563722127105769410, 0.563680828175887380, +0.563639527836802820, 0.563598226088619870, 0.563556922931441330, 0.563515618365370560, 0.563474312390510270, 0.563433005006964580, 0.563391696214836420, 0.563350386014229040, +0.563309074405245250, 0.563267761387989290, 0.563226446962563740, 0.563185131129072200, 0.563143813887617360, 0.563102495238303470, 0.563061175181233330, 0.563019853716510200, +0.562978530844237100, 0.562937206564517960, 0.562895880877455900, 0.562854553783154080, 0.562813225281715510, 0.562771895373244350, 0.562730564057843270, 0.562689231335615550, +0.562647897206665080, 0.562606561671094910, 0.562565224729008270, 0.562523886380508210, 0.562482546625698850, 0.562441205464683010, 0.562399862897564270, 0.562358518924445440, +0.562317173545430760, 0.562275826760623150, 0.562234478570125870, 0.562193128974042060, 0.562151777972475840, 0.562110425565530150, 0.562069071753308340, 0.562027716535913550, +0.561986359913449920, 0.561945001886020260, 0.561903642453727700, 0.561862281616676510, 0.561820919374969590, 0.561779555728710300, 0.561738190678001900, 0.561696824222948200, +0.561655456363652550, 0.561614087100218320, 0.561572716432748420, 0.561531344361347110, 0.561489970886117410, 0.561448596007162790, 0.561407219724586400, 0.561365842038492270, +0.561324462948983530, 0.561283082456163650, 0.561241700560135670, 0.561200317261003720, 0.561158932558871170, 0.561117546453840820, 0.561076158946016920, 0.561034770035502730, +0.560993379722401490, 0.560951988006816560, 0.560910594888851980, 0.560869200368610880, 0.560827804446196840, 0.560786407121712790, 0.560745008395263200, 0.560703608266951090, +0.560662206736879940, 0.560620803805153000, 0.560579399471874300, 0.560537993737147080, 0.560496586601074930, 0.560455178063760990, 0.560413768125309410, 0.560372356785823420, +0.560330944045406620, 0.560289529904161920, 0.560248114362193910, 0.560206697419605600, 0.560165279076500160, 0.560123859332981810, 0.560082438189153930, 0.560041015645119880, +0.559999591700982900, 0.559958166356847360, 0.559916739612816410, 0.559875311468993610, 0.559833881925482220, 0.559792450982386390, 0.559751018639809470, 0.559709584897855050, +0.559668149756626150, 0.559626713216227370, 0.559585275276761830, 0.559543835938333010, 0.559502395201044280, 0.559460953064999990, 0.559419509530303170, 0.559378064597057410, +0.559336618265366740, 0.559295170535334510, 0.559253721407064310, 0.559212270880659500, 0.559170818956224450, 0.559129365633862290, 0.559087910913676710, 0.559046454795770980, +0.559004997280249440, 0.558963538367215460, 0.558922078056772630, 0.558880616349024200, 0.558839153244074630, 0.558797688742027180, 0.558756222842985540, 0.558714755547052970, +0.558673286854333820, 0.558631816764931450, 0.558590345278949240, 0.558548872396491540, 0.558507398117661590, 0.558465922442563210, 0.558424445371299650, 0.558382966903975260, +0.558341487040693530, 0.558300005781558030, 0.558258523126672230, 0.558217039076140400, 0.558175553630065990, 0.558134066788552820, 0.558092578551703910, 0.558051088919624070, +0.558009597892416440, 0.557968105470184830, 0.557926611653032590, 0.557885116441064310, 0.557843619834383020, 0.557802121833092410, 0.557760622437296960, 0.557719121647099800, +0.557677619462604970, 0.557636115883915600, 0.557594610911136380, 0.557553104544370680, 0.557511596783722090, 0.557470087629294290, 0.557428577081191530, 0.557387065139517300, +0.557345551804375510, 0.557304037075869400, 0.557262520954103560, 0.557221003439181460, 0.557179484531206910, 0.557137964230283170, 0.557096442536514910, 0.557054919450005630, +0.557013394970858890, 0.556971869099178510, 0.556930341835068620, 0.556888813178633040, 0.556847283129974890, 0.556805751689198990, 0.556764218856408810, 0.556722684631707930, +0.556681149015200050, 0.556639612006989640, 0.556598073607180170, 0.556556533815875550, 0.556514992633179270, 0.556473450059195800, 0.556431906094028710, 0.556390360737781920, +0.556348813990558800, 0.556307265852464040, 0.556265716323601110, 0.556224165404073930, 0.556182613093985870, 0.556141059393441720, 0.556099504302544960, 0.556057947821398950, +0.556016389950108600, 0.555974830688777180, 0.555933270037508700, 0.555891707996406640, 0.555850144565575690, 0.555808579745119320, 0.555767013535141690, 0.555725445935746020, +0.555683876947037140, 0.555642306569118500, 0.555600734802094150, 0.555559161646067560, 0.555517587101143520, 0.555476011167425400, 0.555434433845017340, 0.555392855134022810, +0.555351275034546510, 0.555309693546692020, 0.555268110670562920, 0.555226526406263910, 0.555184940753898570, 0.555143353713570930, 0.555101765285384460, 0.555060175469443970, +0.555018584265853040, 0.554976991674715700, 0.554935397696135540, 0.554893802330217120, 0.554852205577064270, 0.554810607436780900, 0.554769007909470700, 0.554727406995238260, +0.554685804694187380, 0.554644201006421980, 0.554602595932045640, 0.554560989471163170, 0.554519381623878370, 0.554477772390294940, 0.554436161770516800, 0.554394549764648640, +0.554352936372794040, 0.554311321595056810, 0.554269705431541640, 0.554228087882352120, 0.554186468947592490, 0.554144848627366240, 0.554103226921778270, 0.554061603830932280, +0.554019979354932190, 0.553978353493881800, 0.553936726247885920, 0.553895097617048250, 0.553853467601472800, 0.553811836201263290, 0.553770203416524610, 0.553728569247360360, +0.553686933693874780, 0.553645296756171360, 0.553603658434355220, 0.553562018728529840, 0.553520377638799020, 0.553478735165267690, 0.553437091308039530, 0.553395446067218580, +0.553353799442908740, 0.553312151435214730, 0.553270502044240330, 0.553228851270089580, 0.553187199112866510, 0.553145545572675700, 0.553103890649621070, 0.553062234343806640, +0.553020576655336330, 0.552978917584314940, 0.552937257130846290, 0.552895595295034400, 0.552853932076983190, 0.552812267476797570, 0.552770601494581240, 0.552728934130438110, +0.552687265384472880, 0.552645595256789580, 0.552603923747492230, 0.552562250856684760, 0.552520576584472070, 0.552478900930957860, 0.552437223896246390, 0.552395545480441560, +0.552353865683648190, 0.552312184505970080, 0.552270501947511590, 0.552228818008376530, 0.552187132688669700, 0.552145445988495130, 0.552103757907956850, 0.552062068447158880, +0.552020377606206040, 0.551978685385202340, 0.551936991784251480, 0.551895296803458610, 0.551853600442927420, 0.551811902702762260, 0.551770203583066940, 0.551728503083946500, +0.551686801205504730, 0.551645097947846110, 0.551603393311074220, 0.551561687295294310, 0.551519979900610190, 0.551478271127126110, 0.551436560974945980, 0.551394849444174720, +0.551353136534916470, 0.551311422247275250, 0.551269706581355210, 0.551227989537261260, 0.551186271115097330, 0.551144551314967760, 0.551102830136976360, 0.551061107581228280, +0.551019383647827430, 0.550977658336877730, 0.550935931648484310, 0.550894203582751100, 0.550852474139782330, 0.550810743319681940, 0.550769011122555160, 0.550727277548505810, +0.550685542597638240, 0.550643806270056490, 0.550602068565865580, 0.550560329485169530, 0.550518589028072600, 0.550476847194678820, 0.550435103985093320, 0.550393359399420020, +0.550351613437763400, 0.550309866100227360, 0.550268117386916940, 0.550226367297936390, 0.550184615833389400, 0.550142862993381330, 0.550101108778015990, 0.550059353187397960, +0.550017596221631160, 0.549975837880820830, 0.549934078165070780, 0.549892317074485600, 0.549850554609169210, 0.549808790769226840, 0.549767025554762530, 0.549725258965880650, +0.549683491002685210, 0.549641721665281360, 0.549599950953773230, 0.549558178868265300, 0.549516405408861490, 0.549474630575667140, 0.549432854368786080, 0.549391076788322550, +0.549349297834381690, 0.549307517507067630, 0.549265735806484750, 0.549223952732737160, 0.549182168285930140, 0.549140382466167590, 0.549098595273554090, 0.549056806708193790, +0.549015016770191820, 0.548973225459652330, 0.548931432776679770, 0.548889638721378190, 0.548847843293852940, 0.548806046494208060, 0.548764248322548110, 0.548722448778977130, +0.548680647863600380, 0.548638845576522090, 0.548597041917846640, 0.548555236887678150, 0.548513430486122000, 0.548471622713282310, 0.548429813569263120, 0.548388003054169790, +0.548346191168106460, 0.548304377911177700, 0.548262563283487550, 0.548220747285141470, 0.548178929916243400, 0.548137111176898010, 0.548095291067209560, 0.548053469587283180, +0.548011646737223130, 0.547969822517134000, 0.547927996927119910, 0.547886169967286230, 0.547844341637737100, 0.547802511938577210, 0.547760680869910590, 0.547718848431842600, +0.547677014624477490, 0.547635179447919510, 0.547593342902274020, 0.547551504987645040, 0.547509665704137390, 0.547467825051855210, 0.547425983030903840, 0.547384139641387430, +0.547342294883410680, 0.547300448757077950, 0.547258601262494370, 0.547216752399764310, 0.547174902168992340, 0.547133050570282720, 0.547091197603740920, 0.547049343269471080, +0.547007487567577890, 0.546965630498165600, 0.546923772061339690, 0.546881912257204280, 0.546840051085863640, 0.546798188547423350, 0.546756324641987530, 0.546714459369661010, +0.546672592730547910, 0.546630724724753600, 0.546588855352382550, 0.546546984613539450, 0.546505112508328450, 0.546463239036855010, 0.546421364199223490, 0.546379487995538590, +0.546337610425904560, 0.546295731490426870, 0.546253851189209880, 0.546211969522358180, 0.546170086489976340, 0.546128202092169500, 0.546086316329042250, 0.546044429200699180, +0.546002540707244630, 0.545960650848784200, 0.545918759625422020, 0.545876867037262680, 0.545834973084411530, 0.545793077766972940, 0.545751181085051610, 0.545709283038751990, +0.545667383628179460, 0.545625482853438590, 0.545583580714633980, 0.545541677211869970, 0.545499772345252150, 0.545457866114885000, 0.545415958520873100, 0.545374049563321030, +0.545332139242334040, 0.545290227558016820, 0.545248314510474060, 0.545206400099810030, 0.545164484326130520, 0.545122567189539660, 0.545080648690142060, 0.545038728828043270, +0.544996807603347570, 0.544954885016159850, 0.544912961066584600, 0.544871035754727280, 0.544829109080692490, 0.544787181044584790, 0.544745251646508780, 0.544703320886570030, +0.544661388764873020, 0.544619455281522450, 0.544577520436623000, 0.544535584230280030, 0.544493646662598030, 0.544451707733682010, 0.544409767443636340, 0.544367825792566710, +0.544325882780577360, 0.544283938407773000, 0.544241992674259210, 0.544200045580140350, 0.544158097125521430, 0.544116147310506950, 0.544074196135202360, 0.544032243599712360, +0.543990289704141650, 0.543948334448594920, 0.543906377833177750, 0.543864419857994610, 0.543822460523150420, 0.543780499828749650, 0.543738537774898110, 0.543696574361700160, +0.543654609589260820, 0.543612643457684560, 0.543570675967076980, 0.543528707117542860, 0.543486736909186470, 0.543444765342113720, 0.543402792416428970, 0.543360818132237240, +0.543318842489643130, 0.543276865488752310, 0.543234887129669270, 0.543192907412499040, 0.543150926337346180, 0.543108943904316410, 0.543066960113514190, 0.543024974965044650, +0.542982988459012270, 0.542941000595522750, 0.542899011374680770, 0.542857020796591260, 0.542815028861358790, 0.542773035569089180, 0.542731040919887000, 0.542689044913857170, +0.542647047551104380, 0.542605048831734330, 0.542563048755851600, 0.542521047323560990, 0.542479044534968090, 0.542437040390177480, 0.542395034889294410, 0.542353028032423250, +0.542311019819670000, 0.542269010251139160, 0.542226999326935850, 0.542184987047164560, 0.542142973411931290, 0.542100958421340540, 0.542058942075497320, 0.542016924374506440, +0.541974905318473700, 0.541932884907503580, 0.541890863141701320, 0.541848840021171400, 0.541806815546019840, 0.541764789716351340, 0.541722762532270360, 0.541680733993882950, +0.541638704101293560, 0.541596672854607550, 0.541554640253929410, 0.541512606299365040, 0.541470570991019140, 0.541428534328996850, 0.541386496313402850, 0.541344456944343080, +0.541302416221921990, 0.541260374146244950, 0.541218330717416650, 0.541176285935542790, 0.541134239800728280, 0.541092192313078150, 0.541050143472697200, 0.541008093279691240, +0.540966041734165070, 0.540923988836223390, 0.540881934585972110, 0.540839878983515930, 0.540797822028960210, 0.540755763722409410, 0.540713704063969680, 0.540671643053745600, +0.540629580691842530, 0.540587516978365050, 0.540545451913419180, 0.540503385497109630, 0.540461317729541650, 0.540419248610820020, 0.540377178141050680, 0.540335106320338320, +0.540293033148788180, 0.540250958626505180, 0.540208882753595130, 0.540166805530162830, 0.540124726956313530, 0.540082647032152030, 0.540040565757784250, 0.539998483133315110, +0.539956399158849410, 0.539914313834493060, 0.539872227160350880, 0.539830139136528220, 0.539788049763129770, 0.539745959040261680, 0.539703866968028520, 0.539661773546535770, +0.539619678775888230, 0.539577582656191930, 0.539535485187551570, 0.539493386370072490, 0.539451286203859630, 0.539409184689018990, 0.539367081825655290, 0.539324977613873880, +0.539282872053779670, 0.539240765145478700, 0.539198656889075760, 0.539156547284675770, 0.539114436332384870, 0.539072324032307870, 0.539030210384550010, 0.538988095389216330, +0.538945979046412730, 0.538903861356244130, 0.538861742318816010, 0.538819621934233050, 0.538777500202601400, 0.538735377124026080, 0.538693252698612230, 0.538651126926465000, +0.538608999807690280, 0.538566871342393010, 0.538524741530678530, 0.538482610372651880, 0.538440477868419090, 0.538398344018085060, 0.538356208821754830, 0.538314072279534540, +0.538271934391528980, 0.538229795157843530, 0.538187654578583310, 0.538145512653854240, 0.538103369383761470, 0.538061224768410230, 0.538019078807905560, 0.537976931502353590, +0.537934782851859250, 0.537892632856528000, 0.537850481516464750, 0.537808328831775760, 0.537766174802565830, 0.537724019428940550, 0.537681862711004820, 0.537639704648864790, +0.537597545242625490, 0.537555384492392040, 0.537513222398270370, 0.537471058960365730, 0.537428894178783480, 0.537386728053628530, 0.537344560585007120, 0.537302391773024410, +0.537260221617785640, 0.537218050119396050, 0.537175877277961570, 0.537133703093587430, 0.537091527566379120, 0.537049350696441550, 0.537007172483880970, 0.536964992928802510, +0.536922812031311540, 0.536880629791513190, 0.536838446209513600, 0.536796261285417910, 0.536754075019331480, 0.536711887411359560, 0.536669698461608390, 0.536627508170182900, +0.536585316537188220, 0.536543123562730600, 0.536500929246915280, 0.536458733589847530, 0.536416536591632690, 0.536374338252376790, 0.536332138572185090, 0.536289937551163050, +0.536247735189415710, 0.536205531487049520, 0.536163326444169420, 0.536121120060881080, 0.536078912337289550, 0.536036703273501060, 0.535994492869620860, 0.535952281125754330, +0.535910068042006800, 0.535867853618484550, 0.535825637855292580, 0.535783420752536150, 0.535741202310321520, 0.535698982528753920, 0.535656761407938830, 0.535614538947981500, +0.535572315148988180, 0.535530090011064000, 0.535487863534314770, 0.535445635718845400, 0.535403406564762260, 0.535361176072170710, 0.535318944241176100, 0.535276711071883900, +0.535234476564400150, 0.535192240718830310, 0.535150003535279860, 0.535107765013854040, 0.535065525154659110, 0.535023283957800410, 0.534981041423383210, 0.534938797551513630, +0.534896552342297160, 0.534854305795839260, 0.534812057912245290, 0.534769808691621380, 0.534727558134073130, 0.534685306239705890, 0.534643053008625020, 0.534600798440937000, +0.534558542536746840, 0.534516285296160350, 0.534474026719282790, 0.534431766806220620, 0.534389505557078980, 0.534347242971963570, 0.534304979050979620, 0.534262713794233620, +0.534220447201830930, 0.534178179273877010, 0.534135910010477330, 0.534093639411738260, 0.534051367477765050, 0.534009094208663050, 0.533966819604538620, 0.533924543665497240, +0.533882266391644490, 0.533839987783085720, 0.533797707839927300, 0.533755426562274700, 0.533713143950233390, 0.533670860003908950, 0.533628574723407740, 0.533586288108835020, +0.533544000160296680, 0.533501710877897880, 0.533459420261745200, 0.533417128311943990, 0.533374835028599950, 0.533332540411818430, 0.533290244461705920, 0.533247947178367880, +0.533205648561909550, 0.533163348612437420, 0.533121047330057050, 0.533078744714873930, 0.533036440766993640, 0.532994135486522640, 0.532951828873566180, 0.532909520928230300, +0.532867211650620120, 0.532824901040842350, 0.532782589099002330, 0.532740275825205890, 0.532697961219558260, 0.532655645282166250, 0.532613328013134990, 0.532571009412570520, +0.532528689480578080, 0.532486368217264250, 0.532444045622734620, 0.532401721697094430, 0.532359396440450270, 0.532317069852907720, 0.532274741934572470, 0.532232412685549880, +0.532190082105946760, 0.532147750195868460, 0.532105416955420680, 0.532063082384709010, 0.532020746483840010, 0.531978409252919170, 0.531936070692052290, 0.531893730801344830, +0.531851389580903500, 0.531809047030833650, 0.531766703151241190, 0.531724357942231500, 0.531682011403911470, 0.531639663536386250, 0.531597314339761540, 0.531554963814144020, +0.531512611959638950, 0.531470258776352460, 0.531427904264389910, 0.531385548423857990, 0.531343191254862180, 0.531300832757508390, 0.531258472931902090, 0.531216111778150090, +0.531173749296357740, 0.531131385486631080, 0.531089020349075460, 0.531046653883797790, 0.531004286090903440, 0.530961916970498330, 0.530919546522688130, 0.530877174747579340, +0.530834801645277740, 0.530792427215889040, 0.530750051459518920, 0.530707674376274090, 0.530665295966260000, 0.530622916229582350, 0.530580535166347730, 0.530538152776661830, +0.530495769060630560, 0.530453384018359510, 0.530410997649955250, 0.530368609955523600, 0.530326220935170460, 0.530283830589001300, 0.530241438917122940, 0.530199045919641070, +0.530156651596661480, 0.530114255948289980, 0.530071858974633160, 0.530029460675796700, 0.529987061051886530, 0.529944660103008450, 0.529902257829269030, 0.529859854230773970, +0.529817449307628970, 0.529775043059940610, 0.529732635487814680, 0.529690226591357230, 0.529647816370673710, 0.529605404825871150, 0.529562991957055030, 0.529520577764331370, +0.529478162247805970, 0.529435745407585530, 0.529393327243775750, 0.529350907756482520, 0.529308486945811780, 0.529266064811870220, 0.529223641354763410, 0.529181216574597490, +0.529138790471478160, 0.529096363045512330, 0.529053934296805470, 0.529011504225463500, 0.528969072831593000, 0.528926640115300000, 0.528884206076690290, 0.528841770715869690, +0.528799334032945100, 0.528756896028022120, 0.528714456701206870, 0.528672016052605160, 0.528629574082323810, 0.528587130790468480, 0.528544686177145340, 0.528502240242460060, +0.528459792986519570, 0.528417344409429670, 0.528374894511296380, 0.528332443292225510, 0.528289990752323750, 0.528247536891697230, 0.528205081710451660, 0.528162625208693170, +0.528120167386528450, 0.528077708244063300, 0.528035247781403430, 0.527992785998655960, 0.527950322895926470, 0.527907858473321110, 0.527865392730945790, 0.527822925668907320, +0.527780457287311600, 0.527737987586264670, 0.527695516565872440, 0.527653044226241820, 0.527610570567478510, 0.527568095589688870, 0.527525619292978480, 0.527483141677454470, +0.527440662743222650, 0.527398182490389170, 0.527355700919059810, 0.527313218029341610, 0.527270733821340380, 0.527228248295162020, 0.527185761450913230, 0.527143273288700140, +0.527100783808628900, 0.527058293010805310, 0.527015800895336280, 0.526973307462327840, 0.526930812711886020, 0.526888316644116950, 0.526845819259127320, 0.526803320557023170, +0.526760820537910850, 0.526718319201895930, 0.526675816549085680, 0.526633312579585900, 0.526590807293502830, 0.526548300690942270, 0.526505792772011480, 0.526463283536816040, +0.526420772985462190, 0.526378261118056630, 0.526335747934705500, 0.526293233435515040, 0.526250717620591060, 0.526208200490040690, 0.526165682043969850, 0.526123162282484680, +0.526080641205691310, 0.526038118813696780, 0.525995595106606870, 0.525953070084527960, 0.525910543747566070, 0.525868016095828120, 0.525825487129420230, 0.525782956848448560, +0.525740425253019120, 0.525697892343238940, 0.525655358119214040, 0.525612822581050470, 0.525570285728855110, 0.525527747562734130, 0.525485208082793750, 0.525442667289140020, +0.525400125181879840, 0.525357581761119460, 0.525315037026965140, 0.525272490979522780, 0.525229943618899630, 0.525187394945201610, 0.525144844958535080, 0.525102293659006180, +0.525059741046721820, 0.525017187121788020, 0.524974631884311370, 0.524932075334397790, 0.524889517472154290, 0.524846958297687130, 0.524804397811102440, 0.524761836012506480, +0.524719272902006260, 0.524676708479707820, 0.524634142745717290, 0.524591575700141810, 0.524549007343087290, 0.524506437674660320, 0.524463866694966810, 0.524421294404114110, +0.524378720802208150, 0.524336145889355400, 0.524293569665661870, 0.524250992131234720, 0.524208413286180170, 0.524165833130604610, 0.524123251664614040, 0.524080668888315840, +0.524038084801815800, 0.523995499405220610, 0.523952912698636310, 0.523910324682170140, 0.523867735355928120, 0.523825144720016400, 0.523782552774542220, 0.523739959519611610, +0.523697364955331040, 0.523654769081806750, 0.523612171899146000, 0.523569573407454690, 0.523526973606839530, 0.523484372497406540, 0.523441770079262960, 0.523399166352514930, +0.523356561317269040, 0.523313954973631310, 0.523271347321709210, 0.523228738361608660, 0.523186128093436230, 0.523143516517298070, 0.523100903633301640, 0.523058289441552860, +0.523015673942157980, 0.522973057135224240, 0.522930439020857900, 0.522887819599165530, 0.522845198870253160, 0.522802576834228150, 0.522759953491196750, 0.522717328841265540, +0.522674702884540540, 0.522632075621129120, 0.522589447051137520, 0.522546817174672330, 0.522504185991839790, 0.522461553502747140, 0.522418919707500540, 0.522376284606206660, +0.522333648198971660, 0.522291010485902980, 0.522248371467106790, 0.522205731142689640, 0.522163089512757810, 0.522120446577418520, 0.522077802336778250, 0.522035156790943030, +0.521992509940020330, 0.521949861784116290, 0.521907212323337700, 0.521864561557790600, 0.521821909487582560, 0.521779256112819720, 0.521736601433608670, 0.521693945450055870, +0.521651288162268470, 0.521608629570352920, 0.521565969674415710, 0.521523308474563300, 0.521480645970902930, 0.521437982163540980, 0.521395317052584020, 0.521352650638138400, +0.521309982920311610, 0.521267313899209770, 0.521224643574939360, 0.521181971947607630, 0.521139299017321030, 0.521096624784186170, 0.521053949248309390, 0.521011272409798050, +0.520968594268758630, 0.520925914825297600, 0.520883234079521530, 0.520840552031537670, 0.520797868681452500, 0.520755184029372600, 0.520712498075404320, 0.520669810819655240, +0.520627122262231620, 0.520584432403240150, 0.520541741242787290, 0.520499048780980410, 0.520456355017925980, 0.520413659953730230, 0.520370963588500660, 0.520328265922343820, +0.520285566955366210, 0.520242866687674280, 0.520200165119375610, 0.520157462250576570, 0.520114758081383740, 0.520072052611903810, 0.520029345842244030, 0.519986637772510860, +0.519943928402811120, 0.519901217733251260, 0.519858505763938660, 0.519815792494979780, 0.519773077926481420, 0.519730362058550050, 0.519687644891293040, 0.519644926424817080, +0.519602206659228290, 0.519559485594634380, 0.519516763231141820, 0.519474039568857290, 0.519431314607887380, 0.519388588348339450, 0.519345860790320080, 0.519303131933936070, +0.519260401779293890, 0.519217670326501010, 0.519174937575664020, 0.519132203526889600, 0.519089468180284340, 0.519046731535955820, 0.519003993594010500, 0.518961254354555090, +0.518918513817696270, 0.518875771983541510, 0.518833028852197290, 0.518790284423770510, 0.518747538698367650, 0.518704791676096290, 0.518662043357063010, 0.518619293741374170, +0.518576542829137570, 0.518533790620459570, 0.518491037115447080, 0.518448282314206590, 0.518405526216845770, 0.518362768823471210, 0.518320010134189710, 0.518277250149107750, +0.518234488868333120, 0.518191726291972190, 0.518148962420131980, 0.518106197252918950, 0.518063430790440930, 0.518020663032804250, 0.517977893980115840, 0.517935123632482400, +0.517892351990011490, 0.517849579052809820, 0.517806804820983620, 0.517764029294640940, 0.517721252473888120, 0.517678474358832190, 0.517635694949579730, 0.517592914246238430, +0.517550132248914770, 0.517507348957715770, 0.517464564372748010, 0.517421778494119300, 0.517378991321936100, 0.517336202856305440, 0.517293413097333900, 0.517250622045129170, +0.517207829699797950, 0.517165036061447040, 0.517122241130183240, 0.517079444906114240, 0.517036647389346630, 0.516993848579986980, 0.516951048478143100, 0.516908247083921580, +0.516865444397429430, 0.516822640418773350, 0.516779835148061030, 0.516737028585399050, 0.516694220730894550, 0.516651411584654110, 0.516608601146785530, 0.516565789417395500, +0.516522976396590950, 0.516480162084478560, 0.516437346481166130, 0.516394529586760460, 0.516351711401368370, 0.516308891925096550, 0.516266071158053010, 0.516223249100344230, +0.516180425752077340, 0.516137601113358930, 0.516094775184297030, 0.516051947964998090, 0.516009119455569040, 0.515966289656117460, 0.515923458566750150, 0.515880626187574240, +0.515837792518696330, 0.515794957560224310, 0.515752121312265000, 0.515709283774925310, 0.515666444948312040, 0.515623604832533000, 0.515580763427694990, 0.515537920733905140, +0.515495076751270040, 0.515452231479897600, 0.515409384919894630, 0.515366537071368150, 0.515323687934424960, 0.515280837509172970, 0.515237985795718890, 0.515195132794169400, +0.515152278504632520, 0.515109422927214840, 0.515066566062023720, 0.515023707909165740, 0.514980848468748920, 0.514937987740879950, 0.514895125725665980, 0.514852262423213910, +0.514809397833631550, 0.514766531957025600, 0.514723664793503400, 0.514680796343171650, 0.514637926606138270, 0.514595055582510060, 0.514552183272394270, 0.514509309675897590, +0.514466434793128040, 0.514423558624192310, 0.514380681169197440, 0.514337802428251110, 0.514294922401460350, 0.514252041088932300, 0.514209158490773750, 0.514166274607092740, +0.514123389437995960, 0.514080502983590760, 0.514037615243983950, 0.513994726219283440, 0.513951835909596030, 0.513908944315029090, 0.513866051435689530, 0.513823157271685040, +0.513780261823122750, 0.513737365090109810, 0.513694467072753010, 0.513651567771160500, 0.513608667185439070, 0.513565765315695530, 0.513522862162038020, 0.513479957724573330, +0.513437052003408720, 0.513394144998651210, 0.513351236710408610, 0.513308327138787930, 0.513265416283896440, 0.513222504145841030, 0.513179590724729740, 0.513136676020669480, +0.513093760033767500, 0.513050842764130820, 0.513007924211867360, 0.512965004377084030, 0.512922083259888310, 0.512879160860386870, 0.512836237178687980, 0.512793312214898540, +0.512750385969125810, 0.512707458441476690, 0.512664529632059330, 0.512621599540980630, 0.512578668168347520, 0.512535735514268120, 0.512492801578849470, 0.512449866362198800, +0.512406929864423040, 0.512363992085630330, 0.512321053025927680, 0.512278112685422340, 0.512235171064221340, 0.512192228162432820, 0.512149283980163790, 0.512106338517521410, +0.512063391774612910, 0.512020443751546320, 0.511977494448428550, 0.511934543865367080, 0.511891592002468920, 0.511848638859842110, 0.511805684437593670, 0.511762728735830730, +0.511719771754661210, 0.511676813494192360, 0.511633853954531430, 0.511590893135785540, 0.511547931038062840, 0.511504967661470240, 0.511462003006115220, 0.511419037072104790, +0.511376069859547200, 0.511333101368549370, 0.511290131599218880, 0.511247160551662640, 0.511204188225988790, 0.511161214622304570, 0.511118239740717350, 0.511075263581334040, +0.511032286144262990, 0.510989307429611240, 0.510946327437485910, 0.510903346167995040, 0.510860363621245870, 0.510817379797345760, 0.510774394696401730, 0.510731408318522260, +0.510688420663814150, 0.510645431732385080, 0.510602441524341980, 0.510559450039793190, 0.510516457278845760, 0.510473463241607140, 0.510430467928184580, 0.510387471338686230, +0.510344473473219100, 0.510301474331890880, 0.510258473914808500, 0.510215472222080410, 0.510172469253813540, 0.510129465010115580, 0.510086459491093550, 0.510043452696855800, +0.510000444627509380, 0.509957435283161510, 0.509914424663920340, 0.509871412769893120, 0.509828399601187420, 0.509785385157910390, 0.509742369440170150, 0.509699352448074070, +0.509656334181729620, 0.509613314641243930, 0.509570293826725250, 0.509527271738280940, 0.509484248376018470, 0.509441223740044970, 0.509398197830468690, 0.509355170647396990, +0.509312142190937460, 0.509269112461197100, 0.509226081458284300, 0.509183049182306390, 0.509140015633370410, 0.509096980811584830, 0.509053944717056670, 0.509010907349893740, +0.508967868710203160, 0.508924828798093310, 0.508881787613671420, 0.508838745157044970, 0.508795701428321310, 0.508752656427608810, 0.508709610155014590, 0.508666562610646470, +0.508623513794611460, 0.508580463707018040, 0.508537412347973560, 0.508494359717585500, 0.508451305815961100, 0.508408250643208940, 0.508365194199436040, 0.508322136484749780, +0.508279077499258600, 0.508236017243069770, 0.508192955716290750, 0.508149892919029120, 0.508106828851393020, 0.508063763513489920, 0.508020696905427390, 0.507977629027312800, +0.507934559879254400, 0.507891489461359650, 0.507848417773736240, 0.507805344816491310, 0.507762270589733440, 0.507719195093569890, 0.507676118328108440, 0.507633040293456240, +0.507589960989721760, 0.507546880417012460, 0.507503798575435480, 0.507460715465099520, 0.507417631086111710, 0.507374545438579740, 0.507331458522611190, 0.507288370338314200, +0.507245280885796460, 0.507202190165165430, 0.507159098176528490, 0.507116004919994200, 0.507072910395669930, 0.507029814603663480, 0.506986717544081980, 0.506943619217034120, +0.506900519622627170, 0.506857418760969010, 0.506814316632166810, 0.506771213236329340, 0.506728108573563760, 0.506685002643977870, 0.506641895447679120, 0.506598786984776010, +0.506555677255375980, 0.506512566259586290, 0.506469453997515640, 0.506426340469271260, 0.506383225674961190, 0.506340109614692560, 0.506296992288574050, 0.506253873696713040, +0.506210753839217430, 0.506167632716194470, 0.506124510327752850, 0.506081386673999930, 0.506038261755043520, 0.505995135570991180, 0.505952008121951290, 0.505908879408031420, +0.505865749429339260, 0.505822618185982510, 0.505779485678069520, 0.505736351905707760, 0.505693216869004810, 0.505650080568069150, 0.505606943003008350, 0.505563804173930100, +0.505520664080941980, 0.505477522724152690, 0.505434380103669480, 0.505391236219600360, 0.505348091072052810, 0.505304944661135290, 0.505261796986955500, 0.505218648049621240, +0.505175497849239990, 0.505132346385920310, 0.505089193659769790, 0.505046039670896230, 0.505002884419407220, 0.504959727905411440, 0.504916570129016250, 0.504873411090329350, +0.504830250789459310, 0.504787089226513610, 0.504743926401600150, 0.504700762314826520, 0.504657596966301300, 0.504614430356132180, 0.504571262484426960, 0.504528093351293230, +0.504484922956839550, 0.504441751301173640, 0.504398578384403380, 0.504355404206636160, 0.504312228767980990, 0.504269052068545110, 0.504225874108436670, 0.504182694887763130, +0.504139514406633290, 0.504096332665154630, 0.504053149663435060, 0.504009965401582380, 0.503966779879705060, 0.503923593097910790, 0.503880405056307160, 0.503837215755002950, +0.503794025194105770, 0.503750833373723390, 0.503707640293963530, 0.503664445954935090, 0.503621250356745430, 0.503578053499502690, 0.503534855383314440, 0.503491656008289380, +0.503448455374535200, 0.503405253482159920, 0.503362050331271130, 0.503318845921977510, 0.503275640254386870, 0.503232433328607120, 0.503189225144745840, 0.503146015702911840, +0.503102805003212920, 0.503059593045756540, 0.503016379830651620, 0.502973165358005740, 0.502929949627926920, 0.502886732640522860, 0.502843514395902250, 0.502800294894172990, +0.502757074135442910, 0.502713852119819780, 0.502670628847412430, 0.502627404318328530, 0.502584178532676010, 0.502540951490562770, 0.502497723192097510, 0.502454493637387920, +0.502411262826542140, 0.502368030759667740, 0.502324797436873750, 0.502281562858267750, 0.502238327023957320, 0.502195089934051600, 0.502151851588658160, 0.502108611987885030, +0.502065371131839910, 0.502022129020631920, 0.501978885654368550, 0.501935641033157910, 0.501892395157107820, 0.501849148026327070, 0.501805899640923480, 0.501762650001005170, +0.501719399106679840, 0.501676146958056400, 0.501632893555242650, 0.501589638898346620, 0.501546382987476110, 0.501503125822739930, 0.501459867404246080, 0.501416607732102060, +0.501373346806416990, 0.501330084627298560, 0.501286821194854900, 0.501243556509193720, 0.501200290570424150, 0.501157023378653750, 0.501113754933990910, 0.501070485236543180, +0.501027214286419720, 0.500983942083728210, 0.500940668628576780, 0.500897393921073350, 0.500854117961326840, 0.500810840749444930, 0.500767562285535980, 0.500724282569707800, +0.500681001602069190, 0.500637719382728160, 0.500594435911792760, 0.500551151189370990, 0.500507865215571670, 0.500464577990502590, 0.500421289514271780, 0.500377999786988160, +0.500334708808759520, 0.500291416579694110, 0.500248123099899740, 0.500204828369485430, 0.500161532388559090, 0.500118235157228860, 0.500074936675602770, 0.500031636943789600, +0.499988335961897460, 0.499945033730034400, 0.499901730248308420, 0.499858425516828460, 0.499815119535702460, 0.499771812305038640, 0.499728503824944940, 0.499685194095530310, +0.499641883116902720, 0.499598570889170030, 0.499555257412441330, 0.499511942686824470, 0.499468626712427750, 0.499425309489359090, 0.499381991017727510, 0.499338671297640980, +0.499295350329207800, 0.499252028112535770, 0.499208704647734150, 0.499165379934910720, 0.499122053974173860, 0.499078726765631480, 0.499035398309392640, 0.498992068605565330, +0.498948737654257850, 0.498905405455578100, 0.498862072009635280, 0.498818737316537250, 0.498775401376391980, 0.498732064189308600, 0.498688725755395080, 0.498645386074759720, +0.498602045147510550, 0.498558702973756600, 0.498515359553605930, 0.498472014887166860, 0.498428668974547350, 0.498385321815856540, 0.498341973411202450, 0.498298623760693450, +0.498255272864437440, 0.498211920722543720, 0.498168567335120100, 0.498125212702275110, 0.498081856824116710, 0.498038499700754090, 0.497995141332295170, 0.497951781718848410, +0.497908420860521780, 0.497865058757424540, 0.497821695409664590, 0.497778330817350070, 0.497734964980590110, 0.497691597899492690, 0.497648229574166320, 0.497604860004718990, +0.497561489191259860, 0.497518117133897040, 0.497474743832738870, 0.497431369287893550, 0.497387993499470100, 0.497344616467576720, 0.497301238192321800, 0.497257858673813390, +0.497214477912160720, 0.497171095907471830, 0.497127712659855230, 0.497084328169418940, 0.497040942436272230, 0.496997555460523210, 0.496954167242279870, 0.496910777781651490, +0.496867387078746170, 0.496823995133672370, 0.496780601946538230, 0.496737207517452930, 0.496693811846524670, 0.496650414933861810, 0.496607016779572590, 0.496563617383766200, +0.496520216746550720, 0.496476814868034740, 0.496433411748326340, 0.496390007387534800, 0.496346601785768230, 0.496303194943135130, 0.496259786859743700, 0.496216377535703130, +0.496172966971121680, 0.496129555166107410, 0.496086142120769620, 0.496042727835216520, 0.495999312309556570, 0.495955895543897910, 0.495912477538349940, 0.495869058293020800, +0.495825637808018970, 0.495782216083452690, 0.495738793119431250, 0.495695368916062810, 0.495651943473455980, 0.495608516791718860, 0.495565088870960900, 0.495521659711290140, +0.495478229312815270, 0.495434797675644470, 0.495391364799886990, 0.495347930685651190, 0.495304495333045490, 0.495261058742178180, 0.495217620913158630, 0.495174181846095020, +0.495130741541095600, 0.495087299998269670, 0.495043857217725480, 0.495000413199571660, 0.494956967943916410, 0.494913521450869200, 0.494870073720538100, 0.494826624753031850, +0.494783174548458660, 0.494739723106927930, 0.494696270428547860, 0.494652816513427130, 0.494609361361673940, 0.494565904973397750, 0.494522447348706820, 0.494478988487709770, +0.494435528390514860, 0.494392067057231540, 0.494348604487968020, 0.494305140682832600, 0.494261675641934680, 0.494218209365382630, 0.494174741853285030, 0.494131273105750220, +0.494087803122887580, 0.494044331904805460, 0.494000859451612480, 0.493957385763416970, 0.493913910840328430, 0.493870434682455060, 0.493826957289905610, 0.493783478662788380, +0.493739998801212890, 0.493696517705287330, 0.493653035375120510, 0.493609551810820720, 0.493566067012497440, 0.493522580980258970, 0.493479093714213670, 0.493435605214471050, +0.493392115481139370, 0.493348624514327430, 0.493305132314143520, 0.493261638880697240, 0.493218144214096770, 0.493174648314451010, 0.493131151181868180, 0.493087652816457890, +0.493044153218328510, 0.493000652387588670, 0.492957150324346840, 0.492913647028712540, 0.492870142500794140, 0.492826636740700320, 0.492783129748539550, 0.492739621524421360, +0.492696112068454100, 0.492652601380746180, 0.492609089461407130, 0.492565576310545430, 0.492522061928269690, 0.492478546314688460, 0.492435029469911250, 0.492391511394046470, +0.492347992087202870, 0.492304471549488920, 0.492260949781014200, 0.492217426781887070, 0.492173902552216440, 0.492130377092110600, 0.492086850401679210, 0.492043322481030720, +0.491999793330273940, 0.491956262949517280, 0.491912731338870310, 0.491869198498441570, 0.491825664428339800, 0.491782129128673470, 0.491738592599552220, 0.491695054841084500, +0.491651515853378740, 0.491607975636544570, 0.491564434190690510, 0.491520891515925320, 0.491477347612357510, 0.491433802480096720, 0.491390256119251470, 0.491346708529930510, +0.491303159712242420, 0.491259609666296840, 0.491216058392202230, 0.491172505890067450, 0.491128952160001080, 0.491085397202112640, 0.491041841016510720, 0.490998283603304220, +0.490954724962601620, 0.490911165094512600, 0.490867603999145700, 0.490824041676609310, 0.490780478127013310, 0.490736913350466040, 0.490693347347076540, 0.490649780116953260, +0.490606211660205900, 0.490562641976942990, 0.490519071067273550, 0.490475498931305990, 0.490431925569150050, 0.490388350980914380, 0.490344775166707770, 0.490301198126638860, +0.490257619860817280, 0.490214040369351730, 0.490170459652351060, 0.490126877709923860, 0.490083294542179800, 0.490039710149227540, 0.489996124531175640, 0.489952537688133790, +0.489908949620210590, 0.489865360327515040, 0.489821769810155680, 0.489778178068242310, 0.489734585101883500, 0.489690990911188170, 0.489647395496265010, 0.489603798857223770, +0.489560200994173020, 0.489516601907221740, 0.489473001596478610, 0.489429400062053320, 0.489385797304054570, 0.489342193322591320, 0.489298588117772160, 0.489254981689706940, +0.489211374038504290, 0.489167765164273180, 0.489124155067122310, 0.489080543747161370, 0.489036931204499150, 0.488993317439244120, 0.488949702451506260, 0.488906086241394140, +0.488862468809016790, 0.488818850154482840, 0.488775230277902210, 0.488731609179383520, 0.488687986859035750, 0.488644363316967640, 0.488600738553289000, 0.488557112568108520, +0.488513485361535270, 0.488469856933677950, 0.488426227284646350, 0.488382596414549170, 0.488338964323495490, 0.488295331011594060, 0.488251696478954610, 0.488208060725686010, +0.488164423751896840, 0.488120785557696950, 0.488077146143195140, 0.488033505508500440, 0.487989863653721660, 0.487946220578968530, 0.487902576284349850, 0.487858930769974770, +0.487815284035951980, 0.487771636082391320, 0.487727986909401610, 0.487684336517091920, 0.487640684905571000, 0.487597032074948760, 0.487553378025333940, 0.487509722756835680, +0.487466066269562680, 0.487422408563624950, 0.487378749639131190, 0.487335089496190140, 0.487291428134911830, 0.487247765555404890, 0.487204101757778560, 0.487160436742141540, +0.487116770508603860, 0.487073103057274250, 0.487029434388261910, 0.486985764501675520, 0.486942093397625180, 0.486898421076219560, 0.486854747537567910, 0.486811072781778990, +0.486767396808962800, 0.486723719619228110, 0.486680041212684100, 0.486636361589439630, 0.486592680749604660, 0.486548998693287940, 0.486505315420598330, 0.486461630931645850, +0.486417945226539310, 0.486374258305387890, 0.486330570168300390, 0.486286880815386900, 0.486243190246756220, 0.486199498462517530, 0.486155805462779700, 0.486112111247652800, +0.486068415817245580, 0.486024719171667340, 0.485981021311026880, 0.485937322235434290, 0.485893621944998360, 0.485849920439828390, 0.485806217720033240, 0.485762513785722940, +0.485718808637006340, 0.485675102273992740, 0.485631394696791010, 0.485587685905511160, 0.485543975900262050, 0.485500264681152650, 0.485456552248292980, 0.485412838601791960, +0.485369123741758830, 0.485325407668302460, 0.485281690381533020, 0.485237971881559260, 0.485194252168490660, 0.485150531242436010, 0.485106809103505400, 0.485063085751807790, +0.485019361187452480, 0.484975635410548390, 0.484931908421205540, 0.484888180219532950, 0.484844450805639930, 0.484800720179635380, 0.484756988341629450, 0.484713255291730980, +0.484669521030049010, 0.484625785556693670, 0.484582048871773810, 0.484538310975398840, 0.484494571867677750, 0.484450831548720540, 0.484407090018636300, 0.484363347277534330, +0.484319603325523600, 0.484275858162714290, 0.484232111789215270, 0.484188364205136000, 0.484144615410585450, 0.484100865405673710, 0.484057114190509840, 0.484013361765203150, +0.483969608129862730, 0.483925853284598640, 0.483882097229519910, 0.483838339964735520, 0.483794581490355700, 0.483750821806489480, 0.483707060913246110, 0.483663298810734780, +0.483619535499065560, 0.483575770978347470, 0.483532005248690000, 0.483488238310202100, 0.483444470162994020, 0.483400700807174730, 0.483356930242853700, 0.483313158470139950, +0.483269385489143720, 0.483225611299973990, 0.483181835902740280, 0.483138059297551550, 0.483094281484518110, 0.483050502463748920, 0.483006722235353460, 0.482962940799440850, +0.482919158156121240, 0.482875374305503760, 0.482831589247697480, 0.482787802982812540, 0.482744015510958190, 0.482700226832243730, 0.482656436946778340, 0.482612645854672230, +0.482568853556034520, 0.482525060050974670, 0.482481265339601780, 0.482437469422026140, 0.482393672298356780, 0.482349873968703270, 0.482306074433174690, 0.482262273691881290, +0.482218471744932260, 0.482174668592436960, 0.482130864234504690, 0.482087058671245570, 0.482043251902768870, 0.481999443929183650, 0.481955634750600160, 0.481911824367127590, +0.481868012778875480, 0.481824199985952940, 0.481780385988470340, 0.481736570786536700, 0.481692754380261660, 0.481648936769754400, 0.481605117955125120, 0.481561297936483060, +0.481517476713937740, 0.481473654287598360, 0.481429830657575220, 0.481386005823977560, 0.481342179786914850, 0.481298352546496280, 0.481254524102832200, 0.481210694456031870, +0.481166863606204360, 0.481123031553460090, 0.481079198297908290, 0.481035363839658450, 0.480991528178819850, 0.480947691315502750, 0.480903853249816490, 0.480860013981870560, +0.480816173511774190, 0.480772331839637860, 0.480728488965570630, 0.480684644889682160, 0.480640799612081730, 0.480596953132879700, 0.480553105452185270, 0.480509256570108070, +0.480465406486757340, 0.480421555202243500, 0.480377702716675740, 0.480333849030163350, 0.480289994142816760, 0.480246138054745140, 0.480202280766058200, 0.480158422276865170, +0.480114562587276470, 0.480070701697401350, 0.480026839607349490, 0.479982976317230140, 0.479939111827153710, 0.479895246137229500, 0.479851379247567210, 0.479807511158276080, +0.479763641869466570, 0.479719771381247940, 0.479675899693729870, 0.479632026807021660, 0.479588152721233780, 0.479544277436475540, 0.479500400952856620, 0.479456523270486270, +0.479412644389475010, 0.479368764309932140, 0.479324883031966960, 0.479281000555689950, 0.479237116881210510, 0.479193232008638230, 0.479149345938082450, 0.479105458669653710, +0.479061570203461350, 0.479017680539615080, 0.478973789678224180, 0.478929897619399190, 0.478886004363249460, 0.478842109909884740, 0.478798214259414380, 0.478754317411948850, +0.478710419367597510, 0.478666520126470150, 0.478622619688676090, 0.478578718054325840, 0.478534815223528810, 0.478490911196394360, 0.478447005973033020, 0.478403099553554200, +0.478359191938067580, 0.478315283126682590, 0.478271373119509850, 0.478227461916658600, 0.478183549518238720, 0.478139635924359600, 0.478095721135131770, 0.478051805150664590, +0.478007887971067970, 0.477963969596451210, 0.477920050026924890, 0.477876129262598480, 0.477832207303581720, 0.477788284149984090, 0.477744359801916100, 0.477700434259487270, +0.477656507522806920, 0.477612579591985660, 0.477568650467132980, 0.477524720148358670, 0.477480788635772200, 0.477436855929484150, 0.477392922029603930, 0.477348986936241390, +0.477305050649506010, 0.477261113169508420, 0.477217174496358030, 0.477173234630164700, 0.477129293571037890, 0.477085351319088250, 0.477041407874425230, 0.476997463237158690, +0.476953517407398110, 0.476909570385254110, 0.476865622170836170, 0.476821672764254190, 0.476777722165617650, 0.476733770375037170, 0.476689817392622280, 0.476645863218482460, +0.476601907852728380, 0.476557951295469520, 0.476513993546815780, 0.476470034606876650, 0.476426074475762850, 0.476382113153583860, 0.476338150640449600, 0.476294186936469580, +0.476250222041754430, 0.476206255956413750, 0.476162288680557430, 0.476118320214295010, 0.476074350557737170, 0.476030379710993490, 0.475986407674173830, 0.475942434447387760, +0.475898460030745980, 0.475854484424358070, 0.475810507628333550, 0.475766529642783150, 0.475722550467816420, 0.475678570103543310, 0.475634588550073400, 0.475590605807517440, +0.475546621875984900, 0.475502636755585850, 0.475458650446429820, 0.475414662948627550, 0.475370674262288630, 0.475326684387523010, 0.475282693324440290, 0.475238701073151190, +0.475194707633765370, 0.475150713006392780, 0.475106717191143060, 0.475062720188126900, 0.475018721997453930, 0.474974722619233790, 0.474930722053577170, 0.474886720300593810, +0.474842717360393630, 0.474798713233086260, 0.474754707918782550, 0.474710701417591970, 0.474666693729624720, 0.474622684854990320, 0.474578674793799620, 0.474534663546162190, +0.474490651112188130, 0.474446637491987070, 0.474402622685669740, 0.474358606693345900, 0.474314589515125560, 0.474270571151118310, 0.474226551601435060, 0.474182530866185450, +0.474138508945479040, 0.474094485839426820, 0.474050461548138350, 0.474006436071723770, 0.473962409410292660, 0.473918381563955940, 0.473874352532823280, 0.473830322317004730, +0.473786290916609950, 0.473742258331749880, 0.473698224562534130, 0.473654189609072850, 0.473610153471475670, 0.473566116149853560, 0.473522077644316090, 0.473478037954973450, +0.473433997081935340, 0.473389955025312610, 0.473345911785215010, 0.473301867361752620, 0.473257821755035170, 0.473213774965173530, 0.473169726992277500, 0.473125677836456760, +0.473081627497822180, 0.473037575976483550, 0.472993523272551010, 0.472949469386134190, 0.472905414317344170, 0.472861358066290590, 0.472817300633083580, 0.472773242017833000, +0.472729182220649640, 0.472685121241643360, 0.472641059080924240, 0.472596995738602140, 0.472552931214787860, 0.472508865509591310, 0.472464798623122630, 0.472420730555491500, +0.472376661306808940, 0.472332590877184770, 0.472288519266728660, 0.472244446475551690, 0.472200372503763620, 0.472156297351474570, 0.472112221018794460, 0.472068143505834150, +0.472024064812703480, 0.471979984939512600, 0.471935903886371410, 0.471891821653390890, 0.471847738240680770, 0.471803653648351310, 0.471759567876512300, 0.471715480925274820, +0.471671392794748620, 0.471627303485043890, 0.471583212996270540, 0.471539121328539590, 0.471495028481960790, 0.471450934456644040, 0.471406839252700330, 0.471362742870239550, +0.471318645309371900, 0.471274546570207230, 0.471230446652856630, 0.471186345557429890, 0.471142243284037250, 0.471098139832788640, 0.471054035203795070, 0.471009929397166460, +0.470965822413012990, 0.470921714251444520, 0.470877604912572250, 0.470833494396505900, 0.470789382703355800, 0.470745269833231890, 0.470701155786245220, 0.470657040562505620, +0.470612924162123410, 0.470568806585208550, 0.470524687831872070, 0.470480567902223810, 0.470436446796373750, 0.470392324514432970, 0.470348201056511430, 0.470304076422719320, +0.470259950613166670, 0.470215823627964550, 0.470171695467222820, 0.470127566131051890, 0.470083435619561620, 0.470039303932863140, 0.469995171071066480, 0.469951037034281820, +0.469906901822619180, 0.469862765436189710, 0.469818627875103310, 0.469774489139470340, 0.469730349229400770, 0.469686208145005670, 0.469642065886395120, 0.469597922453678980, +0.469553777846968450, 0.469509632066373420, 0.469465485112004370, 0.469421336983971150, 0.469377187682385010, 0.469333037207355920, 0.469288885558994230, 0.469244732737409960, +0.469200578742714200, 0.469156423575017020, 0.469112267234428780, 0.469068109721059450, 0.469023951035020260, 0.468979791176421190, 0.468935630145372650, 0.468891467941984660, +0.468847304566368360, 0.468803140018633820, 0.468758974298891020, 0.468714807407251190, 0.468670639343824360, 0.468626470108720940, 0.468582299702050900, 0.468538128123925530, +0.468493955374454820, 0.468449781453749270, 0.468405606361918800, 0.468361430099074770, 0.468317252665327140, 0.468273074060786390, 0.468228894285562580, 0.468184713339766860, +0.468140531223509400, 0.468096347936900640, 0.468052163480050580, 0.468007977853070520, 0.467963791056070500, 0.467919603089160640, 0.467875413952452130, 0.467831223646055120, +0.467787032170080000, 0.467742839524636970, 0.467698645709837210, 0.467654450725790820, 0.467610254572608300, 0.467566057250399740, 0.467521858759276490, 0.467477659099348520, +0.467433458270726470, 0.467389256273520350, 0.467345053107841470, 0.467300848773799960, 0.467256643271506340, 0.467212436601070700, 0.467168228762604390, 0.467124019756217530, +0.467079809582020560, 0.467035598240123690, 0.466991385730638250, 0.466947172053674310, 0.466902957209342110, 0.466858741197752840, 0.466814524019016740, 0.466770305673244350, +0.466726086160545780, 0.466681865481032350, 0.466637643634814300, 0.466593420622002150, 0.466549196442706040, 0.466504971097037370, 0.466460744585106220, 0.466416516907023240, +0.466372288062898540, 0.466328058052843550, 0.466283826876968400, 0.466239594535383660, 0.466195361028199580, 0.466151126355527470, 0.466106890517477560, 0.466062653514160040, +0.466018415345686220, 0.465974176012166450, 0.465929935513711200, 0.465885693850430660, 0.465841451022436350, 0.465797207029838400, 0.465752961872747400, 0.465708715551273630, +0.465664468065528470, 0.465620219415622150, 0.465575969601665250, 0.465531718623768080, 0.465487466482041980, 0.465443213176597200, 0.465398958707544390, 0.465354703074993770, +0.465310446279056820, 0.465266188319843730, 0.465221929197464800, 0.465177668912031440, 0.465133407463653890, 0.465089144852442850, 0.465044881078508550, 0.465000616141962420, +0.464956350042914750, 0.464912082781476220, 0.464867814357757090, 0.464823544771868770, 0.464779274023921660, 0.464735002114026300, 0.464690729042293080, 0.464646454808833430, +0.464602179413757640, 0.464557902857176410, 0.464513625139200030, 0.464469346259939960, 0.464425066219506520, 0.464380785018010440, 0.464336502655562030, 0.464292219132272700, +0.464247934448252850, 0.464203648603612740, 0.464159361598463940, 0.464115073432916750, 0.464070784107081860, 0.464026493621069570, 0.463982201974991510, 0.463937909168957880, +0.463893615203079530, 0.463849320077466710, 0.463805023792230990, 0.463760726347482780, 0.463716427743332660, 0.463672127979891100, 0.463627827057269630, 0.463583524975578590, +0.463539221734928730, 0.463494917335430470, 0.463450611777195260, 0.463406305060333530, 0.463361997184955630, 0.463317688151173190, 0.463273377959096460, 0.463229066608836340, +0.463184754100503080, 0.463140440434208430, 0.463096125610062580, 0.463051809628176490, 0.463007492488660470, 0.462963174191626080, 0.462918854737183800, 0.462874534125444330, +0.462830212356518170, 0.462785889430516850, 0.462741565347550840, 0.462697240107730890, 0.462652913711167460, 0.462608586157972120, 0.462564257448255360, 0.462519927582127510, +0.462475596559700270, 0.462431264381084010, 0.462386931046389620, 0.462342596555727510, 0.462298260909209280, 0.462253924106945380, 0.462209586149046730, 0.462165247035623670, +0.462120906766787910, 0.462076565342649850, 0.462032222763320400, 0.461987879028910030, 0.461943534139530320, 0.461899188095291740, 0.461854840896305240, 0.461810492542681250, +0.461766143034531400, 0.461721792371966200, 0.461677440555096130, 0.461633087584032880, 0.461588733458886850, 0.461544378179769010, 0.461500021746789830, 0.461455664160061010, +0.461411305419693050, 0.461366945525796770, 0.461322584478482790, 0.461278222277862690, 0.461233858924047060, 0.461189494417146790, 0.461145128757272370, 0.461100761944535530, +0.461056393979046800, 0.461012024860917020, 0.460967654590256850, 0.460923283167177960, 0.460878910591790810, 0.460834536864206390, 0.460790161984535260, 0.460745785952889060, +0.460701408769378480, 0.460657030434113930, 0.460612650947207210, 0.460568270308768850, 0.460523888518909850, 0.460479505577740700, 0.460435121485373190, 0.460390736241917900, +0.460346349847485740, 0.460301962302187340, 0.460257573606134400, 0.460213183759437540, 0.460168792762207680, 0.460124400614555510, 0.460080007316592710, 0.460035612868429870, +0.459991217270178000, 0.459946820521947740, 0.459902422623850780, 0.459858023575997750, 0.459813623378499290, 0.459769222031467200, 0.459724819535011990, 0.459680415889244800, +0.459636011094276100, 0.459591605150217800, 0.459547198057180530, 0.459502789815275200, 0.459458380424612510, 0.459413969885304310, 0.459369558197461170, 0.459325145361194120, +0.459280731376613790, 0.459236316243832100, 0.459191899962959560, 0.459147482534107250, 0.459103063957385870, 0.459058644232907260, 0.459014223360782010, 0.458969801341120750, +0.458925378174035450, 0.458880953859636730, 0.458836528398035570, 0.458792101789342710, 0.458747674033670010, 0.458703245131128090, 0.458658815081828040, 0.458614383885880610, +0.458569951543397580, 0.458525518054489710, 0.458481083419268020, 0.458436647637843200, 0.458392210710327210, 0.458347772636830690, 0.458303333417464710, 0.458258893052340020, +0.458214451541568480, 0.458170008885260770, 0.458125565083528090, 0.458081120136481110, 0.458036674044231710, 0.457992226806890610, 0.457947778424568570, 0.457903328897377450, +0.457858878225428030, 0.457814426408831410, 0.457769973447698380, 0.457725519342140730, 0.457681064092269330, 0.457636607698195250, 0.457592150160029240, 0.457547691477883320, +0.457503231651868130, 0.457458770682094840, 0.457414308568674210, 0.457369845311718260, 0.457325380911337680, 0.457280915367643650, 0.457236448680746920, 0.457191980850759460, +0.457147511877792070, 0.457103041761955490, 0.457058570503361740, 0.457014098102121510, 0.456969624558346050, 0.456925149872146160, 0.456880674043633750, 0.456836197072919670, +0.456791718960115110, 0.456747239705330820, 0.456702759308678870, 0.456658277770270020, 0.456613795090215490, 0.456569311268626040, 0.456524826305613700, 0.456480340201289300, +0.456435852955764110, 0.456391364569148810, 0.456346875041555520, 0.456302384373095060, 0.456257892563878280, 0.456213399614017080, 0.456168905523622440, 0.456124410292805480, +0.456079913921677180, 0.456035416410349450, 0.455990917758933190, 0.455946417967539600, 0.455901917036279580, 0.455857414965265220, 0.455812911754607250, 0.455768407404417040, +0.455723901914805380, 0.455679395285884410, 0.455634887517764930, 0.455590378610558230, 0.455545868564375180, 0.455501357379327840, 0.455456845055527140, 0.455412331593083920, +0.455367816992110260, 0.455323301252717080, 0.455278784375015620, 0.455234266359116850, 0.455189747205132780, 0.455145226913174330, 0.455100705483352850, 0.455056182915779150, +0.455011659210565410, 0.454967134367822550, 0.454922608387661850, 0.454878081270194250, 0.454833553015531800, 0.454789023623785480, 0.454744493095066590, 0.454699961429486100, +0.454655428627156080, 0.454610894688187490, 0.454566359612691650, 0.454521823400779570, 0.454477286052563270, 0.454432747568153770, 0.454388207947662050, 0.454343667191200170, +0.454299125298879110, 0.454254582270810230, 0.454210038107104530, 0.454165492807874100, 0.454120946373229970, 0.454076398803283490, 0.454031850098145560, 0.453987300257928440, +0.453942749282743030, 0.453898197172700800, 0.453853643927912660, 0.453809089548490810, 0.453764534034546250, 0.453719977386190300, 0.453675419603534080, 0.453630860686689670, +0.453586300635768100, 0.453541739450880390, 0.453497177132138720, 0.453452613679654120, 0.453408049093537990, 0.453363483373901370, 0.453318916520856370, 0.453274348534514090, +0.453229779414985990, 0.453185209162383030, 0.453140637776817400, 0.453096065258400240, 0.453051491607242900, 0.453006916823456400, 0.452962340907153040, 0.452917763858443790, +0.452873185677440170, 0.452828606364253150, 0.452784025918995030, 0.452739444341776880, 0.452694861632709670, 0.452650277791905750, 0.452605692819476100, 0.452561106715532240, +0.452516519480185180, 0.452471931113547220, 0.452427341615729510, 0.452382750986843380, 0.452338159226999990, 0.452293566336311570, 0.452248972314889250, 0.452204377162844510, +0.452159780880288460, 0.452115183467333310, 0.452070584924090250, 0.452025985250670670, 0.451981384447185770, 0.451936782513747800, 0.451892179450467830, 0.451847575257457450, +0.451802969934827710, 0.451758363482690990, 0.451713755901158360, 0.451669147190340900, 0.451624537350351020, 0.451579926381299730, 0.451535314283298680, 0.451490701056458940, +0.451446086700892810, 0.451401471216711480, 0.451356854604026470, 0.451312236862948970, 0.451267617993591220, 0.451222997996064470, 0.451178376870480180, 0.451133754616949540, +0.451089131235584970, 0.451044506726497540, 0.450999881089798830, 0.450955254325600070, 0.450910626434013530, 0.450865997415150430, 0.450821367269121920, 0.450776735996040460, +0.450732103596017120, 0.450687470069163490, 0.450642835415590800, 0.450598199635411420, 0.450553562728736590, 0.450508924695677770, 0.450464285536346320, 0.450419645250854540, +0.450375003839313610, 0.450330361301835180, 0.450285717638530420, 0.450241072849511810, 0.450196426934890540, 0.450151779894778170, 0.450107131729285960, 0.450062482438526310, +0.450017832022610480, 0.449973180481649640, 0.449928527815756260, 0.449883874025041540, 0.449839219109617160, 0.449794563069594310, 0.449749905905085460, 0.449705247616201900, +0.449660588203055160, 0.449615927665756530, 0.449571266004418550, 0.449526603219152390, 0.449481939310069690, 0.449437274277281750, 0.449392608120901040, 0.449347940841038800, +0.449303272437806660, 0.449258602911316030, 0.449213932261679220, 0.449169260489007630, 0.449124587593412450, 0.449079913575006210, 0.449035238433900200, 0.448990562170206110, +0.448945884784035190, 0.448901206275499950, 0.448856526644711710, 0.448811845891782140, 0.448767164016822600, 0.448722481019945500, 0.448677796901262250, 0.448633111660884430, +0.448588425298923510, 0.448543737815491890, 0.448499049210700880, 0.448454359484662330, 0.448409668637487440, 0.448364976669288760, 0.448320283580177670, 0.448275589370265900, +0.448230894039664710, 0.448186197588486710, 0.448141500016843160, 0.448096801324845530, 0.448052101512606270, 0.448007400580236750, 0.447962698527848760, 0.447917995355553540, +0.447873291063463800, 0.447828585651690810, 0.447783879120346400, 0.447739171469541840, 0.447694462699389780, 0.447649752810001580, 0.447605041801488970, 0.447560329673963360, +0.447515616427537340, 0.447470902062322260, 0.447426186578429920, 0.447381469975971720, 0.447336752255060250, 0.447292033415806920, 0.447247313458323080, 0.447202592382721360, +0.447157870189113130, 0.447113146877610280, 0.447068422448324120, 0.447023696901367340, 0.446978970236851290, 0.446934242454887830, 0.446889513555588370, 0.446844783539065540, +0.446800052405430690, 0.446755320154795740, 0.446710586787272100, 0.446665852302972400, 0.446621116702008050, 0.446576379984490960, 0.446531642150532480, 0.446486903200245260, +0.446442163133740800, 0.446397421951130580, 0.446352679652527170, 0.446307936238042050, 0.446263191707787110, 0.446218446061873770, 0.446173699300414730, 0.446128951423521490, +0.446084202431305810, 0.446039452323879200, 0.445994701101354420, 0.445949948763842860, 0.445905195311456450, 0.445860440744306640, 0.445815685062506130, 0.445770928266166380, +0.445726170355399350, 0.445681411330316470, 0.445636651191030460, 0.445591889937652810, 0.445547127570295460, 0.445502364089069900, 0.445457599494088810, 0.445412833785463700, +0.445368066963306160, 0.445323299027728830, 0.445278529978843260, 0.445233759816761330, 0.445188988541594610, 0.445144216153455840, 0.445099442652456550, 0.445054668038708630, +0.445009892312323630, 0.444965115473414330, 0.444920337522092200, 0.444875558458469210, 0.444830778282656990, 0.444785996994768170, 0.444741214594914390, 0.444696431083207560, +0.444651646459759300, 0.444606860724682250, 0.444562073878088100, 0.444517285920088320, 0.444472496850795760, 0.444427706670321940, 0.444382915378778890, 0.444338122976278120, +0.444293329462932430, 0.444248534838853460, 0.444203739104153120, 0.444158942258943030, 0.444114144303335960, 0.444069345237443570, 0.444024545061377840, 0.443979743775250290, +0.443934941379173830, 0.443890137873259980, 0.443845333257620820, 0.443800527532367930, 0.443755720697614040, 0.443710912753470970, 0.443666103700050110, 0.443621293537464430, +0.443576482265825580, 0.443531669885245450, 0.443486856395835740, 0.443442041797709300, 0.443397226090977810, 0.443352409275753200, 0.443307591352147200, 0.443262772320272560, +0.443217952180241070, 0.443173130932164650, 0.443128308576155040, 0.443083485112324980, 0.443038660540786280, 0.442993834861650890, 0.442949008075030570, 0.442904180181038050, +0.442859351179785140, 0.442814521071383860, 0.442769689855945840, 0.442724857533583980, 0.442680024104410040, 0.442635189568535590, 0.442590353926073600, 0.442545517177135690, +0.442500679321834010, 0.442455840360280240, 0.442411000292587230, 0.442366159118866730, 0.442321316839230870, 0.442276473453791290, 0.442231628962660940, 0.442186783365951520, +0.442141936663775100, 0.442097088856243490, 0.442052239943469540, 0.442007389925564990, 0.441962538802641970, 0.441917686574812170, 0.441872833242188620, 0.441827978804882950, +0.441783123263006890, 0.441738266616673480, 0.441693408865994400, 0.441648550011081780, 0.441603690052047360, 0.441558828989004170, 0.441513966822063900, 0.441469103551338670, +0.441424239176940290, 0.441379373698981730, 0.441334507117574770, 0.441289639432831500, 0.441244770644863730, 0.441199900753784460, 0.441155029759705390, 0.441110157662738810, +0.441065284462996370, 0.441020410160591180, 0.440975534755634950, 0.440930658248239460, 0.440885780638517740, 0.440840901926581540, 0.440796022112543100, 0.440751141196514260, +0.440706259178607900, 0.440661376058935910, 0.440616491837610480, 0.440571606514743420, 0.440526720090447740, 0.440481832564835310, 0.440436943938018240, 0.440392054210108410, +0.440347163381218880, 0.440302271451461450, 0.440257378420948310, 0.440212484289791320, 0.440167589058103490, 0.440122692725996740, 0.440077795293582870, 0.440032896760974900, +0.439987997128284620, 0.439943096395624460, 0.439898194563106080, 0.439853291630842640, 0.439808387598945970, 0.439763482467528330, 0.439718576236701570, 0.439673668906578770, +0.439628760477271840, 0.439583850948892960, 0.439538940321554050, 0.439494028595368240, 0.439449115770447320, 0.439404201846903650, 0.439359286824849040, 0.439314370704396610, +0.439269453485658270, 0.439224535168746270, 0.439179615753772570, 0.439134695240850190, 0.439089773630091110, 0.439044850921607170, 0.438999927115511560, 0.438955002211916080, +0.438910076210933090, 0.438865149112674490, 0.438820220917253480, 0.438775291624781900, 0.438730361235372070, 0.438685429749135940, 0.438640497166186640, 0.438595563486636090, +0.438550628710596630, 0.438505692838180190, 0.438460755869499950, 0.438415817804667820, 0.438370878643796150, 0.438325938386996850, 0.438280997034383110, 0.438236054586066900, +0.438191111042160130, 0.438146166402775980, 0.438101220668026430, 0.438056273838023870, 0.438011325912880170, 0.437966376892708560, 0.437921426777621030, 0.437876475567729910, +0.437831523263147230, 0.437786569863986120, 0.437741615370358550, 0.437696659782376980, 0.437651703100153390, 0.437606745323800890, 0.437561786453431580, 0.437516826489157740, +0.437471865431091510, 0.437426903279345970, 0.437381940034033130, 0.437336975695265140, 0.437292010263155060, 0.437247043737814920, 0.437202076119357190, 0.437157107407893930, +0.437112137603538230, 0.437067166706402220, 0.437022194716598260, 0.436977221634238470, 0.436932247459435990, 0.436887272192302890, 0.436842295832951640, 0.436797318381494220, +0.436752339838043900, 0.436707360202712720, 0.436662379475613150, 0.436617397656857250, 0.436572414746558280, 0.436527430744828250, 0.436482445651779630, 0.436437459467524490, +0.436392472192176080, 0.436347483825846540, 0.436302494368647880, 0.436257503820693390, 0.436212512182095110, 0.436167519452965560, 0.436122525633416860, 0.436077530723562200, +0.436032534723513720, 0.435987537633383880, 0.435942539453284820, 0.435897540183329820, 0.435852539823630980, 0.435807538374300750, 0.435762535835451330, 0.435717532207195890, +0.435672527489646690, 0.435627521682916130, 0.435582514787116400, 0.435537506802360750, 0.435492497728761360, 0.435447487566430310, 0.435402476315480960, 0.435357463976025370, +0.435312450548176190, 0.435267436032045430, 0.435222420427746500, 0.435177403735391540, 0.435132385955093070, 0.435087367086963220, 0.435042347131115340, 0.434997326087661560, +0.434952303956714530, 0.434907280738386300, 0.434862256432790310, 0.434817231040038670, 0.434772204560243900, 0.434727176993518260, 0.434682148339975090, 0.434637118599726540, +0.434592087772884770, 0.434547055859563210, 0.434502022859873990, 0.434456988773929690, 0.434411953601842590, 0.434366917343725960, 0.434321879999692020, 0.434276841569853410, +0.434231802054322270, 0.434186761453212060, 0.434141719766634960, 0.434096676994703500, 0.434051633137529980, 0.434006588195227800, 0.433961542167909110, 0.433916495055686580, +0.433871446858672400, 0.433826397576980050, 0.433781347210721650, 0.433736295760009490, 0.433691243224957000, 0.433646189605676410, 0.433601134902280360, 0.433556079114881090, +0.433511022243591950, 0.433465964288525300, 0.433420905249793760, 0.433375845127509480, 0.433330783921786090, 0.433285721632735650, 0.433240658260470980, 0.433195593805104200, +0.433150528266748880, 0.433105461645517220, 0.433060393941521900, 0.433015325154875230, 0.432970255285690610, 0.432925184334080390, 0.432880112300157160, 0.432835039184033270, +0.432789964985822170, 0.432744889705636180, 0.432699813343587590, 0.432654735899789810, 0.432609657374355250, 0.432564577767396490, 0.432519497079025930, 0.432474415309356990, +0.432429332458502010, 0.432384248526573760, 0.432339163513684450, 0.432294077419947630, 0.432248990245475580, 0.432203901990381110, 0.432158812654776460, 0.432113722238775200, +0.432068630742489630, 0.432023538166032450, 0.431978444509516060, 0.431933349773053920, 0.431888253956758450, 0.431843157060741940, 0.431798059085117920, 0.431752960029998740, +0.431707859895497200, 0.431662758681725540, 0.431617656388797450, 0.431572553016825230, 0.431527448565921570, 0.431482343036198920, 0.431437236427770820, 0.431392128740749610, +0.431347019975248100, 0.431301910131378640, 0.431256799209254750, 0.431211687208988950, 0.431166574130693870, 0.431121459974481980, 0.431076344740466800, 0.431031228428760790, +0.430986111039476320, 0.430940992572726940, 0.430895873028625140, 0.430850752407283600, 0.430805630708814780, 0.430760507933332320, 0.430715384080948560, 0.430670259151776370, +0.430625133145928100, 0.430580006063517430, 0.430534877904656720, 0.430489748669458830, 0.430444618358036160, 0.430399486970502340, 0.430354354506969790, 0.430309220967551360, +0.430264086352359520, 0.430218950661507840, 0.430173813895108780, 0.430128676053275150, 0.430083537136119460, 0.430038397143755360, 0.429993256076295240, 0.429948113933851570, +0.429902970716538050, 0.429857826424467070, 0.429812681057751500, 0.429767534616503850, 0.429722387100837770, 0.429677238510865760, 0.429632088846700620, 0.429586938108454830, +0.429541786296242120, 0.429496633410174970, 0.429451479450366210, 0.429406324416928330, 0.429361168309975060, 0.429316011129618870, 0.429270852875972660, 0.429225693549148910, +0.429180533149261360, 0.429135371676422460, 0.429090209130744690, 0.429045045512341850, 0.428999880821326340, 0.428954715057811190, 0.428909548221908800, 0.428864380313732970, +0.428819211333396180, 0.428774041281011380, 0.428728870156691030, 0.428683697960548950, 0.428638524692697590, 0.428593350353249970, 0.428548174942318560, 0.428502998460017050, +0.428457820906458120, 0.428412642281754570, 0.428367462586019100, 0.428322281819365320, 0.428277099981905830, 0.428231917073753190, 0.428186733095021200, 0.428141548045822330, +0.428096361926269600, 0.428051174736475580, 0.428005986476554020, 0.427960797146617500, 0.427915606746778980, 0.427870415277151030, 0.427825222737847450, 0.427780029128980830, +0.427734834450664130, 0.427689638703009910, 0.427644441886132040, 0.427599244000143040, 0.427554045045155930, 0.427508845021283330, 0.427463643928639000, 0.427418441767335570, +0.427373238537485600, 0.427328034239202960, 0.427282828872600270, 0.427237622437790450, 0.427192414934886190, 0.427147206364001330, 0.427101996725248400, 0.427056786018740530, +0.427011574244590240, 0.426966361402911500, 0.426921147493816770, 0.426875932517419230, 0.426830716473831420, 0.426785499363167230, 0.426740281185539310, 0.426695061941060660, +0.426649841629843930, 0.426604620252003080, 0.426559397807650620, 0.426514174296899640, 0.426468949719862880, 0.426423724076654130, 0.426378497367386090, 0.426333269592171380, +0.426288040751123860, 0.426242810844356280, 0.426197579871981700, 0.426152347834112710, 0.426107114730863320, 0.426061880562346120, 0.426016645328674170, 0.425971409029960280, +0.425926171666318190, 0.425880933237860750, 0.425835693744700930, 0.425790453186951470, 0.425745211564726280, 0.425699968878138100, 0.425654725127299960, 0.425609480312324600, +0.425564234433325970, 0.425518987490416720, 0.425473739483709650, 0.425428490413318590, 0.425383240279356310, 0.425337989081935930, 0.425292736821170190, 0.425247483497173010, +0.425202229110057120, 0.425156973659935660, 0.425111717146921360, 0.425066459571128150, 0.425021200932668820, 0.424975941231656500, 0.424930680468203870, 0.424885418642424960, +0.424840155754432570, 0.424794891804339710, 0.424749626792259250, 0.424704360718305090, 0.424659093582590070, 0.424613825385226910, 0.424568556126329600, 0.424523285806010840, +0.424478014424383930, 0.424432741981561560, 0.424387468477657740, 0.424342193912785270, 0.424296918287057290, 0.424251641600586590, 0.424206363853487200, 0.424161085045871910, +0.424115805177853910, 0.424070524249546000, 0.424025242261062200, 0.423979959212515240, 0.423934675104018440, 0.423889389935684540, 0.423844103707627540, 0.423798816419960310, +0.423753528072795980, 0.423708238666247520, 0.423662948200428770, 0.423617656675452700, 0.423572364091432120, 0.423527070448480980, 0.423481775746712140, 0.423436479986238900, +0.423391183167174060, 0.423345885289631680, 0.423300586353724580, 0.423255286359566000, 0.423209985307268780, 0.423164683196947060, 0.423119380028713580, 0.423074075802681690, +0.423028770518964150, 0.422983464177675130, 0.422938156778927430, 0.422892848322834360, 0.422847538809508760, 0.422802228239064710, 0.422756916611615070, 0.422711603927272810, +0.422666290186151870, 0.422620975388365240, 0.422575659534026150, 0.422530342623247510, 0.422485024656143400, 0.422439705632826790, 0.422394385553410860, 0.422349064418008570, +0.422303742226734060, 0.422258418979700120, 0.422213094677020230, 0.422167769318807120, 0.422122442905175030, 0.422077115436236830, 0.422031786912105800, 0.421986457332894970, +0.421941126698718360, 0.421895795009688930, 0.421850462265919600, 0.421805128467524550, 0.421759793614616680, 0.421714457707309310, 0.421669120745715390, 0.421623782729949050, +0.421578443660123310, 0.421533103536351430, 0.421487762358746350, 0.421442420127422330, 0.421397076842492220, 0.421351732504069430, 0.421306387112266920, 0.421261040667198830, +0.421215693168978170, 0.421170344617718240, 0.421124995013532070, 0.421079644356533780, 0.421034292646836390, 0.420988939884552880, 0.420943586069797430, 0.420898231202682990, +0.420852875283322990, 0.420807518311830390, 0.420762160288319420, 0.420716801212903060, 0.420671441085694650, 0.420626079906807230, 0.420580717676355080, 0.420535354394451060, +0.420489990061208680, 0.420444624676740930, 0.420399258241162030, 0.420353890754585010, 0.420308522217123230, 0.420263152628889750, 0.420217781989998760, 0.420172410300563350, +0.420127037560696910, 0.420081663770512430, 0.420036288930124240, 0.419990913039645310, 0.419945536099188720, 0.419900158108868660, 0.419854779068798260, 0.419809398979090860, +0.419764017839859560, 0.419718635651218640, 0.419673252413281130, 0.419627868126160490, 0.419582482789969740, 0.419537096404823230, 0.419491708970833990, 0.419446320488115420, +0.419400930956780660, 0.419355540376944000, 0.419310148748718530, 0.419264756072217640, 0.419219362347554410, 0.419173967574843260, 0.419128571754197150, 0.419083174885729210, +0.419037776969553740, 0.418992378005783820, 0.418946977994532950, 0.418901576935914290, 0.418856174830042010, 0.418810771677029350, 0.418765367476989720, 0.418719962230036320, +0.418674555936283390, 0.418629148595844050, 0.418583740208831880, 0.418538330775359900, 0.418492920295542530, 0.418447508769492880, 0.418402096197324440, 0.418356682579150370, +0.418311267915084940, 0.418265852205241370, 0.418220435449732810, 0.418175017648673540, 0.418129598802176710, 0.418084178910355870, 0.418038757973324240, 0.417993335991196040, +0.417947912964084570, 0.417902488892103300, 0.417857063775365360, 0.417811637613985210, 0.417766210408075930, 0.417720782157751160, 0.417675352863124020, 0.417629922524308920, +0.417584491141418990, 0.417539058714567810, 0.417493625243868630, 0.417448190729435790, 0.417402755171382420, 0.417357318569822220, 0.417311880924868260, 0.417266442236635060, +0.417221002505235690, 0.417175561730783460, 0.417130119913392720, 0.417084677053176700, 0.417039233150248990, 0.416993788204722770, 0.416948342216712450, 0.416902895186331330, +0.416857447113692940, 0.416811997998910560, 0.416766547842098540, 0.416721096643370200, 0.416675644402839110, 0.416630191120618500, 0.416584736796822790, 0.416539281431565270, +0.416493825024959520, 0.416448367577118840, 0.416402909088157580, 0.416357449558189100, 0.416311988987326580, 0.416266527375684480, 0.416221064723376110, 0.416175601030515040, +0.416130136297214570, 0.416084670523589160, 0.416039203709752060, 0.415993735855817000, 0.415948266961897130, 0.415902797028107060, 0.415857326054559940, 0.415811854041369560, +0.415766380988649100, 0.415720906896513090, 0.415675431765074880, 0.415629955594448040, 0.415584478384745880, 0.415539000136082970, 0.415493520848572550, 0.415448040522327920, +0.415402559157463550, 0.415357076754092840, 0.415311593312329420, 0.415266108832286650, 0.415220623314078940, 0.415175136757819700, 0.415129649163622660, 0.415084160531601080, +0.415038670861869460, 0.414993180154541170, 0.414947688409729950, 0.414902195627549100, 0.414856701808113180, 0.414811206951535500, 0.414765711057929810, 0.414720214127409390, +0.414674716160088890, 0.414629217156081590, 0.414583717115500850, 0.414538216038461190, 0.414492713925076030, 0.414447210775459040, 0.414401706589723640, 0.414356201367984400, +0.414310695110354620, 0.414265187816948100, 0.414219679487878250, 0.414174170123259580, 0.414128659723205510, 0.414083148287829770, 0.414037635817245730, 0.413992122311568010, +0.413946607770910020, 0.413901092195385510, 0.413855575585107830, 0.413810057940191660, 0.413764539260750300, 0.413719019546897600, 0.413673498798746990, 0.413627977016413020, +0.413582454200009050, 0.413536930349648610, 0.413491405465446220, 0.413445879547515330, 0.413400352595969740, 0.413354824610922820, 0.413309295592489300, 0.413263765540782540, +0.413218234455916320, 0.413172702338004130, 0.413127169187160580, 0.413081635003499150, 0.413036099787133570, 0.412990563538177420, 0.412945026256745170, 0.412899487942950450, +0.412853948596906940, 0.412808408218728160, 0.412762866808528810, 0.412717324366422220, 0.412671780892521990, 0.412626236386942680, 0.412580690849797760, 0.412535144281201140, +0.412489596681266280, 0.412444048050107760, 0.412398498387839150, 0.412352947694574310, 0.412307395970426700, 0.412261843215511010, 0.412216289429940710, 0.412170734613829690, +0.412125178767291380, 0.412079621890440560, 0.412034063983390710, 0.411988505046255670, 0.411942945079148970, 0.411897384082185290, 0.411851822055478210, 0.411806258999141140, +0.411760694913288820, 0.411715129798034760, 0.411669563653492890, 0.411623996479776650, 0.411578428277000920, 0.411532859045279030, 0.411487288784725070, 0.411441717495452440, +0.411396145177575890, 0.411350571831209040, 0.411304997456465700, 0.411259422053459500, 0.411213845622305170, 0.411168268163116190, 0.411122689676006570, 0.411077110161089780, +0.411031529618480660, 0.410985948048292690, 0.410940365450639890, 0.410894781825635710, 0.410849197173395020, 0.410803611494031330, 0.410758024787658220, 0.410712437054390420, +0.410666848294341520, 0.410621258507625540, 0.410575667694355990, 0.410530075854647680, 0.410484482988614170, 0.410438889096369500, 0.410393294178027170, 0.410347698233701990, +0.410302101263507580, 0.410256503267557910, 0.410210904245966620, 0.410165304198848450, 0.410119703126316960, 0.410074101028486290, 0.410028497905469910, 0.409982893757382730, +0.409937288584338310, 0.409891682386450240, 0.409846075163833370, 0.409800466916601320, 0.409754857644868130, 0.409709247348747360, 0.409663636028353870, 0.409618023683801350, +0.409572410315203690, 0.409526795922674660, 0.409481180506329030, 0.409435564066280460, 0.409389946602642940, 0.409344328115530180, 0.409298708605056960, 0.409253088071337030, +0.409207466514484360, 0.409161843934612630, 0.409116220331836640, 0.409070595706270130, 0.409024970058026740, 0.408979343387221360, 0.408933715693967580, 0.408888086978379530, +0.408842457240570830, 0.408796826480656410, 0.408751194698749880, 0.408705561894965430, 0.408659928069416640, 0.408614293222218430, 0.408568657353484520, 0.408523020463328950, +0.408477382551865390, 0.408431743619208810, 0.408386103665472840, 0.408340462690771680, 0.408294820695218890, 0.408249177678929490, 0.408203533642017170, 0.408157888584595560, +0.408112242506779630, 0.408066595408683120, 0.408020947290420100, 0.407975298152104370, 0.407929647993850730, 0.407883996815772980, 0.407838344617985290, 0.407792691400601260, +0.407747037163735950, 0.407701381907503050, 0.407655725632016690, 0.407610068337390610, 0.407564410023739780, 0.407518750691177880, 0.407473090339819100, 0.407427428969777240, +0.407381766581167200, 0.407336103174102740, 0.407290438748698020, 0.407244773305066810, 0.407199106843324050, 0.407153439363583500, 0.407107770865959010, 0.407062101350565420, +0.407016430817516650, 0.406970759266926770, 0.406925086698909590, 0.406879413113580110, 0.406833738511052090, 0.406788062891439710, 0.406742386254856810, 0.406696708601418320, +0.406651029931238030, 0.406605350244430230, 0.406559669541108560, 0.406513987821388200, 0.406468305085382840, 0.406422621333206720, 0.406376936564973650, 0.406331250780798630, +0.406285563980795520, 0.406239876165078060, 0.406194187333761340, 0.406148497486959140, 0.406102806624785650, 0.406057114747354790, 0.406011421854781560, 0.405965727947179720, +0.405920033024663620, 0.405874337087346990, 0.405828640135344920, 0.405782942168771310, 0.405737243187740290, 0.405691543192365780, 0.405645842182762780, 0.405600140159045220, +0.405554437121327270, 0.405508733069722850, 0.405463028004347030, 0.405417321925313600, 0.405371614832736480, 0.405325906726730690, 0.405280197607410190, 0.405234487474889160, +0.405188776329281520, 0.405143064170702340, 0.405097350999265470, 0.405051636815085270, 0.405005921618275530, 0.404960205408951390, 0.404914488187226810, 0.404868769953215910, +0.404823050707032730, 0.404777330448792330, 0.404731609178608620, 0.404685886896595900, 0.404640163602868030, 0.404594439297540130, 0.404548713980726170, 0.404502987652540390, +0.404457260313096760, 0.404411531962510400, 0.404365802600895160, 0.404320072228365080, 0.404274340845035160, 0.404228608451019430, 0.404182875046432130, 0.404137140631387280, +0.404091405206000010, 0.404045668770384170, 0.403999931324654170, 0.403954192868923980, 0.403908453403308660, 0.403862712927922200, 0.403816971442878980, 0.403771228948292980, +0.403725485444279220, 0.403679740930951820, 0.403633995408425040, 0.403588248876812830, 0.403542501336230490, 0.403496752786791810, 0.403451003228610880, 0.403405252661802830, +0.403359501086481660, 0.403313748502761750, 0.403267994910757040, 0.403222240310582790, 0.403176484702352900, 0.403130728086181830, 0.403084970462183500, 0.403039211830473200, +0.402993452191164780, 0.402947691544372820, 0.402901929890211170, 0.402856167228795140, 0.402810403560238670, 0.402764638884656190, 0.402718873202161710, 0.402673106512870470, +0.402627338816896440, 0.402581570114353690, 0.402535800405357360, 0.402490029690021570, 0.402444257968460730, 0.402398485240788810, 0.402352711507121100, 0.402306936767571570, +0.402261161022254730, 0.402215384271284560, 0.402169606514776400, 0.402123827752844170, 0.402078047985602370, 0.402032267213165040, 0.401986485435647470, 0.401940702653163670, +0.401894918865828120, 0.401849134073754890, 0.401803348277059160, 0.401757561475855120, 0.401711773670256790, 0.401665984860379350, 0.401620195046337000, 0.401574404228244200, +0.401528612406214900, 0.401482819580364520, 0.401437025750807140, 0.401391230917657100, 0.401345435081028660, 0.401299638241036980, 0.401253840397796210, 0.401208041551420870, +0.401162241702025020, 0.401116440849723980, 0.401070638994631800, 0.401024836136863020, 0.400979032276531750, 0.400933227413753370, 0.400887421548641820, 0.400841614681311800, +0.400795806811877320, 0.400749997940453680, 0.400704188067155080, 0.400658377192095630, 0.400612565315390580, 0.400566752437154170, 0.400520938557500870, 0.400475123676544810, +0.400429307794401330, 0.400383490911184580, 0.400337673027009120, 0.400291854141989090, 0.400246034256239840, 0.400200213369875430, 0.400154391483010570, 0.400108568595759270, +0.400062744708236990, 0.400016919820557810, 0.399971093932836360, 0.399925267045186770, 0.399879439157724390, 0.399833610270563470, 0.399787780383818070, 0.399741949497603610, +0.399696117612034330, 0.399650284727224750, 0.399604450843288990, 0.399558615960342590, 0.399512780078499610, 0.399466943197874680, 0.399421105318581990, 0.399375266440736900, +0.399329426564453690, 0.399283585689846950, 0.399237743817030750, 0.399191900946120670, 0.399146057077230830, 0.399100212210475810, 0.399054366345969860, 0.399008519483828430, +0.398962671624165710, 0.398916822767095840, 0.398870972912734380, 0.398825122061195470, 0.398779270212593740, 0.398733417367043490, 0.398687563524660000, 0.398641708685557710, +0.398595852849851050, 0.398549996017654400, 0.398504138189083200, 0.398458279364251600, 0.398412419543274330, 0.398366558726265580, 0.398320696913340880, 0.398274834104614390, +0.398228970300200820, 0.398183105500214460, 0.398137239704770720, 0.398091372913983890, 0.398045505127968600, 0.397999636346839160, 0.397953766570711020, 0.397907895799698490, +0.397862024033915800, 0.397816151273478470, 0.397770277518500750, 0.397724402769097320, 0.397678527025382480, 0.397632650287471750, 0.397586772555479420, 0.397540893829520130, +0.397495014109708170, 0.397449133396159120, 0.397403251688987210, 0.397357368988307200, 0.397311485294233320, 0.397265600606881150, 0.397219714926364990, 0.397173828252799570, +0.397127940586299130, 0.397082051926979260, 0.397036162274954250, 0.396990271630338450, 0.396944379993247390, 0.396898487363795350, 0.396852593742097080, 0.396806699128266940, +0.396760803522420440, 0.396714906924671980, 0.396669009335136210, 0.396623110753927530, 0.396577211181161460, 0.396531310616952350, 0.396485409061415000, 0.396439506514663700, +0.396393602976814030, 0.396347698447980400, 0.396301792928277500, 0.396255886417819670, 0.396209978916722600, 0.396164070425100550, 0.396118160943067900, 0.396072250470740290, +0.396026339008232030, 0.395980426555657910, 0.395934513113132320, 0.395888598680770920, 0.395842683258687930, 0.395796766846998270, 0.395750849445816290, 0.395704931055257610, +0.395659011675436600, 0.395613091306468050, 0.395567169948466360, 0.395521247601547170, 0.395475324265824820, 0.395429399941414180, 0.395383474628429650, 0.395337548326986870, +0.395291621037200170, 0.395245692759183980, 0.395199763493054020, 0.395153833238924670, 0.395107901996910650, 0.395061969767126540, 0.395016036549687920, 0.394970102344709200, +0.394924167152305160, 0.394878230972590340, 0.394832293805680360, 0.394786355651689620, 0.394740416510733050, 0.394694476382924990, 0.394648535268381120, 0.394602593167215960, +0.394556650079544320, 0.394510706005480600, 0.394464760945140550, 0.394418814898638610, 0.394372867866089600, 0.394326919847608040, 0.394280970843309600, 0.394235020853308690, +0.394189069877719840, 0.394143117916658740, 0.394097164970239830, 0.394051211038577990, 0.394005256121787770, 0.393959300219984760, 0.393913343333283540, 0.393867385461798950, +0.393821426605645450, 0.393775466764938850, 0.393729505939793560, 0.393683544130324470, 0.393637581336646170, 0.393591617558874280, 0.393545652797123390, 0.393499687051508340, +0.393453720322143650, 0.393407752609145070, 0.393361783912627160, 0.393315814232704340, 0.393269843569492410, 0.393223871923105870, 0.393177899293659590, 0.393131925681268260, +0.393085951086047440, 0.393039975508111760, 0.392993998947576200, 0.392948021404555150, 0.392902042879164530, 0.392856063371518740, 0.392810082881732800, 0.392764101409921300, +0.392718118956199900, 0.392672135520683200, 0.392626151103486200, 0.392580165704723370, 0.392534179324510570, 0.392488191962962310, 0.392442203620193160, 0.392396214296318930, +0.392350223991454140, 0.392304232705713800, 0.392258240439212480, 0.392212247192065930, 0.392166252964388780, 0.392120257756296050, 0.392074261567902200, 0.392028264399323150, +0.391982266250673390, 0.391936267122068030, 0.391890267013621510, 0.391844265925449800, 0.391798263857667420, 0.391752260810389330, 0.391706256783730220, 0.391660251777805890, +0.391614245792730910, 0.391568238828620300, 0.391522230885588680, 0.391476221963751920, 0.391430212063224590, 0.391384201184121370, 0.391338189326558010, 0.391292176490649180, +0.391246162676509910, 0.391200147884254830, 0.391154132113999740, 0.391108115365859380, 0.391062097639948700, 0.391016078936382410, 0.390970059255276280, 0.390924038596745070, +0.390878016960903680, 0.390831994347866920, 0.390785970757750510, 0.390739946190669210, 0.390693920646738020, 0.390647894126071650, 0.390601866628785930, 0.390555838154995620, +0.390509808704815220, 0.390463778278360710, 0.390417746875746760, 0.390371714497088520, 0.390325681142500490, 0.390279646812098700, 0.390233611505997780, 0.390187575224312850, +0.390141537967158560, 0.390095499734650850, 0.390049460526904370, 0.390003420344034290, 0.389957379186155200, 0.389911337053383100, 0.389865293945832640, 0.389819249863618930, +0.389773204806856680, 0.389727158775661890, 0.389681111770149140, 0.389635063790433220, 0.389589014836630050, 0.389542964908854370, 0.389496914007221250, 0.389450862131845430, +0.389404809282842880, 0.389358755460328330, 0.389312700664416870, 0.389266644895223220, 0.389220588152863370, 0.389174530437452090, 0.389128471749104480, 0.389082412087935260, +0.389036351454060400, 0.388990289847594710, 0.388944227268653300, 0.388898163717350860, 0.388852099193803420, 0.388806033698125770, 0.388759967230433050, 0.388713899790839980, +0.388667831379462540, 0.388621761996415570, 0.388575691641813770, 0.388529620315773150, 0.388483548018408450, 0.388437474749834920, 0.388391400510167240, 0.388345325299521540, +0.388299249118012500, 0.388253171965755320, 0.388207093842864780, 0.388161014749456970, 0.388114934685646620, 0.388068853651548920, 0.388022771647278660, 0.387976688672951870, +0.387930604728683400, 0.387884519814588380, 0.387838433930781660, 0.387792347077379310, 0.387746259254496020, 0.387700170462246750, 0.387654080700747420, 0.387607989970112870, +0.387561898270458390, 0.387515805601898690, 0.387469711964549930, 0.387423617358526930, 0.387377521783944800, 0.387331425240918510, 0.387285327729564090, 0.387239229249996320, +0.387193129802330450, 0.387147029386681380, 0.387100928003165150, 0.387054825651896580, 0.387008722332990940, 0.386962618046563070, 0.386916512792729090, 0.386870406571603880, +0.386824299383302150, 0.386778191227940160, 0.386732082105632650, 0.386685972016494960, 0.386639860960641900, 0.386593748938189600, 0.386547635949252950, 0.386501521993947220, +0.386455407072387240, 0.386409291184689140, 0.386363174330967840, 0.386317056511338630, 0.386270937725916360, 0.386224817974817110, 0.386178697258155850, 0.386132575576047850, +0.386086452928607990, 0.386040329315952390, 0.385994204738196010, 0.385948079195453710, 0.385901952687841550, 0.385855825215474570, 0.385809696778468050, 0.385763567376936840, +0.385717437010997090, 0.385671305680763800, 0.385625173386352220, 0.385579040127877300, 0.385532905905455190, 0.385486770719200840, 0.385440634569229560, 0.385394497455656240, +0.385348359378597130, 0.385302220338167080, 0.385256080334481500, 0.385209939367655350, 0.385163797437804710, 0.385117654545044600, 0.385071510689490300, 0.385025365871256910, +0.384979220090460430, 0.384933073347215940, 0.384886925641638340, 0.384840776973843890, 0.384794627343947430, 0.384748476752064420, 0.384702325198309820, 0.384656172682799840, +0.384610019205649410, 0.384563864766973910, 0.384517709366888340, 0.384471553005508950, 0.384425395682950640, 0.384379237399328830, 0.384333078154758530, 0.384286917949355930, +0.384240756783236050, 0.384194594656514290, 0.384148431569305670, 0.384102267521726330, 0.384056102513891330, 0.384009936545915640, 0.383963769617915560, 0.383917601730006000, +0.383871432882302520, 0.383825263074919990, 0.383779092307974690, 0.383732920581581700, 0.383686747895856440, 0.383640574250913860, 0.383594399646870250, 0.383548224083840650, +0.383502047561940450, 0.383455870081284790, 0.383409691641989850, 0.383363512244170650, 0.383317331887942700, 0.383271150573420980, 0.383224968300721780, 0.383178785069960230, +0.383132600881251230, 0.383086415734711190, 0.383040229630455090, 0.382994042568598430, 0.382947854549256230, 0.382901665572544850, 0.382855475638579250, 0.382809284747475000, +0.382763092899347120, 0.382716900094311920, 0.382670706332484460, 0.382624511613980260, 0.382578315938914340, 0.382532119307403050, 0.382485921719561420, 0.382439723175505060, +0.382393523675348960, 0.382347323219209450, 0.382301121807201600, 0.382254919439441010, 0.382208716116042620, 0.382162511837122960, 0.382116306602796940, 0.382070100413179790, +0.382023893268387760, 0.381977685168536030, 0.381931476113740060, 0.381885266104115050, 0.381839055139777230, 0.381792843220841780, 0.381746630347424230, 0.381700416519639710, +0.381654201737604500, 0.381607986001433860, 0.381561769311243190, 0.381515551667147730, 0.381469333069263780, 0.381423113517706520, 0.381376893012591480, 0.381330671554033770, +0.381284449142149760, 0.381238225777054680, 0.381192001458863620, 0.381145776187692960, 0.381099549963657860, 0.381053322786873870, 0.381007094657456190, 0.380960865575521170, +0.380914635541183990, 0.380868404554560220, 0.380822172615765060, 0.380775939724914860, 0.380729705882124790, 0.380683471087510440, 0.380637235341187040, 0.380590998643270950, +0.380544760993877350, 0.380498522393121870, 0.380452282841119650, 0.380406042337987140, 0.380359800883839530, 0.380313558478792000, 0.380267315122961020, 0.380221070816461730, +0.380174825559409730, 0.380128579351920290, 0.380082332194109810, 0.380036084086093520, 0.379989835027987000, 0.379943585019905490, 0.379897334061965410, 0.379851082154281980, +0.379804829296970900, 0.379758575490147300, 0.379712320733927690, 0.379666065028427260, 0.379619808373761640, 0.379573550770046120, 0.379527292217397120, 0.379481032715929920, +0.379434772265759720, 0.379388510867002980, 0.379342248519774990, 0.379295985224191330, 0.379249720980367360, 0.379203455788419460, 0.379157189648462960, 0.379110922560613410, +0.379064654524986220, 0.379018385541697760, 0.378972115610863360, 0.378925844732598660, 0.378879572907018960, 0.378833300134240710, 0.378787026414379220, 0.378740751747550120, +0.378694476133868810, 0.378648199573451640, 0.378601922066414020, 0.378555643612871580, 0.378509364212939680, 0.378463083866734720, 0.378416802574372050, 0.378370520335966960, +0.378324237151635990, 0.378277953021494420, 0.378231667945657990, 0.378185381924241950, 0.378139094957362920, 0.378092807045136090, 0.378046518187677260, 0.378000228385101720, +0.377953937637526050, 0.377907645945065540, 0.377861353307835880, 0.377815059725952420, 0.377768765199531790, 0.377722469728689170, 0.377676173313540420, 0.377629875954200780, +0.377583577650786930, 0.377537278403414060, 0.377490978212197630, 0.377444677077254150, 0.377398374998698990, 0.377352071976647880, 0.377305768011216180, 0.377259463102520510, +0.377213157250676170, 0.377166850455798900, 0.377120542718004100, 0.377074234037408360, 0.377027924414127020, 0.376981613848275890, 0.376935302339970360, 0.376888989889326900, +0.376842676496461030, 0.376796362161488430, 0.376750046884524510, 0.376703730665685910, 0.376657413505087970, 0.376611095402846100, 0.376564776359076920, 0.376518456373895750, +0.376472135447418480, 0.376425813579760400, 0.376379490771038270, 0.376333167021367380, 0.376286842330863570, 0.376240516699642260, 0.376194190127820070, 0.376147862615512360, +0.376101534162835040, 0.376055204769903450, 0.376008874436834280, 0.375962543163742890, 0.375916210950745180, 0.375869877797956550, 0.375823543705493590, 0.375777208673471750, +0.375730872702006950, 0.375684535791214520, 0.375638197941211170, 0.375591859152112350, 0.375545519424033410, 0.375499178757091160, 0.375452837151400930, 0.375406494607078590, +0.375360151124239590, 0.375313806703000690, 0.375267461343477220, 0.375221115045785090, 0.375174767810039780, 0.375128419636357960, 0.375082070524855090, 0.375035720475647090, +0.374989369488849310, 0.374943017564578540, 0.374896664702950240, 0.374850310904080270, 0.374803956168084100, 0.374757600495078450, 0.374711243885178850, 0.374664886338500650, +0.374618527855160700, 0.374572168435274410, 0.374525808078957690, 0.374479446786326050, 0.374433084557496240, 0.374386721392583670, 0.374340357291704340, 0.374293992254973670, +0.374247626282508410, 0.374201259374424110, 0.374154891530836700, 0.374108522751861570, 0.374062153037615640, 0.374015782388214260, 0.373969410803773440, 0.373923038284408700, +0.373876664830236740, 0.373830290441373110, 0.373783915117933410, 0.373737538860034300, 0.373691161667791320, 0.373644783541320470, 0.373598404480737220, 0.373552024486158370, +0.373505643557699500, 0.373459261695476500, 0.373412878899604890, 0.373366495170201540, 0.373320110507381950, 0.373273724911262090, 0.373227338381957490, 0.373180950919584980, +0.373134562524260030, 0.373088173196098720, 0.373041782935216560, 0.372995391741730350, 0.372948999615755670, 0.372902606557408090, 0.372856212566804400, 0.372809817644060180, +0.372763421789291390, 0.372717025002613670, 0.372670627284143800, 0.372624228633997360, 0.372577829052290310, 0.372531428539138290, 0.372485027094658140, 0.372438624718965380, +0.372392221412176090, 0.372345817174405850, 0.372299412005771440, 0.372253005906388490, 0.372206598876373080, 0.372160190915840680, 0.372113782024908300, 0.372067372203691400, +0.372020961452306120, 0.371974549770868020, 0.371928137159493910, 0.371881723618299520, 0.371835309147400370, 0.371788893746913370, 0.371742477416954150, 0.371696060157638730, +0.371649641969082730, 0.371603222851403010, 0.371556802804715260, 0.371510381829135540, 0.371463959924779430, 0.371417537091763840, 0.371371113330204390, 0.371324688640217170, +0.371278263021917800, 0.371231836475423180, 0.371185409000849010, 0.371138980598311240, 0.371092551267925670, 0.371046121009809160, 0.370999689824077270, 0.370953257710845810, +0.370906824670231560, 0.370860390702350270, 0.370813955807318020, 0.370767519985250480, 0.370721083236264510, 0.370674645560475860, 0.370628206958000580, 0.370581767428954430, +0.370535326973454200, 0.370488885591615690, 0.370442443283554970, 0.370396000049387720, 0.370349555889230850, 0.370303110803200110, 0.370256664791411620, 0.370210217853981010, +0.370163769991025290, 0.370117321202660170, 0.370070871489001310, 0.370024420850165680, 0.369977969286269030, 0.369931516797427420, 0.369885063383756650, 0.369838609045373580, +0.369792153782394000, 0.369745697594934030, 0.369699240483109430, 0.369652782447037140, 0.369606323486832920, 0.369559863602612840, 0.369513402794492680, 0.369466941062589480, +0.369420478407018920, 0.369374014827897110, 0.369327550325339870, 0.369281084899464210, 0.369234618550385810, 0.369188151278220860, 0.369141683083085090, 0.369095213965095590, +0.369048743924368040, 0.369002272961018170, 0.368955801075163070, 0.368909328266918470, 0.368862854536400550, 0.368816379883725070, 0.368769904309009020, 0.368723427812368220, +0.368676950393918900, 0.368630472053776750, 0.368583992792058830, 0.368537512608880960, 0.368491031504359300, 0.368444549478609660, 0.368398066531749060, 0.368351582663893230, +0.368305097875158530, 0.368258612165660580, 0.368212125535516580, 0.368165637984842250, 0.368119149513753410, 0.368072660122367110, 0.368026169810799160, 0.367979678579165800, +0.367933186427582830, 0.367886693356167300, 0.367840199365035040, 0.367793704454302260, 0.367747208624084830, 0.367700711874499760, 0.367654214205662970, 0.367607715617690570, +0.367561216110698530, 0.367514715684803820, 0.367468214340122330, 0.367421712076770320, 0.367375208894863640, 0.367328704794519290, 0.367282199775853190, 0.367235693838981250, +0.367189186984020420, 0.367142679211086620, 0.367096170520296140, 0.367049660911764830, 0.367003150385609770, 0.366956638941946860, 0.366910126580892280, 0.366863613302562060, +0.366817099107073160, 0.366770583994541540, 0.366724067965083440, 0.366677551018814770, 0.366631033155852660, 0.366584514376312950, 0.366537994680311950, 0.366491474067965510, +0.366444952539390860, 0.366398430094703800, 0.366351906734020240, 0.366305382457457360, 0.366258857265131020, 0.366212331157157510, 0.366165804133652790, 0.366119276194733940, +0.366072747340516920, 0.366026217571118030, 0.365979686886653170, 0.365933155287239520, 0.365886622772993000, 0.365840089344029900, 0.365793555000466180, 0.365747019742418970, +0.365700483570004180, 0.365653946483338210, 0.365607408482536980, 0.365560869567717610, 0.365514329738996110, 0.365467788996488740, 0.365421247340311510, 0.365374704770581590, +0.365328161287414850, 0.365281616890927360, 0.365235071581236190, 0.365188525358457360, 0.365141978222707220, 0.365095430174101730, 0.365048881212758080, 0.365002331338792230, +0.364955780552320530, 0.364909228853458940, 0.364862676242324770, 0.364816122719033850, 0.364769568283702610, 0.364723012936447100, 0.364676456677384410, 0.364629899506630610, +0.364583341424302040, 0.364536782430514740, 0.364490222525385880, 0.364443661709031470, 0.364397099981567440, 0.364350537343111120, 0.364303973793778490, 0.364257409333685890, +0.364210843962949340, 0.364164277681686080, 0.364117710490012180, 0.364071142388043940, 0.364024573375897500, 0.363978003453690020, 0.363931432621537490, 0.363884860879556400, +0.363838288227862790, 0.363791714666573780, 0.363745140195805560, 0.363698564815674470, 0.363651988526296540, 0.363605411327789060, 0.363558833220268110, 0.363512254203849580, +0.363465674278650840, 0.363419093444787960, 0.363372511702377330, 0.363325929051534990, 0.363279345492378230, 0.363232761025023110, 0.363186175649586110, 0.363139589366183290, +0.363093002174931840, 0.363046414075947900, 0.362999825069347970, 0.362953235155248020, 0.362906644333765400, 0.362860052605016190, 0.362813459969116850, 0.362766866426183440, +0.362720271976333270, 0.362673676619682420, 0.362627080356347390, 0.362580483186444200, 0.362533885110090270, 0.362487286127401610, 0.362440686238494290, 0.362394085443485730, +0.362347483742491930, 0.362300881135629420, 0.362254277623014260, 0.362207673204763880, 0.362161067880994280, 0.362114461651822040, 0.362067854517363170, 0.362021246477735150, +0.361974637533053980, 0.361928027683436180, 0.361881416928997950, 0.361834805269856560, 0.361788192706128220, 0.361741579237929320, 0.361694964865376110, 0.361648349588585880, +0.361601733407674760, 0.361555116322758940, 0.361508498333955710, 0.361461879441381250, 0.361415259645152090, 0.361368638945384350, 0.361322017342195430, 0.361275394835701480, +0.361228771426019000, 0.361182147113264240, 0.361135521897554490, 0.361088895779005940, 0.361042268757735150, 0.360995640833858270, 0.360949012007492740, 0.360902382278754650, +0.360855751647760570, 0.360809120114626740, 0.360762487679470560, 0.360715854342408100, 0.360669220103555620, 0.360622584963030460, 0.360575948920948850, 0.360529311977427440, +0.360482674132582280, 0.360436035386530850, 0.360389395739389330, 0.360342755191274290, 0.360296113742302030, 0.360249471392589840, 0.360202828142253960, 0.360156183991411030, +0.360109538940177280, 0.360062892988670000, 0.360016246137005560, 0.359969598385300460, 0.359922949733671000, 0.359876300182234540, 0.359829649731107310, 0.359782998380405620, +0.359736346130246800, 0.359689692980747100, 0.359643038932023210, 0.359596383984191250, 0.359549728137368800, 0.359503071391671980, 0.359456413747217540, 0.359409755204121610, +0.359363095762501690, 0.359316435422474050, 0.359269774184155340, 0.359223112047661770, 0.359176449013110850, 0.359129785080618770, 0.359083120250302260, 0.359036454522277500, +0.358989787896662080, 0.358943120373572120, 0.358896451953124420, 0.358849782635435150, 0.358803112420621790, 0.358756441308800740, 0.358709769300088130, 0.358663096394601480, +0.358616422592457130, 0.358569747893771720, 0.358523072298661480, 0.358476395807244050, 0.358429718419635560, 0.358383040135952850, 0.358336360956312050, 0.358289680880830800, +0.358242999909625330, 0.358196318042812380, 0.358149635280508190, 0.358102951622830350, 0.358056267069895130, 0.358009581621819280, 0.357962895278719000, 0.357916208040711950, +0.357869519907914320, 0.357822830880442530, 0.357776140958414040, 0.357729450141945240, 0.357682758431152770, 0.357636065826152980, 0.357589372327063500, 0.357542677934000520, +0.357495982647080880, 0.357449286466420880, 0.357402589392138090, 0.357355891424348810, 0.357309192563169790, 0.357262492808717360, 0.357215792161109160, 0.357169090620461430, +0.357122388186891020, 0.357075684860514220, 0.357028980641448560, 0.356982275529810540, 0.356935569525716370, 0.356888862629283650, 0.356842154840628810, 0.356795446159868630, +0.356748736587119360, 0.356702026122498680, 0.356655314766122940, 0.356608602518108890, 0.356561889378572970, 0.356515175347632720, 0.356468460425404480, 0.356421744612005150, +0.356375027907551050, 0.356328310312159720, 0.356281591825947710, 0.356234872449031680, 0.356188152181528050, 0.356141431023554440, 0.356094708975227270, 0.356047986036663320, +0.356001262207979010, 0.355954537489291960, 0.355907811880718520, 0.355861085382375150, 0.355814357994379490, 0.355767629716847940, 0.355720900549897360, 0.355674170493644080, +0.355627439548205750, 0.355580707713698870, 0.355533974990240200, 0.355487241377946180, 0.355440506876934460, 0.355393771487321490, 0.355347035209224120, 0.355300298042758700, +0.355253559988042980, 0.355206821045193350, 0.355160081214326630, 0.355113340495559320, 0.355066598889009100, 0.355019856394792390, 0.354973113013025590, 0.354926368743826440, +0.354879623587311340, 0.354832877543597160, 0.354786130612800450, 0.354739382795038750, 0.354692634090428670, 0.354645884499086960, 0.354599134021130140, 0.354552382656675880, +0.354505630405840650, 0.354458877268741370, 0.354412123245494480, 0.354365368336217730, 0.354318612541027530, 0.354271855860040790, 0.354225098293374010, 0.354178339841144880, +0.354131580503469930, 0.354084820280465560, 0.354038059172249620, 0.353991297178938460, 0.353944534300649150, 0.353897770537497990, 0.353851005889602890, 0.353804240357080250, +0.353757473940047030, 0.353710706638619700, 0.353663938452915990, 0.353617169383052430, 0.353570399429145980, 0.353523628591313140, 0.353476856869671620, 0.353430084264337920, +0.353383310775429060, 0.353336536403061510, 0.353289761147353000, 0.353242985008420110, 0.353196207986379300, 0.353149430081348410, 0.353102651293443980, 0.353055871622782900, +0.353009091069481700, 0.352962309633658210, 0.352915527315428970, 0.352868744114910870, 0.352821960032220490, 0.352775175067475630, 0.352728389220792860, 0.352681602492289140, +0.352634814882080930, 0.352588026390286140, 0.352541237017021280, 0.352494446762403320, 0.352447655626548840, 0.352400863609575620, 0.352354070711600240, 0.352307276932739720, +0.352260482273110580, 0.352213686732830600, 0.352166890312016480, 0.352120093010784670, 0.352073294829253040, 0.352026495767538190, 0.351979695825757110, 0.351932895004026360, +0.351886093302463790, 0.351839290721185970, 0.351792487260309930, 0.351745682919952280, 0.351698877700230840, 0.351652071601262160, 0.351605264623163330, 0.351558456766050910, +0.351511648030042810, 0.351464838415255550, 0.351418027921806210, 0.351371216549811350, 0.351324404299388880, 0.351277591170655430, 0.351230777163727580, 0.351183962278723170, +0.351137146515758890, 0.351090329874951760, 0.351043512356418340, 0.350996693960276550, 0.350949874686643070, 0.350903054535634860, 0.350856233507368610, 0.350809411601962220, +0.350762588819532320, 0.350715765160195870, 0.350668940624069670, 0.350622115211271460, 0.350575288921918030, 0.350528461756126340, 0.350481633714013090, 0.350434804795696160, +0.350387975001292210, 0.350341144330917950, 0.350294312784691200, 0.350247480362728680, 0.350200647065147470, 0.350153812892064260, 0.350106977843596900, 0.350060141919862070, +0.350013305120976890, 0.349966467447058060, 0.349919628898223480, 0.349872789474589830, 0.349825949176274190, 0.349779108003393240, 0.349732265956064990, 0.349685423034406030, +0.349638579238533530, 0.349591734568564180, 0.349544889024615890, 0.349498042606805340, 0.349451195315249760, 0.349404347150065740, 0.349357498111371230, 0.349310648199283040, +0.349263797413917780, 0.349216945755393470, 0.349170093223826750, 0.349123239819334850, 0.349076385542034410, 0.349029530392043430, 0.348982674369478610, 0.348935817474457070, +0.348888959707095600, 0.348842101067512180, 0.348795241555823480, 0.348748381172146680, 0.348701519916598530, 0.348654657789296940, 0.348607794790358750, 0.348560930919901090, +0.348514066178040650, 0.348467200564895500, 0.348420334080582320, 0.348373466725217850, 0.348326598498920170, 0.348279729401806020, 0.348232859433992510, 0.348185988595596460, +0.348139116886735820, 0.348092244307527440, 0.348045370858088400, 0.347998496538535540, 0.347951621348986880, 0.347904745289559110, 0.347857868360369530, 0.347810990561534810, +0.347764111893173080, 0.347717232355401030, 0.347670351948335900, 0.347623470672094540, 0.347576588526794850, 0.347529705512553690, 0.347482821629487900, 0.347435936877715460, +0.347389051257353140, 0.347342164768518200, 0.347295277411327430, 0.347248389185898900, 0.347201500092349400, 0.347154610130796130, 0.347107719301355980, 0.347060827604146860, +0.347013935039285740, 0.346967041606889740, 0.346920147307075770, 0.346873252139961790, 0.346826356105664700, 0.346779459204301700, 0.346732561435989680, 0.346685662800846670, +0.346638763298989460, 0.346591862930534960, 0.346544961695601230, 0.346498059594305070, 0.346451156626763730, 0.346404252793094170, 0.346357348093414340, 0.346310442527841100, +0.346263536096491800, 0.346216628799483280, 0.346169720636933520, 0.346122811608959520, 0.346075901715678480, 0.346028990957207290, 0.345982079333663980, 0.345935166845165510, +0.345888253491829110, 0.345841339273771700, 0.345794424191111340, 0.345747508243964890, 0.345700591432449690, 0.345653673756682600, 0.345606755216781750, 0.345559835812863980, +0.345512915545046210, 0.345465994413446550, 0.345419072418181980, 0.345372149559369680, 0.345325225837126550, 0.345278301251570830, 0.345231375802819370, 0.345184449490989420, +0.345137522316197930, 0.345090594278563090, 0.345043665378201750, 0.344996735615231250, 0.344949804989768460, 0.344902873501931610, 0.344855941151837600, 0.344809007939603670, +0.344762073865346850, 0.344715138929185260, 0.344668203131235810, 0.344621266471615450, 0.344574328950442320, 0.344527390567833380, 0.344480451323905980, 0.344433511218777020, +0.344386570252564690, 0.344339628425385960, 0.344292685737358110, 0.344245742188598160, 0.344198797779224300, 0.344151852509353370, 0.344104906379102900, 0.344057959388589680, +0.344011011537932010, 0.343964062827246790, 0.343917113256651420, 0.343870162826262870, 0.343823211536199320, 0.343776259386577740, 0.343729306377515090, 0.343682352509129600, +0.343635397781538230, 0.343588442194858350, 0.343541485749206950, 0.343494528444702240, 0.343447570281461220, 0.343400611259601310, 0.343353651379239400, 0.343306690640493850, +0.343259729043481510, 0.343212766588319840, 0.343165803275125860, 0.343118839104017800, 0.343071874075112640, 0.343024908188527820, 0.342977941444380260, 0.342930973842788310, +0.342884005383868870, 0.342837036067739460, 0.342790065894517050, 0.342743094864319860, 0.342696122977264930, 0.342649150233469310, 0.342602176633051200, 0.342555202176127670, +0.342508226862816120, 0.342461250693233630, 0.342414273667498380, 0.342367295785727440, 0.342320317048038280, 0.342273337454547910, 0.342226357005374630, 0.342179375700635450, +0.342132393540447830, 0.342085410524928800, 0.342038426654196650, 0.341991441928368440, 0.341944456347561650, 0.341897469911893290, 0.341850482621481650, 0.341803494476443810, +0.341756505476896840, 0.341709515622959040, 0.341662524914747410, 0.341615533352379490, 0.341568540935972280, 0.341521547665644190, 0.341474553541512180, 0.341427558563693830, +0.341380562732306160, 0.341333566047467450, 0.341286568509294900, 0.341239570117905900, 0.341192570873417530, 0.341145570775948200, 0.341098569825614870, 0.341051568022535170, +0.341004565366826160, 0.340957561858606100, 0.340910557497992150, 0.340863552285101400, 0.340816546220052140, 0.340769539302961550, 0.340722531533947160, 0.340675522913125970, +0.340628513440616400, 0.340581503116535570, 0.340534491941000940, 0.340487479914129700, 0.340440467036040140, 0.340393453306849450, 0.340346438726675080, 0.340299423295634230, +0.340252407013845240, 0.340205389881425240, 0.340158371898491740, 0.340111353065161880, 0.340064333381554120, 0.340017312847785470, 0.339970291463973120, 0.339923269230235470, +0.339876246146689650, 0.339829222213453240, 0.339782197430643310, 0.339735171798378370, 0.339688145316775440, 0.339641117985952150, 0.339594089806025680, 0.339547060777114380, +0.339500030899335450, 0.339453000172806440, 0.339405968597644490, 0.339358936173968060, 0.339311902901894280, 0.339264868781540720, 0.339217833813024620, 0.339170797996464320, +0.339123761331977020, 0.339076723819680290, 0.339029685459691420, 0.338982646252128710, 0.338935606197109330, 0.338888565294750590, 0.338841523545170830, 0.338794480948487240, +0.338747437504817510, 0.338700393214278690, 0.338653348076989320, 0.338606302093066640, 0.338559255262628140, 0.338512207585791150, 0.338465159062673990, 0.338418109693393980, +0.338371059478068670, 0.338324008416815310, 0.338276956509752310, 0.338229903756996960, 0.338182850158666840, 0.338135795714879170, 0.338088740425752430, 0.338041684291403850, +0.337994627311950680, 0.337947569487511310, 0.337900510818202990, 0.337853451304143460, 0.337806390945449840, 0.337759329742240650, 0.337712267694633140, 0.337665204802744980, +0.337618141066693410, 0.337571076486596900, 0.337524011062572680, 0.337476944794738390, 0.337429877683211370, 0.337382809728110080, 0.337335740929551760, 0.337288671287654050, +0.337241600802534290, 0.337194529474310940, 0.337147457303101250, 0.337100384289022500, 0.337053310432193220, 0.337006235732730700, 0.336959160190752500, 0.336912083806376050, +0.336865006579719790, 0.336817928510901030, 0.336770849600037450, 0.336723769847246280, 0.336676689252646160, 0.336629607816354260, 0.336582525538488390, 0.336535442419165780, +0.336488358458504940, 0.336441273656623240, 0.336394188013638350, 0.336347101529667570, 0.336300014204829470, 0.336252926039241340, 0.336205837033020870, 0.336158747186285410, +0.336111656499153480, 0.336064564971742420, 0.336017472604169530, 0.335970379396553390, 0.335923285349011280, 0.335876190461660950, 0.335829094734619750, 0.335781998168006190, +0.335734900761937680, 0.335687802516531910, 0.335640703431906220, 0.335593603508179130, 0.335546502745468100, 0.335499401143890820, 0.335452298703564580, 0.335405195424608000, +0.335358091307138450, 0.335310986351273710, 0.335263880557131020, 0.335216773924829070, 0.335169666454485200, 0.335122558146216780, 0.335075449000142300, 0.335028339016379240, +0.334981228195045390, 0.334934116536257990, 0.334887004040135720, 0.334839890706795930, 0.334792776536356420, 0.334745661528934530, 0.334698545684648960, 0.334651429003617000, +0.334604311485956480, 0.334557193131784720, 0.334510073941220450, 0.334462953914380970, 0.334415833051384110, 0.334368711352347250, 0.334321588817388990, 0.334274465446626810, +0.334227341240178000, 0.334180216198161300, 0.334133090320694050, 0.334085963607894050, 0.334038836059878770, 0.333991707676766780, 0.333944578458675530, 0.333897448405722830, +0.333850317518026130, 0.333803185795704000, 0.333756053238873920, 0.333708919847653720, 0.333661785622160810, 0.333614650562513830, 0.333567514668830220, 0.333520377941227850, +0.333473240379824120, 0.333426101984737710, 0.333378962756086030, 0.333331822693986920, 0.333284681798557860, 0.333237540069917510, 0.333190397508183300, 0.333143254113472680, +0.333096109885904380, 0.333048964825595760, 0.333001818932664730, 0.332954672207228800, 0.332907524649406540, 0.332860376259315470, 0.332813227037073500, 0.332766076982798030, +0.332718926096607750, 0.332671774378620170, 0.332624621828953190, 0.332577468447724180, 0.332530314235051970, 0.332483159191053980, 0.332436003315848050, 0.332388846609551700, +0.332341689072283670, 0.332294530704161430, 0.332247371505302420, 0.332200211475825400, 0.332153050615847820, 0.332105888925487650, 0.332058726404862340, 0.332011563054090630, +0.331964398873290050, 0.331917233862578430, 0.331870068022073310, 0.331822901351893460, 0.331775733852156310, 0.331728565522979860, 0.331681396364481570, 0.331634226376780250, +0.331587055559993290, 0.331539883914238720, 0.331492711439634050, 0.331445538136298010, 0.331398364004348080, 0.331351189043901870, 0.331304013255078080, 0.331256836637994270, +0.331209659192768400, 0.331162480919517890, 0.331115301818361680, 0.331068121889417140, 0.331020941132802340, 0.330973759548634730, 0.330926577137033220, 0.330879393898115160, +0.330832209831998680, 0.330785024938801240, 0.330737839218641690, 0.330690652671637500, 0.330643465297906720, 0.330596277097566840, 0.330549088070736630, 0.330501898217533780, +0.330454707538075710, 0.330407516032481310, 0.330360323700868150, 0.330313130543354150, 0.330265936560056930, 0.330218741751095220, 0.330171546116586720, 0.330124349656649330, +0.330077152371400670, 0.330029954260959550, 0.329982755325443520, 0.329935555564970620, 0.329888354979658400, 0.329841153569625680, 0.329793951334990120, 0.329746748275869690, +0.329699544392381970, 0.329652339684645750, 0.329605134152778760, 0.329557927796898850, 0.329510720617123780, 0.329463512613572260, 0.329416303786362000, 0.329369094135610550, +0.329321883661436830, 0.329274672363958350, 0.329227460243293190, 0.329180247299558970, 0.329133033532874540, 0.329085818943357530, 0.329038603531126020, 0.328991387296297510, +0.328944170238991030, 0.328896952359324040, 0.328849733657414710, 0.328802514133380630, 0.328755293787340700, 0.328708072619412480, 0.328660850629714120, 0.328613627818363230, +0.328566404185478670, 0.328519179731178060, 0.328471954455579140, 0.328424728358800710, 0.328377501440960510, 0.328330273702176540, 0.328283045142566450, 0.328235815762249140, +0.328188585561342340, 0.328141354539964070, 0.328094122698231960, 0.328046890036264970, 0.327999656554180790, 0.327952422252097480, 0.327905187130132610, 0.327857951188405270, +0.327810714427033020, 0.327763476846133990, 0.327716238445825870, 0.327668999226227550, 0.327621759187456730, 0.327574518329631080, 0.327527276652869630, 0.327480034157289880, +0.327432790843010140, 0.327385546710147970, 0.327338301758822340, 0.327291055989150930, 0.327243809401251920, 0.327196561995242940, 0.327149313771243010, 0.327102064729369760, +0.327054814869741360, 0.327007564192475510, 0.326960312697691160, 0.326913060385506050, 0.326865807256038250, 0.326818553309405570, 0.326771298545726900, 0.326724042965119980, +0.326676786567702940, 0.326629529353593520, 0.326582271322910680, 0.326535012475772210, 0.326487752812295750, 0.326440492332600360, 0.326393231036803730, 0.326345968925023990, +0.326298705997378920, 0.326251442253987500, 0.326204177694967510, 0.326156912320437090, 0.326109646130513910, 0.326062379125317050, 0.326015111304964240, 0.325967842669573680, +0.325920573219263100, 0.325873302954151460, 0.325826031874356600, 0.325778759979996610, 0.325731487271189390, 0.325684213748053790, 0.325636939410707700, 0.325589664259268830, +0.325542388293856230, 0.325495111514587600, 0.325447833921581280, 0.325400555514954890, 0.325353276294827580, 0.325305996261317010, 0.325258715414541540, 0.325211433754618810, +0.325164151281667920, 0.325116867995806640, 0.325069583897153180, 0.325022298985825410, 0.324975013261942220, 0.324927726725621590, 0.324880439376981580, 0.324833151216140040, +0.324785862243216090, 0.324738572458327490, 0.324691281861592020, 0.324643990453128750, 0.324596698233055480, 0.324549405201490500, 0.324502111358551610, 0.324454816704357830, +0.324407521239027000, 0.324360224962677410, 0.324312927875426820, 0.324265629977394280, 0.324218331268697700, 0.324171031749455330, 0.324123731419784900, 0.324076430279805590, +0.324029128329635210, 0.323981825569392030, 0.323934521999193810, 0.323887217619159780, 0.323839912429407630, 0.323792606430055310, 0.323745299621221890, 0.323697992003025240, +0.323650683575583580, 0.323603374339014820, 0.323556064293438030, 0.323508753438971060, 0.323461441775732270, 0.323414129303839390, 0.323366816023411660, 0.323319501934566820, +0.323272187037423280, 0.323224871332098870, 0.323177554818712630, 0.323130237497382570, 0.323082919368226860, 0.323035600431363480, 0.322988280686911490, 0.322940960134988850, +0.322893638775713750, 0.322846316609204150, 0.322798993635579180, 0.322751669854956740, 0.322704345267454670, 0.322657019873192170, 0.322609693672287150, 0.322562366664857880, +0.322515038851022280, 0.322467710230899480, 0.322420380804607390, 0.322373050572264400, 0.322325719533988360, 0.322278387689898420, 0.322231055040112510, 0.322183721584748950, +0.322136387323925690, 0.322089052257761850, 0.322041716386375410, 0.321994379709884650, 0.321947042228407590, 0.321899703942063240, 0.321852364850969740, 0.321805024955244820, +0.321757684255007780, 0.321710342750376580, 0.321663000441469450, 0.321615657328404470, 0.321568313411300710, 0.321520968690276190, 0.321473623165449250, 0.321426276836937810, +0.321378929704861150, 0.321331581769337130, 0.321284233030484150, 0.321236883488420170, 0.321189533143264430, 0.321142181995134830, 0.321094830044149740, 0.321047477290427210, +0.321000123734086370, 0.320952769375245250, 0.320905414214021800, 0.320858058250535210, 0.320810701484903480, 0.320763343917244980, 0.320715985547677720, 0.320668626376320930, +0.320621266403292530, 0.320573905628711020, 0.320526544052694260, 0.320479181675361600, 0.320431818496831000, 0.320384454517220860, 0.320337089736649090, 0.320289724155235100, +0.320242357773096790, 0.320194990590352560, 0.320147622607120430, 0.320100253823519640, 0.320052884239668270, 0.320005513855684650, 0.319958142671686820, 0.319910770687794110, +0.319863397904124440, 0.319816024320795810, 0.319768649937927580, 0.319721274755637720, 0.319673898774044730, 0.319626521993266470, 0.319579144413422390, 0.319531766034630460, +0.319484386857009080, 0.319437006880676330, 0.319389626105751500, 0.319342244532352550, 0.319294862160598050, 0.319247478990605900, 0.319200095022495520, 0.319152710256384920, +0.319105324692392560, 0.319057938330636390, 0.319010551171235830, 0.318963163214308950, 0.318915774459973660, 0.318868384908349400, 0.318820994559554150, 0.318773603413706470, +0.318726211470924280, 0.318678818731327030, 0.318631425195032740, 0.318584030862159860, 0.318536635732826480, 0.318489239807151990, 0.318441843085254360, 0.318394445567252100, +0.318347047253263350, 0.318299648143407330, 0.318252248237802240, 0.318204847536566530, 0.318157446039818330, 0.318110043747676870, 0.318062640660260300, 0.318015236777686730, +0.317967832100075450, 0.317920426627544660, 0.317873020360212750, 0.317825613298197860, 0.317778205441619390, 0.317730796790595400, 0.317683387345244430, 0.317635977105684530, +0.317588566072035170, 0.317541154244414370, 0.317493741622940640, 0.317446328207732160, 0.317398913998908290, 0.317351498996587160, 0.317304083200887270, 0.317256666611926750, +0.317209249229824960, 0.317161831054700080, 0.317114412086670180, 0.317066992325854670, 0.317019571772371670, 0.316972150426339750, 0.316924728287877040, 0.316877305357102900, +0.316829881634135560, 0.316782457119093470, 0.316735031812094840, 0.316687605713259050, 0.316640178822704230, 0.316592751140548970, 0.316545322666911380, 0.316497893401910920, +0.316450463345665730, 0.316403032498294430, 0.316355600859915100, 0.316308168430647190, 0.316260735210608820, 0.316213301199918640, 0.316165866398694760, 0.316118430807056710, +0.316070994425122490, 0.316023557253010400, 0.315976119290839850, 0.315928680538729020, 0.315881240996796490, 0.315833800665160370, 0.315786359543940240, 0.315738917633254180, +0.315691474933220810, 0.315644031443958360, 0.315596587165586250, 0.315549142098222660, 0.315501696241986210, 0.315454249596995140, 0.315406802163368800, 0.315359353941225500, +0.315311904930683840, 0.315264455131861960, 0.315217004544879330, 0.315169553169854230, 0.315122101006904850, 0.315074648056150600, 0.315027194317709760, 0.314979739791700910, +0.314932284478242290, 0.314884828377453410, 0.314837371489452400, 0.314789913814358000, 0.314742455352288400, 0.314694996103363040, 0.314647536067700240, 0.314600075245418610, +0.314552613636636340, 0.314505151241472940, 0.314457688060046700, 0.314410224092476210, 0.314362759338879750, 0.314315293799376840, 0.314267827474085660, 0.314220360363124510, +0.314172892466612840, 0.314125423784669010, 0.314077954317411530, 0.314030484064958810, 0.313983013027430310, 0.313935541204944210, 0.313888068597619310, 0.313840595205573840, +0.313793121028927260, 0.313745646067797870, 0.313698170322304400, 0.313650693792565050, 0.313603216478699430, 0.313555738380825730, 0.313508259499062690, 0.313460779833528600, +0.313413299384342980, 0.313365818151624060, 0.313318336135490650, 0.313270853336060970, 0.313223369753454550, 0.313175885387789730, 0.313128400239184810, 0.313080914307759250, +0.313033427593631450, 0.312985940096920050, 0.312938451817743380, 0.312890962756221020, 0.312843472912471220, 0.312795982286612760, 0.312748490878763940, 0.312700998689044330, +0.312653505717572170, 0.312606011964466250, 0.312558517429844920, 0.312511022113827700, 0.312463526016532930, 0.312416029138079310, 0.312368531478585230, 0.312321033038170210, +0.312273533816952660, 0.312226033815050820, 0.312178533032584300, 0.312131031469671470, 0.312083529126431060, 0.312036026002981410, 0.311988522099442110, 0.311941017415931550, +0.311893511952568370, 0.311846005709471020, 0.311798498686759130, 0.311750990884550940, 0.311703482302965240, 0.311655972942120440, 0.311608462802136170, 0.311560951883130710, +0.311513440185222870, 0.311465927708531040, 0.311418414453174750, 0.311370900419272460, 0.311323385606942500, 0.311275870016304520, 0.311228353647476810, 0.311180836500578260, +0.311133318575727180, 0.311085799873043240, 0.311038280392644750, 0.310990760134650600, 0.310943239099179150, 0.310895717286350020, 0.310848194696281550, 0.310800671329092610, +0.310753147184901600, 0.310705622263828140, 0.310658096565990580, 0.310610570091507830, 0.310563042840498180, 0.310515514813081370, 0.310467986009375810, 0.310420456429499840, +0.310372926073573140, 0.310325394941714130, 0.310277863034041590, 0.310230330350674040, 0.310182796891731060, 0.310135262657331050, 0.310087727647592960, 0.310040191862635090, +0.309992655302577140, 0.309945117967537600, 0.309897579857635220, 0.309850040972988460, 0.309802501313717060, 0.309754960879939370, 0.309707419671774340, 0.309659877689340280, +0.309612334932756970, 0.309564791402142820, 0.309517247097616690, 0.309469702019297020, 0.309422156167303510, 0.309374609541754660, 0.309327062142768780, 0.309279513970465710, +0.309231965024963860, 0.309184415306382130, 0.309136864814838870, 0.309089313550453940, 0.309041761513345670, 0.308994208703633030, 0.308946655121434430, 0.308899100766869610, +0.308851545640057010, 0.308803989741115610, 0.308756433070163760, 0.308708875627321300, 0.308661317412706640, 0.308613758426438680, 0.308566198668635880, 0.308518638139417990, +0.308471076838903570, 0.308423514767210970, 0.308375951924460050, 0.308328388310769250, 0.308280823926257440, 0.308233258771043180, 0.308185692845246220, 0.308138126148984950, +0.308090558682378450, 0.308042990445545060, 0.307995421438604640, 0.307947851661675710, 0.307900281114877110, 0.307852709798327410, 0.307805137712146290, 0.307757564856452390, +0.307709991231364550, 0.307662416837001350, 0.307614841673482520, 0.307567265740926580, 0.307519689039452040, 0.307472111569178700, 0.307424533330225070, 0.307376954322710120, +0.307329374546752350, 0.307281794002471580, 0.307234212689986350, 0.307186630609415530, 0.307139047760877750, 0.307091464144492790, 0.307043879760379110, 0.306996294608655800, +0.306948708689441300, 0.306901122002855460, 0.306853534549016820, 0.306805946328044310, 0.306758357340056520, 0.306710767585173290, 0.306663177063513090, 0.306615585775194990, +0.306567993720337490, 0.306520400899060460, 0.306472807311482350, 0.306425212957721850, 0.306377617837898740, 0.306330021952131600, 0.306282425300539400, 0.306234827883240690, +0.306187229700355330, 0.306139630752001960, 0.306092031038299460, 0.306044430559366420, 0.305996829315322790, 0.305949227306287100, 0.305901624532378290, 0.305854020993715000, +0.305806416690417140, 0.305758811622603150, 0.305711205790392180, 0.305663599193902790, 0.305615991833254770, 0.305568383708566820, 0.305520774819957490, 0.305473165167546630, +0.305425554751452830, 0.305377943571795210, 0.305330331628692280, 0.305282718922263880, 0.305235105452628770, 0.305187491219905850, 0.305139876224213790, 0.305092260465672450, +0.305044643944400510, 0.304997026660516920, 0.304949408614140330, 0.304901789805390620, 0.304854170234386490, 0.304806549901246950, 0.304758928806090570, 0.304711306949037250, +0.304663684330205740, 0.304616060949714550, 0.304568436807683640, 0.304520811904231690, 0.304473186239477670, 0.304425559813540250, 0.304377932626539340, 0.304330304678593620, +0.304282675969822170, 0.304235046500343550, 0.304187416270277790, 0.304139785279743450, 0.304092153528859650, 0.304044521017745040, 0.303996887746519560, 0.303949253715301900, +0.303901618924211080, 0.303853983373365780, 0.303806347062885900, 0.303758709992890230, 0.303711072163497300, 0.303663433574827170, 0.303615794226998410, 0.303568154120130160, +0.303520513254341150, 0.303472871629751280, 0.303425229246479190, 0.303377586104644050, 0.303329942204364490, 0.303282297545760530, 0.303234652128950840, 0.303187005954054460, +0.303139359021190210, 0.303091711330477960, 0.303044062882036450, 0.302996413675984730, 0.302948763712441560, 0.302901112991526940, 0.302853461513359570, 0.302805809278058450, +0.302758156285742490, 0.302710502536531480, 0.302662848030544220, 0.302615192767899440, 0.302567536748717110, 0.302519879973115910, 0.302472222441215080, 0.302424564153133180, +0.302376905108990350, 0.302329245308905260, 0.302281584752997050, 0.302233923441384390, 0.302186261374187410, 0.302138598551524750, 0.302090934973515630, 0.302043270640278750, +0.301995605551934050, 0.301947939708600400, 0.301900273110396910, 0.301852605757442270, 0.301804937649856550, 0.301757268787758490, 0.301709599171266830, 0.301661928800501580, +0.301614257675581530, 0.301566585796625870, 0.301518913163753290, 0.301471239777083840, 0.301423565636736280, 0.301375890742829830, 0.301328215095483240, 0.301280538694816520, +0.301232861540948470, 0.301185183633998210, 0.301137504974084650, 0.301089825561327680, 0.301042145395846170, 0.300994464477759290, 0.300946782807185840, 0.300899100384245890, +0.300851417209058110, 0.300803733281741430, 0.300756048602415840, 0.300708363171200090, 0.300660676988213470, 0.300612990053574670, 0.300565302367403860, 0.300517613929819790, +0.300469924740941700, 0.300422234800888370, 0.300374544109779870, 0.300326852667735010, 0.300279160474873020, 0.300231467531312750, 0.300183773837174150, 0.300136079392576140, +0.300088384197637950, 0.300040688252478370, 0.299992991557217540, 0.299945294111974180, 0.299897595916867600, 0.299849896972016580, 0.299802197277541260, 0.299754496833560480, +0.299706795640192980, 0.299659093697558940, 0.299611391005777160, 0.299563687564966930, 0.299515983375246990, 0.299468278436737570, 0.299420572749557470, 0.299372866313825870, +0.299325159129661730, 0.299277451197185130, 0.299229742516514850, 0.299182033087770250, 0.299134322911070170, 0.299086611986534630, 0.299038900314282650, 0.298991187894433350, +0.298943474727105700, 0.298895760812419750, 0.298848046150494430, 0.298800330741448570, 0.298752614585402250, 0.298704897682474440, 0.298657180032784410, 0.298609461636450970, +0.298561742493594300, 0.298514022604333300, 0.298466301968787210, 0.298418580587074990, 0.298370858459316710, 0.298323135585631280, 0.298275411966137990, 0.298227687600955800, +0.298179962490204790, 0.298132236634003840, 0.298084510032472330, 0.298036782685729140, 0.297989054593894410, 0.297941325757087040, 0.297893596175425880, 0.297845865849031220, +0.297798134778021860, 0.297750402962517200, 0.297702670402636090, 0.297654937098498720, 0.297607203050223980, 0.297559468257931280, 0.297511732721739470, 0.297463996441768740, +0.297416259418138040, 0.297368521650966670, 0.297320783140373580, 0.297273043886478960, 0.297225303889401770, 0.297177563149261250, 0.297129821666176460, 0.297082079440267490, +0.297034336471653340, 0.296986592760452920, 0.296938848306786460, 0.296891103110772880, 0.296843357172531520, 0.296795610492181340, 0.296747863069842580, 0.296700114905634140, +0.296652365999675430, 0.296604616352085400, 0.296556865962984200, 0.296509114832490870, 0.296461362960724780, 0.296413610347804830, 0.296365856993851260, 0.296318102898983080, +0.296270348063319590, 0.296222592486979850, 0.296174836170084050, 0.296127079112751160, 0.296079321315100560, 0.296031562777251230, 0.295983803499323460, 0.295936043481436150, +0.295888282723708320, 0.295840521226260200, 0.295792758989210760, 0.295744996012679400, 0.295697232296785180, 0.295649467841648310, 0.295601702647387720, 0.295553936714122890, +0.295506170041972830, 0.295458402631057710, 0.295410634481496630, 0.295362865593408960, 0.295315095966913690, 0.295267325602131090, 0.295219554499180190, 0.295171782658180390, +0.295124010079250760, 0.295076236762511490, 0.295028462708081640, 0.294980687916080180, 0.294932912386627440, 0.294885136119842410, 0.294837359115844580, 0.294789581374752920, +0.294741802896687670, 0.294694023681768000, 0.294646243730113220, 0.294598463041842400, 0.294550681617075870, 0.294502899455932610, 0.294455116558532130, 0.294407332924993440, +0.294359548555436780, 0.294311763449981330, 0.294263977608746400, 0.294216191031851150, 0.294168403719415830, 0.294120615671559500, 0.294072826888401250, 0.294025037370061300, +0.293977247116658790, 0.293929456128313120, 0.293881664405143410, 0.293833871947270010, 0.293786078754811890, 0.293738284827888550, 0.293690490166619080, 0.293642694771123810, +0.293594898641521830, 0.293547101777932580, 0.293499304180475150, 0.293451505849269930, 0.293403706784435890, 0.293355906986092600, 0.293308106454359120, 0.293260305189355810, +0.293212503191201730, 0.293164700460016410, 0.293116896995918860, 0.293069092799029540, 0.293021287869467460, 0.292973482207351750, 0.292925675812802770, 0.292877868685939620, +0.292830060826881730, 0.292782252235748330, 0.292734442912659710, 0.292686632857734940, 0.292638822071093650, 0.292591010552854860, 0.292543198303138910, 0.292495385322065040, +0.292447571609752650, 0.292399757166320940, 0.292351941991890300, 0.292304126086579740, 0.292256309450508900, 0.292208492083796840, 0.292160673986563980, 0.292112855158929430, +0.292065035601012320, 0.292017215312933060, 0.291969394294810720, 0.291921572546764980, 0.291873750068914810, 0.291825926861380700, 0.291778102924281800, 0.291730278257737620, +0.291682452861867340, 0.291634626736791300, 0.291586799882628760, 0.291538972299499210, 0.291491143987521790, 0.291443314946816910, 0.291395485177503800, 0.291347654679701920, +0.291299823453530500, 0.291251991499109960, 0.291204158816559420, 0.291156325405998060, 0.291108491267546340, 0.291060656401323340, 0.291012820807448720, 0.290964984486041690, +0.290917147437222520, 0.290869309661110520, 0.290821471157825310, 0.290773631927485900, 0.290725791970212870, 0.290677951286125390, 0.290630109875342990, 0.290582267737984960, +0.290534424874171580, 0.290486581284022220, 0.290438736967656370, 0.290390891925193300, 0.290343046156753380, 0.290295199662455820, 0.290247352442419890, 0.290199504496765960, +0.290151655825613310, 0.290103806429081510, 0.290055956307289750, 0.290008105460358550, 0.289960253888407070, 0.289912401591554960, 0.289864548569921440, 0.289816694823626930, +0.289768840352790710, 0.289720985157532360, 0.289673129237971170, 0.289625272594227550, 0.289577415226420780, 0.289529557134670430, 0.289481698319095810, 0.289433838779817320, +0.289385978516954250, 0.289338117530626270, 0.289290255820952520, 0.289242393388053580, 0.289194530232048660, 0.289146666353056970, 0.289098801751199060, 0.289050936426594130, +0.289003070379361900, 0.288955203609621510, 0.288907336117493590, 0.288859467903097300, 0.288811598966552340, 0.288763729307977950, 0.288715858927494680, 0.288667987825221740, +0.288620116001278850, 0.288572243455785250, 0.288524370188861460, 0.288476496200626710, 0.288428621491200800, 0.288380746060702850, 0.288332869909253440, 0.288284993036971910, +0.288237115443977450, 0.288189237130390630, 0.288141358096330740, 0.288093478341917400, 0.288045597867269960, 0.287997716672508950, 0.287949834757753650, 0.287901952123123810, +0.287854068768738590, 0.287806184694718690, 0.287758299901183290, 0.287710414388252180, 0.287662528156044540, 0.287614641204681050, 0.287566753534280960, 0.287518865144963940, +0.287470976036849400, 0.287423086210057800, 0.287375195664708480, 0.287327304400920800, 0.287279412418815220, 0.287231519718511130, 0.287183626300128280, 0.287135732163785910, +0.287087837309604630, 0.287039941737703750, 0.286992045448203000, 0.286944148441221740, 0.286896250716880570, 0.286848352275298700, 0.286800453116596020, 0.286752553240891720, +0.286704652648306470, 0.286656751338959630, 0.286608849312970870, 0.286560946570459610, 0.286513043111546350, 0.286465138936350510, 0.286417234044991860, 0.286369328437589670, +0.286321422114264530, 0.286273515075135880, 0.286225607320323040, 0.286177698849946590, 0.286129789664125890, 0.286081879762980720, 0.286033969146630430, 0.285986057815195590, +0.285938145768795670, 0.285890233007550400, 0.285842319531579070, 0.285794405341002370, 0.285746490435939690, 0.285698574816510730, 0.285650658482834940, 0.285602741435032950, +0.285554823673224100, 0.285506905197528190, 0.285458986008064570, 0.285411066104953930, 0.285363145488315590, 0.285315224158268990, 0.285267302114934780, 0.285219379358432280, +0.285171455888881320, 0.285123531706401310, 0.285075606811112940, 0.285027681203135490, 0.284979754882588860, 0.284931827849592420, 0.284883900104266840, 0.284835971646731520, +0.284788042477106260, 0.284740112595510460, 0.284692182002064810, 0.284644250696888700, 0.284596318680101930, 0.284548385951823970, 0.284500452512175480, 0.284452518361275890, +0.284404583499244520, 0.284356647926202130, 0.284308711642268120, 0.284260774647562390, 0.284212836942204230, 0.284164898526314440, 0.284116959400012360, 0.284069019563417900, +0.284021079016650470, 0.283973137759830800, 0.283925195793078230, 0.283877253116512740, 0.283829309730253610, 0.283781365634421690, 0.283733420829136330, 0.283685475314517430, +0.283637529090684400, 0.283589582157757980, 0.283541634515857620, 0.283493686165102730, 0.283445737105614050, 0.283397787337511090, 0.283349836860913580, 0.283301885675941060, +0.283253933782714300, 0.283205981181352650, 0.283158027871976080, 0.283110073854704050, 0.283062119129657170, 0.283014163696955090, 0.282966207556717530, 0.282918250709064070, +0.282870293154115380, 0.282822334891990930, 0.282774375922810680, 0.282726416246694090, 0.282678455863761830, 0.282630494774133490, 0.282582532977928850, 0.282534570475267530, +0.282486607266270120, 0.282438643351056230, 0.282390678729745330, 0.282342713402458150, 0.282294747369314150, 0.282246780630433350, 0.282198813185935090, 0.282150845035940290, +0.282102876180568340, 0.282054906619939210, 0.282006936354172400, 0.281958965383388660, 0.281910993707707500, 0.281863021327248890, 0.281815048242132270, 0.281767074452478450, +0.281719099958406990, 0.281671124760037750, 0.281623148857490240, 0.281575172250885350, 0.281527194940342450, 0.281479216925981210, 0.281431238207922320, 0.281383258786285340, +0.281335278661190240, 0.281287297832756470, 0.281239316301104880, 0.281191334066355050, 0.281143351128626820, 0.281095367488039870, 0.281047383144714840, 0.280999398098771390, +0.280951412350329440, 0.280903425899508560, 0.280855438746429540, 0.280807450891211900, 0.280759462333975640, 0.280711473074840290, 0.280663483113926690, 0.280615492451354360, +0.280567501087242930, 0.280519509021713130, 0.280471516254884530, 0.280423522786877210, 0.280375528617810620, 0.280327533747805610, 0.280279538176981810, 0.280231541905459130, +0.280183544933357230, 0.280135547260796810, 0.280087548887897550, 0.280039549814779460, 0.279991550041562070, 0.279943549568366150, 0.279895548395311440, 0.279847546522517810, +0.279799543950104920, 0.279751540678193580, 0.279703536706903400, 0.279655532036354350, 0.279607526666666050, 0.279559520597959410, 0.279511513830353890, 0.279463506363969220, +0.279415498198926190, 0.279367489335344390, 0.279319479773343930, 0.279271469513044270, 0.279223458554566430, 0.279175446898029870, 0.279127434543554760, 0.279079421491260640, +0.279031407741268330, 0.278983393293697530, 0.278935378148668260, 0.278887362306300120, 0.278839345766713990, 0.278791328530029470, 0.278743310596366700, 0.278695291965845190, +0.278647272638585850, 0.278599252614708360, 0.278551231894332290, 0.278503210477578590, 0.278455188364566840, 0.278407165555417110, 0.278359142050249090, 0.278311117849183610, +0.278263092952340310, 0.278215067359839310, 0.278167041071800240, 0.278119014088343940, 0.278070986409590160, 0.278022958035658850, 0.277974928966669750, 0.277926899202743770, +0.277878868744000530, 0.277830837590560100, 0.277782805742542220, 0.277734773200067670, 0.277686739963256210, 0.277638706032227510, 0.277590671407102420, 0.277542636088000670, +0.277494600075042340, 0.277446563368347050, 0.277398525968035830, 0.277350487874228280, 0.277302449087044490, 0.277254409606604140, 0.277206369433028230, 0.277158328566436410, +0.277110287006948730, 0.277062244754684880, 0.277014201809765880, 0.276966158172311410, 0.276918113842441470, 0.276870068820275870, 0.276822023105935510, 0.276773976699540130, +0.276725929601209790, 0.276677881811064170, 0.276629833329224250, 0.276581784155809810, 0.276533734290940470, 0.276485683734737200, 0.276437632487319730, 0.276389580548808190, +0.276341527919322260, 0.276293474598982900, 0.276245420587909910, 0.276197365886223340, 0.276149310494042950, 0.276101254411489690, 0.276053197638683300, 0.276005140175743900, +0.275957082022791230, 0.275909023179946310, 0.275860963647328820, 0.275812903425058930, 0.275764842513256340, 0.275716780912042050, 0.275668718621535860, 0.275620655641857390, +0.275572591973127780, 0.275524527615466640, 0.275476462568994160, 0.275428396833830140, 0.275380330410095520, 0.275332263297910110, 0.275284195497394020, 0.275236127008667010, +0.275188057831850130, 0.275139987967063070, 0.275091917414426070, 0.275043846174058860, 0.274995774246082400, 0.274947701630616600, 0.274899628327781480, 0.274851554337696870, +0.274803479660483800, 0.274755404296262050, 0.274707328245151370, 0.274659251507272770, 0.274611174082746050, 0.274563095971691370, 0.274515017174228550, 0.274466937690478640, +0.274418857520561330, 0.274370776664596920, 0.274322695122705130, 0.274274612895007040, 0.274226529981622390, 0.274178446382671410, 0.274130362098273910, 0.274082277128550930, +0.274034191473622290, 0.273986105133608100, 0.273938018108628280, 0.273889930398803830, 0.273841842004254540, 0.273793752925100220, 0.273745663161461930, 0.273697572713459510, +0.273649481581213110, 0.273601389764842660, 0.273553297264469090, 0.273505204080212340, 0.273457110212192540, 0.273409015660529500, 0.273360920425344430, 0.273312824506756980, +0.273264727904887540, 0.273216630619855790, 0.273168532651782920, 0.273120434000788730, 0.273072334666993490, 0.273024234650516890, 0.272976133951480240, 0.272928032570003140, +0.272879930506206070, 0.272831827760208650, 0.272783724332132160, 0.272735620222096350, 0.272687515430221020, 0.272639409956627330, 0.272591303801435150, 0.272543196964764700, +0.272495089446735840, 0.272446981247469690, 0.272398872367086040, 0.272350762805705250, 0.272302652563447100, 0.272254541640432780, 0.272206430036782080, 0.272158317752615340, +0.272110204788052310, 0.272062091143214280, 0.272013976818220930, 0.271965861813192710, 0.271917746128249370, 0.271869629763512140, 0.271821512719100770, 0.271773394995135250, +0.271725276591736620, 0.271677157509024820, 0.271629037747120160, 0.271580917306142420, 0.271532796186212840, 0.271484674387451270, 0.271436551909978010, 0.271388428753912950, +0.271340304919377270, 0.271292180406490780, 0.271244055215373870, 0.271195929346146390, 0.271147802798929530, 0.271099675573843120, 0.271051547671007530, 0.271003419090542650, +0.270955289832569670, 0.270907159897208480, 0.270859029284578890, 0.270810897994802240, 0.270762766027998310, 0.270714633384287420, 0.270666500063789560, 0.270618366066625870, +0.270570231392916300, 0.270522096042781100, 0.270473960016340280, 0.270425823313714950, 0.270377685935025090, 0.270329547880390990, 0.270281409149932590, 0.270233269743771150, +0.270185129662026460, 0.270136988904819020, 0.270088847472268630, 0.270040705364496540, 0.269992562581622740, 0.269944419123767490, 0.269896274991050730, 0.269848130183593770, +0.269799984701516500, 0.269751838544938780, 0.269703691713981950, 0.269655544208765860, 0.269607396029410920, 0.269559247176037020, 0.269511097648765460, 0.269462947447716210, +0.269414796573009540, 0.269366645024765430, 0.269318492803105160, 0.269270339908148640, 0.269222186340016320, 0.269174032098828060, 0.269125877184705150, 0.269077721597767550, +0.269029565338135660, 0.268981408405929430, 0.268933250801270120, 0.268885092524277670, 0.268836933575072050, 0.268788773953774540, 0.268740613660505060, 0.268692452695384050, +0.268644291058531490, 0.268596128750068660, 0.268547965770115530, 0.268499802118792430, 0.268451637796219390, 0.268403472802517700, 0.268355307137807360, 0.268307140802208690, +0.268258973795841790, 0.268210806118827860, 0.268162637771286960, 0.268114468753339390, 0.268066299065105260, 0.268018128706705830, 0.267969957678261040, 0.267921785979890970, +0.267873613611716850, 0.267825440573858650, 0.267777266866436940, 0.267729092489571550, 0.267680917443383900, 0.267632741727993950, 0.267584565343522150, 0.267536388290088470, +0.267488210567814300, 0.267440032176819550, 0.267391853117224740, 0.267343673389149880, 0.267295492992716270, 0.267247311928043910, 0.267199130195253320, 0.267150947794464410, +0.267102764725798580, 0.267054580989375840, 0.267006396585316220, 0.266958211513741050, 0.266910025774770350, 0.266861839368524590, 0.266813652295123770, 0.266765464554689300, +0.266717276147341140, 0.266669087073199750, 0.266620897332385250, 0.266572706925018940, 0.266524515851220890, 0.266476324111111500, 0.266428131704810890, 0.266379938632440420, +0.266331744894120040, 0.266283550489970320, 0.266235355420111290, 0.266187159684664330, 0.266138963283749420, 0.266090766217487170, 0.266042568485997500, 0.265994370089401910, +0.265946171027820370, 0.265897971301372940, 0.265849770910181030, 0.265801569854364710, 0.265753368134044430, 0.265705165749340330, 0.265656962700373760, 0.265608758987264770, +0.265560554610133840, 0.265512349569101140, 0.265464143864287960, 0.265415937495814490, 0.265367730463801130, 0.265319522768368010, 0.265271314409636530, 0.265223105387726700, +0.265174895702759210, 0.265126685354853950, 0.265078474344132450, 0.265030262670714780, 0.264982050334721050, 0.264933837336272570, 0.264885623675489510, 0.264837409352492390, +0.264789194367401340, 0.264740978720337690, 0.264692762411421640, 0.264644545440773650, 0.264596327808513890, 0.264548109514763760, 0.264499890559643290, 0.264451670943273150, +0.264403450665773370, 0.264355229727265440, 0.264307008127869390, 0.264258785867705850, 0.264210562946894880, 0.264162339365557940, 0.264114115123815160, 0.264065890221786670, +0.264017664659593920, 0.263969438437356930, 0.263921211555196380, 0.263872984013232390, 0.263824755811586380, 0.263776526950378450, 0.263728297429729200, 0.263680067249758790, +0.263631836410588630, 0.263583604912338900, 0.263535372755130120, 0.263487139939082520, 0.263438906464317450, 0.263390672330955140, 0.263342437539116180, 0.263294202088920680, +0.263245965980490100, 0.263197729213944580, 0.263149491789404780, 0.263101253706990780, 0.263053014966824090, 0.263004775569024910, 0.262956535513713290, 0.262908294801010800, +0.262860053431037580, 0.262811811403914190, 0.262763568719760860, 0.262715325378699070, 0.262667081380848930, 0.262618836726331070, 0.262570591415265730, 0.262522345447774310, +0.262474098823977040, 0.262425851543994500, 0.262377603607946930, 0.262329355015955780, 0.262281105768141230, 0.262232855864623970, 0.262184605305524070, 0.262136354090963140, +0.262088102221061270, 0.262039849695938740, 0.261991596515717020, 0.261943342680516330, 0.261895088190457260, 0.261846833045660030, 0.261798577246246170, 0.261750320792335840, +0.261702063684049690, 0.261653805921508000, 0.261605547504832230, 0.261557288434142550, 0.261509028709559670, 0.261460768331203800, 0.261412507299196410, 0.261364245613657790, +0.261315983274708510, 0.261267720282468860, 0.261219456637060370, 0.261171192338603200, 0.261122927387217650, 0.261074661783025190, 0.261026395526146040, 0.260978128616700940, +0.260929861054810090, 0.260881592840595030, 0.260833323974175970, 0.260785054455673630, 0.260736784285208190, 0.260688513462901230, 0.260640241988872980, 0.260591969863244120, +0.260543697086134950, 0.260495423657666920, 0.260447149577960340, 0.260398874847135920, 0.260350599465313800, 0.260302323432615720, 0.260254046749161750, 0.260205769415072290, +0.260157491430468790, 0.260109212795471560, 0.260060933510201320, 0.260012653574778320, 0.259964372989324120, 0.259916091753958970, 0.259867809868803590, 0.259819527333978280, +0.259771244149604560, 0.259722960315802720, 0.259674675832693490, 0.259626390700397170, 0.259578104919035270, 0.259529818488728140, 0.259481531409596400, 0.259433243681760460, +0.259384955305341840, 0.259336666280460810, 0.259288376607238080, 0.259240086285794040, 0.259191795316250200, 0.259143503698726850, 0.259095211433344350, 0.259046918520224210, +0.258998624959486780, 0.258950330751252790, 0.258902035895642530, 0.258853740392777640, 0.258805444242778400, 0.258757147445765560, 0.258708850001859390, 0.258660551911181540, +0.258612253173852280, 0.258563953789992420, 0.258515653759722240, 0.258467353083163380, 0.258419051760436110, 0.258370749791661190, 0.258322447176959010, 0.258274143916451150, +0.258225840010257890, 0.258177535458499590, 0.258129230261297920, 0.258080924418773170, 0.258032617931046090, 0.257984310798237030, 0.257936003020467650, 0.257887694597858210, +0.257839385530529600, 0.257791075818602060, 0.257742765462197270, 0.257694454461435570, 0.257646142816437720, 0.257597830527324100, 0.257549517594216350, 0.257501204017234750, +0.257452889796500160, 0.257404574932132920, 0.257356259424254720, 0.257307943272985840, 0.257259626478446630, 0.257211309040758840, 0.257162990960042750, 0.257114672236419210, +0.257066352870008510, 0.257018032860932390, 0.256969712209311200, 0.256921390915265670, 0.256873068978916320, 0.256824746400384660, 0.256776423179791160, 0.256728099317256600, +0.256679774812901380, 0.256631449666847140, 0.256583123879214230, 0.256534797450123590, 0.256486470379695460, 0.256438142668051650, 0.256389814315312440, 0.256341485321598670, +0.256293155687030820, 0.256244825411730440, 0.256196494495818050, 0.256148162939414000, 0.256099830742639920, 0.256051497905616320, 0.256003164428463940, 0.255954830311303230, +0.255906495554255880, 0.255858160157442280, 0.255809824120983300, 0.255761487444999270, 0.255713150129611990, 0.255664812174941860, 0.255616473581109670, 0.255568134348235890, +0.255519794476442190, 0.255471453965849030, 0.255423112816577200, 0.255374771028747170, 0.255326428602480620, 0.255278085537898050, 0.255229741835119760, 0.255181397494267600, +0.255133052515461920, 0.255084706898823680, 0.255036360644473160, 0.254988013752532220, 0.254939666223121200, 0.254891318056361060, 0.254842969252372150, 0.254794619811276270, +0.254746269733193860, 0.254697919018245730, 0.254649567666552390, 0.254601215678235570, 0.254552863053415730, 0.254504509792213730, 0.254456155894750010, 0.254407801361146320, +0.254359446191523120, 0.254311090386000920, 0.254262733944701390, 0.254214376867745010, 0.254166019155252720, 0.254117660807344940, 0.254069301824143450, 0.254020942205768650, +0.253972581952341570, 0.253924221063982550, 0.253875859540813430, 0.253827497382954680, 0.253779134590527140, 0.253730771163651390, 0.253682407102449100, 0.253634042407040850, +0.253585677077547420, 0.253537311114089390, 0.253488944516788550, 0.253440577285765300, 0.253392209421140210, 0.253343840923035020, 0.253295471791570190, 0.253247102026866730, +0.253198731629045050, 0.253150360598226990, 0.253101988934533060, 0.253053616638084120, 0.253005243709000680, 0.252956870147404640, 0.252908495953416360, 0.252860121127156830, +0.252811745668746650, 0.252763369578307470, 0.252714992855959890, 0.252666615501824790, 0.252618237516022750, 0.252569858898675560, 0.252521479649903680, 0.252473099769828120, +0.252424719258569410, 0.252376338116249320, 0.252327956342988380, 0.252279573938907100, 0.252231190904127320, 0.252182807238769570, 0.252134422942954790, 0.252086038016803570, +0.252037652460437630, 0.251989266273977610, 0.251940879457544400, 0.251892492011258520, 0.251844103935241930, 0.251795715229615020, 0.251747325894498830, 0.251698935930013860, +0.251650545336282060, 0.251602154113423850, 0.251553762261560230, 0.251505369780811780, 0.251456976671300400, 0.251408582933146500, 0.251360188566470740, 0.251311793571394990, +0.251263397948039700, 0.251215001696525940, 0.251166604816974230, 0.251118207309506460, 0.251069809174243150, 0.251021410411305320, 0.250973011020813540, 0.250924611002889650, +0.250876210357654230, 0.250827809085228280, 0.250779407185732440, 0.250731004659288440, 0.250682601506016960, 0.250634197726038950, 0.250585793319475060, 0.250537388286447060, +0.250488982627075640, 0.250440576341481310, 0.250392169429785980, 0.250343761892110220, 0.250295353728575090, 0.250246944939301110, 0.250198535524410180, 0.250150125484022930, +0.250101714818260380, 0.250053303527243090, 0.250004891611092960, 0.249956479069930650, 0.249908065903877120, 0.249859652113053000, 0.249811237697580150, 0.249762822657579240, +0.249714406993171270, 0.249665990704476840, 0.249617573791617860, 0.249569156254714960, 0.249520738093889170, 0.249472319309261090, 0.249423899900952650, 0.249375479869084450, +0.249327059213777120, 0.249278637935152590, 0.249230216033331450, 0.249181793508434780, 0.249133370360583200, 0.249084946589898630, 0.249036522196501660, 0.248988097180513430, +0.248939671542054490, 0.248891245281246810, 0.248842818398211040, 0.248794390893068210, 0.248745962765938940, 0.248697534016945220, 0.248649104646207680, 0.248600674653847360, +0.248552244039984940, 0.248503812804742320, 0.248455380948240180, 0.248406948470599160, 0.248358515371941200, 0.248310081652386940, 0.248261647312057470, 0.248213212351073460, +0.248164776769556870, 0.248116340567628320, 0.248067903745408910, 0.248019466303019330, 0.247971028240581510, 0.247922589558216110, 0.247874150256044230, 0.247825710334186540, +0.247777269792765040, 0.247728828631900350, 0.247680386851713560, 0.247631944452325420, 0.247583501433857820, 0.247535057796431480, 0.247486613540167040, 0.247438168665186530, +0.247389723171610560, 0.247341277059560330, 0.247292830329156440, 0.247244382980520930, 0.247195935013774430, 0.247147486429038110, 0.247099037226432640, 0.247050587406080020, +0.247002136968100920, 0.246953685912616490, 0.246905234239747420, 0.246856781949615660, 0.246808329042341980, 0.246759875518047460, 0.246711421376852810, 0.246662966618880070, +0.246614511244249910, 0.246566055253083010, 0.246517598645501430, 0.246469141421625850, 0.246420683581577400, 0.246372225125476820, 0.246323766053446110, 0.246275306365605990, +0.246226846062077590, 0.246178385142981650, 0.246129923608440190, 0.246081461458573900, 0.246032998693503980, 0.245984535313351130, 0.245936071318237360, 0.245887606708283410, +0.245839141483610440, 0.245790675644339210, 0.245742209190591700, 0.245693742122488650, 0.245645274440151270, 0.245596806143700270, 0.245548337233257700, 0.245499867708944270, +0.245451397570880750, 0.245402926819189150, 0.245354455453990260, 0.245305983475405220, 0.245257510883554770, 0.245209037678561000, 0.245160563860544630, 0.245112089429626840, +0.245063614385928390, 0.245015138729571340, 0.244966662460676470, 0.244918185579364930, 0.244869708085757480, 0.244821229979976180, 0.244772751262141850, 0.244724271932375610, +0.244675791990798280, 0.244627311437531890, 0.244578830272697200, 0.244530348496415030, 0.244481866108807400, 0.244433383109995130, 0.244384899500099400, 0.244336415279240960, +0.244287930447541930, 0.244239445005123100, 0.244190958952105630, 0.244142472288610330, 0.244093985014759290, 0.244045497130673280, 0.243997008636473530, 0.243948519532280830, +0.243900029818217260, 0.243851539494403640, 0.243803048560961130, 0.243754557018010580, 0.243706064865674090, 0.243657572104072410, 0.243609078733326380, 0.243560584753558100, +0.243512090164888340, 0.243463594967438360, 0.243415099161328970, 0.243366602746682230, 0.243318105723619030, 0.243269608092260530, 0.243221109852727600, 0.243172611005142310, +0.243124111549625520, 0.243075611486298420, 0.243027110815281860, 0.242978609536697980, 0.242930107650667550, 0.242881605157311890, 0.242833102056751740, 0.242784598349109290, +0.242736094034505360, 0.242687589113061150, 0.242639083584897580, 0.242590577450136710, 0.242542070708899380, 0.242493563361306480, 0.242445055407480100, 0.242396546847541060, +0.242348037681610650, 0.242299527909809710, 0.242251017532260420, 0.242202506549083570, 0.242153994960400440, 0.242105482766331900, 0.242056969967000070, 0.242008456562525840, +0.241959942553030440, 0.241911427938634790, 0.241862912719460980, 0.241814396895629890, 0.241765880467262800, 0.241717363434480580, 0.241668845797405380, 0.241620327556158090, +0.241571808710859540, 0.241523289261631880, 0.241474769208596010, 0.241426248551873220, 0.241377727291584350, 0.241329205427851630, 0.241280682960795880, 0.241232159890538420, +0.241183636217200150, 0.241135111940903200, 0.241086587061768500, 0.241038061579917310, 0.240989535495470530, 0.240941008808550320, 0.240892481519277640, 0.240843953627773720, +0.240795425134159500, 0.240746896038557150, 0.240698366341087540, 0.240649836041871600, 0.240601305141031510, 0.240552773638688130, 0.240504241534962830, 0.240455708829976520, +0.240407175523851320, 0.240358641616708220, 0.240310107108668510, 0.240261571999853100, 0.240213036290384180, 0.240164499980382670, 0.240115963069969930, 0.240067425559266830, +0.240018887448395610, 0.239970348737477160, 0.239921809426632850, 0.239873269515983560, 0.239824729005651550, 0.239776187895757720, 0.239727646186423000, 0.239679103877769580, +0.239630560969918390, 0.239582017462990820, 0.239533473357107760, 0.239484928652391430, 0.239436383348962810, 0.239387837446943220, 0.239339290946453620, 0.239290743847616200, +0.239242196150551920, 0.239193647855382160, 0.239145098962227850, 0.239096549471211230, 0.239047999382453250, 0.238999448696075260, 0.238950897412198190, 0.238902345530944330, +0.238853793052434590, 0.238805239976790400, 0.238756686304132660, 0.238708132034583630, 0.238659577168264280, 0.238611021705295550, 0.238562465645799690, 0.238513908989897690, +0.238465351737710880, 0.238416793889360300, 0.238368235444968160, 0.238319676404655400, 0.238271116768543480, 0.238222556536753340, 0.238173995709407200, 0.238125434286626110, +0.238076872268531410, 0.238028309655244130, 0.237979746446886460, 0.237931182643579460, 0.237882618245444520, 0.237834053252602570, 0.237785487665175900, 0.237736921483285540, +0.237688354707052460, 0.237639787336598910, 0.237591219372045890, 0.237542650813514810, 0.237494081661126680, 0.237445511915003790, 0.237396941575267110, 0.237348370642038060, +0.237299799115437670, 0.237251226995588200, 0.237202654282610700, 0.237154080976626520, 0.237105507077756740, 0.237056932586123590, 0.237008357501848150, 0.236959781825051790, +0.236911205555855540, 0.236862628694381710, 0.236814051240751330, 0.236765473195085370, 0.236716894557506160, 0.236668315328134730, 0.236619735507092480, 0.236571155094500500, +0.236522574090481020, 0.236473992495155130, 0.236425410308644250, 0.236376827531069420, 0.236328244162552960, 0.236279660203215890, 0.236231075653179660, 0.236182490512565320, +0.236133904781495180, 0.236085318460090260, 0.236036731548472050, 0.235988144046761610, 0.235939555955081200, 0.235890967273551940, 0.235842378002295240, 0.235793788141432150, +0.235745197691085040, 0.235696606651374930, 0.235648015022422890, 0.235599422804351230, 0.235550829997281000, 0.235502236601333710, 0.235453642616630380, 0.235405048043293400, +0.235356452881443800, 0.235307857131203060, 0.235259260792692220, 0.235210663866033680, 0.235162066351348480, 0.235113468248758120, 0.235064869558383650, 0.235016270280347470, +0.234967670414770570, 0.234919069961774530, 0.234870468921480360, 0.234821867294010440, 0.234773265079485870, 0.234724662278027710, 0.234676058889758320, 0.234627454914798780, +0.234578850353270580, 0.234530245205294860, 0.234481639470993960, 0.234433033150488940, 0.234384426243901350, 0.234335818751352260, 0.234287210672964040, 0.234238602008857790, +0.234189992759155060, 0.234141382923976900, 0.234092772503445730, 0.234044161497682620, 0.233995549906809100, 0.233946937730946300, 0.233898324970216560, 0.233849711624741020, +0.233801097694640750, 0.233752483180038190, 0.233703868081054420, 0.233655252397810960, 0.233606636130428950, 0.233558019279030800, 0.233509401843737590, 0.233460783824670860, +0.233412165221951740, 0.233363546035702670, 0.233314926266044690, 0.233266305913099440, 0.233217684976987970, 0.233169063457832700, 0.233120441355754800, 0.233071818670875790, +0.233023195403316810, 0.232974571553200250, 0.232925947120647290, 0.232877322105779020, 0.232828696508717880, 0.232780070329584980, 0.232731443568501920, 0.232682816225589810, +0.232634188300971100, 0.232585559794766920, 0.232536930707098830, 0.232488301038087990, 0.232439670787856820, 0.232391039956526490, 0.232342408544218530, 0.232293776551054150, +0.232245143977155730, 0.232196510822644480, 0.232147877087641950, 0.232099242772269290, 0.232050607876648940, 0.232001972400902090, 0.231953336345150310, 0.231904699709514740, +0.231856062494117860, 0.231807424699080830, 0.231758786324524790, 0.231710147370572240, 0.231661507837344290, 0.231612867724962620, 0.231564227033548310, 0.231515585763223870, +0.231466943914110460, 0.231418301486329720, 0.231369658480002770, 0.231321014895252110, 0.231272370732198920, 0.231223725990964770, 0.231175080671670920, 0.231126434774439780, +0.231077788299392540, 0.231029141246650860, 0.230980493616335880, 0.230931845408570090, 0.230883196623474670, 0.230834547261170860, 0.230785897321781120, 0.230737246805426620, +0.230688595712228990, 0.230639944042309450, 0.230591291795790490, 0.230542638972793280, 0.230493985573439500, 0.230445331597850300, 0.230396677046148220, 0.230348021918454440, +0.230299366214890610, 0.230250709935577920, 0.230202053080638900, 0.230153395650194740, 0.230104737644367120, 0.230056079063277190, 0.230007419907047510, 0.229958760175799280, +0.229910099869653690, 0.229861438988733320, 0.229812777533159320, 0.229764115503053400, 0.229715452898536760, 0.229666789719731900, 0.229618125966760090, 0.229569461639742960, +0.229520796738801710, 0.229472131264058940, 0.229423465215635840, 0.229374798593654060, 0.229326131398234850, 0.229277463629500770, 0.229228795287573010, 0.229180126372573260, +0.229131456884622780, 0.229082786823844060, 0.229034116190358410, 0.228985444984287440, 0.228936773205752430, 0.228888100854875930, 0.228839427931779170, 0.228790754436583420, +0.228742080369411180, 0.228693405730383770, 0.228644730519622860, 0.228596054737249670, 0.228547378383386760, 0.228498701458155430, 0.228450023961677350, 0.228401345894073770, +0.228352667255467240, 0.228303988045979070, 0.228255308265730930, 0.228206627914844060, 0.228157946993441080, 0.228109265501643200, 0.228060583439572200, 0.228011900807349260, +0.227963217605097020, 0.227914533832936750, 0.227865849490989700, 0.227817164579378480, 0.227768479098224340, 0.227719793047648970, 0.227671106427773720, 0.227622419238721120, +0.227573731480612500, 0.227525043153569530, 0.227476354257713510, 0.227427664793167030, 0.227378974760051420, 0.227330284158488350, 0.227281592988599150, 0.227232901250506410, +0.227184208944331390, 0.227135516070195860, 0.227086822628221110, 0.227038128618529730, 0.226989434041243030, 0.226940738896482310, 0.226892043184370170, 0.226843346905027940, +0.226794650058577350, 0.226745952645139690, 0.226697254664837560, 0.226648556117792330, 0.226599857004125690, 0.226551157323958970, 0.226502457077414790, 0.226453756264614480, +0.226405054885679770, 0.226356352940732000, 0.226307650429893760, 0.226258947353286420, 0.226210243711031680, 0.226161539503250940, 0.226112834730066740, 0.226064129391600480, +0.226015423487973460, 0.225966717019308320, 0.225918009985726390, 0.225869302387349420, 0.225820594224298760, 0.225771885496697050, 0.225723176204665640, 0.225674466348326270, +0.225625755927800320, 0.225577044943210400, 0.225528333394677870, 0.225479621282324520, 0.225430908606271680, 0.225382195366642000, 0.225333481563556810, 0.225284767197137940, +0.225236052267506700, 0.225187336774785780, 0.225138620719096520, 0.225089904100560710, 0.225041186919299700, 0.224992469175436140, 0.224943750869091410, 0.224895032000386880, +0.224846312569445210, 0.224797592576387760, 0.224748872021336310, 0.224700150904412250, 0.224651429225738270, 0.224602706985435690, 0.224553984183626380, 0.224505260820431650, +0.224456536895974200, 0.224407812410375410, 0.224359087363757060, 0.224310361756240610, 0.224261635587948650, 0.224212908859002640, 0.224164181569524330, 0.224115453719635120, +0.224066725309457730, 0.224017996339113540, 0.223969266808723890, 0.223920536718411530, 0.223871806068297850, 0.223823074858504610, 0.223774343089153280, 0.223725610760366510, +0.223676877872265730, 0.223628144424972720, 0.223579410418608960, 0.223530675853297080, 0.223481940729158500, 0.223433205046315090, 0.223384468804888240, 0.223335732005000650, +0.223286994646773710, 0.223238256730329290, 0.223189518255788810, 0.223140779223274970, 0.223092039632909160, 0.223043299484812830, 0.222994558779108680, 0.222945817515918130, +0.222897075695363040, 0.222848333317564820, 0.222799590382646210, 0.222750846890728630, 0.222702102841933920, 0.222653358236383550, 0.222604613074200180, 0.222555867355505280, +0.222507121080420730, 0.222458374249067950, 0.222409626861569650, 0.222360878918047290, 0.222312130418622720, 0.222263381363417420, 0.222214631752554070, 0.222165881586154160, +0.222117130864339540, 0.222068379587231630, 0.222019627754953240, 0.221970875367625780, 0.221922122425370680, 0.221873368928310720, 0.221824614876567350, 0.221775860270262410, +0.221727105109517430, 0.221678349394455080, 0.221629593125196890, 0.221580836301864700, 0.221532078924579990, 0.221483320993465520, 0.221434562508642710, 0.221385803470233540, +0.221337043878359400, 0.221288283733143100, 0.221239523034706090, 0.221190761783170260, 0.221141999978657110, 0.221093237621289380, 0.221044474711188570, 0.220995711248476140, +0.220946947233274850, 0.220898182665706180, 0.220849417545892070, 0.220800651873954010, 0.220751885650014720, 0.220703118874195720, 0.220654351546618940, 0.220605583667405820, +0.220556815236679190, 0.220508046254560520, 0.220459276721171740, 0.220410506636634330, 0.220361736001071090, 0.220312964814603520, 0.220264193077353510, 0.220215420789442620, +0.220166647950993580, 0.220117874562127950, 0.220069100622967170, 0.220020326133634090, 0.219971551094250180, 0.219922775504937410, 0.219873999365817250, 0.219825222677012540, +0.219776445438644770, 0.219727667650835870, 0.219678889313707380, 0.219630110427382120, 0.219581330991981540, 0.219532551007627670, 0.219483770474441980, 0.219434989392547300, +0.219386207762065130, 0.219337425583117470, 0.219288642855825780, 0.219239859580312950, 0.219191075756700440, 0.219142291385110270, 0.219093506465663920, 0.219044720998484240, +0.218995934983692740, 0.218947148421411000, 0.218898361311761800, 0.218849573654866710, 0.218800785450847690, 0.218751996699826260, 0.218703207401925280, 0.218654417557266280, +0.218605627165971230, 0.218556836228161690, 0.218508044743960460, 0.218459252713489150, 0.218410460136869710, 0.218361667014223690, 0.218312873345673920, 0.218264079131341960, +0.218215284371349820, 0.218166489065819040, 0.218117693214872450, 0.218068896818631650, 0.218020099877218150, 0.217971302390754850, 0.217922504359363280, 0.217873705783165480, +0.217824906662282940, 0.217776106996838610, 0.217727306786953980, 0.217678506032751100, 0.217629704734351500, 0.217580902891878090, 0.217532100505452440, 0.217483297575196490, +0.217434494101231920, 0.217385690083681500, 0.217336885522666890, 0.217288080418310050, 0.217239274770732570, 0.217190468580057330, 0.217141661846405960, 0.217092854569899960, +0.217044046750662270, 0.216995238388814460, 0.216946429484478560, 0.216897620037776160, 0.216848810048830140, 0.216799999517762080, 0.216751188444694040, 0.216702376829747580, +0.216653564673045640, 0.216604751974709740, 0.216555938734862010, 0.216507124953623980, 0.216458310631118560, 0.216409495767467370, 0.216360680362792430, 0.216311864417215390, +0.216263047930859100, 0.216214230903845170, 0.216165413336295270, 0.216116595228332240, 0.216067776580077730, 0.216018957391653780, 0.215970137663182020, 0.215921317394785320, +0.215872496586585360, 0.215823675238704130, 0.215774853351263280, 0.215726030924385750, 0.215677207958193120, 0.215628384452807490, 0.215579560408350470, 0.215530735824944950, +0.215481910702712610, 0.215433085041775500, 0.215384258842255230, 0.215335432104274750, 0.215286604827955700, 0.215237777013420150, 0.215188948660789690, 0.215140119770187320, +0.215091290341734630, 0.215042460375553270, 0.214993629871766230, 0.214944798830495080, 0.214895967251861970, 0.214847135135988490, 0.214798302482997610, 0.214749469293010950, +0.214700635566150650, 0.214651801302538300, 0.214602966502296900, 0.214554131165548080, 0.214505295292413940, 0.214456458883016090, 0.214407621937477560, 0.214358784455919970, +0.214309946438465430, 0.214261107885235590, 0.214212268796353380, 0.214163429171940530, 0.214114589012118660, 0.214065748317010750, 0.214016907086738480, 0.213968065321423960, +0.213919223021188790, 0.213870380186156030, 0.213821536816447330, 0.213772692912184760, 0.213723848473490050, 0.213675003500486150, 0.213626157993294740, 0.213577311952037910, +0.213528465376837400, 0.213479618267816140, 0.213430770625095830, 0.213381922448798610, 0.213333073739046140, 0.213284224495961410, 0.213235374719666140, 0.213186524410281990, +0.213137673567931950, 0.213088822192737750, 0.213039970284821490, 0.212991117844304860, 0.212942264871310880, 0.212893411365961240, 0.212844557328378060, 0.212795702758683060, +0.212746847656999220, 0.212697992023448270, 0.212649135858152370, 0.212600279161233170, 0.212551421932813710, 0.212502564173015690, 0.212453705881961250, 0.212404847059772140, +0.212355987706571330, 0.212307127822480540, 0.212258267407621940, 0.212209406462117250, 0.212160544986089470, 0.212111682979660320, 0.212062820442951520, 0.212013957376086140, +0.211965093779185820, 0.211916229652372810, 0.211867364995768750, 0.211818499809496740, 0.211769634093678470, 0.211720767848436130, 0.211671901073891420, 0.211623033770167390, +0.211574165937385790, 0.211525297575668760, 0.211476428685138080, 0.211427559265916720, 0.211378689318126480, 0.211329818841889530, 0.211280947837327590, 0.211232076304563730, +0.211183204243719640, 0.211134331654917130, 0.211085458538279230, 0.211036584893927680, 0.210987710721984660, 0.210938836022571930, 0.210889960795812570, 0.210841085041828270, +0.210792208760741280, 0.210743331952673340, 0.210694454617747500, 0.210645576756085500, 0.210596698367809590, 0.210547819453041460, 0.210498940011904250, 0.210450060044519690, +0.210401179551009950, 0.210352298531496870, 0.210303416986103440, 0.210254534914951500, 0.210205652318162770, 0.210156769195860320, 0.210107885548165980, 0.210059001375201920, +0.210010116677089940, 0.209961231453953070, 0.209912345705913130, 0.209863459433092340, 0.209814572635612460, 0.209765685313596570, 0.209716797467166480, 0.209667909096444390, +0.209619020201552100, 0.209570130782612690, 0.209521240839747960, 0.209472350373080120, 0.209423459382730990, 0.209374567868823610, 0.209325675831479850, 0.209276783270821440, +0.209227890186971490, 0.209178996580051850, 0.209130102450184710, 0.209081207797491870, 0.209032312622096460, 0.208983416924120260, 0.208934520703685510, 0.208885623960914010, +0.208836726695928930, 0.208787828908852000, 0.208738930599805500, 0.208690031768911240, 0.208641132416292340, 0.208592232542070600, 0.208543332146368300, 0.208494431229307220, +0.208445529791010500, 0.208396627831599960, 0.208347725351197830, 0.208298822349925970, 0.208249918827907500, 0.208201014785264200, 0.208152110222117960, 0.208103205138591870, +0.208054299534807750, 0.208005393410887920, 0.207956486766954140, 0.207907579603129580, 0.207858671919536080, 0.207809763716295890, 0.207760854993530860, 0.207711945751364150, +0.207663035989917530, 0.207614125709313370, 0.207565214909673420, 0.207516303591120890, 0.207467391753777600, 0.207418479397765840, 0.207369566523207430, 0.207320653130225550, +0.207271739218942010, 0.207222824789478700, 0.207173909841958770, 0.207124994376504080, 0.207076078393236880, 0.207027161892279070, 0.206978244873753770, 0.206929327337782850, +0.206880409284488640, 0.206831490713992950, 0.206782571626419000, 0.206733652021888590, 0.206684731900524050, 0.206635811262447260, 0.206586890107781390, 0.206537968436648260, +0.206489046249170250, 0.206440123545469150, 0.206391200325668180, 0.206342276589889240, 0.206293352338254160, 0.206244427570886120, 0.206195502287907010, 0.206146576489439150, +0.206097650175604440, 0.206048723346526020, 0.205999796002325790, 0.205950868143126050, 0.205901939769048750, 0.205853010880216990, 0.205804081476752720, 0.205755151558778240, +0.205706221126415480, 0.205657290179787570, 0.205608358719016450, 0.205559426744224420, 0.205510494255533390, 0.205461561253066580, 0.205412627736945850, 0.205363693707293540, +0.205314759164231590, 0.205265824107883130, 0.205216888538370140, 0.205167952455814510, 0.205119015860339430, 0.205070078752066790, 0.205021141131118940, 0.204972202997617840, +0.204923264351686650, 0.204874325193447280, 0.204825385523022120, 0.204776445340533080, 0.204727504646103340, 0.204678563439854830, 0.204629621721909930, 0.204580679492390530, +0.204531736751419860, 0.204482793499119850, 0.204433849735612880, 0.204384905461020810, 0.204335960675466940, 0.204287015379073180, 0.204238069571961420, 0.204189123254254920, +0.204140176426075630, 0.204091229087545900, 0.204042281238787650, 0.203993332879924130, 0.203944384011077280, 0.203895434632369480, 0.203846484743922640, 0.203797534345860040, +0.203748583438303600, 0.203699632021375700, 0.203650680095198290, 0.203601727659894620, 0.203552774715586610, 0.203503821262396690, 0.203454867300446760, 0.203405912829860090, +0.203356957850758660, 0.203308002363264410, 0.203259046367500560, 0.203210089863589100, 0.203161132851652440, 0.203112175331812470, 0.203063217304192520, 0.203014258768914550, +0.202965299726100920, 0.202916340175873590, 0.202867380118355840, 0.202818419553669670, 0.202769458481937420, 0.202720496903281090, 0.202671534817823960, 0.202622572225688020, +0.202573609126995620, 0.202524645521868770, 0.202475681410430740, 0.202426716792803500, 0.202377751669109040, 0.202328786039470660, 0.202279819904010280, 0.202230853262850370, +0.202181886116112870, 0.202132918463921120, 0.202083950306397030, 0.202034981643663100, 0.201986012475841280, 0.201937042803054860, 0.201888072625425820, 0.201839101943076610, +0.201790130756129230, 0.201741159064706910, 0.201692186868931730, 0.201643214168926080, 0.201594240964811930, 0.201545267256712650, 0.201496293044750200, 0.201447318329047000, +0.201398343109725070, 0.201349367386907700, 0.201300391160716930, 0.201251414431274760, 0.201202437198704480, 0.201153459463128100, 0.201104481224668090, 0.201055502483446420, +0.201006523239586450, 0.200957543493210160, 0.200908563244440010, 0.200859582493398030, 0.200810601240207500, 0.200761619484990490, 0.200712637227869420, 0.200663654468966330, +0.200614671208404540, 0.200565687446306070, 0.200516703182793380, 0.200467718417988490, 0.200418733152014750, 0.200369747384994160, 0.200320761117048800, 0.200271774348301960, +0.200222787078875670, 0.200173799308892430, 0.200124811038474240, 0.200075822267744450, 0.200026832996825110, 0.199977843225838700, 0.199928852954907250, 0.199879862184154100, +0.199830870913701280, 0.199781879143671290, 0.199732886874186170, 0.199683894105369270, 0.199634900837342640, 0.199585907070228750, 0.199536912804149650, 0.199487918039228720, +0.199438922775588000, 0.199389927013349510, 0.199340930752636650, 0.199291933993571480, 0.199242936736276440, 0.199193938980873650, 0.199144940727486450, 0.199095941976236900, +0.199046942727247460, 0.198997942980640270, 0.198948942736538630, 0.198899941995064640, 0.198850940756340800, 0.198801939020489180, 0.198752936787633140, 0.198703934057894770, +0.198654930831396540, 0.198605927108260550, 0.198556922888610210, 0.198507918172567520, 0.198458912960255060, 0.198409907251794890, 0.198360901047310380, 0.198311894346923620, +0.198262887150756660, 0.198213879458932960, 0.198164871271574530, 0.198115862588803930, 0.198066853410743230, 0.198017843737515850, 0.197968833569243860, 0.197919822906049790, +0.197870811748055710, 0.197821800095385050, 0.197772787948159890, 0.197723775306502730, 0.197674762170535730, 0.197625748540382260, 0.197576734416164410, 0.197527719798004710, +0.197478704686025300, 0.197429689080349550, 0.197380672981099570, 0.197331656388397480, 0.197282639302366700, 0.197233621723129300, 0.197184603650807870, 0.197135585085524480, +0.197086566027402540, 0.197037546476564210, 0.196988526433132030, 0.196939505897228060, 0.196890484868975780, 0.196841463348497310, 0.196792441335915140, 0.196743418831351460, +0.196694395834929650, 0.196645372346771870, 0.196596348367000660, 0.196547323895738120, 0.196498298933107720, 0.196449273479231580, 0.196400247534231800, 0.196351221098231860, +0.196302194171353860, 0.196253166753720370, 0.196204138845453540, 0.196155110446676770, 0.196106081557512250, 0.196057052178082500, 0.196008022308509720, 0.195958991948917300, +0.195909961099427400, 0.195860929760162620, 0.195811897931245040, 0.195762865612798180, 0.195713832804944140, 0.195664799507805520, 0.195615765721504490, 0.195566731446164460, +0.195517696681907600, 0.195468661428856050, 0.195419625687133310, 0.195370589456861500, 0.195321552738163210, 0.195272515531160600, 0.195223477835977130, 0.195174439652734980, +0.195125400981556730, 0.195076361822564550, 0.195027322175881900, 0.194978282041630920, 0.194929241419934260, 0.194880200310914050, 0.194831158714693750, 0.194782116631395580, +0.194733074061142130, 0.194684031004055540, 0.194634987460259310, 0.194585943429875620, 0.194536898913027080, 0.194487853909835830, 0.194438808420425410, 0.194389762444917960, +0.194340715983435660, 0.194291669036102010, 0.194242621603039180, 0.194193573684369820, 0.194144525280216060, 0.194095476390701430, 0.194046427015948130, 0.193997377156078730, +0.193948326811215490, 0.193899275981481850, 0.193850224667000000, 0.193801172867892610, 0.193752120584281850, 0.193703067816291240, 0.193654014564042940, 0.193604960827659600, +0.193555906607263430, 0.193506851902977920, 0.193457796714925300, 0.193408741043227720, 0.193359684888008750, 0.193310628249390580, 0.193261571127495810, 0.193212513522446700, +0.193163455434366720, 0.193114396863378110, 0.193065337809603530, 0.193016278273165140, 0.192967218254186500, 0.192918157752789810, 0.192869096769097720, 0.192820035303232470, +0.192770973355317570, 0.192721910925475220, 0.192672848013828110, 0.192623784620498420, 0.192574720745609720, 0.192525656389284230, 0.192476591551644150, 0.192427526232813030, +0.192378460432913100, 0.192329394152066980, 0.192280327390396990, 0.192231260148026580, 0.192182192425078060, 0.192133124221674030, 0.192084055537936750, 0.192034986373989770, +0.191985916729955350, 0.191936846605956110, 0.191887776002114320, 0.191838704918553540, 0.191789633355396010, 0.191740561312764350, 0.191691488790780880, 0.191642415789569140, +0.191593342309251350, 0.191544268349950170, 0.191495193911787930, 0.191446118994888110, 0.191397043599373010, 0.191347967725364860, 0.191298891372987220, 0.191249814542362370, +0.191200737233612970, 0.191151659446861300, 0.191102581182230890, 0.191053502439844060, 0.191004423219823440, 0.190955343522291380, 0.190906263347371350, 0.190857182695185670, +0.190808101565857040, 0.190759019959507730, 0.190709937876261280, 0.190660855316240020, 0.190611772279566600, 0.190562688766363310, 0.190513604776753750, 0.190464520310860170, +0.190415435368804840, 0.190366349950711390, 0.190317264056702020, 0.190268177686899520, 0.190219090841426130, 0.190170003520405470, 0.190120915723959780, 0.190071827452211820, +0.190022738705283830, 0.189973649483299450, 0.189924559786380930, 0.189875469614651020, 0.189826378968231980, 0.189777287847247460, 0.189728196251819720, 0.189679104182071460, +0.189630011638125040, 0.189580918620103980, 0.189531825128130660, 0.189482731162327330, 0.189433636722817630, 0.189384541809723810, 0.189335446423168630, 0.189286350563274420, +0.189237254230164770, 0.189188157423961970, 0.189139060144788790, 0.189089962392767510, 0.189040864168021770, 0.188991765470673870, 0.188942666300846550, 0.188893566658662140, +0.188844466544244220, 0.188795365957715180, 0.188746264899197690, 0.188697163368814120, 0.188648061366688050, 0.188598958892941840, 0.188549855947697830, 0.188500752531079590, +0.188451648643209460, 0.188402544284210220, 0.188353439454204190, 0.188304334153314960, 0.188255228381664920, 0.188206122139376820, 0.188157015426572980, 0.188107908243377030, +0.188058800589911280, 0.188009692466298560, 0.187960583872661180, 0.187911474809122760, 0.187862365275805660, 0.187813255272832660, 0.187764144800326050, 0.187715033858409540, +0.187665922447205450, 0.187616810566836540, 0.187567698217425170, 0.187518585399094990, 0.187469472111968350, 0.187420358356167600, 0.187371244131816380, 0.187322129439037060, +0.187273014277952400, 0.187223898648684770, 0.187174782551357860, 0.187125665986093950, 0.187076548953015900, 0.187027431452246040, 0.186978313483908030, 0.186929195048124250, +0.186880076145017480, 0.186830956774710070, 0.186781836937325720, 0.186732716632986770, 0.186683595861816020, 0.186634474623935870, 0.186585352919469930, 0.186536230748540640, +0.186487108111270340, 0.186437985007782690, 0.186388861438200080, 0.186339737402645310, 0.186290612901240770, 0.186241487934110130, 0.186192362501375770, 0.186143236603160510, +0.186094110239586720, 0.186044983410778080, 0.185995856116856980, 0.185946728357946260, 0.185897600134168280, 0.185848471445646730, 0.185799342292504000, 0.185750212674862910, +0.185701082592845870, 0.185651952046576530, 0.185602821036177340, 0.185553689561770650, 0.185504557623480170, 0.185455425221428300, 0.185406292355737860, 0.185357159026531240, +0.185308025233932190, 0.185258890978063060, 0.185209756259046700, 0.185160621077005540, 0.185111485432063240, 0.185062349324342210, 0.185013212753965340, 0.184964075721054970, +0.184914938225734880, 0.184865800268127430, 0.184816661848355460, 0.184767522966541420, 0.184718383622809010, 0.184669243817280640, 0.184620103550079160, 0.184570962821326980, +0.184521821631147830, 0.184472679979664130, 0.184423537866998300, 0.184374395293274040, 0.184325252258613820, 0.184276108763140460, 0.184226964806976370, 0.184177820390245330, +0.184128675513069750, 0.184079530175572440, 0.184030384377875890, 0.183981238120103830, 0.183932091402378650, 0.183882944224823260, 0.183833796587560050, 0.183784648490712800, +0.183735499934403940, 0.183686350918756320, 0.183637201443892390, 0.183588051509935870, 0.183538901117009270, 0.183489750265234920, 0.183440598954736690, 0.183391447185636940, +0.183342294958058540, 0.183293142272124010, 0.183243989127957030, 0.183194835525680110, 0.183145681465416070, 0.183096526947287400, 0.183047371971417850, 0.182998216537929890, +0.182949060646946350, 0.182899904298589740, 0.182850747492983830, 0.182801590230251030, 0.182752432510514230, 0.182703274333895940, 0.182654115700519900, 0.182604956610508570, +0.182555797063984420, 0.182506637061071200, 0.182457476601891410, 0.182408315686567900, 0.182359154315223180, 0.182309992487980990, 0.182260830204963840, 0.182211667466294610, +0.182162504272095770, 0.182113340622491100, 0.182064176517603090, 0.182015011957554650, 0.181965846942468230, 0.181916681472467620, 0.181867515547675330, 0.181818349168214240, +0.181769182334206830, 0.181720015045776890, 0.181670847303046950, 0.181621679106139440, 0.181572510455178170, 0.181523341350285610, 0.181474171791584700, 0.181425001779197930, +0.181375831313249110, 0.181326660393860690, 0.181277489021155620, 0.181228317195256390, 0.181179144916286810, 0.181129972184369380, 0.181080798999627010, 0.181031625362182170, +0.180982451272158760, 0.180933276729679180, 0.180884101734866440, 0.180834926287842980, 0.180785750388732650, 0.180736574037657970, 0.180687397234741840, 0.180638219980106760, +0.180589042273876590, 0.180539864116173790, 0.180490685507120910, 0.180441506446841760, 0.180392326935458840, 0.180343146973095090, 0.180293966559873040, 0.180244785695916540, +0.180195604381348050, 0.180146422616290550, 0.180097240400866550, 0.180048057735199880, 0.179998874619413080, 0.179949691053629100, 0.179900507037970450, 0.179851322572560950, +0.179802137657523180, 0.179752952292980050, 0.179703766479054090, 0.179654580215869160, 0.179605393503547790, 0.179556206342212480, 0.179507018731987100, 0.179457830672994170, +0.179408642165356680, 0.179359453209197130, 0.179310263804639380, 0.179261073951805990, 0.179211883650819890, 0.179162692901803670, 0.179113501704881130, 0.179064310060174870, +0.179015117967807810, 0.178965925427902520, 0.178916732440582840, 0.178867539005971350, 0.178818345124191010, 0.178769150795364370, 0.178719956019615290, 0.178670760797066310, +0.178621565127840000, 0.178572369012060220, 0.178523172449849500, 0.178473975441330870, 0.178424777986626840, 0.178375580085861320, 0.178326381739156850, 0.178277182946636410, +0.178227983708422600, 0.178178784024639270, 0.178129583895408950, 0.178080383320854680, 0.178031182301099020, 0.177981980836265850, 0.177932778926477710, 0.177883576571857630, +0.177834373772528200, 0.177785170528613230, 0.177735966840235350, 0.177686762707517570, 0.177637558130582430, 0.177588353109553810, 0.177539147644554330, 0.177489941735706560, +0.177440735383134350, 0.177391528586960310, 0.177342321347307460, 0.177293113664298340, 0.177243905538056880, 0.177194696968705680, 0.177145487956367730, 0.177096278501165600, +0.177047068603223220, 0.176997858262663180, 0.176948647479608510, 0.176899436254181750, 0.176850224586506840, 0.176801012476706400, 0.176751799924903390, 0.176702586931220460, +0.176653373495781500, 0.176604159618709120, 0.176554945300125890, 0.176505730540155730, 0.176456515338921260, 0.176407299696545480, 0.176358083613151030, 0.176308867088861810, +0.176259650123800400, 0.176210432718089890, 0.176161214871852850, 0.176111996585213200, 0.176062777858293580, 0.176013558691217010, 0.175964339084106110, 0.175915119037084790, +0.175865898550275650, 0.175816677623801790, 0.175767456257785810, 0.175718234452351600, 0.175669012207621820, 0.175619789523719070, 0.175570566400767290, 0.175521342838889090, +0.175472118838207510, 0.175422894398845230, 0.175373669520926150, 0.175324444204572880, 0.175275218449908480, 0.175225992257055620, 0.175176765626138240, 0.175127538557278920, +0.175078311050600760, 0.175029083106226360, 0.174979854724279710, 0.174930625904883420, 0.174881396648160580, 0.174832166954233810, 0.174782936823227040, 0.174733706255262940, +0.174684475250464130, 0.174635243808954590, 0.174586011930856900, 0.174536779616294210, 0.174487546865389140, 0.174438313678265620, 0.174389080055046330, 0.174339845995854340, +0.174290611500812290, 0.174241376570044150, 0.174192141203672570, 0.174142905401820650, 0.174093669164611030, 0.174044432492167640, 0.173995195384613190, 0.173945957842070760, +0.173896719864662990, 0.173847481452513860, 0.173798242605746030, 0.173749003324482560, 0.173699763608846200, 0.173650523458960840, 0.173601282874949160, 0.173552041856933850, +0.173502800405038880, 0.173453558519386900, 0.173404316200101020, 0.173355073447303910, 0.173305830261119560, 0.173256586641670620, 0.173207342589080240, 0.173158098103471050, +0.173108853184967050, 0.173059607833690930, 0.173010362049765780, 0.172961115833314310, 0.172911869184460470, 0.172862622103326950, 0.172813374590036870, 0.172764126644712940, +0.172714878267479110, 0.172665629458458090, 0.172616380217772560, 0.172567130545546510, 0.172517880441902670, 0.172468629906964100, 0.172419378940853520, 0.172370127543694910, +0.172320875715611000, 0.172271623456724890, 0.172222370767159320, 0.172173117647038220, 0.172123864096484340, 0.172074610115620810, 0.172025355704570310, 0.171976100863456850, +0.171926845592403150, 0.171877589891532350, 0.171828333760967090, 0.171779077200831460, 0.171729820211248160, 0.171680562792339840, 0.171631304944230570, 0.171582046667043020, +0.171532787960900380, 0.171483528825925300, 0.171434269262241870, 0.171385009269972740, 0.171335748849241100, 0.171286488000169630, 0.171237226722882410, 0.171187965017502110, +0.171138702884151890, 0.171089440322954480, 0.171040177334033900, 0.170990913917512890, 0.170941650073514580, 0.170892385802161710, 0.170843121103578330, 0.170793855977887130, +0.170744590425211310, 0.170695324445673560, 0.170646058039397950, 0.170596791206507170, 0.170547523947124000, 0.170498256261372440, 0.170448988149375230, 0.170399719611255580, +0.170350450647136160, 0.170301181257141080, 0.170251911441393040, 0.170202641200015210, 0.170153370533130370, 0.170104099440862520, 0.170054827923334400, 0.170005555980669240, +0.169956283612989760, 0.169907010820419980, 0.169857737603082680, 0.169808463961101050, 0.169759189894597820, 0.169709915403697040, 0.169660640488521470, 0.169611365149193870, +0.169562089385838300, 0.169512813198577500, 0.169463536587534690, 0.169414259552832570, 0.169364982094595250, 0.169315704212945480, 0.169266425908006420, 0.169217147179900880, +0.169167868028752920, 0.169118588454685280, 0.169069308457821170, 0.169020028038283340, 0.168970747196195900, 0.168921465931681590, 0.168872184244863580, 0.168822902135864710, +0.168773619604809020, 0.168724336651819270, 0.168675053277018230, 0.168625769480530010, 0.168576485262477370, 0.168527200622983510, 0.168477915562171200, 0.168428630080164570, +0.168379344177086330, 0.168330057853059740, 0.168280771108207580, 0.168231483942653910, 0.168182196356521540, 0.168132908349933690, 0.168083619923013130, 0.168034331075883950, +0.167985041808668940, 0.167935752121491310, 0.167886462014473880, 0.167837171487740740, 0.167787880541414660, 0.167738589175618460, 0.167689297390476220, 0.167640005186110720, +0.167590712562645210, 0.167541419520202490, 0.167492126058906650, 0.167442832178880510, 0.167393537880247270, 0.167344243163129760, 0.167294948027652070, 0.167245652473937020, +0.167196356502107850, 0.167147060112287330, 0.167097763304599610, 0.167048466079167460, 0.166999168436114150, 0.166949870375562500, 0.166900571897636600, 0.166851273002459280, +0.166801973690153760, 0.166752673960842900, 0.166703373814650780, 0.166654073251700200, 0.166604772272114010, 0.166555470876016350, 0.166506169063530000, 0.166456866834778230, +0.166407564189883840, 0.166358261128970980, 0.166308957652162470, 0.166259653759581570, 0.166210349451351100, 0.166161044727595210, 0.166111739588436700, 0.166062434033998810, +0.166013128064404440, 0.165963821679777660, 0.165914514880241340, 0.165865207665918720, 0.165815900036932640, 0.165766591993407260, 0.165717283535465390, 0.165667974663229880, +0.165618665376824880, 0.165569355676373210, 0.165520045561998150, 0.165470735033822540, 0.165421424091970530, 0.165372112736564960, 0.165322800967729110, 0.165273488785585810, +0.165224176190259230, 0.165174863181872220, 0.165125549760548020, 0.165076235926409550, 0.165026921679580910, 0.164977607020184960, 0.164928291948344990, 0.164878976464183870, +0.164829660567825750, 0.164780344259393450, 0.164731027539009870, 0.164681710406799160, 0.164632392862884170, 0.164583074907388190, 0.164533756540434090, 0.164484437762146050, +0.164435118572646920, 0.164385798972059960, 0.164336478960508100, 0.164287158538115460, 0.164237837705004910, 0.164188516461299810, 0.164139194807122940, 0.164089872742598540, +0.164040550267849440, 0.163991227382998980, 0.163941904088170030, 0.163892580383486720, 0.163843256269072010, 0.163793931745049110, 0.163744606811540960, 0.163695281468671740, +0.163645955716564320, 0.163596629555341540, 0.163547302985127650, 0.163497976006045510, 0.163448648618218420, 0.163399320821769280, 0.163349992616822260, 0.163300664003500270, +0.163251334981926590, 0.163202005552224170, 0.163152675714517160, 0.163103345468928460, 0.163054014815581410, 0.163004683754598870, 0.162955352286105050, 0.162906020410222870, +0.162856688127075660, 0.162807355436786260, 0.162758022339478890, 0.162708688835276500, 0.162659354924301950, 0.162610020606679420, 0.162560685882531860, 0.162511350751982590, +0.162462015215154490, 0.162412679272171790, 0.162363342923157410, 0.162314006168234660, 0.162264669007526450, 0.162215331441157020, 0.162165993469249260, 0.162116655091926520, +0.162067316309311700, 0.162017977121529020, 0.161968637528701390, 0.161919297530952190, 0.161869957128404300, 0.161820616321181940, 0.161771275109408060, 0.161721933493205540, +0.161672591472698630, 0.161623249048010230, 0.161573906219263740, 0.161524562986582020, 0.161475219350089320, 0.161425875309908600, 0.161376530866163190, 0.161327186018976000, +0.161277840768471260, 0.161228495114771970, 0.161179149058001400, 0.161129802598282550, 0.161080455735739620, 0.161031108470495540, 0.160981760802673710, 0.160932412732397030, +0.160883064259789740, 0.160833715384974820, 0.160784366108075590, 0.160735016429215010, 0.160685666348517330, 0.160636315866105470, 0.160586964982102400, 0.160537613696632360, +0.160488262009818280, 0.160438909921783530, 0.160389557432651100, 0.160340204542545190, 0.160290851251588760, 0.160241497559905220, 0.160192143467617480, 0.160142788974849850, +0.160093434081725220, 0.160044078788367020, 0.159994723094898180, 0.159945367001442960, 0.159896010508124350, 0.159846653615065700, 0.159797296322389950, 0.159747938630221440, +0.159698580538683050, 0.159649222047897800, 0.159599863157989910, 0.159550503869082370, 0.159501144181298570, 0.159451784094761490, 0.159402423609595360, 0.159353062725923200, +0.159303701443868350, 0.159254339763553830, 0.159204977685103890, 0.159155615208641520, 0.159106252334290100, 0.159056889062172610, 0.159007525392413330, 0.158958161325135240, +0.158908796860461750, 0.158859431998515820, 0.158810066739421770, 0.158760701083302540, 0.158711335030281120, 0.158661968580481820, 0.158612601734027580, 0.158563234491041820, +0.158513866851647560, 0.158464498815969050, 0.158415130384129330, 0.158365761556251760, 0.158316392332459340, 0.158267022712876380, 0.158217652697625860, 0.158168282286831220, +0.158118911480615440, 0.158069540279102800, 0.158020168682416330, 0.157970796690679430, 0.157921424304015120, 0.157872051522547660, 0.157822678346400070, 0.157773304775695370, +0.157723930810557830, 0.157674556451110480, 0.157625181697476720, 0.157575806549779570, 0.157526431008143340, 0.157477055072691020, 0.157427678743546100, 0.157378302020831500, +0.157328924904671620, 0.157279547395189400, 0.157230169492508340, 0.157180791196751410, 0.157131412508042940, 0.157082033426505920, 0.157032653952263850, 0.156983274085439660, +0.156933893826157770, 0.156884513174541110, 0.156835132130713180, 0.156785750694797000, 0.156736368866916860, 0.156686986647195800, 0.156637604035756860, 0.156588221032724320, +0.156538837638221240, 0.156489453852371040, 0.156440069675296810, 0.156390685107122810, 0.156341300147972100, 0.156291914797968170, 0.156242529057233990, 0.156193142925893920, +0.156143756404070990, 0.156094369491888710, 0.156044982189470020, 0.155995594496939340, 0.155946206414419670, 0.155896817942034470, 0.155847429079906810, 0.155798039828160980, +0.155748650186920080, 0.155699260156307110, 0.155649869736446430, 0.155600478927461090, 0.155551087729474540, 0.155501696142609810, 0.155452304166991300, 0.155402911802742040, +0.155353519049985480, 0.155304125908844680, 0.155254732379444040, 0.155205338461906540, 0.155155944156355700, 0.155106549462914550, 0.155057154381707470, 0.155007758912857510, +0.154958363056488160, 0.154908966812722450, 0.154859570181684750, 0.154810173163498150, 0.154760775758285670, 0.154711377966171680, 0.154661979787279270, 0.154612581221731880, +0.154563182269652630, 0.154513782931165830, 0.154464383206394610, 0.154414983095462390, 0.154365582598492310, 0.154316181715608680, 0.154266780446934620, 0.154217378792593620, +0.154167976752708710, 0.154118574327404310, 0.154069171516803470, 0.154019768321029680, 0.153970364740206060, 0.153920960774456940, 0.153871556423905430, 0.153822151688675050, +0.153772746568888840, 0.153723341064671200, 0.153673935176145190, 0.153624528903433920, 0.153575122246661780, 0.153525715205951820, 0.153476307781427570, 0.153426899973212100, +0.153377491781429840, 0.153328083206203840, 0.153278674247657650, 0.153229264905914320, 0.153179855181098250, 0.153130445073332570, 0.153081034582740750, 0.153031623709445920, +0.152982212453572490, 0.152932800815243490, 0.152883388794582520, 0.152833976391712620, 0.152784563606758240, 0.152735150439842430, 0.152685736891088300, 0.152636322960620300, +0.152586908648561480, 0.152537493955035350, 0.152488078880165080, 0.152438663424075050, 0.152389247586888380, 0.152339831368728560, 0.152290414769718720, 0.152240997789983320, +0.152191580429645400, 0.152142162688828520, 0.152092744567655810, 0.152043326066251680, 0.151993907184739210, 0.151944487923242000, 0.151895068281883120, 0.151845648260787000, +0.151796227860076770, 0.151746807079875530, 0.151697385920307710, 0.151647964381496410, 0.151598542463565220, 0.151549120166637240, 0.151499697490836890, 0.151450274436287280, +0.151400851003112010, 0.151351427191434160, 0.151302003001378190, 0.151252578433067190, 0.151203153486624780, 0.151153728162174010, 0.151104302459839380, 0.151054876379743990, +0.151005449922011430, 0.150956023086764780, 0.150906595874128520, 0.150857168284225770, 0.150807740317179640, 0.150758311973114620, 0.150708883252153810, 0.150659454154420810, +0.150610024680038730, 0.150560594829132010, 0.150511164601823820, 0.150461733998237700, 0.150412303018496840, 0.150362871662725630, 0.150313439931047260, 0.150264007823585260, +0.150214575340462840, 0.150165142481804400, 0.150115709247733100, 0.150066275638372550, 0.150016841653845850, 0.149967407294277490, 0.149917972559790610, 0.149868537450508820, +0.149819101966555210, 0.149769666108054310, 0.149720229875129230, 0.149670793267903170, 0.149621356286500530, 0.149571918931044520, 0.149522481201658700, 0.149473043098466240, +0.149423604621591600, 0.149374165771157970, 0.149324726547288900, 0.149275286950107610, 0.149225846979738510, 0.149176406636304800, 0.149126965919930080, 0.149077524830737520, +0.149028083368851570, 0.148978641534395410, 0.148929199327492660, 0.148879756748266450, 0.148830313796841310, 0.148780870473340380, 0.148731426777886810, 0.148681982710605150, +0.148632538271618510, 0.148583093461050530, 0.148533648279024380, 0.148484202725664540, 0.148434756801094190, 0.148385310505436960, 0.148335863838816030, 0.148286416801355850, +0.148236969393179650, 0.148187521614411010, 0.148138073465173130, 0.148088624945590520, 0.148039176055786340, 0.147989726795884210, 0.147940277166007330, 0.147890827166280190, +0.147841376796825990, 0.147791926057767920, 0.147742474949230460, 0.147693023471336810, 0.147643571624210600, 0.147594119407975040, 0.147544666822754610, 0.147495213868672510, +0.147445760545852370, 0.147396306854417400, 0.147346852794492110, 0.147297398366199680, 0.147247943569663750, 0.147198488405007520, 0.147149032872355510, 0.147099576971830900, +0.147050120703557390, 0.147000664067658100, 0.146951207064257630, 0.146901749693479110, 0.146852291955446220, 0.146802833850282170, 0.146753375378111450, 0.146703916539057320, +0.146654457333242950, 0.146604997760792890, 0.146555537821830310, 0.146506077516478900, 0.146456616844861860, 0.146407155807103700, 0.146357694403327660, 0.146308232633657390, +0.146258770498216090, 0.146209307997128310, 0.146159845130517270, 0.146110381898506610, 0.146060918301219530, 0.146011454338780630, 0.145961990011313080, 0.145912525318940560, +0.145863060261786280, 0.145813594839974770, 0.145764129053629320, 0.145714662902873080, 0.145665196387830630, 0.145615729508625170, 0.145566262265380410, 0.145516794658219540, +0.145467326687267110, 0.145417858352646400, 0.145368389654481010, 0.145318920592894220, 0.145269451168010570, 0.145219981379953320, 0.145170511228846080, 0.145121040714812130, +0.145071569837976010, 0.145022098598460990, 0.144972626996390690, 0.144923155031888410, 0.144873682705078670, 0.144824210016084730, 0.144774736965029820, 0.144725263552038520, +0.144675789777234030, 0.144626315640740110, 0.144576841142679910, 0.144527366283178080, 0.144477891062357840, 0.144428415480342850, 0.144378939537256390, 0.144329463233223040, +0.144279986568365990, 0.144230509542809030, 0.144181032156675300, 0.144131554410089460, 0.144082076303174740, 0.144032597836054820, 0.143983119008852970, 0.143933639821693740, +0.143884160274700440, 0.143834680367996260, 0.143785200101705870, 0.143735719475952460, 0.143686238490859740, 0.143636757146551000, 0.143587275443150780, 0.143537793380782400, +0.143488310959569510, 0.143438828179635440, 0.143389345041104700, 0.143339861544100610, 0.143290377688746890, 0.143240893475166750, 0.143191408903484830, 0.143141923973824410, +0.143092438686309160, 0.143042953041062380, 0.142993467038208640, 0.142943980677871260, 0.142894493960173900, 0.142845006885239880, 0.142795519453193800, 0.142746031664158890, +0.142696543518258470, 0.142647055015617140, 0.142597566156358160, 0.142548076940605280, 0.142498587368481760, 0.142449097440112220, 0.142399607155619920, 0.142350116515128610, +0.142300625518761580, 0.142251134166643390, 0.142201642458897410, 0.142152150395647300, 0.142102657977016380, 0.142053165203129240, 0.142003672074109220, 0.141954178590080000, +0.141904684751164880, 0.141855190557488520, 0.141805696009174170, 0.141756201106345130, 0.141706705849126040, 0.141657210237640160, 0.141607714272011270, 0.141558217952362670, +0.141508721278818940, 0.141459224251503420, 0.141409726870539850, 0.141360229136051510, 0.141310731048163050, 0.141261232606997740, 0.141211733812679370, 0.141162234665331200, +0.141112735165077910, 0.141063235312042760, 0.141013735106349540, 0.140964234548121540, 0.140914733637483390, 0.140865232374558390, 0.140815730759469900, 0.140766228792342520, +0.140716726473299550, 0.140667223802464770, 0.140617720779961490, 0.140568217405914350, 0.140518713680446660, 0.140469209603682200, 0.140419705175744260, 0.140370200396757490, +0.140320695266845240, 0.140271189786131230, 0.140221683954738830, 0.140172177772792640, 0.140122671240416020, 0.140073164357732730, 0.140023657124866090, 0.139974149541940730, +0.139924641609080000, 0.139875133326407660, 0.139825624694047050, 0.139776115712122840, 0.139726606380758320, 0.139677096700076830, 0.139627586670203060, 0.139578076291260320, +0.139528565563372400, 0.139479054486662590, 0.139429543061255630, 0.139380031287274770, 0.139330519164843870, 0.139281006694086220, 0.139231493875126480, 0.139181980708088020, +0.139132467193094580, 0.139082953330269570, 0.139033439119737590, 0.138983924561622040, 0.138934409656046640, 0.138884894403134810, 0.138835378803011170, 0.138785862855799080, +0.138736346561621900, 0.138686829920604300, 0.138637312932869600, 0.138587795598541650, 0.138538277917743760, 0.138488759890600580, 0.138439241517235550, 0.138389722797772400, +0.138340203732334490, 0.138290684321046520, 0.138241164564031850, 0.138191644461414240, 0.138142124013317100, 0.138092603219865110, 0.138043082081181570, 0.137993560597390350, +0.137944038768614770, 0.137894516594979560, 0.137844994076608050, 0.137795471213623590, 0.137745948006150920, 0.137696424454313380, 0.137646900558234780, 0.137597376318038480, +0.137547851733849170, 0.137498326805790240, 0.137448801533985500, 0.137399275918558300, 0.137349749959633370, 0.137300223657334050, 0.137250697011784160, 0.137201170023107110, +0.137151642691427570, 0.137102115016868920, 0.137052586999554970, 0.137003058639609130, 0.136953529937156090, 0.136904000892319220, 0.136854471505221900, 0.136804941775988840, +0.136755411704743420, 0.136705881291609490, 0.136656350536710410, 0.136606819440170890, 0.136557288002114310, 0.136507756222664530, 0.136458224101944910, 0.136408691640080180, +0.136359158837193710, 0.136309625693409350, 0.136260092208850490, 0.136210558383641820, 0.136161024217906770, 0.136111489711769150, 0.136061954865352360, 0.136012419678781140, +0.135962884152178860, 0.135913348285669390, 0.135863812079376090, 0.135814275533423710, 0.135764738647935620, 0.135715201423035250, 0.135665663858847350, 0.135616125955495240, +0.135566587713102840, 0.135517049131793550, 0.135467510211692040, 0.135417970952921800, 0.135368431355606580, 0.135318891419869890, 0.135269351145836380, 0.135219810533629500, +0.135170269583373080, 0.135120728295190560, 0.135071186669206670, 0.135021644705544810, 0.134972102404328830, 0.134922559765682150, 0.134873016789729520, 0.134823473476594350, +0.134773929826400050, 0.134724385839271350, 0.134674841515331710, 0.134625296854704950, 0.134575751857514530, 0.134526206523885140, 0.134476660853940250, 0.134427114847803730, +0.134377568505598950, 0.134328021827450710, 0.134278474813482400, 0.134228927463817900, 0.134179379778580660, 0.134129831757895390, 0.134080283401885550, 0.134030734710675000, +0.133981185684387190, 0.133931636323146840, 0.133882086627077400, 0.133832536596302320, 0.133782986230946310, 0.133733435531132840, 0.133683884496985790, 0.133634333128628600, +0.133584781426185990, 0.133535229389781460, 0.133485677019538840, 0.133436124315581580, 0.133386571278034440, 0.133337017907020900, 0.133287464202664800, 0.133237910165089600, +0.133188355794420070, 0.133138801090779630, 0.133089246054292200, 0.133039690685081230, 0.132990134983271470, 0.132940578948986370, 0.132891022582349800, 0.132841465883485250, +0.132791908852517490, 0.132742351489569950, 0.132692793794766090, 0.132643235768230670, 0.132593677410087180, 0.132544118720459490, 0.132494559699471050, 0.132445000347246660, +0.132395440663909790, 0.132345880649584300, 0.132296320304393670, 0.132246759628462660, 0.132197198621914790, 0.132147637284873890, 0.132098075617463480, 0.132048513619808290, +0.131998951292031850, 0.131949388634258010, 0.131899825646610260, 0.131850262329213400, 0.131800698682190880, 0.131751134705666180, 0.131701570399764070, 0.131652005764608030, +0.131602440800321990, 0.131552875507029400, 0.131503309884855060, 0.131453743933922450, 0.131404177654355470, 0.131354611046277630, 0.131305044109813700, 0.131255476845087120, +0.131205909252221890, 0.131156341331341440, 0.131106773082570540, 0.131057204506032750, 0.131007635601851940, 0.130958066370151590, 0.130908496811056510, 0.130858926924690200, +0.130809356711176130, 0.130759786170639130, 0.130710215303202620, 0.130660644108990610, 0.130611072588126540, 0.130561500740735220, 0.130511928566940160, 0.130462356066865260, +0.130412783240634040, 0.130363210088371290, 0.130313636610200540, 0.130264062806245700, 0.130214488676630240, 0.130164914221478990, 0.130115339440915500, 0.130065764335063620, +0.130016188904046900, 0.129966613147990160, 0.129917037067016880, 0.129867460661250540, 0.129817883930816030, 0.129768306875836790, 0.129718729496436790, 0.129669151792739520, +0.129619573764869820, 0.129569995412951170, 0.129520416737107540, 0.129470837737462430, 0.129421258414140680, 0.129371678767265770, 0.129322098796961660, 0.129272518503351860, +0.129222937886561200, 0.129173356946713200, 0.129123775683931820, 0.129074194098340560, 0.129024612190064230, 0.128975029959226380, 0.128925447405950970, 0.128875864530361510, +0.128826281332582810, 0.128776697812738400, 0.128727113970951820, 0.128677529807347900, 0.128627945322050130, 0.128578360515182510, 0.128528775386868550, 0.128479189937233090, +0.128429604166399670, 0.128380018074492230, 0.128330431661634300, 0.128280844927950720, 0.128231257873565040, 0.128181670498601210, 0.128132082803182780, 0.128082494787434580, +0.128032906451480130, 0.127983317795443420, 0.127933728819447980, 0.127884139523618660, 0.127834549908078960, 0.127784959972952500, 0.127735369718364050, 0.127685779144437160, +0.127636188251295830, 0.127586597039063610, 0.127537005507865310, 0.127487413657824540, 0.127437821489065180, 0.127388229001710870, 0.127338636195886420, 0.127289043071715370, +0.127239449629321710, 0.127189855868828970, 0.127140261790362060, 0.127090667394044480, 0.127041072680000260, 0.126991477648352890, 0.126941882299227260, 0.126892286632746930, +0.126842690649035440, 0.126793094348217700, 0.126743497730417180, 0.126693900795757930, 0.126644303544363510, 0.126594705976358750, 0.126545108091867230, 0.126495509891012940, +0.126445911373919420, 0.126396312540711570, 0.126346713391512930, 0.126297113926447550, 0.126247514145638890, 0.126197914049211910, 0.126148313637290150, 0.126098712909997610, +0.126049111867457820, 0.125999510509795710, 0.125949908837134830, 0.125900306849599160, 0.125850704547312290, 0.125801101930399120, 0.125751498998983160, 0.125701895753188050, +0.125652292193138610, 0.125602688318958460, 0.125553084130771570, 0.125503479628701540, 0.125453874812873230, 0.125404269683410260, 0.125354664240436620, 0.125305058484075860, +0.125255452414452910, 0.125205846031691330, 0.125156239335915100, 0.125106632327247860, 0.125057025005814480, 0.125007417371738540, 0.124957809425144050, 0.124908201166154600, +0.124858592594895080, 0.124808983711489090, 0.124759374516060190, 0.124709765008733290, 0.124660155189632000, 0.124610545058880310, 0.124560934616601810, 0.124511323862921410, +0.124461712797962710, 0.124412101421849730, 0.124362489734706050, 0.124312877736656590, 0.124263265427824940, 0.124213652808335110, 0.124164039878310720, 0.124114426637876680, +0.124064813087156560, 0.124015199226274410, 0.123965585055353820, 0.123915970574519710, 0.123866355783895680, 0.123816740683605310, 0.123767125273773540, 0.123717509554523940, +0.123667893525980580, 0.123618277188267040, 0.123568660541508250, 0.123519043585827810, 0.123469426321349760, 0.123419808748197690, 0.123370190866496560, 0.123320572676369940, +0.123270954177941900, 0.123221335371336020, 0.123171716256677250, 0.123122096834089190, 0.123072477103695880, 0.123022857065620950, 0.122973236719989300, 0.122923616066924580, +0.122873995106550370, 0.122824373838991610, 0.122774752264371910, 0.122725130382815340, 0.122675508194445500, 0.122625885699387330, 0.122576262897764450, 0.122526639789700910, +0.122477016375320320, 0.122427392654747640, 0.122377768628106480, 0.122328144295520900, 0.122278519657114500, 0.122228894713012260, 0.122179269463337780, 0.122129643908215120, +0.122080018047767930, 0.122030391882121110, 0.121980765411398320, 0.121931138635723620, 0.121881511555220630, 0.121831884170014300, 0.121782256480228270, 0.121732628485986150, +0.121683000187412890, 0.121633371584632140, 0.121583742677767960, 0.121534113466943980, 0.121484483952285160, 0.121434854133915140, 0.121385224011957960, 0.121335593586537300, +0.121285962857778100, 0.121236331825803980, 0.121186700490739030, 0.121137068852706890, 0.121087436911832520, 0.121037804668239560, 0.120988172122052100, 0.120938539273393750, +0.120888906122389490, 0.120839272669162970, 0.120789638913837840, 0.120740004856539050, 0.120690370497390230, 0.120640735836515510, 0.120591100874038490, 0.120541465610084160, +0.120491830044776180, 0.120442194178238610, 0.120392558010595120, 0.120342921541970680, 0.120293284772488930, 0.120243647702273970, 0.120194010331449460, 0.120144372660140340, +0.120094734688470300, 0.120045096416563440, 0.119995457844543380, 0.119945818972535120, 0.119896179800662320, 0.119846540329048620, 0.119796900557819010, 0.119747260487097150, +0.119697620117007140, 0.119647979447672640, 0.119598338479218640, 0.119548697211768780, 0.119499055645447190, 0.119449413780377500, 0.119399771616684730, 0.119350129154492540, +0.119300486393925010, 0.119250843335105840, 0.119201199978159990, 0.119151556323211140, 0.119101912370383410, 0.119052268119800450, 0.119002623571587270, 0.118952978725867520, +0.118903333582765320, 0.118853688142404350, 0.118804042404909600, 0.118754396370404750, 0.118704750039013470, 0.118655103410860750, 0.118605456486070270, 0.118555809264766150, +0.118506161747072070, 0.118456513933113020, 0.118406865823012690, 0.118357217416895190, 0.118307568714884210, 0.118257919717104750, 0.118208270423680480, 0.118158620834735550, +0.118108970950393620, 0.118059320770779710, 0.118009670296017490, 0.117960019526231100, 0.117910368461544220, 0.117860717102081850, 0.117811065447967700, 0.117761413499325440, +0.117711761256280080, 0.117662108718955330, 0.117612455887475290, 0.117562802761963690, 0.117513149342545520, 0.117463495629344470, 0.117413841622484680, 0.117364187322089850, +0.117314532728284990, 0.117264877841193800, 0.117215222660940420, 0.117165567187648530, 0.117115911421443180, 0.117066255362448040, 0.117016599010787260, 0.116966942366584540, +0.116917285429964910, 0.116867628201052070, 0.116817970679969710, 0.116768312866842870, 0.116718654761795260, 0.116668996364951000, 0.116619337676433800, 0.116569678696368710, +0.116520019424879410, 0.116470359862090080, 0.116420700008124390, 0.116371039863107400, 0.116321379427162820, 0.116271718700414780, 0.116222057682987000, 0.116172396375004520, +0.116122734776591060, 0.116073072887870750, 0.116023410708967320, 0.115973748240005810, 0.115924085481109930, 0.115874422432403380, 0.115824759094011230, 0.115775095466057170, +0.115725431548665380, 0.115675767341959570, 0.115626102846064780, 0.115576438061104740, 0.115526772987203600, 0.115477107624485080, 0.115427441973074240, 0.115377776033094790, +0.115328109804670910, 0.115278443287926300, 0.115228776482986050, 0.115179109389973830, 0.115129442009013840, 0.115079774340229810, 0.115030106383746790, 0.114980438139688500, +0.114930769608179120, 0.114881100789342370, 0.114831431683303300, 0.114781762290185660, 0.114732092610113180, 0.114682422643210890, 0.114632752389602560, 0.114583081849412350, +0.114533411022763990, 0.114483739909782540, 0.114434068510591740, 0.114384396825315770, 0.114334724854078380, 0.114285052597004600, 0.114235380054218200, 0.114185707225843340, +0.114136034112003780, 0.114086360712824570, 0.114036687028429460, 0.113987013058942630, 0.113937338804487840, 0.113887664265190130, 0.113837989441173270, 0.113788314332560980, +0.113738638939478360, 0.113688963262049140, 0.113639287300397500, 0.113589611054647210, 0.113539934524923340, 0.113490257711349620, 0.113440580614050250, 0.113390903233149020, +0.113341225568770940, 0.113291547621039810, 0.113241869390079810, 0.113192190876014700, 0.113142512078969550, 0.113092832999068110, 0.113043153636434610, 0.112993473991192760, +0.112943794063467690, 0.112894113853383120, 0.112844433361062830, 0.112794752586631890, 0.112745071530214070, 0.112695390191933570, 0.112645708571914170, 0.112596026670280930, +0.112546344487157610, 0.112496662022668450, 0.112446979276937180, 0.112397296250088900, 0.112347612942247390, 0.112297929353536840, 0.112248245484081040, 0.112198561334005050, +0.112148876903432670, 0.112099192192488100, 0.112049507201295080, 0.111999821929978760, 0.111950136378662880, 0.111900450547471660, 0.111850764436528870, 0.111801078045959610, +0.111751391375887660, 0.111701704426436790, 0.111652017197732090, 0.111602329689897350, 0.111552641903056790, 0.111502953837334190, 0.111453265492854630, 0.111403576869741920, +0.111353887968120260, 0.111304198788113440, 0.111254509329846570, 0.111204819593443430, 0.111155129579028230, 0.111105439286724770, 0.111055748716658160, 0.111006057868952170, +0.110956366743731040, 0.110906675341118550, 0.110856983661239810, 0.110807291704218600, 0.110757599470178740, 0.110707906959245320, 0.110658214171542120, 0.110608521107193390, +0.110558827766322920, 0.110509134149055820, 0.110459440255515880, 0.110409746085827350, 0.110360051640114000, 0.110310356918500970, 0.110260661921112040, 0.110210966648071480, +0.110161271099503040, 0.110111575275531860, 0.110061879176281750, 0.110012182801876950, 0.109962486152441240, 0.109912789228099760, 0.109863092028976300, 0.109813394555194690, +0.109763696806880020, 0.109713998784156110, 0.109664300487147200, 0.109614601915977090, 0.109564903070770940, 0.109515203951652510, 0.109465504558746080, 0.109415804892175450, +0.109366104952065740, 0.109316404738540780, 0.109266704251724800, 0.109217003491741610, 0.109167302458716360, 0.109117601152772860, 0.109067899574035360, 0.109018197722627650, +0.108968495598674900, 0.108918793202300910, 0.108869090533629500, 0.108819387592785810, 0.108769684379893640, 0.108719980895077260, 0.108670277138460490, 0.108620573110168470, +0.108570868810325000, 0.108521164239054380, 0.108471459396480400, 0.108421754282728210, 0.108372048897921640, 0.108322343242184940, 0.108272637315641950, 0.108222931118417810, +0.108173224650636330, 0.108123517912421790, 0.108073810903898020, 0.108024103625190170, 0.107974396076422050, 0.107924688257717950, 0.107874980169201680, 0.107825271810998390, +0.107775563183231950, 0.107725854286026130, 0.107676145119506140, 0.107626435683795780, 0.107576725979019320, 0.107527016005300610, 0.107477305762764800, 0.107427595251535740, +0.107377884471737670, 0.107328173423494460, 0.107278462106931260, 0.107228750522171900, 0.107179038669340660, 0.107129326548561390, 0.107079614159959240, 0.107029901503658060, +0.106980188579782120, 0.106930475388455270, 0.106880761929802670, 0.106831048203948160, 0.106781334211015600, 0.106731619951130150, 0.106681905424415640, 0.106632190630996370, +0.106582475570996180, 0.106532760244540240, 0.106483044651752400, 0.106433328792756950, 0.106383612667677730, 0.106333896276639940, 0.106284179619767400, 0.106234462697184410, +0.106184745509014810, 0.106135028055383800, 0.106085310336415220, 0.106035592352233370, 0.105985874102962080, 0.105936155588726560, 0.105886436809650640, 0.105836717765858190, +0.105786998457474400, 0.105737278884623100, 0.105687559047428600, 0.105637838946014780, 0.105588118580506790, 0.105538397951028500, 0.105488677057704220, 0.105438955900657810, +0.105389234480014440, 0.105339512795898000, 0.105289790848432780, 0.105240068637742630, 0.105190346163952740, 0.105140623427187000, 0.105090900427569700, 0.105041177165224710, +0.104991453640277200, 0.104941729852851080, 0.104892005803070620, 0.104842281491059720, 0.104792556916943540, 0.104742832080845980, 0.104693106982890890, 0.104643381623203480, +0.104593656001907610, 0.104543930119127600, 0.104494203974987330, 0.104444477569611990, 0.104394750903125460, 0.104345023975652040, 0.104295296787315630, 0.104245569338241420, +0.104195841628553280, 0.104146113658375530, 0.104096385427832070, 0.104046656937048080, 0.103996928186147450, 0.103947199175254500, 0.103897469904493110, 0.103847740373988490, +0.103798010583864510, 0.103748280534245060, 0.103698550225255360, 0.103648819657019280, 0.103599088829661150, 0.103549357743304860, 0.103499626398075630, 0.103449894794097300, +0.103400162931494260, 0.103350430810390370, 0.103300698430910830, 0.103250965793179560, 0.103201232897320860, 0.103151499743458650, 0.103101766331718120, 0.103052032662223190, +0.103002298735098170, 0.102952564550466960, 0.102902830108454790, 0.102853095409185520, 0.102803360452783100, 0.102753625239372700, 0.102703889769078250, 0.102654154042024060, +0.102604418058334060, 0.102554681818133440, 0.102504945321546140, 0.102455208568696460, 0.102405471559708310, 0.102355734294706930, 0.102305996773816220, 0.102256258997160510, +0.102206520964863710, 0.102156782677051060, 0.102107044133846440, 0.102057305335374230, 0.102007566281758290, 0.101957826973123890, 0.101908087409594920, 0.101858347591295740, +0.101808607518350230, 0.101758867190883660, 0.101709126609019910, 0.101659385772882920, 0.101609644682597890, 0.101559903338288770, 0.101510161740079860, 0.101460419888095120, +0.101410677782459780, 0.101360935423297730, 0.101311192810733350, 0.101261449944890540, 0.101211706825894560, 0.101161963453869310, 0.101112219828939140, 0.101062475951227980, +0.101012731820861080, 0.100962987437962350, 0.100913242802656150, 0.100863497915066410, 0.100813752775318340, 0.100764007383535910, 0.100714261739843020, 0.100664515844364910, +0.100614769697225520, 0.100565023298549190, 0.100515276648459870, 0.100465529747082810, 0.100415782594541910, 0.100366035190961560, 0.100316287536465680, 0.100266539631179510, +0.100216791475227010, 0.100167043068732530, 0.100117294411819990, 0.100067545504614660, 0.100017796347240460, 0.099968046939821781, 0.099918297282482541, 0.099868547375348005, +0.099818797218542088, 0.099769046812188733, 0.099719296156413215, 0.099669545251339448, 0.099619794097091832, 0.099570042693794270, 0.099520291041572048, 0.099470539140549111, +0.099420786990849816, 0.099371034592598120, 0.099321281945919271, 0.099271529050937210, 0.099221775907776338, 0.099172022516560585, 0.099122268877415209, 0.099072514990464169, +0.099022760855831837, 0.098973006473642169, 0.098923251844020413, 0.098873496967090538, 0.098823741842976473, 0.098773986471803507, 0.098724230853695569, 0.098674474988777044, +0.098624718877171905, 0.098574962519005396, 0.098525205914401490, 0.098475449063484558, 0.098425691966378570, 0.098375934623208802, 0.098326177034099183, 0.098276419199174125, +0.098226661118557587, 0.098176902792374829, 0.098127144220749821, 0.098077385403806949, 0.098027626341670171, 0.097977867034464761, 0.097928107482314689, 0.097878347685344355, +0.097828587643677703, 0.097778827357440035, 0.097729066826755279, 0.097679306051747433, 0.097629545032541759, 0.097579783769262213, 0.097530022262033209, 0.097480260510978717, +0.097430498516224012, 0.097380736277893065, 0.097330973796110262, 0.097281211070999601, 0.097231448102686344, 0.097181684891294473, 0.097131921436948376, 0.097082157739772051, +0.097032393799890759, 0.096982629617428498, 0.096932865192509654, 0.096883100525258198, 0.096833335615799446, 0.096783570464257340, 0.096733805070755879, 0.096684039435420352, +0.096634273558374714, 0.096584507439743394, 0.096534741079650363, 0.096484974478220922, 0.096435207635579057, 0.096385440551849152, 0.096335673227155222, 0.096285905661622539, +0.096236137855375103, 0.096186369808537314, 0.096136601521233156, 0.096086832993587945, 0.096037064225725638, 0.095987295217770691, 0.095937525969847046, 0.095887756482080033, +0.095837986754593638, 0.095788216787511829, 0.095738446580959910, 0.095688676135061879, 0.095638905449942163, 0.095589134525724748, 0.095539363362534921, 0.095489591960496695, +0.095439820319734497, 0.095390048440372299, 0.095340276322535417, 0.095290503966347848, 0.095240731371934020, 0.095190958539417919, 0.095141185468924860, 0.095091412160578856, +0.095041638614504306, 0.094991864830825223, 0.094942090809666910, 0.094892316551153377, 0.094842542055409054, 0.094792767322557939, 0.094742992352725333, 0.094693217146035263, +0.094643441702611700, 0.094593666022579972, 0.094543890106064080, 0.094494113953188463, 0.094444337564077122, 0.094394560938855385, 0.094344784077647237, 0.094295006980577134, +0.094245229647769060, 0.094195452079348360, 0.094145674275439031, 0.094095896236165516, 0.094046117961651826, 0.093996339452023278, 0.093946560707403884, 0.093896781727918086, +0.093847002513689881, 0.093797223064844629, 0.093747443381506312, 0.093697663463798944, 0.093647883311847854, 0.093598102925777069, 0.093548322305711015, 0.093498541451773720, +0.093448760364090500, 0.093398979042785393, 0.093349197487982843, 0.093299415699806848, 0.093249633678382751, 0.093199851423834579, 0.093150068936286773, 0.093100286215863359, +0.093050503262689668, 0.093000720076889712, 0.092950936658587974, 0.092901153007908438, 0.092851369124976463, 0.092801585009916060, 0.092751800662851269, 0.092702016083907407, +0.092652231273208499, 0.092602446230879029, 0.092552660957042995, 0.092502875451825742, 0.092453089715351308, 0.092403303747744150, 0.092353517549128294, 0.092303731119629071, +0.092253944459370532, 0.092204157568477135, 0.092154370447072892, 0.092104583095283174, 0.092054795513231993, 0.092005007701043834, 0.091955219658842707, 0.091905431386753972, +0.091855642884901653, 0.091805854153409791, 0.091756065192403730, 0.091706276002007509, 0.091656486582345598, 0.091606696933542037, 0.091556907055722170, 0.091507116949010023, +0.091457326613530107, 0.091407536049406421, 0.091357745256764336, 0.091307954235727878, 0.091258162986421545, 0.091208371508969363, 0.091158579803496689, 0.091108787870127578, +0.091058995708986484, 0.091009203320197463, 0.090959410703885885, 0.090909617860175762, 0.090859824789191607, 0.090810031491057444, 0.090760237965898646, 0.090710444213839253, +0.090660650235003318, 0.090610856029516185, 0.090561061597501921, 0.090511266939084997, 0.090461472054389466, 0.090411676943540686, 0.090361881606662725, 0.090312086043880066, +0.090262290255316735, 0.090212494241098132, 0.090162698001348282, 0.090112901536191697, 0.090063104845752417, 0.090013307930155814, 0.089963510789525941, 0.089913713423987282, +0.089863915833663918, 0.089814118018681194, 0.089764319979163176, 0.089714521715233905, 0.089664723227018781, 0.089614924514641855, 0.089565125578227614, 0.089515326417900110, +0.089465527033784742, 0.089415727426005551, 0.089365927594687047, 0.089316127539953286, 0.089266327261929637, 0.089216526760740170, 0.089166726036509394, 0.089116925089361351, +0.089067123919421440, 0.089017322526813727, 0.088967520911662698, 0.088917719074092433, 0.088867917014228304, 0.088818114732194392, 0.088768312228114751, 0.088718509502114767, +0.088668706554318508, 0.088618903384850484, 0.088569099993834763, 0.088519296381396731, 0.088469492547660455, 0.088419688492750448, 0.088369884216790776, 0.088320079719906838, +0.088270275002222703, 0.088220470063862882, 0.088170664904951443, 0.088120859525613784, 0.088071053925973974, 0.088021248106156524, 0.087971442066285530, 0.087921635806486362, +0.087871829326883102, 0.087822022627600263, 0.087772215708761939, 0.087722408570493501, 0.087672601212919060, 0.087622793636162669, 0.087572985840349726, 0.087523177825604329, +0.087473369592050987, 0.087423561139813769, 0.087373752469018101, 0.087323943579788052, 0.087274134472248133, 0.087224325146522438, 0.087174515602736383, 0.087124705841014033, +0.087074895861479915, 0.087025085664258123, 0.086975275249474057, 0.086925464617251799, 0.086875653767715888, 0.086825842700990391, 0.086776031417200722, 0.086726219916470990, +0.086676408198925262, 0.086626596264688951, 0.086576784113886154, 0.086526971746641396, 0.086477159163078771, 0.086427346363323679, 0.086377533347500229, 0.086327720115732948, +0.086277906668145915, 0.086228093004864573, 0.086178279126012988, 0.086128465031715701, 0.086078650722096819, 0.086028836197281744, 0.085979021457394583, 0.085929206502559863, +0.085879391332901692, 0.085829575948545483, 0.085779760349615333, 0.085729944536235350, 0.085680128508530934, 0.085630312266626193, 0.085580495810645682, 0.085530679140713495, +0.085480862256955045, 0.085431045159494429, 0.085381227848456212, 0.085331410323964491, 0.085281592586144664, 0.085231774635120869, 0.085181956471017645, 0.085132138093959073, +0.085082319504070608, 0.085032500701476346, 0.084982681686300826, 0.084932862458668157, 0.084883043018703780, 0.084833223366531790, 0.084783403502276297, 0.084733583426062742, +0.084683763138015233, 0.084633942638258311, 0.084584121926916098, 0.084534301004114007, 0.084484479869976176, 0.084434658524627143, 0.084384836968191018, 0.084335015200793256, +0.084285193222557939, 0.084235371033609646, 0.084185548634072488, 0.084135726024071891, 0.084085903203731979, 0.084036080173177319, 0.083986256932532005, 0.083936433481921507, +0.083886609821469907, 0.083836785951301798, 0.083786961871541277, 0.083737137582313784, 0.083687313083743456, 0.083637488375954402, 0.083587663459072065, 0.083537838333220579, +0.083488012998524486, 0.083438187455107921, 0.083388361703096339, 0.083338535742613851, 0.083288709573785008, 0.083238883196733962, 0.083189056611586154, 0.083139229818465693, +0.083089402817497160, 0.083039575608804692, 0.082989748192513715, 0.082939920568748368, 0.082890092737633217, 0.082840264699292399, 0.082790436453851354, 0.082740608001434221, +0.082690779342165122, 0.082640950476169525, 0.082591121403571541, 0.082541292124495763, 0.082491462639066315, 0.082441632947408652, 0.082391803049646897, 0.082341972945905645, +0.082292142636309004, 0.082242312120982458, 0.082192481400050130, 0.082142650473636614, 0.082092819341866005, 0.082042988004863801, 0.081993156462754124, 0.081943324715661570, +0.081893492763710246, 0.081843660607025637, 0.081793828245731878, 0.081743995679953108, 0.081694162909814780, 0.081644329935441060, 0.081594496756956500, 0.081544663374485266, +0.081494829788152812, 0.081444995998083289, 0.081395162004401278, 0.081345327807230916, 0.081295493406697672, 0.081245658802925697, 0.081195823996039571, 0.081145988986163445, +0.081096153773422788, 0.081046318357941752, 0.080996482739844916, 0.080946646919256432, 0.080896810896301782, 0.080846974671105090, 0.080797138243790978, 0.080747301614483569, +0.080697464783308345, 0.080647627750389458, 0.080597790515851059, 0.080547953079818629, 0.080498115442416321, 0.080448277603768728, 0.080398439563999988, 0.080348601323235597, +0.080298762881599692, 0.080248924239216896, 0.080199085396211331, 0.080149246352708509, 0.080099407108832565, 0.080049567664708110, 0.079999728020459279, 0.079949888176211584, +0.079900048132089160, 0.079850207888216618, 0.079800367444718120, 0.079750526801719138, 0.079700685959343848, 0.079650844917716387, 0.079601003676962268, 0.079551162237205639, +0.079501320598571096, 0.079451478761182817, 0.079401636725166272, 0.079351794490645652, 0.079301952057745539, 0.079252109426590098, 0.079202266597304824, 0.079152423570013897, +0.079102580344841897, 0.079052736921913017, 0.079002893301352725, 0.078953049483285215, 0.078903205467835066, 0.078853361255126472, 0.078803516845284902, 0.078753672238434561, +0.078703827434699586, 0.078653982434205474, 0.078604137237076419, 0.078554291843437027, 0.078504446253411450, 0.078454600467125199, 0.078404754484702452, 0.078354908306267831, +0.078305061931945474, 0.078255215361860919, 0.078205368596138330, 0.078155521634902303, 0.078105674478277043, 0.078055827126388033, 0.078005979579359452, 0.077956131837315937, +0.077906283900381637, 0.077856435768682078, 0.077806587442341424, 0.077756738921483853, 0.077706890206234891, 0.077657041296718687, 0.077607192193059893, 0.077557342895382672, +0.077507493403812536, 0.077457643718473662, 0.077407793839490688, 0.077357943766987777, 0.077308093501090455, 0.077258243041922900, 0.077208392389609748, 0.077158541544275150, +0.077108690506044658, 0.077058839275042437, 0.077008987851393110, 0.076959136235220882, 0.076909284426651237, 0.076859432425808394, 0.076809580232816976, 0.076759727847801162, +0.076709875270886463, 0.076660022502197084, 0.076610169541857190, 0.076560316389992333, 0.076510463046726679, 0.076460609512184863, 0.076410755786491091, 0.076360901869770861, +0.076311047762148379, 0.076261193463748281, 0.076211338974694759, 0.076161484295113338, 0.076111629425128197, 0.076061774364863971, 0.076011919114444881, 0.075962063673996438, +0.075912208043642834, 0.075862352223508706, 0.075812496213718258, 0.075762640014397004, 0.075712783625669161, 0.075662927047658909, 0.075613070280491787, 0.075563213324291986, +0.075513356179184157, 0.075463498845292479, 0.075413641322742517, 0.075363783611658436, 0.075313925712164900, 0.075264067624386116, 0.075214209348447594, 0.075164350884473555, +0.075114492232588648, 0.075064633392917052, 0.075014774365584319, 0.074964915150714656, 0.074915055748432699, 0.074865196158862668, 0.074815336382130074, 0.074765476418359150, +0.074715616267674090, 0.074665755930200445, 0.074615895406062394, 0.074566034695384600, 0.074516173798291299, 0.074466312714907987, 0.074416451445358897, 0.074366589989768681, +0.074316728348261543, 0.074266866520963037, 0.074217004507997356, 0.074167142309489162, 0.074117279925562676, 0.074067417356343437, 0.074017554601955651, 0.073967691662523968, +0.073917828538172622, 0.073867965229027152, 0.073818101735211764, 0.073768238056851121, 0.073718374194069430, 0.073668510146992258, 0.073618645915743811, 0.073568781500448308, +0.073518916901231288, 0.073469052118216985, 0.073419187151530035, 0.073369322001294687, 0.073319456667636479, 0.073269591150679617, 0.073219725450548792, 0.073169859567368198, +0.073119993501263414, 0.073070127252358633, 0.073020260820778532, 0.072970394206647346, 0.072920527410090613, 0.072870660431232553, 0.072820793270197859, 0.072770925927110722, +0.072721058402096722, 0.072671190695280080, 0.072621322806785016, 0.072571454736737082, 0.072521586485260511, 0.072471718052479983, 0.072421849438519703, 0.072371980643505252, +0.072322111667560848, 0.072272242510811172, 0.072222373173380428, 0.072172503655394210, 0.072122633956976726, 0.072072764078252666, 0.072022894019346237, 0.071973023780383033, +0.071923153361487260, 0.071873282762783611, 0.071823411984396304, 0.071773541026450907, 0.071723669889071667, 0.071673798572382805, 0.071623927076509900, 0.071574055401577158, +0.071524183547709286, 0.071474311515030517, 0.071424439303666404, 0.071374566913741208, 0.071324694345379580, 0.071274821598705781, 0.071224948673845365, 0.071175075570922577, +0.071125202290062098, 0.071075328831388188, 0.071025455195026385, 0.070975581381100938, 0.070925707389736553, 0.070875833221057435, 0.070825958875189193, 0.070776084352256061, +0.070726209652382258, 0.070676334775693378, 0.070626459722313670, 0.070576584492367811, 0.070526709085980036, 0.070476833503275937, 0.070426957744379765, 0.070377081809416195, +0.070327205698509462, 0.070277329411785175, 0.070227452949367553, 0.070177576311381301, 0.070127699497950668, 0.070077822509201235, 0.070027945345257234, 0.069978068006243385, +0.069928190492283909, 0.069878312803504400, 0.069828434940029119, 0.069778556901982744, 0.069728678689489537, 0.069678800302675079, 0.069628921741663616, 0.069579043006579397, +0.069529164097548030, 0.069479285014693734, 0.069429405758141244, 0.069379526328014779, 0.069329646724439961, 0.069279766947541011, 0.069229886997442647, 0.069180006874269132, +0.069130126578146031, 0.069080246109197621, 0.069030365467548593, 0.068980484653323210, 0.068930603666647050, 0.068880722507644390, 0.068830841176439922, 0.068780959673157907, +0.068731077997923939, 0.068681196150862267, 0.068631314132097165, 0.068581431941754228, 0.068531549579957704, 0.068481667046832312, 0.068431784342502300, 0.068381901467093276, +0.068332018420729501, 0.068282135203535682, 0.068232251815636080, 0.068182368257156289, 0.068132484528220572, 0.068082600628953646, 0.068032716559479775, 0.067982832319924566, +0.067932947910412267, 0.067883063331067597, 0.067833178582014833, 0.067783293663379568, 0.067733408575286064, 0.067683523317858596, 0.067633637891222759, 0.067583752295502827, +0.067533866530823522, 0.067483980597309090, 0.067434094495085167, 0.067384208224276002, 0.067334321785006326, 0.067284435177400390, 0.067234548401583813, 0.067184661457680858, +0.067134774345816259, 0.067084887066114277, 0.067034999618700519, 0.066985112003699276, 0.066935224221235240, 0.066885336271432699, 0.066835448154417262, 0.066785559870313205, +0.066735671419245260, 0.066685782801337676, 0.066635894016716088, 0.066586005065504758, 0.066536115947827976, 0.066486226663811349, 0.066436337213579152, 0.066386447597256121, +0.066336557814966515, 0.066286667866835972, 0.066236777752988751, 0.066186887473549588, 0.066136997028642758, 0.066087106418393882, 0.066037215642927236, 0.065987324702367553, +0.065937433596839123, 0.065887542326467541, 0.065837650891377109, 0.065787759291692546, 0.065737867527538144, 0.065687975599039522, 0.065638083506320957, 0.065588191249506739, +0.065538298828722488, 0.065488406244092481, 0.065438513495741465, 0.065388620583793730, 0.065338727508374883, 0.065288834269609214, 0.065238940867621456, 0.065189047302535899, +0.065139153574478179, 0.065089259683572570, 0.065039365629943807, 0.064989471413716193, 0.064939577035015350, 0.064889682493965553, 0.064839787790691550, 0.064789892925317644, +0.064739997897969442, 0.064690102708771235, 0.064640207357847340, 0.064590311845323378, 0.064540416171323625, 0.064490520335972829, 0.064440624339395292, 0.064390728181716650, +0.064340831863061165, 0.064290935383553613, 0.064241038743318282, 0.064191141942480795, 0.064141244981165454, 0.064091347859496994, 0.064041450577599732, 0.063991553135599274, +0.063941655533619940, 0.063891757771786475, 0.063841859850223157, 0.063791961769055647, 0.063742063528408222, 0.063692165128405198, 0.063642266569172212, 0.063592367850833553, +0.063542468973513969, 0.063492569937337776, 0.063442670742430596, 0.063392771388916747, 0.063342871876920961, 0.063292972206567558, 0.063243072377982171, 0.063193172391289090, +0.063143272246613091, 0.063093371944078463, 0.063043471483810856, 0.062993570865934559, 0.062943670090574347, 0.062893769157854496, 0.062843868067900682, 0.062793966820837196, +0.062744065416788786, 0.062694163855879781, 0.062644262138235804, 0.062594360263981172, 0.062544458233240188, 0.062494556046138516, 0.062444653702800446, 0.062394751203350737, +0.062344848547913716, 0.062294945736615009, 0.062245042769578943, 0.062195139646930270, 0.062145236368793301, 0.062095332935293693, 0.062045429346555742, 0.061995525602704223, +0.061945621703863446, 0.061895717650159061, 0.061845813441715379, 0.061795909078657160, 0.061746004561108729, 0.061696099889195728, 0.061646195063042482, 0.061596290082773300, +0.061546384948513840, 0.061496479660388410, 0.061446574218521788, 0.061396668623038289, 0.061346762874063557, 0.061296856971721922, 0.061246950916138139, 0.061197044707436539, +0.061147138345742771, 0.061097231831181154, 0.061047325163876461, 0.060997418343953010, 0.060947511371536457, 0.060897604246751121, 0.060847696969721782, 0.060797789540572751, +0.060747881959429692, 0.060697974226416929, 0.060648066341658792, 0.060598158305280925, 0.060548250117407665, 0.060498341778163781, 0.060448433287673596, 0.060398524646062775, +0.060348615853455634, 0.060298706909976962, 0.060248797815751078, 0.060198888570903643, 0.060148979175558982, 0.060099069629841878, 0.060049159933876654, 0.059999250087788975, +0.059949340091703170, 0.059899429945744015, 0.059849519650035841, 0.059799609204704313, 0.059749698609873760, 0.059699787865668964, 0.059649876972214251, 0.059599965929635290, +0.059550054738056420, 0.059500143397601964, 0.059450231908397592, 0.059400320270567644, 0.059350408484236894, 0.059300496549529680, 0.059250584466571665, 0.059200672235487188, +0.059150759856401038, 0.059100847329437538, 0.059050934654722366, 0.059001021832379853, 0.058951108862534789, 0.058901195745311510, 0.058851282480835689, 0.058801369069231654, +0.058751455510624204, 0.058701541805137661, 0.058651627952897717, 0.058601713954028696, 0.058551799808654957, 0.058501885516902150, 0.058451971078894639, 0.058402056494757194, +0.058352141764614167, 0.058302226888591227, 0.058252311866812720, 0.058202396699403434, 0.058152481386487716, 0.058102565928191234, 0.058052650324638341, 0.058002734575953820, +0.057952818682262014, 0.057902902643688615, 0.057852986460357955, 0.057803070132394822, 0.057753153659923583, 0.057703237043069892, 0.057653320281958118, 0.057603403376712589, +0.057553486327459005, 0.057503569134321697, 0.057453651797425474, 0.057403734316894675, 0.057353816692854984, 0.057303898925430745, 0.057253981014746769, 0.057204062960927393, +0.057154144764098302, 0.057104226424383848, 0.057054307941908827, 0.057004389316797598, 0.056954470549175837, 0.056904551639167897, 0.056854632586898581, 0.056804713392492240, +0.056754794056074552, 0.056704874577769890, 0.056654954957702591, 0.056605035195998347, 0.056555115292781524, 0.056505195248176904, 0.056455275062308859, 0.056405354735303059, +0.056355434267283885, 0.056305513658376119, 0.056255592908704126, 0.056205672018393590, 0.056155750987568885, 0.056105829816354792, 0.056055908504875684, 0.056005987053257253, +0.055956065461623850, 0.055906143730100284, 0.055856221858810916, 0.055806299847881435, 0.055756377697436202, 0.055706455407600032, 0.055656532978497278, 0.055606610410253630, +0.055556687702993462, 0.055506764856841126, 0.055456841871922326, 0.055406918748361414, 0.055356995486283214, 0.055307072085812078, 0.055257148547073705, 0.055207224870192459, +0.055157301055293158, 0.055107377102500153, 0.055057453011939150, 0.055007528783734522, 0.054957604418011063, 0.054907679914893155, 0.054857755274506488, 0.054807830496975435, +0.054757905582424805, 0.054707980530978965, 0.054658055342763620, 0.054608130017903135, 0.054558204556521883, 0.054508278958745562, 0.054458353224698539, 0.054408427354505642, +0.054358501348291226, 0.054308575206181008, 0.054258648928299347, 0.054208722514771060, 0.054158795965720527, 0.054108869281273446, 0.054058942461554196, 0.054009015506687588, +0.053959088416797994, 0.053909161192011126, 0.053859233832451357, 0.053809306338243504, 0.053759378709511939, 0.053709450946382367, 0.053659523048979176, 0.053609595017426730, +0.053559666851850735, 0.053509738552375577, 0.053459810119126074, 0.053409881552226597, 0.053359952851802867, 0.053310024017979254, 0.053260095050880578, 0.053210165950631216, +0.053160236717356889, 0.053110307351181975, 0.053060377852231284, 0.053010448220629211, 0.052960518456501453, 0.052910588559972403, 0.052860658531166886, 0.052810728370209274, +0.052760798077225286, 0.052710867652339302, 0.052660937095676152, 0.052611006407360210, 0.052561075587517200, 0.052511144636271503, 0.052461213553747499, 0.052411282340070905, +0.052361350995366103, 0.052311419519757922, 0.052261487913370749, 0.052211556176330304, 0.052161624308760965, 0.052111692310787570, 0.052061760182534500, 0.052011827924127466, +0.051961895535690868, 0.051911963017349530, 0.051862030369227839, 0.051812097591451521, 0.051762164684144955, 0.051712231647432980, 0.051662298481439980, 0.051612365186291677, +0.051562431762112462, 0.051512498209026723, 0.051462564527160186, 0.051412630716637230, 0.051362696777582706, 0.051312762710120988, 0.051262828514377815, 0.051212894190477566, +0.051162959738545080, 0.051113025158704757, 0.051063090451082309, 0.051013155615802136, 0.050963220652989076, 0.050913285562767523, 0.050863350345263195, 0.050813415000600493, +0.050763479528904254, 0.050713543930298872, 0.050663608204910074, 0.050613672352862252, 0.050563736374279813, 0.050513800269288471, 0.050463864038012632, 0.050413927680577127, +0.050363991197106363, 0.050314054587726066, 0.050264117852560630, 0.050214180991734900, 0.050164244005373275, 0.050114306893601482, 0.050064369656543928, 0.050014432294325444, +0.049964494807070436, 0.049914557194904632, 0.049864619457952439, 0.049814681596338700, 0.049764743610187810, 0.049714805499625501, 0.049664867264776182, 0.049614928905764251, +0.049564990422715442, 0.049515051815754156, 0.049465113085005244, 0.049415174230593099, 0.049365235252643469, 0.049315296151280746, 0.049265356926629783, 0.049215417578814986, +0.049165478107962089, 0.049115538514195499, 0.049065598797640060, 0.049015658958420180, 0.048965718996661592, 0.048915778912488717, 0.048865838706026385, 0.048815898377399018, +0.048765957926732342, 0.048716017354150778, 0.048666076659779171, 0.048616135843741928, 0.048566194906164782, 0.048516253847172154, 0.048466312666888452, 0.048416371365439408, +0.048366429942949436, 0.048316488399543389, 0.048266546735345674, 0.048216604950482043, 0.048166663045076892, 0.048116721019255092, 0.048066778873141036, 0.048016836606860486, +0.047966894220537841, 0.047916951714297953, 0.047867009088265251, 0.047817066342565467, 0.047767123477323016, 0.047717180492662763, 0.047667237388709108, 0.047617294165587805, +0.047567350823423268, 0.047517407362339906, 0.047467463782463477, 0.047417520083918384, 0.047367576266829491, 0.047317632331321212, 0.047267688277519294, 0.047217744105548159, +0.047167799815532666, 0.047117855407597227, 0.047067910881867597, 0.047017966238468184, 0.046968021477523859, 0.046918076599159031, 0.046868131603499459, 0.046818186490669565, +0.046768241260794194, 0.046718295913997780, 0.046668350450406071, 0.046618404870143487, 0.046568459173334444, 0.046518513360104700, 0.046468567430578672, 0.046418621384881224, +0.046368675223136778, 0.046318728945471087, 0.046268782552008579, 0.046218836042874113, 0.046168889418192111, 0.046118942678088332, 0.046068995822687191, 0.046019048852113560, +0.045969101766491868, 0.045919154565947869, 0.045869207250605976, 0.045819259820591068, 0.045769312276027561, 0.045719364617041229, 0.045669416843756479, 0.045619468956298183, +0.045569520954790776, 0.045519572839360006, 0.045469624610130308, 0.045419676267226108, 0.045369727810773156, 0.045319779240895884, 0.045269830557719166, 0.045219881761367424, +0.045169932851966424, 0.045119983829640595, 0.045070034694514802, 0.045020085446713480, 0.044970136086362390, 0.044920186613585961, 0.044870237028509057, 0.044820287331256127, +0.044770337521952919, 0.044720387600723860, 0.044670437567693844, 0.044620487422987284, 0.044570537166729950, 0.044520586799046268, 0.044470636320060680, 0.044420685729898948, +0.044370735028685500, 0.044320784216545214, 0.044270833293602520, 0.044220882259983191, 0.044170931115811655, 0.044120979861212793, 0.044071028496311032, 0.044021077021232147, +0.043971125436100572, 0.043921173741041181, 0.043871221936178414, 0.043821270021638034, 0.043771317997544475, 0.043721365864022629, 0.043671413621196919, 0.043621461269193119, +0.043571508808135664, 0.043521556238149003, 0.043471603559358883, 0.043421650771889760, 0.043371697875866512, 0.043321744871413576, 0.043271791758656718, 0.043221838537720381, +0.043171885208729451, 0.043121931771808356, 0.043071978227082884, 0.043022024574677464, 0.042972070814716982, 0.042922116947325881, 0.042872162972629926, 0.042822208890753569, +0.042772254701821687, 0.042722300405958723, 0.042672346003290458, 0.042622391493941321, 0.042572436878036211, 0.042522482155699565, 0.042472527327057155, 0.042422572392233425, +0.042372617351352823, 0.042322662204541117, 0.042272706951922763, 0.042222751593622633, 0.042172796129765183, 0.042122840560476195, 0.042072884885880096, 0.042022929106101788, +0.041972973221265711, 0.041923017231497647, 0.041873061136922039, 0.041823104937663780, 0.041773148633847318, 0.041723192225598421, 0.041673235713041545, 0.041623279096301584, +0.041573322375502979, 0.041523365550771511, 0.041473408622231631, 0.041423451590007786, 0.041373494454225751, 0.041323537215009983, 0.041273579872485373, 0.041223622426776373, +0.041173664878008755, 0.041123707226306976, 0.041073749471795928, 0.041023791614600062, 0.040973833654845165, 0.040923875592655680, 0.040873917428156506, 0.040823959161472100, +0.040774000792728235, 0.040724042322049368, 0.040674083749560400, 0.040624125075385771, 0.040574166299651278, 0.040524207422481369, 0.040474248444000500, 0.040424289364334454, +0.040374330183607678, 0.040324370901945079, 0.040274411519471115, 0.040224452036311559, 0.040174492452590874, 0.040124532768433960, 0.040074572983965266, 0.040024613099310588, +0.039974653114594375, 0.039924693029941533, 0.039874732845476511, 0.039824772561325099, 0.039774812177611758, 0.039724851694461390, 0.039674891111998449, 0.039624930430348718, +0.039574969649636665, 0.039525008769986741, 0.039475047791524741, 0.039425086714375120, 0.039375125538662785, 0.039325164264512193, 0.039275202892049131, 0.039225241421398063, +0.039175279852683889, 0.039125318186031072, 0.039075356421565406, 0.039025394559411349, 0.038975432599693806, 0.038925470542537234, 0.038875508388067435, 0.038825546136408859, +0.038775583787686425, 0.038725621342024584, 0.038675658799549130, 0.038625696160384533, 0.038575733424655693, 0.038525770592487081, 0.038475807664004477, 0.038425844639332365, +0.038375881518595188, 0.038325918301918754, 0.038275954989427527, 0.038225991581246413, 0.038176028077499875, 0.038126064478313709, 0.038076100783812385, 0.038026136994120802, +0.037976173109363437, 0.037926209129666086, 0.037876245055153211, 0.037826280885949720, 0.037776316622180083, 0.037726352263970100, 0.037676387811444237, 0.037626423264727406, +0.037576458623944070, 0.037526493889220032, 0.037476529060679761, 0.037426564138447721, 0.037376599122649720, 0.037326634013410215, 0.037276668810854126, 0.037226703515105923, +0.037176738126291402, 0.037126772644535039, 0.037076807069961748, 0.037026841402695986, 0.036976875642863574, 0.036926909790588963, 0.036876943845997087, 0.036826977809212402, +0.036777011680360717, 0.036727045459566503, 0.036677079146954679, 0.036627112742649709, 0.036577146246777402, 0.036527179659462228, 0.036477212980828663, 0.036427246211002511, +0.036377279350108239, 0.036327312398270771, 0.036277345355614575, 0.036227378222265468, 0.036177410998347904, 0.036127443683986821, 0.036077476279306686, 0.036027508784433296, +0.035977541199491141, 0.035927573524605134, 0.035877605759899747, 0.035827637905500788, 0.035777669961532733, 0.035727701928120505, 0.035677733805388578, 0.035627765593462764, +0.035577797292467531, 0.035527828902527807, 0.035477860423768062, 0.035427891856314120, 0.035377923200290443, 0.035327954455821514, 0.035277985623033137, 0.035228016702049801, +0.035178047692996428, 0.035128078595997488, 0.035078109411178796, 0.035028140138664829, 0.034978170778580508, 0.034928201331050325, 0.034878231796200074, 0.034828262174154252, +0.034778292465037768, 0.034728322668975110, 0.034678352786092090, 0.034628382816513190, 0.034578412760363331, 0.034528442617766997, 0.034478472388850004, 0.034428502073736822, +0.034378531672551949, 0.034328561185421186, 0.034278590612469018, 0.034228619953820379, 0.034178649209599739, 0.034128678379932928, 0.034078707464944416, 0.034028736464759138, +0.033978765379501570, 0.033928794209297543, 0.033878822954271519, 0.033828851614548447, 0.033778880190252797, 0.033728908681510385, 0.033678937088445708, 0.033628965411183688, +0.033578993649848815, 0.033529021804566891, 0.033479049875462422, 0.033429077862659883, 0.033379105766285090, 0.033329133586462535, 0.033279161323317138, 0.033229188976973405, +0.033179216547557136, 0.033129244035192830, 0.033079271440005414, 0.033029298762119373, 0.032979326001660529, 0.032929353158753373, 0.032879380233522833, 0.032829407226093399, +0.032779434136590888, 0.032729460965139796, 0.032679487711865046, 0.032629514376891135, 0.032579540960343885, 0.032529567462347780, 0.032479593883027312, 0.032429620222508303, +0.032379646480915243, 0.032329672658373068, 0.032279698755006268, 0.032229724770940667, 0.032179750706300754, 0.032129776561211458, 0.032079802335797283, 0.032029828030184046, +0.031979853644496237, 0.031929879178858790, 0.031879904633396204, 0.031829930008234301, 0.031779955303497580, 0.031729980519310960, 0.031680005655798947, 0.031630030713087370, +0.031580055691300707, 0.031530080590563912, 0.031480105411001470, 0.031430130152739211, 0.031380154815901617, 0.031330179400613202, 0.031280203906999780, 0.031230228335185847, +0.031180252685296343, 0.031130276957455762, 0.031080301151789936, 0.031030325268423354, 0.030980349307480962, 0.030930373269087250, 0.030880397153368048, 0.030830420960447857, +0.030780444690451610, 0.030730468343503809, 0.030680491919730282, 0.030630515419255523, 0.030580538842204477, 0.030530562188701638, 0.030480585458872840, 0.030430608652842576, +0.030380631770735349, 0.030330654812676987, 0.030280677778791985, 0.030230700669205291, 0.030180723484041400, 0.030130746223426146, 0.030080768887484025, 0.030030791476339982, +0.029980813990118517, 0.029930836428945458, 0.029880858792945310, 0.029830881082243015, 0.029780903296963073, 0.029730925437231319, 0.029680947503172250, 0.029630969494910810, +0.029580991412571506, 0.029531013256280166, 0.029481035026161291, 0.029431056722339387, 0.029381078344940286, 0.029331099894088487, 0.029281121369908937, 0.029231142772526142, +0.029181164102065935, 0.029131185358652816, 0.029081206542411732, 0.029031227653467190, 0.028981248691945023, 0.028931269657969733, 0.028881290551666269, 0.028831311373159137, +0.028781332122574169, 0.028731352800035869, 0.028681373405669189, 0.028631393939598630, 0.028581414401950032, 0.028531434792847896, 0.028481455112417176, 0.028431475360782370, +0.028381495538069325, 0.028331515644402536, 0.028281535679906517, 0.028231555644707102, 0.028181575538928798, 0.028131595362696556, 0.028081615116134880, 0.028031634799369608, +0.027981654412525252, 0.027931673955726762, 0.027881693429098641, 0.027831712832766729, 0.027781732166855536, 0.027731751431490013, 0.027681770626794666, 0.027631789752895340, +0.027581808809916536, 0.027531827797983213, 0.027481846717219875, 0.027431865567752362, 0.027381884349705187, 0.027331903063202857, 0.027281921708371216, 0.027231940285334769, +0.027181958794218471, 0.027131977235146831, 0.027081995608245691, 0.027032013913639564, 0.026982032151453401, 0.026932050321811715, 0.026882068424840349, 0.026832086460663811, +0.026782104429407053, 0.026732122331194593, 0.026682140166152273, 0.026632157934404599, 0.026582175636076531, 0.026532193271292581, 0.026482210840178589, 0.026432228342859073, +0.026382245779458541, 0.026332263150102841, 0.026282280454916481, 0.026232297694024419, 0.026182314867551168, 0.026132331975622577, 0.026082349018363156, 0.026032365995897859, +0.025982382908351205, 0.025932399755849038, 0.025882416538515873, 0.025832433256476665, 0.025782449909855929, 0.025732466498779513, 0.025682483023371932, 0.025632499483758141, +0.025582515880062658, 0.025532532212411332, 0.025482548480928673, 0.025432564685739199, 0.025382580826968759, 0.025332596904741864, 0.025282612919183479, 0.025232628870418116, +0.025182644758571626, 0.025132660583768524, 0.025082676346133773, 0.025032692045791883, 0.024982707682868709, 0.024932723257488767, 0.024882738769777014, 0.024832754219857971, +0.024782769607857486, 0.024732784933900080, 0.024682800198110710, 0.024632815400613895, 0.024582830541535483, 0.024532845620999999, 0.024482860639132398, 0.024432875596057203, +0.024382890491900264, 0.024332905326786097, 0.024282920100839222, 0.024232934814185494, 0.024182949466949426, 0.024132964059255985, 0.024082978591229692, 0.024032993062996392, +0.023983007474680611, 0.023933021826407313, 0.023883036118301018, 0.023833050350487574, 0.023783064523091504, 0.023733078636237772, 0.023683092690050901, 0.023633106684656742, +0.023583120620179816, 0.023533134496745090, 0.023483148314477082, 0.023433162073501646, 0.023383175773943308, 0.023333189415926586, 0.023283202999577333, 0.023233216525020074, +0.023183229992379772, 0.023133243401780954, 0.023083256753349466, 0.023033270047209842, 0.022983283283487040, 0.022933296462305585, 0.022883309583791336, 0.022833322648068810, +0.022783335655262978, 0.022733348605498364, 0.022683361498900823, 0.022633374335594876, 0.022583387115705494, 0.022533399839357201, 0.022483412506675852, 0.022433425117785972, +0.022383437672812083, 0.022333450171880046, 0.022283462615114383, 0.022233475002640064, 0.022183487334581614, 0.022133499611064887, 0.022083511832214416, 0.022033523998155162, +0.021983536109011652, 0.021933548164909750, 0.021883560165973974, 0.021833572112329301, 0.021783584004100253, 0.021733595841412687, 0.021683607624391133, 0.021633619353160560, +0.021583631027845492, 0.021533642648571792, 0.021483654215463988, 0.021433665728647047, 0.021383677188245496, 0.021333688594385197, 0.021283699947190676, 0.021233711246786462, +0.021183722493298415, 0.021133733686851060, 0.021083744827569369, 0.021033755915577875, 0.020983766951002434, 0.020933777933967578, 0.020883788864598275, 0.020833799743019056, +0.020783810569355781, 0.020733821343732979, 0.020683832066275627, 0.020633842737108249, 0.020583853356356707, 0.020533863924145534, 0.020483874440599698, 0.020433884905843733, +0.020383895320003502, 0.020333905683203531, 0.020283915995568353, 0.020233926257223825, 0.020183936468294486, 0.020133946628905303, 0.020083956739180810, 0.020033966799246870, +0.019983976809228015, 0.019933986769249214, 0.019883996679435006, 0.019834006539911245, 0.019784016350802472, 0.019734026112233658, 0.019684035824329333, 0.019634045487215365, +0.019584055101016278, 0.019534064665857057, 0.019484074181862231, 0.019434083649157663, 0.019384093067867886, 0.019334102438117430, 0.019284111760032165, 0.019234121033736621, +0.019184130259355770, 0.019134139437014152, 0.019084148566837631, 0.019034157648950736, 0.018984166683478448, 0.018934175670545301, 0.018884184610277157, 0.018834193502798552, +0.018784202348234462, 0.018734211146709423, 0.018684219898349300, 0.018634228603278628, 0.018584237261622383, 0.018534245873505103, 0.018484254439052650, 0.018434262958389562, +0.018384271431640373, 0.018334279858930949, 0.018284288240385825, 0.018234296576129981, 0.018184304866287953, 0.018134313110985605, 0.018084321310347474, 0.018034329464498539, +0.017984337573563339, 0.017934345637667739, 0.017884353656936271, 0.017834361631493923, 0.017784369561465226, 0.017734377446976046, 0.017684385288150927, 0.017634393085114840, +0.017584400837992332, 0.017534408546909262, 0.017484416211990171, 0.017434423833360042, 0.017384431411143406, 0.017334438945466137, 0.017284446436452772, 0.017234453884227844, +0.017184461288917225, 0.017134468650645454, 0.017084475969537515, 0.017034483245717939, 0.016984490479312598, 0.016934497670446032, 0.016884504819243220, 0.016834511925828705, +0.016784518990328352, 0.016734526012866704, 0.016684532993568736, 0.016634539932558996, 0.016584546829963350, 0.016534553685906336, 0.016484560500512935, 0.016434567273907692, +0.016384574006216474, 0.016334580697563824, 0.016284587348074274, 0.016234593957873703, 0.016184600527086642, 0.016134607055838083, 0.016084613544252564, 0.016034619992455954, +0.015984626400572792, 0.015934632768728065, 0.015884639097046314, 0.015834645385653406, 0.015784651634673887, 0.015734657844232738, 0.015684664014454501, 0.015634670145465050, +0.015584676237388920, 0.015534682290351100, 0.015484688304476132, 0.015434694279889886, 0.015384700216716904, 0.015334706115081729, 0.015284711975110232, 0.015234717796926953, +0.015184723580656883, 0.015134729326424557, 0.015084735034355853, 0.015034740704575313, 0.014984746337207918, 0.014934751932378216, 0.014884757490212076, 0.014834763010834045, +0.014784768494369103, 0.014734773940941798, 0.014684779350678002, 0.014634784723702257, 0.014584790060139552, 0.014534795360114426, 0.014484800623752755, 0.014434805851179084, +0.014384811042518398, 0.014334816197895240, 0.014284821317435487, 0.014234826401263679, 0.014184831449504361, 0.014134836462283409, 0.014084841439725366, 0.014034846381955219, +0.013984851289097513, 0.013934856161278122, 0.013884860998621591, 0.013834865801252906, 0.013784870569296614, 0.013734875302878589, 0.013684880002123376, 0.013634884667155962, +0.013584889298100894, 0.013534893895084046, 0.013484898458229963, 0.013434902987663635, 0.013384907483509605, 0.013334911945893750, 0.013284916374940616, 0.013234920770774745, +0.013184925133522018, 0.013134929463306978, 0.013084933760254613, 0.013034938024489471, 0.012984942256137427, 0.012934946455323027, 0.012884950622171262, 0.012834954756806675, +0.012784958859355147, 0.012734962929941222, 0.012684966968689888, 0.012634970975725694, 0.012584974951174515, 0.012534978895160901, 0.012484982807809837, 0.012434986689245874, +0.012384990539594886, 0.012334994358981425, 0.012284998147530032, 0.012235001905366588, 0.012185005632615639, 0.012135009329402176, 0.012085012995850746, 0.012035016632087227, +0.011985020238236168, 0.011935023814422557, 0.011885027360770942, 0.011835030877407202, 0.011785034364455887, 0.011735037822041985, 0.011685041250290044, 0.011635044649325946, +0.011585048019274234, 0.011535051360259903, 0.011485054672407499, 0.011435057955842903, 0.011385061210690661, 0.011335064437075324, 0.011285067635122768, 0.011235070804957545, +0.011185073946704644, 0.011135077060488613, 0.011085080146435333, 0.011035083204669355, 0.010985086235315668, 0.010935089238498820, 0.010885092214344695, 0.010835095162977839, +0.010785098084523244, 0.010735100979105461, 0.010685103846850369, 0.010635106687882517, 0.010585109502326899, 0.010535112290308063, 0.010485115051951890, 0.010435117787382930, +0.010385120496726175, 0.010335123180106175, 0.010285125837648811, 0.010235128469478633, 0.010185131075720189, 0.010135133656499361, 0.010085136211940699, 0.010035138742169197, +0.009985141247309405, 0.009935143727487203, 0.009885146182827142, 0.009835148613454215, 0.009785151019492972, 0.009735153401069296, 0.009685155758307737, 0.009635158091333288, +0.009585160400270500, 0.009535162685245254, 0.009485164946382102, 0.009435167183806039, 0.009385169397641613, 0.009335171588014706, 0.009285173755049872, 0.009235175898871659, +0.009185178019605951, 0.009135180117377297, 0.009085182192310694, 0.009035184244530689, 0.008985186274163171, 0.008935188281332685, 0.008885190266164227, 0.008835192228782351, +0.008785194169312938, 0.008735196087880540, 0.008685197984610153, 0.008635199859626325, 0.008585201713054942, 0.008535203545020555, 0.008485205355648159, 0.008435207145062306, +0.008385208913388878, 0.008335210660752429, 0.008285212387277509, 0.008235214093090002, 0.008185215778314459, 0.008135217443075878, 0.008085219087498808, 0.008035220711709135, +0.007985222315831410, 0.007935223899990629, 0.007885225464311346, 0.007835227008919440, 0.007785228533939469, 0.007735230039496426, 0.007685231525714864, 0.007635232992720667, +0.007585234440638388, 0.007535235869593022, 0.007485237279709124, 0.007435238671112575, 0.007385240043927930, 0.007335241398280185, 0.007285242734293892, 0.007235244052094937, +0.007185245351807872, 0.007135246633557249, 0.007085247897468953, 0.007035249143667537, 0.006985250372277999, 0.006935251583424892, 0.006885252777234099, 0.006835253953830174, +0.006785255113338114, 0.006735256255882473, 0.006685257381589134, 0.006635258490582652, 0.006585259582988025, 0.006535260658929804, 0.006485261718533876, 0.006435262761924793, +0.006385263789227553, 0.006335264800566710, 0.006285265796068149, 0.006235266775856423, 0.006185267740056086, 0.006135268688793025, 0.006085269622191791, 0.006035270540377383, +0.005985271443474355, 0.005935272331608592, 0.005885273204904649, 0.005835274063487523, 0.005785274907481767, 0.005735275737013268, 0.005685276552206580, 0.005635277353186701, +0.005585278140078183, 0.005535278913006915, 0.005485279672097450, 0.005435280417474785, 0.005385281149263474, 0.005335281867589406, 0.005285282572577133, 0.005235283264351209, +0.005185283943037521, 0.005135284608760623, 0.005085285261645514, 0.005035285901816748, 0.004985286529400210, 0.004935287144520456, 0.004885287747302485, 0.004835288337870850, +0.004785288916351439, 0.004735289482868805, 0.004685290037547947, 0.004635290580513421, 0.004585291111891111, 0.004535291631805574, 0.004485292140381809, 0.004435292637744368, +0.004385293124019140, 0.004335293599330679, 0.004285294063803541, 0.004235294517563611, 0.004185294960735444, 0.004135295393444041, 0.004085295815813955, 0.004035296227971073, +0.003985296630039951, 0.003935297022145587, 0.003885297404412537, 0.003835297776966687, 0.003785298139932593, 0.003735298493435253, 0.003685298837599223, 0.003635299172550391, +0.003585299498413309, 0.003535299815312980, 0.003485300123373957, 0.003435300422722127, 0.003385300713482047, 0.003335300995778715, 0.003285301269736686, 0.003235301535481848, +0.003185301793138756, 0.003135302042831966, 0.003085302284687364, 0.003035302518829507, 0.002985302745383394, 0.002935302964473579, 0.002885303176225952, 0.002835303380765067, +0.002785303578215922, 0.002735303768703075, 0.002685303952352413, 0.002635304129288491, 0.002585304299636308, 0.002535304463520421, 0.002485304621066716, 0.002435304772399750, +0.002385304917644522, 0.002335305056925588, 0.002285305190368835, 0.002235305318098819, 0.002185305440240096, 0.002135305556918553, 0.002085305668258747, 0.002035305774385676, +0.001985305875423896, 0.001935305971499296, 0.001885306062736431, 0.001835306149260301, 0.001785306231195462, 0.001735306308667801, 0.001685306381801874, 0.001635306450722681, +0.001585306515554778, 0.001535306576424053, 0.001485306633455062, 0.001435306686772804, 0.001385306736501835, 0.001335306782768043, 0.001285306825695984, 0.001235306865410214, +0.001185306902036622, 0.001135306935699761, 0.001085306966524634, 0.001035306994635795, 0.000985307020159133, 0.000935307043219203, 0.000885307063941005, 0.000835307082449096, +0.000785307098869363, 0.000735307113326362, 0.000685307125945094, 0.000635307136850113, 0.000585307146167309, 0.000535307154021237, 0.000485307160536898, 0.000435307165838846, +0.000385307170052970, 0.000335307173303827, 0.000285307175716415, 0.000235307177415291, 0.000185307178526344, 0.000135307179174129, 0.000085307179483201, 0.000035307179579450, +-0.000014692820412569, -0.000064692820367856, -0.000114692820161855, -0.000164692819668678, -0.000214692818763769, -0.000264692817322128, -0.000314692815219199, -0.000364692812329094, +-0.000414692808527257, -0.000464692803688688, -0.000514692797688831, -0.000564692790401798, -0.000614692781703032, -0.000664692771467535, -0.000714692759570750, -0.000764692745886789, +-0.000814692730291096, -0.000864692712659116, -0.000914692692864960, -0.000964692670784071, -0.001014692646291452, -0.001064692619262544, -0.001114692589571461, -0.001164692557093647, +-0.001214692521704101, -0.001264692483278268, -0.001314692441690259, -0.001364692396815520, -0.001414692348529050, -0.001464692296706292, -0.001514692241221360, -0.001564692181949697, +-0.001614692118766304, -0.001664692051546625, -0.001714691980164771, -0.001764691904496188, -0.001814691824416319, -0.001864691739799276, -0.001914691650520504, -0.001964691556455003, +-0.002014691457478216, -0.002064691353464257, -0.002114691244288570, -0.002164691129826155, -0.002214691009952456, -0.002264690884541585, -0.002314690753468987, -0.002364690616609663, +-0.002414690473839055, -0.002464690325031278, -0.002514690170061775, -0.002564690008805546, -0.002614689841138036, -0.002664689666933358, -0.002714689486066956, -0.002764689298414273, +-0.002814689103849424, -0.002864688902247852, -0.002914688693484557, -0.002964688477434985, -0.003014688253973248, -0.003064688022974790, -0.003114687784314611, -0.003164687537868158, +-0.003214687283509542, -0.003264687021114207, -0.003314686750557155, -0.003364686471713830, -0.003414686184458345, -0.003464685888666144, -0.003514685584212229, -0.003564685270972043, +-0.003614684948819701, -0.003664684617630646, -0.003714684277279879, -0.003764683927642846, -0.003814683568593659, -0.003864683200007764, -0.003914682821760604, -0.003964682433726293, +-0.004014682035780276, -0.004064681627797554, -0.004114681209653572, -0.004164680781222442, -0.004214680342379612, -0.004264679893000080, -0.004314679432959292, -0.004364678962131362, +-0.004414678480391734, -0.004464677987615410, -0.004514677483677836, -0.004564676968453123, -0.004614676441816718, -0.004664675903643622, -0.004714675353809280, -0.004764674792187806, +-0.004814674218654644, -0.004864673633085242, -0.004914673035353711, -0.004964672425335498, -0.005014671802905603, -0.005064671167939473, -0.005114670520311221, -0.005164669859896293, +-0.005214669186569690, -0.005264668500206859, -0.005314667800681912, -0.005364667087870295, -0.005414666361647010, -0.005464665621887505, -0.005514664868465890, -0.005564664101257614, +-0.005614663320137677, -0.005664662524981526, -0.005714661715663275, -0.005764660892058370, -0.005814660054042256, -0.005864659201489048, -0.005914658334274192, -0.005964657452272691, +-0.006014656555359989, -0.006064655643410202, -0.006114654716298777, -0.006164653773900714, -0.006214652816091461, -0.006264651842745132, -0.006314650853737174, -0.006364649848942587, +-0.006414648828236821, -0.006464647791493989, -0.006514646738589537, -0.006564645669398468, -0.006614644583796229, -0.006664643481656934, -0.006714642362856032, -0.006764641227268523, +-0.006814640074769854, -0.006864638905234142, -0.006914637718536832, -0.006964636514553373, -0.007014635293157877, -0.007064634054225794, -0.007114632797632125, -0.007164631523252319, +-0.007214630230960490, -0.007264628920632085, -0.007314627592142108, -0.007364626245366005, -0.007414624880177894, -0.007464623496453220, -0.007514622094066987, -0.007564620672894643, +-0.007614619232810304, -0.007664617773689416, -0.007714616295406984, -0.007764614797838455, -0.007814613280857946, -0.007864611744340902, -0.007914610188162774, -0.007964608612197676, +-0.008014607016321057, -0.008064605400407919, -0.008114603764333714, -0.008164602107972555, -0.008214600431199889, -0.008264598733890722, -0.008314597015920503, -0.008364595277163349, +-0.008414593517494705, -0.008464591736789576, -0.008514589934923414, -0.008564588111770332, -0.008614586267205781, -0.008664584401104764, -0.008714582513342728, -0.008764580603793794, +-0.008814578672333408, -0.008864576718837018, -0.008914574743178742, -0.008964572745234031, -0.009014570724877888, -0.009064568681985762, -0.009114566616431770, -0.009164564528091361, +-0.009214562416839541, -0.009264560282551760, -0.009314558125102132, -0.009364555944366110, -0.009414553740218698, -0.009464551512535346, -0.009514549261190171, -0.009564546986058624, +-0.009614544687015707, -0.009664542363936874, -0.009714540016696241, -0.009764537645169259, -0.009814535249231374, -0.009864532828756710, -0.009914530383620711, -0.009964527913698389, +-0.010014525418865189, -0.010064522898995232, -0.010114520353963968, -0.010164517783646403, -0.010214515187917989, -0.010264512566652841, -0.010314509919726413, -0.010364507247013708, +-0.010414504548390180, -0.010464501823729948, -0.010514499072908461, -0.010564496295800726, -0.010614493492282193, -0.010664490662226984, -0.010714487805510547, -0.010764484922007891, +-0.010814482011594467, -0.010864479074144394, -0.010914476109533123, -0.010964473117636106, -0.011014470098327463, -0.011064467051482643, -0.011114463976976656, -0.011164460874684954, +-0.011214457744481654, -0.011264454586242211, -0.011314451399841632, -0.011364448185155368, -0.011414444942057539, -0.011464441670423597, -0.011514438370128553, -0.011564435041047856, +-0.011614431683055627, -0.011664428296027318, -0.011714424879837940, -0.011764421434362944, -0.011814417959476449, -0.011864414455053910, -0.011914410920970779, -0.011964407357101177, +-0.012014403763320554, -0.012064400139503923, -0.012114396485526738, -0.012164392801263114, -0.012214389086588512, -0.012264385341377934, -0.012314381565506839, -0.012364377758849344, +-0.012414373921280905, -0.012464370052676532, -0.012514366152911679, -0.012564362221860465, -0.012614358259398346, -0.012664354265400331, -0.012714350239741875, -0.012764346182297099, +-0.012814342092941456, -0.012864337971550404, -0.012914333817998062, -0.012964329632159885, -0.013014325413910885, -0.013064321163126516, -0.013114316879680898, -0.013164312563449489, +-0.013214308214307299, -0.013264303832129782, -0.013314299416791062, -0.013364294968166593, -0.013414290486131386, -0.013464285970560898, -0.013514281421329251, -0.013564276838311899, +-0.013614272221383856, -0.013664267570420576, -0.013714262885296183, -0.013764258165886134, -0.013814253412065438, -0.013864248623709554, -0.013914243800692604, -0.013964238942890044, +-0.014014234050177330, -0.014064229122428587, -0.014114224159519273, -0.014164219161324397, -0.014214214127719418, -0.014264209058578460, -0.014314203953776979, -0.014364198813189987, +-0.014414193636692942, -0.014464188424159970, -0.014514183175466527, -0.014564177890487626, -0.014614172569098723, -0.014664167211173945, -0.014714161816588750, -0.014764156385218151, +-0.014814150916937604, -0.014864145411621236, -0.014914139869144503, -0.014964134289382865, -0.015014128672210449, -0.015064123017502710, -0.015114117325134664, -0.015164111594981768, +-0.015214105826918149, -0.015264100020819266, -0.015314094176560133, -0.015364088294016209, -0.015414082373061619, -0.015464076413571823, -0.015514070415421837, -0.015564064378487119, +-0.015614058302641795, -0.015664052187761325, -0.015714046033720726, -0.015764039840395455, -0.015814033607659643, -0.015864027335388744, -0.015914021023458222, -0.015964014671742202, +-0.016014008280116145, -0.016064001848455071, -0.016113995376634434, -0.016163988864528363, -0.016213982312012321, -0.016263975718961324, -0.016313969085250832, -0.016363962410754971, +-0.016413955695349206, -0.016463948938908551, -0.016513942141308469, -0.016563935302423088, -0.016613928422127867, -0.016663921500297826, -0.016713914536808424, -0.016763907531533791, +-0.016813900484349390, -0.016863893395130239, -0.016913886263751798, -0.016963879090088198, -0.017013871874014899, -0.017063864615407365, -0.017113857314139724, -0.017163849970087443, +-0.017213842583125534, -0.017263835153129462, -0.017313827679973359, -0.017363820163532689, -0.017413812603682466, -0.017463805000298160, -0.017513797353253893, -0.017563789662425132, +-0.017613781927686898, -0.017663774148914655, -0.017713766325982531, -0.017763758458765991, -0.017813750547140055, -0.017863742590980190, -0.017913734590160522, -0.017963726544556517, +-0.018013718454043638, -0.018063710318496021, -0.018113702137789130, -0.018163693911797979, -0.018213685640398040, -0.018263677323463443, -0.018313668960869653, -0.018363660552491688, +-0.018413652098205020, -0.018463643597883776, -0.018513635051403420, -0.018563626458638981, -0.018613617819465918, -0.018663609133758367, -0.018713600401391792, -0.018763591622241213, +-0.018813582796182105, -0.018863573923088593, -0.018913565002836145, -0.018963556035300231, -0.019013547020354980, -0.019063537957875864, -0.019113528847737902, -0.019163519689816565, +-0.019213510483985979, -0.019263501230121622, -0.019313491928098510, -0.019363482577792111, -0.019413473179076563, -0.019463463731827332, -0.019513454235919443, -0.019563444691228359, +-0.019613435097628223, -0.019663425454994495, -0.019713415763202208, -0.019763406022126822, -0.019813396231642480, -0.019863386391624643, -0.019913376501948788, -0.019963366562489048, +-0.020013356573120887, -0.020063346533719339, -0.020113336444159868, -0.020163326304316612, -0.020213316114065037, -0.020263305873280176, -0.020313295581837493, -0.020363285239611124, +-0.020413274846476547, -0.020463264402308778, -0.020513253906983296, -0.020563243360374236, -0.020613232762357065, -0.020663222112806811, -0.020713211411598948, -0.020763200658607612, +-0.020813189853708274, -0.020863178996775960, -0.020913168087686142, -0.020963157126312963, -0.021013146112531890, -0.021063135046218397, -0.021113123927246621, -0.021163112755492035, +-0.021213101530829667, -0.021263090253134991, -0.021313078922282142, -0.021363067538146596, -0.021413056100603383, -0.021463044609527974, -0.021513033064794511, -0.021563021466278462, +-0.021613009813854861, -0.021662998107399179, -0.021712986346785559, -0.021762974531889471, -0.021812962662585946, -0.021862950738750463, -0.021912938760257156, -0.021962926726981500, +-0.022012914638798974, -0.022062902495583719, -0.022112890297211203, -0.022162878043556464, -0.022212865734494977, -0.022262853369900876, -0.022312840949649644, -0.022362828473616311, +-0.022412815941676351, -0.022462803353703903, -0.022512790709574453, -0.022562778009163020, -0.022612765252345089, -0.022662752438994800, -0.022712739568987630, -0.022762726642198614, +-0.022812713658503223, -0.022862700617775601, -0.022912687519891232, -0.022962674364725585, -0.023012661152152811, -0.023062647882048381, -0.023112634554287335, -0.023162621168745144, +-0.023212607725295958, -0.023262594223815249, -0.023312580664178059, -0.023362567046259858, -0.023412553369934797, -0.023462539635078352, -0.023512525841565560, -0.023562511989271895, +-0.023612498078071507, -0.023662484107839873, -0.023712470078452029, -0.023762455989783451, -0.023812441841708294, -0.023862427634102030, -0.023912413366839698, -0.023962399039796776, +-0.024012384652847413, -0.024062370205867087, -0.024112355698731280, -0.024162341131314140, -0.024212326503491147, -0.024262311815137338, -0.024312297066128193, -0.024362282256337863, +-0.024412267385641825, -0.024462252453915121, -0.024512237461033228, -0.024562222406870299, -0.024612207291301813, -0.024662192114202806, -0.024712176875448768, -0.024762161574913840, +-0.024812146212473508, -0.024862130788002812, -0.024912115301377234, -0.024962099752470924, -0.025012084141159362, -0.025062068467318035, -0.025112052730821094, -0.025162036931544018, +-0.025212021069361851, -0.025262005144150078, -0.025311989155782845, -0.025361973104135641, -0.025411956989083502, -0.025461940810501918, -0.025511924568265034, -0.025561908262248342, +-0.025611891892326877, -0.025661875458376129, -0.025711858960270246, -0.025761842397884715, -0.025811825771094581, -0.025861809079775325, -0.025911792323801100, -0.025961775503047398, +-0.026011758617389698, -0.026061741666702158, -0.026111724650860268, -0.026161707569739061, -0.026211690423214033, -0.026261673211159332, -0.026311655933450449, -0.026361638589962429, +-0.026411621180570753, -0.026461603705149581, -0.026511586163574401, -0.026561568555720252, -0.026611550881462630, -0.026661533140675684, -0.026711515333234907, -0.026761497459015342, +-0.026811479517892475, -0.026861461509740465, -0.026911443434434804, -0.026961425291850975, -0.027011407081863142, -0.027061388804346789, -0.027111370459176967, -0.027161352046229159, +-0.027211333565377530, -0.027261315016497565, -0.027311296399464315, -0.027361277714153264, -0.027411258960438580, -0.027461240138195744, -0.027511221247299811, -0.027561202287626266, +-0.027611183259049273, -0.027661164161444322, -0.027711144994686462, -0.027761125758651181, -0.027811106453212640, -0.027861087078246336, -0.027911067633627315, -0.027961048119231065, +-0.028011028534931755, -0.028061008880604872, -0.028110989156125910, -0.028160969361369033, -0.028210949496209729, -0.028260929560523056, -0.028310909554184499, -0.028360889477068225, +-0.028410869329049730, -0.028460849110004058, -0.028510828819806711, -0.028560808458331845, -0.028610788025454959, -0.028660767521051102, -0.028710746944995771, -0.028760726297163131, +-0.028810705577428673, -0.028860684785667449, -0.028910663921754960, -0.028960642985565367, -0.029010621976974165, -0.029060600895856853, -0.029110579742087594, -0.029160558515541887, +-0.029210537216094783, -0.029260515843621781, -0.029310494397997044, -0.029360472879096072, -0.029410451286793919, -0.029460429620966080, -0.029510407881486723, -0.029560386068231345, +-0.029610364181075002, -0.029660342219893197, -0.029710320184560088, -0.029760298074951178, -0.029810275890941526, -0.029860253632406627, -0.029910231299220651, -0.029960208891259096, +-0.030010186408397463, -0.030060163850509917, -0.030110141217471964, -0.030160118509158659, -0.030210095725445502, -0.030260072866206657, -0.030310049931317636, -0.030360026920653486, +-0.030410003834089715, -0.030459980671500488, -0.030509957432761310, -0.030559934117747239, -0.030609910726333778, -0.030659887258395097, -0.030709863713806695, -0.030759840092443636, +-0.030809816394181417, -0.030859792618894218, -0.030909768766457534, -0.030959744836746430, -0.031009720829636406, -0.031059696745001638, -0.031109672582717626, -0.031159648342659878, +-0.031209624024702565, -0.031259599628721192, -0.031309575154590819, -0.031359550602186953, -0.031409525971383766, -0.031459501262056766, -0.031509476474081012, -0.031559451607332006, +-0.031609426661683933, -0.031659401637012294, -0.031709376533192148, -0.031759351350099004, -0.031809326087607039, -0.031859300745591762, -0.031909275323928225, -0.031959249822491952, +-0.032009224241157104, -0.032059198579799199, -0.032109172838293738, -0.032159147016514907, -0.032209121114338206, -0.032259095131638701, -0.032309069068291903, -0.032359042924171987, +-0.032409016699154469, -0.032458990393114402, -0.032508964005927309, -0.032558937537467358, -0.032608910987610061, -0.032658884356230489, -0.032708857643204151, -0.032758830848405224, +-0.032808803971709224, -0.032858777012991211, -0.032908749972126700, -0.032958722848989867, -0.033008695643456230, -0.033058668355401298, -0.033108640984699247, -0.033158613531225602, +-0.033208585994855419, -0.033258558375464209, -0.033308530672926169, -0.033358502887116795, -0.033408475017911166, -0.033458447065184797, -0.033508419028811860, -0.033558390908667877, +-0.033608362704627921, -0.033658334416567501, -0.033708306044360800, -0.033758277587883329, -0.033808249047010172, -0.033858220421616833, -0.033908191711577496, -0.033958162916767683, +-0.034008134037062911, -0.034058105072337350, -0.034108076022466537, -0.034158046887325523, -0.034208017666789846, -0.034257988360733675, -0.034307958969032534, -0.034357929491561495, +-0.034407899928196074, -0.034457870278810462, -0.034507840543280176, -0.034557810721480287, -0.034607780813286318, -0.034657750818572454, -0.034707720737214204, -0.034757690569086661, +-0.034807660314065333, -0.034857629972024406, -0.034907599542839410, -0.034957569026385416, -0.035007538422537940, -0.035057507731171174, -0.035107476952160634, -0.035157446085381849, +-0.035207415130709012, -0.035257384088017631, -0.035307352957182792, -0.035357321738080011, -0.035407290430583480, -0.035457259034568728, -0.035507227549910828, -0.035557195976485302, +-0.035607164314166342, -0.035657132562829472, -0.035707100722349769, -0.035757068792602757, -0.035807036773462635, -0.035857004664804917, -0.035906972466504691, -0.035956940178437473, +-0.036006907800477460, -0.036056875332500182, -0.036106842774381157, -0.036156810125994580, -0.036206777387215977, -0.036256744557920433, -0.036306711637983477, -0.036356678627279287, +-0.036406645525683408, -0.036456612333070910, -0.036506579049317332, -0.036556545674296857, -0.036606512207885022, -0.036656478649956900, -0.036706445000388034, -0.036756411259052602, +-0.036806377425826146, -0.036856343500583748, -0.036906309483200936, -0.036956275373551908, -0.037006241171512189, -0.037056206876957307, -0.037106172489761467, -0.037156138009800194, +-0.037206103436948579, -0.037256068771082153, -0.037306034012075107, -0.037355999159802970, -0.037405964214140844, -0.037455929174964243, -0.037505894042147381, -0.037555858815565786, +-0.037605823495094538, -0.037655788080609182, -0.037705752571983907, -0.037755716969094251, -0.037805681271815307, -0.037855645480022598, -0.037905609593590336, -0.037955573612394045, +-0.038005537536308823, -0.038055501365210201, -0.038105465098972384, -0.038155428737470895, -0.038205392280581285, -0.038255355728177752, -0.038305319080135826, -0.038355282336330607, +-0.038405245496637624, -0.038455208560931084, -0.038505171529086522, -0.038555134400979026, -0.038605097176484145, -0.038655059855476070, -0.038705022437830354, -0.038754984923422074, +-0.038804947312126782, -0.038854909603818676, -0.038904871798373299, -0.038954833895665737, -0.039004795895571535, -0.039054757797964898, -0.039104719602721369, -0.039154681309716485, +-0.039204642918824452, -0.039254604429920813, -0.039304565842880668, -0.039354527157579547, -0.039404488373891662, -0.039454449491692564, -0.039504410510857332, -0.039554371431261524, +-0.039604332252779345, -0.039654292975286332, -0.039704253598657584, -0.039754214122768652, -0.039804174547493736, -0.039854134872708391, -0.039904095098287698, -0.039954055224107221, +-0.040004015250041158, -0.040053975175965054, -0.040103935001754458, -0.040153894727283583, -0.040203854352427973, -0.040253813877062720, -0.040303773301063384, -0.040353732624304160, +-0.040403691846660615, -0.040453650968007834, -0.040503609988221376, -0.040553568907175444, -0.040603527724745590, -0.040653486440806921, -0.040703445055234974, -0.040753403567903974, +-0.040803361978689466, -0.040853320287466549, -0.040903278494110774, -0.040953236598496368, -0.041003194600498866, -0.041053152499993820, -0.041103110296855448, -0.041153067990959302, +-0.041203025582180482, -0.041252983070394544, -0.041302940455475709, -0.041352897737299520, -0.041402854915741083, -0.041452811990675957, -0.041502768961978360, -0.041552725829523837, +-0.041602682593187494, -0.041652639252844896, -0.041702595808370255, -0.041752552259639121, -0.041802508606526609, -0.041852464848908269, -0.041902420986658327, -0.041952377019652327, +-0.042002332947765383, -0.042052288770873053, -0.042102244488849562, -0.042152200101570454, -0.042202155608911295, -0.042252111010746295, -0.042302066306951019, -0.042352021497400583, +-0.042401976581970535, -0.042451931560535103, -0.042501886432969836, -0.042551841199149856, -0.042601795858950721, -0.042651750412246649, -0.042701704858913204, -0.042751659198825495, +-0.042801613431859079, -0.042851567557888187, -0.042901521576788379, -0.042951475488434761, -0.043001429292702904, -0.043051382989467028, -0.043101336578602698, -0.043151290059985463, +-0.043201243433489564, -0.043251196698990552, -0.043301149856363554, -0.043351102905484121, -0.043401055846226493, -0.043451008678466220, -0.043500961402078424, -0.043550914016938676, +-0.043600866522921194, -0.043650818919901545, -0.043700771207754847, -0.043750723386356667, -0.043800675455581237, -0.043850627415304114, -0.043900579265400426, -0.043950531005745731, +-0.044000482636214269, -0.044050434156681598, -0.044100385567023288, -0.044150336867113567, -0.044200288056828005, -0.044250239136041723, -0.044300190104630280, -0.044350140962467928, +-0.044400091709430219, -0.044450042345392279, -0.044499992870229682, -0.044549943283816659, -0.044599893586028776, -0.044649843776741159, -0.044699793855829374, -0.044749743823167661, +-0.044799693678631590, -0.044849643422096283, -0.044899593053437312, -0.044949542572528915, -0.044999491979246665, -0.045049441273465683, -0.045099390455061540, -0.045149339523908476, +-0.045199288479882069, -0.045249237322857877, -0.045299186052710154, -0.045349134669314464, -0.045399083172545936, -0.045449031562280147, -0.045498979838391330, -0.045548928000755072, +-0.045598876049246485, -0.045648823983741156, -0.045698771804113324, -0.045748719510238560, -0.045798667101991999, -0.045848614579249214, -0.045898561941884450, -0.045948509189773279, +-0.045998456322790836, -0.046048403340812692, -0.046098350243713102, -0.046148297031367629, -0.046198243703651866, -0.046248190260440046, -0.046298136701607748, -0.046348083027030113, +-0.046398029236582712, -0.046447975330139793, -0.046497921307576934, -0.046547867168769276, -0.046597812913592392, -0.046647758541920534, -0.046697704053629274, -0.046747649448593762, +-0.046797594726689568, -0.046847539887790939, -0.046897484931773460, -0.046947429858512274, -0.046997374667882952, -0.047047319359759754, -0.047097263934018259, -0.047147208390534039, +-0.047197152729181360, -0.047247096949835803, -0.047297041052372500, -0.047346985036667039, -0.047396928902593671, -0.047446872650027977, -0.047496816278845104, -0.047546759788920638, +-0.047596703180128826, -0.047646646452345252, -0.047696589605445067, -0.047746532639303854, -0.047796475553795861, -0.047846418348796681, -0.047896361024181454, -0.047946303579825766, +-0.047996246015603879, -0.048046188331391376, -0.048096130527063845, -0.048146072602495545, -0.048196014557562068, -0.048245956392138550, -0.048295898106100583, -0.048345839699322428, +-0.048395781171679676, -0.048445722523047470, -0.048495663753301402, -0.048545604862315725, -0.048595545849966046, -0.048645486716127492, -0.048695427460675671, -0.048745368083484841, +-0.048795308584430583, -0.048845248963388058, -0.048895189220232858, -0.048945129354839231, -0.048995069367082790, -0.049045009256838669, -0.049094949023982475, -0.049144888668388460, +-0.049194828189932226, -0.049244767588489363, -0.049294706863934140, -0.049344646016142149, -0.049394585044988538, -0.049444523950348915, -0.049494462732097538, -0.049544401390110002, +-0.049594339924261460, -0.049644278334427513, -0.049694216620482429, -0.049744154782301805, -0.049794092819760792, -0.049844030732734988, -0.049893968521098668, -0.049943906184727424, +-0.049993843723496419, -0.050043781137281237, -0.050093718425956169, -0.050143655589396804, -0.050193592627478738, -0.050243529540076250, -0.050293466327064940, -0.050343402988319963, +-0.050393339523716926, -0.050443275933130090, -0.050493212216435067, -0.050543148373507013, -0.050593084404221535, -0.050643020308452899, -0.050692956086076713, -0.050742891736968131, +-0.050792827261002774, -0.050842762658054895, -0.050892697928000115, -0.050942633070713589, -0.050992568086070930, -0.051042502973946399, -0.051092437734215616, -0.051142372366754174, +-0.051192306871436367, -0.051242241248137789, -0.051292175496733608, -0.051342109617099431, -0.051392043609109539, -0.051441977472639532, -0.051491911207564592, -0.051541844813760306, +-0.051591778291100975, -0.051641711639462191, -0.051691644858719125, -0.051741577948747397, -0.051791510909421280, -0.051841443740616382, -0.051891376442207877, -0.051941309014071381, +-0.051991241456081159, -0.052041173768112840, -0.052091105950041579, -0.052141038001743002, -0.052190969923091385, -0.052240901713962347, -0.052290833374231495, -0.052340764903773117, +-0.052390696302462826, -0.052440627570175792, -0.052490558706787635, -0.052540489712172643, -0.052590420586206416, -0.052640351328764143, -0.052690281939721438, -0.052740212418952583, +-0.052790142766333197, -0.052840072981738449, -0.052890003065043968, -0.052939933016124034, -0.052989862834854268, -0.053039792521109845, -0.053089722074766380, -0.053139651495698173, +-0.053189580783780832, -0.053239509938889984, -0.053289438960899924, -0.053339367849686257, -0.053389296605124176, -0.053439225227089299, -0.053489153715455907, -0.053539082070099636, +-0.053589010290895661, -0.053638938377719603, -0.053688866330445756, -0.053738794148949741, -0.053788721833106741, -0.053838649382792383, -0.053888576797880956, -0.053938504078248087, +-0.053988431223768958, -0.054038358234319191, -0.054088285109773093, -0.054138211850006272, -0.054188138454894376, -0.054238064924311685, -0.054287991258133828, -0.054337917456236000, +-0.054387843518493816, -0.054437769444781584, -0.054487695234974924, -0.054537620888949027, -0.054587546406579521, -0.054637471787740713, -0.054687397032308217, -0.054737322140157231, +-0.054787247111163381, -0.054837171945200977, -0.054887096642145639, -0.054937021201872556, -0.054986945624257363, -0.055036869909174370, -0.055086794056499196, -0.055136718066107482, +-0.055186641937873530, -0.055236565671672976, -0.055286489267381000, -0.055336412724873253, -0.055386336044024022, -0.055436259224708954, -0.055486182266803241, -0.055536105170182516, +-0.055586027934721081, -0.055635950560294578, -0.055685873046778203, -0.055735795394047584, -0.055785717601977036, -0.055835639670442187, -0.055885561599318248, -0.055935483388480846, +-0.055985405037804289, -0.056035326547164220, -0.056085247916435835, -0.056135169145494775, -0.056185090234215349, -0.056235011182473198, -0.056284931990143956, -0.056334852657101947, +-0.056384773183222804, -0.056434693568381732, -0.056484613812454364, -0.056534533915315023, -0.056584453876839344, -0.056634373696902530, -0.056684293375380224, -0.056734212912146746, +-0.056784132307077732, -0.056834051560048386, -0.056883970670934363, -0.056933889639609964, -0.056983808465950837, -0.057033727149832195, -0.057083645691129677, -0.057133564089717599, +-0.057183482345471610, -0.057233400458267365, -0.057283318427979173, -0.057333236254482681, -0.057383153937653100, -0.057433071477366079, -0.057482988873495934, -0.057532906125918319, +-0.057582823234508439, -0.057632740199141941, -0.057682657019693155, -0.057732573696037723, -0.057782490228050855, -0.057832406615608206, -0.057882322858584100, -0.057932238956854183, +-0.057982154910293668, -0.058032070718778216, -0.058081986382182135, -0.058131901900381096, -0.058181817273250738, -0.058231732500665399, -0.058281647582500727, -0.058331562518631939, +-0.058381477308934684, -0.058431391953283292, -0.058481306451553423, -0.058531220803620290, -0.058581135009359540, -0.058631049068645517, -0.058680962981353869, -0.058730876747359814, +-0.058780790366539007, -0.058830703838765784, -0.058880617163915801, -0.058930530341864275, -0.058980443372486868, -0.059030356255657911, -0.059080268991253057, -0.059130181579147532, +-0.059180094019216999, -0.059230006311335792, -0.059279918455379561, -0.059329830451223982, -0.059379742298743383, -0.059429653997813428, -0.059479565548309334, -0.059529476950106776, +-0.059579388203080078, -0.059629299307104908, -0.059679210262056491, -0.059729121067810496, -0.059779031724241254, -0.059828942231224432, -0.059878852588635248, -0.059928762796349386, +-0.059978672854241168, -0.060028582762186269, -0.060078492520059909, -0.060128402127737769, -0.060178311585094173, -0.060228220892004802, -0.060278130048345320, -0.060328039053990076, +-0.060377947908814726, -0.060427856612694508, -0.060477765165505099, -0.060527673567120827, -0.060577581817417368, -0.060627489916269962, -0.060677397863554271, -0.060727305659144644, +-0.060777213302916751, -0.060827120794745823, -0.060877028134507544, -0.060926935322076242, -0.060976842357327608, -0.061026749240136867, -0.061076655970379694, -0.061126562547930439, +-0.061176468972664780, -0.061226375244458384, -0.061276281363185615, -0.061326187328722137, -0.061376093140943194, -0.061425998799724463, -0.061475904304940286, -0.061525809656466354, +-0.061575714854177899, -0.061625619897950595, -0.061675524787658802, -0.061725429523178194, -0.061775334104384010, -0.061825238531151940, -0.061875142803356327, -0.061925046920872862, +-0.061974950883576775, -0.062024854691343750, -0.062074758344048152, -0.062124661841565655, -0.062174565183771950, -0.062224468370541387, -0.062274371401749649, -0.062324274277271989, +-0.062374176996984082, -0.062424079560760293, -0.062473981968476297, -0.062523884220007361, -0.062573786315229141, -0.062623688254016027, -0.062673590036243676, -0.062723491661787367, +-0.062773393130522756, -0.062823294442324235, -0.062873195597067472, -0.062923096594627720, -0.062972997434880662, -0.063022898117700676, -0.063072798642963432, -0.063122699010544209, +-0.063172599220318676, -0.063222499272161198, -0.063272399165947471, -0.063322298901553192, -0.063372198478852726, -0.063422097897721755, -0.063471997158035545, -0.063521896259669794, +-0.063571795202498851, -0.063621693986398414, -0.063671592611243749, -0.063721491076910539, -0.063771389383273161, -0.063821287530207313, -0.063871185517588247, -0.063921083345291660, +-0.063970981013191916, -0.064020878521164726, -0.064070775869085342, -0.064120673056829447, -0.064170570084271447, -0.064220466951287011, -0.064270363657751850, -0.064320260203540328, +-0.064370156588528168, -0.064420052812590611, -0.064469948875603367, -0.064519844777440813, -0.064569740517978647, -0.064619636097092120, -0.064669531514656958, -0.064719426770547511, +-0.064769321864639504, -0.064819216796808188, -0.064869111566929274, -0.064919006174877142, -0.064968900620527500, -0.065018794903755603, -0.065068689024437160, -0.065118582982446549, +-0.065168476777659481, -0.065218370409951654, -0.065268263879197472, -0.065318157185272632, -0.065368050328052388, -0.065417943307412477, -0.065467836123227249, -0.065517728775372430, +-0.065567621263723300, -0.065617513588155554, -0.065667405748543586, -0.065717297744763106, -0.065767189576689367, -0.065817081244198106, -0.065866972747163702, -0.065916864085461865, +-0.065966755258967863, -0.066016646267557419, -0.066066537111104925, -0.066116427789486079, -0.066166318302576160, -0.066216208650250893, -0.066266098832384657, -0.066315988848853188, +-0.066365878699532171, -0.066415768384296026, -0.066465657903020461, -0.066515547255580745, -0.066565436441852602, -0.066615325461710437, -0.066665214315029947, -0.066715103001686427, +-0.066764991521555586, -0.066814879874511832, -0.066864768060430874, -0.066914656079187992, -0.066964543930658912, -0.067014431614718040, -0.067064319131241085, -0.067114206480103328, +-0.067164093661180507, -0.067213980674347001, -0.067263867519478535, -0.067313754196450859, -0.067363640705138353, -0.067413527045416727, -0.067463413217161303, -0.067513299220247777, +-0.067563185054550570, -0.067613070719945392, -0.067662956216307552, -0.067712841543512745, -0.067762726701435405, -0.067812611689951244, -0.067862496508935555, -0.067912381158264062, +-0.067962265637811173, -0.068012149947452624, -0.068062034087063711, -0.068111918056520143, -0.068161801855696341, -0.068211685484468029, -0.068261568942710946, -0.068311452230299496, +-0.068361335347109420, -0.068411218293016010, -0.068461101067894992, -0.068510983671620784, -0.068560866104069113, -0.068610748365115271, -0.068660630454635010, -0.068710512372502724, +-0.068760394118594165, -0.068810275692784612, -0.068860157094949817, -0.068910038324964187, -0.068959919382703461, -0.069009800268042931, -0.069059680980858351, -0.069109561521024127, +-0.069159441888415996, -0.069209322082909697, -0.069259202104379650, -0.069309081952701607, -0.069358961627750862, -0.069408841129403140, -0.069458720457532888, -0.069508599612015817, +-0.069558478592727263, -0.069608357399542950, -0.069658236032337298, -0.069708114490986059, -0.069757992775364541, -0.069807870885348469, -0.069857748820812290, -0.069907626581631729, +-0.069957504167682108, -0.070007381578839165, -0.070057258814977333, -0.070107135875972351, -0.070157012761699528, -0.070206889472034614, -0.070256766006852031, -0.070306642366027544, +-0.070356518549436878, -0.070406394556954480, -0.070456270388456102, -0.070506146043817039, -0.070556021522913057, -0.070605896825618589, -0.070655771951809360, -0.070705646901360719, +-0.070755521674148392, -0.070805396270046825, -0.070855270688931757, -0.070905144930678524, -0.070955018995162863, -0.071004892882259210, -0.071054766591843330, -0.071104640123790544, +-0.071154513477976578, -0.071204386654275906, -0.071254259652564253, -0.071304132472717399, -0.071354005114609778, -0.071403877578117142, -0.071453749863114799, -0.071503621969478542, +-0.071553493897082779, -0.071603365645803274, -0.071653237215515364, -0.071703108606094801, -0.071752979817416018, -0.071802850849354796, -0.071852721701786443, -0.071902592374586724, +-0.071952462867630088, -0.072002333180792299, -0.072052203313948668, -0.072102073266974973, -0.072151943039745647, -0.072201812632136472, -0.072251682044023213, -0.072301551275280290, +-0.072351420325783497, -0.072401289195408156, -0.072451157884030032, -0.072501026391523574, -0.072550894717764547, -0.072600762862628287, -0.072650630825990561, -0.072700498607725816, +-0.072750366207709818, -0.072800233625817903, -0.072850100861925851, -0.072899967915908109, -0.072949834787640444, -0.072999701476998191, -0.073049567983857130, -0.073099434308091710, +-0.073149300449577695, -0.073199166408190436, -0.073249032183805698, -0.073298897776297930, -0.073348763185542940, -0.073398628411416464, -0.073448493453792979, -0.073498358312548265, +-0.073548222987557657, -0.073598087478696936, -0.073647951785840535, -0.073697815908864275, -0.073747679847643466, -0.073797543602053900, -0.073847407171970039, -0.073897270557267650, +-0.073947133757822095, -0.073996996773509141, -0.074046859604203263, -0.074096722249780228, -0.074146584710115385, -0.074196446985084527, -0.074246309074562103, -0.074296170978423906, +-0.074346032696545730, -0.074395894228802037, -0.074445755575068592, -0.074495616735220774, -0.074545477709134347, -0.074595338496683788, -0.074645199097744877, -0.074695059512192963, +-0.074744919739903853, -0.074794779780751997, -0.074844639634613200, -0.074894499301362799, -0.074944358780876588, -0.074994218073029043, -0.075044077177695956, -0.075093936094752664, +-0.075143794824074975, -0.075193653365537363, -0.075243511719015624, -0.075293369884385536, -0.075343227861521589, -0.075393085650299577, -0.075442943250594835, -0.075492800662283185, +-0.075542657885239090, -0.075592514919338355, -0.075642371764456331, -0.075692228420468813, -0.075742084887250288, -0.075791941164676552, -0.075841797252622967, -0.075891653150965327, +-0.075941508859578108, -0.075991364378337117, -0.076041219707117719, -0.076091074845795706, -0.076140929794245582, -0.076190784552343113, -0.076240639119963691, -0.076290493496983122, +-0.076340347683275869, -0.076390201678717740, -0.076440055483184555, -0.076489909096550790, -0.076539762518692253, -0.076589615749484308, -0.076639468788802775, -0.076689321636522118, +-0.076739174292518156, -0.076789026756666254, -0.076838879028842233, -0.076888731108920583, -0.076938582996777097, -0.076988434692287153, -0.077038286195326558, -0.077088137505769816, +-0.077137988623492720, -0.077187839548370663, -0.077237690280279436, -0.077287540819093559, -0.077337391164688810, -0.077387241316941038, -0.077437091275724720, -0.077486941040915677, +-0.077536790612389273, -0.077586639990021342, -0.077636489173686360, -0.077686338163260163, -0.077736186958618114, -0.077786035559636049, -0.077835883966188443, -0.077885732178151132, +-0.077935580195399493, -0.077985428017809347, -0.078035275645255184, -0.078085123077612825, -0.078134970314757676, -0.078184817356565531, -0.078234664202910906, -0.078284510853669609, +-0.078334357308717489, -0.078384203567929037, -0.078434049631180058, -0.078483895498345974, -0.078533741169302590, -0.078583586643924397, -0.078633431922087257, -0.078683277003666521, +-0.078733121888538038, -0.078782966576576310, -0.078832811067657174, -0.078882655361656007, -0.078932499458448629, -0.078982343357909574, -0.079032187059914660, -0.079082030564339281, +-0.079131873871059258, -0.079181716979949121, -0.079231559890884679, -0.079281402603741780, -0.079331245118394941, -0.079381087434719985, -0.079430929552592316, -0.079480771471887757, +-0.079530613192480823, -0.079580454714247365, -0.079630296037062773, -0.079680137160802883, -0.079729978085342199, -0.079779818810556569, -0.079829659336321399, -0.079879499662512524, +-0.079929339789004461, -0.079979179715673032, -0.080029019442393670, -0.080078858969042196, -0.080128698295493128, -0.080178537421622315, -0.080228376347305161, -0.080278215072417516, +-0.080328053596833884, -0.080377891920430114, -0.080427730043082069, -0.080477567964664251, -0.080527405685052511, -0.080577243204122254, -0.080627080521749328, -0.080676917637808265, +-0.080726754552174915, -0.080776591264724668, -0.080826427775333387, -0.080876264083875590, -0.080926100190227140, -0.080975936094263443, -0.081025771795860346, -0.081075607294892368, +-0.081125442591235386, -0.081175277684764791, -0.081225112575356431, -0.081274947262884867, -0.081324781747225919, -0.081374616028255478, -0.081424450105848034, -0.081474283979879478, +-0.081524117650225214, -0.081573951116761093, -0.081623784379361644, -0.081673617437902746, -0.081723450292259803, -0.081773282942308678, -0.081823115387923889, -0.081872947628981327, +-0.081922779665356396, -0.081972611496924946, -0.082022443123561536, -0.082072274545142015, -0.082122105761541803, -0.082171936772636775, -0.082221767578301463, -0.082271598178411731, +-0.082321428572843441, -0.082371258761471139, -0.082421088744170687, -0.082470918520817518, -0.082520748091287496, -0.082570577455455166, -0.082620406613196390, -0.082670235564386588, +-0.082720064308901650, -0.082769892846616108, -0.082819721177405825, -0.082869549301146248, -0.082919377217713239, -0.082969204926981344, -0.083019032428826439, -0.083068859723123945, +-0.083118686809749751, -0.083168513688578388, -0.083218340359485748, -0.083268166822347264, -0.083317993077038799, -0.083367819123434911, -0.083417644961411463, -0.083467470590844361, +-0.083517296011608136, -0.083567121223578664, -0.083616946226631392, -0.083666771020642211, -0.083716595605485639, -0.083766419981037593, -0.083816244147173494, -0.083866068103769217, +-0.083915891850699337, -0.083965715387839729, -0.084015538715065827, -0.084065361832253521, -0.084115184739277371, -0.084165007436013253, -0.084214829922336629, -0.084264652198123360, +-0.084314474263248021, -0.084364296117586501, -0.084414117761014679, -0.084463939193407125, -0.084513760414639719, -0.084563581424587905, -0.084613402223127590, -0.084663222810133332, +-0.084713043185481007, -0.084762863349046078, -0.084812683300704433, -0.084862503040330634, -0.084912322567800583, -0.084962141882989714, -0.085011960985773946, -0.085061779876027824, +-0.085111598553627252, -0.085161417018447691, -0.085211235270365032, -0.085261053309253834, -0.085310871134990002, -0.085360688747449440, -0.085410506146506721, -0.085460323332037721, +-0.085510140303917931, -0.085559957062023212, -0.085609773606228165, -0.085659589936408695, -0.085709406052440235, -0.085759221954198717, -0.085809037641558686, -0.085858853114396075, +-0.085908668372586330, -0.085958483416005343, -0.086008298244527714, -0.086058112858029348, -0.086107927256385691, -0.086157741439472649, -0.086207555407164821, -0.086257369159338113, +-0.086307182695868415, -0.086356996016630314, -0.086406809121499728, -0.086456622010352119, -0.086506434683063405, -0.086556247139508144, -0.086606059379562284, -0.086655871403101256, +-0.086705683210001008, -0.086755494800136099, -0.086805306173382460, -0.086855117329615553, -0.086904928268711296, -0.086954738990544289, -0.087004549494990410, -0.087054359781925175, +-0.087104169851224475, -0.087153979702762910, -0.087203789336416399, -0.087253598752060416, -0.087303407949570866, -0.087353216928822364, -0.087403025689690814, -0.087452834232052148, +-0.087502642555780955, -0.087552450660753151, -0.087602258546844225, -0.087652066213930097, -0.087701873661885352, -0.087751680890585923, -0.087801487899907299, -0.087851294689725398, +-0.087901101259914807, -0.087950907610351473, -0.088000713740910869, -0.088050519651468928, -0.088100325341900237, -0.088150130812080729, -0.088199936061885906, -0.088249741091191672, +-0.088299545899872656, -0.088349350487804762, -0.088399154854863951, -0.088448959000924796, -0.088498762925863242, -0.088548566629554792, -0.088598370111875366, -0.088648173372699562, +-0.088697976411903343, -0.088747779229362167, -0.088797581824951996, -0.088847384198547416, -0.088897186350024388, -0.088946988279258385, -0.088996789986125355, -0.089046591470499911, +-0.089096392732257987, -0.089146193771275084, -0.089195994587427135, -0.089245795180588755, -0.089295595550635889, -0.089345395697444485, -0.089395195620889142, -0.089444995320845808, +-0.089494794797189997, -0.089544594049797629, -0.089594393078543333, -0.089644191883303068, -0.089693990463952308, -0.089743788820367015, -0.089793586952421817, -0.089843384859992645, +-0.089893182542955016, -0.089942980001184877, -0.089992777234556828, -0.090042574242946857, -0.090092371026230439, -0.090142167584283533, -0.090191963916980769, -0.090241760024198106, +-0.090291555905811033, -0.090341351561695510, -0.090391146991726165, -0.090440942195778959, -0.090490737173729838, -0.090540531925453430, -0.090590326450825695, -0.090640120749722136, +-0.090689914822018727, -0.090739708667590083, -0.090789502286312176, -0.090839295678060511, -0.090889088842711033, -0.090938881780138411, -0.090988674490218580, -0.091038466972827053, +-0.091088259227839807, -0.091138051255131469, -0.091187843054578013, -0.091237634626054942, -0.091287425969438216, -0.091337217084602504, -0.091387007971423725, -0.091436798629777882, +-0.091486589059539603, -0.091536379260584846, -0.091586169232789144, -0.091635958976028470, -0.091685748490177438, -0.091735537775112050, -0.091785326830707809, -0.091835115656840702, +-0.091884904253385344, -0.091934692620217751, -0.091984480757213410, -0.092034268664248312, -0.092084056341197096, -0.092133843787935751, -0.092183631004339794, -0.092233417990285199, +-0.092283204745646608, -0.092332991270300008, -0.092382777564121388, -0.092432563626985362, -0.092482349458767946, -0.092532135059344642, -0.092581920428591452, -0.092631705566383005, +-0.092681490472595301, -0.092731275147103873, -0.092781059589784706, -0.092830843800512444, -0.092880627779163061, -0.092930411525612128, -0.092980195039735591, -0.093029978321408135, +-0.093079761370505720, -0.093129544186903918, -0.093179326770478688, -0.093229109121104700, -0.093278891238657943, -0.093328673123014391, -0.093378454774048728, -0.093428236191636926, +-0.093478017375654518, -0.093527798325977518, -0.093577579042480583, -0.093627359525039699, -0.093677139773530427, -0.093726919787828725, -0.093776699567809305, -0.093826479113348113, +-0.093876258424320735, -0.093926037500603160, -0.093975816342070043, -0.094025594948597385, -0.094075373320060732, -0.094125151456336098, -0.094174929357298140, -0.094224707022822859, +-0.094274484452785814, -0.094324261647062993, -0.094374038605529079, -0.094423815328060073, -0.094473591814531965, -0.094523368064819438, -0.094573144078798480, -0.094622919856344676, +-0.094672695397334014, -0.094722470701641165, -0.094772245769142144, -0.094822020599712509, -0.094871795193228262, -0.094921569549564086, -0.094971343668595984, -0.095021117550199527, +-0.095070891194250703, -0.095120664600624225, -0.095170437769196078, -0.095220210699841851, -0.095269983392437529, -0.095319755846857798, -0.095369528062978687, -0.095419300040676197, +-0.095469071779825013, -0.095518843280301149, -0.095568614541980179, -0.095618385564738118, -0.095668156348449648, -0.095717926892990787, -0.095767697198237120, -0.095817467264064635, +-0.095867237090348043, -0.095917006676963359, -0.095966776023786171, -0.096016545130692466, -0.096066313997556968, -0.096116082624255680, -0.096165851010664188, -0.096215619156658508, +-0.096265387062113336, -0.096315154726904703, -0.096364922150908625, -0.096414689333999798, -0.096464456276054253, -0.096514222976947561, -0.096563989436555753, -0.096613755654753525, +-0.096663521631416921, -0.096713287366421499, -0.096763052859643303, -0.096812818110957044, -0.096862583120238738, -0.096912347887363956, -0.096962112412208770, -0.097011876694647850, +-0.097061640734557239, -0.097111404531812523, -0.097161168086289745, -0.097210931397863590, -0.097260694466410128, -0.097310457291804917, -0.097360219873924000, -0.097409982212642104, +-0.097459744307835244, -0.097509506159379464, -0.097559267767149488, -0.097609029131021333, -0.097658790250870597, -0.097708551126573340, -0.097758311758004271, -0.097808072145039407, +-0.097857832287554375, -0.097907592185425191, -0.097957351838526593, -0.098007111246734613, -0.098056870409924848, -0.098106629327973358, -0.098156388000754852, -0.098206146428145374, +-0.098255904610020539, -0.098305662546256375, -0.098355420236727623, -0.098405177681310310, -0.098454934879880496, -0.098504691832312904, -0.098554448538483580, -0.098604204998268136, +-0.098653961211542615, -0.098703717178181757, -0.098753472898061606, -0.098803228371057775, -0.098852983597046321, -0.098902738575901955, -0.098952493307500750, -0.099002247791718304, +-0.099052002028430675, -0.099101756017512616, -0.099151509758840156, -0.099201263252288924, -0.099251016497734976, -0.099300769495053037, -0.099350522244119194, -0.099400274744809475, +-0.099450026996998619, -0.099499779000562713, -0.099549530755377341, -0.099599282261318603, -0.099649033518261210, -0.099698784526081233, -0.099748535284654286, -0.099798285793856453, +-0.099848036053562461, -0.099897786063648381, -0.099947535823989839, -0.099997285334462893, -0.100047034594942280, -0.100096783605304110, -0.100146532365423950, -0.100196280875177910, +-0.100246029134440740, -0.100295777143088490, -0.100345524900997240, -0.100395272408041730, -0.100445019664098050, -0.100494766669041810, -0.100544513422749100, -0.100594259925094660, +-0.100644006175954580, -0.100693752175204470, -0.100743497922720430, -0.100793243418377210, -0.100842988662050880, -0.100892733653617060, -0.100942478392951870, -0.100992222879930040, +-0.101041967114427640, -0.101091711096320330, -0.101141454825484170, -0.101191198301793950, -0.101240941525125740, -0.101290684495355150, -0.101340427212358310, -0.101390169676009960, +-0.101439911886186170, -0.101489653842763050, -0.101539395545615360, -0.101589136994619190, -0.101638878189650160, -0.101688619130584380, -0.101738359817296620, -0.101788100249662950, +-0.101837840427559030, -0.101887580350860960, -0.101937320019443490, -0.101987059433182720, -0.102036798591954290, -0.102086537495634320, -0.102136276144097570, -0.102186014537220120, +-0.102235752674877630, -0.102285490556946200, -0.102335228183300610, -0.102384965553816950, -0.102434702668371320, -0.102484439526838490, -0.102534176129094550, -0.102583912475015180, +-0.102633648564476460, -0.102683384397353190, -0.102733119973521460, -0.102782855292856910, -0.102832590355235690, -0.102882325160532530, -0.102932059708623570, -0.102981793999384450, +-0.103031528032691310, -0.103081261808418880, -0.103130995326443320, -0.103180728586640250, -0.103230461588885810, -0.103280194333054780, -0.103329926819023250, -0.103379659046667360, +-0.103429391015861880, -0.103479122726482910, -0.103528854178406140, -0.103578585371507690, -0.103628316305662310, -0.103678046980746160, -0.103727777396634880, -0.103777507553204600, +-0.103827237450330110, -0.103876967087887530, -0.103926696465752530, -0.103976425583801230, -0.104026154441908420, -0.104075883039950230, -0.104125611377802340, -0.104175339455340850, +-0.104225067272440570, -0.104274794828977630, -0.104324522124827690, -0.104374249159866900, -0.104423975933970040, -0.104473702447013250, -0.104523428698872630, -0.104573154689423010, +-0.104622880418540500, -0.104672605886100780, -0.104722331091979990, -0.104772056036052940, -0.104821780718195740, -0.104871505138284100, -0.104921229296194130, -0.104970953191800640, +-0.105020676824979770, -0.105070400195607220, -0.105120123303559090, -0.105169846148710220, -0.105219568730936740, -0.105269291050114340, -0.105319013106119140, -0.105368734898825980, +-0.105418456428110980, -0.105468177693850280, -0.105517898695918700, -0.105567619434192360, -0.105617339908546980, -0.105667060118858680, -0.105716780065002310, -0.105766499746853970, +-0.105816219164289390, -0.105865938317184700, -0.105915657205414720, -0.105965375828855610, -0.106015094187383040, -0.106064812280873190, -0.106114530109200870, -0.106164247672242220, +-0.106213964969872950, -0.106263682001969210, -0.106313398768405830, -0.106363115269058950, -0.106412831503804720, -0.106462547472517960, -0.106512263175074850, -0.106561978611351070, +-0.106611693781222790, -0.106661408684564830, -0.106711123321253350, -0.106760837691164070, -0.106810551794173130, -0.106860265630155370, -0.106909979198986940, -0.106959692500543570, +-0.107009405534701410, -0.107059118301335300, -0.107108830800321380, -0.107158543031535390, -0.107208254994853480, -0.107257966690150500, -0.107307678117302600, -0.107357389276185950, +-0.107407100166675370, -0.107456810788647050, -0.107506521141976700, -0.107556231226540500, -0.107605941042213270, -0.107655650588871180, -0.107705359866389970, -0.107755068874645810, +-0.107804777613513540, -0.107854486082869310, -0.107904194282588880, -0.107953902212548390, -0.108003609872622710, -0.108053317262688010, -0.108103024382620010, -0.108152731232294890, +-0.108202437811587520, -0.108252144120374020, -0.108301850158530190, -0.108351555925932170, -0.108401261422454810, -0.108450966647974300, -0.108500671602366820, -0.108550376285507220, +-0.108600080697271670, -0.108649784837535910, -0.108699488706176160, -0.108749192303067220, -0.108798895628085310, -0.108848598681106160, -0.108898301462005950, -0.108948003970659550, +-0.108997706206943140, -0.109047408170732470, -0.109097109861903710, -0.109146811280331740, -0.109196512425892750, -0.109246213298462470, -0.109295913897917100, -0.109345614224131500, +-0.109395314276981860, -0.109445014056344380, -0.109494713562093930, -0.109544412794106690, -0.109594111752258420, -0.109643810436425320, -0.109693508846482240, -0.109743206982305390, +-0.109792904843770520, -0.109842602430753850, -0.109892299743130210, -0.109941996780775830, -0.109991693543566460, -0.110041390031378290, -0.110091086244086200, -0.110140782181566410, +-0.110190477843694650, -0.110240173230347140, -0.110289868341398770, -0.110339563176725720, -0.110389257736204200, -0.110438952019709090, -0.110488646027116610, -0.110538339758302500, +-0.110588033213143010, -0.110637726391512970, -0.110687419293288620, -0.110737111918345720, -0.110786804266560480, -0.110836496337807800, -0.110886188131963880, -0.110935879648904490, +-0.110985570888505830, -0.111035261850642800, -0.111084952535191630, -0.111134642942028070, -0.111184333071028350, -0.111234022922067340, -0.111283712495021280, -0.111333401789765950, +-0.111383090806177550, -0.111432779544130970, -0.111482468003502460, -0.111532156184168220, -0.111581844086003130, -0.111631531708883440, -0.111681219052684920, -0.111730906117283810, +-0.111780592902554970, -0.111830279408374660, -0.111879965634618650, -0.111929651581163160, -0.111979337247883120, -0.112029022634654720, -0.112078707741353770, -0.112128392567856490, +-0.112178077114037780, -0.112227761379773890, -0.112277445364940580, -0.112327129069414110, -0.112376812493069370, -0.112426495635782610, -0.112476178497430040, -0.112525861077886590, +-0.112575543377028490, -0.112625225394731520, -0.112674907130871940, -0.112724588585324640, -0.112774269757965880, -0.112823950648671440, -0.112873631257317560, -0.112923311583779160, +-0.112972991627932490, -0.113022671389653340, -0.113072350868817950, -0.113122030065301240, -0.113171708978979460, -0.113221387609728400, -0.113271065957424310, -0.113320744021942130, +-0.113370421803158080, -0.113420099300948420, -0.113469776515188070, -0.113519453445753270, -0.113569130092519840, -0.113618806455364030, -0.113668482534160760, -0.113718158328786290, +-0.113767833839116410, -0.113817509065027400, -0.113867184006394170, -0.113916858663092990, -0.113966533034999650, -0.114016207121990430, -0.114065880923940240, -0.114115554440725350, +-0.114165227672221580, -0.114214900618305180, -0.114264573278851090, -0.114314245653735560, -0.114363917742834860, -0.114413589546023930, -0.114463261063179010, -0.114512932294175960, +-0.114562603238891000, -0.114612273897199110, -0.114661944268976520, -0.114711614354099070, -0.114761284152443040, -0.114810953663883340, -0.114860622888296270, -0.114910291825557630, +-0.114959960475543720, -0.115009628838129460, -0.115059296913191130, -0.115108964700604540, -0.115158632200246000, -0.115208299411990430, -0.115257966335714100, -0.115307632971292870, +-0.115357299318603000, -0.115406965377519430, -0.115456631147918460, -0.115506296629676330, -0.115555961822668040, -0.115605626726769840, -0.115655291341857580, -0.115704955667807520, +-0.115754619704494630, -0.115804283451795190, -0.115853946909585050, -0.115903610077740480, -0.115953272956136440, -0.116002935544649230, -0.116052597843154660, -0.116102259851529050, +-0.116151921569647360, -0.116201582997385850, -0.116251244134620390, -0.116300904981227260, -0.116350565537081420, -0.116400225802059180, -0.116449885776036810, -0.116499545458889270, +-0.116549204850492890, -0.116598863950723480, -0.116648522759457360, -0.116698181276569490, -0.116747839501936170, -0.116797497435433250, -0.116847155076937020, -0.116896812426322470, +-0.116946469483465880, -0.116996126248243130, -0.117045782720530480, -0.117095438900202960, -0.117145094787136830, -0.117194750381207970, -0.117244405682292660, -0.117294060690265920, +-0.117343715405004000, -0.117393369826383250, -0.117443023954278640, -0.117492677788566450, -0.117542331329122590, -0.117591984575823330, -0.117641637528543660, -0.117691290187159900, +-0.117740942551547920, -0.117790594621584030, -0.117840246397143200, -0.117889897878101770, -0.117939549064335570, -0.117989199955720960, -0.118038850552132900, -0.118088500853447710, +-0.118138150859541280, -0.118187800570289910, -0.118237449985568590, -0.118287099105253660, -0.118336747929220970, -0.118386396457346850, -0.118436044689506300, -0.118485692625575650, +-0.118535340265431190, -0.118584987608947950, -0.118634634656002240, -0.118684281406469940, -0.118733927860227390, -0.118783574017149560, -0.118833219877112820, -0.118882865439993000, +-0.118932510705666470, -0.118982155674008230, -0.119031800344894590, -0.119081444718201470, -0.119131088793805160, -0.119180732571580680, -0.119230376051404390, -0.119280019233152150, +-0.119329662116700310, -0.119379304701923860, -0.119428946988699160, -0.119478588976902530, -0.119528230666408980, -0.119577872057094860, -0.119627513148836060, -0.119677153941508910, +-0.119726794434988450, -0.119776434629150980, -0.119826074523872450, -0.119875714119029160, -0.119925353414496140, -0.119974992410149750, -0.120024631105865860, -0.120074269501520850, +-0.120123907596989720, -0.120173545392148830, -0.120223182886874070, -0.120272820081041790, -0.120322456974527020, -0.120372093567206110, -0.120421729858955410, -0.120471365849649930, +-0.120521001539166050, -0.120570636927379670, -0.120620272014167130, -0.120669906799403470, -0.120719541282965040, -0.120769175464727760, -0.120818809344567980, -0.120868442922360740, +-0.120918076197982390, -0.120967709171308850, -0.121017341842216480, -0.121066974210580310, -0.121116606276276710, -0.121166238039181580, -0.121215869499171320, -0.121265500656120930, +-0.121315131509906790, -0.121364762060405270, -0.121414392307491390, -0.121464022251041540, -0.121513651890931630, -0.121563281227038040, -0.121612910259235790, -0.121662538987401270, +-0.121712167411410420, -0.121761795531139570, -0.121811423346463800, -0.121861050857259470, -0.121910678063402510, -0.121960304964769300, -0.122009931561234890, -0.122059557852675640, +-0.122109183838967500, -0.122158809519986850, -0.122208434895608730, -0.122258059965709510, -0.122307684730165160, -0.122357309188852030, -0.122406933341645190, -0.122456557188421020, +-0.122506180729055890, -0.122555803963424870, -0.122605426891404340, -0.122655049512870230, -0.122704671827698950, -0.122754293835765550, -0.122803915536946420, -0.122853536931117500, +-0.122903158018155170, -0.122952778797934510, -0.123002399270331910, -0.123052019435223300, -0.123101639292485080, -0.123151258841992340, -0.123200878083621430, -0.123250497017248330, +-0.123300115642749440, -0.123349733959999800, -0.123399351968875850, -0.123448969669253950, -0.123498587061009180, -0.123548204144017950, -0.123597820918156200, -0.123647437383300350, +-0.123697053539325460, -0.123746669386107940, -0.123796284923523740, -0.123845900151449280, -0.123895515069759610, -0.123945129678331170, -0.123994743977039900, -0.124044357965762210, +-0.124093971644373190, -0.124143585012749230, -0.124193198070766310, -0.124242810818300840, -0.124292423255227910, -0.124342035381423910, -0.124391647196765260, -0.124441258701127060, +-0.124490869894385710, -0.124540480776417190, -0.124590091347097890, -0.124639701606302940, -0.124689311553908740, -0.124738921189791240, -0.124788530513826890, -0.124838139525890780, +-0.124887748225859310, -0.124937356613608480, -0.124986964689014700, -0.125036572451953040, -0.125086179902299980, -0.125135787039931470, -0.125185393864723910, -0.125235000376552440, +-0.125284606575293470, -0.125334212460822990, -0.125383818033017400, -0.125433423291751830, -0.125483028236902720, -0.125532632868346460, -0.125582237185958180, -0.125631841189614320, +-0.125681444879190830, -0.125731048254564190, -0.125780651315609500, -0.125830254062203160, -0.125879856494221200, -0.125929458611540030, -0.125979060414034780, -0.126028661901581850, +-0.126078263074057310, -0.126127863931337510, -0.126177464473297640, -0.126227064699814100, -0.126276664610762900, -0.126326264206020470, -0.126375863485461950, -0.126425462448963770, +-0.126475061096402390, -0.126524659427652900, -0.126574257442591740, -0.126623855141094980, -0.126673452523038990, -0.126723049588298940, -0.126772646336751250, -0.126822242768271980, +-0.126871838882737510, -0.126921434680023010, -0.126971030160004940, -0.127020625322559280, -0.127070220167562500, -0.127119814694889730, -0.127169408904417410, -0.127219002796021580, +-0.127268596369578680, -0.127318189624963860, -0.127367782562053560, -0.127417375180724240, -0.127466967480851040, -0.127516559462310440, -0.127566151124978430, -0.127615742468731470, +-0.127665333493444720, -0.127714924198994630, -0.127764514585257260, -0.127814104652109020, -0.127863694399425080, -0.127913283827081890, -0.127962872934955510, -0.128012461722922380, +-0.128062050190857670, -0.128111638338637810, -0.128161226166138870, -0.128210813673237310, -0.128260400859808280, -0.128309987725728240, -0.128359574270873660, -0.128409160495119720, +-0.128458746398342870, -0.128508331980419140, -0.128557917241225030, -0.128607502180635690, -0.128657086798527610, -0.128706671094776790, -0.128756255069259750, -0.128805838721851610, +-0.128855422052428890, -0.128905005060867610, -0.128954587747044270, -0.129004170110834010, -0.129053752152113320, -0.129103333870758260, -0.129152915266645300, -0.129202496339649610, +-0.129252077089647670, -0.129301657516515570, -0.129351237620129730, -0.129400817400365380, -0.129450396857098970, -0.129499975990207020, -0.129549554799564680, -0.129599133285048460, +-0.129648711446534420, -0.129698289283899010, -0.129747866797017470, -0.129797443985766230, -0.129847020850021390, -0.129896597389659450, -0.129946173604555570, -0.129995749494586250, +-0.130045325059627570, -0.130094900299556030, -0.130144475214246770, -0.130194049803576320, -0.130243624067420770, -0.130293198005656590, -0.130342771618158960, -0.130392344904804420, +-0.130441917865469460, -0.130491490500029260, -0.130541062808360340, -0.130590634790338750, -0.130640206445841010, -0.130689777774742330, -0.130739348776919200, -0.130788919452247690, +-0.130838489800604340, -0.130888059821864300, -0.130937629515904120, -0.130987198882599850, -0.131036767921828060, -0.131086336633463890, -0.131135905017383870, -0.131185473073464120, +-0.131235040801581100, -0.131284608201610030, -0.131334175273427470, -0.131383742016909890, -0.131433308431932520, -0.131482874518371870, -0.131532440276104060, -0.131582005705005560, +-0.131631570804951610, -0.131681135575818760, -0.131730700017483050, -0.131780264129821020, -0.131829827912707890, -0.131879391366020230, -0.131928954489634040, -0.131978517283425940, +-0.132028079747271100, -0.132077641881046040, -0.132127203684626880, -0.132176765157890170, -0.132226326300711100, -0.132275887112966230, -0.132325447594531600, -0.132375007745283820, +-0.132424567565098100, -0.132474127053850920, -0.132523686211418880, -0.132573245037677200, -0.132622803532502390, -0.132672361695770570, -0.132721919527358290, -0.132771477027140760, +-0.132821034194994550, -0.132870591030795760, -0.132920147534420910, -0.132969703705745290, -0.133019259544645390, -0.133068815050997320, -0.133118370224677680, -0.133167925065561660, +-0.133217479573525840, -0.133267033748446310, -0.133316587590199650, -0.133366141098661070, -0.133415694273707140, -0.133465247115214400, -0.133514799623058120, -0.133564351797114840, +-0.133613903637260670, -0.133663455143372190, -0.133713006315324620, -0.133762557152994540, -0.133812107656258090, -0.133861657824991790, -0.133911207659070910, -0.133960757158372000, +-0.134010306322771190, -0.134059855152145080, -0.134109403646368890, -0.134158951805319170, -0.134208499628872100, -0.134258047116904200, -0.134307594269290760, -0.134357141085908320, +-0.134406687566633460, -0.134456233711341440, -0.134505779519908860, -0.134555324992211820, -0.134604870128126890, -0.134654414927529360, -0.134703959390295810, -0.134753503516302330, +-0.134803047305425560, -0.134852590757540690, -0.134902133872524390, -0.134951676650252730, -0.135001219090602310, -0.135050761193448420, -0.135100302958667620, -0.135149844386136090, +-0.135199385475730350, -0.135248926227325730, -0.135298466640798780, -0.135348006716025680, -0.135397546452882990, -0.135447085851245990, -0.135496624910991260, -0.135546163631995450, +-0.135595702014133760, -0.135645240057282850, -0.135694777761318800, -0.135744315126118260, -0.135793852151556480, -0.135843388837510100, -0.135892925183855230, -0.135942461190468490, +-0.135991996857225160, -0.136041532184001830, -0.136091067170674680, -0.136140601817120290, -0.136190136123213960, -0.136239670088832280, -0.136289203713851450, -0.136338736998148020, +-0.136388269941597330, -0.136437802544075950, -0.136487334805460520, -0.136536866725626320, -0.136586398304449940, -0.136635929541807560, -0.136685460437575790, -0.136734990991629950, +-0.136784521203846600, -0.136834051074101990, -0.136883580602272650, -0.136933109788233950, -0.136982638631862470, -0.137032167133034370, -0.137081695291626310, -0.137131223107513580, +-0.137180750580572770, -0.137230277710680110, -0.137279804497712180, -0.137329330941544310, -0.137378857042053100, -0.137428382799115210, -0.137477908212605890, -0.137527433282401830, +-0.137576958008379160, -0.137626482390414560, -0.137676006428383290, -0.137725530122162020, -0.137775053471626910, -0.137824576476654640, -0.137874099137120450, -0.137923621452901020, +-0.137973143423872540, -0.138022665049911650, -0.138072186330893660, -0.138121707266695200, -0.138171227857192460, -0.138220748102262120, -0.138270268001779440, -0.138319787555621100, +-0.138369306763663710, -0.138418825625782640, -0.138468344141854520, -0.138517862311755500, -0.138567380135362290, -0.138616897612550190, -0.138666414743195830, -0.138715931527175460, +-0.138765447964365680, -0.138814964054641830, -0.138864479797880610, -0.138913995193958140, -0.138963510242751160, -0.139013024944134950, -0.139062539297986180, -0.139112053304181050, +-0.139161566962596240, -0.139211080273107080, -0.139260593235590200, -0.139310105849921840, -0.139359618115978660, -0.139409130033636000, -0.139458641602770520, -0.139508152823258870, +-0.139557663694976410, -0.139607174217799780, -0.139656684391605200, -0.139706194216269370, -0.139755703691667590, -0.139805212817676580, -0.139854721594172500, -0.139904230021032080, +-0.139953738098130660, -0.140003245825344870, -0.140052753202550980, -0.140102260229625660, -0.140151766906444210, -0.140201273232883370, -0.140250779208819340, -0.140300284834128820, +-0.140349790108687120, -0.140399295032370950, -0.140448799605056990, -0.140498303826620600, -0.140547807696938450, -0.140597311215886760, -0.140646814383342260, -0.140696317199180240, +-0.140745819663277450, -0.140795321775510130, -0.140844823535754920, -0.140894324943887230, -0.140943825999783720, -0.140993326703320650, -0.141042827054374710, -0.141092327052821240, +-0.141141826698536980, -0.141191325991398110, -0.141240824931281400, -0.141290323518062170, -0.141339821751617160, -0.141389319631823020, -0.141438817158555140, -0.141488314331690210, +-0.141537811151104500, -0.141587307616674710, -0.141636803728276190, -0.141686299485785680, -0.141735794889079390, -0.141785289938034100, -0.141834784632525110, -0.141884278972429170, +-0.141933772957622550, -0.141983266587981910, -0.142032759863382680, -0.142082252783701540, -0.142131745348814790, -0.142181237558599070, -0.142230729412929860, -0.142280220911683820, +-0.142329712054737210, -0.142379202841966780, -0.142428693273247890, -0.142478183348457270, -0.142527673067471630, -0.142577162430166380, -0.142626651436418200, -0.142676140086103410, +-0.142725628379098720, -0.142775116315279480, -0.142824603894522480, -0.142874091116703960, -0.142923577981700660, -0.142973064489387990, -0.143022550639642610, -0.143072036432340900, +-0.143121521867359520, -0.143171006944573910, -0.143220491663860750, -0.143269976025096390, -0.143319460028157510, -0.143368943672919550, -0.143418426959259240, -0.143467909887053300, +-0.143517392456177150, -0.143566874666507500, -0.143616356517920680, -0.143665838010293400, -0.143715319143501080, -0.143764799917420470, -0.143814280331927860, -0.143863760386899990, +-0.143913240082212260, -0.143962719417741470, -0.144012198393363850, -0.144061677008956200, -0.144111155264393890, -0.144160633159553690, -0.144210110694311920, -0.144259587868545310, +-0.144309064682129310, -0.144358541134940620, -0.144408017226856030, -0.144457492957750950, -0.144506968327502150, -0.144556443335985910, -0.144605917983079040, -0.144655392268656900, +-0.144704866192596290, -0.144754339754773500, -0.144803812955065340, -0.144853285793347160, -0.144902758269495810, -0.144952230383387530, -0.145001702134899130, -0.145051173523906040, +-0.145100644550284990, -0.145150115213912360, -0.145199585514664860, -0.145249055452417950, -0.145298525027048430, -0.145347994238433030, -0.145397463086447190, -0.145446931570967690, +-0.145496399691870890, -0.145545867449033500, -0.145595334842331000, -0.145644801871640190, -0.145694268536837370, -0.145743734837799320, -0.145793200774401470, -0.145842666346520630, +-0.145892131554033130, -0.145941596396815730, -0.145991060874743890, -0.146040524987694430, -0.146089988735543630, -0.146139452118168310, -0.146188915135443940, -0.146238377787247240, +-0.146287840073454630, -0.146337301993942850, -0.146386763548587370, -0.146436224737264980, -0.146485685559852470, -0.146535146016225300, -0.146584606106260280, -0.146634065829833740, +-0.146683525186822480, -0.146732984177101950, -0.146782442800548970, -0.146831901057039890, -0.146881358946451490, -0.146930816468659270, -0.146980273623539990, -0.147029730410970030, +-0.147079186830826160, -0.147128642882983910, -0.147178098567320060, -0.147227553883710950, -0.147277008832033400, -0.147326463412162880, -0.147375917623976200, -0.147425371467350190, +-0.147474824942160270, -0.147524278048283330, -0.147573730785595690, -0.147623183153974130, -0.147672635153294210, -0.147722086783432680, -0.147771538044265930, -0.147820988935670780, +-0.147870439457522730, -0.147919889609698570, -0.147969339392074680, -0.148018788804527900, -0.148068237846933680, -0.148117686519168900, -0.148167134821109880, -0.148216582752633470, +-0.148266030313615150, -0.148315477503931790, -0.148364924323460130, -0.148414370772075750, -0.148463816849655430, -0.148513262556075580, -0.148562707891213010, -0.148612152854943220, +-0.148661597447143050, -0.148711041667688920, -0.148760485516457600, -0.148809928993324600, -0.148859372098166800, -0.148908814830860580, -0.148958257191282750, -0.149007699179308840, +-0.149057140794815690, -0.149106582037679680, -0.149156022907777660, -0.149205463404985140, -0.149254903529178970, -0.149304343280235540, -0.149353782658031680, -0.149403221662442910, +-0.149452660293346110, -0.149502098550618110, -0.149551536434134410, -0.149600973943771860, -0.149650411079406880, -0.149699847840916310, -0.149749284228175680, -0.149798720241061830, +-0.149848155879451220, -0.149897591143220630, -0.149947026032245610, -0.149996460546403060, -0.150045894685569340, -0.150095328449621310, -0.150144761838434530, -0.150194194851885840, +-0.150243627489851680, -0.150293059752208890, -0.150342491638832980, -0.150391923149600870, -0.150441354284389400, -0.150490785043074090, -0.150540215425531810, -0.150589645431639000, +-0.150639075061272530, -0.150688504314307910, -0.150737933190622040, -0.150787361690091330, -0.150836789812592660, -0.150886217558001580, -0.150935644926194930, -0.150985071917049210, +-0.151034498530441210, -0.151083924766246550, -0.151133350624342080, -0.151182776104604230, -0.151232201206909860, -0.151281625931134560, -0.151331050277155210, -0.151380474244848660, +-0.151429897834090470, -0.151479321044757560, -0.151528743876726350, -0.151578166329873700, -0.151627588404075200, -0.151677010099207730, -0.151726431415147740, -0.151775852351772130, +-0.151825272908956420, -0.151874693086577530, -0.151924112884511910, -0.151973532302636470, -0.152022951340826720, -0.152072369998959620, -0.152121788276911580, -0.152171206174559540, +-0.152220623691778990, -0.152270040828446920, -0.152319457584440180, -0.152368873959634360, -0.152418289953906360, -0.152467705567132630, -0.152517120799190080, -0.152566535649954260, +-0.152615950119302120, -0.152665364207110130, -0.152714777913255130, -0.152764191237612760, -0.152813604180059930, -0.152863016740473060, -0.152912428918729110, -0.152961840714703650, +-0.153011252128273570, -0.153060663159315350, -0.153110073807705940, -0.153159484073320890, -0.153208893956037150, -0.153258303455731160, -0.153307712572279850, -0.153357121305558810, +-0.153406529655444990, -0.153455937621815250, -0.153505345204545260, -0.153554752403511910, -0.153604159218591660, -0.153653565649661460, -0.153702971696596890, -0.153752377359274910, +-0.153801782637571990, -0.153851187531365040, -0.153900592040529690, -0.153949996164942840, -0.153999399904481030, -0.154048803259021150, -0.154098206228438810, -0.154147608812610970, +-0.154197011011414090, -0.154246412824725120, -0.154295814252419700, -0.154345215294374730, -0.154394615950467160, -0.154444016220572630, -0.154493416104568040, -0.154542815602329940, +-0.154592214713735190, -0.154641613438659510, -0.154691011776979780, -0.154740409728572500, -0.154789807293314650, -0.154839204471081850, -0.154888601261751050, -0.154937997665198720, +-0.154987393681301850, -0.155036789309936060, -0.155086184550978280, -0.155135579404305060, -0.155184973869793300, -0.155234367947318710, -0.155283761636758170, -0.155333154937988660, +-0.155382547850885840, -0.155431940375326650, -0.155481332511187590, -0.155530724258345660, -0.155580115616676480, -0.155629506586057010, -0.155678897166363770, -0.155728287357473710, +-0.155777677159262500, -0.155827066571607110, -0.155876455594384040, -0.155925844227470270, -0.155975232470741470, -0.156024620324074580, -0.156074007787346120, -0.156123394860433110, +-0.156172781543211150, -0.156222167835557260, -0.156271553737347940, -0.156320939248460160, -0.156370324368769600, -0.156419709098153230, -0.156469093436488040, -0.156518477383649660, +-0.156567860939515110, -0.156617244103960880, -0.156666626876863970, -0.156716009258100090, -0.156765391247546180, -0.156814772845078780, -0.156864154050574880, -0.156913534863910160, +-0.156962915284961620, -0.157012295313605780, -0.157061674949719650, -0.157111054193178860, -0.157160433043860490, -0.157209811501640980, -0.157259189566397420, -0.157308567238005430, +-0.157357944516342020, -0.157407321401284220, -0.157456697892707640, -0.157506073990489330, -0.157555449694505830, -0.157604825004634130, -0.157654199920749970, -0.157703574442730280, +-0.157752948570451660, -0.157802322303791100, -0.157851695642624300, -0.157901068586828260, -0.157950441136279570, -0.157999813290855190, -0.158049185050430830, -0.158098556414883550, +-0.158147927384089840, -0.158197297957926780, -0.158246668136270000, -0.158296037918996570, -0.158345407305983480, -0.158394776297106440, -0.158444144892242460, -0.158493513091268110, +-0.158542880894060430, -0.158592248300495090, -0.158641615310449150, -0.158690981923799160, -0.158740348140422150, -0.158789713960193840, -0.158839079382991240, -0.158888444408690930, +-0.158937809037169970, -0.158987173268304030, -0.159036537101970190, -0.159085900538044970, -0.159135263576405450, -0.159184626216927330, -0.159233988459487660, -0.159283350303963430, +-0.159332711750230390, -0.159382072798165600, -0.159431433447645600, -0.159480793698547480, -0.159530153550746900, -0.159579513004120960, -0.159628872058546260, -0.159678230713899780, +-0.159727588970057290, -0.159776946826895830, -0.159826304284292040, -0.159875661342122890, -0.159925018000264150, -0.159974374258592870, -0.160023730116985650, -0.160073085575319550, +-0.160122440633470310, -0.160171795291314950, -0.160221149548730100, -0.160270503405592820, -0.160319856861778850, -0.160369209917165220, -0.160418562571629040, -0.160467914825045970, +-0.160517266677293130, -0.160566618128247130, -0.160615969177785030, -0.160665319825782550, -0.160714670072116790, -0.160764019916664340, -0.160813369359302290, -0.160862718399906370, +-0.160912067038353650, -0.160961415274520760, -0.161010763108284800, -0.161060110539521460, -0.161109457568107850, -0.161158804193920620, -0.161208150416836780, -0.161257496236732160, +-0.161306841653483770, -0.161356186666968740, -0.161405531277062810, -0.161454875483643040, -0.161504219286586060, -0.161553562685768980, -0.161602905681067580, -0.161652248272358880, +-0.161701590459519600, -0.161750932242426760, -0.161800273620956140, -0.161849614594984870, -0.161898955164389540, -0.161948295329047250, -0.161997635088833800, -0.162046974443626260, +-0.162096313393301270, -0.162145651937735950, -0.162194990076806070, -0.162244327810388690, -0.162293665138360940, -0.162343002060598600, -0.162392338576978740, -0.162441674687378050, +-0.162491010391673600, -0.162540345689741180, -0.162589680581457920, -0.162639015066700450, -0.162688349145345860, -0.162737682817269970, -0.162787016082349880, -0.162836348940462230, +-0.162885681391484180, -0.162935013435291460, -0.162984345071761210, -0.163033676300770120, -0.163083007122195260, -0.163132337535912440, -0.163181667541798770, -0.163230997139730940, +-0.163280326329586060, -0.163329655111239920, -0.163378983484569670, -0.163428311449452360, -0.163477639005763840, -0.163526966153381250, -0.163576292892181230, -0.163625619222040890, +-0.163674945142836090, -0.163724270654443920, -0.163773595756741080, -0.163822920449604700, -0.163872244732910570, -0.163921568606535810, -0.163970892070357140, -0.164020215124251690, +-0.164069537768095240, -0.164118860001764980, -0.164168181825137540, -0.164217503238090090, -0.164266824240498460, -0.164316144832239750, -0.164365465013191130, -0.164414784783228410, +-0.164464104142228700, -0.164513423090068780, -0.164562741626625710, -0.164612059751775340, -0.164661377465394830, -0.164710694767360890, -0.164760011657550610, -0.164809328135839900, +-0.164858644202105860, -0.164907959856225220, -0.164957275098075120, -0.165006589927531370, -0.165055904344471150, -0.165105218348771180, -0.165154531940308600, -0.165203845118959250, +-0.165253157884600290, -0.165302470237108870, -0.165351782176360850, -0.165401093702233350, -0.165450404814603130, -0.165499715513347360, -0.165549025798341830, -0.165598335669463750, +-0.165647645126589800, -0.165696954169597200, -0.165746262798361800, -0.165795571012760710, -0.165844878812670710, -0.165894186197968950, -0.165943493168531270, -0.165992799724234860, +-0.166042105864956460, -0.166091411590573250, -0.166140716900961050, -0.166190021795997070, -0.166239326275558460, -0.166288630339521100, -0.166337933987762170, -0.166387237220158410, +-0.166436540036586980, -0.166485842436923770, -0.166535144421045940, -0.166584445988830270, -0.166633747140153910, -0.166683047874892770, -0.166732348192923980, -0.166781648094124320, +-0.166830947578371000, -0.166880246645539850, -0.166929545295508100, -0.166978843528152480, -0.167028141343350200, -0.167077438740977110, -0.167126735720910440, -0.167176032283026910, +-0.167225328427203750, -0.167274624153316840, -0.167323919461243360, -0.167373214350860530, -0.167422508822044210, -0.167471802874671620, -0.167521096508619540, -0.167570389723765150, +-0.167619682519984330, -0.167668974897154320, -0.167718266855151870, -0.167767558393854180, -0.167816849513137190, -0.167866140212878050, -0.167915430492953540, -0.167964720353240920, +-0.168014009793616050, -0.168063298813956180, -0.168112587414138040, -0.168161875594038860, -0.168211163353534590, -0.168260450692502370, -0.168309737610819490, -0.168359024108361820, +-0.168408310185006570, -0.168457595840630580, -0.168506881075111000, -0.168556165888323810, -0.168605450280146200, -0.168654734250454960, -0.168704017799127300, -0.168753300926039180, +-0.168802583631067820, -0.168851865914089990, -0.168901147774982940, -0.168950429213622580, -0.168999710229886140, -0.169048990823650410, -0.169098270994792660, -0.169147550743188800, +-0.169196830068716050, -0.169246108971251670, -0.169295387450671580, -0.169344665506853010, -0.169393943139672790, -0.169443220349008130, -0.169492497134735020, -0.169541773496730640, +-0.169591049434871830, -0.169640324949035830, -0.169689600039098580, -0.169738874704937340, -0.169788148946428910, -0.169837422763450540, -0.169886696155878180, -0.169935969123589080, +-0.169985241666460060, -0.170034513784368370, -0.170083785477189940, -0.170133056744802090, -0.170182327587081540, -0.170231598003905670, -0.170280867995150330, -0.170330137560692820, +-0.170379406700410410, -0.170428675414179050, -0.170477943701875990, -0.170527211563378110, -0.170576478998562600, -0.170625746007305460, -0.170675012589483950, -0.170724278744974920, +-0.170773544473655640, -0.170822809775402040, -0.170872074650091440, -0.170921339097600630, -0.170970603117806930, -0.171019866710586250, -0.171069129875815930, -0.171118392613372780, +-0.171167654923134100, -0.171216916804975830, -0.171266178258775270, -0.171315439284409700, -0.171364699881755090, -0.171413960050688760, -0.171463219791087500, -0.171512479102828630, +-0.171561737985788140, -0.171610996439843290, -0.171660254464870960, -0.171709512060748410, -0.171758769227351670, -0.171808025964557990, -0.171857282272244260, -0.171906538150287750, +-0.171955793598564470, -0.172005048616951710, -0.172054303205326300, -0.172103557363565580, -0.172152811091545540, -0.172202064389143460, -0.172251317256236660, -0.172300569692701130, +-0.172349821698414200, -0.172399073273252680, -0.172448324417093930, -0.172497575129813920, -0.172546825411289990, -0.172596075261399000, -0.172645324680018250, -0.172694573667023730, +-0.172743822222292810, -0.172793070345702320, -0.172842318037129600, -0.172891565296450640, -0.172940812123542760, -0.172990058518282840, -0.173039304480548240, -0.173088550010214920, +-0.173137795107160240, -0.173187039771261510, -0.173236284002394710, -0.173285527800437240, -0.173334771165265940, -0.173384014096758160, -0.173433256594789890, -0.173482498659238480, +-0.173531740289980810, -0.173580981486894240, -0.173630222249854800, -0.173679462578739780, -0.173728702473426120, -0.173777941933791120, -0.173827180959710840, -0.173876419551062620, +-0.173925657707723340, -0.173974895429570340, -0.174024132716479680, -0.174073369568328670, -0.174122605984994270, -0.174171841966353770, -0.174221077512283220, -0.174270312622659990, +-0.174319547297361400, -0.174368781536263530, -0.174418015339243700, -0.174467248706178800, -0.174516481636946250, -0.174565714131422050, -0.174614946189483560, -0.174664177811007710, +-0.174713408995871840, -0.174762639743952040, -0.174811870055125610, -0.174861099929269510, -0.174910329366261110, -0.174959558365976460, -0.175008786928292890, -0.175058015053087380, +-0.175107242740237230, -0.175156469989618560, -0.175205696801108730, -0.175254923174585080, -0.175304149109923670, -0.175353374607001900, -0.175402599665696680, -0.175451824285885430, +-0.175501048467444160, -0.175550272210250270, -0.175599495514180690, -0.175648718379112830, -0.175697940804922740, -0.175747162791487780, -0.175796384338684910, -0.175845605446391520, +-0.175894826114483680, -0.175944046342838780, -0.175993266131333760, -0.176042485479846020, -0.176091704388251640, -0.176140922856427990, -0.176190140884252440, -0.176239358471601130, +-0.176288575618351430, -0.176337792324380270, -0.176387008589565080, -0.176436224413781930, -0.176485439796908200, -0.176534654738820910, -0.176583869239397400, -0.176633083298513770, +-0.176682296916047420, -0.176731510091875350, -0.176780722825874950, -0.176829935117922300, -0.176879146967894810, -0.176928358375669450, -0.176977569341123630, -0.177026779864133450, +-0.177075989944576320, -0.177125199582329220, -0.177174408777269530, -0.177223617529273430, -0.177272825838218240, -0.177322033703981450, -0.177371241126439150, -0.177420448105468730, +-0.177469654640947190, -0.177518860732751940, -0.177568066380759120, -0.177617271584846110, -0.177666476344889940, -0.177715680660768010, -0.177764884532356450, -0.177814087959532690, +-0.177863290942173680, -0.177912493480156890, -0.177961695573358450, -0.178010897221655750, -0.178060098424925820, -0.178109299183046050, -0.178158499495892630, -0.178207699363342940, +-0.178256898785274450, -0.178306097761563280, -0.178355296292086850, -0.178404494376722210, -0.178453692015346750, -0.178502889207836610, -0.178552085954069270, -0.178601282253921690, +-0.178650478107271360, -0.178699673513994410, -0.178748868473968260, -0.178798062987069930, -0.178847257053176890, -0.178896450672165250, -0.178945643843912510, -0.178994836568295650, +-0.179044028845192160, -0.179093220674478140, -0.179142412056031070, -0.179191602989728390, -0.179240793475446280, -0.179289983513062190, -0.179339173102453150, -0.179388362243496610, +-0.179437550936068700, -0.179486739180046930, -0.179535926975308320, -0.179585114321730330, -0.179634301219189110, -0.179683487667562150, -0.179732673666726460, -0.179781859216559510, +-0.179831044316937500, -0.179880228967737870, -0.179929413168837650, -0.179978596920114360, -0.180027780221444140, -0.180076963072704460, -0.180126145473772810, -0.180175327424525360, +-0.180224508924839570, -0.180273689974592530, -0.180322870573661700, -0.180372050721923280, -0.180421230419254700, -0.180470409665533040, -0.180519588460635820, -0.180568766804439170, +-0.180617944696820630, -0.180667122137657200, -0.180716299126826410, -0.180765475664204450, -0.180814651749668790, -0.180863827383096500, -0.180913002564365070, -0.180962177293350710, +-0.181011351569930900, -0.181060525393982710, -0.181109698765383630, -0.181158871684009900, -0.181208044149738980, -0.181257216162448360, -0.181306387722014290, -0.181355558828314250, +-0.181404729481225300, -0.181453899680624970, -0.181503069426389470, -0.181552238718396260, -0.181601407556522490, -0.181650575940645630, -0.181699743870641860, -0.181748911346388760, +-0.181798078367763380, -0.181847244934643240, -0.181896411046904540, -0.181945576704424820, -0.181994741907081180, -0.182043906654751090, -0.182093070947310810, -0.182142234784637870, +-0.182191398166609760, -0.182240561093102720, -0.182289723563994250, -0.182338885579161500, -0.182388047138481970, -0.182437208241831910, -0.182486368889088780, -0.182535529080129770, +-0.182584688814832360, -0.182633848093072790, -0.182683006914728610, -0.182732165279676890, -0.182781323187795190, -0.182830480638959760, -0.182879637633048150, -0.182928794169937430, +-0.182977950249505140, -0.183027105871627570, -0.183076261036182210, -0.183125415743046640, -0.183174569992097110, -0.183223723783211140, -0.183272877116265860, -0.183322029991138840, +-0.183371182407706280, -0.183420334365845790, -0.183469485865434460, -0.183518636906349840, -0.183567787488468190, -0.183616937611667090, -0.183666087275823620, -0.183715236480815390, +-0.183764385226518640, -0.183813533512810910, -0.183862681339569340, -0.183911828706671530, -0.183960975613993690, -0.184010122061413400, -0.184059268048807820, -0.184108413576054510, +-0.184157558643029740, -0.184206703249611050, -0.184255847395676050, -0.184304991081100990, -0.184354134305763470, -0.184403277069540600, -0.184452419372309970, -0.184501561213947870, +-0.184550702594331840, -0.184599843513339080, -0.184648983970847140, -0.184698123966732300, -0.184747263500872140, -0.184796402573143840, -0.184845541183424970, -0.184894679331591790, +-0.184943817017521940, -0.184992954241092520, -0.185042091002181160, -0.185091227300664160, -0.185140363136419070, -0.185189498509323510, -0.185238633419253760, -0.185287767866087440, +-0.185336901849701700, -0.185386035369974140, -0.185435168426781040, -0.185484301020000050, -0.185533433149508260, -0.185582564815183370, -0.185631696016901600, -0.185680826754540620, +-0.185729957027977570, -0.185779086837090050, -0.185828216181754350, -0.185877345061848160, -0.185926473477248580, -0.185975601427833260, -0.186024728913478490, -0.186073855934061920, +-0.186122982489461130, -0.186172108579552440, -0.186221234204213490, -0.186270359363321450, -0.186319484056753970, -0.186368608284387310, -0.186417732046099150, -0.186466855341766660, +-0.186515978171267440, -0.186565100534477860, -0.186614222431275540, -0.186663343861537660, -0.186712464825141840, -0.186761585321964440, -0.186810705351883070, -0.186859824914774930, +-0.186908944010517660, -0.186958062638987620, -0.187007180800062400, -0.187056298493619680, -0.187105415719535760, -0.187154532477688320, -0.187203648767954530, -0.187252764590212060, +-0.187301879944337250, -0.187350994830207730, -0.187400109247700730, -0.187449223196693910, -0.187498336677063560, -0.187547449688687390, -0.187596562231442610, -0.187645674305206840, +-0.187694785909856440, -0.187743897045269090, -0.187793007711321990, -0.187842117907892820, -0.187891227634857910, -0.187940336892094940, -0.187989445679481120, -0.188038553996894090, +-0.188087661844210270, -0.188136769221307320, -0.188185876128062840, -0.188234982564353250, -0.188284088530056210, -0.188333194025048940, -0.188382299049209140, -0.188431403602413140, +-0.188480507684538640, -0.188529611295462860, -0.188578714435063490, -0.188627817103216910, -0.188676919299800770, -0.188726021024692330, -0.188775122277769300, -0.188824223058908000, +-0.188873323367986150, -0.188922423204881010, -0.188971522569470220, -0.189020621461630210, -0.189069719881238630, -0.189118817828173190, -0.189167915302310280, -0.189217012303527580, +-0.189266108831702330, -0.189315204886712270, -0.189364300468433750, -0.189413395576744470, -0.189462490211521730, -0.189511584372643180, -0.189560678059985220, -0.189609771273425570, +-0.189658864012841520, -0.189707956278110710, -0.189757048069109590, -0.189806139385715860, -0.189855230227806790, -0.189904320595260050, -0.189953410487952080, -0.190002499905760600, +-0.190051588848563300, -0.190100677316236590, -0.190149765308658180, -0.190198852825705370, -0.190247939867255830, -0.190297026433186050, -0.190346112523373660, -0.190395198137696040, +-0.190444283276030830, -0.190493367938254470, -0.190542452124244700, -0.190591535833878810, -0.190640619067034500, -0.190689701823588210, -0.190738784103417660, -0.190787865906400150, +-0.190836947232413430, -0.190886028081333900, -0.190935108453039290, -0.190984188347406910, -0.191033267764314510, -0.191082346703638490, -0.191131425165256610, -0.191180503149046580, +-0.191229580654884880, -0.191278657682649230, -0.191327734232216940, -0.191376810303465730, -0.191425885896272070, -0.191474961010513700, -0.191524035646067930, -0.191573109802812500, +-0.191622183480623850, -0.191671256679379760, -0.191720329398957500, -0.191769401639234890, -0.191818473400088310, -0.191867544681395550, -0.191916615483033960, -0.191965685804881240, +-0.192014755646813860, -0.192063825008709610, -0.192112893890446220, -0.192161962291900160, -0.192211030212949220, -0.192260097653470690, -0.192309164613342350, -0.192358231092440660, +-0.192407297090643390, -0.192456362607827890, -0.192505427643871910, -0.192554492198651920, -0.192603556272045700, -0.192652619863930590, -0.192701682974184390, -0.192750745602683520, +-0.192799807749305770, -0.192848869413928540, -0.192897930596429570, -0.192946991296685300, -0.192996051514573580, -0.193045111249972170, -0.193094170502757540, -0.193143229272807470, +-0.193192287559999340, -0.193241345364210950, -0.193290402685318720, -0.193339459523200500, -0.193388515877733650, -0.193437571748795920, -0.193486627136263830, -0.193535682040015170, +-0.193584736459927330, -0.193633790395878050, -0.193682843847743900, -0.193731896815402590, -0.193780949298731580, -0.193830001297608610, -0.193879052811910200, -0.193928103841514180, +-0.193977154386297870, -0.194026204446139130, -0.194075254020914440, -0.194124303110501610, -0.194173351714778450, -0.194222399833621500, -0.194271447466908530, -0.194320494614516950, +-0.194369541276324580, -0.194418587452207910, -0.194467633142044770, -0.194516678345712540, -0.194565723063089060, -0.194614767294050830, -0.194663811038475690, -0.194712854296241020, +-0.194761897067224660, -0.194810939351303090, -0.194859981148354210, -0.194909022458255340, -0.194958063280884390, -0.195007103616117810, -0.195056143463833490, -0.195105182823909230, +-0.195154221696221600, -0.195203260080648420, -0.195252297977067060, -0.195301335385355410, -0.195350372305389990, -0.195399408737048640, -0.195448444680208750, -0.195497480134748190, +-0.195546515100543490, -0.195595549577472520, -0.195644583565412670, -0.195693617064241790, -0.195742650073836450, -0.195791682594074480, -0.195840714624833300, -0.195889746165990750, +-0.195938777217423420, -0.195987807779009120, -0.196036837850625760, -0.196085867432149870, -0.196134896523459310, -0.196183925124431500, -0.196232953234944330, -0.196281980854874330, +-0.196331007984099390, -0.196380034622496900, -0.196429060769944790, -0.196478086426319590, -0.196527111591499160, -0.196576136265360940, -0.196625160447782830, -0.196674184138641380, +-0.196723207337814480, -0.196772230045179570, -0.196821252260614500, -0.196870273983995870, -0.196919295215201550, -0.196968315954109440, -0.197017336200596080, -0.197066355954539420, +-0.197115375215816850, -0.197164393984306270, -0.197213412259884260, -0.197262430042428740, -0.197311447331817130, -0.197360464127927350, -0.197409480430635970, -0.197458496239820900, +-0.197507511555359590, -0.197556526377129920, -0.197605540705008490, -0.197654554538873230, -0.197703567878601580, -0.197752580724071450, -0.197801593075159430, -0.197850604931743420, +-0.197899616293700900, -0.197948627160909770, -0.197997637533246650, -0.198046647410589420, -0.198095656792816020, -0.198144665679803040, -0.198193674071428380, -0.198242681967569560, +-0.198291689368104460, -0.198340696272909710, -0.198389702681863210, -0.198438708594842440, -0.198487714011725350, -0.198536718932388530, -0.198585723356709930, -0.198634727284567020, +-0.198683730715837700, -0.198732733650398650, -0.198781736088127740, -0.198830738028902500, -0.198879739472600870, -0.198928740419099440, -0.198977740868276160, -0.199026740820008960, +-0.199075740274174460, -0.199124739230650630, -0.199173737689314960, -0.199222735650045360, -0.199271733112718480, -0.199320730077212290, -0.199369726543404260, -0.199418722511172350, +-0.199467717980393200, -0.199516712950944780, -0.199565707422704550, -0.199614701395550490, -0.199663694869359230, -0.199712687844008750, -0.199761680319376550, -0.199810672295340580, +-0.199859663771777500, -0.199908654748565260, -0.199957645225581820, -0.200006635202703810, -0.200055624679809220, -0.200104613656775590, -0.200153602133480850, -0.200202590109801680, +-0.200251577585616010, -0.200300564560801420, -0.200349551035235830, -0.200398537008795950, -0.200447522481359720, -0.200496507452804670, -0.200545491923008800, -0.200594475891848760, +-0.200643459359202550, -0.200692442324947680, -0.200741424788962120, -0.200790406751122590, -0.200839388211307040, -0.200888369169392980, -0.200937349625258470, -0.200986329578780150, +-0.201035309029835990, -0.201084287978304020, -0.201133266424060870, -0.201182244366984560, -0.201231221806952630, -0.201280198743843090, -0.201329175177532630, -0.201378151107899220, +-0.201427126534820450, -0.201476101458174270, -0.201525075877837410, -0.201574049793687870, -0.201623023205603210, -0.201671996113461400, -0.201720968517139190, -0.201769940416514550, +-0.201818911811465080, -0.201867882701868730, -0.201916853087602270, -0.201965822968543650, -0.202014792344570930, -0.202063761215560770, -0.202112729581391230, -0.202161697441939850, +-0.202210664797084660, -0.202259631646702380, -0.202308597990671020, -0.202357563828868190, -0.202406529161171860, -0.202455493987458770, -0.202504458307606940, -0.202553422121493990, +-0.202602385428997890, -0.202651348229995420, -0.202700310524364570, -0.202749272311982920, -0.202798233592728560, -0.202847194366478160, -0.202896154633109780, -0.202945114392501460, +-0.202994073644529900, -0.203043032389073150, -0.203091990626008830, -0.203140948355214980, -0.203189905576568320, -0.203238862289946890, -0.203287818495228310, -0.203336774192290600, +-0.203385729381010540, -0.203434684061266140, -0.203483638232935050, -0.203532591895895290, -0.203581545050023600, -0.203630497695198090, -0.203679449831296290, -0.203728401458196320, +-0.203777352575774920, -0.203826303183910120, -0.203875253282480020, -0.203924202871361320, -0.203973151950432140, -0.204022100519570070, -0.204071048578653190, -0.204119996127558240, +-0.204168943166163320, -0.204217889694346010, -0.204266835711984450, -0.204315781218955360, -0.204364726215136790, -0.204413670700406420, -0.204462614674642300, -0.204511558137721230, +-0.204560501089521230, -0.204609443529920000, -0.204658385458795610, -0.204707326876024800, -0.204756267781485670, -0.204805208175055880, -0.204854148056613510, -0.204903087426035330, +-0.204952026283199450, -0.205000964627983890, -0.205049902460265530, -0.205098839779922380, -0.205147776586832170, -0.205196712880872930, -0.205245648661921460, -0.205294583929855890, +-0.205343518684553860, -0.205392452925893450, -0.205441386653751500, -0.205490319868006060, -0.205539252568534840, -0.205588184755215900, -0.205637116427926060, -0.205686047586543460, +-0.205734978230945720, -0.205783908361010990, -0.205832837976616030, -0.205881767077638970, -0.205930695663957970, -0.205979623735449760, -0.206028551291992490, -0.206077478333463850, +-0.206126404859741960, -0.206175330870703610, -0.206224256366226930, -0.206273181346189600, -0.206322105810469780, -0.206371029758944250, -0.206419953191491150, -0.206468876107988140, +-0.206517798508313420, -0.206566720392343720, -0.206615641759957250, -0.206664562611031670, -0.206713482945445120, -0.206762402763074420, -0.206811322063797740, -0.206860240847493160, +-0.206909159114037540, -0.206958076863309030, -0.207006994095185330, -0.207055910809544580, -0.207104827006263620, -0.207153742685220600, -0.207202657846293210, -0.207251572489359630, +-0.207300486614296650, -0.207349400220982470, -0.207398313309294810, -0.207447225879111770, -0.207496137930310240, -0.207545049462768390, -0.207593960476363890, -0.207642870970974950, +-0.207691780946478360, -0.207740690402752340, -0.207789599339674590, -0.207838507757123290, -0.207887415654975260, -0.207936323033108690, -0.207985229891401780, -0.208034136229731330, +-0.208083042047975560, -0.208131947346012170, -0.208180852123719340, -0.208229756380973960, -0.208278660117654200, -0.208327563333637780, -0.208376466028802890, -0.208425368203026370, +-0.208474269856186470, -0.208523170988160870, -0.208572071598827790, -0.208620971688064090, -0.208669871255747960, -0.208718770301757170, -0.208767668825969870, -0.208816566828262970, +-0.208865464308514630, -0.208914361266603090, -0.208963257702405200, -0.209012153615799200, -0.209061049006662780, -0.209109943874874170, -0.209158838220310280, -0.209207732042849290, +-0.209256625342368970, -0.209305518118747540, -0.209354410371861840, -0.209403302101590140, -0.209452193307810200, -0.209501083990400180, -0.209549974149237040, -0.209598863784198950, +-0.209647752895163710, -0.209696641482009500, -0.209745529544613290, -0.209794417082853210, -0.209843304096607560, -0.209892190585753200, -0.209941076550168360, -0.209989961989730830, +-0.210038846904318840, -0.210087731293809280, -0.210136615158080410, -0.210185498497010010, -0.210234381310476280, -0.210283263598356170, -0.210332145360527910, -0.210381026596869270, +-0.210429907307258500, -0.210478787491572530, -0.210527667149689600, -0.210576546281487480, -0.210625424886844440, -0.210674302965637410, -0.210723180517744630, -0.210772057543044320, +-0.210820934041413420, -0.210869810012730200, -0.210918685456872450, -0.210967560373718440, -0.211016434763145080, -0.211065308625030620, -0.211114181959252910, -0.211163054765690170, +-0.211211927044219370, -0.211260798794718730, -0.211309670017066100, -0.211358540711139740, -0.211407410876816610, -0.211456280513974910, -0.211505149622492530, -0.211554018202247730, +-0.211602886253117430, -0.211651753774979910, -0.211700620767713010, -0.211749487231194990, -0.211798353165302820, -0.211847218569914790, -0.211896083444909120, -0.211944947790162820, +-0.211993811605554140, -0.212042674890960930, -0.212091537646261460, -0.212140399871332740, -0.212189261566053000, -0.212238122730300100, -0.212286983363952350, -0.212335843466886690, +-0.212384703038981440, -0.212433562080114410, -0.212482420590163920, -0.212531278569006940, -0.212580136016521790, -0.212628992932586270, -0.212677849317078700, -0.212726705169876100, +-0.212775560490856720, -0.212824415279898870, -0.212873269536879540, -0.212922123261677060, -0.212970976454169240, -0.213019829114234450, -0.213068681241749630, -0.213117532836593100, +-0.213166383898642760, -0.213215234427776870, -0.213264084423872490, -0.213312933886807890, -0.213361782816460930, -0.213410631212709980, -0.213459479075432000, -0.213508326404505320, +-0.213557173199807830, -0.213606019461217850, -0.213654865188612380, -0.213703710381869750, -0.213752555040868260, -0.213801399165484960, -0.213850242755598160, -0.213899085811085770, +-0.213947928331826100, -0.213996770317696150, -0.214045611768574280, -0.214094452684338410, -0.214143293064866820, -0.214192132910036550, -0.214240972219725960, -0.214289810993812950, +-0.214338649232175830, -0.214387486934691670, -0.214436324101238780, -0.214485160731695070, -0.214533996825938930, -0.214582832383847340, -0.214631667405298650, -0.214680501890170820, +-0.214729335838342170, -0.214778169249689730, -0.214827002124091860, -0.214875834461426940, -0.214924666261572000, -0.214973497524405390, -0.215022328249805020, -0.215071158437649290, +-0.215119988087815210, -0.215168817200181160, -0.215217645774625070, -0.215266473811025320, -0.215315301309258940, -0.215364128269204290, -0.215412954690739340, -0.215461780573742430, +-0.215510605918090630, -0.215559430723662320, -0.215608254990335420, -0.215657078717988340, -0.215705901906498100, -0.215754724555743130, -0.215803546665601780, -0.215852368235951140, +-0.215901189266669540, -0.215950009757635010, -0.215998829708725860, -0.216047649119819220, -0.216096467990793460, -0.216145286321526520, -0.216194104111896800, -0.216242921361781390, +-0.216291738071058670, -0.216340554239606600, -0.216389369867303590, -0.216438184954026700, -0.216486999499654360, -0.216535813504064530, -0.216584626967135600, -0.216633439888744670, +-0.216682252268770140, -0.216731064107090390, -0.216779875403582570, -0.216828686158125060, -0.216877496370595830, -0.216926306040873290, -0.216975115168834550, -0.217023923754358030, +-0.217072731797321700, -0.217121539297603970, -0.217170346255081970, -0.217219152669634100, -0.217267958541138340, -0.217316763869473130, -0.217365568654515560, -0.217414372896144070, +-0.217463176594236670, -0.217511979748671730, -0.217560782359326440, -0.217609584426079170, -0.217658385948808370, -0.217707186927391190, -0.217755987361706040, -0.217804787251630910, +-0.217853586597044240, -0.217902385397823200, -0.217951183653846160, -0.217999981364991190, -0.218048778531136690, -0.218097575152159800, -0.218146371227938980, -0.218195166758352240, +-0.218243961743278010, -0.218292756182593440, -0.218341550076177000, -0.218390343423906670, -0.218439136225660910, -0.218487928481316870, -0.218536720190753010, -0.218585511353847380, +-0.218634301970478370, -0.218683092040523190, -0.218731881563860280, -0.218780670540368090, -0.218829458969923780, -0.218878246852405840, -0.218927034187692300, -0.218975820975661570, +-0.219024607216190880, -0.219073392909158670, -0.219122178054442950, -0.219170962651922260, -0.219219746701473710, -0.219268530202975790, -0.219317313156306540, -0.219366095561344450, +-0.219414877417966700, -0.219463658726051750, -0.219512439485477630, -0.219561219696122860, -0.219609999357864630, -0.219658778470581380, -0.219707557034151600, -0.219756335048452520, +-0.219805112513362600, -0.219853889428759890, -0.219902665794522890, -0.219951441610528790, -0.220000216876656110, -0.220048991592782850, -0.220097765758787590, -0.220146539374547450, +-0.220195312439940950, -0.220244084954846210, -0.220292856919141660, -0.220341628332704540, -0.220390399195413370, -0.220439169507146180, -0.220487939267781490, -0.220536708477196530, +-0.220585477135269800, -0.220634245241879830, -0.220683012796903780, -0.220731779800220210, -0.220780546251707200, -0.220829312151243270, -0.220878077498705580, -0.220926842293972750, +-0.220975606536922780, -0.221024370227434240, -0.221073133365384340, -0.221121895950651600, -0.221170657983114140, -0.221219419462650450, -0.221268180389137760, -0.221316940762454640, +-0.221365700582479170, -0.221414459849089890, -0.221463218562164030, -0.221511976721580100, -0.221560734327216240, -0.221609491378950970, -0.221658247876661550, -0.221707003820226510, +-0.221755759209524390, -0.221804514044432440, -0.221853268324829210, -0.221902022050592810, -0.221950775221601780, -0.221999527837733380, -0.222048279898866160, -0.222097031404878240, +-0.222145782355648160, -0.222194532751053220, -0.222243282590971920, -0.222292031875282460, -0.222340780603863310, -0.222389528776591790, -0.222438276393346460, -0.222487023454005420, +-0.222535769958447260, -0.222584515906549240, -0.222633261298189920, -0.222682006133247900, -0.222730750411600430, -0.222779494133126060, -0.222828237297702990, -0.222876979905209740, +-0.222925721955523600, -0.222974463448523170, -0.223023204384086570, -0.223071944762092410, -0.223120684582417930, -0.223169423844941760, -0.223218162549542020, -0.223266900696097310, +-0.223315638284484920, -0.223364375314583450, -0.223413111786271020, -0.223461847699426230, -0.223510583053926400, -0.223559317849650140, -0.223608052086475970, -0.223656785764281270, +-0.223705518882944600, -0.223754251442344120, -0.223802983442358470, -0.223851714882864900, -0.223900445763742070, -0.223949176084868110, -0.223997905846121640, -0.224046635047379980, +-0.224095363688521730, -0.224144091769425070, -0.224192819289968620, -0.224241546250029680, -0.224290272649486870, -0.224338998488218390, -0.224387723766102830, -0.224436448483017550, +-0.224485172638841130, -0.224533896233452240, -0.224582619266728150, -0.224631341738547510, -0.224680063648788540, -0.224728784997329820, -0.224777505784048700, -0.224826226008823850, +-0.224874945671533400, -0.224923664772056050, -0.224972383310269090, -0.225021101286051160, -0.225069818699280500, -0.225118535549835710, -0.225167251837594150, -0.225215967562434450, +-0.225264682724234860, -0.225313397322873980, -0.225362111358229170, -0.225410824830179070, -0.225459537738601950, -0.225508250083376380, -0.225556961864379760, -0.225605673081490740, +-0.225654383734587990, -0.225703093823548810, -0.225751803348251930, -0.225800512308575510, -0.225849220704398250, -0.225897928535597540, -0.225946635802051960, -0.225995342503639810, +-0.226044048640239750, -0.226092754211729110, -0.226141459217986620, -0.226190163658890440, -0.226238867534319320, -0.226287570844150580, -0.226336273588262920, -0.226384975766534570, +-0.226433677378844210, -0.226482378425069240, -0.226531078905088310, -0.226579778818780140, -0.226628478166022050, -0.226677176946692790, -0.226725875160670580, -0.226774572807834110, +-0.226823269888060790, -0.226871966401229280, -0.226920662347217890, -0.226969357725905240, -0.227018052537168780, -0.227066746780887170, -0.227115440456938710, -0.227164133565202070, +-0.227212826105554680, -0.227261518077875200, -0.227310209482041950, -0.227358900317933600, -0.227407590585427560, -0.227456280284402540, -0.227504969414737270, -0.227553657976309140, +-0.227602345968996870, -0.227651033392678700, -0.227699720247233420, -0.227748406532538390, -0.227797092248472330, -0.227845777394913570, -0.227894461971740790, -0.227943145978831420, +-0.227991829416064160, -0.228040512283317370, -0.228089194580469700, -0.228137876307398620, -0.228186557463982860, -0.228235238050100680, -0.228283918065630860, -0.228332597510450820, +-0.228381276384439250, -0.228429954687474540, -0.228478632419435330, -0.228527309580199120, -0.228575986169644640, -0.228624662187650650, -0.228673337634094530, -0.228722012508855100, +-0.228770686811810620, -0.228819360542839860, -0.228868033701820270, -0.228916706288630590, -0.228965378303149140, -0.229014049745254690, -0.229062720614824690, -0.229111390911737880, +-0.229160060635872580, -0.229208729787107570, -0.229257398365320300, -0.229306066370389560, -0.229354733802193620, -0.229403400660611300, -0.229452066945520030, -0.229500732656798600, +-0.229549397794325760, -0.229598062357979000, -0.229646726347637080, -0.229695389763178350, -0.229744052604481580, -0.229792714871424250, -0.229841376563885150, -0.229890037681742570, +-0.229938698224875340, -0.229987358193160930, -0.230036017586478150, -0.230084676404705310, -0.230133334647721200, -0.230181992315403340, -0.230230649407630490, -0.230279305924281000, +-0.230327961865233720, -0.230376617230366070, -0.230425272019556870, -0.230473926232684950, -0.230522579869627760, -0.230571232930264130, -0.230619885414472430, -0.230668537322131440, +-0.230717188653118660, -0.230765839407312930, -0.230814489584592580, -0.230863139184836450, -0.230911788207922050, -0.230960436653728170, -0.231009084522133200, -0.231057731813015950, +-0.231106378526253930, -0.231155024661725970, -0.231203670219310460, -0.231252315198886200, -0.231300959600330700, -0.231349603423522810, -0.231398246668341360, -0.231446889334663840, +-0.231495531422369120, -0.231544172931335560, -0.231592813861442010, -0.231641454212565990, -0.231690093984586310, -0.231738733177381420, -0.231787371790830120, -0.231836009824809950, +-0.231884647279199770, -0.231933284153877980, -0.231981920448723400, -0.232030556163613590, -0.232079191298427380, -0.232127825853043200, -0.232176459827339890, -0.232225093221195000, +-0.232273726034487370, -0.232322358267095440, -0.232370989918898010, -0.232419620989772700, -0.232468251479598350, -0.232516881388253770, -0.232565510715616600, -0.232614139461565620, +-0.232662767625979290, -0.232711395208736490, -0.232760022209714760, -0.232808648628792970, -0.232857274465849560, -0.232905899720763390, -0.232954524393412050, -0.233003148483674400, +-0.233051771991428870, -0.233100394916554350, -0.233149017258928420, -0.233197639018429940, -0.233246260194937350, -0.233294880788329550, -0.233343500798484120, -0.233392120225279940, +-0.233440739068595890, -0.233489357328309550, -0.233537975004299820, -0.233586592096445170, -0.233635208604624440, -0.233683824528715280, -0.233732439868596570, -0.233781054624146750, +-0.233829668795244690, -0.233878282381768080, -0.233926895383595730, -0.233975507800606160, -0.234024119632678250, -0.234072730879689610, -0.234121341541519120, -0.234169951618045300, +-0.234218561109147020, -0.234267170014701900, -0.234315778334588890, -0.234364386068686840, -0.234412993216873390, -0.234461599779027450, -0.234510205755027540, -0.234558811144752520, +-0.234607415948080040, -0.234656020164889040, -0.234704623795057990, -0.234753226838465810, -0.234801829294990110, -0.234850431164509850, -0.234899032446903520, -0.234947633142050030, +-0.234996233249827050, -0.235044832770113450, -0.235093431702787790, -0.235142030047728990, -0.235190627804814640, -0.235239224973923770, -0.235287821554934830, -0.235336417547726750, +-0.235385012952177200, -0.235433607768165130, -0.235482201995569460, -0.235530795634267850, -0.235579388684139250, -0.235627981145062200, -0.235676573016915610, -0.235725164299577160, +-0.235773754992925800, -0.235822345096840050, -0.235870934611198870, -0.235919523535879920, -0.235968111870762160, -0.236016699615724130, -0.236065286770644780, -0.236113873335401760, +-0.236162459309874090, -0.236211044693940250, -0.236259629487479250, -0.236308213690368720, -0.236356797302487680, -0.236405380323715050, -0.236453962753928580, -0.236502544593007180, +-0.236551125840829410, -0.236599706497274270, -0.236648286562219420, -0.236696866035543850, -0.236745444917126120, -0.236794023206845230, -0.236842600904578810, -0.236891178010205930, +-0.236939754523605080, -0.236988330444655280, -0.237036905773234250, -0.237085480509220900, -0.237134054652493900, -0.237182628202932180, -0.237231201160413440, -0.237279773524816720, +-0.237328345296020980, -0.237376916473903960, -0.237425487058344630, -0.237474057049221620, -0.237522626446413860, -0.237571195249799110, -0.237619763459256390, -0.237668331074664230, +-0.237716898095901710, -0.237765464522846500, -0.237814030355377630, -0.237862595593373670, -0.237911160236713660, -0.237959724285275310, -0.238008287738937670, -0.238056850597579310, +-0.238105412861079250, -0.238153974529315220, -0.238202535602166250, -0.238251096079511370, -0.238299655961228350, -0.238348215247196150, -0.238396773937293440, -0.238445332031399200, +-0.238493889529391210, -0.238542446431148520, -0.238591002736549710, -0.238639558445473800, -0.238688113557798560, -0.238736668073403050, -0.238785221992165870, -0.238833775313966070, +-0.238882328038681400, -0.238930880166190910, -0.238979431696373200, -0.239027982629107380, -0.239076532964271140, -0.239125082701743570, -0.239173631841403310, -0.239222180383129400, +-0.239270728326799580, -0.239319275672292970, -0.239367822419488590, -0.239416368568264230, -0.239464914118498930, -0.239513459070071380, -0.239562003422860580, -0.239610547176744350, +-0.239659090331601770, -0.239707632887311450, -0.239756174843752470, -0.239804716200802630, -0.239853256958341000, -0.239901797116246230, -0.239950336674397390, -0.239998875632672280, +-0.240047413990949980, -0.240095951749109170, -0.240144488907028890, -0.240193025464586960, -0.240241561421662450, -0.240290096778134480, -0.240338631533880850, -0.240387165688780630, +-0.240435699242712490, -0.240484232195555540, -0.240532764547187580, -0.240581296297487700, -0.240629827446334600, -0.240678357993607340, -0.240726887939183760, -0.240775417282942970, +-0.240823946024763620, -0.240872474164524840, -0.240921001702104450, -0.240969528637381580, -0.241018054970234850, -0.241066580700543430, -0.241115105828185130, -0.241163630353039060, +-0.241212154274984350, -0.241260677593898830, -0.241309200309661580, -0.241357722422151370, -0.241406243931247270, -0.241454764836827120, -0.241503285138770060, -0.241551804836954820, +-0.241600323931260460, -0.241648842421564870, -0.241697360307747190, -0.241745877589686080, -0.241794394267260740, -0.241842910340348970, -0.241891425808829910, -0.241939940672582290, +-0.241988454931485270, -0.242036968585416650, -0.242085481634255640, -0.242133994077880920, -0.242182505916171630, -0.242231017149005660, -0.242279527776262130, -0.242328037797820220, +-0.242376547213557810, -0.242425056023353990, -0.242473564227087550, -0.242522071824637640, -0.242570578815882090, -0.242619085200700140, -0.242667590978970420, -0.242716096150572190, +-0.242764600715383280, -0.242813104673282880, -0.242861608024149720, -0.242910110767862950, -0.242958612904300490, -0.243007114433341470, -0.243055615354864700, -0.243104115668749290, +-0.243152615374873180, -0.243201114473115540, -0.243249612963355540, -0.243298110845471070, -0.243346608119341310, -0.243395104784845050, -0.243443600841861450, -0.243492096290268410, +-0.243540591129945140, -0.243589085360770400, -0.243637578982623370, -0.243686071995381950, -0.243734564398925350, -0.243783056193132370, -0.243831547377882150, -0.243880037953052630, +-0.243928527918523040, -0.243977017274172120, -0.244025506019879070, -0.244073994155521830, -0.244122481680979640, -0.244170968596131630, -0.244219454900855780, -0.244267940595031320, +-0.244316425678536980, -0.244364910151252030, -0.244413394013054340, -0.244461877263823210, -0.244510359903437340, -0.244558841931776020, -0.244607323348717180, -0.244655804154140010, +-0.244704284347923350, -0.244752763929946380, -0.244801242900087090, -0.244849721258224710, -0.244898199004238010, -0.244946676138006250, -0.244995152659407360, -0.245043628568320570, +-0.245092103864625150, -0.245140578548199070, -0.245189052618921520, -0.245237526076671350, -0.245285998921327770, -0.245334471152768770, -0.245382942770873610, -0.245431413775521080, +-0.245479884166590450, -0.245528353943959690, -0.245576823107508030, -0.245625291657114300, -0.245673759592657800, -0.245722226914016460, -0.245770693621069540, -0.245819159713695920, +-0.245867625191774800, -0.245916090055184190, -0.245964554303803370, -0.246013017937511150, -0.246061480956186820, -0.246109943359708370, -0.246158405147955030, -0.246206866320806160, +-0.246255326878139640, -0.246303786819834840, -0.246352246145770560, -0.246400704855826070, -0.246449162949879420, -0.246497620427809840, -0.246546077289496230, -0.246594533534817860, +-0.246642989163652710, -0.246691444175880100, -0.246739898571378870, -0.246788352350028330, -0.246836805511706480, -0.246885258056292610, -0.246933709983665590, -0.246982161293704730, +-0.247030611986288030, -0.247079062061294820, -0.247127511518604380, -0.247175960358094720, -0.247224408579645170, -0.247272856183134580, -0.247321303168442310, -0.247369749535446330, +-0.247418195284025980, -0.247466640414060140, -0.247515084925428120, -0.247563528818007970, -0.247611972091679010, -0.247660414746320110, -0.247708856781810590, -0.247757298198028520, +-0.247805738994853200, -0.247854179172163510, -0.247902618729838820, -0.247951057667757160, -0.247999495985797850, -0.248047933683840230, -0.248096370761762360, -0.248144807219443540, +-0.248193243056762710, -0.248241678273599190, -0.248290112869831050, -0.248338546845337650, -0.248386980199997860, -0.248435412933691060, -0.248483845046295310, -0.248532276537689920, +-0.248580707407753840, -0.248629137656366430, -0.248677567283405760, -0.248725996288751170, -0.248774424672281590, -0.248822852433876360, -0.248871279573413570, -0.248919706090772600, +-0.248968131985832340, -0.249016557258472190, -0.249064981908570240, -0.249113405936005810, -0.249161829340658310, -0.249210252122405800, -0.249258674281127630, -0.249307095816702820, +-0.249355516729010680, -0.249403937017929320, -0.249452356683338120, -0.249500775725116030, -0.249549194143142420, -0.249597611937295400, -0.249646029107454370, -0.249694445653498240, +-0.249742861575306450, -0.249791276872757070, -0.249839691545729490, -0.249888105594102680, -0.249936519017756040, -0.249984931816567670, -0.250033343990416990, -0.250081755539183330, +-0.250130166462744890, -0.250178576760981040, -0.250226986433770730, -0.250275395480993370, -0.250323803902527120, -0.250372211698251360, -0.250420618868045060, -0.250469025411787620, +-0.250517431329357220, -0.250565836620633250, -0.250614241285494640, -0.250662645323820930, -0.250711048735490110, -0.250759451520381700, -0.250807853678374660, -0.250856255209348400, +-0.250904656113181080, -0.250953056389752130, -0.251001456038940970, -0.251049855060625720, -0.251098253454685840, -0.251146651221000330, -0.251195048359448670, -0.251243444869908910, +-0.251291840752260520, -0.251340236006382560, -0.251388630632154440, -0.251437024629454280, -0.251485417998161600, -0.251533810738155340, -0.251582202849314980, -0.251630594331518740, +-0.251678985184645930, -0.251727375408575700, -0.251775765003187490, -0.251824153968359440, -0.251872542303970940, -0.251920930009901120, -0.251969317086029430, -0.252017703532234020, +-0.252066089348394310, -0.252114474534389790, -0.252162859090098720, -0.252211243015400430, -0.252259626310174120, -0.252308008974299110, -0.252356391007653670, -0.252404772410117220, +-0.252453153181568910, -0.252501533321888070, -0.252549912830953020, -0.252598291708643170, -0.252646669954837590, -0.252695047569415740, -0.252743424552255900, -0.252791800903237440, +-0.252840176622239510, -0.252888551709141540, -0.252936926163821800, -0.252985299986159710, -0.253033673176034810, -0.253082045733325320, -0.253130417657910720, -0.253178788949670050, +-0.253227159608482850, -0.253275529634227280, -0.253323899026782930, -0.253372267786028840, -0.253420635911844490, -0.253469003404108110, -0.253517370262699220, -0.253565736487496920, +-0.253614102078380750, -0.253662467035228820, -0.253710831357920770, -0.253759195046335650, -0.253807558100352940, -0.253855920519850900, -0.253904282304709070, -0.253952643454806950, +-0.254001003970022840, -0.254049363850236190, -0.254097723095326130, -0.254146081705172170, -0.254194439679652610, -0.254242797018646940, -0.254291153722034310, -0.254339509789694160, +-0.254387865221504860, -0.254436220017345840, -0.254484574177096360, -0.254532927700635790, -0.254581280587842520, -0.254629632838596020, -0.254677984452775450, -0.254726335430260350, +-0.254774685770928990, -0.254823035474660900, -0.254871384541335620, -0.254919732970831480, -0.254968080763028020, -0.255016427917804380, -0.255064774435040050, -0.255113120314613360, +-0.255161465556403900, -0.255209810160290760, -0.255258154126153550, -0.255306497453870460, -0.255354840143321220, -0.255403182194384790, -0.255451523606940900, -0.255499864380867750, +-0.255548204516044930, -0.255596544012351600, -0.255644882869667300, -0.255693221087870400, -0.255741558666840450, -0.255789895606456650, -0.255838231906598490, -0.255886567567144290, +-0.255934902587973740, -0.255983236968966300, -0.256031570710000380, -0.256079903810955520, -0.256128236271710890, -0.256176568092146120, -0.256224899272139480, -0.256273229811570640, +-0.256321559710318670, -0.256369888968263240, -0.256418217585282720, -0.256466545561256590, -0.256514872896064120, -0.256563199589584840, -0.256611525641697200, -0.256659851052280730, +-0.256708175821214630, -0.256756499948378510, -0.256804823433650740, -0.256853146276910860, -0.256901468478038570, -0.256949790036912210, -0.256998110953411350, -0.257046431227415220, +-0.257094750858803400, -0.257143069847454330, -0.257191388193247550, -0.257239705896062320, -0.257288022955778240, -0.257336339372273680, -0.257384655145428300, -0.257432970275121240, +-0.257481284761232170, -0.257529598603639500, -0.257577911802222840, -0.257626224356861390, -0.257674536267434750, -0.257722847533821410, -0.257771158155900960, -0.257819468133553000, +-0.257867777466655960, -0.257916086155089490, -0.257964394198732740, -0.258012701597465480, -0.258061008351166080, -0.258109314459714080, -0.258157619922988860, -0.258205924740869950, +-0.258254228913235850, -0.258302532439966200, -0.258350835320940160, -0.258399137556037490, -0.258447439145136570, -0.258495740088116990, -0.258544040384858120, -0.258592340035239570, +-0.258640639039139700, -0.258688937396438280, -0.258737235107014460, -0.258785532170748010, -0.258833828587517360, -0.258882124357202040, -0.258930419479681870, -0.258978713954835240, +-0.259027007782541840, -0.259075300962680890, -0.259123593495132140, -0.259171885379773980, -0.259220176616486110, -0.259268467205147730, -0.259316757145638680, -0.259365046437837310, +-0.259413335081623290, -0.259461623076875980, -0.259509910423474990, -0.259558197121298790, -0.259606483170227160, -0.259654768570139250, -0.259703053320914920, -0.259751337422432450, +-0.259799620874571700, -0.259847903677212280, -0.259896185830232720, -0.259944467333512670, -0.259992748186931470, -0.260041028390368800, -0.260089307943703110, -0.260137586846814210, +-0.260185865099581300, -0.260234142701884160, -0.260282419653601270, -0.260330695954612280, -0.260378971604796560, -0.260427246604033880, -0.260475520952202610, -0.260523794649182570, +-0.260572067694853030, -0.260620340089093790, -0.260668611831783190, -0.260716882922801150, -0.260765153362027270, -0.260813423149340080, -0.260861692284619360, -0.260909960767744360, +-0.260958228598594970, -0.261006495777049490, -0.261054762302987850, -0.261103028176289220, -0.261151293396833520, -0.261199557964499120, -0.261247821879165840, -0.261296085140713010, +-0.261344347749020380, -0.261392609703966490, -0.261440871005431060, -0.261489131653293410, -0.261537391647433390, -0.261585650987729460, -0.261633909674061420, -0.261682167706309030, +-0.261730425084350790, -0.261778681808066460, -0.261826937877335460, -0.261875193292037510, -0.261923448052051140, -0.261971702157256180, -0.262019955607532000, -0.262068208402758300, +-0.262116460542813680, -0.262164712027577910, -0.262212962856930350, -0.262261213030750780, -0.262309462548917790, -0.262357711411311150, -0.262405959617810210, -0.262454207168294820, +-0.262502454062643440, -0.262550700300735960, -0.262598945882451750, -0.262647190807670570, -0.262695435076271020, -0.262743678688132860, -0.262791921643135920, -0.262840163941158720, +-0.262888405582081150, -0.262936646565782580, -0.262984886892142780, -0.263033126561040390, -0.263081365572355120, -0.263129603925966520, -0.263177841621754280, -0.263226078659597020, +-0.263274315039374540, -0.263322550760966280, -0.263370785824252110, -0.263419020229110510, -0.263467253975421370, -0.263515487063064100, -0.263563719491918540, -0.263611951261863210, +-0.263660182372778050, -0.263708412824542830, -0.263756642617036190, -0.263804871750137950, -0.263853100223727490, -0.263901328037684730, -0.263949555191888230, -0.263997781686217790, +-0.264046007520552960, -0.264094232694773500, -0.264142457208758060, -0.264190681062386470, -0.264238904255538140, -0.264287126788093020, -0.264335348659929640, -0.264383569870927870, +-0.264431790420967210, -0.264480010309927520, -0.264528229537687340, -0.264576448104126560, -0.264624666009125150, -0.264672883252561610, -0.264721099834315850, -0.264769315754267380, +-0.264817531012295990, -0.264865745608280410, -0.264913959542100400, -0.264962172813635540, -0.265010385422765670, -0.265058597369369430, -0.265106808653326640, -0.265155019274516850, +-0.265203229232819970, -0.265251438528114560, -0.265299647160280590, -0.265347855129197450, -0.265396062434745120, -0.265444269076802240, -0.265492475055248640, -0.265540680369963870, +-0.265588885020827840, -0.265637089007719150, -0.265685292330517740, -0.265733494989103540, -0.265781696983355130, -0.265829898313152510, -0.265878098978375170, -0.265926298978902960, +-0.265974498314614620, -0.266022696985390050, -0.266070894991108700, -0.266119092331650540, -0.266167289006894240, -0.266215485016719710, -0.266263680361006450, -0.266311875039634440, +-0.266360069052482270, -0.266408262399430000, -0.266456455080357040, -0.266504647095143320, -0.266552838443667620, -0.266601029125809800, -0.266649219141449840, -0.266697408490466410, +-0.266745597172739430, -0.266793785188148500, -0.266841972536573550, -0.266890159217893160, -0.266938345231987450, -0.266986530578735840, -0.267034715258018310, -0.267082899269713630, +-0.267131082613701660, -0.267179265289861970, -0.267227447298074570, -0.267275628638218130, -0.267323809310172580, -0.267371989313817560, -0.267420168649032950, -0.267468347315697520, +-0.267516525313691190, -0.267564702642894000, -0.267612879303184610, -0.267661055294443060, -0.267709230616548830, -0.267757405269381970, -0.267805579252821170, -0.267853752566746370, +-0.267901925211037280, -0.267950097185573720, -0.267998268490234560, -0.268046439124899670, -0.268094609089448710, -0.268142778383761660, -0.268190947007717230, -0.268239114961195460, +-0.268287282244075890, -0.268335448856238500, -0.268383614797562060, -0.268431780067926620, -0.268479944667212140, -0.268528108595297410, -0.268576271852062400, -0.268624434437386650, +-0.268672596351150320, -0.268720757593232000, -0.268768918163511840, -0.268817078061869390, -0.268865237288184620, -0.268913395842336370, -0.268961553724204610, -0.269009710933668990, +-0.269057867470609500, -0.269106023334904910, -0.269154178526435250, -0.269202333045080180, -0.269250486890719680, -0.269298640063232560, -0.269346792562498830, -0.269394944388398060, +-0.269443095540810420, -0.269491246019614610, -0.269539395824690660, -0.269587544955918690, -0.269635693413177390, -0.269683841196346860, -0.269731988305306760, -0.269780134739937120, +-0.269828280500116650, -0.269876425585725550, -0.269924569996643330, -0.269972713732750170, -0.270020856793924740, -0.270068999180047230, -0.270117140890997140, -0.270165281926654680, +-0.270213422286898600, -0.270261561971608940, -0.270309700980665370, -0.270357839313948020, -0.270405976971335620, -0.270454113952708240, -0.270502250257946050, -0.270550385886927760, +-0.270598520839533560, -0.270646655115643010, -0.270694788715136300, -0.270742921637892150, -0.270791053883790710, -0.270839185452711630, -0.270887316344535000, -0.270935446559139700, +-0.270983576096405720, -0.271031704956212870, -0.271079833138441140, -0.271127960642969400, -0.271176087469677750, -0.271224213618445900, -0.271272339089153940, -0.271320463881680740, +-0.271368587995906350, -0.271416711431710920, -0.271464834188973270, -0.271512956267573550, -0.271561077667391400, -0.271609198388307050, -0.271657318430199250, -0.271705437792948150, +-0.271753556476433400, -0.271801674480535270, -0.271849791805132470, -0.271897908450105250, -0.271946024415333220, -0.271994139700696580, -0.272042254306074090, -0.272090368231346020, +-0.272138481476392080, -0.272186594041092300, -0.272234705925325620, -0.272282817128972180, -0.272330927651911690, -0.272379037494024310, -0.272427146655188910, -0.272475255135285640, +-0.272523362934194660, -0.272571470051794830, -0.272619576487966360, -0.272667682242588970, -0.272715787315542750, -0.272763891706706620, -0.272811995415960800, -0.272860098443184980, +-0.272908200788259340, -0.272956302451062780, -0.273004403431475470, -0.273052503729377120, -0.273100603344647970, -0.273148702277166870, -0.273196800526814050, -0.273244898093469190, +-0.273292994977012480, -0.273341091177322910, -0.273389186694280580, -0.273437281527765750, -0.273485375677657240, -0.273533469143835360, -0.273581561926179770, -0.273629654024570680, +-0.273677745438887070, -0.273725836169009030, -0.273773926214816440, -0.273822015576189460, -0.273870104253007010, -0.273918192245149350, -0.273966279552496140, -0.274014366174927690, +-0.274062452112322890, -0.274110537364561980, -0.274158621931524680, -0.274206705813091310, -0.274254789009140690, -0.274302871519553130, -0.274350953344208840, -0.274399034482986690, +-0.274447114935766960, -0.274495194702429500, -0.274543273782854420, -0.274591352176920770, -0.274639429884508680, -0.274687506905498090, -0.274735583239769100, -0.274783658887200740, +-0.274831733847673290, -0.274879808121066440, -0.274927881707260510, -0.274975954606134440, -0.275024026817568550, -0.275072098341442530, -0.275120169177636710, -0.275168239326030020, +-0.275216308786502720, -0.275264377558935120, -0.275312445643206120, -0.275360513039196010, -0.275408579746784620, -0.275456645765852210, -0.275504711096277780, -0.275552775737941570, +-0.275600839690723350, -0.275648902954503560, -0.275696965529161010, -0.275745027414576070, -0.275793088610628570, -0.275841149117198760, -0.275889208934165690, -0.275937268061409560, +-0.275985326498810250, -0.276033384246248070, -0.276081441303602020, -0.276129497670752340, -0.276177553347578930, -0.276225608333962040, -0.276273662629780700, -0.276321716234915250, +-0.276369769149245880, -0.276417821372651700, -0.276465872905012950, -0.276513923746209530, -0.276561973896121750, -0.276610023354628590, -0.276658072121610370, -0.276706120196946960, +-0.276754167580518680, -0.276802214272204530, -0.276850260271884860, -0.276898305579439560, -0.276946350194748890, -0.276994394117691940, -0.277042437348149040, -0.277090479886000000, +-0.277138521731125190, -0.277186562883403650, -0.277234603342715710, -0.277282643108941680, -0.277330682181960660, -0.277378720561652860, -0.277426758247898310, -0.277474795240577280, +-0.277522831539568860, -0.277570867144753320, -0.277618902056010640, -0.277666936273221090, -0.277714969796263810, -0.277763002625019070, -0.277811034759366860, -0.277859066199187490, +-0.277907096944360050, -0.277955126994764820, -0.278003156350281780, -0.278051185010791290, -0.278099212976172410, -0.278147240246305490, -0.278195266821070930, -0.278243292700347700, +-0.278291317884016290, -0.278339342371956620, -0.278387366164048970, -0.278435389260172470, -0.278483411660207510, -0.278531433364034020, -0.278579454371532420, -0.278627474682581700, +-0.278675494297062290, -0.278723513214854170, -0.278771531435837720, -0.278819548959891970, -0.278867565786897360, -0.278915581916733820, -0.278963597349281780, -0.279011612084420320, +-0.279059626122029840, -0.279107639461990240, -0.279155652104182030, -0.279203664048484230, -0.279251675294777290, -0.279299685842941570, -0.279347695692856220, -0.279395704844401630, +-0.279443713297457760, -0.279491721051905060, -0.279539728107622620, -0.279587734464490810, -0.279635740122389730, -0.279683745081199700, -0.279731749340799920, -0.279779752901070710, +-0.279827755761892170, -0.279875757923144620, -0.279923759384707260, -0.279971760146460520, -0.280019760208284400, -0.280067759570059250, -0.280115758231664290, -0.280163756192979950, +-0.280211753453886660, -0.280259750014263510, -0.280307745873991040, -0.280355741032949190, -0.280403735491018380, -0.280451729248077870, -0.280499722304007990, -0.280547714658688830, +-0.280595706312000760, -0.280643697263823040, -0.280691687514036060, -0.280739677062519900, -0.280787665909154940, -0.280835654053820380, -0.280883641496396660, -0.280931628236763880, +-0.280979614274802450, -0.281027599610391590, -0.281075584243411670, -0.281123568173743290, -0.281171551401265480, -0.281219533925858860, -0.281267515747403330, -0.281315496865779500, +-0.281363477280866470, -0.281411456992544770, -0.281459436000694450, -0.281507414305195940, -0.281555391905928430, -0.281603368802772480, -0.281651344995608120, -0.281699320484315780, +-0.281747295268774730, -0.281795269348865450, -0.281843242724468030, -0.281891215395462860, -0.281939187361729290, -0.281987158623147720, -0.282035129179598660, -0.282083099030961400, +-0.282131068177116360, -0.282179036617943630, -0.282227004353323820, -0.282274971383136010, -0.282322937707260750, -0.282370903325578180, -0.282418868237968750, -0.282466832444311760, +-0.282514795944487700, -0.282562758738376610, -0.282610720825859030, -0.282658682206814280, -0.282706642881122790, -0.282754602848664720, -0.282802562109320530, -0.282850520662969510, +-0.282898478509492230, -0.282946435648768760, -0.282994392080679560, -0.283042347805104010, -0.283090302821922550, -0.283138257131015810, -0.283186210732262970, -0.283234163625544600, +-0.283282115810740810, -0.283330067287732190, -0.283378018056397950, -0.283425968116618690, -0.283473917468274490, -0.283521866111245970, -0.283569814045412320, -0.283617761270654080, +-0.283665707786851520, -0.283713653593885060, -0.283761598691634090, -0.283809543079979080, -0.283857486758800240, -0.283905429727978110, -0.283953371987391960, -0.284001313536922370, +-0.284049254376449960, -0.284097194505853970, -0.284145133925015000, -0.284193072633813220, -0.284241010632129140, -0.284288947919842110, -0.284336884496832750, -0.284384820362981130, +-0.284432755518167930, -0.284480689962272380, -0.284528623695175120, -0.284576556716756300, -0.284624489026896520, -0.284672420625475100, -0.284720351512372570, -0.284768281687469200, +-0.284816211150645590, -0.284864139901781000, -0.284912067940756020, -0.284959995267451360, -0.285007921881746230, -0.285055847783521330, -0.285103772972656820, -0.285151697449033290, +-0.285199621212530060, -0.285247544263027790, -0.285295466600406720, -0.285343388224547360, -0.285391309135329060, -0.285439229332632550, -0.285487148816337970, -0.285535067586325910, +-0.285582985642475750, -0.285630902984668140, -0.285678819612783300, -0.285726735526701800, -0.285774650726303090, -0.285822565211467710, -0.285870478982075900, -0.285918392038008340, +-0.285966304379144390, -0.286014216005364640, -0.286062126916549810, -0.286110037112579210, -0.286157946593333550, -0.286205855358693030, -0.286253763408538250, -0.286301670742748650, +-0.286349577361204920, -0.286397483263787170, -0.286445388450376200, -0.286493292920851290, -0.286541196675093200, -0.286589099712982080, -0.286637002034398620, -0.286684903639222280, +-0.286732804527333630, -0.286780704698613000, -0.286828604152941040, -0.286876502890197120, -0.286924400910261950, -0.286972298213016230, -0.287020194798339350, -0.287068090666111940, +-0.287115985816214280, -0.287163880248527130, -0.287211773962929850, -0.287259666959303110, -0.287307559237527210, -0.287355450797482870, -0.287403341639049460, -0.287451231762107680, +-0.287499121166537810, -0.287547009852220590, -0.287594897819035410, -0.287642785066862970, -0.287690671595583590, -0.287738557405077980, -0.287786442495225500, -0.287834326865906930, +-0.287882210517002970, -0.287930093448393100, -0.287977975659957920, -0.288025857151577860, -0.288073737923133570, -0.288121617974504530, -0.288169497305571400, -0.288217375916214550, +-0.288265253806314680, -0.288313130975751230, -0.288361007424404960, -0.288408883152156240, -0.288456758158885660, -0.288504632444472770, -0.288552506008798340, -0.288600378851742610, +-0.288648250973186360, -0.288696122373009070, -0.288743993051091440, -0.288791863007314300, -0.288839732241557070, -0.288887600753700460, -0.288935468543624900, -0.288983335611211090, +-0.289031201956338520, -0.289079067578887900, -0.289126932478739660, -0.289174796655774500, -0.289222660109871910, -0.289270522840912700, -0.289318384848777140, -0.289366246133346050, +-0.289414106694498960, -0.289461966532116590, -0.289509825646079240, -0.289557684036267860, -0.289605541702561750, -0.289653398644841850, -0.289701254862988420, -0.289749110356882280, +-0.289796965126402960, -0.289844819171431180, -0.289892672491847800, -0.289940525087532370, -0.289988376958365550, -0.290036228104227860, -0.290084078524999960, -0.290131928220561440, +-0.290179777190793130, -0.290227625435575400, -0.290275472954789000, -0.290323319748313490, -0.290371165816029670, -0.290419011157817930, -0.290466855773559130, -0.290514699663132760, +-0.290562542826419580, -0.290610385263300130, -0.290658226973655060, -0.290706067957364030, -0.290753908214307850, -0.290801747744367340, -0.290849586547421990, -0.290897424623352660, +-0.290945261972039850, -0.290993098593364250, -0.291040934487205470, -0.291088769653444380, -0.291136604091961350, -0.291184437802637250, -0.291232270785351630, -0.291280103039985310, +-0.291327934566418760, -0.291375765364532800, -0.291423595434206980, -0.291471424775322170, -0.291519253387758800, -0.291567081271397740, -0.291614908426118590, -0.291662734851802110, +-0.291710560548329220, -0.291758385515579530, -0.291806209753433850, -0.291854033261772670, -0.291901856040476800, -0.291949678089425900, -0.291997499408500780, -0.292045319997581930, +-0.292093139856550170, -0.292140958985285190, -0.292188777383667770, -0.292236595051578400, -0.292284411988897990, -0.292332228195506140, -0.292380043671283670, -0.292427858416111130, +-0.292475672429869380, -0.292523485712438020, -0.292571298263697930, -0.292619110083529590, -0.292666921171813920, -0.292714731528430470, -0.292762541153260280, -0.292810350046184110, +-0.292858158207081610, -0.292905965635833760, -0.292953772332321010, -0.293001578296424200, -0.293049383528023070, -0.293097188026998470, -0.293144991793230840, -0.293192794826601210, +-0.293240597126989190, -0.293288398694275640, -0.293336199528341110, -0.293383999629066470, -0.293431798996331480, -0.293479597630016910, -0.293527395530003400, -0.293575192696171830, +-0.293622989128401790, -0.293670784826574330, -0.293718579790570370, -0.293766374020269450, -0.293814167515552670, -0.293861960276300400, -0.293909752302393690, -0.293957543593712180, +-0.294005334150136800, -0.294053123971548090, -0.294100913057827040, -0.294148701408853240, -0.294196489024507680, -0.294244275904670890, -0.294292062049223870, -0.294339847458046260, +-0.294387632131018980, -0.294435416068022650, -0.294483199268938230, -0.294530981733645390, -0.294578763462025050, -0.294626544453958250, -0.294674324709324700, -0.294722104228005320, +-0.294769883009880660, -0.294817661054831700, -0.294865438362738210, -0.294913214933481100, -0.294960990766940930, -0.295008765862998730, -0.295056540221534210, -0.295104313842428300, +-0.295152086725561650, -0.295199858870815180, -0.295247630278068660, -0.295295400947203020, -0.295343170878098920, -0.295390940070637320, -0.295438708524697890, -0.295486476240161780, +-0.295534243216909850, -0.295582009454821880, -0.295629774953778900, -0.295677539713661450, -0.295725303734350630, -0.295773067015726090, -0.295820829557668920, -0.295868591360059610, +-0.295916352422779310, -0.295964112745707660, -0.296011872328725780, -0.296059631171714190, -0.296107389274553930, -0.296155146637124780, -0.296202903259307760, -0.296250659140983530, +-0.296298414282033020, -0.296346168682336040, -0.296393922341773700, -0.296441675260226520, -0.296489427437575560, -0.296537178873700620, -0.296584929568482760, -0.296632679521803000, +-0.296680428733541060, -0.296728177203578080, -0.296775924931794670, -0.296823671918071850, -0.296871418162289460, -0.296919163664328520, -0.296966908424069640, -0.297014652441393910, +-0.297062395716181150, -0.297110138248312390, -0.297157880037668300, -0.297205621084129960, -0.297253361387577080, -0.297301100947890810, -0.297348839764951800, -0.297396577838641150, +-0.297444315168838570, -0.297492051755425260, -0.297539787598282200, -0.297587522697289280, -0.297635257052327520, -0.297682990663277640, -0.297730723530020670, -0.297778455652436550, +-0.297826187030406200, -0.297873917663810440, -0.297921647552530310, -0.297969376696445580, -0.298017105095437440, -0.298064832749386550, -0.298112559658174010, -0.298160285821679640, +-0.298208011239784580, -0.298255735912369420, -0.298303459839315390, -0.298351183020502290, -0.298398905455811210, -0.298446627145123320, -0.298494348088318430, -0.298542068285277680, +-0.298589787735881740, -0.298637506440011750, -0.298685224397547580, -0.298732941608370330, -0.298780658072360760, -0.298828373789399910, -0.298876088759367780, -0.298923802982145380, +-0.298971516457613500, -0.299019229185653210, -0.299066941166144460, -0.299114652398968340, -0.299162362884005610, -0.299210072621137410, -0.299257781610243580, -0.299305489851205250, +-0.299353197343903250, -0.299400904088218680, -0.299448610084031450, -0.299496315331222620, -0.299544019829673490, -0.299591723579263890, -0.299639426579874910, -0.299687128831387430, +-0.299734830333682530, -0.299782531086640160, -0.299830231090141400, -0.299877930344067120, -0.299925628848298430, -0.299973326602715200, -0.300021023607198680, -0.300068719861629580, +-0.300116415365889180, -0.300164110119857220, -0.300211804123415080, -0.300259497376443360, -0.300307189878823320, -0.300354881630434940, -0.300402572631159330, -0.300450262880877670, +-0.300497952379469970, -0.300545641126817360, -0.300593329122800680, -0.300641016367301120, -0.300688702860198550, -0.300736388601374250, -0.300784073590708970, -0.300831757828083910, +-0.300879441313379010, -0.300927124046475590, -0.300974806027254290, -0.301022487255596440, -0.301070167731381900, -0.301117847454491990, -0.301165526424807430, -0.301213204642209520, +-0.301260882106578140, -0.301308558817794560, -0.301356234775740030, -0.301403909980294430, -0.301451584431339130, -0.301499258128754830, -0.301546931072422810, -0.301594603262223040, +-0.301642274698036730, -0.301689945379744750, -0.301737615307228370, -0.301785284480367510, -0.301832952899043440, -0.301880620563136970, -0.301928287472529370, -0.301975953627100670, +-0.302023619026732030, -0.302071283671304370, -0.302118947560698900, -0.302166610694795670, -0.302214273073475930, -0.302261934696620880, -0.302309595564110630, -0.302357255675826330, +-0.302404915031648960, -0.302452573631459660, -0.302500231475138550, -0.302547888562566810, -0.302595544893625390, -0.302643200468195480, -0.302690855286157190, -0.302738509347391770, +-0.302786162651780040, -0.302833815199203380, -0.302881466989541710, -0.302929118022676410, -0.302976768298488300, -0.303024417816858680, -0.303072066577667610, -0.303119714580796340, +-0.303167361826125860, -0.303215008313537320, -0.303262654042910860, -0.303310299014127760, -0.303357943227069380, -0.303405586681615660, -0.303453229377648010, -0.303500871315047270, +-0.303548512493694740, -0.303596152913470580, -0.303643792574256000, -0.303691431475931920, -0.303739069618379710, -0.303786707001479420, -0.303834343625112360, -0.303881979489159400, +-0.303929614593501930, -0.303977248938020030, -0.304024882522594960, -0.304072515347107720, -0.304120147411439610, -0.304167778715470680, -0.304215409259082360, -0.304263039042155900, +-0.304310668064571410, -0.304358296326210250, -0.304405923826953360, -0.304453550566682110, -0.304501176545276530, -0.304548801762618000, -0.304596426218587510, -0.304644049913066370, +-0.304691672845934620, -0.304739295017073750, -0.304786916426364630, -0.304834537073688630, -0.304882156958925900, -0.304929776081957700, -0.304977394442665140, -0.305025012040929470, +-0.305072628876630890, -0.305120244949650680, -0.305167860259870300, -0.305215474807169870, -0.305263088591430750, -0.305310701612533930, -0.305358313870360720, -0.305405925364791330, +-0.305453536095707130, -0.305501146062989120, -0.305548755266518590, -0.305596363706175820, -0.305643971381842130, -0.305691578293398490, -0.305739184440726340, -0.305786789823705770, +-0.305834394442218270, -0.305881998296144760, -0.305929601385366680, -0.305977203709764220, -0.306024805269218710, -0.306072406063611190, -0.306120006092823080, -0.306167605356734480, +-0.306215203855226940, -0.306262801588181810, -0.306310398555479200, -0.306357994757000650, -0.306405590192627090, -0.306453184862239990, -0.306500778765719460, -0.306548371902947040, +-0.306595964273803650, -0.306643555878170770, -0.306691146715928620, -0.306738736786958570, -0.306786326091141700, -0.306833914628359410, -0.306881502398491930, -0.306929089401420720, +-0.306976675637026740, -0.307024261105191540, -0.307071845805795220, -0.307119429738719310, -0.307167012903845240, -0.307214595301053220, -0.307262176930224670, -0.307309757791240760, +-0.307357337883982780, -0.307404917208331130, -0.307452495764167110, -0.307500073551371880, -0.307547650569826910, -0.307595226819412370, -0.307642802300009790, -0.307690377011500150, +-0.307737950953765050, -0.307785524126684580, -0.307833096530140350, -0.307880668164013380, -0.307928239028185170, -0.307975809122535920, -0.308023378446947160, -0.308070947001300330, +-0.308118514785475750, -0.308166081799354900, -0.308213648042818810, -0.308261213515749030, -0.308308778218025830, -0.308356342149530670, -0.308403905310144610, -0.308451467699749240, +-0.308499029318224820, -0.308546590165452770, -0.308594150241314260, -0.308641709545690810, -0.308689268078462640, -0.308736825839511290, -0.308784382828717900, -0.308831939045964010, +-0.308879494491129780, -0.308927049164096860, -0.308974603064746280, -0.309022156192959640, -0.309069708548617210, -0.309117260131600460, -0.309164810941791050, -0.309212360979069120, +-0.309259910243316340, -0.309307458734413730, -0.309355006452242950, -0.309402553396684210, -0.309450099567619100, -0.309497644964928710, -0.309545189588494640, -0.309592733438197150, +-0.309640276513917900, -0.309687818815537920, -0.309735360342938800, -0.309782901096000870, -0.309830441074605670, -0.309877980278634390, -0.309925518707968580, -0.309973056362488510, +-0.310020593242075870, -0.310068129346612100, -0.310115664675977620, -0.310163199230053980, -0.310210733008722370, -0.310258266011864290, -0.310305798239360160, -0.310353329691091530, +-0.310400860366939590, -0.310448390266785890, -0.310495919390510800, -0.310543447737995910, -0.310590975309122440, -0.310638502103771920, -0.310686028121824720, -0.310733553363162440, +-0.310781077827666290, -0.310828601515217850, -0.310876124425697510, -0.310923646558986850, -0.310971167914967540, -0.311018688493519820, -0.311066208294525410, -0.311113727317865460, +-0.311161245563421670, -0.311208763031074250, -0.311256279720705020, -0.311303795632195010, -0.311351310765425990, -0.311398825120278280, -0.311446338696633460, -0.311493851494372810, +-0.311541363513377970, -0.311588874753529250, -0.311636385214708380, -0.311683894896796540, -0.311731403799675400, -0.311778911923225320, -0.311826419267327960, -0.311873925831864960, +-0.311921431616716760, -0.311968936621764950, -0.312016440846890840, -0.312063944291975980, -0.312111446956900910, -0.312158948841547160, -0.312206449945796050, -0.312253950269529290, +-0.312301449812627200, -0.312348948574971470, -0.312396446556443390, -0.312443943756924580, -0.312491440176295490, -0.312538935814437870, -0.312586430671232820, -0.312633924746562150, +-0.312681418040306300, -0.312728910552346860, -0.312776402282565150, -0.312823893230842810, -0.312871383397060390, -0.312918872781099480, -0.312966361382841780, -0.313013849202167790, +-0.313061336238959150, -0.313108822493097240, -0.313156307964463640, -0.313203792652938850, -0.313251276558404570, -0.313298759680742110, -0.313346242019833190, -0.313393723575558230, +-0.313441204347798930, -0.313488684336436670, -0.313536163541353050, -0.313583641962428660, -0.313631119599545150, -0.313678596452583890, -0.313726072521426480, -0.313773547805953510, +-0.313821022306046690, -0.313868496021587670, -0.313915968952457050, -0.313963441098536470, -0.314010912459707300, -0.314058383035851260, -0.314105852826848890, -0.314153321832581820, +-0.314200790052931500, -0.314248257487779630, -0.314295724137006630, -0.314343190000494380, -0.314390655078124140, -0.314438119369777670, -0.314485582875335510, -0.314533045594679370, +-0.314580507527690620, -0.314627968674251020, -0.314675429034241060, -0.314722888607542550, -0.314770347394037200, -0.314817805393605600, -0.314865262606129510, -0.314912719031490210, +-0.314960174669569600, -0.315007629520248080, -0.315055083583407500, -0.315102536858929190, -0.315149989346694970, -0.315197441046585370, -0.315244891958482150, -0.315292342082266750, +-0.315339791417820870, -0.315387239965025100, -0.315434687723761210, -0.315482134693910620, -0.315529580875355150, -0.315577026267975240, -0.315624470871652800, -0.315671914686269210, +-0.315719357711706230, -0.315766799947844400, -0.315814241394565600, -0.315861682051751640, -0.315909121919283000, -0.315956560997041610, -0.316003999284908800, -0.316051436782766370, +-0.316098873490494980, -0.316146309407976390, -0.316193744535092030, -0.316241178871723700, -0.316288612417752020, -0.316336045173058860, -0.316383477137525520, -0.316430908311033930, +-0.316478338693464640, -0.316525768284699530, -0.316573197084620010, -0.316620625093107900, -0.316668052310043750, -0.316715478735309530, -0.316762904368787010, -0.316810329210356840, +-0.316857753259900840, -0.316905176517300440, -0.316952598982437550, -0.317000020655192670, -0.317047441535447780, -0.317094861623084310, -0.317142280917984080, -0.317189699420027730, +-0.317237117129097130, -0.317284534045073780, -0.317331950167839490, -0.317379365497274860, -0.317426780033261860, -0.317474193775681920, -0.317521606724416870, -0.317569018879347410, +-0.317616430240355410, -0.317663840807322740, -0.317711250580130060, -0.317758659558659280, -0.317806067742791800, -0.317853475132409580, -0.317900881727393280, -0.317948287527624770, +-0.317995692532985540, -0.318043096743357460, -0.318090500158621280, -0.318137902778658780, -0.318185304603351590, -0.318232705632581550, -0.318280105866229290, -0.318327505304176750, +-0.318374903946305520, -0.318422301792497360, -0.318469698842633100, -0.318517095096594590, -0.318564490554263720, -0.318611885215521250, -0.318659279080249050, -0.318706672148328600, +-0.318754064419641940, -0.318801455894069720, -0.318848846571493820, -0.318896236451795820, -0.318943625534857610, -0.318991013820560000, -0.319038401308784800, -0.319085787999413560, +-0.319133173892328310, -0.319180558987409770, -0.319227943284539740, -0.319275326783599880, -0.319322709484472110, -0.319370091387037200, -0.319417472491177020, -0.319464852796773170, +-0.319512232303707620, -0.319559611011861030, -0.319606988921115440, -0.319654366031352780, -0.319701742342453800, -0.319749117854300490, -0.319796492566774340, -0.319843866479757380, +-0.319891239593130370, -0.319938611906775250, -0.319985983420573550, -0.320033354134407370, -0.320080724048157410, -0.320128093161705600, -0.320175461474933530, -0.320222828987723250, +-0.320270195699955460, -0.320317561611512200, -0.320364926722275070, -0.320412291032125980, -0.320459654540945770, -0.320507017248616470, -0.320554379155020000, -0.320601740260037130, +-0.320649100563549950, -0.320696460065440000, -0.320743818765589380, -0.320791176663878740, -0.320838533760190170, -0.320885890054405270, -0.320933245546406010, -0.320980600236073280, +-0.321027954123289050, -0.321075307207934920, -0.321122659489892940, -0.321170010969043910, -0.321217361645269820, -0.321264711518452320, -0.321312060588473500, -0.321359408855214080, +-0.321406756318556140, -0.321454102978381730, -0.321501448834571660, -0.321548793887007970, -0.321596138135572310, -0.321643481580146660, -0.321690824220611960, -0.321738166056850130, +-0.321785507088742930, -0.321832847316172340, -0.321880186739019300, -0.321927525357165730, -0.321974863170493340, -0.322022200178884220, -0.322069536382219190, -0.322116871780380290, +-0.322164206373249270, -0.322211540160708130, -0.322258873142637680, -0.322306205318920070, -0.322353536689436950, -0.322400867254070410, -0.322448197012701330, -0.322495525965211690, +-0.322542854111483700, -0.322590181451398120, -0.322637507984837090, -0.322684833711682330, -0.322732158631815870, -0.322779482745118580, -0.322826806051472630, -0.322874128550759590, +-0.322921450242861730, -0.322968771127659760, -0.323016091205035880, -0.323063410474871800, -0.323110728937049620, -0.323158046591450140, -0.323205363437955580, -0.323252679476447650, +-0.323299994706808370, -0.323347309128918740, -0.323394622742660790, -0.323441935547916730, -0.323489247544567430, -0.323536558732494980, -0.323583869111581160, -0.323631178681708040, +-0.323678487442756620, -0.323725795394608940, -0.323773102537146750, -0.323820408870252260, -0.323867714393806350, -0.323915019107691100, -0.323962323011788340, -0.324009626105980160, +-0.324056928390147550, -0.324104229864172530, -0.324151530527936990, -0.324198830381323080, -0.324246129424211600, -0.324293427656484830, -0.324340725078024920, -0.324388021688712780, +-0.324435317488430570, -0.324482612477060120, -0.324529906654483500, -0.324577200020581710, -0.324624492575236900, -0.324671784318330880, -0.324719075249745800, -0.324766365369362650, +-0.324813654677063520, -0.324860943172730340, -0.324908230856245150, -0.324955517727488990, -0.325002803786344050, -0.325050089032692110, -0.325097373466415320, -0.325144657087394710, +-0.325191939895512430, -0.325239221890650740, -0.325286503072690580, -0.325333783441514200, -0.325381062997003310, -0.325428341739040170, -0.325475619667505770, -0.325522896782282360, +-0.325570173083251650, -0.325617448570295950, -0.325664723243296260, -0.325711997102134660, -0.325759270146693150, -0.325806542376853860, -0.325853813792497780, -0.325901084393507180, +-0.325948354179763870, -0.325995623151150100, -0.326042891307546820, -0.326090158648836340, -0.326137425174900460, -0.326184690885621460, -0.326231955780880270, -0.326279219860559240, +-0.326326483124540550, -0.326373745572705210, -0.326421007204935550, -0.326468268021113340, -0.326515528021120880, -0.326562787204839220, -0.326610045572150560, -0.326657303122936780, +-0.326704559857080190, -0.326751815774461770, -0.326799070874963790, -0.326846325158468120, -0.326893578624857130, -0.326940831274011690, -0.326988083105814230, -0.327035334120146510, +-0.327082584316890910, -0.327129833695928460, -0.327177082257141370, -0.327224330000412010, -0.327271576925621420, -0.327318823032651920, -0.327366068321385320, -0.327413312791703940, +-0.327460556443488930, -0.327507799276622490, -0.327555041290986500, -0.327602282486463390, -0.327649522862934140, -0.327696762420281120, -0.327744001158386140, -0.327791239077131590, +-0.327838476176398550, -0.327885712456069290, -0.327932947916025730, -0.327980182556150250, -0.328027416376323930, -0.328074649376429000, -0.328121881556347920, -0.328169112915961680, +-0.328216343455152660, -0.328263573173802840, -0.328310802071794420, -0.328358030149008610, -0.328405257405327780, -0.328452483840633750, -0.328499709454808940, -0.328546934247734400, +-0.328594158219292550, -0.328641381369365330, -0.328688603697835090, -0.328735825204582890, -0.328783045889491090, -0.328830265752441730, -0.328877484793317130, -0.328924703011998330, +-0.328971920408367870, -0.329019136982307560, -0.329066352733699830, -0.329113567662425780, -0.329160781768367830, -0.329207995051408350, -0.329255207511428450, -0.329302419148310540, +-0.329349629961936560, -0.329396839952188940, -0.329444049118948810, -0.329491257462098560, -0.329538464981520170, -0.329585671677096010, -0.329632877548707240, -0.329680082596236320, +-0.329727286819565200, -0.329774490218576240, -0.329821692793150660, -0.329868894543170870, -0.329916095468518800, -0.329963295569076940, -0.330010494844726390, -0.330057693295349620, +-0.330104890920829060, -0.330152087721045820, -0.330199283695882360, -0.330246478845220740, -0.330293673168943260, -0.330340866666931240, -0.330388059339067060, -0.330435251185232700, +-0.330482442205310640, -0.330529632399182040, -0.330576821766729370, -0.330624010307834670, -0.330671198022380320, -0.330718384910247630, -0.330765570971318920, -0.330812756205476290, +-0.330859940612602150, -0.330907124192577780, -0.330954306945285600, -0.331001488870608100, -0.331048669968426410, -0.331095850238623090, -0.331143029681080110, -0.331190208295679970, +-0.331237386082303910, -0.331284563040834420, -0.331331739171153440, -0.331378914473143600, -0.331426088946686010, -0.331473262591663210, -0.331520435407957280, -0.331567607395450660, +-0.331614778554024600, -0.331661948883561600, -0.331709118383943740, -0.331756287055053500, -0.331803454896772100, -0.331850621908982070, -0.331897788091565890, -0.331944953444404890, +-0.331992117967381430, -0.332039281660377720, -0.332086444523276180, -0.332133606555958140, -0.332180767758306070, -0.332227928130202130, -0.332275087671528750, -0.332322246382167230, +-0.332369404262000070, -0.332416561310909460, -0.332463717528777850, -0.332510872915486480, -0.332558027470917950, -0.332605181194954360, -0.332652334087478240, -0.332699486148370860, +-0.332746637377514750, -0.332793787774792070, -0.332840937340085350, -0.332888086073275860, -0.332935233974246130, -0.332982381042878750, -0.333029527279054990, -0.333076672682657450, +-0.333123817253568210, -0.333170960991669820, -0.333218103896843640, -0.333265245968972170, -0.333312387207937600, -0.333359527613622470, -0.333406667185908110, -0.333453805924677100, +-0.333500943829811550, -0.333548080901194090, -0.333595217138705990, -0.333642352542229850, -0.333689487111647810, -0.333736620846842470, -0.333783753747695200, -0.333830885814088480, +-0.333878017045905030, -0.333925147443026090, -0.333972277005334270, -0.334019405732711830, -0.334066533625041180, -0.334113660682203880, -0.334160786904082350, -0.334207912290558910, +-0.334255036841516080, -0.334302160556835260, -0.334349283436399030, -0.334396405480089590, -0.334443526687789540, -0.334490647059380250, -0.334537766594744380, -0.334584885293764070, +-0.334632003156321970, -0.334679120182299390, -0.334726236371579110, -0.334773351724043600, -0.334820466239574290, -0.334867579918053830, -0.334914692759364420, -0.334961804763388660, +-0.335008915930008030, -0.335056026259105080, -0.335103135750562050, -0.335150244404261610, -0.335197352220085180, -0.335244459197915350, -0.335291565337634320, -0.335338670639124870, +-0.335385775102268250, -0.335432878726947270, -0.335479981513044030, -0.335527083460441300, -0.335574184569020380, -0.335621284838664050, -0.335668384269254490, -0.335715482860674430, +-0.335762580612805230, -0.335809677525529540, -0.335856773598730120, -0.335903868832288290, -0.335950963226086810, -0.335998056780007940, -0.336045149493934380, -0.336092241367747460, +-0.336139332401329980, -0.336186422594564160, -0.336233511947332700, -0.336280600459517020, -0.336327688130999840, -0.336374774961663460, -0.336421860951390590, -0.336468946100062620, +-0.336516030407562280, -0.336563113873771860, -0.336610196498574040, -0.336657278281850380, -0.336704359223483520, -0.336751439323356110, -0.336798518581349740, -0.336845596997347060, +-0.336892674571230400, -0.336939751302882450, -0.336986827192184760, -0.337033902239019910, -0.337080976443270400, -0.337128049804818810, -0.337175122323546680, -0.337222193999336730, +-0.337269264832071310, -0.337316334821633200, -0.337363403967903760, -0.337410472270765820, -0.337457539730101730, -0.337504606345794210, -0.337551672117724740, -0.337598737045776090, +-0.337645801129831000, -0.337692864369771030, -0.337739926765478870, -0.337786988316836900, -0.337834049023727880, -0.337881108886033340, -0.337928167903636000, -0.337975226076418220, +-0.338022283404262820, -0.338069339887051350, -0.338116395524666440, -0.338163450316990580, -0.338210504263906530, -0.338257557365295780, -0.338304609621041090, -0.338351661031024930, +-0.338398711595130020, -0.338445761313237950, -0.338492810185231420, -0.338539858210993310, -0.338586905390405150, -0.338633951723349700, -0.338680997209709400, -0.338728041849367000, +-0.338775085642204100, -0.338822128588103460, -0.338869170686947550, -0.338916211938619090, -0.338963252342999680, -0.339010291899972120, -0.339057330609418840, -0.339104368471222720, +-0.339151405485265180, -0.339198441651429150, -0.339245476969597000, -0.339292511439651610, -0.339339545061474510, -0.339386577834948580, -0.339433609759956180, -0.339480640836380130, +-0.339527671064102090, -0.339574700443004920, -0.339621728972971330, -0.339668756653883070, -0.339715783485622870, -0.339762809468073250, -0.339809834601117020, -0.339856858884635790, +-0.339903882318512370, -0.339950904902629300, -0.339997926636869340, -0.340044947521114190, -0.340091967555246620, -0.340138986739149160, -0.340186005072704630, -0.340233022555794740, +-0.340280039188302240, -0.340327054970109620, -0.340374069901099810, -0.340421083981154390, -0.340468097210156310, -0.340515109587988360, -0.340562121114532210, -0.340609131789670780, +-0.340656141613286500, -0.340703150585262290, -0.340750158705479810, -0.340797165973821930, -0.340844172390171120, -0.340891177954410320, -0.340938182666421120, -0.340985186526086450, +-0.341032189533288840, -0.341079191687911230, -0.341126192989835150, -0.341173193438943590, -0.341220193035119080, -0.341267191778244490, -0.341314189668201540, -0.341361186704873030, +-0.341408182888142060, -0.341455178217890180, -0.341502172694000350, -0.341549166316355070, -0.341596159084837310, -0.341643150999328740, -0.341690142059712320, -0.341737132265870490, +-0.341784121617686290, -0.341831110115041360, -0.341878097757818630, -0.341925084545900650, -0.341972070479170390, -0.342019055557509550, -0.342066039780801080, -0.342113023148927500, +-0.342160005661771790, -0.342206987319215620, -0.342253968121142000, -0.342300948067433440, -0.342347927157972960, -0.342394905392642220, -0.342441882771324200, -0.342488859293901940, +-0.342535834960257080, -0.342582809770272670, -0.342629783723831180, -0.342676756820815720, -0.342723729061107870, -0.342770700444590740, -0.342817670971146850, -0.342864640640659190, +-0.342911609453009580, -0.342958577408080890, -0.343005544505755710, -0.343052510745917140, -0.343099476128446880, -0.343146440653227910, -0.343193404320142890, -0.343240367129074740, +-0.343287329079905220, -0.343334290172517430, -0.343381250406794290, -0.343428209782617620, -0.343475168299870460, -0.343522125958435340, -0.343569082758195370, -0.343616038699032230, +-0.343662993780828980, -0.343709948003468270, -0.343756901366833120, -0.343803853870805310, -0.343850805515267810, -0.343897756300103330, -0.343944706225194910, -0.343991655290424250, +-0.344038603495674500, -0.344085550840828200, -0.344132497325768450, -0.344179442950377060, -0.344226387714537060, -0.344273331618131450, -0.344320274661042150, -0.344367216843152190, +-0.344414158164344120, -0.344461098624501140, -0.344508038223504950, -0.344554976961238660, -0.344601914837584960, -0.344648851852426890, -0.344695788005646210, -0.344742723297126130, +-0.344789657726749240, -0.344836591294398590, -0.344883523999956030, -0.344930455843304730, -0.344977386824327210, -0.345024316942906690, -0.345071246198924930, -0.345118174592265130, +-0.345165102122810210, -0.345212028790442160, -0.345258954595044080, -0.345305879536498550, -0.345352803614688790, -0.345399726829496550, -0.345446649180805030, -0.345493570668496900, +-0.345540491292455230, -0.345587411052561910, -0.345634329948700080, -0.345681247980752390, -0.345728165148602050, -0.345775081452130870, -0.345821996891221950, -0.345868911465758100, +-0.345915825175622300, -0.345962738020696600, -0.346009650000864030, -0.346056561116007360, -0.346103471366009660, -0.346150380750752880, -0.346197289270120110, -0.346244196923994610, +-0.346291103712258130, -0.346338009634793940, -0.346384914691484750, -0.346431818882213640, -0.346478722206862540, -0.346525624665314670, -0.346572526257452770, -0.346619426983159950, +-0.346666326842318130, -0.346713225834810510, -0.346760123960519810, -0.346807021219329210, -0.346853917611120670, -0.346900813135777310, -0.346947707793181900, -0.346994601583217710, +-0.347041494505766550, -0.347088386560711670, -0.347135277747936180, -0.347182168067322160, -0.347229057518752660, -0.347275946102110540, -0.347322833817279020, -0.347369720664139960, +-0.347416606642576560, -0.347463491752471710, -0.347510375993708490, -0.347557259366168940, -0.347604141869736260, -0.347651023504293170, -0.347697904269722970, -0.347744784165907590, +-0.347791663192730300, -0.347838541350073800, -0.347885418637821350, -0.347932295055854990, -0.347979170604057860, -0.348026045282313180, -0.348072919090503030, -0.348119792028510570, +-0.348166664096218600, -0.348213535293510460, -0.348260405620268000, -0.348307275076374550, -0.348354143661712910, -0.348401011376166300, -0.348447878219616760, -0.348494744191947540, +-0.348541609293041450, -0.348588473522781770, -0.348635336881050470, -0.348682199367730820, -0.348729060982705670, -0.348775921725858310, -0.348822781597070750, -0.348869640596226220, +-0.348916498723207570, -0.348963355977898070, -0.349010212360179760, -0.349057067869935960, -0.349103922507049910, -0.349150776271403620, -0.349197629162880390, -0.349244481181363090, +-0.349291332326734980, -0.349338182598878170, -0.349385031997675840, -0.349431880523011000, -0.349478728174766830, -0.349525574952825440, -0.349572420857070130, -0.349619265887383730, +-0.349666110043649610, -0.349712953325749810, -0.349759795733567580, -0.349806637266985910, -0.349853477925888000, -0.349900317710156060, -0.349947156619673240, -0.349993994654323020, +-0.350040831813987370, -0.350087668098549630, -0.350134503507892710, -0.350181338041899990, -0.350228171700453450, -0.350275004483436510, -0.350321836390732110, -0.350368667422223450, +-0.350415497577792780, -0.350462326857323310, -0.350509155260698040, -0.350555982787800310, -0.350602809438512190, -0.350649635212717080, -0.350696460110297810, -0.350743284131137870, +-0.350790107275119280, -0.350836929542125420, -0.350883750932039720, -0.350930571444744150, -0.350977391080122160, -0.351024209838056710, -0.351071027718431130, -0.351117844721127560, +-0.351164660846029430, -0.351211476093019610, -0.351258290461981540, -0.351305103952797290, -0.351351916565350310, -0.351398728299523510, -0.351445539155200330, -0.351492349132262900, +-0.351539158230594560, -0.351585966450078340, -0.351632773790597650, -0.351679580252034550, -0.351726385834272510, -0.351773190537194970, -0.351819994360684010, -0.351866797304623060, +-0.351913599368895100, -0.351960400553383620, -0.352007200857970660, -0.352054000282539750, -0.352100798826973820, -0.352147596491156290, -0.352194393274969320, -0.352241189178296440, +-0.352287984201020530, -0.352334778343025120, -0.352381571604192310, -0.352428363984405630, -0.352475155483548020, -0.352521946101502890, -0.352568735838152510, -0.352615524693380310, +-0.352662312667069270, -0.352709099759102860, -0.352755885969363300, -0.352802671297734020, -0.352849455744098480, -0.352896239308338850, -0.352943021990338670, -0.352989803789980960, +-0.353036584707149100, -0.353083364741725360, -0.353130143893593260, -0.353176922162635740, -0.353223699548736390, -0.353270476051777360, -0.353317251671642070, -0.353364026408213740, +-0.353410800261375720, -0.353457573231010290, -0.353504345317000920, -0.353551116519230710, -0.353597886837583090, -0.353644656271940360, -0.353691424822186020, -0.353738192488203480, +-0.353784959269875080, -0.353831725167084280, -0.353878490179714120, -0.353925254307648210, -0.353972017550768680, -0.354018779908959190, -0.354065541382102670, -0.354112301970082750, +-0.354159061672781660, -0.354205820490082920, -0.354252578421869630, -0.354299335468025330, -0.354346091628432220, -0.354392846902973900, -0.354439601291533510, -0.354486354793994480, +-0.354533107410239190, -0.354579859140151110, -0.354626609983613780, -0.354673359940509520, -0.354720109010721870, -0.354766857194133920, -0.354813604490629260, -0.354860350900090220, +-0.354907096422400260, -0.354953841057442540, -0.355000584805100660, -0.355047327665256870, -0.355094069637794830, -0.355140810722597570, -0.355187550919548680, -0.355234290228530540, +-0.355281028649426620, -0.355327766182120200, -0.355374502826494740, -0.355421238582432570, -0.355467973449817400, -0.355514707428532200, -0.355561440518460730, -0.355608172719485190, +-0.355654904031489190, -0.355701634454356430, -0.355748363987969110, -0.355795092632210870, -0.355841820386964940, -0.355888547252114880, -0.355935273227542980, -0.355981998313132930, +-0.356028722508767880, -0.356075445814331480, -0.356122168229705990, -0.356168889754775120, -0.356215610389422010, -0.356262330133530310, -0.356309048986982350, -0.356355766949661760, +-0.356402484021451750, -0.356449200202235970, -0.356495915491896740, -0.356542629890317760, -0.356589343397382570, -0.356636056012973660, -0.356682767736974600, -0.356729478569268620, +-0.356776188509739360, -0.356822897558269180, -0.356869605714741740, -0.356916312979040360, -0.356963019351048570, -0.357009724830648860, -0.357056429417724750, -0.357103133112159630, +-0.357149835913837090, -0.357196537822639550, -0.357243238838450660, -0.357289938961153630, -0.357336638190632220, -0.357383336526768790, -0.357430033969447000, -0.357476730518550560, +-0.357523426173961880, -0.357570120935564620, -0.357616814803242030, -0.357663507776877890, -0.357710199856354490, -0.357756891041555670, -0.357803581332364560, -0.357850270728664930, +-0.357896959230339210, -0.357943646837271090, -0.357990333549343840, -0.358037019366441220, -0.358083704288445600, -0.358130388315240740, -0.358177071446709900, -0.358223753682736790, +-0.358270435023203880, -0.358317115467994880, -0.358363795016993500, -0.358410473670082220, -0.358457151427144740, -0.358503828288064430, -0.358550504252724940, -0.358597179321008760, +-0.358643853492799650, -0.358690526767980910, -0.358737199146436260, -0.358783870628048170, -0.358830541212700470, -0.358877210900276360, -0.358923879690659640, -0.358970547583732870, +-0.359017214579379680, -0.359063880677483460, -0.359110545877927960, -0.359157210180595650, -0.359203873585370310, -0.359250536092135310, -0.359297197700774400, -0.359343858411170060, +-0.359390518223206110, -0.359437177136766260, -0.359483835151733040, -0.359530492267990220, -0.359577148485421220, -0.359623803803909680, -0.359670458223338320, -0.359717111743590720, +-0.359763764364550380, -0.359810416086101040, -0.359857066908125240, -0.359903716830506810, -0.359950365853129060, -0.359997013975875800, -0.360043661198629630, -0.360090307521274240, +-0.360136952943693130, -0.360183597465770060, -0.360230241087387550, -0.360276883808429480, -0.360323525628779560, -0.360370166548320490, -0.360416806566935920, -0.360463445684509390, +-0.360510083900924650, -0.360556721216064250, -0.360603357629812050, -0.360649993142051480, -0.360696627752666370, -0.360743261461539230, -0.360789894268553960, -0.360836526173593960, +-0.360883157176543010, -0.360929787277283810, -0.360976416475700110, -0.361023044771675410, -0.361069672165093450, -0.361116298655836940, -0.361162924243789650, -0.361209548928835500, +-0.361256172710857030, -0.361302795589738160, -0.361349417565362320, -0.361396038637613270, -0.361442658806373770, -0.361489278071527640, -0.361535896432958250, -0.361582513890549570, +-0.361629130444184210, -0.361675746093746030, -0.361722360839118460, -0.361768974680185370, -0.361815587616829470, -0.361862199648934570, -0.361908810776384200, -0.361955420999062250, +-0.362002030316851300, -0.362048638729635220, -0.362095246237297610, -0.362141852839722280, -0.362188458536791940, -0.362235063328390390, -0.362281667214401640, -0.362328270194708260, +-0.362374872269194240, -0.362421473437743060, -0.362468073700238590, -0.362514673056563490, -0.362561271506601780, -0.362607869050236840, -0.362654465687352660, -0.362701061417831870, +-0.362747656241558470, -0.362794250158415880, -0.362840843168288130, -0.362887435271057820, -0.362934026466608940, -0.362980616754824960, -0.363027206135589920, -0.363073794608786420, +-0.363120382174298430, -0.363166968832009880, -0.363213554581803490, -0.363260139423563280, -0.363306723357172680, -0.363353306382515670, -0.363399888499474970, -0.363446469707934590, +-0.363493050007777980, -0.363539629398889230, -0.363586207881150920, -0.363632785454447160, -0.363679362118661420, -0.363725937873677680, -0.363772512719378660, -0.363819086655648380, +-0.363865659682370390, -0.363912231799428660, -0.363958803006705910, -0.364005373304086170, -0.364051942691453410, -0.364098511168690410, -0.364145078735681080, -0.364191645392309080, +-0.364238211138458390, -0.364284775974011770, -0.364331339898853130, -0.364377902912866200, -0.364424465015934950, -0.364471026207942080, -0.364517586488771690, -0.364564145858307320, +-0.364610704316433000, -0.364657261863031490, -0.364703818497986830, -0.364750374221182620, -0.364796929032502880, -0.364843482931830390, -0.364890035919049230, -0.364936587994042990, +-0.364983139156695670, -0.365029689406890070, -0.365076238744510280, -0.365122787169440300, -0.365169334681562930, -0.365215881280762210, -0.365262426966921790, -0.365308971739925770, +-0.365355515599656840, -0.365402058545999160, -0.365448600578836320, -0.365495141698052360, -0.365541681903530200, -0.365588221195153770, -0.365634759572806830, -0.365681297036373420, +-0.365727833585736290, -0.365774369220779660, -0.365820903941387050, -0.365867437747442570, -0.365913970638829130, -0.365960502615430780, -0.366007033677131550, -0.366053563823814320, +-0.366100093055363170, -0.366146621371661820, -0.366193148772594350, -0.366239675258043570, -0.366286200827893590, -0.366332725482028110, -0.366379249220331220, -0.366425772042685840, +-0.366472293948975960, -0.366518814939085390, -0.366565335012898170, -0.366611854170297240, -0.366658372411166670, -0.366704889735390120, -0.366751406142851790, -0.366797921633434550, +-0.366844436207022510, -0.366890949863499740, -0.366937462602749230, -0.366983974424655020, -0.367030485329100930, -0.367076995315971040, -0.367123504385148180, -0.367170012536516600, +-0.367216519769960000, -0.367263026085362490, -0.367309531482607030, -0.367356035961577730, -0.367402539522158340, -0.367449042164233020, -0.367495543887684680, -0.367542044692397480, +-0.367588544578255130, -0.367635043545141870, -0.367681541592940590, -0.367728038721535420, -0.367774534930810640, -0.367821030220649050, -0.367867524590934910, -0.367914018041551940, +-0.367960510572384330, -0.368007002183315060, -0.368053492874228280, -0.368099982645007760, -0.368146471495537700, -0.368192959425701020, -0.368239446435381980, -0.368285932524464290, +-0.368332417692832200, -0.368378901940368650, -0.368425385266957890, -0.368471867672483630, -0.368518349156830070, -0.368564829719880300, -0.368611309361518420, -0.368657788081628250, +-0.368704265880094030, -0.368750742756798760, -0.368797218711626630, -0.368843693744461850, -0.368890167855187410, -0.368936641043687560, -0.368983113309846120, -0.369029584653547290, +-0.369076055074674110, -0.369122524573110790, -0.369168993148741190, -0.369215460801449460, -0.369261927531118690, -0.369308393337633100, -0.369354858220876490, -0.369401322180733180, +-0.369447785217086160, -0.369494247329819670, -0.369540708518817600, -0.369587168783964140, -0.369633628125142330, -0.369680086542236440, -0.369726544035130780, -0.369773000603708320, +-0.369819456247853400, -0.369865910967449810, -0.369912364762381870, -0.369958817632532580, -0.370005269577786230, -0.370051720598026770, -0.370098170693138380, -0.370144619863004180, +-0.370191068107508400, -0.370237515426534940, -0.370283961819968140, -0.370330407287691010, -0.370376851829587850, -0.370423295445542530, -0.370469738135439430, -0.370516179899161580, +-0.370562620736593300, -0.370609060647618840, -0.370655499632121300, -0.370701937689985050, -0.370748374821093910, -0.370794811025332290, -0.370841246302583190, -0.370887680652731030, +-0.370934114075659630, -0.370980546571253400, -0.371026978139395340, -0.371073408779969860, -0.371119838492860840, -0.371166267277952660, -0.371212695135128390, -0.371259122064272360, +-0.371305548065268550, -0.371351973138001280, -0.371398397282353630, -0.371444820498210040, -0.371491242785454370, -0.371537664143970990, -0.371584084573643060, -0.371630504074354940, +-0.371676922645990950, -0.371723340288434230, -0.371769757001569170, -0.371816172785279730, -0.371862587639450290, -0.371909001563963890, -0.371955414558705070, -0.372001826623557690, +-0.372048237758406120, -0.372094647963133570, -0.372141057237624420, -0.372187465581762580, -0.372233872995432540, -0.372280279478517380, -0.372326685030901490, -0.372373089652468960, +-0.372419493343104040, -0.372465896102690040, -0.372512297931111240, -0.372558698828252150, -0.372605098793995890, -0.372651497828226870, -0.372697895930829140, -0.372744293101687050, +-0.372790689340683820, -0.372837084647703880, -0.372883479022631250, -0.372929872465350310, -0.372976264975744260, -0.373022656553697540, -0.373069047199094230, -0.373115436911818640, +-0.373161825691754100, -0.373208213538785030, -0.373254600452795350, -0.373300986433669600, -0.373347371481290990, -0.373393755595543940, -0.373440138776312940, -0.373486521023481180, +-0.373532902336933090, -0.373579282716552770, -0.373625662162224650, -0.373672040673831920, -0.373718418251259120, -0.373764794894390300, -0.373811170603109870, -0.373857545377301090, +-0.373903919216848510, -0.373950292121636050, -0.373996664091548300, -0.374043035126468530, -0.374089405226281150, -0.374135774390870200, -0.374182142620120280, -0.374228509913914600, +-0.374274876272137620, -0.374321241694673850, -0.374367606181406580, -0.374413969732220300, -0.374460332346999100, -0.374506694025627470, -0.374553054767988670, -0.374599414573967280, +-0.374645773443447290, -0.374692131376313350, -0.374738488372448610, -0.374784844431737710, -0.374831199554064630, -0.374877553739314030, -0.374923906987369100, -0.374970259298114390, +-0.375016610671434050, -0.375062961107212600, -0.375109310605333370, -0.375155659165680780, -0.375202006788139090, -0.375248353472592830, -0.375294699218925220, -0.375341044027020900, +-0.375387387896764350, -0.375433730828038940, -0.375480072820729150, -0.375526413874719240, -0.375572753989893700, -0.375619093166135840, -0.375665431403330250, -0.375711768701361080, +-0.375758105060112920, -0.375804440479469090, -0.375850774959314130, -0.375897108499532230, -0.375943441100007990, -0.375989772760624790, -0.376036103481267090, -0.376082433261819120, +-0.376128762102165500, -0.376175090002189570, -0.376221416961775910, -0.376267742980809120, -0.376314068059172560, -0.376360392196750830, -0.376406715393428130, -0.376453037649089050, +-0.376499358963616970, -0.376545679336896480, -0.376591998768811780, -0.376638317259247510, -0.376684634808087060, -0.376730951415214950, -0.376777267080515510, -0.376823581803873320, +-0.376869895585171750, -0.376916208424295460, -0.376962520321128650, -0.377008831275555960, -0.377055141287460760, -0.377101450356727710, -0.377147758483241390, -0.377194065666885350, +-0.377240371907544110, -0.377286677205101950, -0.377332981559443500, -0.377379284970452140, -0.377425587438012630, -0.377471888962009120, -0.377518189542326350, -0.377564489178847660, +-0.377610787871457740, -0.377657085620040860, -0.377703382424481650, -0.377749678284663600, -0.377795973200471370, -0.377842267171789150, -0.377888560198501760, -0.377934852280492510, +-0.377981143417646100, -0.378027433609846860, -0.378073722856979430, -0.378120011158927290, -0.378166298515575150, -0.378212584926807650, -0.378258870392508330, -0.378305154912561780, +-0.378351438486852320, -0.378397721115264710, -0.378444002797682370, -0.378490283533990060, -0.378536563324072040, -0.378582842167812960, -0.378629120065096410, -0.378675397015807050, +-0.378721673019829230, -0.378767948077047610, -0.378814222187345670, -0.378860495350608230, -0.378906767566719540, -0.378953038835564360, -0.378999309157026120, -0.379045578530989640, +-0.379091846957339660, -0.379138114435959570, -0.379184380966734240, -0.379230646549547970, -0.379276911184285470, -0.379323174870830280, -0.379369437609067160, -0.379415699398880480, +-0.379461960240154940, -0.379508220132774080, -0.379554479076622650, -0.379600737071585040, -0.379646994117546040, -0.379693250214389100, -0.379739505361999020, -0.379785759560260230, +-0.379832012809057430, -0.379878265108274160, -0.379924516457795240, -0.379970766857505470, -0.380017016307288350, -0.380063264807028680, -0.380109512356610830, -0.380155758955919630, +-0.380202004604838660, -0.380248249303252630, -0.380294493051046010, -0.380340735848103520, -0.380386977694308850, -0.380433218589546650, -0.380479458533701460, -0.380525697526658050, +-0.380571935568299930, -0.380618172658512000, -0.380664408797178670, -0.380710643984184690, -0.380756878219413730, -0.380803111502750540, -0.380849343834079980, -0.380895575213285650, +-0.380941805640252370, -0.380988035114864620, -0.381034263637007150, -0.381080491206563620, -0.381126717823418890, -0.381172943487457340, -0.381219168198563830, -0.381265391956622010, +-0.381311614761516700, -0.381357836613132380, -0.381404057511353870, -0.381450277456064800, -0.381496496447150000, -0.381542714484494010, -0.381588931567981630, -0.381635147697496510, +-0.381681362872923540, -0.381727577094147120, -0.381773790361052190, -0.381820002673522340, -0.381866214031442550, -0.381912424434697580, -0.381958633883171190, -0.382004842376748140, +-0.382051049915313080, -0.382097256498750760, -0.382143462126944830, -0.382189666799780340, -0.382235870517141640, -0.382282073278913670, -0.382328275084980130, -0.382374475935225890, +-0.382420675829535430, -0.382466874767793730, -0.382513072749884390, -0.382559269775692430, -0.382605465845102240, -0.382651660957998850, -0.382697855114265850, -0.382744048313788220, +-0.382790240556450890, -0.382836431842137560, -0.382882622170733160, -0.382928811542122160, -0.382974999956189550, -0.383021187412819040, -0.383067373911895600, -0.383113559453303660, +-0.383159744036928260, -0.383205927662653100, -0.383252110330363160, -0.383298292039942870, -0.383344472791277310, -0.383390652584250150, -0.383436831418746290, -0.383483009294650460, +-0.383529186211847450, -0.383575362170221090, -0.383621537169656300, -0.383667711210038060, -0.383713884291250200, -0.383760056413177560, -0.383806227575704820, -0.383852397778716940, +-0.383898567022097630, -0.383944735305731920, -0.383990902629504300, -0.384037068993299920, -0.384083234397002430, -0.384129398840496850, -0.384175562323667790, -0.384221724846400210, +-0.384267886408577900, -0.384314047010085870, -0.384360206650808780, -0.384406365330631550, -0.384452523049437940, -0.384498679807113110, -0.384544835603541520, -0.384590990438608280, +-0.384637144312197140, -0.384683297224193200, -0.384729449174481370, -0.384775600162945490, -0.384821750189470620, -0.384867899253941440, -0.384914047356242850, -0.384960194496258730, +-0.385006340673874180, -0.385052485888973730, -0.385098630141442520, -0.385144773431164270, -0.385190915758024110, -0.385237057121906650, -0.385283197522697020, -0.385329336960278930, +-0.385375475434537480, -0.385421612945357370, -0.385467749492623630, -0.385513885076220140, -0.385560019696031870, -0.385606153351944040, -0.385652286043840330, -0.385698417771605960, +-0.385744548535125580, -0.385790678334284150, -0.385836807168965680, -0.385882935039055190, -0.385929061944437320, -0.385975187884997240, -0.386021312860618750, -0.386067436871187000, +-0.386113559916586690, -0.386159681996702860, -0.386205803111419390, -0.386251923260621470, -0.386298042444193690, -0.386344160662021210, -0.386390277913987950, -0.386436394199978990, +-0.386482509519879450, -0.386528623873573230, -0.386574737260945430, -0.386620849681880820, -0.386666961136264480, -0.386713071623980330, -0.386759181144913480, -0.386805289698948730, +-0.386851397285971120, -0.386897503905864640, -0.386943609558514370, -0.386989714243805070, -0.387035817961621900, -0.387081920711848770, -0.387128022494370890, -0.387174123309072920, +-0.387220223155840040, -0.387266322034556190, -0.387312419945106570, -0.387358516887376270, -0.387404612861249280, -0.387450707866610790, -0.387496801903345510, -0.387542894971338590, +-0.387588987070474070, -0.387635078200637080, -0.387681168361712400, -0.387727257553585170, -0.387773345776139420, -0.387819433029260310, -0.387865519312832640, -0.387911604626741510, +-0.387957688970871020, -0.388003772345106300, -0.388049854749332120, -0.388095936183433740, -0.388142016647295090, -0.388188096140801410, -0.388234174663837470, -0.388280252216288540, +-0.388326328798038580, -0.388372404408972750, -0.388418479048976310, -0.388464552717933290, -0.388510625415728890, -0.388556697142247940, -0.388602767897375630, -0.388648837680996010, +-0.388694906492994320, -0.388740974333255330, -0.388787041201664300, -0.388833107098105260, -0.388879172022463470, -0.388925235974623750, -0.388971298954471360, -0.389017360961890320, +-0.389063421996765860, -0.389109482058982830, -0.389155541148426540, -0.389201599264980940, -0.389247656408531370, -0.389293712578963060, -0.389339767776160080, -0.389385822000007650, +-0.389431875250390690, -0.389477927527194460, -0.389523978830302990, -0.389570029159601540, -0.389616078514975040, -0.389662126896308800, -0.389708174303486750, -0.389754220736394320, +-0.389800266194916370, -0.389846310678938100, -0.389892354188343670, -0.389938396723018330, -0.389984438282847010, -0.390030478867715020, -0.390076518477506410, -0.390122557112106530, +-0.390168594771400650, -0.390214631455272850, -0.390260667163608520, -0.390306701896292460, -0.390352735653210100, -0.390398768434245480, -0.390444800239283960, -0.390490831068210420, +-0.390536860920910170, -0.390582889797267410, -0.390628917697167450, -0.390674944620495120, -0.390720970567135890, -0.390766995536973800, -0.390813019529894280, -0.390859042545782130, +-0.390905064584522840, -0.390951085646000450, -0.390997105730100380, -0.391043124836707500, -0.391089142965707240, -0.391135160116983680, -0.391181176290422260, -0.391227191485908340, +-0.391273205703325970, -0.391319218942560610, -0.391365231203497200, -0.391411242486021100, -0.391457252790016530, -0.391503262115368790, -0.391549270461962920, -0.391595277829684290, +-0.391641284218417040, -0.391687289628046550, -0.391733294058457910, -0.391779297509536380, -0.391825299981166220, -0.391871301473232790, -0.391917301985621140, -0.391963301518216620, +-0.392009300070903450, -0.392055297643567060, -0.392101294236092750, -0.392147289848364890, -0.392193284480268740, -0.392239278131689410, -0.392285270802512300, -0.392331262492621570, +-0.392377253201902700, -0.392423242930240720, -0.392469231677521010, -0.392515219443627830, -0.392561206228446590, -0.392607192031862340, -0.392653176853760500, -0.392699160694025330, +-0.392745143552542250, -0.392791125429196360, -0.392837106323873030, -0.392883086236456510, -0.392929065166832290, -0.392975043114885790, -0.393021020080501330, -0.393066996063564270, +-0.393112971063959700, -0.393158945081573170, -0.393204918116288830, -0.393250890167992200, -0.393296861236568370, -0.393342831321902790, -0.393388800423879690, -0.393434768542384630, +-0.393480735677302630, -0.393526701828519180, -0.393572666995918590, -0.393618631179386340, -0.393664594378807520, -0.393710556594067620, -0.393756517825050890, -0.393802478071642870, +-0.393848437333729100, -0.393894395611193770, -0.393940352903922490, -0.393986309211800330, -0.394032264534712800, -0.394078218872544180, -0.394124172225180040, -0.394170124592505440, +-0.394216075974406000, -0.394262026370765910, -0.394307975781470750, -0.394353924206405690, -0.394399871645456200, -0.394445818098506600, -0.394491763565442520, -0.394537708046148960, +-0.394583651540511560, -0.394629594048414630, -0.394675535569743720, -0.394721476104384020, -0.394767415652220950, -0.394813354213138960, -0.394859291787023610, -0.394905228373760410, +-0.394951163973233770, -0.394997098585329160, -0.395043032209931870, -0.395088964846927400, -0.395134896496200040, -0.395180827157635530, -0.395226756831118910, -0.395272685516535770, +-0.395318613213770540, -0.395364539922708810, -0.395410465643235680, -0.395456390375236830, -0.395502314118596600, -0.395548236873200560, -0.395594158638933930, -0.395640079415682300, +-0.395685999203330090, -0.395731918001762880, -0.395777835810866290, -0.395823752630524660, -0.395869668460623660, -0.395915583301048530, -0.395961497151684830, -0.396007410012416960, +-0.396053321883130580, -0.396099232763710900, -0.396145142654043550, -0.396191051554012910, -0.396236959463504680, -0.396282866382404010, -0.396328772310596600, -0.396374677247966880, +-0.396420581194400430, -0.396466484149782530, -0.396512386113998860, -0.396558287086933750, -0.396604187068473000, -0.396650086058502160, -0.396695984056905650, -0.396741881063569220, +-0.396787777078378090, -0.396833672101217950, -0.396879566131973170, -0.396925459170529520, -0.396971351216772240, -0.397017242270586930, -0.397063132331858140, -0.397109021400471500, +-0.397154909476312320, -0.397200796559266270, -0.397246682649217810, -0.397292567746052700, -0.397338451849656100, -0.397384334959913820, -0.397430217076710280, -0.397476098199931180, +-0.397521978329461840, -0.397567857465188020, -0.397613735606994090, -0.397659612754765800, -0.397705488908388970, -0.397751364067747910, -0.397797238232728500, -0.397843111403215990, +-0.397888983579096130, -0.397934854760253360, -0.397980724946573490, -0.398026594137941780, -0.398072462334244040, -0.398118329535364690, -0.398164195741189500, -0.398210060951603830, +-0.398255925166493440, -0.398301788385742820, -0.398347650609237770, -0.398393511836863560, -0.398439372068505940, -0.398485231304049500, -0.398531089543380010, -0.398576946786383220, +-0.398622803032943620, -0.398668658282947010, -0.398714512536278760, -0.398760365792824640, -0.398806218052469190, -0.398852069315098200, -0.398897919580597060, -0.398943768848851520, +-0.398989617119746120, -0.399035464393166730, -0.399081310668998600, -0.399127155947127670, -0.399173000227438400, -0.399218843509816680, -0.399264685794147810, -0.399310527080317670, +-0.399356367368210790, -0.399402206657712980, -0.399448044948710060, -0.399493882241086620, -0.399539718534728470, -0.399585553829520990, -0.399631388125350100, -0.399677221422100330, +-0.399723053719657440, -0.399768885017906970, -0.399814715316734680, -0.399860544616025220, -0.399906372915664390, -0.399952200215537620, -0.399998026515530740, -0.400043851815528370, +-0.400089676115416400, -0.400135499415080250, -0.400181321714405790, -0.400227143013277550, -0.400272963311581460, -0.400318782609203390, -0.400364600906027990, -0.400410418201941070, +-0.400456234496828050, -0.400502049790574910, -0.400547864083066200, -0.400593677374187880, -0.400639489663825340, -0.400685300951864440, -0.400731111238189940, -0.400776920522687650, +-0.400822728805243060, -0.400868536085742020, -0.400914342364069250, -0.400960147640110620, -0.401005951913751660, -0.401051755184878180, -0.401097557453374940, -0.401143358719127820, +-0.401189158982022230, -0.401234958241944220, -0.401280756498778370, -0.401326553752410660, -0.401372350002726970, -0.401418145249611950, -0.401463939492951620, -0.401509732732631410, +-0.401555524968537300, -0.401601316200553950, -0.401647106428567320, -0.401692895652462910, -0.401738683872126690, -0.401784471087443360, -0.401830257298298800, -0.401876042504578650, +-0.401921826706168770, -0.401967609902953940, -0.402013392094820070, -0.402059173281652750, -0.402104953463337860, -0.402150732639760200, -0.402196510810805710, -0.402242287976360360, +-0.402288064136308850, -0.402333839290537230, -0.402379613438930970, -0.402425386581376110, -0.402471158717757350, -0.402516929847960720, -0.402562699971871770, -0.402608469089376420, +-0.402654237200359530, -0.402700004304707090, -0.402745770402304580, -0.402791535493038090, -0.402837299576792320, -0.402883062653453310, -0.402928824722906640, -0.402974585785038310, +-0.403020345839733120, -0.403066104886877110, -0.403111862926356200, -0.403157619958055210, -0.403203375981860180, -0.403249130997656750, -0.403294885005330840, -0.403340638004767330, +-0.403386389995852250, -0.403432140978471190, -0.403477890952510190, -0.403523639917854000, -0.403569387874388790, -0.403615134822000070, -0.403660880760573880, -0.403706625689995160, +-0.403752369610149820, -0.403798112520923570, -0.403843854422202440, -0.403889595313871310, -0.403935335195816150, -0.403981074067922660, -0.404026811930076890, -0.404072548782163700, +-0.404118284624069120, -0.404164019455679260, -0.404209753276878910, -0.404255486087554180, -0.404301217887590770, -0.404346948676874710, -0.404392678455290870, -0.404438407222725280, +-0.404484134979063710, -0.404529861724192250, -0.404575587457995710, -0.404621312180360180, -0.404667035891171370, -0.404712758590315410, -0.404758480277677080, -0.404804200953142620, +-0.404849920616597640, -0.404895639267928260, -0.404941356907019380, -0.404987073533757070, -0.405032789148027540, -0.405078503749715550, -0.405124217338707400, -0.405169929914888650, +-0.405215641478145480, -0.405261352028362830, -0.405307061565426780, -0.405352770089223050, -0.405398477599637820, -0.405444184096556030, -0.405489889579863760, -0.405535594049446720, +-0.405581297505191170, -0.405626999946981930, -0.405672701374705180, -0.405718401788246700, -0.405764101187492620, -0.405809799572327880, -0.405855496942638620, -0.405901193298311090, +-0.405946888639230120, -0.405992582965281900, -0.406038276276352250, -0.406083968572327310, -0.406129659853092070, -0.406175350118532670, -0.406221039368534880, -0.406266727602984930, +-0.406312414821767720, -0.406358101024769490, -0.406403786211876010, -0.406449470382973470, -0.406495153537946850, -0.406540835676682310, -0.406586516799065710, -0.406632196904983260, +-0.406677875994319870, -0.406723554066961760, -0.406769231122795230, -0.406814907161705210, -0.406860582183577900, -0.406906256188299120, -0.406951929175755120, -0.406997601145830890, +-0.407043272098412680, -0.407088942033386250, -0.407134610950637910, -0.407180278850052650, -0.407225945731516660, -0.407271611594915820, -0.407317276440136320, -0.407362940267063270, +-0.407408603075582850, -0.407454264865580900, -0.407499925636943710, -0.407545585389556320, -0.407591244123304940, -0.407636901838075490, -0.407682558533754180, -0.407728214210226040, +-0.407773868867377380, -0.407819522505094460, -0.407865175123262310, -0.407910826721767260, -0.407956477300495110, -0.408002126859332180, -0.408047775398163500, -0.408093422916875390, +-0.408139069415353770, -0.408184714893484850, -0.408230359351153760, -0.408276002788246720, -0.408321645204649750, -0.408367286600249010, -0.408412926974929650, -0.408458566328578020, +-0.408504204661079950, -0.408549841972321750, -0.408595478262188560, -0.408641113530566650, -0.408686747777342370, -0.408732381002400840, -0.408778013205628340, -0.408823644386910820, +-0.408869274546134590, -0.408914903683184780, -0.408960531797947720, -0.409006158890309280, -0.409051784960155870, -0.409097410007372650, -0.409143034031845820, -0.409188657033461470, +-0.409234279012105850, -0.409279899967664120, -0.409325519900022640, -0.409371138809067390, -0.409416756694684690, -0.409462373556759680, -0.409507989395178740, -0.409553604209828230, +-0.409599218000593290, -0.409644830767360300, -0.409690442510015300, -0.409736053228444530, -0.409781662922533260, -0.409827271592167810, -0.409872879237234200, -0.409918485857618750, +-0.409964091453206720, -0.410009696023884480, -0.410055299569538010, -0.410100902090053620, -0.410146503585316620, -0.410192104055213390, -0.410237703499629850, -0.410283301918452470, +-0.410328899311566410, -0.410374495678858140, -0.410420091020213650, -0.410465685335519300, -0.410511278624660300, -0.410556870887523180, -0.410602462123994210, -0.410648052333958740, +-0.410693641517303090, -0.410739229673913410, -0.410784816803676010, -0.410830402906476160, -0.410875987982200320, -0.410921572030734480, -0.410967155051965130, -0.411012737045777510, +-0.411058318012058000, -0.411103897950692740, -0.411149476861568160, -0.411195054744569410, -0.411240631599583070, -0.411286207426495130, -0.411331782225192120, -0.411377355995559250, +-0.411422928737482930, -0.411468500450849710, -0.411514071135544890, -0.411559640791454850, -0.411605209418465680, -0.411650777016463910, -0.411696343585334800, -0.411741909124964830, +-0.411787473635240100, -0.411833037116047070, -0.411878599567271080, -0.411924160988798580, -0.411969721380515690, -0.412015280742308860, -0.412060839074063430, -0.412106396375665930, +-0.412151952647002380, -0.412197507887959390, -0.412243062098422260, -0.412288615278277430, -0.412334167427411470, -0.412379718545709710, -0.412425268633058670, -0.412470817689344400, +-0.412516365714453550, -0.412561912708271360, -0.412607458670684380, -0.412653003601578750, -0.412698547500841010, -0.412744090368356520, -0.412789632204011770, -0.412835173007693010, +-0.412880712779286670, -0.412926251518678120, -0.412971789225753950, -0.413017325900400360, -0.413062861542503820, -0.413108396151949720, -0.413153929728624640, -0.413199462272415160, +-0.413244993783206560, -0.413290524260885530, -0.413336053705338210, -0.413381582116451100, -0.413427109494109660, -0.413472635838200430, -0.413518161148609620, -0.413563685425223810, +-0.413609208667928390, -0.413654730876609980, -0.413700252051154680, -0.413745772191449200, -0.413791291297378850, -0.413836809368830330, -0.413882326405689730, -0.413927842407843750, +-0.413973357375177710, -0.414018871307578310, -0.414064384204931750, -0.414109896067124620, -0.414155406894042340, -0.414200916685571520, -0.414246425441598840, -0.414291933162009740, +-0.414337439846690750, -0.414382945495528180, -0.414428450108408620, -0.414473953685217560, -0.414519456225841580, -0.414564957730166990, -0.414610458198080400, -0.414655957629467280, +-0.414701456024214270, -0.414746953382207570, -0.414792449703333950, -0.414837944987478780, -0.414883439234528750, -0.414928932444370120, -0.414974424616889550, -0.415019915751972500, +-0.415065405849505690, -0.415110894909375750, -0.415156382931468230, -0.415201869915669710, -0.415247355861866510, -0.415292840769945330, -0.415338324639791590, -0.415383807471292110, +-0.415429289264333090, -0.415474770018801230, -0.415520249734582070, -0.415565728411562310, -0.415611206049628200, -0.415656682648666450, -0.415702158208562660, -0.415747632729203400, +-0.415793106210475110, -0.415838578652264420, -0.415884050054456890, -0.415929520416939260, -0.415974989739598230, -0.416020458022319290, -0.416065925264989200, -0.416111391467494320, +-0.416156856629721410, -0.416202320751555890, -0.416247783832884580, -0.416293245873593840, -0.416338706873570330, -0.416384166832699740, -0.416429625750868670, -0.416475083627963540, +-0.416520540463871100, -0.416565996258476900, -0.416611451011667740, -0.416656904723329950, -0.416702357393350320, -0.416747809021614350, -0.416793259608008840, -0.416838709152420220, +-0.416884157654735240, -0.416929605114839450, -0.416975051532619660, -0.417020496907962610, -0.417065941240753910, -0.417111384530880420, -0.417156826778228410, -0.417202267982684780, +-0.417247708144135030, -0.417293147262466020, -0.417338585337564180, -0.417384022369316270, -0.417429458357607860, -0.417474893302325840, -0.417520327203356580, -0.417565760060586880, +-0.417611191873902440, -0.417656622643189980, -0.417702052368335960, -0.417747481049227210, -0.417792908685749360, -0.417838335277789240, -0.417883760825233710, -0.417929185327968300, +-0.417974608785880000, -0.418020031198855170, -0.418065452566780630, -0.418110872889542070, -0.418156292167026320, -0.418201710399119910, -0.418247127585709530, -0.418292543726680950, +-0.418337958821921040, -0.418383372871316220, -0.418428785874753410, -0.418474197832118200, -0.418519608743297470, -0.418565018608177740, -0.418610427426645890, -0.418655835198587510, +-0.418701241923889580, -0.418746647602438960, -0.418792052234121300, -0.418837455818823530, -0.418882858356432130, -0.418928259846833960, -0.418973660289914730, -0.419019059685561360, +-0.419064458033660330, -0.419109855334098560, -0.419155251586761760, -0.419200646791536850, -0.419246040948310310, -0.419291434056969060, -0.419336826117398810, -0.419382217129486530, +-0.419427607093118660, -0.419472996008182220, -0.419518383874562860, -0.419563770692147560, -0.419609156460822810, -0.419654541180475570, -0.419699924850991610, -0.419745307472257800, +-0.419790689044161170, -0.419836069566587370, -0.419881449039423430, -0.419926827462555830, -0.419972204835871610, -0.420017581159256470, -0.420062956432597330, -0.420108330655780850, +-0.420153703828693940, -0.420199075951222300, -0.420244447023253030, -0.420289817044672660, -0.420335186015368120, -0.420380553935225220, -0.420425920804130940, -0.420471286621971860, +-0.420516651388634920, -0.420562015104005980, -0.420607377767972020, -0.420652739380420030, -0.420698099941235750, -0.420743459450306220, -0.420788817907518100, -0.420834175312758300, +-0.420879531665912630, -0.420924886966868190, -0.420970241215511460, -0.421015594411729590, -0.421060946555408320, -0.421106297646434700, -0.421151647684695260, -0.421196996670077210, +-0.421242344602466180, -0.421287691481749330, -0.421333037307813240, -0.421378382080544960, -0.421423725799830340, -0.421469068465556370, -0.421514410077610150, -0.421559750635877530, +-0.421605090140245500, -0.421650428590600760, -0.421695765986830340, -0.421741102328820060, -0.421786437616457070, -0.421831771849628000, -0.421877105028219900, -0.421922437152118630, +-0.421967768221211240, -0.422013098235384470, -0.422058427194525350, -0.422103755098519720, -0.422149081947254760, -0.422194407740617060, -0.422239732478493720, -0.422285056160770720, +-0.422330378787335040, -0.422375700358073760, -0.422421020872872920, -0.422466340331619450, -0.422511658734200160, -0.422556976080502130, -0.422602292370411300, -0.422647607603814700, +-0.422692921780599080, -0.422738234900651540, -0.422783546963858000, -0.422828857970105660, -0.422874167919281120, -0.422919476811271570, -0.422964784645962930, -0.423010091423242360, +-0.423055397142996560, -0.423100701805112610, -0.423146005409476560, -0.423191307955975480, -0.423236609444496090, -0.423281909874925640, -0.423327209247150000, -0.423372507561056320, +-0.423417804816531800, -0.423463101013462300, -0.423508396151735080, -0.423553690231236900, -0.423598983251854910, -0.423644275213475030, -0.423689566115984460, -0.423734855959269960, +-0.423780144743218730, -0.423825432467716760, -0.423870719132651170, -0.423916004737908800, -0.423961289283376840, -0.424006572768941270, -0.424051855194489240, -0.424097136559907550, +-0.424142416865083470, -0.424187696109902870, -0.424232974294253110, -0.424278251418021280, -0.424323527481093420, -0.424368802483356730, -0.424414076424698080, -0.424459349305004620, +-0.424504621124162370, -0.424549891882058550, -0.424595161578580020, -0.424640430213614030, -0.424685697787046510, -0.424730964298764780, -0.424776229748655590, -0.424821494136606250, +-0.424866757462502800, -0.424912019726232440, -0.424957280927682040, -0.425002541066738790, -0.425047800143288860, -0.425093058157219370, -0.425138315108417650, -0.425183570996769790, +-0.425228825822162930, -0.425274079584484040, -0.425319332283620400, -0.425364583919457970, -0.425409834491884080, -0.425455084000785630, -0.425500332446049840, -0.425545579827562860, +-0.425590826145211880, -0.425636071398883880, -0.425681315588466060, -0.425726558713844570, -0.425771800774906670, -0.425817041771539280, -0.425862281703629720, -0.425907520571064010, +-0.425952758373729530, -0.425997995111513150, -0.426043230784302170, -0.426088465391982700, -0.426133698934442080, -0.426178931411567650, -0.426224162823245430, -0.426269393169362850, +-0.426314622449806780, -0.426359850664464520, -0.426405077813222230, -0.426450303895967280, -0.426495528912586570, -0.426540752862967440, -0.426585975746996030, -0.426631197564559640, +-0.426676418315545310, -0.426721637999840310, -0.426766856617330830, -0.426812074167904180, -0.426857290651447340, -0.426902506067847690, -0.426947720416991360, -0.426992933698765790, +-0.427038145913058220, -0.427083357059754920, -0.427128567138743200, -0.427173776149910090, -0.427218984093142910, -0.427264190968327910, -0.427309396775352400, -0.427354601514103370, +-0.427399805184468300, -0.427445007786333320, -0.427490209319585760, -0.427535409784112700, -0.427580609179801560, -0.427625807506538450, -0.427671004764210830, -0.427716200952705680, +-0.427761396071910490, -0.427806590121711350, -0.427851783101995730, -0.427896975012651120, -0.427942165853563590, -0.427987355624620700, -0.428032544325709420, -0.428077731956717170, +-0.428122918517530150, -0.428168104008035900, -0.428213288428121340, -0.428258471777674010, -0.428303654056580050, -0.428348835264727000, -0.428394015402001840, -0.428439194468292040, +-0.428484372463483810, -0.428529549387464740, -0.428574725240121750, -0.428619900021342310, -0.428665073731012760, -0.428710246369020550, -0.428755417935253070, -0.428800588429596670, +-0.428845757851938790, -0.428890926202166570, -0.428936093480167370, -0.428981259685827570, -0.429026424819034580, -0.429071588879675560, -0.429116751867637980, -0.429161913782808100, +-0.429207074625073460, -0.429252234394321090, -0.429297393090438570, -0.429342550713312180, -0.429387707262829380, -0.429432862738877320, -0.429478017141343480, -0.429523170470114240, +-0.429568322725077060, -0.429613473906119090, -0.429658624013127820, -0.429703773045989560, -0.429748921004591890, -0.429794067888822350, -0.429839213698567200, -0.429884358433714030, +-0.429929502094149930, -0.429974644679762540, -0.430019786190438070, -0.430064926626064210, -0.430110065986527960, -0.430155204271717000, -0.430200341481517590, -0.430245477615817380, +-0.430290612674503410, -0.430335746657463380, -0.430380879564583540, -0.430426011395751480, -0.430471142150854410, -0.430516271829779920, -0.430561400432414310, -0.430606527958645240, +-0.430651654408360170, -0.430696779781445660, -0.430741904077789120, -0.430787027297277860, -0.430832149439799420, -0.430877270505240220, -0.430922390493487850, -0.430967509404429520, +-0.431012627237952750, -0.431057743993944090, -0.431102859672291010, -0.431147974272880820, -0.431193087795601060, -0.431238200240338210, -0.431283311606979860, -0.431328421895413210, +-0.431373531105525900, -0.431418639237204420, -0.431463746290336290, -0.431508852264809170, -0.431553957160509590, -0.431599060977325030, -0.431644163715142910, -0.431689265373850720, +-0.431734365953334980, -0.431779465453483340, -0.431824563874183050, -0.431869661215321720, -0.431914757476785820, -0.431959852658463090, -0.432004946760240700, -0.432050039782006290, +-0.432095131723646440, -0.432140222585048750, -0.432185312366100530, -0.432230401066689360, -0.432275488686701850, -0.432320575226025570, -0.432365660684547900, -0.432410745062156430, +-0.432455828358737750, -0.432500910574179440, -0.432545991708369330, -0.432591071761193770, -0.432636150732540580, -0.432681228622296970, -0.432726305430350730, -0.432771381156588310, +-0.432816455800897450, -0.432861529363165410, -0.432906601843280000, -0.432951673241127650, -0.432996743556596120, -0.433041812789572710, -0.433086880939945180, -0.433131948007600080, +-0.433177013992425090, -0.433222078894307580, -0.433267142713135270, -0.433312205448794670, -0.433357267101173620, -0.433402327670159740, -0.433447387155639690, -0.433492445557501100, +-0.433537502875631480, -0.433582559109918440, -0.433627614260248650, -0.433672668326509800, -0.433717721308589270, -0.433762773206374850, -0.433807824019753100, -0.433852873748611810, +-0.433897922392838310, -0.433942969952320400, -0.433988016426944680, -0.434033061816598900, -0.434078106121170480, -0.434123149340547190, -0.434168191474615610, -0.434213232523263600, +-0.434258272486378880, -0.434303311363848090, -0.434348349155558980, -0.434393385861399030, -0.434438421481256000, -0.434483456015016530, -0.434528489462568450, -0.434573521823799100, +-0.434618553098596370, -0.434663583286846840, -0.434708612388438390, -0.434753640403258370, -0.434798667331194650, -0.434843693172133890, -0.434888717925963840, -0.434933741592572090, +-0.434978764171846280, -0.435023785663673220, -0.435068806067940680, -0.435113825384536580, -0.435158843613347450, -0.435203860754261210, -0.435248876807165340, -0.435293891771947660, +-0.435338905648494870, -0.435383918436694830, -0.435428930136434970, -0.435473940747603210, -0.435518950270086190, -0.435563958703771790, -0.435608966048547490, -0.435653972304301140, +-0.435698977470919510, -0.435743981548290420, -0.435788984536301380, -0.435833986434840280, -0.435878987243793810, -0.435923986963049850, -0.435968985592495970, -0.436013983132020000, +-0.436058979581508630, -0.436103974940849900, -0.436148969209931570, -0.436193962388640440, -0.436238954476864390, -0.436283945474490950, -0.436328935381408100, -0.436373924197502430, +-0.436418911922662020, -0.436463898556774310, -0.436508884099727210, -0.436553868551407540, -0.436598851911703220, -0.436643834180501730, -0.436688815357691050, -0.436733795443157990, +-0.436778774436790360, -0.436823752338475870, -0.436868729148102370, -0.436913704865556640, -0.436958679490726640, -0.437003653023500360, -0.437048625463764550, -0.437093596811407140, +-0.437138567066315760, -0.437183536228378360, -0.437228504297481720, -0.437273471273513850, -0.437318437156362260, -0.437363401945915000, -0.437408365642058870, -0.437453328244681750, +-0.437498289753671390, -0.437543250168915650, -0.437588209490301420, -0.437633167717716600, -0.437678124851048900, -0.437723080890186300, -0.437768035835015610, -0.437812989685424810, +-0.437857942441301940, -0.437902894102533800, -0.437947844669008430, -0.437992794140613480, -0.438037742517236930, -0.438082689798765580, -0.438127635985087580, -0.438172581076090420, +-0.438217525071662230, -0.438262467971689830, -0.438307409776061310, -0.438352350484664200, -0.438397290097386650, -0.438442228614115470, -0.438487166034738700, -0.438532102359144030, +-0.438577037587219500, -0.438621971718851980, -0.438666904753929500, -0.438711836692339760, -0.438756767533970860, -0.438801697278709660, -0.438846625926444190, -0.438891553477062550, +-0.438936479930451650, -0.438981405286499540, -0.439026329545093910, -0.439071252706122850, -0.439116174769473230, -0.439161095735033260, -0.439206015602690460, -0.439250934372333090, +-0.439295852043847970, -0.439340768617123180, -0.439385684092046480, -0.439430598468506020, -0.439475511746388600, -0.439520423925582440, -0.439565335005975220, -0.439610244987455050, +-0.439655153869908830, -0.439700061653224780, -0.439744968337290990, -0.439789873921994310, -0.439834778407223010, -0.439879681792864740, -0.439924584078807690, -0.439969485264938730, +-0.440014385351146060, -0.440059284337317500, -0.440104182223341080, -0.440149079009103770, -0.440193974694493840, -0.440238869279398930, -0.440283762763707230, -0.440328655147305740, +-0.440373546430082590, -0.440418436611925590, -0.440463325692722950, -0.440508213672361540, -0.440553100550729600, -0.440597986327715300, -0.440642871003205650, -0.440687754577088860, +-0.440732637049252640, -0.440777518419585230, -0.440822398687973630, -0.440867277854306020, -0.440912155918470220, -0.440957032880354480, -0.441001908739845680, -0.441046783496832180, +-0.441091657151201690, -0.441136529702842450, -0.441181401151641450, -0.441226271497487000, -0.441271140740266850, -0.441316008879869270, -0.441360875916181280, -0.441405741849091090, +-0.441450606678486900, -0.441495470404255850, -0.441540333026286090, -0.441585194544465490, -0.441630054958682350, -0.441674914268823600, -0.441719772474777620, -0.441764629576432200, +-0.441809485573675610, -0.441854340466394880, -0.441899194254478320, -0.441944046937813810, -0.441988898516289530, -0.442033748989792640, -0.442078598358211340, -0.442123446621433550, +-0.442168293779347580, -0.442213139831840460, -0.442257984778800460, -0.442302828620115550, -0.442347671355673930, -0.442392512985362750, -0.442437353509070260, -0.442482192926684780, +-0.442527031238093450, -0.442571868443184580, -0.442616704541845980, -0.442661539533966030, -0.442706373419431810, -0.442751206198131690, -0.442796037869953580, -0.442840868434785710, +-0.442885697892515310, -0.442930526243030640, -0.442975353486219690, -0.443020179621970770, -0.443065004650170960, -0.443109828570708630, -0.443154651383471760, -0.443199473088348620, +-0.443244293685226440, -0.443289113173993500, -0.443333931554538210, -0.443378748826747660, -0.443423564990510280, -0.443468380045713930, -0.443513193992247030, -0.443558006829996800, +-0.443602818558851530, -0.443647629178699210, -0.443692438689428200, -0.443737247090925710, -0.443782054383080100, -0.443826860565779360, -0.443871665638911890, -0.443916469602364800, +-0.443961272456026570, -0.444006074199785160, -0.444050874833528950, -0.444095674357145200, -0.444140472770522210, -0.444185270073548470, -0.444230066266111110, -0.444274861348098630, +-0.444319655319398990, -0.444364448179900620, -0.444409239929490720, -0.444454030568057710, -0.444498820095489630, -0.444543608511674900, -0.444588395816500730, -0.444633182009855580, +-0.444677967091627490, -0.444722751061704890, -0.444767533919974980, -0.444812315666326290, -0.444857096300646740, -0.444901875822824920, -0.444946654232747980, -0.444991431530304400, +-0.445036207715382210, -0.445080982787869950, -0.445125756747654810, -0.445170529594625270, -0.445215301328669820, -0.445260071949675760, -0.445304841457531460, -0.445349609852125070, +-0.445394377133345070, -0.445439143301078700, -0.445483908355214510, -0.445528672295640530, -0.445573435122245230, -0.445618196834915990, -0.445662957433541280, -0.445707716918009140, +-0.445752475288208110, -0.445797232544025480, -0.445841988685349800, -0.445886743712069160, -0.445931497624072030, -0.445976250421245720, -0.446021002103478840, -0.446065752670659840, +-0.446110502122676060, -0.446155250459416010, -0.446199997680767850, -0.446244743786620100, -0.446289488776860090, -0.446334232651376340, -0.446378975410057060, -0.446423717052790660, +-0.446468457579464630, -0.446513196989967440, -0.446557935284187250, -0.446602672462012630, -0.446647408523330900, -0.446692143468030710, -0.446736877296000090, -0.446781610007127740, +-0.446826341601300910, -0.446871072078408260, -0.446915801438338310, -0.446960529680978490, -0.447005256806217330, -0.447049982813943040, -0.447094707704044190, -0.447139431476408170, +-0.447184154130923550, -0.447228875667478540, -0.447273596085961730, -0.447318315386260600, -0.447363033568263620, -0.447407750631859060, -0.447452466576935550, -0.447497181403380460, +-0.447541895111082440, -0.447586607699929640, -0.447631319169810750, -0.447676029520613140, -0.447720738752225510, -0.447765446864536340, -0.447810153857433220, -0.447854859730804740, +-0.447899564484539050, -0.447944268118524890, -0.447988970632649640, -0.448033672026801940, -0.448078372300870110, -0.448123071454742730, -0.448167769488307280, -0.448212466401452400, +-0.448257162194066310, -0.448301856866037800, -0.448346550417254190, -0.448391242847604180, -0.448435934156976130, -0.448480624345258590, -0.448525313412339140, -0.448570001358106370, +-0.448614688182448600, -0.448659373885254510, -0.448704058466411590, -0.448748741925808550, -0.448793424263334020, -0.448838105478875540, -0.448882785572321810, -0.448927464543561080, +-0.448972142392482120, -0.449016819118972400, -0.449061494722920620, -0.449106169204215140, -0.449150842562744570, -0.449195514798396590, -0.449240185911059740, -0.449284855900622450, +-0.449329524766973410, -0.449374192510000160, -0.449418859129591450, -0.449463524625635600, -0.449508188998021310, -0.449552852246636160, -0.449597514371368910, -0.449642175372108210, +-0.449686835248741700, -0.449731494001158140, -0.449776151629245780, -0.449820808132893490, -0.449865463511988750, -0.449910117766420370, -0.449954770896076720, -0.449999422900846490, +-0.450044073780617340, -0.450088723535277960, -0.450133372164716830, -0.450178019668822650, -0.450222666047483010, -0.450267311300586730, -0.450311955428022100, -0.450356598429678070, +-0.450401240305442100, -0.450445881055203000, -0.450490520678849650, -0.450535159176269630, -0.450579796547351640, -0.450624432791984160, -0.450669067910056060, -0.450713701901454820, +-0.450758334766069360, -0.450802966503788090, -0.450847597114499730, -0.450892226598092080, -0.450936854954453790, -0.450981482183473390, -0.451026108285039640, -0.451070733259040290, +-0.451115357105364050, -0.451159979823899440, -0.451204601414535280, -0.451249221877159210, -0.451293841211660110, -0.451338459417926390, -0.451383076495846910, -0.451427692445309340, +-0.451472307266202580, -0.451516920958415390, -0.451561533521835530, -0.451606144956351820, -0.451650755261852780, -0.451695364438227220, -0.451739972485362910, -0.451784579403148590, +-0.451829185191472860, -0.451873789850224580, -0.451918393379291410, -0.451962995778562250, -0.452007597047925590, -0.452052197187270350, -0.452096796196484240, -0.452141394075456120, +-0.452185990824074510, -0.452230586442228300, -0.452275180929805290, -0.452319774286694290, -0.452364366512784220, -0.452408957607962900, -0.452453547572119140, -0.452498136405141530, +-0.452542724106918980, -0.452587310677339210, -0.452631896116291180, -0.452676480423663370, -0.452721063599344830, -0.452765645643223190, -0.452810226555187430, -0.452854806335126090, +-0.452899384982928140, -0.452943962498481350, -0.452988538881674670, -0.453033114132396610, -0.453077688250536180, -0.453122261235981090, -0.453166833088620380, -0.453211403808343020, +-0.453255973395036700, -0.453300541848590480, -0.453345109168892870, -0.453389675355832910, -0.453434240409298360, -0.453478804329178200, -0.453523367115361060, -0.453567928767735880, +-0.453612489286190470, -0.453657048670613850, -0.453701606920894620, -0.453746164036921750, -0.453790720018583060, -0.453835274865767580, -0.453879828578363950, -0.453924381156261100, +-0.453968932599346900, -0.454013482907510420, -0.454058032080640610, -0.454102580118625310, -0.454147127021353510, -0.454191672788713970, -0.454236217420595610, -0.454280760916886350, +-0.454325303277475110, -0.454369844502250650, -0.454414384591102010, -0.454458923543916980, -0.454503461360584670, -0.454547998040993660, -0.454592533585033100, -0.454637067992590740, +-0.454681601263555780, -0.454726133397816810, -0.454770664395262870, -0.454815194255781870, -0.454859722979262910, -0.454904250565594640, -0.454948777014666130, -0.454993302326365310, +-0.455037826500581220, -0.455082349537202950, -0.455126871436118410, -0.455171392197216700, -0.455215911820386450, -0.455260430305516880, -0.455304947652495850, -0.455349463861212440, +-0.455393978931555370, -0.455438492863413700, -0.455483005656675430, -0.455527517311229700, -0.455572027826965150, -0.455616537203770880, -0.455661045441534910, -0.455705552540146330, +-0.455750058499493850, -0.455794563319466610, -0.455839066999952580, -0.455883569540840920, -0.455928070942020700, -0.455972571203379860, -0.456017070324807650, -0.456061568306192770, +-0.456106065147424360, -0.456150560848390340, -0.456195055408979980, -0.456239548829081960, -0.456284041108585450, -0.456328532247378460, -0.456373022245350150, -0.456417511102389260, +-0.456461998818385010, -0.456506485393225360, -0.456550970826799460, -0.456595455118996190, -0.456639938269704610, -0.456684420278812840, -0.456728901146210010, -0.456773380871785370, +-0.456817859455426800, -0.456862336897023660, -0.456906813196464590, -0.456951288353638960, -0.456995762368434700, -0.457040235240741000, -0.457084706970446730, -0.457129177557441090, +-0.457173647001612120, -0.457218115302849000, -0.457262582461040620, -0.457307048476076170, -0.457351513347843690, -0.457395977076232470, -0.457440439661131240, -0.457484901102429340, +-0.457529361400014820, -0.457573820553776880, -0.457618278563604370, -0.457662735429386620, -0.457707191151011550, -0.457751645728368570, -0.457796099161346840, -0.457840551449834490, +-0.457885002593720720, -0.457929452592894470, -0.457973901447244980, -0.458018349156660340, -0.458062795721029810, -0.458107241140242320, -0.458151685414187100, -0.458196128542752320, +-0.458240570525827170, -0.458285011363300580, -0.458329451055061900, -0.458373889600999170, -0.458418327001001770, -0.458462763254958490, -0.458507198362758720, -0.458551632324290530, +-0.458596065139443290, -0.458640496808106310, -0.458684927330167640, -0.458729356705516680, -0.458773784934042310, -0.458818212015633890, -0.458862637950179560, -0.458907062737568590, +-0.458951486377690010, -0.458995908870433070, -0.459040330215686020, -0.459084750413338070, -0.459129169463278310, -0.459173587365395990, -0.459218004119579300, -0.459262419725717570, +-0.459306834183699890, -0.459351247493415440, -0.459395659654752490, -0.459440070667600400, -0.459484480531848540, -0.459528889247385050, -0.459573296814099360, -0.459617703231880390, +-0.459662108500617620, -0.459706512620199130, -0.459750915590514400, -0.459795317411452350, -0.459839718082902470, -0.459884117604752840, -0.459928515976892880, -0.459972913199211690, +-0.460017309271598620, -0.460061704193941820, -0.460106097966130830, -0.460150490588054570, -0.460194882059602460, -0.460239272380662760, -0.460283661551124880, -0.460328049570878250, +-0.460372436439811070, -0.460416822157812820, -0.460461206724772530, -0.460505590140579620, -0.460549972405122300, -0.460594353518290090, -0.460638733479971970, -0.460683112290057430, +-0.460727489948434710, -0.460771866454993300, -0.460816241809622160, -0.460860616012210840, -0.460904989062647600, -0.460949360960821840, -0.460993731706622720, -0.461038101299939660, +-0.461082469740660970, -0.461126837028676070, -0.461171203163874110, -0.461215568146144510, -0.461259931975375570, -0.461304294651456840, -0.461348656174277780, -0.461393016543726660, +-0.461437375759693010, -0.461481733822065920, -0.461526090730734860, -0.461570446485588200, -0.461614801086515480, -0.461659154533405670, -0.461703506826148410, -0.461747857964632020, +-0.461792207948745930, -0.461836556778379310, -0.461880904453421730, -0.461925250973761530, -0.461969596339288140, -0.462013940549890760, -0.462058283605458970, -0.462102625505881050, +-0.462146966251046560, -0.462191305840845060, -0.462235644275164890, -0.462279981553895600, -0.462324317676926390, -0.462368652644146780, -0.462412986455445100, -0.462457319110710970, +-0.462501650609833560, -0.462545980952702440, -0.462590310139205930, -0.462634638169233670, -0.462678965042674810, -0.462723290759418930, -0.462767615319354400, -0.462811938722370860, +-0.462856260968357470, -0.462900582057203800, -0.462944901988798340, -0.462989220763030560, -0.463033538379790170, -0.463077854838965520, -0.463122170140446210, -0.463166484284121550, +-0.463210797269881010, -0.463255109097613080, -0.463299419767207400, -0.463343729278553160, -0.463388037631540020, -0.463432344826056330, -0.463476650861991860, -0.463520955739235680, +-0.463565259457677570, -0.463609562017205880, -0.463653863417710310, -0.463698163659080060, -0.463742462741204790, -0.463786760663973010, -0.463831057427274320, -0.463875353030997920, +-0.463919647475033610, -0.463963940759269720, -0.464008232883596050, -0.464052523847902130, -0.464096813652076560, -0.464141102296008910, -0.464185389779588560, -0.464229676102705100, +-0.464273961265247060, -0.464318245267104080, -0.464362528108165530, -0.464406809788321050, -0.464451090307459120, -0.464495369665469500, -0.464539647862241440, -0.464583924897664650, +-0.464628200771627640, -0.464672475484020130, -0.464716749034731480, -0.464761021423651330, -0.464805292650668220, -0.464849562715671900, -0.464893831618552020, -0.464938099359197220, +-0.464982365937497140, -0.465026631353341160, -0.465070895606618960, -0.465115158697219200, -0.465159420625031460, -0.465203681389945220, -0.465247940991850180, -0.465292199430634880, +-0.465336456706189060, -0.465380712818402100, -0.465424967767163800, -0.465469221552362640, -0.465513474173888440, -0.465557725631630560, -0.465601975925478750, -0.465646225055321610, +-0.465690473021048930, -0.465734719822550440, -0.465778965459714760, -0.465823209932431650, -0.465867453240590530, -0.465911695384081170, -0.465955936362792200, -0.466000176176613320, +-0.466044414825434070, -0.466088652309144150, -0.466132888627632250, -0.466177123780788070, -0.466221357768501100, -0.466265590590661140, -0.466309822247156780, -0.466354052737877890, +-0.466398282062713830, -0.466442510221554530, -0.466486737214288520, -0.466530963040805660, -0.466575187700995820, -0.466619411194747590, -0.466663633521950840, -0.466707854682494980, +-0.466752074676269890, -0.466796293503164210, -0.466840511163067850, -0.466884727655870190, -0.466928942981461090, -0.466973157139729200, -0.467017370130564490, -0.467061581953856330, +-0.467105792609494590, -0.467150002097368010, -0.467194210417366360, -0.467238417569379230, -0.467282623553296470, -0.467326828369006740, -0.467371032016399900, -0.467415234495365540, +-0.467459435805793470, -0.467503635947572380, -0.467547834920592260, -0.467592032724742920, -0.467636229359913110, -0.467680424825992700, -0.467724619122871220, -0.467768812250438650, +-0.467813004208583630, -0.467857194997196080, -0.467901384616165540, -0.467945573065381930, -0.467989760344734000, -0.468033946454111670, -0.468078131393404480, -0.468122315162502360, +-0.468166497761294040, -0.468210679189669520, -0.468254859447518270, -0.468299038534730260, -0.468343216451194260, -0.468387393196800230, -0.468431568771438100, -0.468475743174996680, +-0.468519916407365900, -0.468564088468435280, -0.468608259358094910, -0.468652429076233450, -0.468696597622740910, -0.468740764997506890, -0.468784931200421360, -0.468829096231373090, +-0.468873260090252100, -0.468917422776947920, -0.468961584291350600, -0.469005744633348930, -0.469049903802832900, -0.469094061799692150, -0.469138218623816610, -0.469182374275095070, +-0.469226528753417640, -0.469270682058674340, -0.469314834190753870, -0.469358985149546330, -0.469403134934941350, -0.469447283546828910, -0.469491430985097820, -0.469535577249638240, +-0.469579722340339620, -0.469623866257092180, -0.469668008999784610, -0.469712150568307060, -0.469756290962549120, -0.469800430182400860, -0.469844568227751110, -0.469888705098489960, +-0.469932840794507030, -0.469976975315692440, -0.470021108661934970, -0.470065240833124730, -0.470109371829151410, -0.470153501649905050, -0.470197630295274500, -0.470241757765149930, +-0.470285884059421340, -0.470330009177977630, -0.470374133120708910, -0.470418255887504850, -0.470462377478255590, -0.470506497892849930, -0.470550617131178070, -0.470594735193129670, +-0.470638852078594790, -0.470682967787462380, -0.470727082319622570, -0.470771195674965060, -0.470815307853379940, -0.470859418854756180, -0.470903528678983880, -0.470947637325952740, +-0.470991744795552890, -0.471035851087673320, -0.471079956202204050, -0.471124060139035350, -0.471168162898056080, -0.471212264479156430, -0.471256364882226110, -0.471300464107155260, +-0.471344562153832860, -0.471388659022149050, -0.471432754711993580, -0.471476849223256610, -0.471520942555827160, -0.471565034709595320, -0.471609125684450960, -0.471653215480284100, +-0.471697304096983850, -0.471741391534440340, -0.471785477792543320, -0.471829562871183050, -0.471873646770248460, -0.471917729489629730, -0.471961811029217080, -0.472005891388899480, +-0.472049970568567230, -0.472094048568109990, -0.472138125387418010, -0.472182201026380370, -0.472226275484887210, -0.472270348762828360, -0.472314420860094060, -0.472358491776573300, +-0.472402561512156260, -0.472446630066732880, -0.472490697440193290, -0.472534763632426580, -0.472578828643322960, -0.472622892472772230, -0.472666955120664700, -0.472711016586889410, +-0.472755076871336500, -0.472799135973895950, -0.472843193894457950, -0.472887250632911590, -0.472931306189147080, -0.472975360563054730, -0.473019413754523550, -0.473063465763443820, +-0.473107516589705460, -0.473151566233198710, -0.473195614693812660, -0.473239661971437520, -0.473283708065963260, -0.473327752977280140, -0.473371796705277180, -0.473415839249844760, +-0.473459880610872800, -0.473503920788251490, -0.473547959781869980, -0.473591997591618520, -0.473636034217387150, -0.473680069659066060, -0.473724103916544400, -0.473768136989712490, +-0.473812168878460560, -0.473856199582677880, -0.473900229102254710, -0.473944257437080960, -0.473988284587046950, -0.474032310552041870, -0.474076335331955980, -0.474120358926679250, +-0.474164381336102000, -0.474208402560113430, -0.474252422598603840, -0.474296441451463210, -0.474340459118581860, -0.474384475599848980, -0.474428490895154880, -0.474472505004389590, +-0.474516517927443430, -0.474560529664205530, -0.474604540214566380, -0.474648549578416230, -0.474692557755644280, -0.474736564746141010, -0.474780570549796280, -0.474824575166500560, +-0.474868578596142950, -0.474912580838613930, -0.474956581893803460, -0.475000581761601930, -0.475044580441898510, -0.475088577934583700, -0.475132574239547410, -0.475176569356680070, +-0.475220563285870920, -0.475264556027010400, -0.475308547579988470, -0.475352537944695560, -0.475396527121020870, -0.475440515108854930, -0.475484501908088050, -0.475528487518609540, +-0.475572471940309830, -0.475616455173078930, -0.475660437216807230, -0.475704418071384140, -0.475748397736699910, -0.475792376212644750, -0.475836353499109020, -0.475880329595982030, +-0.475924304503154210, -0.475968278220515630, -0.476012250747956720, -0.476056222085366800, -0.476100192232636330, -0.476144161189655410, -0.476188128956314460, -0.476232095532502790, +-0.476276060918110870, -0.476320025113028790, -0.476363988117147090, -0.476407949930355010, -0.476451910552543050, -0.476495869983601660, -0.476539828223420280, -0.476583785271889270, +-0.476627741128898830, -0.476671695794339430, -0.476715649268100390, -0.476759601550072190, -0.476803552640145010, -0.476847502538209340, -0.476891451244154550, -0.476935398757871110, +-0.476979345079249220, -0.477023290208179300, -0.477067234144550770, -0.477111176888254160, -0.477155118439179630, -0.477199058797217690, -0.477242997962257660, -0.477286935934190190, +-0.477330872712905750, -0.477374808298293760, -0.477418742690244760, -0.477462675888648880, -0.477506607893396660, -0.477550538704377580, -0.477594468321482170, -0.477638396744600570, +-0.477682323973623370, -0.477726250008439930, -0.477770174848940910, -0.477814098495016440, -0.477858020946557100, -0.477901942203452330, -0.477945862265592710, -0.477989781132868440, +-0.478033698805170100, -0.478077615282387130, -0.478121530564410090, -0.478165444651129650, -0.478209357542435210, -0.478253269238217370, -0.478297179738366330, -0.478341089042772730, +-0.478384997151326040, -0.478428904063916860, -0.478472809780435440, -0.478516714300772360, -0.478560617624817110, -0.478604519752460320, -0.478648420683592200, -0.478692320418103450, +-0.478736218955883470, -0.478780116296822990, -0.478824012440812240, -0.478867907387741760, -0.478911801137501200, -0.478955693689981140, -0.478999585045071790, -0.479043475202663880, +-0.479087364162646910, -0.479131251924911570, -0.479175138489348450, -0.479219023855847080, -0.479262908024298160, -0.479306790994591950, -0.479350672766619190, -0.479394553340269370, +-0.479438432715433130, -0.479482310892000830, -0.479526187869863120, -0.479570063648909530, -0.479613938229030810, -0.479657811610117280, -0.479701683792059570, -0.479745554774747280, +-0.479789424558071110, -0.479833293141921360, -0.479877160526188730, -0.479921026710762870, -0.479964891695534410, -0.480008755480394120, -0.480052618065231580, -0.480096479449937440, +-0.480140339634402170, -0.480184198618516360, -0.480228056402169760, -0.480271912985252960, -0.480315768367656380, -0.480359622549270780, -0.480403475529985690, -0.480447327309691970, +-0.480491177888279890, -0.480535027265640290, -0.480578875441662720, -0.480622722416237940, -0.480666568189256400, -0.480710412760608770, -0.480754256130184800, -0.480798098297875120, +-0.480841939263570610, -0.480885779027160840, -0.480929617588536640, -0.480973454947588420, -0.481017291104206930, -0.481061126058281830, -0.481104959809703910, -0.481148792358363550, +-0.481192623704151670, -0.481236453846957790, -0.481280282786672790, -0.481324110523187130, -0.481367937056391530, -0.481411762386175670, -0.481455586512430480, -0.481499409435046270, +-0.481543231153913950, -0.481587051668923130, -0.481630870979964710, -0.481674689086929510, -0.481718505989707220, -0.481762321688188610, -0.481806136182264200, -0.481849949471824910, +-0.481893761556760280, -0.481937572436961280, -0.481981382112318340, -0.482025190582722360, -0.482068997848062950, -0.482112803908231080, -0.482156608763117220, -0.482200412412612240, +-0.482244214856605790, -0.482288016094988840, -0.482331816127651860, -0.482375614954485670, -0.482419412575380120, -0.482463208990225990, -0.482507004198913850, -0.482550798201334620, +-0.482594590997377950, -0.482638382586934870, -0.482682172969896180, -0.482725962146151650, -0.482769750115592260, -0.482813536878108460, -0.482857322433591250, -0.482901106781930320, +-0.482944889923016600, -0.482988671856740660, -0.483032452582993430, -0.483076232101664730, -0.483120010412645410, -0.483163787515826060, -0.483207563411097660, -0.483251338098349910, +-0.483295111577473850, -0.483338883848360050, -0.483382654910899380, -0.483426424764981710, -0.483470193410497960, -0.483513960847339110, -0.483557727075394960, -0.483601492094556500, +-0.483645255904714300, -0.483689018505759400, -0.483732779897581510, -0.483776540080071700, -0.483820299053120520, -0.483864056816619040, -0.483907813370456960, -0.483951568714525380, +-0.483995322848714880, -0.484039075772916440, -0.484082827487019920, -0.484126577990916350, -0.484170327284496330, -0.484214075367650880, -0.484257822240269860, -0.484301567902244270, +-0.484345312353465170, -0.484389055593822390, -0.484432797623206960, -0.484476538441509560, -0.484520278048621190, -0.484564016444431760, -0.484607753628832240, -0.484651489601713340, +-0.484695224362966140, -0.484738957912480510, -0.484782690250147420, -0.484826421375857630, -0.484870151289502230, -0.484913879990970960, -0.484957607480155100, -0.485001333756945150, +-0.485045058821232280, -0.485088782672906340, -0.485132505311858480, -0.485176226737979330, -0.485219946951160050, -0.485263665951290450, -0.485307383738261770, -0.485351100311964930, +-0.485394815672289980, -0.485438529819128000, -0.485482242752369730, -0.485525954471906160, -0.485569664977627380, -0.485613374269424410, -0.485657082347188070, -0.485700789210809340, +-0.485744494860178290, -0.485788199295185960, -0.485831902515723170, -0.485875604521680990, -0.485919305312949410, -0.485963004889419570, -0.486006703250982220, -0.486050400397528500, +-0.486094096328948400, -0.486137791045133050, -0.486181484545973600, -0.486225176831360070, -0.486268867901183570, -0.486312557755334940, -0.486356246393705280, -0.486399933816184630, +-0.486443620022664110, -0.486487305013034610, -0.486530988787187150, -0.486574671345011870, -0.486618352686399910, -0.486662032811242100, -0.486705711719429560, -0.486749389410852380, +-0.486793065885401720, -0.486836741142968380, -0.486880415183443550, -0.486924088006717330, -0.486967759612680910, -0.487011430001225430, -0.487055099172241050, -0.487098767125618890, +-0.487142433861249780, -0.487186099379025020, -0.487229763678834580, -0.487273426760569780, -0.487317088624121380, -0.487360749269380670, -0.487404408696237690, -0.487448066904583640, +-0.487491723894309500, -0.487535379665306410, -0.487579034217464460, -0.487622687550674950, -0.487666339664828700, -0.487709990559817010, -0.487753640235529920, -0.487797288691858790, +-0.487840935928694760, -0.487884581945928040, -0.487928226743449880, -0.487971870321151140, -0.488015512678923120, -0.488059153816655930, -0.488102793734240810, -0.488146432431568740, +-0.488190069908530980, -0.488233706165017660, -0.488277341200920090, -0.488320975016129140, -0.488364607610536130, -0.488408238984031240, -0.488451869136505730, -0.488495498067850590, +-0.488539125777957050, -0.488582752266715330, -0.488626377534016720, -0.488670001579752160, -0.488713624403813000, -0.488757246006089390, -0.488800866386472630, -0.488844485544854160, +-0.488888103481124050, -0.488931720195173670, -0.488975335686894000, -0.489018949956176400, -0.489062563002911010, -0.489106174826989200, -0.489149785428302010, -0.489193394806740680, +-0.489237002962195520, -0.489280609894557790, -0.489324215603718640, -0.489367820089569250, -0.489411423351999940, -0.489455025390902130, -0.489498626206166690, -0.489542225797685080, +-0.489585824165347520, -0.489629421309045410, -0.489673017228670180, -0.489716611924111980, -0.489760205395262220, -0.489803797642011980, -0.489847388664252650, -0.489890978461874400, +-0.489934567034768730, -0.489978154382826660, -0.490021740505939610, -0.490065325403997780, -0.490108909076892640, -0.490152491524515290, -0.490196072746757030, -0.490239652743508230, +-0.490283231514660300, -0.490326809060104290, -0.490370385379731600, -0.490413960473432610, -0.490457534341098730, -0.490501106982621340, -0.490544678397890840, -0.490588248586798670, +-0.490631817549235850, -0.490675385285093860, -0.490718951794263000, -0.490762517076634820, -0.490806081132100340, -0.490849643960550970, -0.490893205561877160, -0.490936765935970350, +-0.490980325082721600, -0.491023883002022430, -0.491067439693763150, -0.491110995157835300, -0.491154549394129950, -0.491198102402538640, -0.491241654182951630, -0.491285204735260550, +-0.491328754059356390, -0.491372302155130780, -0.491415849022474040, -0.491459394661277640, -0.491502939071433160, -0.491546482252830930, -0.491590024205362520, -0.491633564928919020, +-0.491677104423392020, -0.491720642688671830, -0.491764179724650090, -0.491807715531217880, -0.491851250108266750, -0.491894783455687100, -0.491938315573370530, -0.491981846461208180, +-0.492025376119091580, -0.492068904546911160, -0.492112431744558430, -0.492155957711924660, -0.492199482448901380, -0.492243005955379010, -0.492286528231249130, -0.492330049276403340, +-0.492373569090731990, -0.492417087674126730, -0.492460605026478760, -0.492504121147679660, -0.492547636037619860, -0.492591149696191000, -0.492634662123284270, -0.492678173318791210, +-0.492721683282602410, -0.492765192014609330, -0.492808699514703350, -0.492852205782775940, -0.492895710818717640, -0.492939214622420070, -0.492982717193774510, -0.493026218532672480, +-0.493069718639004560, -0.493113217512662290, -0.493156715153537430, -0.493200211561520330, -0.493243706736502750, -0.493287200678375890, -0.493330693387031390, -0.493374184862359840, +-0.493417675104252770, -0.493461164112601490, -0.493504651887297750, -0.493548138428231980, -0.493591623735295800, -0.493635107808380660, -0.493678590647378070, -0.493722072252178620, +-0.493765552622674020, -0.493809031758755510, -0.493852509660314800, -0.493895986327242460, -0.493939461759430150, -0.493982935956769560, -0.494026408919151280, -0.494069880646466950, +-0.494113351138607880, -0.494156820395465880, -0.494200288416931420, -0.494243755202896210, -0.494287220753251650, -0.494330685067889410, -0.494374148146700050, -0.494417609989575350, +-0.494461070596406650, -0.494504529967085600, -0.494547988101502910, -0.494591444999550210, -0.494634900661118870, -0.494678355086100700, -0.494721808274386280, -0.494765260225867310, +-0.494808710940435160, -0.494852160417981630, -0.494895608658397320, -0.494939055661574030, -0.494982501427403470, -0.495025945955776260, -0.495069389246584170, -0.495112831299718610, +-0.495156272115071350, -0.495199711692533070, -0.495243150031995480, -0.495286587133350000, -0.495330022996488480, -0.495373457621301470, -0.495416891007680830, -0.495460323155517970, +-0.495503754064704700, -0.495547183735131620, -0.495590612166690650, -0.495634039359273080, -0.495677465312770850, -0.495720890027074530, -0.495764313502076000, -0.495807735737667070, +-0.495851156733738420, -0.495894576490181930, -0.495937995006888900, -0.495981412283751370, -0.496024828320659860, -0.496068243117506250, -0.496111656674182110, -0.496155068990579150, +-0.496198480066588180, -0.496241889902101000, -0.496285298497009090, -0.496328705851204310, -0.496372111964577370, -0.496415516837020180, -0.496458920468424160, -0.496502322858681230, +-0.496545724007682150, -0.496589123915318730, -0.496632522581482880, -0.496675920006065360, -0.496719316188958040, -0.496762711130052380, -0.496806104829240370, -0.496849497286412760, +-0.496892888501461350, -0.496936278474277680, -0.496979667204753780, -0.497023054692780300, -0.497066440938249140, -0.497109825941051960, -0.497153209701080510, -0.497196592218225710, +-0.497239973492379420, -0.497283353523433220, -0.497326732311278940, -0.497370109855807540, -0.497413486156910830, -0.497456861214480350, -0.497500235028408180, -0.497543607598585010, +-0.497586978924902830, -0.497630349007253560, -0.497673717845528050, -0.497717085439618230, -0.497760451789415750, -0.497803816894812460, -0.497847180755699280, -0.497890543371968140, +-0.497933904743510620, -0.497977264870218760, -0.498020623751983360, -0.498063981388696340, -0.498107337780249400, -0.498150692926534520, -0.498194046827442500, -0.498237399482865380, +-0.498280750892694750, -0.498324101056822680, -0.498367449975139880, -0.498410797647538540, -0.498454144073910530, -0.498497489254146780, -0.498540833188139350, -0.498584175875779800, +-0.498627517316960200, -0.498670857511571420, -0.498714196459505540, -0.498757534160654100, -0.498800870614909240, -0.498844205822161820, -0.498887539782303880, -0.498930872495227110, +-0.498974203960823540, -0.499017534178984090, -0.499060863149600740, -0.499104190872565300, -0.499147517347769740, -0.499190842575104990, -0.499234166554463180, -0.499277489285736290, +-0.499320810768815290, -0.499364131003592340, -0.499407449989958950, -0.499450767727807390, -0.499494084217028510, -0.499537399457514460, -0.499580713449156830, -0.499624026191847870, +-0.499667337685478440, -0.499710647929940630, -0.499753956925126250, -0.499797264670927330, -0.499840571167234900, -0.499883876413941000, -0.499927180410937420, -0.499970483158116320, +-0.500013784655368610, -0.500057084902586380, -0.500100383899661830, -0.500143681646486040, -0.500186978142950990, -0.500230273388948430, -0.500273567384370680, -0.500316860129108480, +-0.500360151623054250, -0.500403441866099640, -0.500446730858136730, -0.500490018599056730, -0.500533305088751600, -0.500576590327113210, -0.500619874314033760, -0.500663157049404230, +-0.500706438533116690, -0.500749718765063250, -0.500792997745135750, -0.500836275473225400, -0.500879551949224400, -0.500922827173024500, -0.500966101144518010, -0.501009373863595790, +-0.501052645330150150, -0.501095915544073290, -0.501139184505256190, -0.501182452213591150, -0.501225718668970030, -0.501268983871285050, -0.501312247820427160, -0.501355510516288570, +-0.501398771958761370, -0.501442032147737530, -0.501485291083108240, -0.501528548764765710, -0.501571805192601810, -0.501615060366508710, -0.501658314286377640, -0.501701566952100890, +-0.501744818363570100, -0.501788068520677700, -0.501831317423314660, -0.501874565071373400, -0.501917811464746120, -0.501961056603323910, -0.502004300486999070, -0.502047543115663460, +-0.502090784489209300, -0.502134024607527870, -0.502177263470511390, -0.502220501078051830, -0.502263737430041270, -0.502306972526371020, -0.502350206366933390, -0.502393438951620140, +-0.502436670280323790, -0.502479900352935330, -0.502523129169347160, -0.502566356729451050, -0.502609583033139520, -0.502652808080303660, -0.502696031870835780, -0.502739254404628190, +-0.502782475681572080, -0.502825695701559770, -0.502868914464483230, -0.502912131970234770, -0.502955348218705580, -0.502998563209788090, -0.503041776943374150, -0.503084989419356200, +-0.503128200637625310, -0.503171410598073910, -0.503214619300594080, -0.503257826745078020, -0.503301032931417040, -0.503344237859503440, -0.503387441529229320, -0.503430643940486870, +-0.503473845093167500, -0.503517044987163540, -0.503560243622366840, -0.503603440998670050, -0.503646637115964250, -0.503689831974141860, -0.503733025573095180, -0.503776217912715650, +-0.503819408992895570, -0.503862598813526910, -0.503905787374502200, -0.503948974675712650, -0.503992160717050550, -0.504035345498408120, -0.504078529019677760, -0.504121711280750670, +-0.504164892281519280, -0.504208072021875680, -0.504251250501712270, -0.504294427720920260, -0.504337603679392290, -0.504380778377020330, -0.504423951813696700, -0.504467123989312930, +-0.504510294903761310, -0.504553464556934280, -0.504596632948723260, -0.504639800079020650, -0.504682965947718550, -0.504726130554709380, -0.504769293899884450, -0.504812455983136400, +-0.504855616804357200, -0.504898776363439270, -0.504941934660274040, -0.504985091694754030, -0.505028247466771220, -0.505071401976218250, -0.505114555222986320, -0.505157707206968070, +-0.505200857928055470, -0.505244007386141170, -0.505287155581116370, -0.505330302512873810, -0.505373448181305810, -0.505416592586303780, -0.505459735727760370, -0.505502877605567560, +-0.505546018219617980, -0.505589157569802940, -0.505632295656014970, -0.505675432478146280, -0.505718568036089390, -0.505761702329735720, -0.505804835358977800, -0.505847967123707720, +-0.505891097623818230, -0.505934226859200530, -0.505977354829747260, -0.506020481535350620, -0.506063606975903140, -0.506106731151296340, -0.506149854061422650, -0.506192975706174720, +-0.506236096085443950, -0.506279215199122890, -0.506322333047103830, -0.506365449629279430, -0.506408564945540870, -0.506451678995781030, -0.506494791779891870, -0.506537903297766160, +-0.506581013549295300, -0.506624122534371950, -0.506667230252888290, -0.506710336704736970, -0.506753441889809310, -0.506796545807998160, -0.506839648459195600, -0.506882749843294290, +-0.506925849960185640, -0.506968948809762510, -0.507012046391916990, -0.507055142706541620, -0.507098237753528140, -0.507141331532768970, -0.507184424044156980, -0.507227515287583360, +-0.507270605262941100, -0.507313693970122270, -0.507356781409019630, -0.507399867579524600, -0.507442952481529930, -0.507486036114927930, -0.507529118479611130, -0.507572199575471170, +-0.507615279402400810, -0.507658357960292130, -0.507701435249037990, -0.507744511268529930, -0.507787586018660480, -0.507830659499322160, -0.507873731710407510, -0.507916802651808160, +-0.507959872323416880, -0.508002940725126200, -0.508046007856827850, -0.508089073718414390, -0.508132138309778330, -0.508175201630812310, -0.508218263681407880, -0.508261324461457780, +-0.508304383970854420, -0.508347442209490460, -0.508390499177257430, -0.508433554874048290, -0.508476609299755130, -0.508519662454270940, -0.508562714337487120, -0.508605764949296550, +-0.508648814289591630, -0.508691862358265020, -0.508734909155208360, -0.508777954680314390, -0.508820998933475880, -0.508864041914584560, -0.508907083623533210, -0.508950124060214000, +-0.508993163224519930, -0.509036201116342620, -0.509079237735574730, -0.509122273082108780, -0.509165307155837520, -0.509208339956652710, -0.509251371484446880, -0.509294401739112780, +-0.509337430720542940, -0.509380458428629220, -0.509423484863264280, -0.509466510024340740, -0.509509533911751130, -0.509552556525387450, -0.509595577865142310, -0.509638597930908270, +-0.509681616722578060, -0.509724634240043550, -0.509767650483197280, -0.509810665451932430, -0.509853679146140440, -0.509896691565714270, -0.509939702710546340, -0.509982712580529630, +-0.510025721175555670, -0.510068728495517430, -0.510111734540307340, -0.510154739309818360, -0.510197742803942140, -0.510240745022571550, -0.510283745965599110, -0.510326745632917580, +-0.510369744024418930, -0.510412741139995910, -0.510455736979540940, -0.510498731542947120, -0.510541724830106070, -0.510584716840910670, -0.510627707575253890, -0.510670697033027480, +-0.510713685214124190, -0.510756672118436780, -0.510799657745858120, -0.510842642096279940, -0.510885625169595130, -0.510928606965696200, -0.510971587484476130, -0.511014566725826790, +-0.511057544689641040, -0.511100521375811300, -0.511143496784230770, -0.511186470914791080, -0.511229443767385220, -0.511272415341905710, -0.511315385638245520, -0.511358354656296530, +-0.511401322395951710, -0.511444288857103910, -0.511487254039645010, -0.511530217943467980, -0.511573180568465350, -0.511616141914530200, -0.511659101981554290, -0.511702060769430700, +-0.511745018278051860, -0.511787974507310950, -0.511830929457099630, -0.511873883127311080, -0.511916835517837730, -0.511959786628572780, -0.512002736459407860, -0.512045685010236170, +-0.512088632280950250, -0.512131578271443180, -0.512174522981606710, -0.512217466411333920, -0.512260408560517910, -0.512303349429050540, -0.512346289016824660, -0.512389227323733150, +-0.512432164349668980, -0.512475100094523910, -0.512518034558191230, -0.512560967740563370, -0.512603899641533410, -0.512646830260993450, -0.512689759598836340, -0.512732687654954830, +-0.512775614429242020, -0.512818539921589770, -0.512861464131891260, -0.512904387060038940, -0.512947308705926090, -0.512990229069444690, -0.513033148150487620, -0.513076065948947610, +-0.513118982464717990, -0.513161897697690380, -0.513204811647758110, -0.513247724314814140, -0.513290635698750550, -0.513333545799460330, -0.513376454616836230, -0.513419362150771330, +-0.513462268401157720, -0.513505173367888370, -0.513548077050856140, -0.513590979449954130, -0.513633880565074310, -0.513676780396109640, -0.513719678942953120, -0.513762576205497810, +-0.513805472183635700, -0.513848366877259770, -0.513891260286263090, -0.513934152410538530, -0.513977043249978170, -0.514019932804475330, -0.514062821073922980, -0.514105708058213210, +-0.514148593757239090, -0.514191478170893610, -0.514234361299069740, -0.514277243141659570, -0.514320123698556400, -0.514363002969652870, -0.514405880954842190, -0.514448757654016430, +-0.514491633067068690, -0.514534507193891930, -0.514577380034379360, -0.514620251588422950, -0.514663121855915780, -0.514705990836750950, -0.514748858530821420, -0.514791724938019390, +-0.514834590058238060, -0.514877453891370740, -0.514920316437309290, -0.514963177695947020, -0.515006037667176900, -0.515048896350892020, -0.515091753746984460, -0.515134609855347540, +-0.515177464675874220, -0.515220318208457480, -0.515263170452989640, -0.515306021409363880, -0.515348871077472960, -0.515391719457210300, -0.515434566548467980, -0.515477412351139310, +-0.515520256865117040, -0.515563100090294490, -0.515605942026563850, -0.515648782673818310, -0.515691622031950850, -0.515734460100854660, -0.515777296880421950, -0.515820132370546030, +-0.515862966571120190, -0.515905799482036520, -0.515948631103188340, -0.515991461434468610, -0.516034290475770650, -0.516077118226986540, -0.516119944688009590, -0.516162769858732770, +-0.516205593739049510, -0.516248416328851770, -0.516291237628033080, -0.516334057636486210, -0.516376876354104670, -0.516419693780780560, -0.516462509916407080, -0.516505324760877520, +-0.516548138314084860, -0.516590950575921530, -0.516633761546280820, -0.516676571225056170, -0.516719379612139650, -0.516762186707424580, -0.516804992510804140, -0.516847797022171650, +-0.516890600241419200, -0.516933402168440300, -0.516976202803127840, -0.517019002145375330, -0.517061800195074860, -0.517104596952119970, -0.517147392416403510, -0.517190186587819010, +-0.517232979466258680, -0.517275771051615820, -0.517318561343783510, -0.517361350342655290, -0.517404138048123240, -0.517446924460080890, -0.517489709578421550, -0.517532493403037640, +-0.517575275933822470, -0.517618057170669000, -0.517660837113470880, -0.517703615762120320, -0.517746393116510610, -0.517789169176534950, -0.517831943942086870, -0.517874717413058460, +-0.517917489589343140, -0.517960260470834210, -0.518003030057425100, -0.518045798349007880, -0.518088565345476200, -0.518131331046723150, -0.518174095452642150, -0.518216858563125490, +-0.518259620378066720, -0.518302380897359250, -0.518345140120895500, -0.518387898048568880, -0.518430654680272500, -0.518473410015899860, -0.518516164055343290, -0.518558916798496310, +-0.518601668245252110, -0.518644418395504010, -0.518687167249144650, -0.518729914806067230, -0.518772661066165040, -0.518815406029331630, -0.518858149695459290, -0.518900892064441570, +-0.518943633136171640, -0.518986372910543060, -0.519029111387448120, -0.519071848566780350, -0.519114584448432950, -0.519157319032299560, -0.519200052318272490, -0.519242784306245260, +-0.519285514996111420, -0.519328244387763370, -0.519370972481094870, -0.519413699275998790, -0.519456424772368860, -0.519499148970097520, -0.519541871869078300, -0.519584593469204490, +-0.519627313770369530, -0.519670032772465820, -0.519712750475387120, -0.519755466879026520, -0.519798181983277540, -0.519840895788032830, -0.519883608293185920, -0.519926319498629890, +-0.519969029404258490, -0.520011738009964030, -0.520054445315640380, -0.520097151321180950, -0.520139856026478280, -0.520182559431425880, -0.520225261535917190, -0.520267962339845620, +-0.520310661843103820, -0.520353360045585410, -0.520396056947183490, -0.520438752547791930, -0.520481446847303020, -0.520524139845610520, -0.520566831542607740, -0.520609521938188210, +-0.520652211032244460, -0.520694898824670240, -0.520737585315358630, -0.520780270504203610, -0.520822954391097490, -0.520865636975933910, -0.520908318258606730, -0.520950998239008260, +-0.520993676917032360, -0.521036354292572330, -0.521079030365521720, -0.521121705135773160, -0.521164378603220290, -0.521207050767756530, -0.521249721629275520, -0.521292391187669790, +-0.521335059442833090, -0.521377726394658850, -0.521420392043040580, -0.521463056387870940, -0.521505719429043670, -0.521548381166452080, -0.521591041599989920, -0.521633700729549840, +-0.521676358555025480, -0.521719015076310240, -0.521761670293297790, -0.521804324205880850, -0.521846976813952980, -0.521889628117408130, -0.521932278116138850, -0.521974926810038880, +-0.522017574199001630, -0.522060220282920760, -0.522102865061688900, -0.522145508535199920, -0.522188150703347230, -0.522230791566024480, -0.522273431123124410, -0.522316069374540780, +-0.522358706320166900, -0.522401341959896740, -0.522443976293622710, -0.522486609321238800, -0.522529241042638430, -0.522571871457715330, -0.522614500566362050, -0.522657128368472670, +-0.522699754863940710, -0.522742380052659050, -0.522785003934521430, -0.522827626509421380, -0.522870247777252550, -0.522912867737907790, -0.522955486391280750, -0.522998103737265070, +-0.523040719775754500, -0.523083334506641790, -0.523125947929820700, -0.523168560045184750, -0.523211170852627800, -0.523253780352042510, -0.523296388543322720, -0.523338995426362090, +-0.523381601001054240, -0.523424205267292050, -0.523466808224969380, -0.523509409873979980, -0.523552010214216710, -0.523594609245573440, -0.523637206967943690, -0.523679803381221220, +-0.523722398485298890, -0.523764992280070560, -0.523807584765429770, -0.523850175941270480, -0.523892765807485230, -0.523935354363968100, -0.523977941610612620, -0.524020527547312650, +-0.524063112173960950, -0.524105695490451500, -0.524148277496677810, -0.524190858192533860, -0.524233437577912300, -0.524276015652707210, -0.524318592416812000, -0.524361167870120770, +-0.524403742012526150, -0.524446314843922230, -0.524488886364202990, -0.524531456573261060, -0.524574025470990520, -0.524616593057284810, -0.524659159332038110, -0.524701724295143060, +-0.524744287946493750, -0.524786850285983820, -0.524829411313507020, -0.524871971028956330, -0.524914529432225720, -0.524957086523208720, -0.524999642301799520, -0.525042196767890660, +-0.525084749921376440, -0.525127301762150280, -0.525169852290106380, -0.525212401505137370, -0.525254949407137350, -0.525297495996000290, -0.525340041271619150, -0.525382585233887920, +-0.525425127882700240, -0.525467669217950070, -0.525510209239530400, -0.525552747947335200, -0.525595285341258100, -0.525637821421193200, -0.525680356187033350, -0.525722889638672640, +-0.525765421776004720, -0.525807952598923540, -0.525850482107322210, -0.525893010301094590, -0.525935537180134420, -0.525978062744335890, -0.526020586993591780, -0.526063109927796150, +-0.526105631546843200, -0.526148151850625690, -0.526190670839037920, -0.526233188511973430, -0.526275704869326290, -0.526318219910989590, -0.526360733636857310, -0.526403246046823200, +-0.526445757140781350, -0.526488266918624710, -0.526530775380247400, -0.526573282525543140, -0.526615788354406140, -0.526658292866729270, -0.526700796062406610, -0.526743297941332010, +-0.526785798503399460, -0.526828297748502150, -0.526870795676534050, -0.526913292287389260, -0.526955787580960950, -0.526998281557143120, -0.527040774215829620, -0.527083265556914650, +-0.527125755580290960, -0.527168244285852960, -0.527210731673494410, -0.527253217743109290, -0.527295702494590900, -0.527338185927833100, -0.527380668042729980, -0.527423148839175520, +-0.527465628317062670, -0.527508106476285880, -0.527550583316738870, -0.527593058838315640, -0.527635533040909490, -0.527678005924414490, -0.527720477488724530, -0.527762947733733670, +-0.527805416659335110, -0.527847884265422950, -0.527890350551891490, -0.527932815518633800, -0.527975279165543990, -0.528017741492516010, -0.528060202499444190, -0.528102662186221370, +-0.528145120552741880, -0.528187577598899560, -0.528230033324588730, -0.528272487729702480, -0.528314940814134990, -0.528357392577780140, -0.528399843020532110, -0.528442292142284220, +-0.528484739942930550, -0.528527186422364960, -0.528569631580481870, -0.528612075417174250, -0.528654517932336530, -0.528696959125862790, -0.528739398997646330, -0.528781837547581460, +-0.528824274775561820, -0.528866710681482060, -0.528909145265235030, -0.528951578526715150, -0.528994010465816290, -0.529036441082432860, -0.529078870376457840, -0.529121298347785760, +-0.529163724996310370, -0.529206150321926080, -0.529248574324525990, -0.529290997004004500, -0.529333418360255600, -0.529375838393173370, -0.529418257102651340, -0.529460674488583470, +-0.529503090550864420, -0.529545505289387260, -0.529587918704046310, -0.529630330794735540, -0.529672741561349360, -0.529715151003780970, -0.529757559121924680, -0.529799965915674460, +-0.529842371384924740, -0.529884775529568700, -0.529927178349500760, -0.529969579844614790, -0.530011980014805320, -0.530054378859965540, -0.530096776379989750, -0.530139172574772060, +-0.530181567444206750, -0.530223960988187250, -0.530266353206607750, -0.530308744099362350, -0.530351133666345560, -0.530393521907450480, -0.530435908822571740, -0.530478294411603430, +-0.530520678674439080, -0.530563061610973110, -0.530605443221099370, -0.530647823504712400, -0.530690202461705620, -0.530732580091973220, -0.530774956395409390, -0.530817331371908560, +-0.530859705021364040, -0.530902077343670230, -0.530944448338721230, -0.530986818006411450, -0.531029186346634320, -0.531071553359284240, -0.531113919044255200, -0.531156283401441720, +-0.531198646430737220, -0.531241008132036120, -0.531283368505232830, -0.531325727550220780, -0.531368085266894390, -0.531410441655147730, -0.531452796714875440, -0.531495150445970730, +-0.531537502848328130, -0.531579853921841820, -0.531622203666406220, -0.531664552081914770, -0.531706899168261860, -0.531749244925341810, -0.531791589353048930, -0.531833932451276750, +-0.531876274219919790, -0.531918614658872020, -0.531960953768028210, -0.532003291547281540, -0.532045627996526770, -0.532087963115658200, -0.532130296904569370, -0.532172629363154790, +-0.532214960491308680, -0.532257290288925430, -0.532299618755898710, -0.532341945892122910, -0.532384271697492250, -0.532426596171901250, -0.532468919315243320, -0.532511241127413220, +-0.532553561608305030, -0.532595880757813170, -0.532638198575831390, -0.532680515062254000, -0.532722830216975310, -0.532765144039889950, -0.532807456530891450, -0.532849767689874240, +-0.532892077516732950, -0.532934386011361120, -0.532976693173653370, -0.533018999003503800, -0.533061303500807160, -0.533103606665456860, -0.533145908497347550, -0.533188208996373540, +-0.533230508162429340, -0.533272805995408380, -0.533315102495205530, -0.533357397661714970, -0.533399691494831130, -0.533441983994447870, -0.533484275160459490, -0.533526564992760520, +-0.533568853491245500, -0.533611140655807950, -0.533653426486342510, -0.533695710982743600, -0.533737994144905640, -0.533780275972722480, -0.533822556466088560, -0.533864835624898610, +-0.533907113449046180, -0.533949389938426000, -0.533991665092932390, -0.534033938912459980, -0.534076211396902310, -0.534118482546154130, -0.534160752360109740, -0.534203020838663780, +-0.534245287981709890, -0.534287553789142940, -0.534329818260857010, -0.534372081396746860, -0.534414343196706220, -0.534456603660629640, -0.534498862788411630, -0.534541120579946740, +-0.534583377035128700, -0.534625632153852280, -0.534667885936012110, -0.534710138381501940, -0.534752389490216310, -0.534794639262049730, -0.534836887696896970, -0.534879134794651550, +-0.534921380555208330, -0.534963624978461730, -0.535005868064306390, -0.535048109812635950, -0.535090350223345280, -0.535132589296328680, -0.535174827031481120, -0.535217063428696020, +-0.535259298487868240, -0.535301532208892210, -0.535343764591662770, -0.535385995636073590, -0.535428225342019280, -0.535470453709394940, -0.535512680738093990, -0.535554906428011400, +-0.535597130779041470, -0.535639353791079190, -0.535681575464018070, -0.535723795797752980, -0.535766014792178450, -0.535808232447189340, -0.535850448762679180, -0.535892663738542830, +-0.535934877374674930, -0.535977089670970240, -0.536019300627322390, -0.536061510243626250, -0.536103718519776340, -0.536145925455667640, -0.536188131051193670, -0.536230335306249310, +-0.536272538220729180, -0.536314739794528040, -0.536356940027539750, -0.536399138919659070, -0.536441336470780850, -0.536483532680798960, -0.536525727549608260, -0.536567921077103270, +-0.536610113263178870, -0.536652304107728680, -0.536694493610647800, -0.536736681771830760, -0.536778868591172300, -0.536821054068566280, -0.536863238203907690, -0.536905420997090930, +-0.536947602448011100, -0.536989782556561820, -0.537031961322638090, -0.537074138746134520, -0.537116314826945880, -0.537158489564966150, -0.537200662960090170, -0.537242835012212820, +-0.537285005721228170, -0.537327175087030870, -0.537369343109515670, -0.537411509788577550, -0.537453675124110240, -0.537495839116008730, -0.537538001764167660, -0.537580163068481890, +-0.537622323028845380, -0.537664481645153130, -0.537706638917299530, -0.537748794845179790, -0.537790949428687770, -0.537833102667718220, -0.537875254562166010, -0.537917405111925980, +-0.537959554316892130, -0.538001702176959420, -0.538043848692022710, -0.538085993861976090, -0.538128137686714410, -0.538170280166132440, -0.538212421300125140, -0.538254561088586490, +-0.538296699531411350, -0.538338836628494470, -0.538380972379730820, -0.538423106785014480, -0.538465239844240330, -0.538507371557302990, -0.538549501924097670, -0.538591630944518230, +-0.538633758618459750, -0.538675884945816860, -0.538718009926484550, -0.538760133560356900, -0.538802255847328880, -0.538844376787295690, -0.538886496380151070, -0.538928614625790230, +-0.538970731524107900, -0.539012847074999080, -0.539054961278357840, -0.539097074134079150, -0.539139185642057760, -0.539181295802188760, -0.539223404614366130, -0.539265512078485050, +-0.539307618194440170, -0.539349722962126690, -0.539391826381438460, -0.539433928452270670, -0.539476029174517980, -0.539518128548075680, -0.539560226572837640, -0.539602323248699060, +-0.539644418575554670, -0.539686512553299690, -0.539728605181827970, -0.539770696461034700, -0.539812786390815090, -0.539854874971063210, -0.539896962201674050, -0.539939048082542560, +-0.539981132613563840, -0.540023215794631860, -0.540065297625641820, -0.540107378106488570, -0.540149457237067200, -0.540191535017271910, -0.540233611446997660, -0.540275686526139440, +-0.540317760254592440, -0.540359832632250630, -0.540401903659009200, -0.540443973334763020, -0.540486041659407280, -0.540528108632836070, -0.540570174254944690, -0.540612238525628120, +-0.540654301444780550, -0.540696363012297290, -0.540738423228073200, -0.540780482092003360, -0.540822539603981860, -0.540864595763904110, -0.540906650571664870, -0.540948704027159330, +-0.540990756130281690, -0.541032806880927140, -0.541074856278990550, -0.541116904324367210, -0.541158951016951220, -0.541200996356637990, -0.541243040343322160, -0.541285082976899030, +-0.541327124257262930, -0.541369164184308920, -0.541411202757932530, -0.541453239978027630, -0.541495275844489640, -0.541537310357213530, -0.541579343516094490, -0.541621375321026610, +-0.541663405771905420, -0.541705434868625660, -0.541747462611082750, -0.541789488999170790, -0.541831514032785070, -0.541873537711820560, -0.541915560036172580, -0.541957581005735320, +-0.541999600620404200, -0.542041618880073960, -0.542083635784640140, -0.542125651333996820, -0.542167665528039410, -0.542209678366662780, -0.542251689849762350, -0.542293699977232310, +-0.542335708748967970, -0.542377716164864850, -0.542419722224816940, -0.542461726928719860, -0.542503730276468370, -0.542545732267957880, -0.542587732903082820, -0.542629732181738380, +-0.542671730103819530, -0.542713726669221800, -0.542755721877839380, -0.542797715729567700, -0.542839708224301610, -0.542881699361936750, -0.542923689142367220, -0.542965677565488410, +-0.543007664631195430, -0.543049650339383680, -0.543091634689947480, -0.543133617682782120, -0.543175599317783140, -0.543217579594844730, -0.543259558513862430, -0.543301536074731310, +-0.543343512277346560, -0.543385487121602730, -0.543427460607395220, -0.543469432734619010, -0.543511403503169510, -0.543553372912941260, -0.543595340963829550, -0.543637307655729480, +-0.543679272988536470, -0.543721236962144920, -0.543763199576450360, -0.543805160831347670, -0.543847120726732580, -0.543889079262499300, -0.543931036438543240, -0.543972992254760030, +-0.544014946711043890, -0.544056899807290440, -0.544098851543394770, -0.544140801919252290, -0.544182750934757430, -0.544224698589805710, -0.544266644884292220, -0.544308589818112590, +-0.544350533391161020, -0.544392475603333150, -0.544434416454524060, -0.544476355944629290, -0.544518294073543240, -0.544560230841161560, -0.544602166247379230, -0.544644100292091870, +-0.544686032975193910, -0.544727964296580770, -0.544769894256148190, -0.544811822853790480, -0.544853750089403290, -0.544895675962881580, -0.544937600474121100, -0.544979523623016270, +-0.545021445409462620, -0.545063365833355460, -0.545105284894590090, -0.545147202593061260, -0.545189118928664400, -0.545231033901294680, -0.545272947510847760, -0.545314859757218160, +-0.545356770640301410, -0.545398680159992600, -0.545440588316187580, -0.545482495108780770, -0.545524400537667600, -0.545566304602743470, -0.545608207303904020, -0.545650108641043570, +-0.545692008614057980, -0.545733907222842650, -0.545775804467292120, -0.545817700347302150, -0.545859594862767920, -0.545901488013585070, -0.545943379799648240, -0.545985270220852860, +-0.546027159277094220, -0.546069046968268190, -0.546110933294269070, -0.546152818254992730, -0.546194701850334250, -0.546236584080189490, -0.546278464944452760, -0.546320344443019910, +-0.546362222575786260, -0.546404099342647440, -0.546445974743497880, -0.546487848778233530, -0.546529721446749830, -0.546571592748941510, -0.546613462684704120, -0.546655331253933170, +-0.546697198456524200, -0.546739064292371960, -0.546780928761371960, -0.546822791863419640, -0.546864653598410740, -0.546906513966239790, -0.546948372966802650, -0.546990230599994520, +-0.547032086865711250, -0.547073941763847270, -0.547115795294298550, -0.547157647456960270, -0.547199498251728310, -0.547241347678497190, -0.547283195737162660, -0.547325042427620590, +-0.547366887749765500, -0.547408731703493130, -0.547450574288699030, -0.547492415505278830, -0.547534255353127270, -0.547576093832140010, -0.547617930942212450, -0.547659766683240570, +-0.547701601055118890, -0.547743434057743170, -0.547785265691008830, -0.547827095954811720, -0.547868924849046480, -0.547910752373608980, -0.547952578528394520, -0.547994403313299070, +-0.548036226728217170, -0.548078048773044780, -0.548119869447677210, -0.548161688752010430, -0.548203506685938980, -0.548245323249358710, -0.548287138442165590, -0.548328952264254270, +-0.548370764715520490, -0.548412575795859890, -0.548454385505168120, -0.548496193843340030, -0.548538000810271490, -0.548579806405858020, -0.548621610629995260, -0.548663413482578190, +-0.548705214963502550, -0.548747015072663880, -0.548788813809958140, -0.548830611175279870, -0.548872407168525140, -0.548914201789589380, -0.548955995038368450, -0.548997786914757200, +-0.549039577418651390, -0.549081366549947100, -0.549123154308539090, -0.549164940694323090, -0.549206725707194750, -0.549248509347049940, -0.549290291613783620, -0.549332072507291440, +-0.549373852027469130, -0.549415630174212470, -0.549457406947416520, -0.549499182346976920, -0.549540956372789440, -0.549582729024749920, -0.549624500302753230, -0.549666270206695230, +-0.549708038736471560, -0.549749805891978190, -0.549791571673109990, -0.549833336079762810, -0.549875099111832630, -0.549916860769214420, -0.549958621051803930, -0.550000379959497020, +-0.550042137492189440, -0.550083893649776170, -0.550125648432153170, -0.550167401839216090, -0.550209153870860780, -0.550250904526982330, -0.550292653807476500, -0.550334401712239130, +-0.550376148241166100, -0.550417893394152260, -0.550459637171093810, -0.550501379571886160, -0.550543120596425520, -0.550584860244606620, -0.550626598516325670, -0.550668335411478530, +-0.550710070929960160, -0.550751805071666660, -0.550793537836493650, -0.550835269224337120, -0.550876999235092150, -0.550918727868654590, -0.550960455124920200, -0.551002181003785060, +-0.551043905505144150, -0.551085628628893430, -0.551127350374928550, -0.551169070743145810, -0.551210789733439950, -0.551252507345707190, -0.551294223579843030, -0.551335938435743800, +-0.551377651913304350, -0.551419364012420750, -0.551461074732988670, -0.551502784074904380, -0.551544492038062660, -0.551586198622359800, -0.551627903827691780, -0.551669607653953560, +-0.551711310101041460, -0.551753011168851000, -0.551794710857278380, -0.551836409166218570, -0.551878106095567870, -0.551919801645221810, -0.551961495815076590, -0.552003188605027280, +-0.552044880014970100, -0.552086570044800660, -0.552128258694415060, -0.552169945963708610, -0.552211631852577160, -0.552253316360916680, -0.552294999488623370, -0.552336681235592100, +-0.552378361601719160, -0.552420040586900640, -0.552461718191031630, -0.552503394414008420, -0.552545069255726660, -0.552586742716082550, -0.552628414794971270, -0.552670085492289020, +-0.552711754807931440, -0.552753422741794950, -0.552795089293774410, -0.552836754463766230, -0.552878418251666170, -0.552920080657370420, -0.552961741680774050, -0.553003401321773390, +-0.553045059580264180, -0.553086716456142710, -0.553128371949304090, -0.553170026059644600, -0.553211678787060350, -0.553253330131446510, -0.553294980092699400, -0.553336628670714760, +-0.553378275865389010, -0.553419921676617130, -0.553461566104295530, -0.553503209148319960, -0.553544850808586730, -0.553586491084991030, -0.553628129977429050, -0.553669767485796770, +-0.553711403609990490, -0.553753038349905190, -0.553794671705437500, -0.553836303676482960, -0.553877934262938080, -0.553919563464698060, -0.553961191281659100, -0.554002817713717070, +-0.554044442760768470, -0.554086066422708410, -0.554127688699433070, -0.554169309590838990, -0.554210929096821240, -0.554252547217276130, -0.554294163952099740, -0.554335779301188160, +-0.554377393264436910, -0.554419005841742090, -0.554460617032999760, -0.554502226838106350, -0.554543835256956940, -0.554585442289447840, -0.554627047935475240, -0.554668652194935440, +-0.554710255067723530, -0.554751856553736040, -0.554793456652868940, -0.554835055365018540, -0.554876652690080130, -0.554918248627950030, -0.554959843178524760, -0.555001436341699410, +-0.555043028117370610, -0.555084618505434110, -0.555126207505786560, -0.555167795118323040, -0.555209381342940070, -0.555250966179533620, -0.555292549628000120, -0.555334131688234870, +-0.555375712360134280, -0.555417291643594440, -0.555458869538511760, -0.555500446044781440, -0.555542021162300110, -0.555583594890963760, -0.555625167230668680, -0.555666738181310400, +-0.555708307742785230, -0.555749875914989700, -0.555791442697818990, -0.555833008091169760, -0.555874572094938070, -0.555916134709020240, -0.555957695933311680, -0.555999255767708920, +-0.556040814212108050, -0.556082371266405470, -0.556123926930496610, -0.556165481204278000, -0.556207034087645600, -0.556248585580496060, -0.556290135682724560, -0.556331684394227870, +-0.556373231714901830, -0.556414777644643200, -0.556456322183347170, -0.556497865330910390, -0.556539407087229270, -0.556580947452199330, -0.556622486425716990, -0.556664024007678340, +-0.556705560197980120, -0.556747094996517530, -0.556788628403187320, -0.556830160417885470, -0.556871691040508600, -0.556913220270952140, -0.556954748109112610, -0.556996274554886210, +-0.557037799608169570, -0.557079323268858010, -0.557120845536848150, -0.557162366412036090, -0.557203885894318570, -0.557245403983591010, -0.557286920679749830, -0.557328435982691440, +-0.557369949892312260, -0.557411462408507810, -0.557452973531174840, -0.557494483260209670, -0.557535991595508040, -0.557577498536966360, -0.557619004084480950, -0.557660508237948330, +-0.557702010997264130, -0.557743512362324890, -0.557785012333026910, -0.557826510909266830, -0.557868008090939950, -0.557909503877943140, -0.557950998270172470, -0.557992491267524810, +-0.558033982869895470, -0.558075473077181190, -0.558116961889278280, -0.558158449306083270, -0.558199935327491790, -0.558241419953400490, -0.558282903183705990, -0.558324385018303840, +-0.558365865457090770, -0.558407344499962990, -0.558448822146817240, -0.558490298397549050, -0.558531773252055160, -0.558573246710231790, -0.558614718771975770, -0.558656189437182430, +-0.558697658705748720, -0.558739126577570850, -0.558780593052545570, -0.558822058130568400, -0.558863521811536090, -0.558904984095344950, -0.558946444981891720, -0.558987904471071940, +-0.559029362562782570, -0.559070819256920040, -0.559112274553380080, -0.559153728452059460, -0.559195180952854590, -0.559236632055662100, -0.559278081760377630, -0.559319530066897940, +-0.559360976975119550, -0.559402422484938990, -0.559443866596252000, -0.559485309308955350, -0.559526750622945430, -0.559568190538118900, -0.559609629054371730, -0.559651066171600320, +-0.559692501889701320, -0.559733936208571480, -0.559775369128106330, -0.559816800648202830, -0.559858230768757290, -0.559899659489666580, -0.559941086810826330, -0.559982512732133290, +-0.560023937253484430, -0.560065360374775390, -0.560106782095902810, -0.560148202416763440, -0.560189621337253810, -0.560231038857269770, -0.560272454976708190, -0.560313869695465480, +-0.560355283013438400, -0.560396694930522800, -0.560438105446615430, -0.560479514561612820, -0.560520922275411730, -0.560562328587908000, -0.560603733498998500, -0.560645137008579650, +-0.560686539116548310, -0.560727939822800230, -0.560769339127232260, -0.560810737029741380, -0.560852133530223340, -0.560893528628574890, -0.560934922324692660, -0.560976314618473420, +-0.561017705509813110, -0.561059094998608510, -0.561100483084756130, -0.561141869768152950, -0.561183255048694710, -0.561224638926278390, -0.561266021400800400, -0.561307402472157820, +-0.561348782140246190, -0.561390160404962810, -0.561431537266203870, -0.561472912723866570, -0.561514286777846540, -0.561555659428040870, -0.561597030674346300, -0.561638400516658920, +-0.561679768954875370, -0.561721135988892510, -0.561762501618607190, -0.561803865843915280, -0.561845228664713650, -0.561886590080898920, -0.561927950092368180, -0.561969308699017070, +-0.562010665900742780, -0.562052021697441840, -0.562093376089011110, -0.562134729075346670, -0.562176080656345390, -0.562217430831903900, -0.562258779601919170, -0.562300126966287170, +-0.562341472924904770, -0.562382817477669160, -0.562424160624476090, -0.562465502365222640, -0.562506842699805330, -0.562548181628121370, -0.562589519150066610, -0.562630855265538020, +-0.562672189974432360, -0.562713523276646480, -0.562754855172076460, -0.562796185660619400, -0.562837514742171810, -0.562878842416630780, -0.562920168683892270, -0.562961493543853390, +-0.563002816996410640, -0.563044139041461330, -0.563085459678901330, -0.563126778908627610, -0.563168096730537030, -0.563209413144526440, -0.563250728150492040, -0.563292041748330810, +-0.563333353937939930, -0.563374664719215160, -0.563415974092053800, -0.563457282056352480, -0.563498588612008300, -0.563539893758917330, -0.563581197496976550, -0.563622499826082920, +-0.563663800746133310, -0.563705100257023810, -0.563746398358651590, -0.563787695050913420, -0.563828990333706260, -0.563870284206926310, -0.563911576670470760, -0.563952867724236140, +-0.563994157368119750, -0.564035445602017570, -0.564076732425826900, -0.564118017839444600, -0.564159301842766970, -0.564200584435691100, -0.564241865618113740, -0.564283145389932180, +-0.564324423751042300, -0.564365700701341290, -0.564406976240726110, -0.564448250369093850, -0.564489523086340590, -0.564530794392363640, -0.564572064287059530, -0.564613332770325660, +-0.564654599842058120, -0.564695865502154120, -0.564737129750510490, -0.564778392587024340, -0.564819654011591730, -0.564860914024110090, -0.564902172624476620, -0.564943429812587270, +-0.564984685588339360, -0.565025939951629640, -0.565067192902355520, -0.565108444440413080, -0.565149694565699520, -0.565190943278111700, -0.565232190577546810, -0.565273436463901160, +-0.565314680937071930, -0.565355923996956000, -0.565397165643450660, -0.565438405876452000, -0.565479644695857320, -0.565520882101563480, -0.565562118093467790, -0.565603352671466550, +-0.565644585835456850, -0.565685817585335760, -0.565727047921000370, -0.565768276842347100, -0.565809504349273130, -0.565850730441675780, -0.565891955119451120, -0.565933178382496680, +-0.565974400230709220, -0.566015620663986250, -0.566056839682223760, -0.566098057285319150, -0.566139273473169500, -0.566180488245671910, -0.566221701602722780, -0.566262913544219430, +-0.566304124070058810, -0.566345333180138240, -0.566386540874353920, -0.566427747152603240, -0.566468952014783200, -0.566510155460791200, -0.566551357490523430, -0.566592558103877320, +-0.566633757300750050, -0.566674955081038160, -0.566716151444638830, -0.566757346391449040, -0.566798539921366310, -0.566839732034286840, -0.566880922730108150, -0.566922112008727000, +-0.566963299870041020, -0.567004486313946400, -0.567045671340340560, -0.567086854949120590, -0.567128037140183780, -0.567169217913426560, -0.567210397268746340, -0.567251575206040080, +-0.567292751725205210, -0.567333926826138150, -0.567375100508736190, -0.567416272772896970, -0.567457443618516580, -0.567498613045492650, -0.567539781053722160, -0.567580947643102630, +-0.567622112813530370, -0.567663276564902790, -0.567704438897116970, -0.567745599810070440, -0.567786759303659630, -0.567827917377781820, -0.567869074032334330, -0.567910229267214460, +-0.567951383082318630, -0.567992535477544360, -0.568033686452788730, -0.568074836007949280, -0.568115984142922300, -0.568157130857605440, -0.568198276151896110, -0.568239420025690720, +-0.568280562478886810, -0.568321703511381450, -0.568362843123072170, -0.568403981313855500, -0.568445118083628850, -0.568486253432289310, -0.568527387359734630, -0.568568519865861100, +-0.568609650950566260, -0.568650780613747190, -0.568691908855301630, -0.568733035675125900, -0.568774161073117620, -0.568815285049173890, -0.568856407603192340, -0.568897528735069380, +-0.568938648444702650, -0.568979766731989240, -0.569020883596826900, -0.569061999039111810, -0.569103113058741840, -0.569144225655614400, -0.569185336829626130, -0.569226446580674450, +-0.569267554908656550, -0.569308661813470280, -0.569349767295011970, -0.569390871353179120, -0.569431973987869270, -0.569473075198979720, -0.569514174986407110, -0.569555273350049180, +-0.569596370289802920, -0.569637465805566180, -0.569678559897235480, -0.569719652564708250, -0.569760743807882000, -0.569801833626654150, -0.569842922020921460, -0.569884008990581340, +-0.569925094535531640, -0.569966178655668900, -0.570007261350890640, -0.570048342621094160, -0.570089422466177220, -0.570130500886036450, -0.570171577880569380, -0.570212653449673310, +-0.570253727593246110, -0.570294800311184070, -0.570335871603385170, -0.570376941469746490, -0.570418009910165890, -0.570459076924539790, -0.570500142512766150, -0.570541206674742060, +-0.570582269410365270, -0.570623330719532530, -0.570664390602141470, -0.570705449058089730, -0.570746506087274060, -0.570787561689592100, -0.570828615864941270, -0.570869668613219190, +-0.570910719934322630, -0.570951769828149210, -0.570992818294596470, -0.571033865333562040, -0.571074910944942450, -0.571115955128635670, -0.571156997884539000, -0.571198039212550190, +-0.571239079112566000, -0.571280117584484050, -0.571321154628201770, -0.571362190243617010, -0.571403224430626410, -0.571444257189127720, -0.571485288519018360, -0.571526318420196300, +-0.571567346892557950, -0.571608373936001170, -0.571649399550423930, -0.571690423735722760, -0.571731446491795640, -0.571772467818539850, -0.571813487715853160, -0.571854506183632540, +-0.571895523221775500, -0.571936538830179810, -0.571977553008742980, -0.572018565757361990, -0.572059577075934580, -0.572100586964358280, -0.572141595422530850, -0.572182602450349020, +-0.572223608047710660, -0.572264612214513410, -0.572305614950654910, -0.572346616256032000, -0.572387616130542560, -0.572428614574084450, -0.572469611586554410, -0.572510607167850290, +-0.572551601317869750, -0.572592594036510530, -0.572633585323669480, -0.572674575179244470, -0.572715563603133030, -0.572756550595233000, -0.572797536155441380, -0.572838520283655780, +-0.572879502979773860, -0.572920484243693570, -0.572961464075311790, -0.573002442474526250, -0.573043419441234600, -0.573084394975334810, -0.573125369076723730, -0.573166341745299120, +-0.573207312980959060, -0.573248282783600400, -0.573289251153120900, -0.573330218089418420, -0.573371183592390700, -0.573412147661934600, -0.573453110297948210, -0.573494071500329050, +-0.573535031268975090, -0.573575989603783090, -0.573616946504651230, -0.573657901971476920, -0.573698856004158260, -0.573739808602591990, -0.573780759766676310, -0.573821709496308730, +-0.573862657791387230, -0.573903604651808670, -0.573944550077471140, -0.573985494068272260, -0.574026436624110010, -0.574067377744881260, -0.574108317430484070, -0.574149255680816540, +-0.574190192495775410, -0.574231127875258870, -0.574272061819164460, -0.574312994327390250, -0.574353925399833210, -0.574394855036391320, -0.574435783236962320, -0.574476710001444290, +-0.574517635329733990, -0.574558559221729710, -0.574599481677328990, -0.574640402696429910, -0.574681322278929540, -0.574722240424725750, -0.574763157133716400, -0.574804072405799560, +-0.574844986240872210, -0.574885898638832330, -0.574926809599578090, -0.574967719123006480, -0.575008627209015470, -0.575049533857503010, -0.575090439068366990, -0.575131342841504580, +-0.575172245176813760, -0.575213146074192380, -0.575254045533538430, -0.575294943554749080, -0.575335840137722320, -0.575376735282356000, -0.575417628988548200, -0.575458521256195900, +-0.575499412085197390, -0.575540301475450320, -0.575581189426852880, -0.575622075939302040, -0.575662961012695980, -0.575703844646933030, -0.575744726841910030, -0.575785607597525170, +-0.575826486913676330, -0.575867364790261570, -0.575908241227178100, -0.575949116224323990, -0.575989989781597100, -0.576030861898895630, -0.576071732576116660, -0.576112601813158380, +-0.576153469609918530, -0.576194335966295320, -0.576235200882186050, -0.576276064357488680, -0.576316926392101190, -0.576357786985921660, -0.576398646138847390, -0.576439503850776470, +-0.576480360121607190, -0.576521214951236650, -0.576562068339563030, -0.576602920286484190, -0.576643770791898550, -0.576684619855702960, -0.576725467477795960, -0.576766313658075180, +-0.576807158396439150, -0.576848001692784720, -0.576888843547010310, -0.576929683959013780, -0.576970522928693440, -0.577011360455946360, -0.577052196540670970, -0.577093031182765000, +-0.577133864382126880, -0.577174696138653800, -0.577215526452243830, -0.577256355322795180, -0.577297182750205920, -0.577338008734373350, -0.577378833275195790, -0.577419656372571420, +-0.577460478026397660, -0.577501298236572590, -0.577542117002994400, -0.577582934325561180, -0.577623750204170340, -0.577664564638720070, -0.577705377629108450, -0.577746189175233680, +-0.577786999276993170, -0.577827807934285010, -0.577868615147007490, -0.577909420915058700, -0.577950225238336060, -0.577991028116737750, -0.578031829550161970, -0.578072629538506910, +-0.578113428081669990, -0.578154225179549400, -0.578195020832043660, -0.578235815039050080, -0.578276607800466860, -0.578317399116192180, -0.578358188986124340, -0.578398977410160660, +-0.578439764388199550, -0.578480549920138980, -0.578521334005877460, -0.578562116645312210, -0.578602897838341730, -0.578643677584863900, -0.578684455884777350, -0.578725232737979270, +-0.578766008144368070, -0.578806782103841840, -0.578847554616299000, -0.578888325681636950, -0.578929095299754120, -0.578969863470548910, -0.579010630193918630, -0.579051395469761810, +-0.579092159297976530, -0.579132921678461090, -0.579173682611113130, -0.579214442095830840, -0.579255200132512530, -0.579295956721056600, -0.579336711861360380, -0.579377465553322370, +-0.579418217796840660, -0.579458968591813780, -0.579499717938139150, -0.579540465835715280, -0.579581212284440150, -0.579621957284212400, -0.579662700834929320, -0.579703442936489570, +-0.579744183588791210, -0.579784922791732770, -0.579825660545211670, -0.579866396849126330, -0.579907131703375380, -0.579947865107856340, -0.579988597062467530, -0.580029327567107230, +-0.580070056621673990, -0.580110784226065320, -0.580151510380179650, -0.580192235083915150, -0.580232958337170480, -0.580273680139843040, -0.580314400491831360, -0.580355119393033750, +-0.580395836843348610, -0.580436552842673590, -0.580477267390907210, -0.580517980487947560, -0.580558692133693380, -0.580599402328042190, -0.580640111070892420, -0.580680818362142690, +-0.580721524201690650, -0.580762228589434710, -0.580802931525273180, -0.580843633009104800, -0.580884333040826870, -0.580925031620338150, -0.580965728747536820, -0.581006424422321640, +-0.581047118644589910, -0.581087811414240480, -0.581128502731171450, -0.581169192595281550, -0.581209881006468310, -0.581250567964630370, -0.581291253469665930, -0.581331937521473830, +-0.581372620119951500, -0.581413301264997570, -0.581453980956510800, -0.581494659194388700, -0.581535335978530020, -0.581576011308832850, -0.581616685185196160, -0.581657357607517360, +-0.581698028575695080, -0.581738698089627860, -0.581779366149214110, -0.581820032754351680, -0.581860697904939220, -0.581901361600874910, -0.581942023842057620, -0.581982684628384870, +-0.582023343959755410, -0.582064001836067550, -0.582104658257220130, -0.582145313223110690, -0.582185966733637870, -0.582226618788700630, -0.582267269388196400, -0.582307918532024020, +-0.582348566220081910, -0.582389212452268600, -0.582429857228482060, -0.582470500548620710, -0.582511142412583280, -0.582551782820268200, -0.582592421771573440, -0.582633059266397520, +-0.582673695304638970, -0.582714329886196540, -0.582754963010967960, -0.582795594678852000, -0.582836224889746960, -0.582876853643551800, -0.582917480940164160, -0.582958106779482790, +-0.582998731161406100, -0.583039354085832960, -0.583079975552661110, -0.583120595561789300, -0.583161214113116390, -0.583201831206540120, -0.583242446841959140, -0.583283061019272190, +-0.583323673738377790, -0.583364284999174030, -0.583404894801559440, -0.583445503145432640, -0.583486110030692400, -0.583526715457236560, -0.583567319424963980, -0.583607921933773090, +-0.583648522983562620, -0.583689122574230670, -0.583729720705675750, -0.583770317377796610, -0.583810912590492110, -0.583851506343659900, -0.583892098637198930, -0.583932689471007960, +-0.583973278844985070, -0.584013866759028890, -0.584054453213038060, -0.584095038206911440, -0.584135621740547010, -0.584176203813843390, -0.584216784426699220, -0.584257363579013590, +-0.584297941270684130, -0.584338517501609700, -0.584379092271689160, -0.584419665580821150, -0.584460237428903630, -0.584500807815835470, -0.584541376741515410, -0.584581944205842200, +-0.584622510208713700, -0.584663074750028990, -0.584703637829687040, -0.584744199447585490, -0.584784759603623530, -0.584825318297699680, -0.584865875529712810, -0.584906431299560990, +-0.584946985607142980, -0.584987538452357620, -0.585028089835103680, -0.585068639755279230, -0.585109188212783130, -0.585149735207514120, -0.585190280739371070, -0.585230824808252060, +-0.585271367414055830, -0.585311908556681250, -0.585352448236027280, -0.585392986451991890, -0.585433523204473950, -0.585474058493372200, -0.585514592318585710, -0.585555124680012360, +-0.585595655577551110, -0.585636185011101150, -0.585676712980560450, -0.585717239485827880, -0.585757764526802170, -0.585798288103382530, -0.585838810215466690, -0.585879330862953960, +-0.585919850045742760, -0.585960367763732390, -0.586000884016820710, -0.586041398804906800, -0.586081912127889400, -0.586122423985667610, -0.586162934378139380, -0.586203443305203910, +-0.586243950766759720, -0.586284456762706020, -0.586324961292940870, -0.586365464357363250, -0.586405965955872350, -0.586446466088366150, -0.586486964754743820, -0.586527461954904130, +-0.586567957688746030, -0.586608451956167730, -0.586648944757068300, -0.586689436091346610, -0.586729925958901610, -0.586770414359631400, -0.586810901293435160, -0.586851386760211650, +-0.586891870759860160, -0.586932353292278440, -0.586972834357366020, -0.587013313955021430, -0.587053792085143860, -0.587094268747631600, -0.587134743942383520, -0.587175217669299030, +-0.587215689928276110, -0.587256160719213940, -0.587296630042011380, -0.587337097896567630, -0.587377564282780760, -0.587418029200549970, -0.587458492649774120, -0.587498954630352400, +-0.587539415142182890, -0.587579874185164890, -0.587620331759197260, -0.587660787864179080, -0.587701242500008550, -0.587741695666584960, -0.587782147363807070, -0.587822597591574290, +-0.587863046349784590, -0.587903493638337270, -0.587943939457131530, -0.587984383806065660, -0.588024826685038860, -0.588065268093949880, -0.588105708032698130, -0.588146146501181800, +-0.588186583499300090, -0.588227019026951850, -0.588267453084036500, -0.588307885670452110, -0.588348316786098110, -0.588388746430873240, -0.588429174604676810, -0.588469601307407110, +-0.588510026538963450, -0.588550450299244690, -0.588590872588150240, -0.588631293405578180, -0.588671712751427930, -0.588712130625598350, -0.588752547027988850, -0.588792961958497510, +-0.588833375417023850, -0.588873787403467190, -0.588914197917725590, -0.588954606959698480, -0.588995014529284930, -0.589035420626384140, -0.589075825250894520, -0.589116228402715270, +-0.589156630081745460, -0.589197030287884500, -0.589237429021030490, -0.589277826281083050, -0.589318222067940930, -0.589358616381503660, -0.589399009221669430, -0.589439400588337770, +-0.589479790481407530, -0.589520178900778240, -0.589560565846348080, -0.589600951318016490, -0.589641335315682970, -0.589681717839245720, -0.589722098888604160, -0.589762478463657370, +-0.589802856564304760, -0.589843233190444630, -0.589883608341976400, -0.589923982018799140, -0.589964354220812280, -0.590004724947914230, -0.590045094200004280, -0.590085461976981640, +-0.590125828278745710, -0.590166193105194910, -0.590206556456228550, -0.590246918331745810, -0.590287278731646210, -0.590327637655827960, -0.590367995104190690, -0.590408351076633700, +-0.590448705573055510, -0.590489058593355540, -0.590529410137432990, -0.590569760205187260, -0.590610108796516650, -0.590650455911320930, -0.590690801549499040, -0.590731145710950420, +-0.590771488395573700, -0.590811829603268170, -0.590852169333933030, -0.590892507587467920, -0.590932844363771140, -0.590973179662742210, -0.591013513484280440, -0.591053845828285130, +-0.591094176694654920, -0.591134506083289210, -0.591174833994087320, -0.591215160426948550, -0.591255485381771640, -0.591295808858456010, -0.591336130856901180, -0.591376451377005790, +-0.591416770418669140, -0.591457087981790530, -0.591497404066269720, -0.591537718672004890, -0.591578031798895900, -0.591618343446841720, -0.591658653615741990, -0.591698962305495460, +-0.591739269516001310, -0.591779575247159180, -0.591819879498868380, -0.591860182271027440, -0.591900483563536190, -0.591940783376293630, -0.591981081709199500, -0.592021378562152420, +-0.592061673935051710, -0.592101967827797340, -0.592142260240287600, -0.592182551172422130, -0.592222840624100360, -0.592263128595221900, -0.592303415085685180, -0.592343700095390060, +-0.592383983624235500, -0.592424265672121480, -0.592464546238946400, -0.592504825324609910, -0.592545102929011410, -0.592585379052050440, -0.592625653693625740, -0.592665926853636950, +-0.592706198531983250, -0.592746468728564400, -0.592786737443279140, -0.592827004676026890, -0.592867270426707500, -0.592907534695219730, -0.592947797481462980, -0.592988058785336780, +-0.593028318606740770, -0.593068576945573690, -0.593108833801735070, -0.593149089175124430, -0.593189343065641310, -0.593229595473184550, -0.593269846397653900, -0.593310095838948450, +-0.593350343796968270, -0.593390590271611780, -0.593430835262778840, -0.593471078770368870, -0.593511320794281480, -0.593551561334415450, -0.593591800390670610, -0.593632037962946500, +-0.593672274051141980, -0.593712508655156790, -0.593752741774890350, -0.593792973410242400, -0.593833203561111580, -0.593873432227397860, -0.593913659409000540, -0.593953885105819370, +-0.593994109317753200, -0.594034332044701690, -0.594074553286564330, -0.594114773043241010, -0.594154991314630450, -0.594195208100632310, -0.594235423401146210, -0.594275637216071910, +-0.594315849545308140, -0.594356060388754660, -0.594396269746311100, -0.594436477617877320, -0.594476684003351850, -0.594516888902634770, -0.594557092315625700, -0.594597294242223630, +-0.594637494682328400, -0.594677693635839330, -0.594717891102656380, -0.594758087082678410, -0.594798281575805170, -0.594838474581936170, -0.594878666100971510, -0.594918856132809700, +-0.594959044677350720, -0.594999231734494200, -0.595039417304140010, -0.595079601386186760, -0.595119783980534670, -0.595159965087083020, -0.595200144705731900, -0.595240322836379950, +-0.595280499478927250, -0.595320674633273650, -0.595360848299318010, -0.595401020476960310, -0.595441191166099950, -0.595481360366637010, -0.595521528078470360, -0.595561694301499860, +-0.595601859035625130, -0.595642022280746140, -0.595682184036761650, -0.595722344303571740, -0.595762503081076030, -0.595802660369174290, -0.595842816167765690, -0.595882970476749980, +-0.595923123296026810, -0.595963274625496250, -0.596003424465057160, -0.596043572814609400, -0.596083719674053160, -0.596123865043287180, -0.596164008922211660, -0.596204151310726020, +-0.596244292208730430, -0.596284431616123660, -0.596324569532805880, -0.596364705958676740, -0.596404840893636100, -0.596444974337583030, -0.596485106290417510, -0.596525236752039170, +-0.596565365722348200, -0.596605493201243340, -0.596645619188624910, -0.596685743684392310, -0.596725866688445740, -0.596765988200684160, -0.596806108221007550, -0.596846226749315760, +-0.596886343785508640, -0.596926459329485400, -0.596966573381146000, -0.597006685940390520, -0.597046797007117940, -0.597086906581228430, -0.597127014662621640, -0.597167121251197640, +-0.597207226346855410, -0.597247329949495250, -0.597287432059016690, -0.597327532675319910, -0.597367631798303990, -0.597407729427868910, -0.597447825563914630, -0.597487920206341010, +-0.597528013355047350, -0.597568105009933510, -0.597608195170899580, -0.597648283837845410, -0.597688371010670180, -0.597728456689273990, -0.597768540873557130, -0.597808623563418460, +-0.597848704758758290, -0.597888784459476350, -0.597928862665472740, -0.597968939376646750, -0.598009014592898240, -0.598049088314127290, -0.598089160540233980, -0.598129231271117390, +-0.598169300506677710, -0.598209368246814810, -0.598249434491428870, -0.598289499240418960, -0.598329562493685300, -0.598369624251127720, -0.598409684512646530, -0.598449743278140600, +-0.598489800547510440, -0.598529856320656140, -0.598569910597476770, -0.598609963377872640, -0.598650014661743610, -0.598690064448989980, -0.598730112739510710, -0.598770159533206230, +-0.598810204829976270, -0.598850248629721250, -0.598890290932340250, -0.598930331737733470, -0.598970371045800860, -0.599010408856442740, -0.599050445169558190, -0.599090479985047500, +-0.599130513302810640, -0.599170545122747920, -0.599210575444758420, -0.599250604268742440, -0.599290631594600390, -0.599330657422231350, -0.599370681751535740, -0.599410704582413300, +-0.599450725914764560, -0.599490745748488600, -0.599530764083485820, -0.599570780919656100, -0.599610796256899840, -0.599650810095116120, -0.599690822434205460, -0.599730833274067730, +-0.599770842614603230, -0.599810850455711250, -0.599850856797292220, -0.599890861639246100, -0.599930864981473080, -0.599970866823872570, -0.600010867166344890, -0.600050866008789980, +-0.600090863351108390, -0.600130859193199200, -0.600170853534962910, -0.600210846376299730, -0.600250837717109190, -0.600290827557291570, -0.600330815896746860, -0.600370802735375350, +-0.600410788073076570, -0.600450771909750820, -0.600490754245298190, -0.600530735079618960, -0.600570714412612560, -0.600610692244179400, -0.600650668574219450, -0.600690643402633230, +-0.600730616729320040, -0.600770588554180310, -0.600810558877114100, -0.600850527698021940, -0.600890495016802920, -0.600930460833357770, -0.600970425147586810, -0.601010387959389440, +-0.601050349268666180, -0.601090309075316910, -0.601130267379242240, -0.601170224180341610, -0.601210179478515410, -0.601250133273663720, -0.601290085565687080, -0.601330036354484900, +-0.601369985639957580, -0.601409933422005330, -0.601449879700528540, -0.601489824475426760, -0.601529767746600390, -0.601569709513949610, -0.601609649777374970, -0.601649588536775750, +-0.601689525792052590, -0.601729461543106030, -0.601769395789835460, -0.601809328532141310, -0.601849259769923870, -0.601889189503083680, -0.601929117731520140, -0.601969044455133770, +-0.602008969673824890, -0.602048893387493790, -0.602088815596040220, -0.602128736299364590, -0.602168655497367090, -0.602208573189948250, -0.602248489377007700, -0.602288404058445970, +-0.602328317234163140, -0.602368228904059940, -0.602408139068035810, -0.602448047725991250, -0.602487954877826690, -0.602527860523442540, -0.602567764662738310, -0.602607667295614770, +-0.602647568421972420, -0.602687468041710690, -0.602727366154730440, -0.602767262760931620, -0.602807157860215100, -0.602847051452480300, -0.602886943537627840, -0.602926834115558140, +-0.602966723186171620, -0.603006610749367900, -0.603046496805047740, -0.603086381353111210, -0.603126264393459180, -0.603166145925991160, -0.603206025950607790, -0.603245904467209270, +-0.603285781475696340, -0.603325656975968630, -0.603365530967926780, -0.603405403451471530, -0.603445274426502310, -0.603485143892919960, -0.603525011850624680, -0.603564878299517330, +-0.603604743239497420, -0.603644606670465600, -0.603684468592322280, -0.603724329004968090, -0.603764187908302770, -0.603804045302226980, -0.603843901186641110, -0.603883755561445800, +-0.603923608426540800, -0.603963459781826750, -0.604003309627203940, -0.604043157962573350, -0.604083004787834500, -0.604122850102888130, -0.604162693907635000, -0.604202536201974730, +-0.604242376985808070, -0.604282216259035550, -0.604322054021557810, -0.604361890273274690, -0.604401725014086730, -0.604441558243894450, -0.604481389962598700, -0.604521220170099130, +-0.604561048866296470, -0.604600876051091140, -0.604640701724384000, -0.604680525886074790, -0.604720348536064270, -0.604760169674252830, -0.604799989300541350, -0.604839807414829570, +-0.604879624017018220, -0.604919439107008180, -0.604959252684699190, -0.604999064749992100, -0.605038875302787220, -0.605078684342985620, -0.605118491870486940, -0.605158297885192040, +-0.605198102387001450, -0.605237905375815900, -0.605277706851535150, -0.605317506814060270, -0.605357305263291570, -0.605397102199129900, -0.605436897621475230, -0.605476691530228210, +-0.605516483925289560, -0.605556274806560050, -0.605596064173939410, -0.605635852027328610, -0.605675638366628300, -0.605715423191739100, -0.605755206502561090, -0.605794988298995030, +-0.605834768580941870, -0.605874547348301480, -0.605914324600974610, -0.605954100338861990, -0.605993874561864490, -0.606033647269881960, -0.606073418462815260, -0.606113188140565030, +-0.606152956303032230, -0.606192722950116610, -0.606232488081719260, -0.606272251697740680, -0.606312013798081750, -0.606351774382642540, -0.606391533451323790, -0.606431291004026260, +-0.606471047040650800, -0.606510801561097380, -0.606550554565267070, -0.606590306053060630, -0.606630056024378140, -0.606669804479120440, -0.606709551417188190, -0.606749296838482550, +-0.606789040742903190, -0.606828783130351270, -0.606868524000727440, -0.606908263353932550, -0.606948001189866690, -0.606987737508430940, -0.607027472309525700, -0.607067205593052270, +-0.607106937358910300, -0.607146667607001090, -0.607186396337225260, -0.607226123549483690, -0.607265849243676550, -0.607305573419704700, -0.607345296077469340, -0.607385017216870330, +-0.607424736837808840, -0.607464454940185420, -0.607504171523901240, -0.607543886588856390, -0.607583600134951720, -0.607623312162088090, -0.607663022670166470, -0.607702731659086950, +-0.607742439128750700, -0.607782145079058260, -0.607821849509910810, -0.607861552421208430, -0.607901253812852090, -0.607940953684742770, -0.607980652036781310, -0.608020348868867910, +-0.608060044180903540, -0.608099737972789160, -0.608139430244425740, -0.608179120995713470, -0.608218810226553330, -0.608258497936846500, -0.608298184126493060, -0.608337868795394200, +-0.608377551943450670, -0.608417233570563650, -0.608456913676633130, -0.608496592261560390, -0.608536269325246070, -0.608575944867591480, -0.608615618888496690, -0.608655291387862900, +-0.608694962365590840, -0.608734631821581720, -0.608774299755735600, -0.608813966167953800, -0.608853631058137170, -0.608893294426186670, -0.608932956272002610, -0.608972616595486180, +-0.609012275396538570, -0.609051932675059970, -0.609091588430951460, -0.609131242664114000, -0.609170895374448800, -0.609210546561856030, -0.609250196226236880, -0.609289844367492230, +-0.609329490985523250, -0.609369136080230240, -0.609408779651514410, -0.609448421699276710, -0.609488062223418230, -0.609527701223839150, -0.609567338700441000, -0.609606974653124410, +-0.609646609081790690, -0.609686241986340140, -0.609725873366673940, -0.609765503222693520, -0.609805131554298940, -0.609844758361391510, -0.609884383643872210, -0.609924007401642210, +-0.609963629634601930, -0.610003250342652570, -0.610042869525695090, -0.610082487183630780, -0.610122103316359850, -0.610161717923783710, -0.610201331005803320, -0.610240942562319870, +-0.610280552593233770, -0.610320161098446220, -0.610359768077858410, -0.610399373531371410, -0.610438977458885650, -0.610478579860302410, -0.610518180735523110, -0.610557780084448050, +-0.610597377906978430, -0.610636974203015440, -0.610676568972460370, -0.610716162215213520, -0.610755753931176320, -0.610795344120249610, -0.610834932782335030, -0.610874519917332660, +-0.610914105525144020, -0.610953689605670090, -0.610993272158812380, -0.611032853184471090, -0.611072432682547630, -0.611112010652943070, -0.611151587095558950, -0.611191162010295440, +-0.611230735397053970, -0.611270307255735720, -0.611309877586242110, -0.611349446388473330, -0.611389013662331000, -0.611428579407716550, -0.611468143624530170, -0.611507706312673480, +-0.611547267472047570, -0.611586827102553850, -0.611626385204092630, -0.611665941776565520, -0.611705496819873520, -0.611745050333918130, -0.611784602318599770, -0.611824152773819960, +-0.611863701699479680, -0.611903249095480550, -0.611942794961722990, -0.611982339298108300, -0.612021882104537900, -0.612061423380913070, -0.612100963127134360, -0.612140501343103270, +-0.612180038028721230, -0.612219573183888750, -0.612259106808507370, -0.612298638902478150, -0.612338169465702740, -0.612377698498081550, -0.612417225999516090, -0.612456751969907560, +-0.612496276409157600, -0.612535799317166510, -0.612575320693835910, -0.612614840539067010, -0.612654358852761430, -0.612693875634819580, -0.612733390885143000, -0.612772904603632980, +-0.612812416790191050, -0.612851927444717730, -0.612891436567114530, -0.612930944157283110, -0.612970450215124090, -0.613009954740538760, -0.613049457733428670, -0.613088959193695220, +-0.613128459121239140, -0.613167957515961760, -0.613207454377764580, -0.613246949706549140, -0.613286443502215840, -0.613325935764666540, -0.613365426493802430, -0.613404915689525040, +-0.613444403351735000, -0.613483889480333940, -0.613523374075223280, -0.613562857136304430, -0.613602338663478130, -0.613641818656645910, -0.613681297115709180, -0.613720774040569570, +-0.613760249431127720, -0.613799723287285160, -0.613839195608943730, -0.613878666396003860, -0.613918135648367390, -0.613957603365935630, -0.613997069548610110, -0.614036534196291670, +-0.614075997308881850, -0.614115458886281940, -0.614154918928393910, -0.614194377435118070, -0.614233834406356370, -0.614273289842010020, -0.614312743741980860, -0.614352196106169530, +-0.614391646934477680, -0.614431096226806690, -0.614470543983058230, -0.614509990203133130, -0.614549434886933140, -0.614588878034359800, -0.614628319645313950, -0.614667759719697340, +-0.614707198257411270, -0.614746635258357600, -0.614786070722436960, -0.614825504649551100, -0.614864937039601540, -0.614904367892490030, -0.614943797208117200, -0.614983224986384910, +-0.615022651227194460, -0.615062075930447820, -0.615101499096045610, -0.615140920723889710, -0.615180340813881400, -0.615219759365922660, -0.615259176379914230, -0.615298591855757750, +-0.615338005793355180, -0.615377418192607270, -0.615416829053415770, -0.615456238375682200, -0.615495646159308410, -0.615535052404195150, -0.615574457110244280, -0.615613860277357210, +-0.615653261905435900, -0.615692661994381110, -0.615732060544094570, -0.615771457554477930, -0.615810853025433040, -0.615850246956860640, -0.615889639348662590, -0.615929030200740410, +-0.615968419512996080, -0.616007807285330330, -0.616047193517645030, -0.616086578209842140, -0.616125961361822410, -0.616165342973487800, -0.616204723044739830, -0.616244101575480370, +-0.616283478565610390, -0.616322854015031620, -0.616362227923645810, -0.616401600291354710, -0.616440971118059290, -0.616480340403661400, -0.616519708148062670, -0.616559074351165080, +-0.616598439012869480, -0.616637802133077730, -0.616677163711691460, -0.616716523748612630, -0.616755882243742120, -0.616795239196981980, -0.616834594608233640, -0.616873948477399180, +-0.616913300804379560, -0.616952651589076750, -0.616992000831392500, -0.617031348531227990, -0.617070694688485080, -0.617110039303065520, -0.617149382374871050, -0.617188723903802970, +-0.617228063889762920, -0.617267402332652760, -0.617306739232374450, -0.617346074588828950, -0.617385408401918250, -0.617424740671544070, -0.617464071397608280, -0.617503400580012070, +-0.617542728218657300, -0.617582054313445820, -0.617621378864279480, -0.617660701871059260, -0.617700023333687340, -0.617739343252065810, -0.617778661626095520, -0.617817978455678540, +-0.617857293740716630, -0.617896607481111750, -0.617935919676765090, -0.617975230327578620, -0.618014539433454080, -0.618053846994293550, -0.618093153009998010, -0.618132457480469630, +-0.618171760405610170, -0.618211061785321590, -0.618250361619504970, -0.618289659908062510, -0.618328956650895820, -0.618368251847907110, -0.618407545498997460, -0.618446837604068930, +-0.618486128163023620, -0.618525417175762700, -0.618564704642188270, -0.618603990562202060, -0.618643274935706140, -0.618682557762601730, -0.618721839042790990, -0.618761118776175570, +-0.618800396962657650, -0.618839673602138540, -0.618878948694520090, -0.618918222239704390, -0.618957494237593500, -0.618996764688088400, -0.619036033591091490, -0.619075300946504430, +-0.619114566754229490, -0.619153831014167770, -0.619193093726221560, -0.619232354890292490, -0.619271614506282990, -0.619310872574094120, -0.619350129093627970, -0.619389384064786830, +-0.619428637487472010, -0.619467889361585480, -0.619507139687029310, -0.619546388463705580, -0.619585635691515590, -0.619624881370361420, -0.619664125500145160, -0.619703368080768870, +-0.619742609112133750, -0.619781848594142200, -0.619821086526695990, -0.619860322909697390, -0.619899557743047720, -0.619938791026649060, -0.619978022760403480, -0.620017252944213170, +-0.620056481577979430, -0.620095708661604460, -0.620134934194990550, -0.620174158178038890, -0.620213380610651900, -0.620252601492731540, -0.620291820824179880, -0.620331038604898470, +-0.620370254834789360, -0.620409469513754640, -0.620448682641696610, -0.620487894218516470, -0.620527104244116610, -0.620566312718399020, -0.620605519641265980, -0.620644725012618800, +-0.620683928832359790, -0.620723131100391010, -0.620762331816614670, -0.620801530980932270, -0.620840728593245910, -0.620879924653458200, -0.620919119161470250, -0.620958312117184440, +-0.620997503520502980, -0.621036693371328050, -0.621075881669561070, -0.621115068415104330, -0.621154253607860030, -0.621193437247730350, -0.621232619334616710, -0.621271799868421630, +-0.621310978849046960, -0.621350156276395230, -0.621389332150367730, -0.621428506470866890, -0.621467679237794780, -0.621506850451053920, -0.621546020110545490, -0.621585188216172040, +-0.621624354767835620, -0.621663519765438650, -0.621702683208882560, -0.621741845098069730, -0.621781005432902600, -0.621820164213282680, -0.621859321439112270, -0.621898477110293670, +-0.621937631226729180, -0.621976783788320220, -0.622015934794969310, -0.622055084246578630, -0.622094232143050490, -0.622133378484286510, -0.622172523270189020, -0.622211666500660290, +-0.622250808175602630, -0.622289948294917680, -0.622329086858507850, -0.622368223866275330, -0.622407359318122630, -0.622446493213951070, -0.622485625553663380, -0.622524756337161980, +-0.622563885564348270, -0.622603013235124900, -0.622642139349393940, -0.622681263907058020, -0.622720386908018560, -0.622759508352178190, -0.622798628239438990, -0.622837746569703590, +-0.622876863342873400, -0.622915978558851170, -0.622955092217538970, -0.622994204318839340, -0.623033314862653900, -0.623072423848885170, -0.623111531277435350, -0.623150637148207060, +-0.623189741461101840, -0.623228844216022320, -0.623267945412870890, -0.623307045051549440, -0.623346143131960240, -0.623385239654005720, -0.623424334617588390, -0.623463428022610010, +-0.623502519868972980, -0.623541610156579610, -0.623580698885332630, -0.623619786055133570, -0.623658871665884960, -0.623697955717489210, -0.623737038209848940, -0.623776119142865680, +-0.623815198516442180, -0.623854276330480630, -0.623893352584883760, -0.623932427279553230, -0.623971500414391530, -0.624010571989301540, -0.624049642004184670, -0.624088710458943760, +-0.624127777353481020, -0.624166842687699170, -0.624205906461499980, -0.624244968674785850, -0.624284029327459410, -0.624323088419423300, -0.624362145950579040, -0.624401201920829370, +-0.624440256330076720, -0.624479309178223810, -0.624518360465172280, -0.624557410190824890, -0.624596458355083930, -0.624635504957852140, -0.624674549999031270, -0.624713593478524070, +-0.624752635396232820, -0.624791675752060400, -0.624830714545908440, -0.624869751777679560, -0.624908787447276740, -0.624947821554601600, -0.624986854099557010, -0.625025885082045150, +-0.625064914501968990, -0.625103942359230170, -0.625142968653731420, -0.625181993385375390, -0.625221016554064590, -0.625260038159700990, -0.625299058202187340, -0.625338076681425940, +-0.625377093597319740, -0.625416108949770400, -0.625455122738680870, -0.625494134963953560, -0.625533145625491120, -0.625572154723195610, -0.625611162256969670, -0.625650168226716150, +-0.625689172632336810, -0.625728175473734600, -0.625767176750811950, -0.625806176463471700, -0.625845174611615710, -0.625884171195146720, -0.625923166213967370, -0.625962159667980410, +-0.626001151557087690, -0.626040141881192060, -0.626079130640196160, -0.626118117834002730, -0.626157103462513740, -0.626196087525631830, -0.626235070023259840, -0.626274050955300420, +-0.626313030321655640, -0.626352008122228240, -0.626390984356921090, -0.626429959025636250, -0.626468932128276480, -0.626507903664744290, -0.626546873634942770, -0.626585842038773650, +-0.626624808876140030, -0.626663774146944300, -0.626702737851089540, -0.626741699988477620, -0.626780660559011380, -0.626819619562593470, -0.626858576999126950, -0.626897532868513570, +-0.626936487170656310, -0.626975439905457900, -0.627014391072821310, -0.627053340672648290, -0.627092288704841900, -0.627131235169304910, -0.627170180065940050, -0.627209123394649510, +-0.627248065155336040, -0.627287005347902830, -0.627325943972251830, -0.627364881028285800, -0.627403816515907710, -0.627442750435020400, -0.627481682785525740, -0.627520613567327020, +-0.627559542780326660, -0.627598470424427850, -0.627637396499532540, -0.627676321005543710, -0.627715243942364110, -0.627754165309896690, -0.627793085108043550, -0.627832003336707740, +-0.627870919995791810, -0.627909835085199040, -0.627948748604831300, -0.627987660554591650, -0.628026570934383190, -0.628065479744107980, -0.628104386983669110, -0.628143292652969200, +-0.628182196751911450, -0.628221099280397820, -0.628260000238331510, -0.628298899625615140, -0.628337797442151900, -0.628376693687843880, -0.628415588362594040, -0.628454481466305230, +-0.628493372998880530, -0.628532262960222130, -0.628571151350233110, -0.628610038168816110, -0.628648923415874420, -0.628687807091310000, -0.628726689195026170, -0.628765569726925880, +-0.628804448686911320, -0.628843326074885690, -0.628882201890751720, -0.628921076134412620, -0.628959948805770440, -0.628998819904728390, -0.629037689431189320, -0.629076557385056410, +-0.629115423766231750, -0.629154288574618410, -0.629193151810119480, -0.629232013472637910, -0.629270873562076120, -0.629309732078336960, -0.629348589021323620, -0.629387444390939080, +-0.629426298187085620, -0.629465150409666330, -0.629504001058584620, -0.629542850133742450, -0.629581697635043240, -0.629620543562389720, -0.629659387915685320, -0.629698230694832000, +-0.629737071899733050, -0.629775911530291550, -0.629814749586410480, -0.629853586067992350, -0.629892420974940140, -0.629931254307156910, -0.629970086064545850, -0.630008916247009280, +-0.630047744854450480, -0.630086571886772200, -0.630125397343877850, -0.630164221225669730, -0.630203043532051030, -0.630241864262924720, -0.630280683418194100, -0.630319500997761350, +-0.630358317001530000, -0.630397131429403120, -0.630435944281283020, -0.630474755557073110, -0.630513565256676230, -0.630552373379995920, -0.630591179926934250, -0.630629984897394640, +-0.630668788291280150, -0.630707590108493870, -0.630746390348938420, -0.630785189012516900, -0.630823986099132480, -0.630862781608688360, -0.630901575541087060, -0.630940367896231650, +-0.630979158674025430, -0.631017947874371710, -0.631056735497172670, -0.631095521542331840, -0.631134306009752510, -0.631173088899337100, -0.631211870210989010, -0.631250649944611220, +-0.631289428100107130, -0.631328204677379160, -0.631366979676330600, -0.631405753096864640, -0.631444524938884700, -0.631483295202293070, -0.631522063886993170, -0.631560830992888070, +-0.631599596519881290, -0.631638360467875140, -0.631677122836773130, -0.631715883626478350, -0.631754642836894090, -0.631793400467922980, -0.631832156519468340, -0.631870910991433670, +-0.631909663883721380, -0.631948415196234900, -0.631987164928877410, -0.632025913081552320, -0.632064659654162140, -0.632103404646610300, -0.632142148058799870, -0.632180889890634480, +-0.632219630142016540, -0.632258368812849580, -0.632297105903036560, -0.632335841412481230, -0.632374575341085880, -0.632413307688754140, -0.632452038455389110, -0.632490767640894290, +-0.632529495245172320, -0.632568221268126510, -0.632606945709660140, -0.632645668569676860, -0.632684389848078950, -0.632723109544770180, -0.632761827659653830, -0.632800544192632650, +-0.632839259143610170, -0.632877972512489450, -0.632916684299174140, -0.632955394503566860, -0.632994103125571030, -0.633032810165089940, -0.633071515622027240, -0.633110219496285320, +-0.633148921787767830, -0.633187622496378170, -0.633226321622019640, -0.633265019164595100, -0.633303715124007960, -0.633342409500161520, -0.633381102292959410, -0.633419793502304150, +-0.633458483128099490, -0.633497171170248840, -0.633535857628655050, -0.633574542503221540, -0.633613225793851710, -0.633651907500449200, -0.633690587622916520, -0.633729266161157430, +-0.633767943115075120, -0.633806618484573310, -0.633845292269554550, -0.633883964469922680, -0.633922635085580780, -0.633961304116432700, -0.633999971562380970, -0.634038637423329440, +-0.634077301699181200, -0.634115964389840080, -0.634154625495208730, -0.634193285015190790, -0.634231942949689990, -0.634270599298608960, -0.634309254061851460, -0.634347907239320770, +-0.634386558830920650, -0.634425208836553840, -0.634463857256124090, -0.634502504089534570, -0.634541149336689150, -0.634579792997490570, -0.634618435071842460, -0.634657075559648340, +-0.634695714460811860, -0.634734351775235630, -0.634772987502823630, -0.634811621643479150, -0.634850254197105950, -0.634888885163606750, -0.634927514542885320, -0.634966142334845500, +-0.635004768539390030, -0.635043393156422550, -0.635082016185846590, -0.635120637627565990, -0.635159257481483390, -0.635197875747502640, -0.635236492425527270, -0.635275107515460900, +-0.635313721017206510, -0.635352332930667840, -0.635390943255748300, -0.635429551992351740, -0.635468159140380910, -0.635506764699739770, -0.635545368670331620, -0.635583971052060440, +-0.635622571844829070, -0.635661171048541140, -0.635699768663100410, -0.635738364688410500, -0.635776959124374370, -0.635815551970895900, -0.635854143227878810, -0.635892732895226080, +-0.635931320972841440, -0.635969907460628540, -0.636008492358491220, -0.636047075666332340, -0.636085657384055760, -0.636124237511564990, -0.636162816048764010, -0.636201392995555670, +-0.636239968351843820, -0.636278542117532100, -0.636317114292524360, -0.636355684876723450, -0.636394253870033340, -0.636432821272357560, -0.636471387083600070, -0.636509951303663830, +-0.636548513932452710, -0.636587074969870550, -0.636625634415820430, -0.636664192270206210, -0.636702748532931520, -0.636741303203900320, -0.636779856283015590, -0.636818407770181060, +-0.636856957665300590, -0.636895505968278040, -0.636934052679016480, -0.636972597797419660, -0.637011141323391430, -0.637049683256835640, -0.637088223597655380, -0.637126762345754490, +-0.637165299501036730, -0.637203835063406050, -0.637242369032765430, -0.637280901409018830, -0.637319432192070430, -0.637357961381822990, -0.637396488978180800, -0.637435014981047270, +-0.637473539390326580, -0.637512062205921710, -0.637550583427736630, -0.637589103055675180, -0.637627621089641220, -0.637666137529537940, -0.637704652375269300, -0.637743165626738940, +-0.637781677283851160, -0.637820187346508800, -0.637858695814615850, -0.637897202688076260, -0.637935707966794000, -0.637974211650672140, -0.638012713739614770, -0.638051214233525620, +-0.638089713132308670, -0.638128210435867200, -0.638166706144105200, -0.638205200256926730, -0.638243692774234980, -0.638282183695933920, -0.638320673021927410, -0.638359160752119630, +-0.638397646886413540, -0.638436131424713340, -0.638474614366922880, -0.638513095712946120, -0.638551575462686370, -0.638590053616047590, -0.638628530172933750, -0.638667005133248920, +-0.638705478496896180, -0.638743950263779840, -0.638782420433803510, -0.638820889006871620, -0.638859355982887010, -0.638897821361754100, -0.638936285143376970, -0.638974747327658800, +-0.639013207914503670, -0.639051666903815650, -0.639090124295498720, -0.639128580089456170, -0.639167034285592180, -0.639205486883810510, -0.639243937884015570, -0.639282387286110420, +-0.639320835089999260, -0.639359281295586060, -0.639397725902774990, -0.639436168911469260, -0.639474610321573160, -0.639513050132990420, -0.639551488345625470, -0.639589924959381500, +-0.639628359974162670, -0.639666793389873310, -0.639705225206416590, -0.639743655423696820, -0.639782084041617850, -0.639820511060084090, -0.639858936478998610, -0.639897360298265940, +-0.639935782517789820, -0.639974203137474550, -0.640012622157223430, -0.640051039576940760, -0.640089455396530500, -0.640127869615896960, -0.640166282234943320, -0.640204693253574100, +-0.640243102671693040, -0.640281510489204560, -0.640319916706012070, -0.640358321322019750, -0.640396724337131910, -0.640435125751251940, -0.640473525564284160, -0.640511923776132640, +-0.640550320386701570, -0.640588715395894460, -0.640627108803615400, -0.640665500609768680, -0.640703890814258490, -0.640742279416988250, -0.640780666417862350, -0.640819051816784780, +-0.640857435613659930, -0.640895817808391110, -0.640934198400882730, -0.640972577391038860, -0.641010954778763910, -0.641049330563961290, -0.641087704746535310, -0.641126077326390040, +-0.641164448303429890, -0.641202817677558270, -0.641241185448679700, -0.641279551616698470, -0.641317916181518010, -0.641356279143042720, -0.641394640501176780, -0.641433000255824610, +-0.641471358406889510, -0.641509714954276110, -0.641548069897888370, -0.641586423237630710, -0.641624774973406750, -0.641663125105120910, -0.641701473632677160, -0.641739820555980110, +-0.641778165874933190, -0.641816509589440810, -0.641854851699407150, -0.641893192204736730, -0.641931531105332960, -0.641969868401100370, -0.642008204091943480, -0.642046538177765690, +-0.642084870658471640, -0.642123201533965400, -0.642161530804151390, -0.642199858468933350, -0.642238184528215570, -0.642276508981902360, -0.642314831829898240, -0.642353153072106610, +-0.642391472708432220, -0.642429790738779040, -0.642468107163051800, -0.642506421981153930, -0.642544735192989940, -0.642583046798464230, -0.642621356797481220, -0.642659665189944440, +-0.642697971975758400, -0.642736277154827950, -0.642774580727056400, -0.642812882692348380, -0.642851183050608180, -0.642889481801740330, -0.642927778945648450, -0.642966074482237080, +-0.643004368411410620, -0.643042660733073480, -0.643080951447129400, -0.643119240553482910, -0.643157528052038410, -0.643195813942700310, -0.643234098225372470, -0.643272380899959310, +-0.643310661966365100, -0.643348941424494720, -0.643387219274251580, -0.643425495515540400, -0.643463770148265500, -0.643502043172331510, -0.643540314587642050, -0.643578584394101870, +-0.643616852591615500, -0.643655119180086670, -0.643693384159420120, -0.643731647529519950, -0.643769909290291100, -0.643808169441637210, -0.643846427983462810, -0.643884684915672300, +-0.643922940238170540, -0.643961193950860930, -0.643999446053648450, -0.644037696546437390, -0.644075945429132270, -0.644114192701637060, -0.644152438363856380, -0.644190682415694550, +-0.644228924857056410, -0.644267165687845590, -0.644305404907966840, -0.644343642517324900, -0.644381878515823630, -0.644420112903367540, -0.644458345679861160, -0.644496576845209330, +-0.644534806399315710, -0.644573034342085020, -0.644611260673421780, -0.644649485393230750, -0.644687708501415660, -0.644725929997881250, -0.644764149882532060, -0.644802368155272810, +-0.644840584816007370, -0.644878799864640360, -0.644917013301076420, -0.644955225125220300, -0.644993435336975730, -0.645031643936247570, -0.645069850922940670, -0.645108056296958890, +-0.645146260058206860, -0.645184462206589200, -0.645222662742010680, -0.645260861664375240, -0.645299058973587520, -0.645337254669552270, -0.645375448752174230, -0.645413641221357140, +-0.645451832077006070, -0.645490021319025330, -0.645528208947319880, -0.645566394961793580, -0.645604579362351380, -0.645642762148897600, -0.645680943321337300, -0.645719122879574340, +-0.645757300823513570, -0.645795477153059850, -0.645833651868117030, -0.645871824968590190, -0.645909996454383740, -0.645948166325402640, -0.645986334581550860, -0.646024501222733140, +-0.646062666248854220, -0.646100829659818960, -0.646138991455531330, -0.646177151635896170, -0.646215310200818130, -0.646253467150202150, -0.646291622483952220, -0.646329776201973180, +-0.646367928304169780, -0.646406078790446760, -0.646444227660708300, -0.646482374914859270, -0.646520520552804290, -0.646558664574448330, -0.646596806979695350, -0.646634947768450430, +-0.646673086940618420, -0.646711224496103410, -0.646749360434810240, -0.646787494756643770, -0.646825627461508850, -0.646863758549309550, -0.646901888019950850, -0.646940015873337380, +-0.646978142109374320, -0.647016266727965420, -0.647054389729015970, -0.647092511112430490, -0.647130630878114070, -0.647168749025970770, -0.647206865555905560, -0.647244980467823190, +-0.647283093761628740, -0.647321205437226150, -0.647359315494520640, -0.647397423933417150, -0.647435530753819770, -0.647473635955633450, -0.647511739538763180, -0.647549841503113790, +-0.647587941848589590, -0.647626040575095430, -0.647664137682536280, -0.647702233170816990, -0.647740327039841860, -0.647778419289515850, -0.647816509919743820, -0.647854598930430850, +-0.647892686321481110, -0.647930772092799590, -0.647968856244291120, -0.648006938775860910, -0.648045019687413020, -0.648083098978852520, -0.648121176650084620, -0.648159252701013490, +-0.648197327131544210, -0.648235399941581640, -0.648273471131030840, -0.648311540699796020, -0.648349608647782350, -0.648387674974894690, -0.648425739681038230, -0.648463802766117040, +-0.648501864230036310, -0.648539924072701000, -0.648577982294016090, -0.648616038893885970, -0.648654093872215840, -0.648692147228910330, -0.648730198963874850, -0.648768249077013470, +-0.648806297568231600, -0.648844344437433880, -0.648882389684525720, -0.648920433309411180, -0.648958475311995580, -0.648996515692184080, -0.649034554449881010, -0.649072591584991530, +-0.649110627097420620, -0.649148660987073470, -0.649186693253854250, -0.649224723897668390, -0.649262752918420620, -0.649300780316016350, -0.649338806090359880, -0.649376830241356280, +-0.649414852768910640, -0.649452873672928250, -0.649490892953313300, -0.649528910609971090, -0.649566926642806690, -0.649604941051725170, -0.649642953836631070, -0.649680964997429560, +-0.649718974534026050, -0.649756982446324630, -0.649794988734230810, -0.649832993397649550, -0.649870996436486160, -0.649908997850644820, -0.649946997640031170, -0.649984995804549830, +-0.650022992344106540, -0.650060987258605280, -0.650098980547951570, -0.650136972212050470, -0.650174962250807290, -0.650212950664126210, -0.650250937451912980, -0.650288922614072230, +-0.650326906150509590, -0.650364888061129350, -0.650402868345836830, -0.650440847004537530, -0.650478824037135750, -0.650516799443536910, -0.650554773223646080, -0.650592745377368660, +-0.650630715904609080, -0.650668684805272620, -0.650706652079264480, -0.650744617726490060, -0.650782581746853770, -0.650820544140261030, -0.650858504906616900, -0.650896464045826910, +-0.650934421557795350, -0.650972377442427750, -0.651010331699629300, -0.651048284329305280, -0.651086235331360230, -0.651124184705699550, -0.651162132452228760, -0.651200078570852270, +-0.651238023061475600, -0.651275965924003940, -0.651313907158342700, -0.651351846764396280, -0.651389784742070320, -0.651427721091269780, -0.651465655811900410, -0.651503588903866500, +-0.651541520367073580, -0.651579450201426940, -0.651617378406831980, -0.651655304983193240, -0.651693229930416230, -0.651731153248406140, -0.651769074937068480, -0.651806994996307900, +-0.651844913426029680, -0.651882830226139350, -0.651920745396542100, -0.651958658937142780, -0.651996570847846790, -0.652034481128559660, -0.652072389779186020, -0.652110296799631390, +-0.652148202189801070, -0.652186105949600580, -0.652224008078934440, -0.652261908577708270, -0.652299807445827380, -0.652337704683197290, -0.652375600289722520, -0.652413494265308920, +-0.652451386609861460, -0.652489277323285880, -0.652527166405486800, -0.652565053856369760, -0.652602939675840150, -0.652640823863803510, -0.652678706420164460, -0.652716587344828620, +-0.652754466637701650, -0.652792344298688270, -0.652830220327694000, -0.652868094724624040, -0.652905967489384340, -0.652943838621879320, -0.652981708122014730, -0.653019575989695840, +-0.653057442224828310, -0.653095306827316870, -0.653133169797067260, -0.653171031133984670, -0.653208890837974730, -0.653246748908942300, -0.653284605346793110, -0.653322460151432250, +-0.653360313322765670, -0.653398164860697910, -0.653436014765134800, -0.653473863035981870, -0.653511709673144090, -0.653549554676526980, -0.653587398046035940, -0.653625239781576830, +-0.653663079883054170, -0.653700918350373920, -0.653738755183441270, -0.653776590382162180, -0.653814423946441180, -0.653852255876184230, -0.653890086171296510, -0.653927914831684000, +-0.653965741857251310, -0.654003567247904320, -0.654041391003548410, -0.654079213124089340, -0.654117033609431850, -0.654154852459481910, -0.654192669674144690, -0.654230485253326280, +-0.654268299196931190, -0.654306111504865400, -0.654343922177034740, -0.654381731213343860, -0.654419538613698610, -0.654457344378004620, -0.654495148506167520, -0.654532950998092280, +-0.654570751853684630, -0.654608551072850100, -0.654646348655494540, -0.654684144601522690, -0.654721938910840520, -0.654759731583353540, -0.654797522618967620, -0.654835312017587490, +-0.654873099779119120, -0.654910885903467910, -0.654948670390539830, -0.654986453240239850, -0.655024234452473710, -0.655062014027147250, -0.655099791964165460, -0.655137568263434170, +-0.655175342924859020, -0.655213115948345750, -0.655250887333799440, -0.655288657081125820, -0.655326425190230650, -0.655364191661019780, -0.655401956493397940, -0.655439719687271330, +-0.655477481242545460, -0.655515241159126180, -0.655552999436918360, -0.655590756075828170, -0.655628511075761030, -0.655666264436623010, -0.655704016158318860, -0.655741766240754750, +-0.655779514683836550, -0.655817261487469330, -0.655855006651558830, -0.655892750176010900, -0.655930492060731400, -0.655968232305625290, -0.656005970910598650, -0.656043707875556990, +-0.656081443200406510, -0.656119176885052060, -0.656156908929399600, -0.656194639333354980, -0.656232368096824060, -0.656270095219711800, -0.656307820701924390, -0.656345544543367350, +-0.656383266743946870, -0.656420987303567900, -0.656458706222136420, -0.656496423499558500, -0.656534139135739210, -0.656571853130584530, -0.656609565484000290, -0.656647276195892360, +-0.656684985266166030, -0.656722692694727160, -0.656760398481481600, -0.656798102626335310, -0.656835805129193480, -0.656873505989962080, -0.656911205208547070, -0.656948902784854180, +-0.656986598718788840, -0.657024293010257000, -0.657061985659164400, -0.657099676665417130, -0.657137366028920370, -0.657175053749580180, -0.657212739827302330, -0.657250424261993090, +-0.657288107053557340, -0.657325788201901350, -0.657363467706931210, -0.657401145568552110, -0.657438821786670120, -0.657476496361190990, -0.657514169292021110, -0.657551840579065350, +-0.657589510222230000, -0.657627178221420920, -0.657664844576544280, -0.657702509287505180, -0.657740172354209670, -0.657777833776563850, -0.657815493554473770, -0.657853151687844640, +-0.657890808176582630, -0.657928463020593490, -0.657966116219783630, -0.658003767774058110, -0.658041417683323140, -0.658079065947485000, -0.658116712566448880, -0.658154357540120970, +-0.658192000868407120, -0.658229642551213740, -0.658267282588445800, -0.658304920980009700, -0.658342557725811180, -0.658380192825756770, -0.658417826279751430, -0.658455458087701560, +-0.658493088249513030, -0.658530716765092120, -0.658568343634344130, -0.658605968857175260, -0.658643592433491460, -0.658681214363198930, -0.658718834646203180, -0.658756453282410280, +-0.658794070271726540, -0.658831685614057360, -0.658869299309308930, -0.658906911357387210, -0.658944521758198620, -0.658982130511648330, -0.659019737617642760, -0.659057343076087760, +-0.659094946886889850, -0.659132549049954220, -0.659170149565187160, -0.659207748432494740, -0.659245345651783390, -0.659282941222958160, -0.659320535145925700, -0.659358127420591860, +-0.659395718046863030, -0.659433307024644640, -0.659470894353842870, -0.659508480034364020, -0.659546064066114160, -0.659583646448998810, -0.659621227182924490, -0.659658806267797270, +-0.659696383703522790, -0.659733959490007350, -0.659771533627157010, -0.659809106114878090, -0.659846676953076190, -0.659884246141657530, -0.659921813680528270, -0.659959379569594830, +-0.659996943808762620, -0.660034506397937930, -0.660072067337027060, -0.660109626625936420, -0.660147184264571310, -0.660184740252838240, -0.660222294590643300, -0.660259847277893000, +-0.660297398314492750, -0.660334947700348950, -0.660372495435368130, -0.660410041519455810, -0.660447585952518290, -0.660485128734461860, -0.660522669865192920, -0.660560209344617010, +-0.660597747172640530, -0.660635283349169770, -0.660672817874111030, -0.660710350747369950, -0.660747881968853030, -0.660785411538466370, -0.660822939456116480, -0.660860465721708980, +-0.660897990335150290, -0.660935513296346590, -0.660973034605204400, -0.661010554261629360, -0.661048072265527980, -0.661085588616806660, -0.661123103315371050, -0.661160616361127770, +-0.661198127753982900, -0.661235637493843060, -0.661273145580613790, -0.661310652014201580, -0.661348156794512750, -0.661385659921453930, -0.661423161394930630, -0.661460661214849370, +-0.661498159381116560, -0.661535655893638500, -0.661573150752321150, -0.661610643957070810, -0.661648135507793890, -0.661685625404397020, -0.661723113646785710, -0.661760600234866600, +-0.661798085168546320, -0.661835568447730620, -0.661873050072325890, -0.661910530042238540, -0.661948008357375110, -0.661985485017641430, -0.662022960022944030, -0.662060433373189210, +-0.662097905068283700, -0.662135375108133030, -0.662172843492643940, -0.662210310221722720, -0.662247775295276120, -0.662285238713209660, -0.662322700475430180, -0.662360160581843880, +-0.662397619032357610, -0.662435075826876880, -0.662472530965308450, -0.662509984447558820, -0.662547436273534410, -0.662584886443141170, -0.662622334956285640, -0.662659781812874660, +-0.662697227012813860, -0.662734670556009990, -0.662772112442369550, -0.662809552671799080, -0.662846991244204320, -0.662884428159492220, -0.662921863417568980, -0.662959297018341440, +-0.662996728961715240, -0.663034159247597340, -0.663071587875893930, -0.663109014846511970, -0.663146440159357090, -0.663183863814336140, -0.663221285811355530, -0.663258706150322010, +-0.663296124831141420, -0.663333541853720510, -0.663370957217966020, -0.663408370923783910, -0.663445782971080810, -0.663483193359763250, -0.663520602089738070, -0.663558009160911120, +-0.663595414573189050, -0.663632818326478470, -0.663670220420686130, -0.663707620855717990, -0.663745019631480690, -0.663782416747880970, -0.663819812204825440, -0.663857206002220090, +-0.663894598139971650, -0.663931988617986860, -0.663969377436172350, -0.664006764594434080, -0.664044150092678810, -0.664081533930813590, -0.664118916108744180, -0.664156296626377540, +-0.664193675483620070, -0.664231052680378850, -0.664268428216559510, -0.664305802092069240, -0.664343174306814440, -0.664380544860701970, -0.664417913753637790, -0.664455280985528970, +-0.664492646556281820, -0.664530010465803400, -0.664567372713999680, -0.664604733300777520, -0.664642092226043420, -0.664679449489704590, -0.664716805091666750, -0.664754159031836770, +-0.664791511310121490, -0.664828861926427760, -0.664866210880661560, -0.664903558172729840, -0.664940903802539560, -0.664978247769996700, -0.665015590075008100, -0.665052930717480620, +-0.665090269697321210, -0.665127607014435630, -0.665164942668731160, -0.665202276660114330, -0.665239608988492100, -0.665276939653770550, -0.665314268655856630, -0.665351595994656990, +-0.665388921670078790, -0.665426245682027910, -0.665463568030411400, -0.665500888715135910, -0.665538207736108610, -0.665575525093235480, -0.665612840786423470, -0.665650154815579760, +-0.665687467180610340, -0.665724777881422150, -0.665762086917922160, -0.665799394290017110, -0.665836699997613300, -0.665874004040617810, -0.665911306418937250, -0.665948607132478830, +-0.665985906181148500, -0.666023203564853450, -0.666060499283500310, -0.666097793336996260, -0.666135085725247490, -0.666172376448160960, -0.666209665505643420, -0.666246952897602160, +-0.666284238623943150, -0.666321522684573560, -0.666358805079400370, -0.666396085808329990, -0.666433364871269360, -0.666470642268125250, -0.666507917998804930, -0.666545192063214500, +-0.666582464461261020, -0.666619735192851450, -0.666657004257892760, -0.666694271656291360, -0.666731537387954210, -0.666768801452788270, -0.666806063850700510, -0.666843324581597450, +-0.666880583645385940, -0.666917841041973050, -0.666955096771265850, -0.666992350833170660, -0.667029603227594530, -0.667066853954444430, -0.667104103013627440, -0.667141350405049960, +-0.667178596128618960, -0.667215840184241960, -0.667253082571824920, -0.667290323291275240, -0.667327562342499790, -0.667364799725405630, -0.667402035439899290, -0.667439269485887720, +-0.667476501863278120, -0.667513732571977550, -0.667550961611892200, -0.667588188982929600, -0.667625414684996480, -0.667662638718000130, -0.667699861081846870, -0.667737081776443860, +-0.667774300801698310, -0.667811518157517270, -0.667848733843807050, -0.667885947860475060, -0.667923160207428480, -0.667960370884573720, -0.667997579891818070, -0.668034787229068390, +-0.668071992896232090, -0.668109196893215460, -0.668146399219925910, -0.668183599876270300, -0.668220798862156020, -0.668257996177489490, -0.668295191822177890, -0.668332385796128300, +-0.668369578099248130, -0.668406768731443670, -0.668443957692622330, -0.668481144982691070, -0.668518330601557190, -0.668555514549127210, -0.668592696825308530, -0.668629877430008350, +-0.668667056363133170, -0.668704233624590310, -0.668741409214286930, -0.668778583132130230, -0.668815755378026840, -0.668852925951884060, -0.668890094853608950, -0.668927262083109040, +-0.668964427640290520, -0.669001591525061000, -0.669038753737327460, -0.669075914276997310, -0.669113073143977170, -0.669150230338174220, -0.669187385859495780, -0.669224539707849230, +-0.669261691883140890, -0.669298842385278370, -0.669335991214169090, -0.669373138369719570, -0.669410283851837100, -0.669447427660428970, -0.669484569795402610, -0.669521710256664400, +-0.669558849044122000, -0.669595986157682450, -0.669633121597253300, -0.669670255362741050, -0.669707387454053120, -0.669744517871096680, -0.669781646613779370, -0.669818773682007480, +-0.669855899075688770, -0.669893022794730290, -0.669930144839039570, -0.669967265208523120, -0.670004383903088470, -0.670041500922643030, -0.670078616267093970, -0.670115729936348160, +-0.670152841930312990, -0.670189952248896100, -0.670227060892003900, -0.670264167859544120, -0.670301273151423960, -0.670338376767550810, -0.670375478707831540, -0.670412578972173550, +-0.670449677560484010, -0.670486774472670690, -0.670523869708640090, -0.670560963268299730, -0.670598055151557130, -0.670635145358319580, -0.670672233888493840, -0.670709320741987640, +-0.670746405918708040, -0.670783489418562810, -0.670820571241458440, -0.670857651387302690, -0.670894729856003180, -0.670931806647466430, -0.670968881761600300, -0.671005955198311850, +-0.671043026957508840, -0.671080097039097990, -0.671117165442986830, -0.671154232169082880, -0.671191297217293540, -0.671228360587525770, -0.671265422279687000, -0.671302482293684720, +-0.671339540629426470, -0.671376597286819090, -0.671413652265770320, -0.671450705566187360, -0.671487757187977820, -0.671524807131048780, -0.671561855395307550, -0.671598901980662080, +-0.671635946887019000, -0.671672990114286160, -0.671710031662370750, -0.671747071531180630, -0.671784109720622410, -0.671821146230604070, -0.671858181061032680, -0.671895214211816310, +-0.671932245682861580, -0.671969275474076140, -0.672006303585367610, -0.672043330016643510, -0.672080354767810920, -0.672117377838777340, -0.672154399229450310, -0.672191418939737660, +-0.672228436969546150, -0.672265453318783510, -0.672302467987357270, -0.672339480975175150, -0.672376492282144020, -0.672413501908171620, -0.672450509853165900, -0.672487516117033500, +-0.672524520699682270, -0.672561523601019840, -0.672598524820953840, -0.672635524359391220, -0.672672522216239740, -0.672709518391407140, -0.672746512884800920, -0.672783505696328050, +-0.672820496825896510, -0.672857486273413690, -0.672894474038787550, -0.672931460121924840, -0.672968444522733520, -0.673005427241121000, -0.673042408276995350, -0.673079387630263200, +-0.673116365300832740, -0.673153341288611600, -0.673190315593506840, -0.673227288215426210, -0.673264259154277460, -0.673301228409968310, -0.673338195982405850, -0.673375161871497820, +-0.673412126077151950, -0.673449088599275990, -0.673486049437777010, -0.673523008592562980, -0.673559966063541400, -0.673596921850620260, -0.673633875953706380, -0.673670828372707970, +-0.673707779107532320, -0.673744728158087720, -0.673781675524280810, -0.673818621206019760, -0.673855565203212550, -0.673892507515766010, -0.673929448143588350, -0.673966387086586960, +-0.674003324344669920, -0.674040259917744300, -0.674077193805717960, -0.674114126008498630, -0.674151056525994390, -0.674187985358112090, -0.674224912504759910, -0.674261837965845380, +-0.674298761741276680, -0.674335683830960650, -0.674372604234805490, -0.674409522952718720, -0.674446439984608630, -0.674483355330381950, -0.674520268989946990, -0.674557180963211600, +-0.674594091250082960, -0.674630999850469150, -0.674667906764277790, -0.674704811991416960, -0.674741715531793850, -0.674778617385316410, -0.674815517551892400, -0.674852416031429980, +-0.674889312823836130, -0.674926207929019030, -0.674963101346886420, -0.674999993077346480, -0.675036883120306070, -0.675073771475673490, -0.675110658143356580, -0.675147543123263190, +-0.675184426415300740, -0.675221308019377190, -0.675258187935400380, -0.675295066163278390, -0.675331942702918410, -0.675368817554228620, -0.675405690717117090, -0.675442562191491010, +-0.675479431977258460, -0.675516300074327390, -0.675553166482605880, -0.675590031202001230, -0.675626894232421390, -0.675663755573774340, -0.675700615225968250, -0.675737473188910310, +-0.675774329462508590, -0.675811184046671180, -0.675848036941306020, -0.675884888146320420, -0.675921737661622670, -0.675958585487120620, -0.675995431622722350, -0.676032276068335270, +-0.676069118823867440, -0.676105959889227170, -0.676142799264321640, -0.676179636949059030, -0.676216472943347520, -0.676253307247094980, -0.676290139860208920, -0.676326970782597510, +-0.676363800014168740, -0.676400627554830660, -0.676437453404490800, -0.676474277563057220, -0.676511100030438020, -0.676547920806541360, -0.676584739891274540, -0.676621557284545870, +-0.676658372986263410, -0.676695186996335240, -0.676731999314668760, -0.676768809941172390, -0.676805618875754300, -0.676842426118321790, -0.676879231668783170, -0.676916035527046600, +-0.676952837693020170, -0.676989638166611290, -0.677026436947728350, -0.677063234036279440, -0.677100029432172620, -0.677136823135315420, -0.677173615145616250, -0.677210405462982950, +-0.677247194087324030, -0.677283981018546700, -0.677320766256559570, -0.677357549801270390, -0.677394331652587780, -0.677431111810418930, -0.677467890274672250, -0.677504667045256030, +-0.677541442122078340, -0.677578215505046710, -0.677614987194069540, -0.677651757189055240, -0.677688525489911210, -0.677725292096545970, -0.677762057008867380, -0.677798820226783950, +-0.677835581750203310, -0.677872341579033530, -0.677909099713183030, -0.677945856152559980, -0.677982610897072120, -0.678019363946627650, -0.678056115301134740, -0.678092864960501920, +-0.678129612924636580, -0.678166359193447250, -0.678203103766842010, -0.678239846644729250, -0.678276587827016720, -0.678313327313612600, -0.678350065104425410, -0.678386801199362900, +-0.678423535598333350, -0.678460268301244840, -0.678496999308006110, -0.678533728618524570, -0.678570456232708620, -0.678607182150466560, -0.678643906371706910, -0.678680628896337180, +-0.678717349724265780, -0.678754068855401020, -0.678790786289651500, -0.678827502026924660, -0.678864216067128990, -0.678900928410172910, -0.678937639055964710, -0.678974348004412140, +-0.679011055255423710, -0.679047760808907940, -0.679084464664772460, -0.679121166822925890, -0.679157867283276320, -0.679194566045732360, -0.679231263110201770, -0.679267958476593050, +-0.679304652144814280, -0.679341344114774310, -0.679378034386380670, -0.679414722959541860, -0.679451409834166300, -0.679488095010162500, -0.679524778487438200, -0.679561460265901920, +-0.679598140345461950, -0.679634818726027050, -0.679671495407504710, -0.679708170389803580, -0.679744843672832500, -0.679781515256498880, -0.679818185140711460, -0.679854853325378650, +-0.679891519810408960, -0.679928184595710140, -0.679964847681190920, -0.680001509066759600, -0.680038168752324810, -0.680074826737794180, -0.680111483023076560, -0.680148137608080240, +-0.680184790492713850, -0.680221441676885250, -0.680258091160502950, -0.680294738943475470, -0.680331385025711550, -0.680368029407118710, -0.680404672087605910, -0.680441313067081330, +-0.680477952345453830, -0.680514589922631140, -0.680551225798522010, -0.680587859973035060, -0.680624492446078140, -0.680661123217560000, -0.680697752287389050, -0.680734379655474120, +-0.680771005321722860, -0.680807629286044100, -0.680844251548346160, -0.680880872108538090, -0.680917490966527430, -0.680954108122223010, -0.680990723575533360, -0.681027337326367220, +-0.681063949374632440, -0.681100559720237750, -0.681137168363091680, -0.681173775303102970, -0.681210380540179570, -0.681246984074230230, -0.681283585905163690, -0.681320186032887800, +-0.681356784457311630, -0.681393381178343360, -0.681429976195891960, -0.681466569509865390, -0.681503161120172280, -0.681539751026721370, -0.681576339229421290, -0.681612925728180220, +-0.681649510522906680, -0.681686093613509400, -0.681722674999897250, -0.681759254681978070, -0.681795832659660710, -0.681832408932853800, -0.681868983501466190, -0.681905556365405840, +-0.681942127524581500, -0.681978696978902230, -0.682015264728275890, -0.682051830772611440, -0.682088395111817290, -0.682124957745802620, -0.682161518674475160, -0.682198077897743890, +-0.682234635415517430, -0.682271191227704740, -0.682307745334213680, -0.682344297734953310, -0.682380848429832270, -0.682417397418759290, -0.682453944701642560, -0.682490490278390930, +-0.682527034148913140, -0.682563576313118040, -0.682600116770913700, -0.682636655522209090, -0.682673192566912720, -0.682709727904933890, -0.682746261536180340, -0.682782793460561030, +-0.682819323677985150, -0.682855852188360650, -0.682892378991596490, -0.682928904087601430, -0.682965427476284300, -0.683001949157553410, -0.683038469131317600, -0.683074987397485620, +-0.683111503955966540, -0.683148018806668310, -0.683184531949500020, -0.683221043384370510, -0.683257553111188630, -0.683294061129862570, -0.683330567440301300, -0.683367072042413650, +-0.683403574936108700, -0.683440076121294430, -0.683476575597880000, -0.683513073365774490, -0.683549569424885870, -0.683586063775123430, -0.683622556416395800, -0.683659047348612050, +-0.683695536571680360, -0.683732024085509820, -0.683768509890009260, -0.683804993985087760, -0.683841476370653510, -0.683877957046615470, -0.683914436012882600, -0.683950913269363860, +-0.683987388815967660, -0.684023862652602840, -0.684060334779178490, -0.684096805195603560, -0.684133273901786240, -0.684169740897635830, -0.684206206183061380, -0.684242669757971100, +-0.684279131622274160, -0.684315591775879310, -0.684352050218695830, -0.684388506950631910, -0.684424961971596750, -0.684461415281499170, -0.684497866880248380, -0.684534316767752670, +-0.684570764943921000, -0.684607211408662540, -0.684643656161886380, -0.684680099203500700, -0.684716540533414800, -0.684752980151537520, -0.684789418057778150, -0.684825854252044900, +-0.684862288734247040, -0.684898721504293760, -0.684935152562093250, -0.684971581907555030, -0.685008009540587710, -0.685044435461100830, -0.685080859669002450, -0.685117282164201980, +-0.685153702946608270, -0.685190122016130610, -0.685226539372677300, -0.685262955016157750, -0.685299368946480690, -0.685335781163555650, -0.685372191667290690, -0.685408600457595330, +-0.685445007534378540, -0.685481412897549380, -0.685517816547016490, -0.685554218482689050, -0.685590618704476020, -0.685627017212286800, -0.685663414006029700, -0.685699809085614120, +-0.685736202450949350, -0.685772594101943690, -0.685808984038506540, -0.685845372260546870, -0.685881758767974190, -0.685918143560696800, -0.685954526638624000, -0.685990908001664960, +-0.686027287649728870, -0.686063665582724250, -0.686100041800560500, -0.686136416303146700, -0.686172789090392140, -0.686209160162205230, -0.686245529518495490, -0.686281897159171870, +-0.686318263084143900, -0.686354627293319860, -0.686390989786609280, -0.686427350563921570, -0.686463709625165230, -0.686500066970249570, -0.686536422599083650, -0.686572776511577110, +-0.686609128707638240, -0.686645479187176560, -0.686681827950101240, -0.686718174996321600, -0.686754520325746240, -0.686790863938284480, -0.686827205833845710, -0.686863546012339230, +-0.686899884473673450, -0.686936221217758100, -0.686972556244502040, -0.687008889553815010, -0.687045221145605400, -0.687081551019782850, -0.687117879176256660, -0.687154205614935340, +-0.687190530335728630, -0.687226853338545610, -0.687263174623295780, -0.687299494189887670, -0.687335812038230800, -0.687372128168234340, -0.687408442579807930, -0.687444755272860200, +-0.687481066247300430, -0.687517375503038150, -0.687553683039982650, -0.687589988858042570, -0.687626292957127630, -0.687662595337146910, -0.687698895998010040, -0.687735194939625540, +-0.687771492161903140, -0.687807787664752040, -0.687844081448081730, -0.687880373511800870, -0.687916663855819070, -0.687952952480045950, -0.687989239384390160, -0.688025524568761200, +-0.688061808033068490, -0.688098089777221640, -0.688134369801129190, -0.688170648104700740, -0.688206924687845720, -0.688243199550473750, -0.688279472692493450, -0.688315744113814460, +-0.688352013814346080, -0.688388281793998020, -0.688424548052678940, -0.688460812590298450, -0.688497075406765970, -0.688533336501991110, -0.688569595875882620, -0.688605853528350130, +-0.688642109459303260, -0.688678363668650870, -0.688714616156302470, -0.688750866922167690, -0.688787115966155940, -0.688823363288176060, -0.688859608888137910, -0.688895852765950670, +-0.688932094921524070, -0.688968335354766980, -0.689004574065589010, -0.689040811053899580, -0.689077046319608420, -0.689113279862624490, -0.689149511682857210, -0.689185741780216190, +-0.689221970154611170, -0.689258196805950800, -0.689294421734145010, -0.689330644939103570, -0.689366866420735080, -0.689403086178949410, -0.689439304213656180, -0.689475520524764800, +-0.689511735112184440, -0.689547947975824750, -0.689584159115595120, -0.689620368531405400, -0.689656576223164560, -0.689692782190782120, -0.689728986434167800, -0.689765188953231360, +-0.689801389747881630, -0.689837588818028370, -0.689873786163581190, -0.689909981784449840, -0.689946175680543170, -0.689982367851771140, -0.690018558298043480, -0.690054747019269170, +-0.690090934015357930, -0.690127119286219280, -0.690163302831763300, -0.690199484651898620, -0.690235664746535300, -0.690271843115582760, -0.690308019758951060, -0.690344194676548840, +-0.690380367868286270, -0.690416539334072650, -0.690452709073818060, -0.690488877087431340, -0.690525043374822460, -0.690561207935901030, -0.690597370770576810, -0.690633531878758870, +-0.690669691260357150, -0.690705848915281080, -0.690742004843440840, -0.690778159044745270, -0.690814311519104220, -0.690850462266427770, -0.690886611286624760, -0.690922758579605280, +-0.690958904145278940, -0.690995047983555600, -0.691031190094344330, -0.691067330477555200, -0.691103469133097610, -0.691139606060881650, -0.691175741260816380, -0.691211874732811760, +-0.691248006476777530, -0.691284136492623550, -0.691320264780258990, -0.691356391339593590, -0.691392516170537320, -0.691428639273000130, -0.691464760646890890, -0.691500880292119870, +-0.691536998208596930, -0.691573114396231150, -0.691609228854932590, -0.691645341584611000, -0.691681452585176330, -0.691717561856537650, -0.691753669398605160, -0.691789775211288480, +-0.691825879294497680, -0.691861981648141940, -0.691898082272131120, -0.691934181166375170, -0.691970278330784060, -0.692006373765266860, -0.692042467469733860, -0.692078559444094580, +-0.692114649688259310, -0.692150738202137020, -0.692186824985637990, -0.692222910038672090, -0.692258993361148710, -0.692295074952977710, -0.692331154814069150, -0.692367232944333000, +-0.692403309343678440, -0.692439384012015550, -0.692475456949254280, -0.692511528155304700, -0.692547597630075900, -0.692583665373478150, -0.692619731385421210, -0.692655795665815250, +-0.692691858214569580, -0.692727919031594140, -0.692763978116798910, -0.692800035470094170, -0.692836091091388880, -0.692872144980593460, -0.692908197137617750, -0.692944247562371720, +-0.692980296254764870, -0.693016343214707180, -0.693052388442108920, -0.693088431936879410, -0.693124473698928930, -0.693160513728167120, -0.693196552024504480, -0.693232588587850080, +-0.693268623418114130, -0.693304656515206670, -0.693340687879037910, -0.693376717509517130, -0.693412745406554620, -0.693448771570060130, -0.693484795999944060, -0.693520818696115700, +-0.693556839658485250, -0.693592858886962650, -0.693628876381458430, -0.693664892141881540, -0.693700906168142390, -0.693736918460151400, -0.693772929017817730, -0.693808937841051800, +-0.693844944929763450, -0.693880950283863100, -0.693916953903260030, -0.693952955787864530, -0.693988955937586800, -0.694024954352336910, -0.694060951032024250, -0.694096945976559350, +-0.694132939185851950, -0.694168930659812560, -0.694204920398350580, -0.694240908401376200, -0.694276894668799600, -0.694312879200531090, -0.694348861996480160, -0.694384843056556900, +-0.694420822380672040, -0.694456799968734660, -0.694492775820655270, -0.694528749936344060, -0.694564722315711200, -0.694600692958666220, -0.694636661865119520, -0.694672629034981170, +-0.694708594468161580, -0.694744558164570150, -0.694780520124117400, -0.694816480346713280, -0.694852438832268330, -0.694888395580691930, -0.694924350591894500, -0.694960303865786330, +-0.694996255402277610, -0.695032205201277950, -0.695068153262697770, -0.695104099586447480, -0.695140044172436690, -0.695175987020575810, -0.695211928130774930, -0.695247867502944540, +-0.695283805136994170, -0.695319741032834340, -0.695355675190375110, -0.695391607609527010, -0.695427538290199540, -0.695463467232303230, -0.695499394435748260, -0.695535319900445150, +-0.695571243626303510, -0.695607165613233660, -0.695643085861145870, -0.695679004369950670, -0.695714921139557680, -0.695750836169877430, -0.695786749460820090, -0.695822661012296170, +-0.695858570824215210, -0.695894478896487920, -0.695930385229024730, -0.695966289821735140, -0.696002192674530010, -0.696038093787319290, -0.696073993160013730, -0.696109890792522720, +-0.696145786684757130, -0.696181680836627010, -0.696217573248043010, -0.696253463918914850, -0.696289352849152940, -0.696325240038667690, -0.696361125487369610, -0.696397009195168340, +-0.696432891161974710, -0.696468771387698690, -0.696504649872251140, -0.696540526615541670, -0.696576401617480910, -0.696612274877979390, -0.696648146396946940, -0.696684016174293990, +-0.696719884209931140, -0.696755750503768810, -0.696791615055716850, -0.696827477865685770, -0.696863338933586100, -0.696899198259328330, -0.696935055842822230, -0.696970911683978510, +-0.697006765782707590, -0.697042618138919990, -0.697078468752525550, -0.697114317623434900, -0.697150164751558550, -0.697186010136807030, -0.697221853779090180, -0.697257695678318630, +-0.697293535834403230, -0.697329374247253720, -0.697365210916780720, -0.697401045842894750, -0.697436879025506440, -0.697472710464525520, -0.697508540159862970, -0.697544368111429060, +-0.697580194319134430, -0.697616018782889040, -0.697651841502603730, -0.697687662478188700, -0.697723481709554780, -0.697759299196611950, -0.697795114939270820, -0.697830928937441920, +-0.697866741191035980, -0.697902551699962960, -0.697938360464133490, -0.697974167483458090, -0.698009972757847600, -0.698045776287211980, -0.698081578071461760, -0.698117378110508000, +-0.698153176404260440, -0.698188972952630050, -0.698224767755527110, -0.698260560812862590, -0.698296352124546330, -0.698332141690489180, -0.698367929510601780, -0.698403715584794750, +-0.698439499912978160, -0.698475282495062850, -0.698511063330959360, -0.698546842420578410, -0.698582619763830180, -0.698618395360625310, -0.698654169210874420, -0.698689941314488470, +-0.698725711671377430, -0.698761480281452020, -0.698797247144623210, -0.698833012260801080, -0.698868775629896350, -0.698904537251819670, -0.698940297126481980, -0.698976055253793140, +-0.699011811633664220, -0.699047566266005840, -0.699083319150728850, -0.699119070287743230, -0.699154819676959920, -0.699190567318289440, -0.699226313211642970, -0.699262057356930480, +-0.699297799754062810, -0.699333540402950590, -0.699369279303504790, -0.699405016455635580, -0.699440751859253810, -0.699476485514270330, -0.699512217420595440, -0.699547947578140090, +-0.699583675986814700, -0.699619402646530550, -0.699655127557197610, -0.699690850718726720, -0.699726572131028850, -0.699762291794014720, -0.699798009707594650, -0.699833725871679580, +-0.699869440286180140, -0.699905152951007410, -0.699940863866071460, -0.699976573031283360, -0.700012280446553840, -0.700047986111793970, -0.700083690026913840, -0.700119392191824400, +-0.700155092606436820, -0.700190791270661190, -0.700226488184408580, -0.700262183347589830, -0.700297876760115790, -0.700333568421896870, -0.700369258332844020, -0.700404946492868000, +-0.700440632901879860, -0.700476317559789900, -0.700512000466509080, -0.700547681621948360, -0.700583361026018700, -0.700619038678630290, -0.700654714579694420, -0.700690388729121590, +-0.700726061126823120, -0.700761731772709280, -0.700797400666691050, -0.700833067808679380, -0.700868733198585340, -0.700904396836319110, -0.700940058721791880, -0.700975718854914830, +-0.701011377235598250, -0.701047033863753110, -0.701082688739290470, -0.701118341862121410, -0.701153993232156100, -0.701189642849305850, -0.701225290713481500, -0.701260936824594230, +-0.701296581182554330, -0.701332223787273000, -0.701367864638661080, -0.701403503736629740, -0.701439141081089400, -0.701474776671951240, -0.701510410509126100, -0.701546042592525290, +-0.701581672922058970, -0.701617301497638570, -0.701652928319175140, -0.701688553386579090, -0.701724176699761730, -0.701759798258633880, -0.701795418063106860, -0.701831036113090940, +-0.701866652408497550, -0.701902266949237410, -0.701937879735221930, -0.701973490766361510, -0.702009100042567220, -0.702044707563750260, -0.702080313329821900, -0.702115917340692340, +-0.702151519596273090, -0.702187120096474990, -0.702222718841209460, -0.702258315830386780, -0.702293911063918250, -0.702329504541715280, -0.702365096263688260, -0.702400686229748490, +-0.702436274439807050, -0.702471860893775220, -0.702507445591563420, -0.702543028533083040, -0.702578609718244930, -0.702614189146960830, -0.702649766819140820, -0.702685342734696410, +-0.702720916893538660, -0.702756489295578880, -0.702792059940727580, -0.702827628828896160, -0.702863195959995690, -0.702898761333937470, -0.702934324950632130, -0.702969886809990840, +-0.703005446911924900, -0.703041005256345720, -0.703076561843163690, -0.703112116672290230, -0.703147669743636740, -0.703183221057113840, -0.703218770612632940, -0.703254318410104990, +-0.703289864449441640, -0.703325408730553270, -0.703360951253351410, -0.703396492017747120, -0.703432031023651930, -0.703467568270976340, -0.703503103759631880, -0.703538637489529610, +-0.703574169460581160, -0.703609699672696930, -0.703645228125788340, -0.703680754819766770, -0.703716279754543650, -0.703751802930029480, -0.703787324346135890, -0.703822844002774170, +-0.703858361899855070, -0.703893878037290090, -0.703929392414990420, -0.703964905032867570, -0.704000415890832070, -0.704035924988795640, -0.704071432326669360, -0.704106937904364740, +-0.704142441721792520, -0.704177943778864220, -0.704213444075491140, -0.704248942611584660, -0.704284439387055540, -0.704319934401815280, -0.704355427655775190, -0.704390919148846880, +-0.704426408880940880, -0.704461896851968920, -0.704497383061842620, -0.704532867510472390, -0.704568350197770090, -0.704603831123646880, -0.704639310288014410, -0.704674787690783400, +-0.704710263331865370, -0.704745737211171620, -0.704781209328613990, -0.704816679684102890, -0.704852148277550160, -0.704887615108866990, -0.704923080177965230, -0.704958543484755400, +-0.704994005029149110, -0.705029464811057880, -0.705064922830393350, -0.705100379087066130, -0.705135833580987970, -0.705171286312070600, -0.705206737280224650, -0.705242186485361850, +-0.705277633927393620, -0.705313079606231570, -0.705348523521786560, -0.705383965673970210, -0.705419406062694040, -0.705454844687869560, -0.705490281549407630, -0.705525716647220080, +-0.705561149981218220, -0.705596581551313770, -0.705632011357417600, -0.705667439399441320, -0.705702865677296560, -0.705738290190894850, -0.705773712940147120, -0.705809133924965140, +-0.705844553145260290, -0.705879970600944430, -0.705915386291928290, -0.705950800218123620, -0.705986212379442370, -0.706021622775795170, -0.706057031407093970, -0.706092438273250190, +-0.706127843374175670, -0.706163246709781140, -0.706198648279978580, -0.706234048084679380, -0.706269446123795390, -0.706304842397237450, -0.706340236904917430, -0.706375629646746720, +-0.706411020622637280, -0.706446409832500070, -0.706481797276246710, -0.706517182953788960, -0.706552566865038530, -0.706587949009906400, -0.706623329388304300, -0.706658708000144300, +-0.706694084845337130, -0.706729459923794880, -0.706764833235428820, -0.706800204780151150, -0.706835574557872490, -0.706870942568505020, -0.706906308811960150, -0.706941673288149830, +-0.706977035996984910, -0.707012396938377590, -0.707047756112239130, -0.707083113518481630, -0.707118469157016040, -0.707153823027754310, -0.707189175130607970, -0.707224525465489080, +-0.707259874032308500, -0.707295220830978180, -0.707330565861410300, -0.707365909123515490, -0.707401250617206050, -0.707436590342393480, -0.707471928298989640, -0.707507264486905710, +-0.707542598906053750, -0.707577931556345190, -0.707613262437692070, -0.707648591550005480, -0.707683918893197480, -0.707719244467179600, -0.707754568271864000, -0.707789890307161660, +-0.707825210572984640, -0.707860529069244460, -0.707895845795853410, -0.707931160752722330, -0.707966473939763310, -0.708001785356888180, -0.708037095004008910, -0.708072402881036570, +-0.708107708987883220, -0.708143013324460950, -0.708178315890680810, -0.708213616686454880, -0.708248915711694900, -0.708284212966312940, -0.708319508450220180, -0.708354802163328690, +-0.708390094105549980, -0.708425384276796580, -0.708460672676979320, -0.708495959306010390, -0.708531244163801530, -0.708566527250264810, -0.708601808565311520, -0.708637088108853730, +-0.708672365880803290, -0.708707641881072160, -0.708742916109571630, -0.708778188566213770, -0.708813459250910880, -0.708848728163573920, -0.708883995304115170, -0.708919260672446370, +-0.708954524268479820, -0.708989786092126590, -0.709025046143298980, -0.709060304421908590, -0.709095560927867850, -0.709130815661087930, -0.709166068621480910, -0.709201319808958730, +-0.709236569223433590, -0.709271816864816770, -0.709307062733020350, -0.709342306827956180, -0.709377549149536660, -0.709412789697672960, -0.709448028472277280, -0.709483265473261790, +-0.709518500700537900, -0.709553734154017680, -0.709588965833613190, -0.709624195739236630, -0.709659423870799170, -0.709694650228213210, -0.709729874811390600, -0.709765097620243650, +-0.709800318654683520, -0.709835537914622730, -0.709870755399973020, -0.709905971110646790, -0.709941185046555350, -0.709976397207610850, -0.710011607593725390, -0.710046816204811250, +-0.710082023040779720, -0.710117228101543210, -0.710152431387013560, -0.710187632897103180, -0.710222832631723370, -0.710258030590786520, -0.710293226774204920, -0.710328421181889880, +-0.710363613813753790, -0.710398804669708730, -0.710433993749666870, -0.710469181053539730, -0.710504366581239720, -0.710539550332678790, -0.710574732307769240, -0.710609912506422580, +-0.710645090928551100, -0.710680267574066880, -0.710715442442882430, -0.710750615534908920, -0.710785786850059000, -0.710820956388244500, -0.710856124149377930, -0.710891290133370820, +-0.710926454340135350, -0.710961616769584140, -0.710996777421628590, -0.711031936296181110, -0.711067093393153770, -0.711102248712458970, -0.711137402254008340, -0.711172554017714060, +-0.711207704003488540, -0.711242852211243950, -0.711277998640892030, -0.711313143292345070, -0.711348286165515260, -0.711383427260315000, -0.711418566576655920, -0.711453704114450300, +-0.711488839873610560, -0.711523973854048860, -0.711559106055677180, -0.711594236478407580, -0.711629365122152690, -0.711664491986824020, -0.711699617072334200, -0.711734740378595410, +-0.711769861905519940, -0.711804981653019640, -0.711840099621006810, -0.711875215809393720, -0.711910330218092910, -0.711945442847016000, -0.711980553696075490, -0.712015662765183470, +-0.712050770054252660, -0.712085875563194690, -0.712120979291921970, -0.712156081240346910, -0.712191181408381780, -0.712226279795938550, -0.712261376402929520, -0.712296471229267420, +-0.712331564274863770, -0.712366655539631300, -0.712401745023482080, -0.712436832726328850, -0.712471918648083240, -0.712507002788657860, -0.712542085147964910, -0.712577165725917120, +-0.712612244522426110, -0.712647321537404400, -0.712682396770764500, -0.712717470222418830, -0.712752541892279210, -0.712787611780258290, -0.712822679886268240, -0.712857746210221800, +-0.712892810752030700, -0.712927873511607690, -0.712962934488864830, -0.712997993683715080, -0.713033051096069960, -0.713068106725842200, -0.713103160572944540, -0.713138212637288720, +-0.713173262918787240, -0.713208311417352640, -0.713243358132897630, -0.713278403065333850, -0.713313446214574150, -0.713348487580530710, -0.713383527163116480, -0.713418564962243100, +-0.713453600977823180, -0.713488635209769350, -0.713523667657994240, -0.713558698322409700, -0.713593727202928350, -0.713628754299462710, -0.713663779611925510, -0.713698803140228490, +-0.713733824884284500, -0.713768844844006270, -0.713803863019305540, -0.713838879410095270, -0.713873894016287760, -0.713908906837795840, -0.713943917874531260, -0.713978927126406980, +-0.714013934593335400, -0.714048940275229250, -0.714083944172000380, -0.714118946283561760, -0.714153946609825670, -0.714188945150705080, -0.714223941906111830, -0.714258936875958650, +-0.714293930060158290, -0.714328921458623260, -0.714363911071265620, -0.714398898897998240, -0.714433884938733940, -0.714468869193384590, -0.714503851661863140, -0.714538832344082000, +-0.714573811239954000, -0.714608788349391340, -0.714643763672306640, -0.714678737208612520, -0.714713708958221840, -0.714748678921046650, -0.714783647096999710, -0.714818613485993630, +-0.714853578087941370, -0.714888540902754780, -0.714923501930346930, -0.714958461170630330, -0.714993418623517840, -0.715028374288921520, -0.715063328166754220, -0.715098280256928680, +-0.715133230559357620, -0.715168179073953250, -0.715203125800628500, -0.715238070739296240, -0.715273013889868410, -0.715307955252257990, -0.715342894826377810, -0.715377832612140610, +-0.715412768609458680, -0.715447702818244660, -0.715482635238411380, -0.715517565869871920, -0.715552494712538230, -0.715587421766323280, -0.715622347031139800, -0.715657270506900640, +-0.715692192193518100, -0.715727112090905120, -0.715762030198974220, -0.715796946517638700, -0.715831861046810400, -0.715866773786402510, -0.715901684736327980, -0.715936593896499000, +-0.715971501266828400, -0.716006406847229160, -0.716041310637614110, -0.716076212637895450, -0.716111112847986450, -0.716146011267799530, -0.716180907897247860, -0.716215802736243630, +-0.716250695784700020, -0.716285587042529540, -0.716320476509645370, -0.716355364185959800, -0.716390250071385900, -0.716425134165836200, -0.716460016469224080, -0.716494896981461520, +-0.716529775702461790, -0.716564652632137870, -0.716599527770402030, -0.716634401117167470, -0.716669272672346810, -0.716704142435853230, -0.716739010407599130, -0.716773876587497360, +-0.716808740975460990, -0.716843603571403090, -0.716878464375235720, -0.716913323386872410, -0.716948180606225670, -0.716983036033208790, -0.717017889667734050, -0.717052741509714540, +-0.717087591559063210, -0.717122439815693240, -0.717157286279516800, -0.717192130950447090, -0.717226973828397400, -0.717261814913280120, -0.717296654205008100, -0.717331491703494530, +-0.717366327408652580, -0.717401161320394440, -0.717435993438633400, -0.717470823763282420, -0.717505652294254670, -0.717540479031462560, -0.717575303974819170, -0.717610127124237440, +-0.717644948479630780, -0.717679768040911490, -0.717714585807992740, -0.717749401780787500, -0.717784215959209050, -0.717819028343169800, -0.717853838932582920, -0.717888647727361500, +-0.717923454727418810, -0.717958259932667040, -0.717993063343019710, -0.718027864958390110, -0.718062664778690410, -0.718097462803834130, -0.718132259033734120, -0.718167053468303780, +-0.718201846107455520, -0.718236636951102620, -0.718271425999158280, -0.718306213251535430, -0.718340998708146940, -0.718375782368905870, -0.718410564233725400, -0.718445344302518720, +-0.718480122575198440, -0.718514899051677870, -0.718549673731870060, -0.718584446615688320, -0.718619217703045150, -0.718653986993853970, -0.718688754488028160, -0.718723520185480140, +-0.718758284086123300, -0.718793046189870720, -0.718827806496635910, -0.718862565006331280, -0.718897321718870110, -0.718932076634165810, -0.718966829752131440, -0.719001581072679860, +-0.719036330595724250, -0.719071078321177780, -0.719105824248953970, -0.719140568378965230, -0.719175310711125170, -0.719210051245346760, -0.719244789981543620, -0.719279526919628040, +-0.719314262059513760, -0.719348995401114080, -0.719383726944341720, -0.719418456689109980, -0.719453184635332030, -0.719487910782921510, -0.719522635131790820, -0.719557357681853580, +-0.719592078433022970, -0.719626797385212400, -0.719661514538334600, -0.719696229892303090, -0.719730943447030810, -0.719765655202431630, -0.719800365158417940, -0.719835073314903370, +-0.719869779671801100, -0.719904484229024640, -0.719939186986486730, -0.719973887944100890, -0.720008587101780280, -0.720043284459438440, -0.720077980016988200, -0.720112673774342960, +-0.720147365731416360, -0.720182055888121010, -0.720216744244370540, -0.720251430800078250, -0.720286115555157650, -0.720320798509521350, -0.720355479663083220, -0.720390159015756320, +-0.720424836567454370, -0.720459512318089910, -0.720494186267576770, -0.720528858415828140, -0.720563528762757640, -0.720598197308278010, -0.720632864052302980, -0.720667528994745730, +-0.720702192135519890, -0.720736853474538420, -0.720771513011714720, -0.720806170746962520, -0.720840826680194670, -0.720875480811324690, -0.720910133140266090, -0.720944783666932270, +-0.720979432391236410, -0.721014079313091800, -0.721048724432412080, -0.721083367749110860, -0.721118009263100880, -0.721152648974295980, -0.721187286882609250, -0.721221922987954840, +-0.721256557290245180, -0.721291189789394100, -0.721325820485315130, -0.721360449377921880, -0.721395076467127190, -0.721429701752844820, -0.721464325234988600, -0.721498946913471160, +-0.721533566788206350, -0.721568184859107680, -0.721602801126088770, -0.721637415589062580, -0.721672028247942850, -0.721706639102643100, -0.721741248153076940, -0.721775855399157450, +-0.721810460840798360, -0.721845064477913080, -0.721879666310415450, -0.721914266338218310, -0.721948864561235530, -0.721983460979380600, -0.722018055592567260, -0.722052648400708490, +-0.722087239403718220, -0.722121828601509970, -0.722156415993997050, -0.722191001581092950, -0.722225585362711420, -0.722260167338766190, -0.722294747509170220, -0.722329325873837360, +-0.722363902432681230, -0.722398477185615670, -0.722433050132553540, -0.722467621273408910, -0.722502190608095060, -0.722536758136526180, -0.722571323858615000, -0.722605887774275590, +-0.722640449883421470, -0.722675010185966470, -0.722709568681823680, -0.722744125370906930, -0.722778680253129860, -0.722813233328406410, -0.722847784596649670, -0.722882334057773360, +-0.722916881711691550, -0.722951427558317210, -0.722985971597564390, -0.723020513829346510, -0.723055054253577740, -0.723089592870170940, -0.723124129679040270, -0.723158664680099150, +-0.723193197873261750, -0.723227729258441140, -0.723262258835551060, -0.723296786604505360, -0.723331312565218100, -0.723365836717602130, -0.723400359061571630, -0.723434879597040230, +-0.723469398323921880, -0.723503915242129870, -0.723538430351577940, -0.723572943652180280, -0.723607455143849940, -0.723641964826500890, -0.723676472700047090, -0.723710978764402270, +-0.723745483019479830, -0.723779985465193620, -0.723814486101457490, -0.723848984928185390, -0.723883481945290510, -0.723917977152686910, -0.723952470550288440, -0.723986962138009170, +-0.724021451915762060, -0.724055939883461290, -0.724090426041020810, -0.724124910388354470, -0.724159392925375570, -0.724193873651998170, -0.724228352568136450, -0.724262829673703480, +-0.724297304968613440, -0.724331778452780180, -0.724366250126117770, -0.724400719988539390, -0.724435188039959320, -0.724469654280291200, -0.724504118709449200, -0.724538581327346610, +-0.724573042133897620, -0.724607501129016060, -0.724641958312616020, -0.724676413684610780, -0.724710867244914510, -0.724745318993440970, -0.724779768930104540, -0.724814217054818410, +-0.724848663367496650, -0.724883107868053320, -0.724917550556402390, -0.724951991432457370, -0.724986430496132430, -0.725020867747341650, -0.725055303185998420, -0.725089736812016940, +-0.725124168625311040, -0.725158598625795130, -0.725193026813382380, -0.725227453187986980, -0.725261877749523000, -0.725296300497904720, -0.725330721433045330, -0.725365140554859120, +-0.725399557863260050, -0.725433973358162400, -0.725468387039479470, -0.725502798907125660, -0.725537208961014810, -0.725571617201061230, -0.725606023627178300, -0.725640428239280320, +-0.725674831037281590, -0.725709232021095390, -0.725743631190636230, -0.725778028545817970, -0.725812424086554890, -0.725846817812760500, -0.725881209724349000, -0.725915599821234550, +-0.725949988103331450, -0.725984374570552980, -0.726018759222813560, -0.726053142060027360, -0.726087523082108440, -0.726121902288970440, -0.726156279680527870, -0.726190655256694460, +-0.726225029017384730, -0.726259400962512070, -0.726293771091991000, -0.726328139405735710, -0.726362505903659810, -0.726396870585677700, -0.726431233451703350, -0.726465594501651270, +-0.726499953735434860, -0.726534311152968630, -0.726568666754166540, -0.726603020538943100, -0.726637372507211830, -0.726671722658887130, -0.726706070993883180, -0.726740417512114270, +-0.726774762213494020, -0.726809105097936840, -0.726843446165357010, -0.726877785415668830, -0.726912122848785810, -0.726946458464622580, -0.726980792263093420, -0.727015124244111970, +-0.727049454407592830, -0.727083782753449980, -0.727118109281597920, -0.727152433991950400, -0.727186756884421690, -0.727221077958926100, -0.727255397215378130, -0.727289714653691410, +-0.727324030273780340, -0.727358344075559220, -0.727392656058942540, -0.727426966223843950, -0.727461274570177950, -0.727495581097858720, -0.727529885806800890, -0.727564188696917970, +-0.727598489768124690, -0.727632789020335120, -0.727667086453463900, -0.727701382067424630, -0.727735675862131840, -0.727769967837500250, -0.727804257993443390, -0.727838546329875990, +-0.727872832846712110, -0.727907117543866500, -0.727941400421252770, -0.727975681478785660, -0.728009960716379250, -0.728044238133948250, -0.728078513731406310, -0.728112787508668150, +-0.728147059465647950, -0.728181329602260450, -0.728215597918419280, -0.728249864414039160, -0.728284129089034390, -0.728318391943319600, -0.728352652976808510, -0.728386912189415760, +-0.728421169581056070, -0.728455425151643080, -0.728489678901091620, -0.728523930829315880, -0.728558180936230810, -0.728592429221749830, -0.728626675685787760, -0.728660920328259020, +-0.728695163149078340, -0.728729404148159340, -0.728763643325416990, -0.728797880680765340, -0.728832116214119360, -0.728866349925392900, -0.728900581814500460, -0.728934811881356560, +-0.728969040125875930, -0.729003266547972430, -0.729037491147560780, -0.729071713924555720, -0.729105934878871100, -0.729140154010421540, -0.729174371319121660, -0.729208586804886090, +-0.729242800467628790, -0.729277012307264490, -0.729311222323707710, -0.729345430516873170, -0.729379636886674730, -0.729413841433027120, -0.729448044155844970, -0.729482245055043000, +-0.729516444130535180, -0.729550641382236130, -0.729584836810060590, -0.729619030413923180, -0.729653222193737960, -0.729687412149419680, -0.729721600280882840, -0.729755786588042300, +-0.729789971070812000, -0.729824153729106690, -0.729858334562841440, -0.729892513571929970, -0.729926690756287240, -0.729960866115827670, -0.729995039650466420, -0.730029211360117230, +-0.730063381244694940, -0.730097549304114190, -0.730131715538289930, -0.730165879947136110, -0.730200042530567470, -0.730234203288498860, -0.730268362220845010, -0.730302519327519880, +-0.730336674608438540, -0.730370828063515390, -0.730404979692665600, -0.730439129495803030, -0.730473277472842520, -0.730507423623699250, -0.730541567948287060, -0.730575710446521030, +-0.730609851118315670, -0.730643989963585930, -0.730678126982245990, -0.730712262174210700, -0.730746395539394800, -0.730780527077713130, -0.730814656789079970, -0.730848784673409970, +-0.730882910730618170, -0.730917034960619330, -0.730951157363327610, -0.730985277938658080, -0.731019396686525270, -0.731053513606844340, -0.731087628699529260, -0.731121741964495090, +-0.731155853401656900, -0.731189963010928760, -0.731224070792225730, -0.731258176745462450, -0.731292280870554200, -0.731326383167414830, -0.731360483635959510, -0.731394582276102990, +-0.731428679087760330, -0.731462774070845700, -0.731496867225273960, -0.731530958550960290, -0.731565048047819410, -0.731599135715765620, -0.731633221554713890, -0.731667305564579260, +-0.731701387745276600, -0.731735468096720190, -0.731769546618825100, -0.731803623311506500, -0.731837698174678470, -0.731871771208256190, -0.731905842412154510, -0.731939911786288590, +-0.731973979330572510, -0.732008045044921450, -0.732042108929250370, -0.732076170983474220, -0.732110231207507400, -0.732144289601264990, -0.732178346164661820, -0.732212400897613190, +-0.732246453800033170, -0.732280504871837050, -0.732314554112939660, -0.732348601523256200, -0.732382647102700850, -0.732416690851188990, -0.732450732768635370, -0.732484772854955170, +-0.732518811110062900, -0.732552847533873400, -0.732586882126302190, -0.732620914887263440, -0.732654945816672450, -0.732688974914444070, -0.732723002180493470, -0.732757027614735160, +-0.732791051217084210, -0.732825072987455690, -0.732859092925764790, -0.732893111031925890, -0.732927127305854190, -0.732961141747464630, -0.732995154356672510, -0.733029165133392220, +-0.733063174077539070, -0.733097181189027890, -0.733131186467774200, -0.733165189913692170, -0.733199191526697100, -0.733233191306704390, -0.733267189253628440, -0.733301185367384530, +-0.733335179647887640, -0.733369172095053030, -0.733403162708795240, -0.733437151489029550, -0.733471138435671020, -0.733505123548634840, -0.733539106827835630, -0.733573088273188680, +-0.733607067884608940, -0.733641045662011830, -0.733675021605311840, -0.733708995714424270, -0.733742967989264310, -0.733776938429747120, -0.733810907035787330, -0.733844873807300240, +-0.733878838744201230, -0.733912801846404950, -0.733946763113826560, -0.733980722546381250, -0.734014680143984520, -0.734048635906550780, -0.734082589833995440, -0.734116541926233550, +-0.734150492183180740, -0.734184440604751300, -0.734218387190860740, -0.734252331941424250, -0.734286274856357220, -0.734320215935574280, -0.734354155178990720, -0.734388092586521820, +-0.734422028158082880, -0.734455961893588750, -0.734489893792954600, -0.734523823856095710, -0.734557752082927620, -0.734591678473364710, -0.734625603027322830, -0.734659525744717050, +-0.734693446625462210, -0.734727365669473830, -0.734761282876666980, -0.734795198246957160, -0.734829111780259110, -0.734863023476488240, -0.734896933335559940, -0.734930841357389510, +-0.734964747541891560, -0.734998651888981950, -0.735032554398575620, -0.735066455070588210, -0.735100353904934330, -0.735134250901529620, -0.735168146060289240, -0.735202039381128820, +-0.735235930863962990, -0.735269820508707370, -0.735303708315277470, -0.735337594283587910, -0.735371478413554550, -0.735405360705092330, -0.735439241158117100, -0.735473119772543370, +-0.735506996548287000, -0.735540871485263040, -0.735574744583387230, -0.735608615842574200, -0.735642485262739680, -0.735676352843798950, -0.735710218585667650, -0.735744082488260510, +-0.735777944551493150, -0.735811804775280850, -0.735845663159539360, -0.735879519704183530, -0.735913374409128850, -0.735947227274290960, -0.735981078299584810, -0.736014927484925810, +-0.736048774830229680, -0.736082620335411830, -0.736116464000387110, -0.736150305825071240, -0.736184145809379630, -0.736217983953227910, -0.736251820256530910, -0.736285654719204370, +-0.736319487341163810, -0.736353318122324740, -0.736387147062602110, -0.736420974161911550, -0.736454799420168560, -0.736488622837289000, -0.736522444413187480, -0.736556264147779860, +-0.736590082040981860, -0.736623898092708340, -0.736657712302875130, -0.736691524671397650, -0.736725335198191610, -0.736759143883171990, -0.736792950726254390, -0.736826755727354570, +-0.736860558886388020, -0.736894360203269820, -0.736928159677915810, -0.736961957310241280, -0.736995753100162190, -0.737029547047593490, -0.737063339152450810, -0.737097129414649890, +-0.737130917834106340, -0.737164704410735340, -0.737198489144452410, -0.737232272035173390, -0.737266053082813900, -0.737299832287289010, -0.737333609648514580, -0.737367385166406430, +-0.737401158840879420, -0.737434930671849620, -0.737468700659232420, -0.737502468802943790, -0.737536235102898670, -0.737569999559013030, -0.737603762171202380, -0.737637522939382560, +-0.737671281863468640, -0.737705038943376580, -0.737738794179021880, -0.737772547570320510, -0.737806299117187430, -0.737840048819538690, -0.737873796677289700, -0.737907542690356630, +-0.737941286858654340, -0.737975029182098900, -0.738008769660606130, -0.738042508294091130, -0.738076245082469830, -0.738109980025658090, -0.738143713123571520, -0.738177444376125420, +-0.738211173783235750, -0.738244901344818130, -0.738278627060788510, -0.738312350931062070, -0.738346072955554660, -0.738379793134182230, -0.738413511466860520, -0.738447227953504700, +-0.738480942594030850, -0.738514655388354700, -0.738548366336392090, -0.738582075438058430, -0.738615782693269440, -0.738649488101941310, -0.738683191663989210, -0.738716893379329110, +-0.738750593247876840, -0.738784291269548250, -0.738817987444258750, -0.738851681771924170, -0.738885374252460480, -0.738919064885783630, -0.738952753671808790, -0.738986440610452160, +-0.739020125701629340, -0.739053808945256520, -0.739087490341248880, -0.739121169889522590, -0.739154847589993280, -0.739188523442577130, -0.739222197447189420, -0.739255869603746230, +-0.739289539912163400, -0.739323208372356880, -0.739356874984242190, -0.739390539747735280, -0.739424202662752330, -0.739457863729208520, -0.739491522947020030, -0.739525180316102810, +-0.739558835836372830, -0.739592489507745590, -0.739626141330137040, -0.739659791303463150, -0.739693439427640210, -0.739727085702583160, -0.739760730128208530, -0.739794372704432050, +-0.739828013431170000, -0.739861652308337450, -0.739895289335850910, -0.739928924513626130, -0.739962557841579270, -0.739996189319625740, -0.740029818947681830, -0.740063446725663600, +-0.740097072653486450, -0.740130696731066570, -0.740164318958320020, -0.740197939335162980, -0.740231557861510740, -0.740265174537279690, -0.740298789362385580, -0.740332402336744910, +-0.740366013460272860, -0.740399622732885840, -0.740433230154499690, -0.740466835725030800, -0.740500439444394480, -0.740534041312507220, -0.740567641329284650, -0.740601239494643400, +-0.740634835808498760, -0.740668430270766900, -0.740702022881364440, -0.740735613640206570, -0.740769202547209570, -0.740802789602289740, -0.740836374805363020, -0.740869958156345270, +-0.740903539655152430, -0.740937119301700810, -0.740970697095906790, -0.741004273037685680, -0.741037847126953860, -0.741071419363627410, -0.741104989747622730, -0.741138558278855220, +-0.741172124957241380, -0.741205689782697300, -0.741239252755139240, -0.741272813874482630, -0.741306373140644070, -0.741339930553539860, -0.741373486113085620, -0.741407039819197640, +-0.741440591671791990, -0.741474141670785180, -0.741507689816092720, -0.741541236107631010, -0.741574780545316230, -0.741608323129064770, -0.741641863858792270, -0.741675402734415120, +-0.741708939755849390, -0.741742474923011710, -0.741776008235817350, -0.741809539694183170, -0.741843069298025130, -0.741876597047259610, -0.741910122941802360, -0.741943646981569780, +-0.741977169166478050, -0.742010689496443780, -0.742044207971382490, -0.742077724591210570, -0.742111239355844780, -0.742144752265200490, -0.742178263319194340, -0.742211772517742510, +-0.742245279860761610, -0.742278785348167160, -0.742312288979875780, -0.742345790755803650, -0.742379290675867280, -0.742412788739982510, -0.742446284948065750, -0.742479779300033170, +-0.742513271795801620, -0.742546762435286390, -0.742580251218404430, -0.742613738145071810, -0.742647223215205040, -0.742680706428719970, -0.742714187785533220, -0.742747667285561190, +-0.742781144928719610, -0.742814620714925320, -0.742848094644094510, -0.742881566716143580, -0.742915036930988590, -0.742948505288545950, -0.742981971788732040, -0.743015436431463620, +-0.743048899216656180, -0.743082360144226460, -0.743115819214090980, -0.743149276426166130, -0.743182731780367870, -0.743216185276612710, -0.743249636914817160, -0.743283086694897730, +-0.743316534616770390, -0.743349980680351630, -0.743383424885558310, -0.743416867232306040, -0.743450307720511570, -0.743483746350091400, -0.743517183120962160, -0.743550618033039680, +-0.743584051086240590, -0.743617482280481410, -0.743650911615678870, -0.743684339091748690, -0.743717764708607730, -0.743751188466172270, -0.743784610364359170, -0.743818030403084250, +-0.743851448582264260, -0.743884864901815710, -0.743918279361655220, -0.743951691961698750, -0.743985102701863020, -0.744018511582064560, -0.744051918602220090, -0.744085323762245570, +-0.744118727062057730, -0.744152128501573420, -0.744185528080708480, -0.744218925799379650, -0.744252321657503440, -0.744285715654996900, -0.744319107791775680, -0.744352498067756720, +-0.744385886482856530, -0.744419273036991850, -0.744452657730078740, -0.744486040562033930, -0.744519421532774170, -0.744552800642215960, -0.744586177890275590, -0.744619553276869680, +-0.744652926801914970, -0.744686298465328190, -0.744719668267025400, -0.744753036206923460, -0.744786402284939200, -0.744819766500988580, -0.744853128854988670, -0.744886489346855860, +-0.744919847976507010, -0.744953204743858400, -0.744986559648826760, -0.745019912691328720, -0.745053263871281120, -0.745086613188600140, -0.745119960643202630, -0.745153306235005200, +-0.745186649963924810, -0.745219991829877420, -0.745253331832780200, -0.745286669972549440, -0.745320006249102550, -0.745353340662355150, -0.745386673212224520, -0.745420003898627390, +-0.745453332721480070, -0.745486659680699380, -0.745519984776202070, -0.745553308007904980, -0.745586629375724400, -0.745619948879577280, -0.745653266519380240, -0.745686582295050360, +-0.745719896206503700, -0.745753208253657320, -0.745786518436427960, -0.745819826754732460, -0.745853133208487230, -0.745886437797609100, -0.745919740522014930, -0.745953041381621770, +-0.745986340376345590, -0.746019637506103560, -0.746052932770812750, -0.746086226170389330, -0.746119517704750380, -0.746152807373812510, -0.746186095177493120, -0.746219381115708070, +-0.746252665188374520, -0.746285947395409320, -0.746319227736729650, -0.746352506212251580, -0.746385782821892270, -0.746419057565568370, -0.746452330443197250, -0.746485601454695000, +-0.746518870599978680, -0.746552137878965240, -0.746585403291571750, -0.746618666837714380, -0.746651928517310440, -0.746685188330276640, -0.746718446276530170, -0.746751702355987200, +-0.746784956568565140, -0.746818208914180940, -0.746851459392750770, -0.746884708004192150, -0.746917954748421600, -0.746951199625356610, -0.746984442634913260, -0.747017683777008830, +-0.747050923051560070, -0.747084160458484470, -0.747117395997698000, -0.747150629669118160, -0.747183861472661690, -0.747217091408245880, -0.747250319475787130, -0.747283545675202500, +-0.747316770006408950, -0.747349992469323880, -0.747383213063863460, -0.747416431789944990, -0.747449648647485860, -0.747482863636402150, -0.747516076756611470, -0.747549288008030440, +-0.747582497390576470, -0.747615704904166070, -0.747648910548716410, -0.747682114324144440, -0.747715316230367470, -0.747748516267301880, -0.747781714434865070, -0.747814910732973900, +-0.747848105161545870, -0.747881297720497160, -0.747914488409745280, -0.747947677229207190, -0.747980864178800160, -0.748014049258440620, -0.748047232468046050, -0.748080413807533650, +-0.748113593276819920, -0.748146770875822260, -0.748179946604457520, -0.748213120462643320, -0.748246292450296060, -0.748279462567333020, -0.748312630813671390, -0.748345797189228450, +-0.748378961693920600, -0.748412124327665460, -0.748445285090380000, -0.748478443981981600, -0.748511601002386780, -0.748544756151513060, -0.748577909429277380, -0.748611060835597140, +-0.748644210370389080, -0.748677358033570490, -0.748710503825058440, -0.748743647744770420, -0.748776789792623080, -0.748809929968533570, -0.748843068272419750, -0.748876204704197910, +-0.748909339263785560, -0.748942471951099750, -0.748975602766058120, -0.749008731708577180, -0.749041858778574430, -0.749074983975967060, -0.749108107300672450, -0.749141228752607360, +-0.749174348331689170, -0.749207466037835170, -0.749240581870962650, -0.749273695830988460, -0.749306807917830110, -0.749339918131404660, -0.749373026471629730, -0.749406132938421950, +-0.749439237531698720, -0.749472340251377770, -0.749505441097375710, -0.749538540069610070, -0.749571637167998130, -0.749604732392457280, -0.749637825742904270, -0.749670917219256720, +-0.749704006821431900, -0.749737094549347340, -0.749770180402919870, -0.749803264382066900, -0.749836346486705720, -0.749869426716753940, -0.749902505072128300, -0.749935581552746420, +-0.749968656158525590, -0.750001728889383430, -0.750034799745236680, -0.750067868726002950, -0.750100935831599760, -0.750134001061943940, -0.750167064416953130, -0.750200125896544720, +-0.750233185500636220, -0.750266243229144480, -0.750299299081987110, -0.750332353059081520, -0.750365405160345330, -0.750398455385695380, -0.750431503735049300, -0.750464550208324370, +-0.750497594805438430, -0.750530637526308220, -0.750563678370851360, -0.750596717338985360, -0.750629754430627740, -0.750662789645695550, -0.750695822984106420, -0.750728854445777640, +-0.750761884030627050, -0.750794911738571490, -0.750827937569528590, -0.750860961523416190, -0.750893983600151140, -0.750927003799651050, -0.750960022121833440, -0.750993038566616030, +-0.751026053133915910, -0.751059065823650450, -0.751092076635737520, -0.751125085570094500, -0.751158092626638570, -0.751191097805287370, -0.751224101105958500, -0.751257102528569700, +-0.751290102073037810, -0.751323099739280580, -0.751356095527215610, -0.751389089436760750, -0.751422081467832960, -0.751455071620349860, -0.751488059894229400, -0.751521046289388430, +-0.751554030805744900, -0.751587013443216320, -0.751619994201720430, -0.751652973081174290, -0.751685950081495750, -0.751718925202602420, -0.751751898444411930, -0.751784869806841450, +-0.751817839289808720, -0.751850806893231470, -0.751883772617027550, -0.751916736461113900, -0.751949698425408260, -0.751982658509828480, -0.752015616714292400, -0.752048573038716860, +-0.752081527483019930, -0.752114480047119560, -0.752147430730932600, -0.752180379534377110, -0.752213326457370600, -0.752246271499831140, -0.752279214661675690, -0.752312155942822190, +-0.752345095343188270, -0.752378032862692000, -0.752410968501250330, -0.752443902258781220, -0.752476834135202280, -0.752509764130431690, -0.752542692244386300, -0.752575618476984180, +-0.752608542828143050, -0.752641465297780870, -0.752674385885814700, -0.752707304592162620, -0.752740221416742460, -0.752773136359471520, -0.752806049420267740, -0.752838960599048760, +-0.752871869895732740, -0.752904777310236860, -0.752937682842478970, -0.752970586492376800, -0.753003488259848420, -0.753036388144811110, -0.753069286147182830, -0.753102182266881300, +-0.753135076503824720, -0.753167968857930030, -0.753200859329115510, -0.753233747917298800, -0.753266634622397960, -0.753299519444330270, -0.753332402383013800, -0.753365283438366400, +-0.753398162610305900, -0.753431039898749820, -0.753463915303616230, -0.753496788824822960, -0.753529660462287530, -0.753562530215928010, -0.753595398085662000, -0.753628264071407930, +-0.753661128173082840, -0.753693990390604920, -0.753726850723892010, -0.753759709172862280, -0.753792565737433030, -0.753825420417522320, -0.753858273213048100, -0.753891124123928450, +-0.753923973150080750, -0.753956820291423080, -0.753989665547873390, -0.754022508919349850, -0.754055350405769650, -0.754088190007051180, -0.754121027723112400, -0.754153863553870930, +-0.754186697499244610, -0.754219529559151610, -0.754252359733510120, -0.754285188022237430, -0.754318014425251810, -0.754350838942471120, -0.754383661573813540, -0.754416482319196670, +-0.754449301178538480, -0.754482118151757030, -0.754514933238770610, -0.754547746439496620, -0.754580557753853240, -0.754613367181758420, -0.754646174723130560, -0.754678980377886830, +-0.754711784145945750, -0.754744586027225490, -0.754777386021643460, -0.754810184129117930, -0.754842980349567090, -0.754875774682908900, -0.754908567129061070, -0.754941357687941910, +-0.754974146359469240, -0.755006933143561490, -0.755039718040136140, -0.755072501049111500, -0.755105282170405620, -0.755138061403936800, -0.755170838749622540, -0.755203614207381250, +-0.755236387777130870, -0.755269159458789810, -0.755301929252275570, -0.755334697157506450, -0.755367463174400620, -0.755400227302876480, -0.755432989542851430, -0.755465749894243870, +-0.755498508356972300, -0.755531264930954130, -0.755564019616107860, -0.755596772412351460, -0.755629523319603540, -0.755662272337781380, -0.755695019466803620, -0.755727764706588310, +-0.755760508057053750, -0.755793249518117770, -0.755825989089698670, -0.755858726771714510, -0.755891462564083900, -0.755924196466724260, -0.755956928479554200, -0.755989658602491790, +-0.756022386835455640, -0.756055113178363050, -0.756087837631132850, -0.756120560193683120, -0.756153280865931920, -0.756185999647797420, -0.756218716539197920, -0.756251431540051920, +-0.756284144650277050, -0.756316855869791920, -0.756349565198514600, -0.756382272636363600, -0.756414978183256650, -0.756447681839112260, -0.756480383603848620, -0.756513083477384330, +-0.756545781459637130, -0.756578477550525320, -0.756611171749967500, -0.756643864057881870, -0.756676554474186360, -0.756709242998799600, -0.756741929631639780, -0.756774614372625050, +-0.756807297221673610, -0.756839978178704080, -0.756872657243635060, -0.756905334416383860, -0.756938009696869420, -0.756970683085009810, -0.757003354580723540, -0.757036024183928900, +-0.757068691894544290, -0.757101357712487880, -0.757134021637678070, -0.757166683670033150, -0.757199343809471510, -0.757232002055911680, -0.757264658409272260, -0.757297312869470660, +-0.757329965436425830, -0.757362616110056620, -0.757395264890280310, -0.757427911777015740, -0.757460556770181540, -0.757493199869695880, -0.757525841075477160, -0.757558480387443890, +-0.757591117805514470, -0.757623753329607190, -0.757656386959640660, -0.757689018695532960, -0.757721648537202810, -0.757754276484569170, -0.757786902537549210, -0.757819526696062010, +-0.757852148960025950, -0.757884769329360110, -0.757917387803981770, -0.757950004383809990, -0.757982619068763190, -0.758015231858759850, -0.758047842753718390, -0.758080451753557320, +-0.758113058858195130, -0.758145664067550350, -0.758178267381541370, -0.758210868800086700, -0.758243468323105410, -0.758276065950515000, -0.758308661682234320, -0.758341255518181990, +-0.758373847458277180, -0.758406437502437080, -0.758439025650580970, -0.758471611902627240, -0.758504196258494520, -0.758536778718101210, -0.758569359281366040, -0.758601937948207410, +-0.758634514718544040, -0.758667089592294340, -0.758699662569376930, -0.758732233649710870, -0.758764802833213680, -0.758797370119804530, -0.758829935509401920, -0.758862499001925040, +-0.758895060597291280, -0.758927620295420050, -0.758960178096229620, -0.758992733999638740, -0.759025288005566120, -0.759057840113930180, -0.759090390324649640, -0.759122938637643240, +-0.759155485052829370, -0.759188029570126880, -0.759220572189454270, -0.759253112910730830, -0.759285651733873970, -0.759318188658803070, -0.759350723685437210, -0.759383256813694010, +-0.759415788043492630, -0.759448317374751820, -0.759480844807390200, -0.759513370341326380, -0.759545893976479310, -0.759578415712767410, -0.759610935550109390, -0.759643453488424210, +-0.759675969527630280, -0.759708483667646430, -0.759740995908391950, -0.759773506249784350, -0.759806014691743140, -0.759838521234186710, -0.759871025877034700, -0.759903528620204490, +-0.759936029463615490, -0.759968528407186430, -0.760001025450835920, -0.760033520594483040, -0.760066013838046170, -0.760098505181444390, -0.760130994624596320, -0.760163482167420800, +-0.760195967809836450, -0.760228451551762880, -0.760260933393117620, -0.760293413333819950, -0.760325891373788700, -0.760358367512943390, -0.760390841751201530, -0.760423314088482630, +-0.760455784524705410, -0.760488253059788730, -0.760520719693651430, -0.760553184426212340, -0.760585647257390310, -0.760618108187104070, -0.760650567215272580, -0.760683024341814780, +-0.760715479566649870, -0.760747932889695780, -0.760780384310871800, -0.760812833830096900, -0.760845281447290470, -0.760877727162370230, -0.760910170975255710, -0.760942612885865730, +-0.760975052894119260, -0.761007490999935140, -0.761039927203232210, -0.761072361503929650, -0.761104793901946080, -0.761137224397200440, -0.761169652989611810, -0.761202079679099140, +-0.761234504465581720, -0.761266927348977500, -0.761299348329205980, -0.761331767406186690, -0.761364184579837340, -0.761396599850077680, -0.761429013216826320, -0.761461424680002550, +-0.761493834239525210, -0.761526241895313260, -0.761558647647285650, -0.761591051495361440, -0.761623453439459700, -0.761655853479499270, -0.761688251615399210, -0.761720647847079050, +-0.761753042174456720, -0.761785434597451850, -0.761817825115983280, -0.761850213729970860, -0.761882600439332200, -0.761914985243987150, -0.761947368143854550, -0.761979749138853580, +-0.762012128228903180, -0.762044505413922550, -0.762076880693830620, -0.762109254068546460, -0.762141625537989140, -0.762173995102077840, -0.762206362760732060, -0.762238728513869760, +-0.762271092361410770, -0.762303454303273950, -0.762335814339379140, -0.762368172469644170, -0.762400528693988780, -0.762432883012332030, -0.762465235424593100, -0.762497585930691060, +-0.762529934530545180, -0.762562281224074320, -0.762594626011197760, -0.762626968891834790, -0.762659309865904240, -0.762691648933326080, -0.762723986094018150, -0.762756321347900280, +-0.762788654694891650, -0.762820986134911890, -0.762853315667879170, -0.762885643293713110, -0.762917969012332890, -0.762950292823657890, -0.762982614727607090, -0.763014934724099760, +-0.763047252813054970, -0.763079568994392220, -0.763111883268030480, -0.763144195633889020, -0.763176506091887140, -0.763208814641944460, -0.763241121283979250, -0.763273426017911150, +-0.763305728843660100, -0.763338029761144290, -0.763370328770283210, -0.763402625870996390, -0.763434921063202990, -0.763467214346822300, -0.763499505721773610, -0.763531795187976090, +-0.763564082745349150, -0.763596368393811950, -0.763628652133283900, -0.763660933963684170, -0.763693213884932610, -0.763725491896947610, -0.763757767999648670, -0.763790042192955430, +-0.763822314476787720, -0.763854584851063500, -0.763886853315702940, -0.763919119870625220, -0.763951384515749620, -0.763983647250995660, -0.764015908076282610, -0.764048166991529660, +-0.764080423996656320, -0.764112679091581980, -0.764144932276225930, -0.764177183550508120, -0.764209432914346840, -0.764241680367661820, -0.764273925910372800, -0.764306169542399380, +-0.764338411263659980, -0.764370651074074650, -0.764402888973562570, -0.764435124962043360, -0.764467359039436300, -0.764499591205660910, -0.764531821460636470, -0.764564049804282500, +-0.764596276236518380, -0.764628500757263520, -0.764660723366438090, -0.764692944063960270, -0.764725162849750010, -0.764757379723726820, -0.764789594685810870, -0.764821807735920340, +-0.764854018873975190, -0.764886228099895150, -0.764918435413599380, -0.764950640815007630, -0.764982844304039290, -0.765015045880613750, -0.765047245544650640, -0.765079443296069470, +-0.765111639134789630, -0.765143833060730640, -0.765176025073812770, -0.765208215173954210, -0.765240403361075020, -0.765272589635095480, -0.765304773995933880, -0.765336956443510410, +-0.765369136977744450, -0.765401315598555730, -0.765433492305863660, -0.765465667099587850, -0.765497839979647930, -0.765530010945963400, -0.765562179998453880, -0.765594347137038780, +-0.765626512361637920, -0.765658675672171380, -0.765690837068557450, -0.765722996550716520, -0.765755154118568090, -0.765787309772032350, -0.765819463511027700, -0.765851615335474520, +-0.765883765245292230, -0.765915913240400540, -0.765948059320718970, -0.765980203486167350, -0.766012345736665210, -0.766044486072132160, -0.766076624492487920, -0.766108760997652240, +-0.766140895587545060, -0.766173028262085110, -0.766205159021192680, -0.766237287864787180, -0.766269414792789210, -0.766301539805117060, -0.766333662901691030, -0.766365784082430830, +-0.766397903347256330, -0.766430020696086900, -0.766462136128842510, -0.766494249645442660, -0.766526361245807310, -0.766558470929856070, -0.766590578697508570, -0.766622684548685210, +-0.766654788483304590, -0.766686890501287020, -0.766718990602552110, -0.766751088787020470, -0.766783185054610410, -0.766815279405242410, -0.766847371838836220, -0.766879462355311680, +-0.766911550954588410, -0.766943637636586240, -0.766975722401225020, -0.767007805248424490, -0.767039886178104370, -0.767071965190184610, -0.767104042284584950, -0.767136117461225790, +-0.767168190720025620, -0.767200262060905080, -0.767232331483784450, -0.767264398988582450, -0.767296464575219380, -0.767328528243615190, -0.767360589993689720, -0.767392649825362700, +-0.767424707738554090, -0.767456763733183720, -0.767488817809171330, -0.767520869966437090, -0.767552920204900510, -0.767584968524481660, -0.767617014925101040, -0.767649059406677270, +-0.767681101969130860, -0.767713142612381660, -0.767745181336350170, -0.767777218140955230, -0.767809253026117130, -0.767841285991756050, -0.767873317037791710, -0.767905346164143960, +-0.767937373370732980, -0.767969398657478490, -0.768001422024300550, -0.768033443471119020, -0.768065462997853940, -0.768097480604425730, -0.768129496290753220, -0.768161510056757040, +-0.768193521902357010, -0.768225531827473770, -0.768257539832026160, -0.768289545915934680, -0.768321550079119290, -0.768353552321500040, -0.768385552642997020, -0.768417551043530040, +-0.768449547523019080, -0.768481542081384420, -0.768513534718545890, -0.768545525434423450, -0.768577514228937720, -0.768609501102007760, -0.768641486053553980, -0.768673469083496430, +-0.768705450191755850, -0.768737429378251180, -0.768769406642902720, -0.768801381985630860, -0.768833355406355560, -0.768865326904996870, -0.768897296481474870, -0.768929264135709610, +-0.768961229867621170, -0.768993193677129590, -0.769025155564155070, -0.769057115528617770, -0.769089073570438100, -0.769121029689535330, -0.769152983885829870, -0.769184936159242550, +-0.769216886509692330, -0.769248834937099950, -0.769280781441385340, -0.769312726022468920, -0.769344668680270630, -0.769376609414710640, -0.769408548225709140, -0.769440485113186300, +-0.769472420077062290, -0.769504353117257180, -0.769536284233691140, -0.769568213426285010, -0.769600140694957750, -0.769632066039630190, -0.769663989460222410, -0.769695910956655240, +-0.769727830528847750, -0.769759748176720660, -0.769791663900194160, -0.769823577699188520, -0.769855489573623930, -0.769887399523420670, -0.769919307548498910, -0.769951213648778830, +-0.769983117824180830, -0.770015020074624860, -0.770046920400032090, -0.770078818800321250, -0.770110715275413530, -0.770142609825228970, -0.770174502449688440, -0.770206393148711090, +-0.770238281922217770, -0.770270168770128770, -0.770302053692364260, -0.770333936688844760, -0.770365817759490310, -0.770397696904221330, -0.770429574122958090, -0.770461449415621000, +-0.770493322782130230, -0.770525194222406730, -0.770557063736369560, -0.770588931323939910, -0.770620796985037830, -0.770652660719584380, -0.770684522527498640, -0.770716382408701660, +-0.770748240363113730, -0.770780096390655150, -0.770811950491246400, -0.770843802664807680, -0.770875652911259480, -0.770907501230522210, -0.770939347622516150, -0.770971192087161690, +-0.771003034624379910, -0.771034875234089870, -0.771066713916212730, -0.771098550670668680, -0.771130385497379000, -0.771162218396262640, -0.771194049367240790, -0.771225878410233820, +-0.771257705525162150, -0.771289530711946170, -0.771321353970506380, -0.771353175300763310, -0.771384994702637220, -0.771416812176048630, -0.771448627720918050, -0.771480441337165870, +-0.771512253024713160, -0.771544062783479310, -0.771575870613385170, -0.771607676514351470, -0.771639480486299160, -0.771671282529147520, -0.771703082642817620, -0.771734880827230070, +-0.771766677082305290, -0.771798471407963870, -0.771830263804126340, -0.771862054270713080, -0.771893842807644610, -0.771925629414841550, -0.771957414092224510, -0.771989196839714450, +-0.772020977657230880, -0.772052756544694740, -0.772084533502026770, -0.772116308529148140, -0.772148081625978030, -0.772179852792437840, -0.772211622028447950, -0.772243389333929000, +-0.772275154708801590, -0.772306918152986240, -0.772338679666403680, -0.772370439248974420, -0.772402196900618950, -0.772433952621258140, -0.772465706410812910, -0.772497458269202800, +-0.772529208196349180, -0.772560956192172470, -0.772592702256593930, -0.772624446389533090, -0.772656188590911120, -0.772687928860648740, -0.772719667198666470, -0.772751403604885030, +-0.772783138079225160, -0.772814870621607360, -0.772846601231952370, -0.772878329910180910, -0.772910056656213710, -0.772941781469971830, -0.772973504351374910, -0.773005225300344320, +-0.773036944316800590, -0.773068661400665100, -0.773100376551857480, -0.773132089770298790, -0.773163801055909870, -0.773195510408611560, -0.773227217828324380, -0.773258923314969150, +-0.773290626868466720, -0.773322328488737610, -0.773354028175702760, -0.773385725929282790, -0.773417421749398540, -0.773449115635971300, -0.773480807588920680, -0.773512497608167980, +-0.773544185693634150, -0.773575871845240350, -0.773607556062906320, -0.773639238346553460, -0.773670918696102380, -0.773702597111474160, -0.773734273592589280, -0.773765948139368830, +-0.773797620751733420, -0.773829291429604100, -0.773860960172901400, -0.773892626981546370, -0.773924291855460410, -0.773955954794563030, -0.773987615798775840, -0.774019274868019580, +-0.774050932002215750, -0.774082587201283980, -0.774114240465145760, -0.774145891793721840, -0.774177541186933380, -0.774209188644700900, -0.774240834166945560, -0.774272477753587980, +-0.774304119404549350, -0.774335759119750390, -0.774367396899112050, -0.774399032742555730, -0.774430666650001380, -0.774462298621370170, -0.774493928656583400, -0.774525556755562230, +-0.774557182918226730, -0.774588807144498180, -0.774620429434297650, -0.774652049787545980, -0.774683668204164340, -0.774715284684073360, -0.774746899227194310, -0.774778511833447920, +-0.774810122502755270, -0.774841731235037300, -0.774873338030215630, -0.774904942888209990, -0.774936545808942000, -0.774968146792332720, -0.774999745838303560, -0.775031342946774450, +-0.775062938117667020, -0.775094531350902340, -0.775126122646401130, -0.775157712004084790, -0.775189299423874050, -0.775220884905690190, -0.775252468449453950, -0.775284050055086720, +-0.775315629722509230, -0.775347207451642760, -0.775378783242408720, -0.775410357094727280, -0.775441929008519830, -0.775473498983708210, -0.775505067020212270, -0.775536633117953620, +-0.775568197276853440, -0.775599759496832800, -0.775631319777812630, -0.775662878119714240, -0.775694434522458680, -0.775725988985967010, -0.775757541510160410, -0.775789092094959830, +-0.775820640740286670, -0.775852187446062440, -0.775883732212207080, -0.775915275038642440, -0.775946815925289690, -0.775978354872070340, -0.776009891878904570, -0.776041426945714100, +-0.776072960072420100, -0.776104491258943650, -0.776136020505206030, -0.776167547811128290, -0.776199073176631730, -0.776230596601637400, -0.776262118086066710, -0.776293637629840600, +-0.776325155232881040, -0.776356670895107960, -0.776388184616443320, -0.776419696396808080, -0.776451206236124290, -0.776482714134311800, -0.776514220091292560, -0.776545724106987860, +-0.776577226181318750, -0.776608726314206630, -0.776640224505572680, -0.776671720755338190, -0.776703215063424320, -0.776734707429752480, -0.776766197854243830, -0.776797686336820340, +-0.776829172877401940, -0.776860657475910710, -0.776892140132267820, -0.776923620846395100, -0.776955099618212850, -0.776986576447642690, -0.777018051334606220, -0.777049524279024630, +-0.777080995280819200, -0.777112464339911210, -0.777143931456222180, -0.777175396629673280, -0.777206859860185890, -0.777238321147681320, -0.777269780492080950, -0.777301237893306740, +-0.777332693351278750, -0.777364146865919150, -0.777395598437149670, -0.777427048064890710, -0.777458495749064120, -0.777489941489591270, -0.777521385286393580, -0.777552827139392330, +-0.777584267048509140, -0.777615705013665280, -0.777647141034782050, -0.777678575111781070, -0.777710007244583610, -0.777741437433111080, -0.777772865677285650, -0.777804291977027380, +-0.777835716332258450, -0.777867138742900140, -0.777898559208874630, -0.777929977730102200, -0.777961394306504680, -0.777992808938003820, -0.778024221624520780, -0.778055632365977300, +-0.778087041162294770, -0.778118448013394580, -0.778149852919198250, -0.778181255879627280, -0.778212656894603280, -0.778244055964048110, -0.778275453087882260, -0.778306848266027700, +-0.778338241498406140, -0.778369632784939420, -0.778401022125548180, -0.778432409520154360, -0.778463794968679460, -0.778495178471045100, -0.778526560027172800, -0.778557939636984050, +-0.778589317300400600, -0.778620693017343710, -0.778652066787735130, -0.778683438611496360, -0.778714808488549570, -0.778746176418815270, -0.778777542402215420, -0.778808906438671840, +-0.778840268528106390, -0.778871628670439800, -0.778902986865594120, -0.778934343113490970, -0.778965697414052080, -0.778997049767198860, -0.779028400172852910, -0.779059748630936080, +-0.779091095141369870, -0.779122439704075910, -0.779153782318975810, -0.779185122985991300, -0.779216461705044550, -0.779247798476056070, -0.779279133298948050, -0.779310466173642860, +-0.779341797100060910, -0.779373126078124370, -0.779404453107755080, -0.779435778188874770, -0.779467101321404840, -0.779498422505267240, -0.779529741740383590, -0.779561059026675610, +-0.779592374364064920, -0.779623687752473260, -0.779654999191822460, -0.779686308682034700, -0.779717616223030600, -0.779748921814732430, -0.779780225457062050, -0.779811527149941620, +-0.779842826893291760, -0.779874124687034880, -0.779905420531092690, -0.779936714425386920, -0.779968006369839430, -0.779999296364371930, -0.780030584408906050, -0.780061870503363840, +-0.780093154647666930, -0.780124436841737160, -0.780155717085496800, -0.780186995378866600, -0.780218271721768940, -0.780249546114125560, -0.780280818555858850, -0.780312089046889530, +-0.780343357587140130, -0.780374624176532250, -0.780405888814987740, -0.780437151502428650, -0.780468412238776500, -0.780499671023953460, -0.780530927857881250, -0.780562182740481610, +-0.780593435671676610, -0.780624686651388510, -0.780655935679538170, -0.780687182756048090, -0.780718427880839890, -0.780749671053836300, -0.780780912274957830, -0.780812151544127200, +-0.780843388861266250, -0.780874624226296720, -0.780905857639140550, -0.780937089099719930, -0.780968318607956460, -0.780999546163772210, -0.781030771767089130, -0.781061995417829170, +-0.781093217115914060, -0.781124436861266650, -0.781155654653807430, -0.781186870493459140, -0.781218084380144280, -0.781249296313783590, -0.781280506294299680, -0.781311714321614500, +-0.781342920395650120, -0.781374124516328370, -0.781405326683571210, -0.781436526897300810, -0.781467725157439120, -0.781498921463908090, -0.781530115816629790, -0.781561308215526160, +-0.781592498660519830, -0.781623687151531740, -0.781654873688484410, -0.781686058271299890, -0.781717240899900800, -0.781748421574207990, -0.781779600294144170, -0.781810777059631310, +-0.781841951870591580, -0.781873124726946920, -0.781904295628619410, -0.781935464575531200, -0.781966631567604380, -0.781997796604760990, -0.782028959686922990, -0.782060120814013220, +-0.782091279985952630, -0.782122437202663830, -0.782153592464068900, -0.782184745770090560, -0.782215897120649760, -0.782247046515669230, -0.782278193955071140, -0.782309339438777560, +-0.782340482966710550, -0.782371624538792390, -0.782402764154945140, -0.782433901815090980, -0.782465037519152080, -0.782496171267050620, -0.782527303058709320, -0.782558432894049140, +-0.782589560772992910, -0.782620686695462700, -0.782651810661381450, -0.782682932670670020, -0.782714052723251230, -0.782745170819047380, -0.782776286957980630, -0.782807401139973160, +-0.782838513364947140, -0.782869623632824860, -0.782900731943528490, -0.782931838296980320, -0.782962942693102630, -0.782994045131817470, -0.783025145613047700, -0.783056244136714600, +-0.783087340702741000, -0.783118435311049410, -0.783149527961561230, -0.783180618654199300, -0.783211707388885790, -0.783242794165542990, -0.783273878984093170, -0.783304961844458750, +-0.783336042746561880, -0.783367121690324960, -0.783398198675670180, -0.783429273702519910, -0.783460346770796350, -0.783491417880422650, -0.783522487031319770, -0.783553554223410660, +-0.783584619456617730, -0.783615682730863680, -0.783646744046070040, -0.783677803402159420, -0.783708860799054330, -0.783739916236677050, -0.783770969714949970, -0.783802021233795500, +-0.783833070793136020, -0.783864118392893830, -0.783895164032991310, -0.783926207713350980, -0.783957249433895550, -0.783988289194546550, -0.784019326995226810, -0.784050362835858720, +-0.784081396716365230, -0.784112428636667750, -0.784143458596689210, -0.784174486596352030, -0.784205512635578690, -0.784236536714291500, -0.784267558832412950, -0.784298578989865440, +-0.784329597186571580, -0.784360613422453780, -0.784391627697434310, -0.784422640011436470, -0.784453650364381310, -0.784484658756192220, -0.784515665186791280, -0.784546669656101870, +-0.784577672164045170, -0.784608672710544350, -0.784639671295521810, -0.784670667918900060, -0.784701662580601700, -0.784732655280549140, -0.784763646018665000, -0.784794634794871660, +-0.784825621609091750, -0.784856606461247890, -0.784887589351262350, -0.784918570279058540, -0.784949549244557620, -0.784980526247682890, -0.785011501288357390, -0.785042474366502650, +-0.785073445482041720, -0.785104414634897110, -0.785135381824991430, -0.785166347052247420, -0.785197310316587460, -0.785228271617934180, -0.785259230956210310, -0.785290188331338350, +-0.785321143743240910, -0.785352097191840630, -0.785383048677060550, -0.785413998198822410, -0.785444945757049260, -0.785475891351663740, -0.785506834982589000, -0.785537776649746670, +-0.785568716353059910, -0.785599654092451250, -0.785630589867843620, -0.785661523679159420, -0.785692455526321390, -0.785723385409252240, -0.785754313327874710, -0.785785239282111300, +-0.785816163271884860, -0.785847085297118440, -0.785878005357733890, -0.785908923453654260, -0.785939839584802400, -0.785970753751101370, -0.786001665952473010, -0.786032576188840370, +-0.786063484460126420, -0.786094390766253650, -0.786125295107145020, -0.786156197482723030, -0.786187097892910640, -0.786217996337630450, -0.786248892816805320, -0.786279787330357970, +-0.786310679878211570, -0.786341570460288080, -0.786372459076510540, -0.786403345726801930, -0.786434230411085510, -0.786465113129282910, -0.786495993881317630, -0.786526872667112300, +-0.786557749486589740, -0.786588624339672800, -0.786619497226284330, -0.786650368146347150, -0.786681237099784100, -0.786712104086517930, -0.786742969106471460, -0.786773832159567530, +-0.786804693245729550, -0.786835552364879340, -0.786866409516940310, -0.786897264701835740, -0.786928117919487470, -0.786958969169818890, -0.786989818452752950, -0.787020665768212390, +-0.787051511116120260, -0.787082354496399290, -0.787113195908972330, -0.787144035353762540, -0.787174872830692650, -0.787205708339685510, -0.787236541880664050, -0.787267373453551910, +-0.787298203058270700, -0.787329030694744030, -0.787359856362894740, -0.787390680062646450, -0.787421501793920900, -0.787452321556641470, -0.787483139350731330, -0.787513955176113330, +-0.787544769032710420, -0.787575580920445660, -0.787606390839241890, -0.787637198789022160, -0.787668004769709440, -0.787698808781226670, -0.787729610823497460, -0.787760410896443660, +-0.787791208999988780, -0.787822005134055980, -0.787852799298568660, -0.787883591493448780, -0.787914381718619940, -0.787945169974005210, -0.787975956259527430, -0.788006740575109890, +-0.788037522920675420, -0.788068303296147190, -0.788099081701448160, -0.788129858136501380, -0.788160632601230040, -0.788191405095557630, -0.788222175619406110, -0.788252944172699310, +-0.788283710755359970, -0.788314475367312030, -0.788345238008477330, -0.788375998678779500, -0.788406757378141700, -0.788437514106486990, -0.788468268863738440, -0.788499021649819330, +-0.788529772464652610, -0.788560521308161460, -0.788591268180268920, -0.788622013080898300, -0.788652756009972760, -0.788683496967415690, -0.788714235953149380, -0.788744972967097560, +-0.788775708009183730, -0.788806441079330180, -0.788837172177460520, -0.788867901303497930, -0.788898628457365580, -0.788929353638986640, -0.788960076848284290, -0.788990798085181800, +-0.789021517349602240, -0.789052234641469010, -0.789082949960705050, -0.789113663307233870, -0.789144374680978980, -0.789175084081862650, -0.789205791509808520, -0.789236496964740080, +-0.789267200446580830, -0.789297901955253070, -0.789328601490680510, -0.789359299052786460, -0.789389994641494170, -0.789420688256726840, -0.789451379898407860, -0.789482069566460390, +-0.789512757260807830, -0.789543442981373360, -0.789574126728080250, -0.789604808500852350, -0.789635488299611830, -0.789666166124282640, -0.789696841974788070, -0.789727515851051940, +-0.789758187752996440, -0.789788857680545520, -0.789819525633622450, -0.789850191612150530, -0.789880855616053150, -0.789911517645253580, -0.789942177699675230, -0.789972835779241490, +-0.790003491883875640, -0.790034146013501080, -0.790064798168041650, -0.790095448347419740, -0.790126096551559190, -0.790156742780383390, -0.790187387033816190, -0.790218029311780090, +-0.790248669614198930, -0.790279307940995990, -0.790309944292094890, -0.790340578667418910, -0.790371211066891450, -0.790401841490436020, -0.790432469937975890, -0.790463096409434680, +-0.790493720904735690, -0.790524343423802960, -0.790554963966558780, -0.790585582532927210, -0.790616199122831650, -0.790646813736196160, -0.790677426372943140, -0.790708037032996520, +-0.790738645716279830, -0.790769252422716450, -0.790799857152230000, -0.790830459904743990, -0.790861060680181690, -0.790891659478466850, -0.790922256299522730, -0.790952851143273070, +-0.790983444009641270, -0.791014034898551380, -0.791044623809925910, -0.791075210743688810, -0.791105795699763690, -0.791136378678074630, -0.791166959678544110, -0.791197538701096210, +-0.791228115745654440, -0.791258690812142400, -0.791289263900483600, -0.791319835010601660, -0.791350404142420080, -0.791380971295862600, -0.791411536470852610, -0.791442099667313710, +-0.791472660885170210, -0.791503220124344490, -0.791533777384760720, -0.791564332666342520, -0.791594885969014060, -0.791625437292697740, -0.791655986637317950, -0.791686534002798090, +-0.791717079389062000, -0.791747622796033170, -0.791778164223635230, -0.791808703671791900, -0.791839241140426810, -0.791869776629463670, -0.791900310138826000, -0.791930841668438190, +-0.791961371218222740, -0.791991898788103830, -0.792022424378005190, -0.792052947987850970, -0.792083469617563820, -0.792113989267068110, -0.792144506936287350, -0.792175022625145390, +-0.792205536333565720, -0.792236048061472300, -0.792266557808788850, -0.792297065575438890, -0.792327571361346350, -0.792358075166434750, -0.792388576990628700, -0.792419076833850490, +-0.792449574696024620, -0.792480070577074920, -0.792510564476925470, -0.792541056395499100, -0.792571546332720090, -0.792602034288512280, -0.792632520262799290, -0.792663004255505070, +-0.792693486266553340, -0.792723966295867830, -0.792754444343372390, -0.792784920408990960, -0.792815394492647150, -0.792845866594264810, -0.792876336713768450, -0.792906804851080670, +-0.792937271006125880, -0.792967735178827900, -0.792998197369111040, -0.793028657576898220, -0.793059115802113860, -0.793089572044681560, -0.793120026304525380, -0.793150478581569170, +-0.793180928875736660, -0.793211377186952000, -0.793241823515138720, -0.793272267860220980, -0.793302710222122510, -0.793333150600767920, -0.793363588996079840, -0.793394025407982760, +-0.793424459836400640, -0.793454892281257870, -0.793485322742477410, -0.793515751219983630, -0.793546177713700400, -0.793576602223551860, -0.793607024749461650, -0.793637445291353940, +-0.793667863849152670, -0.793698280422781680, -0.793728695012165030, -0.793759107617226680, -0.793789518237891010, -0.793819926874081090, -0.793850333525721320, -0.793880738192735750, +-0.793911140875048770, -0.793941541572583450, -0.793971940285264300, -0.794002337013015260, -0.794032731755760390, -0.794063124513423760, -0.794093515285929200, -0.794123904073200990, +-0.794154290875162870, -0.794184675691739120, -0.794215058522853680, -0.794245439368431170, -0.794275818228394440, -0.794306195102668200, -0.794336569991176410, -0.794366942893843800, +-0.794397313810593310, -0.794427682741349450, -0.794458049686036500, -0.794488414644578310, -0.794518777616899150, -0.794549138602923090, -0.794579497602574070, -0.794609854615776490, +-0.794640209642454080, -0.794670562682531220, -0.794700913735931990, -0.794731262802581000, -0.794761609882401190, -0.794791954975317520, -0.794822298081254490, -0.794852639200135050, +-0.794882978331884040, -0.794913315476425630, -0.794943650633684000, -0.794973983803583200, -0.795004314986047400, -0.795034644181000780, -0.795064971388367630, -0.795095296608072100, +-0.795125619840038270, -0.795155941084190300, -0.795186260340453140, -0.795216577608749750, -0.795246892889004850, -0.795277206181142840, -0.795307517485088210, -0.795337826800764370, +-0.795368134128095930, -0.795398439467007170, -0.795428742817422260, -0.795459044179265500, -0.795489343552461150, -0.795519640936933390, -0.795549936332606620, -0.795580229739405010, +-0.795610521157252730, -0.795640810586074720, -0.795671098025794280, -0.795701383476335900, -0.795731666937624200, -0.795761948409583810, -0.795792227892137990, -0.795822505385211710, +-0.795852780888729020, -0.795883054402614420, -0.795913325926792200, -0.795943595461186650, -0.795973863005722150, -0.796004128560322990, -0.796034392124913560, -0.796064653699418030, +-0.796094913283761470, -0.796125170877867160, -0.796155426481659820, -0.796185680095063850, -0.796215931718004310, -0.796246181350404480, -0.796276428992189090, -0.796306674643282640, +-0.796336918303609530, -0.796367159973094150, -0.796397399651660790, -0.796427637339233940, -0.796457873035738120, -0.796488106741097490, -0.796518338455236560, -0.796548568178079950, +-0.796578795909552270, -0.796609021649577250, -0.796639245398079510, -0.796669467154984320, -0.796699686920214870, -0.796729904693696200, -0.796760120475352830, -0.796790334265109030, +-0.796820546062889430, -0.796850755868618530, -0.796880963682220720, -0.796911169503620510, -0.796941373332742400, -0.796971575169510780, -0.797001775013850280, -0.797031972865685830, +-0.797062168724940960, -0.797092362591540700, -0.797122554465409470, -0.797152744346472430, -0.797182932234652970, -0.797213118129876160, -0.797243302032066610, -0.797273483941148720, +-0.797303663857047210, -0.797333841779686470, -0.797364017708991120, -0.797394191644885790, -0.797424363587294960, -0.797454533536143260, -0.797484701491355640, -0.797514867452855820, +-0.797545031420568870, -0.797575193394419290, -0.797605353374332250, -0.797635511360231360, -0.797665667352041590, -0.797695821349687750, -0.797725973353094250, -0.797756123362185930, +-0.797786271376887180, -0.797816417397122830, -0.797846561422817510, -0.797876703453895610, -0.797906843490282070, -0.797936981531901960, -0.797967117578678890, -0.797997251630537920, +-0.798027383687403890, -0.798057513749201860, -0.798087641815855560, -0.798117767887290160, -0.798147891963430390, -0.798178014044200860, -0.798208134129526290, -0.798238252219331420, +-0.798268368313540870, -0.798298482412079350, -0.798328594514871700, -0.798358704621842550, -0.798388812732916620, -0.798418918848019190, -0.798449022967073980, -0.798479125090006180, +-0.798509225216741060, -0.798539323347202350, -0.798569419481315430, -0.798599513619004830, -0.798629605760195590, -0.798659695904812230, -0.798689784052779680, -0.798719870204022690, +-0.798749954358465960, -0.798780036516034350, -0.798810116676652690, -0.798840194840245710, -0.798870271006738800, -0.798900345176055680, -0.798930417348121650, -0.798960487522861530, +-0.798990555700200830, -0.799020621880063290, -0.799050686062374060, -0.799080748247058100, -0.799110808434040370, -0.799140866623245460, -0.799170922814598560, -0.799200977008024280, +-0.799231029203447570, -0.799261079400793270, -0.799291127599986220, -0.799321173800952020, -0.799351218003614190, -0.799381260207898460, -0.799411300413729430, -0.799441338621032840, +-0.799471374829732300, -0.799501409039753310, -0.799531441251020820, -0.799561471463459680, -0.799591499676994940, -0.799621525891551440, -0.799651550107054020, -0.799681572323427850, +-0.799711592540597760, -0.799741610758488600, -0.799771626977025970, -0.799801641196133730, -0.799831653415737480, -0.799861663635761940, -0.799891671856132860, -0.799921678076774060, +-0.799951682297611040, -0.799981684518568880, -0.800011684739572520, -0.800041682960546900, -0.800071679181417080, -0.800101673402108030, -0.800131665622544790, -0.800161655842652530, +-0.800191644062355990, -0.800221630281580330, -0.800251614500251170, -0.800281596718292470, -0.800311576935629710, -0.800341555152188630, -0.800371531367893070, -0.800401505582668650, +-0.800431477796440530, -0.800461448009133660, -0.800491416220673210, -0.800521382430984250, -0.800551346639991830, -0.800581308847621020, -0.800611269053796870, -0.800641227258444670, +-0.800671183461489360, -0.800701137662856550, -0.800731089862470440, -0.800761040060256610, -0.800790988256140150, -0.800820934450046760, -0.800850878641900520, -0.800880820831627040, +-0.800910761019151480, -0.800940699204399140, -0.800970635387294960, -0.801000569567764220, -0.801030501745731980, -0.801060431921123640, -0.801090360093864140, -0.801120286263878660, +-0.801150210431093130, -0.801180132595431530, -0.801210052756819560, -0.801239970915182400, -0.801269887070445890, -0.801299801222534190, -0.801329713371372930, -0.801359623516887390, +-0.801389531659002840, -0.801419437797644350, -0.801449341932737310, -0.801479244064207010, -0.801509144191978500, -0.801539042315977170, -0.801568938436128200, -0.801598832552357420, +-0.801628724664589120, -0.801658614772748910, -0.801688502876762190, -0.801718388976554670, -0.801748273072050770, -0.801778155163176190, -0.801808035249856110, -0.801837913332016040, +-0.801867789409581140, -0.801897663482476820, -0.801927535550628230, -0.801957405613960890, -0.801987273672400080, -0.802017139725870960, -0.802047003774299050, -0.802076865817610170, +-0.802106725855728620, -0.802136583888580220, -0.802166439916090930, -0.802196293938184920, -0.802226145954788250, -0.802255995965826200, -0.802285843971224160, -0.802315689970907520, +-0.802345533964801680, -0.802375375952831930, -0.802405215934923750, -0.802435053911002670, -0.802464889880993740, -0.802494723844822790, -0.802524555802415440, -0.802554385753696200, +-0.802584213698591010, -0.802614039637025160, -0.802643863568924920, -0.802673685494214470, -0.802703505412819650, -0.802733323324666290, -0.802763139229679460, -0.802792953127784870, +-0.802822765018907810, -0.802852574902973900, -0.802882382779908530, -0.802912188649637200, -0.802941992512085420, -0.802971794367179140, -0.803001594214842960, -0.803031392055002740, +-0.803061187887583960, -0.803090981712512810, -0.803120773529713670, -0.803150563339112610, -0.803180351140635130, -0.803210136934206730, -0.803239920719753030, -0.803269702497199530, +-0.803299482266471740, -0.803329260027495270, -0.803359035780195630, -0.803388809524498430, -0.803418581260329720, -0.803448350987614020, -0.803478118706277500, -0.803507884416245650, +-0.803537648117444660, -0.803567409809798900, -0.803597169493234680, -0.803626927167677580, -0.803656682833053140, -0.803686436489286950, -0.803716188136304740, -0.803745937774032030, +-0.803775685402394410, -0.803805431021317630, -0.803835174630727290, -0.803864916230549010, -0.803894655820708960, -0.803924393401131750, -0.803954128971743560, -0.803983862532470560, +-0.804013594083237470, -0.804043323623970240, -0.804073051154594820, -0.804102776675036710, -0.804132500185221640, -0.804162221685075340, -0.804191941174523530, -0.804221658653491820, +-0.804251374121905950, -0.804281087579691630, -0.804310799026774710, -0.804340508463081250, -0.804370215888535970, -0.804399921303065150, -0.804429624706594510, -0.804459326099050460, +-0.804489025480357390, -0.804518722850441900, -0.804548418209229510, -0.804578111556646160, -0.804607802892617460, -0.804637492217069260, -0.804667179529927390, -0.804696864831117460, +-0.804726548120565430, -0.804756229398197020, -0.804785908663938620, -0.804815585917714850, -0.804845261159452210, -0.804874934389076310, -0.804904605606513670, -0.804934274811689000, +-0.804963942004528590, -0.804993607184958380, -0.805023270352904110, -0.805052931508291600, -0.805082590651046930, -0.805112247781095690, -0.805141902898363740, -0.805171556002777120, +-0.805201207094261680, -0.805230856172743700, -0.805260503238148020, -0.805290148290401020, -0.805319791329428770, -0.805349432355157550, -0.805379071367512190, -0.805408708366419090, +-0.805438343351804310, -0.805467976323593680, -0.805497607281713050, -0.805527236226088460, -0.805556863156645760, -0.805586488073310900, -0.805616110976009820, -0.805645731864668480, +-0.805675350739212700, -0.805704967599569220, -0.805734582445662760, -0.805764195277419830, -0.805793806094766920, -0.805823414897628990, -0.805853021685932420, -0.805882626459603400, +-0.805912229218567870, -0.805941829962751650, -0.805971428692080940, -0.806001025406481550, -0.806030620105879780, -0.806060212790201350, -0.806089803459372310, -0.806119392113318840, +-0.806148978751967450, -0.806178563375243070, -0.806208145983072220, -0.806237726575381060, -0.806267305152096100, -0.806296881713142400, -0.806326456258446460, -0.806356028787934330, +-0.806385599301532200, -0.806415167799166000, -0.806444734280761910, -0.806474298746245990, -0.806503861195544290, -0.806533421628582990, -0.806562980045288150, -0.806592536445586370, +-0.806622090829402730, -0.806651643196663830, -0.806681193547295840, -0.806710741881225380, -0.806740288198377510, -0.806769832498678950, -0.806799374782055880, -0.806828915048434350, +-0.806858453297740420, -0.806887989529900480, -0.806917523744840490, -0.806947055942486720, -0.806976586122765350, -0.807006114285602430, -0.807035640430924790, -0.807065164558657510, +-0.807094686668727410, -0.807124206761060450, -0.807153724835583560, -0.807183240892221930, -0.807212754930902050, -0.807242266951550320, -0.807271776954093020, -0.807301284938456210, +-0.807330790904566160, -0.807360294852349170, -0.807389796781731390, -0.807419296692639230, -0.807448794584998740, -0.807478290458736760, -0.807507784313778560, -0.807537276150051000, +-0.807566765967480120, -0.807596253765992870, -0.807625739545514530, -0.807655223305971840, -0.807684705047290950, -0.807714184769398490, -0.807743662472220400, -0.807773138155683300, +-0.807802611819713250, -0.807832083464236740, -0.807861553089179950, -0.807891020694469390, -0.807920486280031100, -0.807949949845792270, -0.807979411391677950, -0.808008870917615200, +-0.808038328423530180, -0.808067783909349970, -0.808097237374999720, -0.808126688820406280, -0.808156138245496260, -0.808185585650195830, -0.808215031034431490, -0.808244474398129520, +-0.808273915741216320, -0.808303355063618390, -0.808332792365262120, -0.808362227646073790, -0.808391660905980470, -0.808421092144907430, -0.808450521362781730, -0.808479948559529650, +-0.808509373735078250, -0.808538796889352820, -0.808568218022280520, -0.808597637133787630, -0.808627054223800660, -0.808656469292245990, -0.808685882339050250, -0.808715293364139720, +-0.808744702367441000, -0.808774109348880500, -0.808803514308384710, -0.808832917245880690, -0.808862318161293840, -0.808891717054551210, -0.808921113925579300, -0.808950508774305080, +-0.808979901600654140, -0.809009292404553330, -0.809038681185929360, -0.809068067944708760, -0.809097452680817900, -0.809126835394183400, -0.809156216084731870, -0.809185594752389710, +-0.809214971397083650, -0.809244346018740180, -0.809273718617286250, -0.809303089192647600, -0.809332457744751270, -0.809361824273523660, -0.809391188778892160, -0.809420551260782050, +-0.809449911719120620, -0.809479270153834360, -0.809508626564849900, -0.809537980952093950, -0.809567333315493020, -0.809596683654973840, -0.809626031970462790, -0.809655378261886830, +-0.809684722529172340, -0.809714064772246060, -0.809743404991035030, -0.809772743185465100, -0.809802079355463220, -0.809831413500956220, -0.809860745621871160, -0.809890075718133760, +-0.809919403789671200, -0.809948729836410090, -0.809978053858277150, -0.810007375855199110, -0.810036695827102580, -0.810066013773914300, -0.810095329695560970, -0.810124643591969340, +-0.810153955463066120, -0.810183265308778600, -0.810212573129032280, -0.810241878923754540, -0.810271182692872240, -0.810300484436312420, -0.810329784154000810, -0.810359081845864800, +-0.810388377511831020, -0.810417671151826280, -0.810446962765777430, -0.810476252353611200, -0.810505539915254310, -0.810534825450633600, -0.810564108959675790, -0.810593390442307720, +-0.810622669898456660, -0.810651947328048460, -0.810681222731010400, -0.810710496107269200, -0.810739767456752360, -0.810769036779385500, -0.810798304075096120, -0.810827569343810950, +-0.810856832585456930, -0.810886093799960680, -0.810915352987249370, -0.810944610147249500, -0.810973865279888240, -0.811003118385092310, -0.811032369462788560, -0.811061618512904370, +-0.811090865535365690, -0.811120110530099690, -0.811149353497033540, -0.811178594436094520, -0.811207833347208470, -0.811237070230302890, -0.811266305085304620, -0.811295537912140490, +-0.811324768710737660, -0.811353997481022770, -0.811383224222922970, -0.811412448936365100, -0.811441671621276120, -0.811470892277582840, -0.811500110905212460, -0.811529327504092350, +-0.811558542074148350, -0.811587754615307970, -0.811616965127498700, -0.811646173610646620, -0.811675380064678990, -0.811704584489522870, -0.811733786885105450, -0.811762987251353430, +-0.811792185588193990, -0.811821381895554080, -0.811850576173360760, -0.811879768421540970, -0.811908958640021770, -0.811938146828730110, -0.811967332987593720, -0.811996517116538420, +-0.812025699215491730, -0.812054879284380910, -0.812084057323133380, -0.812113233331675180, -0.812142407309933920, -0.812171579257836670, -0.812200749175310380, -0.812229917062282310, +-0.812259082918679320, -0.812288246744428790, -0.812317408539457550, -0.812346568303692780, -0.812375726037061650, -0.812404881739491660, -0.812434035410908970, -0.812463187051241210, +-0.812492336660415430, -0.812521484238359350, -0.812550629784999030, -0.812579773300262210, -0.812608914784075930, -0.812638054236367370, -0.812667191657063580, -0.812696327046091960, +-0.812725460403379340, -0.812754591728853230, -0.812783721022440560, -0.812812848284068630, -0.812841973513665050, -0.812871096711156090, -0.812900217876469270, -0.812929337009532070, +-0.812958454110271900, -0.812987569178615140, -0.813016682214489420, -0.813045793217822110, -0.813074902188540170, -0.813104009126571100, -0.813133114031841850, -0.813162216904279920, +-0.813191317743812480, -0.813220416550366700, -0.813249513323869850, -0.813278608064249340, -0.813307700771432660, -0.813336791445346320, -0.813365880085918040, -0.813394966693075430, +-0.813424051266745000, -0.813453133806854360, -0.813482214313331010, -0.813511292786102010, -0.813540369225094870, -0.813569443630236640, -0.813598516001454940, -0.813627586338676930, +-0.813656654641830010, -0.813685720910841350, -0.813714785145638440, -0.813743847346149130, -0.813772907512299580, -0.813801965644017860, -0.813831021741231120, -0.813860075803867430, +-0.813889127831852970, -0.813918177825115770, -0.813947225783583030, -0.813976271707182340, -0.814005315595840880, -0.814034357449486160, -0.814063397268045550, -0.814092435051446460, +-0.814121470799616280, -0.814150504512482390, -0.814179536189972850, -0.814208565832013840, -0.814237593438533410, -0.814266619009459070, -0.814295642544718650, -0.814324664044238640, +-0.814353683507947010, -0.814382700935771140, -0.814411716327638420, -0.814440729683476580, -0.814469741003212790, -0.814498750286774650, -0.814527757534089680, -0.814556762745085370, +-0.814585765919689010, -0.814614767057828870, -0.814643766159431240, -0.814672763224424280, -0.814701758252735280, -0.814730751244292510, -0.814759742199022250, -0.814788731116852680, +-0.814817717997711300, -0.814846702841525610, -0.814875685648223210, -0.814904666417731520, -0.814933645149978240, -0.814962621844890770, -0.814991596502396830, -0.815020569122423820, +-0.815049539704899460, -0.815078508249751700, -0.815107474756907150, -0.815136439226293970, -0.815165401657840240, -0.815194362051472330, -0.815223320407118650, -0.815252276724706680, +-0.815281231004163940, -0.815310183245418150, -0.815339133448396920, -0.815368081613027870, -0.815397027739238610, -0.815425971826956750, -0.815454913876110020, -0.815483853886625920, +-0.815512791858432730, -0.815541727791457060, -0.815570661685627090, -0.815599593540870420, -0.815628523357115330, -0.815657451134288450, -0.815686376872317820, -0.815715300571131290, +-0.815744222230656570, -0.815773141850821280, -0.815802059431553150, -0.815830974972779790, -0.815859888474429030, -0.815888799936428600, -0.815917709358706110, -0.815946616741189960, +-0.815975522083806640, -0.816004425386484540, -0.816033326649151400, -0.816062225871735380, -0.816091123054163430, -0.816120018196363590, -0.816148911298263610, -0.816177802359791540, +-0.816206691380874870, -0.816235578361441450, -0.816264463301419110, -0.816293346200735570, -0.816322227059318670, -0.816351105877096250, -0.816379982653996580, -0.816408857389946510, +-0.816437730084874190, -0.816466600738707580, -0.816495469351374960, -0.816524335922803160, -0.816553200452920570, -0.816582062941654920, -0.816610923388934150, -0.816639781794685990, +-0.816668638158838500, -0.816697492481319290, -0.816726344762056410, -0.816755195000977710, -0.816784043198010900, -0.816812889353084160, -0.816841733466125540, -0.816870575537062220, +-0.816899415565822350, -0.816928253552334450, -0.816957089496525460, -0.816985923398323770, -0.817014755257657210, -0.817043585074453850, -0.817072412848641410, -0.817101238580148050, +-0.817130062268901500, -0.817158883914829830, -0.817187703517860960, -0.817216521077922860, -0.817245336594943360, -0.817274150068851180, -0.817302961499573040, -0.817331770887037460, +-0.817360578231172470, -0.817389383531906490, -0.817418186789166670, -0.817446988002881290, -0.817475787172978420, -0.817504584299386220, -0.817533379382032410, -0.817562172420845280, +-0.817590963415752660, -0.817619752366682610, -0.817648539273563180, -0.817677324136322440, -0.817706106954888880, -0.817734887729189450, -0.817763666459152990, -0.817792443144707230, +-0.817821217785780870, -0.817849990382301000, -0.817878760934196200, -0.817907529441394440, -0.817936295903823880, -0.817965060321412470, -0.817993822694088600, -0.818022583021779990, +-0.818051341304415040, -0.818080097541921680, -0.818108851734228090, -0.818137603881262890, -0.818166353982953230, -0.818195102039227630, -0.818223848050014250, -0.818252592015241810, +-0.818281333934837370, -0.818310073808729550, -0.818338811636846630, -0.818367547419116550, -0.818396281155467700, -0.818425012845828140, -0.818453742490126030, -0.818482470088289560, +-0.818511195640246990, -0.818539919145926390, -0.818568640605255910, -0.818597360018164410, -0.818626077384579040, -0.818654792704428420, -0.818683505977641280, -0.818712217204144890, +-0.818740926383868080, -0.818769633516738820, -0.818798338602685470, -0.818827041641636330, -0.818855742633519570, -0.818884441578263570, -0.818913138475796280, -0.818941833326046200, +-0.818970526128941610, -0.818999216884410690, -0.819027905592382140, -0.819056592252783380, -0.819085276865543220, -0.819113959430589730, -0.819142639947851970, -0.819171318417256990, +-0.819199994838733740, -0.819228669212210600, -0.819257341537615650, -0.819286011814877480, -0.819314680043924160, -0.819343346224684190, -0.819372010357085840, -0.819400672441057520, +-0.819429332476527490, -0.819457990463424600, -0.819486646401676230, -0.819515300291211330, -0.819543952131958080, -0.819572601923845510, -0.819601249666800920, -0.819629895360753260, +-0.819658539005630790, -0.819687180601361920, -0.819715820147875250, -0.819744457645098960, -0.819773093092961420, -0.819801726491391270, -0.819830357840316770, -0.819858987139666430, +-0.819887614389369080, -0.819916239589352110, -0.819944862739544700, -0.819973483839875010, -0.820002102890272200, -0.820030719890663560, -0.820059334840978150, -0.820087947741144460, +-0.820116558591090780, -0.820145167390745830, -0.820173774140037890, -0.820202378838895460, -0.820230981487247160, -0.820259582085021370, -0.820288180632146700, -0.820316777128551440, +-0.820345371574164870, -0.820373963968914380, -0.820402554312728900, -0.820431142605537620, -0.820459728847267920, -0.820488313037848860, -0.820516895177209050, -0.820545475265276990, +-0.820574053301981300, -0.820602629287250470, -0.820631203221013020, -0.820659775103197540, -0.820688344933732660, -0.820716912712546990, -0.820745478439568910, -0.820774042114727710, +-0.820802603737950890, -0.820831163309167610, -0.820859720828306380, -0.820888276295296370, -0.820916829710065080, -0.820945381072541780, -0.820973930382655090, -0.821002477640333520, +-0.821031022845505660, -0.821059565998100370, -0.821088107098046140, -0.821116646145271580, -0.821145183139705530, -0.821173718081276370, -0.821202250969913510, -0.821230781805544540, +-0.821259310588098530, -0.821287837317504320, -0.821316361993691070, -0.821344884616586280, -0.821373405186119340, -0.821401923702218870, -0.821430440164813590, -0.821458954573832220, +-0.821487466929203490, -0.821515977230856120, -0.821544485478718720, -0.821572991672720130, -0.821601495812789070, -0.821629997898854820, -0.821658497930845000, -0.821686995908688990, +-0.821715491832315510, -0.821743985701653750, -0.821772477516631520, -0.821800967277178110, -0.821829454983222350, -0.821857940634692860, -0.821886424231518590, -0.821914905773628130, +-0.821943385260950570, -0.821971862693414490, -0.822000338070948740, -0.822028811393482050, -0.822057282660943470, -0.822085751873262160, -0.822114219030365860, -0.822142684132184160, +-0.822171147178646140, -0.822199608169679850, -0.822228067105214460, -0.822256523985179010, -0.822284978809502130, -0.822313431578112870, -0.822341882290939960, -0.822370330947912450, +-0.822398777548959070, -0.822427222094008650, -0.822455664582990350, -0.822484105015832800, -0.822512543392465490, -0.822540979712816260, -0.822569413976814710, -0.822597846184389470, +-0.822626276335470250, -0.822654704429984780, -0.822683130467862570, -0.822711554449032540, -0.822739976373423550, -0.822768396240964760, -0.822796814051584890, -0.822825229805213000, +-0.822853643501778030, -0.822882055141208930, -0.822910464723434650, -0.822938872248384800, -0.822967277715987210, -0.822995681126171500, -0.823024082478866600, -0.823052481774001920, +-0.823080879011505510, -0.823109274191306970, -0.823137667313335260, -0.823166058377519330, -0.823194447383788220, -0.823222834332071110, -0.823251219222296830, -0.823279602054394430, +-0.823307982828293210, -0.823336361543921870, -0.823364738201210260, -0.823393112800086200, -0.823421485340479430, -0.823449855822318890, -0.823478224245534300, -0.823506590610053490, +-0.823534954915806310, -0.823563317162721800, -0.823591677350728910, -0.823620035479756820, -0.823648391549734680, -0.823676745560591560, -0.823705097512256510, -0.823733447404658810, +-0.823761795237727410, -0.823790141011391590, -0.823818484725580950, -0.823846826380223550, -0.823875165975249010, -0.823903503510587170, -0.823931838986166070, -0.823960172401915330, +-0.823988503757764110, -0.824016833053641710, -0.824045160289477160, -0.824073485465199760, -0.824101808580738670, -0.824130129636022950, -0.824158448630981980, -0.824186765565544930, +-0.824215080439640870, -0.824243393253199730, -0.824271704006149460, -0.824300012698420130, -0.824328319329940550, -0.824356623900640790, -0.824384926410449030, -0.824413226859294860, +-0.824441525247107570, -0.824469821573816540, -0.824498115839350950, -0.824526408043640080, -0.824554698186613200, -0.824582986268199590, -0.824611272288328420, -0.824639556246929200, +-0.824667838143931520, -0.824696117979263790, -0.824724395752855610, -0.824752671464636600, -0.824780945114536370, -0.824809216702483310, -0.824837486228407140, -0.824865753692237360, +-0.824894019093903030, -0.824922282433333760, -0.824950543710458840, -0.824978802925207420, -0.825007060077509120, -0.825035315167293120, -0.825063568194488780, -0.825091819159026070, +-0.825120068060833380, -0.825148314899840420, -0.825176559675976700, -0.825204802389172040, -0.825233043039354960, -0.825261281626455290, -0.825289518150402300, -0.825317752611125610, +-0.825345985008554490, -0.825374215342618460, -0.825402443613246770, -0.825430669820369060, -0.825458893963914700, -0.825487116043813090, -0.825515336059994160, -0.825543554012386440, +-0.825571769900919740, -0.825599983725523790, -0.825628195486128200, -0.825656405182661700, -0.825684612815054230, -0.825712818383235180, -0.825741021887134050, -0.825769223326680350, +-0.825797422701803670, -0.825825620012433430, -0.825853815258499100, -0.825882008439930200, -0.825910199556656340, -0.825938388608607020, -0.825966575595712180, -0.825994760517900330, +-0.826022943375101630, -0.826051124167245580, -0.826079302894262350, -0.826107479556080220, -0.826135654152629350, -0.826163826683839480, -0.826191997149639870, -0.826220165549960360, +-0.826248331884730460, -0.826276496153879770, -0.826304658357337800, -0.826332818495034150, -0.826360976566898440, -0.826389132572860840, -0.826417286512849960, -0.826445438386795740, +-0.826473588194628020, -0.826501735936276740, -0.826529881611670740, -0.826558025220739960, -0.826586166763414120, -0.826614306239622840, -0.826642443649295840, -0.826670578992362740, +-0.826698712268753130, -0.826726843478396760, -0.826754972621223330, -0.826783099697162460, -0.826811224706144320, -0.826839347648097630, -0.826867468522952560, -0.826895587330638840, +-0.826923704071086620, -0.826951818744224630, -0.826979931349983160, -0.827008041888291800, -0.827036150359080290, -0.827064256762278460, -0.827092361097816030, -0.827120463365622620, +-0.827148563565628160, -0.827176661697762160, -0.827204757761954570, -0.827232851758135660, -0.827260943686234040, -0.827289033546180110, -0.827317121337903470, -0.827345207061334630, +-0.827373290716402310, -0.827401372303036680, -0.827429451821167670, -0.827457529270725020, -0.827485604651638560, -0.827513677963838010, -0.827541749207253320, -0.827569818381814310, +-0.827597885487450720, -0.827625950524092380, -0.827654013491669230, -0.827682074390111430, -0.827710133219348050, -0.827738189979309260, -0.827766244669925100, -0.827794297291125750, +-0.827822347842840140, -0.827850396324998680, -0.827878442737531310, -0.827906487080367740, -0.827934529353438030, -0.827962569556671910, -0.827990607689999440, -0.828018643753350440, +-0.828046677746654750, -0.828074709669842420, -0.828102739522843860, -0.828130767305587880, -0.828158793018004990, -0.828186816660025250, -0.828214838231578820, -0.828242857732594870, +-0.828270875163003680, -0.828298890522735420, -0.828326903811719810, -0.828354915029887010, -0.828382924177166970, -0.828410931253489520, -0.828438936258784840, -0.828466939192982750, +-0.828494940056013430, -0.828522938847807140, -0.828550935568292960, -0.828578930217401590, -0.828606922795062760, -0.828634913301207200, -0.828662901735763850, -0.828690888098663200, +-0.828718872389835440, -0.828746854609210380, -0.828774834756718200, -0.828802812832288960, -0.828830788835852710, -0.828858762767339500, -0.828886734626679390, -0.828914704413802330, +-0.828942672128639150, -0.828970637771118680, -0.828998601341171650, -0.829026562838728110, -0.829054522263718670, -0.829082479616072510, -0.829110434895720010, -0.829138388102591550, +-0.829166339236617090, -0.829194288297726680, -0.829222235285850710, -0.829250180200919010, -0.829278123042861970, -0.829306063811609540, -0.829334002507091990, -0.829361939129239390, +-0.829389873677982450, -0.829417806153250340, -0.829445736554973780, -0.829473664883083270, -0.829501591137508210, -0.829529515318179090, -0.829557437425026190, -0.829585357457979790, +-0.829613275416969940, -0.829641191301926820, -0.829669105112780800, -0.829697016849461950, -0.829724926511900660, -0.829752834100026980, -0.829780739613771300, -0.829808643053064230, +-0.829836544417835050, -0.829864443708014490, -0.829892340923532810, -0.829920236064320750, -0.829948129130307690, -0.829976020121424240, -0.830003909037600800, -0.830031795878767520, +-0.830059680644854800, -0.830087563335792810, -0.830115443951511930, -0.830143322491942560, -0.830171198957014740, -0.830199073346658990, -0.830226945660806010, -0.830254815899385320, +-0.830282684062327410, -0.830310550149562900, -0.830338414161022390, -0.830366276096635490, -0.830394135956332820, -0.830421993740044770, -0.830449849447701840, -0.830477703079234300, +-0.830505554634572430, -0.830533404113646620, -0.830561251516387380, -0.830589096842724970, -0.830616940092589910, -0.830644781265912900, -0.830672620362623460, -0.830700457382652520, +-0.830728292325930370, -0.830756125192388060, -0.830783955981954870, -0.830811784694561850, -0.830839611330139280, -0.830867435888617780, -0.830895258369927610, -0.830923078773999400, +-0.830950897100763420, -0.830978713350150170, -0.831006527522090140, -0.831034339616513850, -0.831062149633351680, -0.831089957572534680, -0.831117763433992240, -0.831145567217655420, +-0.831173368923455060, -0.831201168551320870, -0.831228966101183800, -0.831256761572974350, -0.831284554966622900, -0.831312346282060080, -0.831340135519216370, -0.831367922678022400, +-0.831395707758408540, -0.831423490760305530, -0.831451271683643740, -0.831479050528353690, -0.831506827294366650, -0.831534601981611890, -0.831562374590020690, -0.831590145119523560, +-0.831617913570051550, -0.831645679941534380, -0.831673444233902880, -0.831701206447087780, -0.831728966581019690, -0.831756724635629220, -0.831784480610846870, -0.831812234506603350, +-0.831839986322829180, -0.831867736059455190, -0.831895483716411750, -0.831923229293630050, -0.831950972791039910, -0.831978714208572280, -0.832006453546157880, -0.832034190803727870, +-0.832061925981211760, -0.832089659078540930, -0.832117390095646000, -0.832145119032457470, -0.832172845888906280, -0.832200570664922920, -0.832228293360438130, -0.832256013975382510, +-0.832283732509687010, -0.832311448963282130, -0.832339163336099030, -0.832366875628067660, -0.832394585839119070, -0.832422293969183990, -0.832450000018193690, -0.832477703986077790, +-0.832505405872767780, -0.832533105678194160, -0.832560803402287770, -0.832588499044979450, -0.832616192606199900, -0.832643884085879750, -0.832671573483949930, -0.832699260800341290, +-0.832726946034984430, -0.832754629187810070, -0.832782310258749820, -0.832809989247733200, -0.832837666154691680, -0.832865340979556450, -0.832893013722257320, -0.832920684382725710, +-0.832948352960892310, -0.832976019456688200, -0.833003683870043870, -0.833031346200890480, -0.833059006449158650, -0.833086664614779320, -0.833114320697683210, -0.833141974697801490, +-0.833169626615064660, -0.833197276449404440, -0.833224924200750340, -0.833252569869034070, -0.833280213454186350, -0.833307854956138570, -0.833335494374820680, -0.833363131710163960, +-0.833390766962099570, -0.833418400130558120, -0.833446031215470780, -0.833473660216768280, -0.833501287134381650, -0.833528911968241860, -0.833556534718279730, -0.833584155384426320, +-0.833611773966612900, -0.833639390464769650, -0.833667004878827940, -0.833694617208718620, -0.833722227454373300, -0.833749835615722020, -0.833777441692696080, -0.833805045685226400, +-0.833832647593244270, -0.833860247416680520, -0.833887845155466100, -0.833915440809532060, -0.833943034378809460, -0.833970625863229230, -0.833998215262722440, -0.834025802577220590, +-0.834053387806653830, -0.834080970950953460, -0.834108552010050850, -0.834136130983877180, -0.834163707872362710, -0.834191282675439070, -0.834218855393037200, -0.834246426025088140, +-0.834273994571523070, -0.834301561032272930, -0.834329125407269000, -0.834356687696442110, -0.834384247899723650, -0.834411806017044460, -0.834439362048335910, -0.834466915993529290, +-0.834494467852554990, -0.834522017625344390, -0.834549565311829330, -0.834577110911939870, -0.834604654425607610, -0.834632195852763710, -0.834659735193339360, -0.834687272447265590, +-0.834714807614473700, -0.834742340694894840, -0.834769871688460060, -0.834797400595100660, -0.834824927414747680, -0.834852452147332390, -0.834879974792786530, -0.834907495351040140, +-0.834935013822025060, -0.834962530205672460, -0.834990044501914050, -0.835017556710680010, -0.835045066831902050, -0.835072574865511560, -0.835100080811439490, -0.835127584669617230, +-0.835155086439976050, -0.835182586122447110, -0.835210083716961820, -0.835237579223451210, -0.835265072641846680, -0.835292563972079960, -0.835320053214081320, -0.835347540367782580, +-0.835375025433114930, -0.835402508410010290, -0.835429989298398850, -0.835457468098212420, -0.835484944809382400, -0.835512419431839850, -0.835539891965516370, -0.835567362410343240, +-0.835594830766251520, -0.835622297033172920, -0.835649761211038400, -0.835677223299779560, -0.835704683299328120, -0.835732141209614590, -0.835759597030570570, -0.835787050762127670, +-0.835814502404217510, -0.835841951956770690, -0.835869399419718940, -0.835896844792993750, -0.835924288076526410, -0.835951729270248410, -0.835979168374091030, -0.836006605387985660, +-0.836034040311863900, -0.836061473145657040, -0.836088903889296350, -0.836116332542713560, -0.836143759105840380, -0.836171183578607310, -0.836198605960946310, -0.836226026252789190, +-0.836253444454066570, -0.836280860564710400, -0.836308274584651960, -0.836335686513822950, -0.836363096352154670, -0.836390504099578600, -0.836417909756026370, -0.836445313321429350, +-0.836472714795718940, -0.836500114178826860, -0.836527511470684490, -0.836554906671223790, -0.836582299780375350, -0.836609690798071130, -0.836637079724242730, -0.836664466558821980, +-0.836691851301739730, -0.836719233952927800, -0.836746614512317800, -0.836773992979841230, -0.836801369355429810, -0.836828743639014830, -0.836856115830527990, -0.836883485929900920, +-0.836910853937065100, -0.836938219851952160, -0.836965583674494140, -0.836992945404621770, -0.837020305042266880, -0.837047662587361410, -0.837075018039837080, -0.837102371399624840, +-0.837129722666656640, -0.837157071840864080, -0.837184418922178990, -0.837211763910532760, -0.837239106805857110, -0.837266447608083660, -0.837293786317144130, -0.837321122932970120, +-0.837348457455493360, -0.837375789884645890, -0.837403120220358450, -0.837430448462563200, -0.837457774611191860, -0.837485098666176600, -0.837512420627448130, -0.837539740494938510, +-0.837567058268579580, -0.837594373948303050, -0.837621687534040540, -0.837648999025723760, -0.837676308423284550, -0.837703615726654640, -0.837730920935765510, -0.837758224050549230, +-0.837785525070937400, -0.837812823996862190, -0.837840120828254320, -0.837867415565046290, -0.837894708207170160, -0.837921998754556860, -0.837949287207138460, -0.837976573564846890, +-0.838003857827613880, -0.838031139995371150, -0.838058420068050650, -0.838085698045584080, -0.838112973927903290, -0.838140247714940110, -0.838167519406626260, -0.838194789002893570, +-0.838222056503674430, -0.838249321908899670, -0.838276585218501570, -0.838303846432411960, -0.838331105550563340, -0.838358362572886430, -0.838385617499313620, -0.838412870329776740, +-0.838440121064207730, -0.838467369702538320, -0.838494616244700560, -0.838521860690626290, -0.838549103040247320, -0.838576343293495620, -0.838603581450303000, -0.838630817510601980, +-0.838658051474323370, -0.838685283341399690, -0.838712513111762760, -0.838739740785345080, -0.838766966362077590, -0.838794189841892580, -0.838821411224722200, -0.838848630510498180, +-0.838875847699152690, -0.838903062790617550, -0.838930275784824710, -0.838957486681706220, -0.838984695481194030, -0.839011902183220080, -0.839039106787716870, -0.839066309294615340, +-0.839093509703848110, -0.839120708015347110, -0.839147904229044730, -0.839175098344872250, -0.839202290362761950, -0.839229480282645880, -0.839256668104456200, -0.839283853828124760, +-0.839311037453583710, -0.839338218980765110, -0.839365398409601000, -0.839392575740023350, -0.839419750971964200, -0.839446924105355710, -0.839474095140130490, -0.839501264076219390, +-0.839528430913555220, -0.839555595652070500, -0.839582758291696150, -0.839609918832365020, -0.839637077274009160, -0.839664233616560510, -0.839691387859951230, -0.839718540004113610, +-0.839745690048979480, -0.839772837994481320, -0.839799983840550990, -0.839827127587120640, -0.839854269234122430, -0.839881408781489200, -0.839908546229151790, -0.839935681577043130, +-0.839962814825095270, -0.839989945973240730, -0.840017075021410990, -0.840044201969538550, -0.840071326817555470, -0.840098449565394260, -0.840125570212986730, -0.840152688760265390, +-0.840179805207162400, -0.840206919553609710, -0.840234031799539820, -0.840261141944884880, -0.840288249989577520, -0.840315355933549110, -0.840342459776732280, -0.840369561519059280, +-0.840396661160462850, -0.840423758700874380, -0.840450854140226470, -0.840477947478451390, -0.840505038715481430, -0.840532127851248870, -0.840559214885685970, -0.840586299818725120, +-0.840613382650298500, -0.840640463380338380, -0.840667542008777140, -0.840694618535547500, -0.840721692960580860, -0.840748765283809930, -0.840775835505167100, -0.840802903624585210, +-0.840829969641995630, -0.840857033557331100, -0.840884095370523890, -0.840911155081506490, -0.840938212690211180, -0.840965268196570470, -0.840992321600516400, -0.841019372901981700, +-0.841046422100898420, -0.841073469197199160, -0.841100514190816660, -0.841127557081682520, -0.841154597869729350, -0.841181636554889760, -0.841208673137096460, -0.841235707616281080, +-0.841262739992376440, -0.841289770265314930, -0.841316798435029050, -0.841343824501451070, -0.841370848464513600, -0.841397870324149030, -0.841424890080289760, -0.841451907732868270, +-0.841478923281816950, -0.841505936727068300, -0.841532948068555390, -0.841559957306209580, -0.841586964439963950, -0.841613969469750870, -0.841640972395503280, -0.841667973217152810, +-0.841694971934632390, -0.841721968547874620, -0.841748963056811910, -0.841775955461376730, -0.841802945761501720, -0.841829933957119360, -0.841856920048162150, -0.841883904034562590, +-0.841910885916253290, -0.841937865693167200, -0.841964843365236030, -0.841991818932392830, -0.842018792394570000, -0.842045763751700700, -0.842072733003716430, -0.842099700150550360, +-0.842126665192135080, -0.842153628128403110, -0.842180588959287160, -0.842207547684719620, -0.842234504304633200, -0.842261458818960640, -0.842288411227634310, -0.842315361530587060, +-0.842342309727751810, -0.842369255819060300, -0.842396199804445690, -0.842423141683840580, -0.842450081457178150, -0.842477019124389990, -0.842503954685409280, -0.842530888140168630, +-0.842557819488600760, -0.842584748730638380, -0.842611675866214100, -0.842638600895260770, -0.842665523817710760, -0.842692444633497020, -0.842719363342552150, -0.842746279944809440, +-0.842773194440200380, -0.842800106828658470, -0.842827017110116320, -0.842853925284506980, -0.842880831351762390, -0.842907735311815730, -0.842934637164599710, -0.842961536910047160, +-0.842988434548090800, -0.843015330078663250, -0.843042223501697440, -0.843069114817125990, -0.843096004024881830, -0.843122891124897690, -0.843149776117106290, -0.843176659001440900, +-0.843203539777833360, -0.843230418446217040, -0.843257295006524580, -0.843284169458689450, -0.843311041802643380, -0.843337912038319760, -0.843364780165651310, -0.843391646184570850, +-0.843418510095011340, -0.843445371896905600, -0.843472231590186470, -0.843499089174786660, -0.843525944650639130, -0.843552798017676690, -0.843579649275832840, -0.843606498425039320, +-0.843633345465229610, -0.843660190396336550, -0.843687033218293410, -0.843713873931032250, -0.843740712534486460, -0.843767549028588860, -0.843794383413272290, -0.843821215688469910, +-0.843848045854114330, -0.843874873910138820, -0.843901699856476010, -0.843928523693058930, -0.843955345419820650, -0.843982165036694320, -0.844008982543612230, -0.844035797940507650, +-0.844062611227313520, -0.844089422403963450, -0.844116231470389280, -0.844143038426524610, -0.844169843272302270, -0.844196646007655320, -0.844223446632516690, -0.844250245146819570, +-0.844277041550496770, -0.844303835843481450, -0.844330628025706460, -0.844357418097104850, -0.844384206057610330, -0.844410991907154630, -0.844437775645671570, -0.844464557273094110, +-0.844491336789355620, -0.844518114194388380, -0.844544889488125890, -0.844571662670501100, -0.844598433741447160, -0.844625202700897140, -0.844651969548784190, -0.844678734285041250, +-0.844705496909601390, -0.844732257422397880, -0.844759015823363770, -0.844785772112432110, -0.844812526289536400, -0.844839278354609040, -0.844866028307583390, -0.844892776148393090, +-0.844919521876970500, -0.844946265493249030, -0.844973006997161940, -0.844999746388642280, -0.845026483667623340, -0.845053218834038060, -0.845079951887819810, -0.845106682828901780, +-0.845133411657216890, -0.845160138372698540, -0.845186862975279780, -0.845213585464894450, -0.845240305841474580, -0.845267024104954020, -0.845293740255265820, -0.845320454292343810, +-0.845347166216120160, -0.845373876026528690, -0.845400583723502350, -0.845427289306974640, -0.845453992776878720, -0.845480694133147860, -0.845507393375715230, -0.845534090504514110, +-0.845560785519477780, -0.845587478420539380, -0.845614169207632880, -0.845640857880690430, -0.845667544439645870, -0.845694228884432460, -0.845720911214983940, -0.845747591431232570, +-0.845774269533112300, -0.845800945520556400, -0.845827619393498150, -0.845854291151870720, -0.845880960795607710, -0.845907628324642280, -0.845934293738907720, -0.845960957038337400, +-0.845987618222864720, -0.846014277292423510, -0.846040934246946040, -0.846067589086366260, -0.846094241810617540, -0.846120892419633730, -0.846147540913347210, -0.846174187291691800, +-0.846200831554600910, -0.846227473702007900, -0.846254113733846290, -0.846280751650049350, -0.846307387450550560, -0.846334021135283330, -0.846360652704181040, -0.846387282157177070, +-0.846413909494204920, -0.846440534715198420, -0.846467157820090190, -0.846493778808814050, -0.846520397681303830, -0.846547014437492250, -0.846573629077313150, -0.846600241600699910, +-0.846626852007586140, -0.846653460297905220, -0.846680066471590660, -0.846706670528575840, -0.846733272468794370, -0.846759872292179750, -0.846786469998665470, -0.846813065588185030, +-0.846839659060672380, -0.846866250416060120, -0.846892839654282190, -0.846919426775272210, -0.846946011778964110, -0.846972594665290510, -0.846999175434185460, -0.847025754085582340, +-0.847052330619414980, -0.847078905035616780, -0.847105477334121230, -0.847132047514862040, -0.847158615577772720, -0.847185181522786880, -0.847211745349838120, -0.847238307058860380, +-0.847264866649786510, -0.847291424122550430, -0.847317979477085760, -0.847344532713326550, -0.847371083831205630, -0.847397632830657050, -0.847424179711614320, -0.847450724474011150, +-0.847477267117781150, -0.847503807642857930, -0.847530346049175320, -0.847556882336666820, -0.847583416505266030, -0.847609948554906790, -0.847636478485523040, -0.847663006297047720, +-0.847689531989414880, -0.847716055562558140, -0.847742577016411760, -0.847769096350908580, -0.847795613565982540, -0.847822128661567480, -0.847848641637597100, -0.847875152494005140, +-0.847901661230725300, -0.847928167847691320, -0.847954672344836790, -0.847981174722095780, -0.848007674979401660, -0.848034173116688490, -0.848060669133890220, -0.848087163030939890, +-0.848113654807771680, -0.848140144464319730, -0.848166632000517010, -0.848193117416297770, -0.848219600711595630, -0.848246081886344540, -0.848272560940478200, -0.848299037873930460, +-0.848325512686635140, -0.848351985378526070, -0.848378455949536980, -0.848404924399601800, -0.848431390728654260, -0.848457854936628840, -0.848484317023458170, -0.848510776989076730, +-0.848537234833418360, -0.848563690556417450, -0.848590144158006820, -0.848616595638120750, -0.848643044996693190, -0.848669492233658060, -0.848695937348949210, -0.848722380342500580, +-0.848748821214245890, -0.848775259964119180, -0.848801696592054290, -0.848828131097985270, -0.848854563481846290, -0.848880993743570400, -0.848907421883092090, -0.848933847900345210, +-0.848960271795264230, -0.848986693567782110, -0.849013113217833130, -0.849039530745351430, -0.849065946150270980, -0.849092359432525590, -0.849118770592049320, -0.849145179628776110, +-0.849171586542640020, -0.849197991333574880, -0.849224394001514840, -0.849250794546394180, -0.849277192968146080, -0.849303589266705130, -0.849329983442005050, -0.849356375493980580, +-0.849382765422564630, -0.849409153227691840, -0.849435538909296130, -0.849461922467311560, -0.849488303901672180, -0.849514683212312050, -0.849541060399165220, -0.849567435462165730, +-0.849593808401247650, -0.849620179216345140, -0.849646547907392140, -0.849672914474323140, -0.849699278917071420, -0.849725641235571590, -0.849752001429758040, -0.849778359499564040, +-0.849804715444924200, -0.849831069265772450, -0.849857420962043200, -0.849883770533670260, -0.849910117980587910, -0.849936463302730320, -0.849962806500031530, -0.849989147572425720, +-0.850015486519847040, -0.850041823342229660, -0.850068158039508190, -0.850094490611615900, -0.850120821058487300, -0.850147149380056640, -0.850173475576258660, -0.850199799647026520, +-0.850226121592294830, -0.850252441411997850, -0.850278759106069760, -0.850305074674444830, -0.850331388117057110, -0.850357699433840990, -0.850384008624730630, -0.850410315689660190, +-0.850436620628564070, -0.850462923441376750, -0.850489224128031740, -0.850515522688463530, -0.850541819122606620, -0.850568113430395620, -0.850594405611763920, -0.850620695666646220, +-0.850646983594976700, -0.850673269396689750, -0.850699553071719630, -0.850725834620000620, -0.850752114041467000, -0.850778391336053040, -0.850804666503693240, -0.850830939544321760, +-0.850857210457873330, -0.850883479244281430, -0.850909745903480790, -0.850936010435405790, -0.850962272839991370, -0.850988533117170600, -0.851014791266878620, -0.851041047289049610, +-0.851067301183618060, -0.851093552950518250, -0.851119802589684450, -0.851146050101051270, -0.851172295484552870, -0.851198538740123740, -0.851224779867698290, -0.851251018867210880, +-0.851277255738596470, -0.851303490481788330, -0.851329723096721500, -0.851355953583330940, -0.851382181941549910, -0.851408408171313470, -0.851434632272556000, -0.851460854245211900, +-0.851487074089215760, -0.851513291804501860, -0.851539507391004700, -0.851565720848658890, -0.851591932177398700, -0.851618141377158740, -0.851644348447873400, -0.851670553389477610, +-0.851696756201904990, -0.851722956885090480, -0.851749155438968560, -0.851775351863474310, -0.851801546158541090, -0.851827738324104080, -0.851853928360097770, -0.851880116266456540, +-0.851906302043115020, -0.851932485690007790, -0.851958667207069360, -0.851984846594234240, -0.852011023851437010, -0.852037198978612300, -0.852063371975694930, -0.852089542842618730, +-0.852115711579318650, -0.852141878185729280, -0.852168042661785700, -0.852194205007421490, -0.852220365222571830, -0.852246523307171320, -0.852272679261154460, -0.852298833084455860, +-0.852324984777010130, -0.852351134338751980, -0.852377281769616020, -0.852403427069536870, -0.852429570238449120, -0.852455711276287940, -0.852481850182987060, -0.852507986958481510, +-0.852534121602705920, -0.852560254115595550, -0.852586384497084130, -0.852612512747106700, -0.852638638865597990, -0.852664762852492600, -0.852690884707725470, -0.852717004431231000, +-0.852743122022944110, -0.852769237482799310, -0.852795350810731550, -0.852821462006675300, -0.852847571070565410, -0.852873678002337150, -0.852899782801924130, -0.852925885469261620, +-0.852951986004285010, -0.852978084406927910, -0.853004180677125580, -0.853030274814812750, -0.853056366819924250, -0.853082456692394910, -0.853108544432159440, -0.853134630039152460, +-0.853160713513309020, -0.853186794854563830, -0.853212874062851510, -0.853238951138107100, -0.853265026080265780, -0.853291098889261470, -0.853317169565029340, -0.853343238107504340, +-0.853369304516621630, -0.853395368792315260, -0.853421430934520500, -0.853447490943172070, -0.853473548818205030, -0.853499604559553980, -0.853525658167153980, -0.853551709640939850, +-0.853577758980846420, -0.853603806186808640, -0.853629851258761340, -0.853655894196639790, -0.853681935000378140, -0.853707973669911580, -0.853734010205175140, -0.853760044606104110, +-0.853786076872632530, -0.853812107004695790, -0.853838135002228720, -0.853864160865166370, -0.853890184593443570, -0.853916206186995260, -0.853942225645756500, -0.853968242969662230, +-0.853994258158647270, -0.854020271212646680, -0.854046282131595840, -0.854072290915428910, -0.854098297564081180, -0.854124302077487800, -0.854150304455584040, -0.854176304698304080, +-0.854202302805583400, -0.854228298777356950, -0.854254292613559670, -0.854280284314126730, -0.854306273878993160, -0.854332261308093810, -0.854358246601363720, -0.854384229758738180, +-0.854410210780152000, -0.854436189665540250, -0.854462166414838520, -0.854488141027980990, -0.854514113504903030, -0.854540083845540250, -0.854566052049826830, -0.854592018117698250, +-0.854617982049089560, -0.854643943843936050, -0.854669903502172530, -0.854695861023734400, -0.854721816408556600, -0.854747769656574170, -0.854773720767722400, -0.854799669741936220, +-0.854825616579151020, -0.854851561279302170, -0.854877503842323860, -0.854903444268151900, -0.854929382556721350, -0.854955318707967700, -0.854981252721825350, -0.855007184598229890, +-0.855033114337116480, -0.855059041938420190, -0.855084967402076400, -0.855110890728020160, -0.855136811916186730, -0.855162730966511190, -0.855188647878928900, -0.855214562653374920, +-0.855240475289784970, -0.855266385788093440, -0.855292294148235930, -0.855318200370147720, -0.855344104453764410, -0.855370006399020390, -0.855395906205851380, -0.855421803874192640, +-0.855447699403979360, -0.855473592795146790, -0.855499484047630320, -0.855525373161365010, -0.855551260136286350, -0.855577144972329510, -0.855603027669429860, -0.855628908227523130, +-0.855654786646543600, -0.855680662926427080, -0.855706537067108970, -0.855732409068524990, -0.855758278930609410, -0.855784146653298270, -0.855810012236526640, -0.855835875680230120, +-0.855861736984343760, -0.855887596148803160, -0.855913453173543500, -0.855939308058500270, -0.855965160803608740, -0.855991011408804290, -0.856016859874022430, -0.856042706199198760, +-0.856068550384267880, -0.856094392429165630, -0.856120232333827950, -0.856146070098189100, -0.856171905722185160, -0.856197739205751370, -0.856223570548823250, -0.856249399751336290, +-0.856275226813225760, -0.856301051734427170, -0.856326874514875990, -0.856352695154507630, -0.856378513653257460, -0.856404330011061090, -0.856430144227854240, -0.856455956303571740, +-0.856481766238149200, -0.856507574031522330, -0.856533379683626970, -0.856559183194397610, -0.856584984563770410, -0.856610783791680650, -0.856636580878064050, -0.856662375822855870, +-0.856688168625991840, -0.856713959287407350, -0.856739747807037990, -0.856765534184819270, -0.856791318420686680, -0.856817100514576270, -0.856842880466422650, -0.856868658276161770, +-0.856894433943729330, -0.856920207469061280, -0.856945978852092230, -0.856971748092758110, -0.856997515190994760, -0.857023280146737560, -0.857049042959922240, -0.857074803630484270, +-0.857100562158359280, -0.857126318543482870, -0.857152072785790640, -0.857177824885218320, -0.857203574841701840, -0.857229322655175930, -0.857255068325576740, -0.857280811852839890, +-0.857306553236901410, -0.857332292477696160, -0.857358029575160160, -0.857383764529229150, -0.857409497339838620, -0.857435228006924510, -0.857460956530422200, -0.857486682910267530, +-0.857512407146396090, -0.857538129238743730, -0.857563849187245930, -0.857589566991839080, -0.857615282652457790, -0.857640996169038330, -0.857666707541516420, -0.857692416769828100, +-0.857718123853908330, -0.857743828793693260, -0.857769531589118620, -0.857795232240120110, -0.857820930746633570, -0.857846627108594720, -0.857872321325939160, -0.857898013398602940, +-0.857923703326521680, -0.857949391109631090, -0.857975076747867100, -0.858000760241165780, -0.858026441589462170, -0.858052120792692440, -0.858077797850792410, -0.858103472763698360, +-0.858129145531345230, -0.858154816153669180, -0.858180484630606030, -0.858206150962091740, -0.858231815148062020, -0.858257477188452800, -0.858283137083199920, -0.858308794832239100, +-0.858334450435506380, -0.858360103892937490, -0.858385755204468800, -0.858411404370035270, -0.858437051389573270, -0.858462696263018630, -0.858488338990307630, -0.858513979571375430, +-0.858539618006158190, -0.858565254294591960, -0.858590888436612580, -0.858616520432155970, -0.858642150281158090, -0.858667777983554870, -0.858693403539282140, -0.858719026948275840, +-0.858744648210472140, -0.858770267325807080, -0.858795884294216050, -0.858821499115635210, -0.858847111790000730, -0.858872722317248870, -0.858898330697314690, -0.858923936930134800, +-0.858949541015645020, -0.858975142953781300, -0.859000742744479910, -0.859026340387676560, -0.859051935883307300, -0.859077529231308310, -0.859103120431615410, -0.859128709484164750, +-0.859154296388892740, -0.859179881145734510, -0.859205463754626700, -0.859231044215505110, -0.859256622528306370, -0.859282198692965740, -0.859307772709419490, -0.859333344577603910, +-0.859358914297454810, -0.859384481868908590, -0.859410047291901070, -0.859435610566368520, -0.859461171692246890, -0.859486730669472340, -0.859512287497980920, -0.859537842177708790, +-0.859563394708592550, -0.859588945090567380, -0.859614493323569760, -0.859640039407535970, -0.859665583342402620, -0.859691125128104750, -0.859716664764579090, -0.859742202251761790, +-0.859767737589588910, -0.859793270777996720, -0.859818801816921390, -0.859844330706299060, -0.859869857446065920, -0.859895382036158120, -0.859920904476511820, -0.859946424767063730, +-0.859971942907749140, -0.859997458898504650, -0.860022972739266530, -0.860048484429971500, -0.860073993970554730, -0.860099501360953030, -0.860125006601102580, -0.860150509690939540, +-0.860176010630400280, -0.860201509419420970, -0.860227006057937890, -0.860252500545887310, -0.860277992883205500, -0.860303483069828620, -0.860328971105693620, -0.860354456990735650, +-0.860379940724891550, -0.860405422308097580, -0.860430901740290580, -0.860456379021405810, -0.860481854151380120, -0.860507327130149770, -0.860532797957651140, -0.860558266633820510, +-0.860583733158594160, -0.860609197531908450, -0.860634659753699900, -0.860660119823904560, -0.860685577742459020, -0.860711033509299890, -0.860736487124362790, -0.860761938587584540, +-0.860787387898901300, -0.860812835058250130, -0.860838280065566400, -0.860863722920786940, -0.860889163623848150, -0.860914602174686520, -0.860940038573238420, -0.860965472819440140, +-0.860990904913228160, -0.861016334854538990, -0.861041762643309010, -0.861067188279474590, -0.861092611762972140, -0.861118033093738690, -0.861143452271709630, -0.861168869296822010, +-0.861194284169012670, -0.861219696888217090, -0.861245107454372330, -0.861270515867414770, -0.861295922127280900, -0.861321326233907340, -0.861346728187230350, -0.861372127987186540, +-0.861397525633712520, -0.861422921126744570, -0.861448314466219390, -0.861473705652073370, -0.861499094684243570, -0.861524481562665590, -0.861549866287276480, -0.861575248858012510, +-0.861600629274811070, -0.861626007537607430, -0.861651383646338860, -0.861676757600941870, -0.861702129401352930, -0.861727499047508670, -0.861752866539345690, -0.861778231876800580, +-0.861803595059809750, -0.861828956088310120, -0.861854314962237970, -0.861879671681530460, -0.861905026246123420, -0.861930378655953790, -0.861955728910958170, -0.861981077011073740, +-0.862006422956236080, -0.862031766746382490, -0.862057108381449330, -0.862082447861373560, -0.862107785186091550, -0.862133120355540130, -0.862158453369655910, -0.862183784228375490, +-0.862209112931635600, -0.862234439479373060, -0.862259763871524810, -0.862285086108026680, -0.862310406188815830, -0.862335724113828970, -0.862361039883003280, -0.862386353496274570, +-0.862411664953579900, -0.862436974254856100, -0.862462281400039890, -0.862487586389067970, -0.862512889221876970, -0.862538189898403920, -0.862563488418585320, -0.862588784782358010, +-0.862614078989658690, -0.862639371040424210, -0.862664660934591710, -0.862689948672097140, -0.862715234252877770, -0.862740517676870660, -0.862765798944011840, -0.862791078054238600, +-0.862816355007487550, -0.862841629803695720, -0.862866902442799730, -0.862892172924736520, -0.862917441249442810, -0.862942707416855640, -0.862967971426911620, -0.862993233279547580, +-0.863018492974700570, -0.863043750512307750, -0.863069005892305170, -0.863094259114630000, -0.863119510179219170, -0.863144759086010070, -0.863170005834938640, -0.863195250425942140, +-0.863220492858957520, -0.863245733133921610, -0.863270971250771460, -0.863296207209443890, -0.863321441009875730, -0.863346672652004040, -0.863371902135765650, -0.863397129461097480, +-0.863422354627936930, -0.863447577636220040, -0.863472798485884210, -0.863498017176866470, -0.863523233709104000, -0.863548448082533060, -0.863573660297091040, -0.863598870352714760, +-0.863624078249341400, -0.863649283986907880, -0.863674487565351030, -0.863699688984608030, -0.863724888244615910, -0.863750085345311390, -0.863775280286631750, -0.863800473068514370, +-0.863825663690895310, -0.863850852153712050, -0.863876038456901750, -0.863901222600401810, -0.863926404584148270, -0.863951584408078840, -0.863976762072130370, -0.864001937576240000, +-0.864027110920344790, -0.864052282104381790, -0.864077451128288150, -0.864102617992000830, -0.864127782695456980, -0.864152945238593650, -0.864178105621348000, -0.864203263843657530, +-0.864228419905458400, -0.864253573806688210, -0.864278725547284580, -0.864303875127183760, -0.864329022546323160, -0.864354167804640030, -0.864379310902071430, -0.864404451838554630, +-0.864429590614026690, -0.864454727228424760, -0.864479861681686000, -0.864504993973747580, -0.864530124104546660, -0.864555252074020400, -0.864580377882106510, -0.864605501528741270, +-0.864630623013862290, -0.864655742337406720, -0.864680859499312170, -0.864705974499515030, -0.864731087337953010, -0.864756198014563270, -0.864781306529283090, -0.864806412882049620, +-0.864831517072800040, -0.864856619101471710, -0.864881718968001810, -0.864906816672327610, -0.864931912214386480, -0.864957005594115810, -0.864982096811452330, -0.865007185866333630, +-0.865032272758696870, -0.865057357488479890, -0.865082440055619180, -0.865107520460052240, -0.865132598701716550, -0.865157674780549390, -0.865182748696488040, -0.865207820449469760, +-0.865232890039431930, -0.865257957466311960, -0.865283022730047090, -0.865308085830574610, -0.865333146767832350, -0.865358205541756800, -0.865383262152285780, -0.865408316599356460, +-0.865433368882906890, -0.865458419002873570, -0.865483466959194090, -0.865508512751805850, -0.865533556380646440, -0.865558597845653140, -0.865583637146763340, -0.865608674283914410, +-0.865633709257043860, -0.865658742066088950, -0.865683772710987290, -0.865708801191676150, -0.865733827508093470, -0.865758851660175740, -0.865783873647860800, -0.865808893471086800, +-0.865833911129790020, -0.865858926623908510, -0.865883939953379640, -0.865908951118140920, -0.865933960118129840, -0.865958966953283780, -0.865983971623540460, -0.866008974128837150, +-0.866033974469111350, -0.866058972644300650, -0.866083968654342560, -0.866108962499174910, -0.866133954178734400, -0.866158943692959090, -0.866183931041786370, -0.866208916225154280, +-0.866233899242999540, -0.866258880095259980, -0.866283858781873200, -0.866308835302776800, -0.866333809657908290, -0.866358781847205270, -0.866383751870605230, -0.866408719728045900, +-0.866433685419464750, -0.866458648944799400, -0.866483610303987790, -0.866508569496966750, -0.866533526523674320, -0.866558481384048120, -0.866583434078026070, -0.866608384605545010, +-0.866633332966542990, -0.866658279160957720, -0.866683223188726700, -0.866708165049787540, -0.866733104744078050, -0.866758042271535860, -0.866782977632098440, -0.866807910825703630, +-0.866832841852289040, -0.866857770711792820, -0.866882697404151690, -0.866907621929303820, -0.866932544287186910, -0.866957464477739030, -0.866982382500897100, -0.867007298356599180, +-0.867032212044783090, -0.867057123565386330, -0.867082032918346960, -0.867106940103602340, -0.867131845121090430, -0.867156747970748930, -0.867181648652515570, -0.867206547166328060, +-0.867231443512124110, -0.867256337689842120, -0.867281229699418790, -0.867306119540792400, -0.867331007213901110, -0.867355892718681850, -0.867380776055072910, -0.867405657223011990, +-0.867430536222436930, -0.867455413053285550, -0.867480287715495680, -0.867505160209005030, -0.867530030533751550, -0.867554898689672950, -0.867579764676707050, -0.867604628494791810, +-0.867629490143865480, -0.867654349623864900, -0.867679206934728440, -0.867704062076393940, -0.867728915048799790, -0.867753765851882910, -0.867778614485581690, -0.867803460949833850, +-0.867828305244577320, -0.867853147369750060, -0.867877987325289980, -0.867902825111134810, -0.867927660727222720, -0.867952494173491410, -0.867977325449878820, -0.868002154556323460, +-0.868026981492762250, -0.868051806259133470, -0.868076628855375290, -0.868101449281425960, -0.868126267537222550, -0.868151083622703550, -0.868175897537806770, -0.868200709282470170, +-0.868225518856631910, -0.868250326260229800, -0.868275131493201900, -0.868299934555486150, -0.868324735447020600, -0.868349534167743190, -0.868374330717592400, -0.868399125096505300, +-0.868423917304420480, -0.868448707341275770, -0.868473495207009780, -0.868498280901559670, -0.868523064424863710, -0.868547845776860170, -0.868572624957486990, -0.868597401966682340, +-0.868622176804384140, -0.868646949470530450, -0.868671719965059430, -0.868696488287909020, -0.868721254439017490, -0.868746018418322770, -0.868770780225763480, -0.868795539861276780, +-0.868820297324801260, -0.868845052616275430, -0.868869805735636550, -0.868894556682823120, -0.868919305457773290, -0.868944052060425240, -0.868968796490717010, -0.868993538748586760, +-0.869018278833972760, -0.869043016746813060, -0.869067752487045710, -0.869092486054609090, -0.869117217449441150, -0.869141946671480700, -0.869166673720664920, -0.869191398596932400, +-0.869216121300221410, -0.869240841830470680, -0.869265560187617250, -0.869290276371599950, -0.869314990382357040, -0.869339702219826590, -0.869364411883946860, -0.869389119374656130, +-0.869413824691892660, -0.869438527835594500, -0.869463228805700150, -0.869487927602147660, -0.869512624224875850, -0.869537318673822000, -0.869562010948924820, -0.869586701050122590, +-0.869611388977354130, -0.869636074730556710, -0.869660758309669160, -0.869685439714629640, -0.869710118945376530, -0.869734796001848220, -0.869759470883982870, -0.869784143591718740, +-0.869808814124994330, -0.869833482483747920, -0.869858148667917770, -0.869882812677442720, -0.869907474512260140, -0.869932134172308970, -0.869956791657527370, -0.869981446967854290, +-0.870006100103227100, -0.870030751063584630, -0.870055399848865370, -0.870080046459007610, -0.870104690893949710, -0.870129333153630060, -0.870153973237987040, -0.870178611146959160, +-0.870203246880484780, -0.870227880438502190, -0.870252511820949980, -0.870277141027766880, -0.870301768058890480, -0.870326392914259730, -0.870351015593813450, -0.870375636097489020, +-0.870400254425225730, -0.870424870576961610, -0.870449484552635380, -0.870474096352185530, -0.870498705975550350, -0.870523313422668420, -0.870547918693478140, -0.870572521787918220, +-0.870597122705926820, -0.870621721447442760, -0.870646318012404770, -0.870670912400750560, -0.870695504612419070, -0.870720094647348790, -0.870744682505478760, -0.870769268186746490, +-0.870793851691091140, -0.870818433018451190, -0.870843012168765030, -0.870867589141971490, -0.870892163938008830, -0.870916736556815900, -0.870941306998331060, -0.870965875262492920, +-0.870990441349240090, -0.871015005258511720, -0.871039566990245320, -0.871064126544379920, -0.871088683920854370, -0.871113239119607360, -0.871137792140576960, -0.871162342983702100, +-0.871186891648921270, -0.871211438136173190, -0.871235982445396570, -0.871260524576530030, -0.871285064529512270, -0.871309602304281670, -0.871334137900777070, -0.871358671318937290, +-0.871383202558701160, -0.871407731620006510, -0.871432258502792710, -0.871456783206998150, -0.871481305732562110, -0.871505826079422290, -0.871530344247517960, -0.871554860236787740, +-0.871579374047170450, -0.871603885678604700, -0.871628395131029190, -0.871652902404382760, -0.871677407498604010, -0.871701910413631760, -0.871726411149404750, -0.871750909705862110, +-0.871775406082941800, -0.871799900280582960, -0.871824392298724330, -0.871848882137305160, -0.871873369796263400, -0.871897855275538200, -0.871922338575068400, -0.871946819694792710, +-0.871971298634649950, -0.871995775394579060, -0.872020249974518660, -0.872044722374407550, -0.872069192594184690, -0.872093660633788900, -0.872118126493158900, -0.872142590172234060, +-0.872167051670952320, -0.872191510989252850, -0.872215968127074690, -0.872240423084357120, -0.872264875861037960, -0.872289326457056590, -0.872313774872351950, -0.872338221106862880, +-0.872362665160528180, -0.872387107033286920, -0.872411546725077810, -0.872435984235839900, -0.872460419565512010, -0.872484852714032980, -0.872509283681342400, -0.872533712467378100, +-0.872558139072079460, -0.872582563495385540, -0.872606985737235720, -0.872631405797567930, -0.872655823676321660, -0.872680239373435750, -0.872704652888849240, -0.872729064222501180, +-0.872753473374330400, -0.872777880344276060, -0.872802285132276870, -0.872826687738271990, -0.872851088162200470, -0.872875486404001590, -0.872899882463613610, -0.872924276340975910, +-0.872948668036027550, -0.872973057548707910, -0.872997444878955140, -0.873021830026708860, -0.873046212991907990, -0.873070593774491480, -0.873094972374398590, -0.873119348791568270, +-0.873143723025939570, -0.873168095077451520, -0.873192464946043300, -0.873216832631653840, -0.873241198134222740, -0.873265561453688280, -0.873289922589989830, -0.873314281543066670, +-0.873338638312858180, -0.873362992899302640, -0.873387345302339630, -0.873411695521908340, -0.873436043557947790, -0.873460389410397050, -0.873484733079195390, -0.873509074564281840, +-0.873533413865595690, -0.873557750983075980, -0.873582085916661870, -0.873606418666292520, -0.873630749231907640, -0.873655077613445410, -0.873679403810845520, -0.873703727824047040, +-0.873728049652989670, -0.873752369297611910, -0.873776686757853030, -0.873801002033652520, -0.873825315124949540, -0.873849626031683150, -0.873873934753792820, -0.873898241291217630, +-0.873922545643896820, -0.873946847811769680, -0.873971147794775360, -0.873995445592853580, -0.874019741205942840, -0.874044034633982720, -0.874068325876912410, -0.874092614934671830, +-0.874116901807199250, -0.874141186494434510, -0.874165468996316640, -0.874189749312785260, -0.874214027443779410, -0.874238303389238470, -0.874262577149101830, -0.874286848723308750, +-0.874311118111798510, -0.874335385314510490, -0.874359650331384410, -0.874383913162358860, -0.874408173807373460, -0.874432432266367580, -0.874456688539281160, -0.874480942626052580, +-0.874505194526621570, -0.874529444240927600, -0.874553691768910070, -0.874577937110508240, -0.874602180265661610, -0.874626421234309450, -0.874650660016391360, -0.874674896611846500, +-0.874699131020614470, -0.874723363242635000, -0.874747593277846790, -0.874771821126189560, -0.874796046787602700, -0.874820270262026240, -0.874844491549398580, -0.874868710649659760, +-0.874892927562749170, -0.874917142288606290, -0.874941354827170500, -0.874965565178381310, -0.874989773342178200, -0.875013979318500670, -0.875038183107288200, -0.875062384708480300, +-0.875086584122016450, -0.875110781347836600, -0.875134976385879230, -0.875159169236084500, -0.875183359898392350, -0.875207548372741280, -0.875231734659071340, -0.875255918757322120, +-0.875280100667433000, -0.875304280389343710, -0.875328457922993740, -0.875352633268322580, -0.875376806425269830, -0.875400977393775090, -0.875425146173777870, -0.875449312765217760, +-0.875473477168034920, -0.875497639382167850, -0.875521799407556700, -0.875545957244141080, -0.875570112891861040, -0.875594266350655180, -0.875618417620463770, -0.875642566701226200, +-0.875666713592882280, -0.875690858295371630, -0.875715000808633740, -0.875739141132608420, -0.875763279267235180, -0.875787415212453730, -0.875811548968203790, -0.875835680534425400, +-0.875859809911057390, -0.875883937098039800, -0.875908062095312470, -0.875932184902815330, -0.875956305520487310, -0.875980423948268580, -0.876004540186098750, -0.876028654233917630, +-0.876052766091664830, -0.876076875759280060, -0.876100983236703160, -0.876125088523873720, -0.876149191620731680, -0.876173292527216650, -0.876197391243268680, -0.876221487768826910, +-0.876245582103831410, -0.876269674248222000, -0.876293764201938830, -0.876317851964920740, -0.876341937537108100, -0.876366020918440510, -0.876390102108857930, -0.876414181108300160, +-0.876438257916706820, -0.876462332534017950, -0.876486404960173160, -0.876510475195112380, -0.876534543238775440, -0.876558609091102170, -0.876582672752032720, -0.876606734221506260, +-0.876630793499462820, -0.876654850585842920, -0.876678905480585470, -0.876702958183630750, -0.876727008694918710, -0.876751057014389050, -0.876775103141981700, -0.876799147077636730, +-0.876823188821293730, -0.876847228372892860, -0.876871265732373950, -0.876895300899676820, -0.876919333874741520, -0.876943364657508220, -0.876967393247916060, -0.876991419645905550, +-0.877015443851416390, -0.877039465864389080, -0.877063485684762670, -0.877087503312477530, -0.877111518747473620, -0.877135531989690960, -0.877159543039069400, -0.877183551895549090, +-0.877207558559069840, -0.877231563029571610, -0.877255565306994560, -0.877279565391278600, -0.877303563282364140, -0.877327558980190440, -0.877351552484697760, -0.877375543795826160, +-0.877399532913516130, -0.877423519837706940, -0.877447504568338870, -0.877471487105352050, -0.877495467448686560, -0.877519445598282320, -0.877543421554079490, -0.877567395316018130, +-0.877591366884038270, -0.877615336258079970, -0.877639303438083380, -0.877663268423989010, -0.877687231215735890, -0.877711191813264850, -0.877735150216515710, -0.877759106425429200, +-0.877783060439944360, -0.877807012260002020, -0.877830961885542100, -0.877854909316504780, -0.877878854552830210, -0.877902797594458440, -0.877926738441329730, -0.877950677093384150, +-0.877974613550561940, -0.877998547812803070, -0.878022479880047890, -0.878046409752237020, -0.878070337429309620, -0.878094262911206400, -0.878118186197867970, -0.878142107289233590, +-0.878166026185243980, -0.878189942885839290, -0.878213857390959700, -0.878237769700545570, -0.878261679814536960, -0.878285587732874130, -0.878309493455497360, -0.878333396982346800, +-0.878357298313362840, -0.878381197448485530, -0.878405094387655790, -0.878428989130812800, -0.878452881677897370, -0.878476772028849660, -0.878500660183610500, -0.878524546142119280, +-0.878548429904316700, -0.878572311470143030, -0.878596190839538550, -0.878620068012443630, -0.878643942988798550, -0.878667815768543580, -0.878691686351619090, -0.878715554737965370, +-0.878739420927522770, -0.878763284920232150, -0.878787146716032750, -0.878811006314865530, -0.878834863716670740, -0.878858718921389340, -0.878882571928960580, -0.878906422739325510, +-0.878930271352424300, -0.878954117768197430, -0.878977961986585290, -0.879001804007528250, -0.879025643830966710, -0.879049481456841030, -0.879073316885091600, -0.879097150115658920, +-0.879120981148483800, -0.879144809983505860, -0.879168636620665800, -0.879192461059904230, -0.879216283301161860, -0.879240103344378410, -0.879263921189494590, -0.879287736836451120, +-0.879311550285188260, -0.879335361535646510, -0.879359170587766360, -0.879382977441488300, -0.879406782096752710, -0.879430584553500210, -0.879454384811671260, -0.879478182871206380, +-0.879501978732046500, -0.879525772394131210, -0.879549563857401460, -0.879573353121798180, -0.879597140187261210, -0.879620925053731350, -0.879644707721149110, -0.879668488189455200, +-0.879692266458590000, -0.879716042528494110, -0.879739816399108250, -0.879763588070372690, -0.879787357542228250, -0.879811124814615430, -0.879834889887474710, -0.879858652760747260, +-0.879882413434372790, -0.879906171908292230, -0.879929928182446200, -0.879953682256775840, -0.879977434131220870, -0.880001183805722230, -0.880024931280220750, -0.880048676554656790, +-0.880072419628971310, -0.880096160503104690, -0.880119899176997620, -0.880143635650590840, -0.880167369923825050, -0.880191101996640750, -0.880214831868979090, -0.880238559540780010, +-0.880262285011984450, -0.880286008282533230, -0.880309729352367400, -0.880333448221426900, -0.880357164889652650, -0.880380879356985610, -0.880404591623366260, -0.880428301688735540, +-0.880452009553034040, -0.880475715216202490, -0.880499418678181600, -0.880523119938912190, -0.880546818998335090, -0.880570515856391230, -0.880594210513020670, -0.880617902968164670, +-0.880641593221763830, -0.880665281273759540, -0.880688967124091500, -0.880712650772701110, -0.880736332219529070, -0.880760011464516210, -0.880783688507603360, -0.880807363348731220, +-0.880831035987840630, -0.880854706424872510, -0.880878374659767700, -0.880902040692466910, -0.880925704522910970, -0.880949366151041250, -0.880973025576797570, -0.880996682800121440, +-0.881020337820954010, -0.881043990639235330, -0.881067641254906660, -0.881091289667908840, -0.881114935878182900, -0.881138579885669570, -0.881162221690309780, -0.881185861292044350, +-0.881209498690814330, -0.881233133886560660, -0.881256766879224050, -0.881280397668745550, -0.881304026255066430, -0.881327652638126960, -0.881351276817868290, -0.881374898794231370, +-0.881398518567157670, -0.881422136136587260, -0.881445751502461520, -0.881469364664721370, -0.881492975623307750, -0.881516584378161830, -0.881540190929224310, -0.881563795276436470, +-0.881587397419739020, -0.881610997359073110, -0.881634595094379690, -0.881658190625600250, -0.881681783952674820, -0.881705375075545030, -0.881728963994151790, -0.881752550708436500, +-0.881776135218339530, -0.881799717523802150, -0.881823297624765410, -0.881846875521170470, -0.881870451212958370, -0.881894024700070170, -0.881917595982446900, -0.881941165060029620, +-0.881964731932759370, -0.881988296600577320, -0.882011859063425050, -0.882035419321242630, -0.882058977373971650, -0.882082533221553170, -0.882106086863928880, -0.882129638301038970, +-0.882153187532824900, -0.882176734559227850, -0.882200279380188970, -0.882223821995649420, -0.882247362405550350, -0.882270900609832820, -0.882294436608438090, -0.882317970401307220, +-0.882341501988381460, -0.882365031369601870, -0.882388558544910160, -0.882412083514246710, -0.882435606277552910, -0.882459126834770680, -0.882482645185840080, -0.882506161330702920, +-0.882529675269300370, -0.882553187001573590, -0.882576696527463840, -0.882600203846912400, -0.882623708959860420, -0.882647211866249170, -0.882670712566019920, -0.882694211059113830, +-0.882717707345472280, -0.882741201425036870, -0.882764693297747980, -0.882788182963547440, -0.882811670422376400, -0.882835155674176590, -0.882858638718888480, -0.882882119556453790, +-0.882905598186813800, -0.882929074609909770, -0.882952548825683080, -0.882976020834075000, -0.882999490635026920, -0.883022958228480090, -0.883046423614375910, -0.883069886792655630, +-0.883093347763260980, -0.883116806526132670, -0.883140263081212300, -0.883163717428441240, -0.883187169567761330, -0.883210619499113060, -0.883234067222438250, -0.883257512737678270, +-0.883280956044774520, -0.883304397143668370, -0.883327836034301210, -0.883351272716614510, -0.883374707190549560, -0.883398139456047950, -0.883421569513050840, -0.883444997361500390, +-0.883468423001336880, -0.883491846432502450, -0.883515267654938260, -0.883538686668586480, -0.883562103473387370, -0.883585518069283200, -0.883608930456215140, -0.883632340634124770, +-0.883655748602953480, -0.883679154362642880, -0.883702557913134460, -0.883725959254369590, -0.883749358386289760, -0.883772755308836590, -0.883796150021951550, -0.883819542525576480, +-0.883842932819652210, -0.883866320904120650, -0.883889706778923650, -0.883913090444001900, -0.883936471899297470, -0.883959851144751840, -0.883983228180306720, -0.884006603005903390, +-0.884029975621483550, -0.884053346026988820, -0.884076714222360780, -0.884100080207540830, -0.884123443982470780, -0.884146805547092020, -0.884170164901346810, -0.884193522045175650, +-0.884216876978520690, -0.884240229701323540, -0.884263580213526360, -0.884286928515069630, -0.884310274605895730, -0.884333618485946050, -0.884356960155162410, -0.884380299613486300, +-0.884403636860859430, -0.884426971897223520, -0.884450304722520060, -0.884473635336690990, -0.884496963739677790, -0.884520289931422620, -0.884543613911866200, -0.884566935680950790, +-0.884590255238618120, -0.884613572584810210, -0.884636887719467910, -0.884660200642533370, -0.884683511353948400, -0.884706819853654510, -0.884730126141593740, -0.884753430217707580, +-0.884776732081937860, -0.884800031734226280, -0.884823329174514670, -0.884846624402744750, -0.884869917418858560, -0.884893208222797270, -0.884916496814502910, -0.884939783193917420, +-0.884963067360982740, -0.884986349315640020, -0.885009629057831540, -0.885032906587498890, -0.885056181904583910, -0.885079455009028630, -0.885102725900774550, -0.885125994579763820, +-0.885149261045937940, -0.885172525299238950, -0.885195787339608800, -0.885219047166988960, -0.885242304781322040, -0.885265560182548980, -0.885288813370611940, -0.885312064345453290, +-0.885335313107014080, -0.885358559655236580, -0.885381803990062720, -0.885405046111434340, -0.885428286019293350, -0.885451523713581600, -0.885474759194241010, -0.885497992461213630, +-0.885521223514441180, -0.885544452353865700, -0.885567678979429120, -0.885590903391073710, -0.885614125588740640, -0.885637345572372280, -0.885660563341910570, -0.885683778897297880, +-0.885706992238475270, -0.885730203365385220, -0.885753412277969670, -0.885776618976170550, -0.885799823459929910, -0.885823025729189690, -0.885846225783891830, -0.885869423623978580, +-0.885892619249391670, -0.885915812660073240, -0.885939003855965580, -0.885962192837010170, -0.885985379603149160, -0.886008564154324720, -0.886031746490479330, -0.886054926611554160, +-0.886078104517491690, -0.886101280208233870, -0.886124453683722950, -0.886147624943900760, -0.886170793988709680, -0.886193960818091430, -0.886217125431988380, -0.886240287830342590, +-0.886263448013095980, -0.886286605980191160, -0.886309761731569500, -0.886332915267173390, -0.886356066586944990, -0.886379215690826780, -0.886402362578760150, -0.886425507250687580, +-0.886448649706551350, -0.886471789946293390, -0.886494927969856070, -0.886518063777181340, -0.886541197368211460, -0.886564328742888600, -0.886587457901155010, -0.886610584842952630, +-0.886633709568224290, -0.886656832076911150, -0.886679952368956030, -0.886703070444301080, -0.886726186302888800, -0.886749299944660560, -0.886772411369559200, -0.886795520577526750, +-0.886818627568505490, -0.886841732342437680, -0.886864834899265600, -0.886887935238931390, -0.886911033361377330, -0.886934129266545690, -0.886957222954378730, -0.886980314424818620, +-0.887003403677808280, -0.887026490713288980, -0.887049575531203450, -0.887072658131493940, -0.887095738514103170, -0.887118816678972740, -0.887141892626045260, -0.887164966355262980, +-0.887188037866568300, -0.887211107159903590, -0.887234174235211000, -0.887257239092433040, -0.887280301731512070, -0.887303362152390250, -0.887326420355009970, -0.887349476339314160, +-0.887372530105244190, -0.887395581652742900, -0.887418630981752670, -0.887441678092216300, -0.887464722984075300, -0.887487765657272500, -0.887510806111750260, -0.887533844347450970, +-0.887556880364317120, -0.887579914162291090, -0.887602945741315260, -0.887625975101332010, -0.887649002242283940, -0.887672027164113310, -0.887695049866762950, -0.887718070350174690, +-0.887741088614291130, -0.887764104659054860, -0.887787118484408830, -0.887810130090294520, -0.887833139476654990, -0.887856146643432490, -0.887879151590569630, -0.887902154318008900, +-0.887925154825692900, -0.887948153113563900, -0.887971149181564500, -0.887994143029637310, -0.888017134657724690, -0.888040124065769710, -0.888063111253713950, -0.888086096221500480, +-0.888109078969071650, -0.888132059496370640, -0.888155037803339040, -0.888178013889919900, -0.888200987756055600, -0.888223959401688970, -0.888246928826762370, -0.888269896031218420, +-0.888292861014999820, -0.888315823778048960, -0.888338784320308660, -0.888361742641721300, -0.888384698742229580, -0.888407652621776570, -0.888430604280304070, -0.888453553717754920, +-0.888476500934072040, -0.888499445929198160, -0.888522388703075430, -0.888545329255646550, -0.888568267586854480, -0.888591203696641680, -0.888614137584950890, -0.888637069251724810, +-0.888659998696905930, -0.888682925920437180, -0.888705850922261060, -0.888728773702320280, -0.888751694260558000, -0.888774612596916150, -0.888797528711337660, -0.888820442603765470, +-0.888843354274142410, -0.888866263722410730, -0.888889170948513270, -0.888912075952392970, -0.888934978733992410, -0.888957879293254430, -0.888980777630121730, -0.889003673744537150, +-0.889026567636443280, -0.889049459305783160, -0.889072348752499190, -0.889095235976534950, -0.889118120977832050, -0.889141003756333980, -0.889163884311983340, -0.889186762644723410, +-0.889209638754496100, -0.889232512641244700, -0.889255384304912130, -0.889278253745441010, -0.889301120962774250, -0.889323985956854690, -0.889346848727625260, -0.889369709275028670, +-0.889392567599007760, -0.889415423699505440, -0.889438277576464990, -0.889461129229828450, -0.889483978659538990, -0.889506825865539750, -0.889529670847773680, -0.889552513606183150, +-0.889575354140711320, -0.889598192451301010, -0.889621028537895380, -0.889643862400437020, -0.889666694038869110, -0.889689523453134460, -0.889712350643175890, -0.889735175608936560, +-0.889757998350359290, -0.889780818867386910, -0.889803637159963020, -0.889826453228029560, -0.889849267071530000, -0.889872078690407630, -0.889894888084604710, -0.889917695254064610, +-0.889940500198730170, -0.889963302918544530, -0.889986103413450640, -0.890008901683391530, -0.890031697728310140, -0.890054491548149420, -0.890077283142852500, -0.890100072512362450, +-0.890122859656622190, -0.890145644575575210, -0.890168427269163680, -0.890191207737331070, -0.890213985980020440, -0.890236761997175270, -0.890259535788737730, -0.890282307354651410, +-0.890305076694859370, -0.890327843809304520, -0.890350608697930150, -0.890373371360679290, -0.890396131797494880, -0.890418890008320310, -0.890441645993098390, -0.890464399751772380, +-0.890487151284285790, -0.890509900590580880, -0.890532647670601250, -0.890555392524289950, -0.890578135151590680, -0.890600875552445600, -0.890623613726798320, -0.890646349674592000, +-0.890669083395769780, -0.890691814890274940, -0.890714544158050510, -0.890737271199039780, -0.890759996013185780, -0.890782718600431900, -0.890805438960721170, -0.890828157093997210, +-0.890850873000202490, -0.890873586679280520, -0.890896298131174660, -0.890919007355828410, -0.890941714353184370, -0.890964419123185910, -0.890987121665776430, -0.891009821980899170, +-0.891032520068497310, -0.891055215928514220, -0.891077909560893060, -0.891100600965577080, -0.891123290142509570, -0.891145977091633900, -0.891168661812893340, -0.891191344306231480, +-0.891214024571590820, -0.891236702608915190, -0.891259378418148170, -0.891282051999232270, -0.891304723352111190, -0.891327392476728430, -0.891350059373027140, -0.891372724040950580, +-0.891395386480442360, -0.891418046691445640, -0.891440704673903790, -0.891463360427760200, -0.891486013952958230, -0.891508665249441170, -0.891531314317152820, -0.891553961156035800, +-0.891576605766033920, -0.891599248147090570, -0.891621888299149460, -0.891644526222153180, -0.891667161916045670, -0.891689795380770090, -0.891712426616270150, -0.891735055622489230, +-0.891757682399370480, -0.891780306946857610, -0.891802929264894020, -0.891825549353423060, -0.891848167212388240, -0.891870782841733380, -0.891893396241401180, -0.891916007411335480, +-0.891938616351479750, -0.891961223061777940, -0.891983827542172650, -0.892006429792607800, -0.892029029813026790, -0.892051627603373310, -0.892074223163590750, -0.892096816493622600, +-0.892119407593412350, -0.892141996462903710, -0.892164583102039940, -0.892187167510764770, -0.892209749689022110, -0.892232329636754700, -0.892254907353906450, -0.892277482840420850, +-0.892300056096241970, -0.892322627121312610, -0.892345195915576710, -0.892367762478977760, -0.892390326811459360, -0.892412888912965220, -0.892435448783438830, -0.892458006422823800, +-0.892480561831063830, -0.892503115008102420, -0.892525665953883160, -0.892548214668349770, -0.892570761151446290, -0.892593305403115430, -0.892615847423301360, -0.892638387211948100, +-0.892660924768998390, -0.892683460094396360, -0.892705993188085740, -0.892728524050010130, -0.892751052680113230, -0.892773579078338650, -0.892796103244630210, -0.892818625178931400, +-0.892841144881186160, -0.892863662351337960, -0.892886177589330640, -0.892908690595108250, -0.892931201368613700, -0.892953709909791170, -0.892976216218584470, -0.892998720294937540, +-0.893021222138793420, -0.893043721750096160, -0.893066219128789700, -0.893088714274817730, -0.893111207188123870, -0.893133697868652040, -0.893156186316345970, -0.893178672531149460, +-0.893201156513006240, -0.893223638261860130, -0.893246117777655280, -0.893268595060334740, -0.893291070109842770, -0.893313542926123080, -0.893336013509119950, -0.893358481858776420, +-0.893380947975036640, -0.893403411857844550, -0.893425873507143860, -0.893448332922878510, -0.893470790104992420, -0.893493245053429200, -0.893515697768133000, -0.893538148249047430, +-0.893560596496116630, -0.893583042509284660, -0.893605486288494680, -0.893627927833690940, -0.893650367144817490, -0.893672804221818500, -0.893695239064636990, -0.893717671673217470, +-0.893740102047503760, -0.893762530187439790, -0.893784956092969480, -0.893807379764036900, -0.893829801200585750, -0.893852220402560070, -0.893874637369903910, -0.893897052102561100, +-0.893919464600475780, -0.893941874863592110, -0.893964282891853370, -0.893986688685203920, -0.894009092243588040, -0.894031493566949220, -0.894053892655231500, -0.894076289508379140, +-0.894098684126336090, -0.894121076509046260, -0.894143466656453720, -0.894165854568502620, -0.894188240245136770, -0.894210623686300440, -0.894233004891937470, -0.894255383861991990, +-0.894277760596408400, -0.894300135095130070, -0.894322507358101480, -0.894344877385266470, -0.894367245176569740, -0.894389610731954550, -0.894411974051365300, -0.894434335134746130, +-0.894456693982041080, -0.894479050593194210, -0.894501404968149890, -0.894523757106851950, -0.894546107009244640, -0.894568454675272130, -0.894590800104878350, -0.894613143298008120, +-0.894635484254604480, -0.894657822974612270, -0.894680159457975410, -0.894702493704638610, -0.894724825714545150, -0.894747155487639610, -0.894769483023866160, -0.894791808323169070, +-0.894814131385492370, -0.894836452210780450, -0.894858770798977350, -0.894881087150027340, -0.894903401263874580, -0.894925713140463320, -0.894948022779738170, -0.894970330181642630, +-0.894992635346121170, -0.895014938273118180, -0.895037238962578250, -0.895059537414444770, -0.895081833628662450, -0.895104127605175660, -0.895126419343928450, -0.895148708844865190, +-0.895170996107930160, -0.895193281133067730, -0.895215563920222060, -0.895237844469337410, -0.895260122780358160, -0.895282398853228690, -0.895304672687893490, -0.895326944284296270, +-0.895349213642381740, -0.895371480762094610, -0.895393745643378260, -0.895416008286177620, -0.895438268690436970, -0.895460526856100560, -0.895482782783112890, -0.895505036471418210, +-0.895527287920961030, -0.895549537131685610, -0.895571784103536330, -0.895594028836457560, -0.895616271330393790, -0.895638511585289730, -0.895660749601088880, -0.895682985377736270, +-0.895705218915176180, -0.895727450213353430, -0.895749679272211610, -0.895771906091695660, -0.895794130671749960, -0.895816353012318880, -0.895838573113346910, -0.895860790974778550, +-0.895883006596558170, -0.895905219978630370, -0.895927431120939420, -0.895949640023429920, -0.895971846686046680, -0.895994051108733540, -0.896016253291435190, -0.896038453234096140, +-0.896060650936661430, -0.896082846399074760, -0.896105039621280850, -0.896127230603224410, -0.896149419344849930, -0.896171605846101890, -0.896193790106924790, -0.896215972127263230, +-0.896238151907061690, -0.896260329446264880, -0.896282504744817190, -0.896304677802663540, -0.896326848619747980, -0.896349017196015230, -0.896371183531409880, -0.896393347625876970, +-0.896415509479360330, -0.896437669091804890, -0.896459826463155360, -0.896481981593356240, -0.896504134482352110, -0.896526285130087700, -0.896548433536507480, -0.896570579701556290, +-0.896592723625178610, -0.896614865307319150, -0.896637004747922410, -0.896659141946933640, -0.896681276904296660, -0.896703409619956430, -0.896725540093858080, -0.896747668325945550, +-0.896769794316163770, -0.896791918064457460, -0.896814039570771440, -0.896836158835050300, -0.896858275857238760, -0.896880390637281640, -0.896902503175123430, -0.896924613470708950, +-0.896946721523982910, -0.896968827334890140, -0.896990930903375670, -0.897013032229383560, -0.897035131312858720, -0.897057228153746110, -0.897079322751990870, -0.897101415107536940, +-0.897123505220329460, -0.897145593090313160, -0.897167678717432860, -0.897189762101633480, -0.897211843242859630, -0.897233922141056130, -0.897255998796167910, -0.897278073208139570, +-0.897300145376916160, -0.897322215302442720, -0.897344282984663400, -0.897366348423523360, -0.897388411618967430, -0.897410472570940860, -0.897432531279387710, -0.897454587744253240, +-0.897476641965482380, -0.897498693943019840, -0.897520743676810560, -0.897542791166799470, -0.897564836412931280, -0.897586879415151140, -0.897608920173403770, -0.897630958687634100, +-0.897652994957787390, -0.897675028983807800, -0.897697060765640600, -0.897719090303230830, -0.897741117596523750, -0.897763142645463420, -0.897785165449995200, -0.897807186010064150, +-0.897829204325615080, -0.897851220396593040, -0.897873234222942850, -0.897895245804609670, -0.897917255141538420, -0.897939262233673930, -0.897961267080961360, -0.897983269683345520, +-0.898005270040772020, -0.898027268153184900, -0.898049264020529540, -0.898071257642751530, -0.898093249019794930, -0.898115238151605210, -0.898137225038127430, -0.898159209679306510, +-0.898181192075087620, -0.898203172225415790, -0.898225150130235960, -0.898247125789493280, -0.898269099203132800, -0.898291070371099560, -0.898313039293338610, -0.898335005969795540, +-0.898356970400414510, -0.898378932585141010, -0.898400892523920300, -0.898422850216697650, -0.898444805663417450, -0.898466758864025380, -0.898488709818466290, -0.898510658526685440, +-0.898532604988627970, -0.898554549204238940, -0.898576491173463610, -0.898598430896247020, -0.898620368372534340, -0.898642303602270820, -0.898664236585401840, -0.898686167321871900, +-0.898708095811626580, -0.898730022054610940, -0.898751946050770690, -0.898773867800050200, -0.898795787302395070, -0.898817704557750450, -0.898839619566061510, -0.898861532327273500, +-0.898883442841331810, -0.898905351108181370, -0.898927257127767660, -0.898949160900035740, -0.898971062424930860, -0.898992961702398840, -0.899014858732383960, -0.899036753514831920, +-0.899058646049687990, -0.899080536336897880, -0.899102424376406080, -0.899124310168158080, -0.899146193712099470, -0.899168075008175300, -0.899189954056330840, -0.899211830856511680, +-0.899233705408662880, -0.899255577712729790, -0.899277447768657700, -0.899299315576392090, -0.899321181135878560, -0.899343044447061590, -0.899364905509887120, -0.899386764324300310, +-0.899408620890247090, -0.899430475207671830, -0.899452327276520470, -0.899474177096738160, -0.899496024668270500, -0.899517869991062760, -0.899539713065060420, -0.899561553890208640, +-0.899583392466453140, -0.899605228793739050, -0.899627062872012000, -0.899648894701217120, -0.899670724281300570, -0.899692551612206740, -0.899714376693881430, -0.899736199526270370, +-0.899758020109319050, -0.899779838442972380, -0.899801654527176090, -0.899823468361875660, -0.899845279947016570, -0.899867089282544220, -0.899888896368404190, -0.899910701204541970, +-0.899932503790902950, -0.899954304127432710, -0.899976102214076650, -0.899997898050780790, -0.900019691637489740, -0.900041482974149430, -0.900063272060705470, -0.900085058897103660, +-0.900106843483288950, -0.900128625819207050, -0.900150405904803550, -0.900172183740024060, -0.900193959324814160, -0.900215732659119250, -0.900237503742885140, -0.900259272576057200, +-0.900281039158581040, -0.900302803490402370, -0.900324565571467010, -0.900346325401719880, -0.900368082981106930, -0.900389838309573750, -0.900411591387066500, -0.900433342213529660, +-0.900455090788909620, -0.900476837113151850, -0.900498581186201960, -0.900520323008005550, -0.900542062578508440, -0.900563799897656110, -0.900585534965394290, -0.900607267781668660, +-0.900628998346424850, -0.900650726659608880, -0.900672452721165810, -0.900694176531041560, -0.900715898089181840, -0.900737617395532820, -0.900759334450039310, -0.900781049252647460, +-0.900802761803302990, -0.900824472101951600, -0.900846180148539120, -0.900867885943011150, -0.900889589485313500, -0.900911290775391780, -0.900932989813191920, -0.900954686598659520, +-0.900976381131740390, -0.900998073412380810, -0.901019763440525590, -0.901041451216120890, -0.901063136739112650, -0.901084820009446900, -0.901106501027068800, -0.901128179791924390, +-0.901149856303959500, -0.901171530563120050, -0.901193202569351760, -0.901214872322600450, -0.901236539822811930, -0.901258205069932040, -0.901279868063906700, -0.901301528804681730, +-0.901323187292203180, -0.901344843526416420, -0.901366497507267490, -0.901388149234702340, -0.901409798708667110, -0.901431445929107070, -0.901453090895968480, -0.901474733609197050, +-0.901496374068738840, -0.901518012274539650, -0.901539648226545530, -0.901561281924702200, -0.901582913368955690, -0.901604542559251930, -0.901626169495536760, -0.901647794177756530, +-0.901669416605856530, -0.901691036779782910, -0.901712654699481810, -0.901734270364899280, -0.901755883775980820, -0.901777494932672560, -0.901799103834920680, -0.901820710482670980, +-0.901842314875869520, -0.901863917014462220, -0.901885516898395130, -0.901907114527614300, -0.901928709902065640, -0.901950303021695320, -0.901971893886449490, -0.901993482496273650, +-0.902015068851113930, -0.902036652950916730, -0.902058234795628190, -0.902079814385193690, -0.902101391719559610, -0.902122966798672100, -0.902144539622477200, -0.902166110190920970, +-0.902187678503949430, -0.902209244561508640, -0.902230808363544750, -0.902252369910003900, -0.902273929200832160, -0.902295486235975440, -0.902317041015380570, -0.902338593538992590, +-0.902360143806758220, -0.902381691818623820, -0.902403237574534780, -0.902424781074437690, -0.902446322318278590, -0.902467861306003760, -0.902489398037559230, -0.902510932512891160, +-0.902532464731945820, -0.902553994694669350, -0.902575522401007910, -0.902597047850907550, -0.902618571044314640, -0.902640091981175670, -0.902661610661436130, -0.902683127085042500, +-0.902704641251941160, -0.902726153162078490, -0.902747662815400090, -0.902769170211852550, -0.902790675351382020, -0.902812178233934890, -0.902833678859457310, -0.902855177227895430, +-0.902876673339195630, -0.902898167193304290, -0.902919658790167450, -0.902941148129731360, -0.902962635211942870, -0.902984120036747440, -0.903005602604091680, -0.903027082913921970, +-0.903048560966184800, -0.903070036760825980, -0.903091510297792000, -0.903112981577029240, -0.903134450598484070, -0.903155917362102770, -0.903177381867831700, -0.903198844115617130, +-0.903220304105405440, -0.903241761837143000, -0.903263217310776190, -0.903284670526251610, -0.903306121483515080, -0.903327570182513200, -0.903349016623192450, -0.903370460805499540, +-0.903391902729379970, -0.903413342394780770, -0.903434779801648210, -0.903456214949928670, -0.903477647839568520, -0.903499078470514360, -0.903520506842712460, -0.903541932956109290, +-0.903563356810651360, -0.903584778406284930, -0.903606197742956590, -0.903627614820613160, -0.903649029639200350, -0.903670442198664880, -0.903691852498953780, -0.903713260540012550, +-0.903734666321788230, -0.903756069844227290, -0.903777471107276130, -0.903798870110881340, -0.903820266854989280, -0.903841661339546580, -0.903863053564499810, -0.903884443529795360, +-0.903905831235379710, -0.903927216681199570, -0.903948599867201770, -0.903969980793332130, -0.903991359459537460, -0.904012735865764470, -0.904034110011959880, -0.904055481898069720, +-0.904076851524040940, -0.904098218889819890, -0.904119583995353420, -0.904140946840587880, -0.904162307425470100, -0.904183665749946460, -0.904205021813963670, -0.904226375617468330, +-0.904247727160407020, -0.904269076442726800, -0.904290423464373490, -0.904311768225294130, -0.904333110725435430, -0.904354450964744210, -0.904375788943166500, -0.904397124660649370, +-0.904418458117139500, -0.904439789312583400, -0.904461118246927760, -0.904482444920119420, -0.904503769332104970, -0.904525091482831000, -0.904546411372244450, -0.904567729000291700, +-0.904589044366920110, -0.904610357472075520, -0.904631668315705070, -0.904652976897755370, -0.904674283218173670, -0.904695587276905910, -0.904716889073899130, -0.904738188609100160, +-0.904759485882455690, -0.904780780893912450, -0.904802073643417360, -0.904823364130917020, -0.904844652356358360, -0.904865938319687980, -0.904887222020852810, -0.904908503459799560, +-0.904929782636475390, -0.904951059550826440, -0.904972334202799770, -0.904993606592342740, -0.905014876719401280, -0.905036144583922560, -0.905057410185853620, -0.905078673525141040, +-0.905099934601731770, -0.905121193415572730, -0.905142449966610640, -0.905163704254792530, -0.905184956280065120, -0.905206206042375230, -0.905227453541669890, -0.905248698777896380, +-0.905269941751000620, -0.905291182460929990, -0.905312420907631530, -0.905333657091052290, -0.905354891011138640, -0.905376122667837620, -0.905397352061096390, -0.905418579190861770, +-0.905439804057080690, -0.905461026659700070, -0.905482246998666970, -0.905503465073928200, -0.905524680885430700, -0.905545894433121610, -0.905567105716948100, -0.905588314736856410, +-0.905609521492794060, -0.905630725984707840, -0.905651928212545140, -0.905673128176252230, -0.905694325875776580, -0.905715521311065140, -0.905736714482064830, -0.905757905388722690, +-0.905779094030985890, -0.905800280408801230, -0.905821464522115980, -0.905842646370877080, -0.905863825955031450, -0.905885003274526810, -0.905906178329309090, -0.905927351119326100, +-0.905948521644524550, -0.905969689904852160, -0.905990855900255190, -0.906012019630681120, -0.906033181096076890, -0.906054340296389870, -0.906075497231566880, -0.906096651901555190, +-0.906117804306301840, -0.906138954445753990, -0.906160102319858660, -0.906181247928563250, -0.906202391271814570, -0.906223532349560320, -0.906244671161746900, -0.906265807708321880, +-0.906286941989232650, -0.906308074004425590, -0.906329203753848510, -0.906350331237448350, -0.906371456455172360, -0.906392579406967710, -0.906413700092781550, -0.906434818512561250, +-0.906455934666253850, -0.906477048553806620, -0.906498160175166820, -0.906519269530281610, -0.906540376619098590, -0.906561481441564230, -0.906582583997626150, -0.906603684287231700, +-0.906624782310328280, -0.906645878066862590, -0.906666971556782220, -0.906688062780034440, -0.906709151736566520, -0.906730238426325720, -0.906751322849259190, -0.906772405005314530, +-0.906793484894438780, -0.906814562516579330, -0.906835637871683420, -0.906856710959698780, -0.906877781780572100, -0.906898850334250880, -0.906919916620682610, -0.906940980639814880, +-0.906962042391594280, -0.906983101875968640, -0.907004159092885230, -0.907025214042291420, -0.907046266724134460, -0.907067317138361970, -0.907088365284921210, -0.907109411163759430, +-0.907130454774824240, -0.907151496118062780, -0.907172535193423110, -0.907193572000851600, -0.907214606540296180, -0.907235638811704330, -0.907256668815023650, -0.907277696550200960, +-0.907298722017184090, -0.907319745215920290, -0.907340766146357280, -0.907361784808442320, -0.907382801202122780, -0.907403815327346370, -0.907424827184060370, -0.907445836772212240, +-0.907466844091749600, -0.907487849142619820, -0.907508851924770820, -0.907529852438149320, -0.907550850682703140, -0.907571846658380200, -0.907592840365127330, -0.907613831802892350, +-0.907634820971622740, -0.907655807871266100, -0.907676792501770020, -0.907697774863081900, -0.907718754955149310, -0.907739732777919860, -0.907760708331341040, -0.907781681615360550, +-0.907802652629925770, -0.907823621374984730, -0.907844587850484270, -0.907865552056372320, -0.907886513992596570, -0.907907473659104850, -0.907928431055844090, -0.907949386182762330, +-0.907970339039806950, -0.907991289626925880, -0.908012237944066490, -0.908033183991176500, -0.908054127768203600, -0.908075069275095290, -0.908096008511799390, -0.908116945478263490, +-0.908137880174435530, -0.908158812600262540, -0.908179742755692470, -0.908200670640673110, -0.908221596255152420, -0.908242519599077420, -0.908263440672396060, -0.908284359475056040, +-0.908305276007005170, -0.908326190268191170, -0.908347102258561630, -0.908368011978064380, -0.908388919426647120, -0.908409824604257450, -0.908430727510843310, -0.908451628146352720, +-0.908472526510732630, -0.908493422603931290, -0.908514316425896420, -0.908535207976576050, -0.908556097255917350, -0.908576984263868350, -0.908597869000376870, -0.908618751465390840, +-0.908639631658857860, -0.908660509580725750, -0.908681385230942440, -0.908702258609455640, -0.908723129716213160, -0.908743998551162950, -0.908764865114252700, -0.908785729405430560, +-0.908806591424643820, -0.908827451171840610, -0.908848308646969080, -0.908869163849976510, -0.908890016780810940, -0.908910867439420400, -0.908931715825752610, -0.908952561939755600, +-0.908973405781377200, -0.908994247350565220, -0.909015086647267600, -0.909035923671432380, -0.909056758423007260, -0.909077590901940290, -0.909098421108179620, -0.909119249041672630, +-0.909140074702367570, -0.909160898090212170, -0.909181719205155000, -0.909202538047143130, -0.909223354616124910, -0.909244168912048290, -0.909264980934861300, -0.909285790684511760, +-0.909306598160947830, -0.909327403364117440, -0.909348206293968400, -0.909369006950448980, -0.909389805333507330, -0.909410601443090830, -0.909431395279147850, -0.909452186841626430, +-0.909472976130474400, -0.909493763145640010, -0.909514547887071530, -0.909535330354716450, -0.909556110548522920, -0.909576888468439090, -0.909597664114413120, -0.909618437486393040, +-0.909639208584326790, -0.909659977408162510, -0.909680743957848260, -0.909701508233332510, -0.909722270234562760, -0.909743029961487260, -0.909763787414054060, -0.909784542592211530, +-0.909805295495907610, -0.909826046125090880, -0.909846794479708620, -0.909867540559709310, -0.909888284365041210, -0.909909025895652370, -0.909929765151491040, -0.909950502132505280, +-0.909971236838643230, -0.909991969269853040, -0.910012699426082980, -0.910033427307281540, -0.910054152913396200, -0.910074876244375440, -0.910095597300167420, -0.910116316080720520, +-0.910137032585983220, -0.910157746815902890, -0.910178458770428130, -0.910199168449507320, -0.910219875853088610, -0.910240580981120150, -0.910261283833550320, -0.910281984410327150, +-0.910302682711399140, -0.910323378736714320, -0.910344072486221510, -0.910364763959868100, -0.910385453157602890, -0.910406140079373930, -0.910426824725129590, -0.910447507094818250, +-0.910468187188388510, -0.910488865005787960, -0.910509540546965200, -0.910530213811868610, -0.910550884800446550, -0.910571553512647180, -0.910592219948418990, -0.910612884107710130, +-0.910633545990469200, -0.910654205596644670, -0.910674862926184380, -0.910695517979036810, -0.910716170755150540, -0.910736821254473750, -0.910757469476955020, -0.910778115422542940, +-0.910798759091185130, -0.910819400482830500, -0.910840039597427430, -0.910860676434924190, -0.910881310995269140, -0.910901943278411010, -0.910922573284297930, -0.910943201012878400, +-0.910963826464101230, -0.910984449637914250, -0.911005070534266050, -0.911025689153105110, -0.911046305494380040, -0.911066919558039200, -0.911087531344031420, -0.911108140852304400, +-0.911128748082807080, -0.911149353035487830, -0.911169955710295240, -0.911190556107177810, -0.911211154226084010, -0.911231750066962220, -0.911252343629761040, -0.911272934914429070, +-0.911293523920915120, -0.911314110649167010, -0.911334695099133670, -0.911355277270763490, -0.911375857164005150, -0.911396434778807500, -0.911417010115118440, -0.911437583172886920, +-0.911458153952061310, -0.911478722452590430, -0.911499288674422650, -0.911519852617506680, -0.911540414281791110, -0.911560973667224550, -0.911581530773755480, -0.911602085601332930, +-0.911622638149904850, -0.911643188419420160, -0.911663736409827450, -0.911684282121075440, -0.911704825553112720, -0.911725366705888330, -0.911745905579350200, -0.911766442173447270, +-0.911786976488128120, -0.911807508523341690, -0.911828038279036360, -0.911848565755161040, -0.911869090951664240, -0.911889613868494760, -0.911910134505601540, -0.911930652862932730, +-0.911951168940437150, -0.911971682738063730, -0.911992194255761170, -0.912012703493477960, -0.912033210451163480, -0.912053715128765650, -0.912074217526233410, -0.912094717643515680, +-0.912115215480561180, -0.912135711037318610, -0.912156204313736780, -0.912176695309764420, -0.912197184025350330, -0.912217670460443660, -0.912238154614992360, -0.912258636488945780, +-0.912279116082252540, -0.912299593394861550, -0.912320068426721640, -0.912340541177781850, -0.912361011647990330, -0.912381479837296340, -0.912401945745648590, -0.912422409372996010, +-0.912442870719287420, -0.912463329784471530, -0.912483786568497490, -0.912504241071313890, -0.912524693292869670, -0.912545143233114200, -0.912565590891995400, -0.912586036269462660, +-0.912606479365464800, -0.912626920179950730, -0.912647358712869840, -0.912667794964170050, -0.912688228933800860, -0.912708660621711080, -0.912729090027849630, -0.912749517152165460, +-0.912769941994607480, -0.912790364555124630, -0.912810784833665960, -0.912831202830180270, -0.912851618544616940, -0.912872031976924240, -0.912892443127051310, -0.912912851994947430, +-0.912933258580561400, -0.912953662883842500, -0.912974064904739200, -0.912994464643200660, -0.913014862099176040, -0.913035257272614140, -0.913055650163464130, -0.913076040771675030, +-0.913096429097195910, -0.913116815139975560, -0.913137198899963250, -0.913157580377108370, -0.913177959571359050, -0.913198336482664910, -0.913218711110974860, -0.913239083456238170, +-0.913259453518403650, -0.913279821297420910, -0.913300186793238210, -0.913320550005805030, -0.913340910935070530, -0.913361269580983740, -0.913381625943493810, -0.913401980022549800, +-0.913422331818100840, -0.913442681330095980, -0.913463028558484820, -0.913483373503215730, -0.913503716164238200, -0.913524056541501480, -0.913544394634954520, -0.913564730444546560, +-0.913585063970227210, -0.913605395211944730, -0.913625724169648820, -0.913646050843288650, -0.913666375232813240, -0.913686697338171980, -0.913707017159314020, -0.913727334696188390, +-0.913747649948744580, -0.913767962916931850, -0.913788273600698920, -0.913808581999995370, -0.913828888114770250, -0.913849191944972940, -0.913869493490552690, -0.913889792751459100, +-0.913910089727640540, -0.913930384419046840, -0.913950676825627250, -0.913970966947330820, -0.913991254784107030, -0.914011540335905150, -0.914031823602674430, -0.914052104584364030, +-0.914072383280923550, -0.914092659692302360, -0.914112933818449160, -0.914133205659313660, -0.914153475214845020, -0.914173742484992840, -0.914194007469706580, -0.914214270168935080, +-0.914234530582627710, -0.914254788710734180, -0.914275044553203630, -0.914295298109985440, -0.914315549381028990, -0.914335798366283650, -0.914356045065698900, -0.914376289479224000, +-0.914396531606808670, -0.914416771448401720, -0.914437009003952860, -0.914457244273411460, -0.914477477256727010, -0.914497707953848770, -0.914517936364726670, -0.914538162489309300, +-0.914558386327546600, -0.914578607879387940, -0.914598827144782690, -0.914619044123680450, -0.914639258816030480, -0.914659471221782480, -0.914679681340885730, -0.914699889173290260, +-0.914720094718944550, -0.914740297977798660, -0.914760498949802050, -0.914780697634904220, -0.914800894033054650, -0.914821088144203150, -0.914841279968298560, -0.914861469505290790, +-0.914881656755129340, -0.914901841717763790, -0.914922024393143630, -0.914942204781218350, -0.914962382881937650, -0.914982558695250910, -0.915002732221108170, -0.915022903459458250, +-0.915043072410251070, -0.915063239073436120, -0.915083403448963220, -0.915103565536781740, -0.915123725336841720, -0.915143882849091980, -0.915164038073482570, -0.915184191009963070, +-0.915204341658483080, -0.915224490018992200, -0.915244636091440130, -0.915264779875776480, -0.915284921371950940, -0.915305060579913010, -0.915325197499612830, -0.915345332130999220, +-0.915365464474022340, -0.915385594528631770, -0.915405722294777350, -0.915425847772408870, -0.915445970961475400, -0.915466091861926960, -0.915486210473713370, -0.915506326796784230, +-0.915526440831089360, -0.915546552576578240, -0.915566662033200810, -0.915586769200906760, -0.915606874079645690, -0.915626976669367880, -0.915647076970022230, -0.915667174981558920, +-0.915687270703927750, -0.915707364137078210, -0.915727455280960450, -0.915747544135524280, -0.915767630700718980, -0.915787714976494470, -0.915807796962800790, -0.915827876659587650, +-0.915847954066804750, -0.915868029184401910, -0.915888102012329060, -0.915908172550535920, -0.915928240798972840, -0.915948306757588650, -0.915968370426333720, -0.915988431805157880, +-0.916008490894011040, -0.916028547692842920, -0.916048602201603780, -0.916068654420242770, -0.916088704348710040, -0.916108751986955740, -0.916128797334929360, -0.916148840392581150, +-0.916168881159860730, -0.916188919636718110, -0.916208955823103240, -0.916228989718966380, -0.916249021324256670, -0.916269050638924390, -0.916289077662919450, -0.916309102396191790, +-0.916329124838691440, -0.916349144990368570, -0.916369162851172540, -0.916389178421053610, -0.916409191699961710, -0.916429202687846890, -0.916449211384658960, -0.916469217790348070, +-0.916489221904864150, -0.916509223728157130, -0.916529223260177050, -0.916549220500874280, -0.916569215450198090, -0.916589208108098850, -0.916609198474526710, -0.916629186549431480, +-0.916649172332763660, -0.916669155824472500, -0.916689137024508490, -0.916709115932821560, -0.916729092549361970, -0.916749066874079640, -0.916769038906924520, -0.916789008647846960, +-0.916808976096796790, -0.916828941253724160, -0.916848904118579560, -0.916868864691312350, -0.916888822971873020, -0.916908778960211500, -0.916928732656278170, -0.916948684060022940, +-0.916968633171396430, -0.916988579990347890, -0.917008524516827910, -0.917028466750786640, -0.917048406692174240, -0.917068344340940870, -0.917088279697036550, -0.917108212760411550, +-0.917128143531016020, -0.917148072008800440, -0.917167998193714420, -0.917187922085708320, -0.917207843684732400, -0.917227762990736940, -0.917247680003672070, -0.917267594723488290, +-0.917287507150135300, -0.917307417283563460, -0.917327325123723060, -0.917347230670564340, -0.917367133924037570, -0.917387034884093010, -0.917406933550680810, -0.917426829923751240, +-0.917446724003255000, -0.917466615789141570, -0.917486505281361660, -0.917506392479865430, -0.917526277384603240, -0.917546159995525360, -0.917566040312582490, -0.917585918335724000, +-0.917605794064900840, -0.917625667500063250, -0.917645538641161380, -0.917665407488145730, -0.917685274040966450, -0.917705138299574120, -0.917725000263918900, -0.917744859933951160, +-0.917764717309621610, -0.917784572390879960, -0.917804425177676910, -0.917824275669962720, -0.917844123867687880, -0.917863969770803090, -0.917883813379257950, -0.917903654693003390, +-0.917923493711989560, -0.917943330436167160, -0.917963164865486240, -0.917982996999897600, -0.918002826839351300, -0.918022654383798040, -0.918042479633188190, -0.918062302587472350, +-0.918082123246600550, -0.918101941610523280, -0.918121757679191350, -0.918141571452554820, -0.918161382930564480, -0.918181192113171060, -0.918200999000324260, -0.918220803591975000, +-0.918240605888073660, -0.918260405888570830, -0.918280203593417000, -0.918299999002562650, -0.918319792115958380, -0.918339582933554550, -0.918359371455302110, -0.918379157681150970, +-0.918398941611051840, -0.918418723244955440, -0.918438502582812120, -0.918458279624572600, -0.918478054370187810, -0.918497826819607450, -0.918517596972782570, -0.918537364829663640, +-0.918557130390201370, -0.918576893654346140, -0.918596654622048760, -0.918616413293259830, -0.918636169667929710, -0.918655923746009680, -0.918675675527449330, -0.918695425012199920, +-0.918715172200211930, -0.918734917091435950, -0.918754659685822710, -0.918774399983323110, -0.918794137983887320, -0.918813873687466030, -0.918833607094010070, -0.918853338203470150, +-0.918873067015796850, -0.918892793530940890, -0.918912517748852960, -0.918932239669483790, -0.918951959292783950, -0.918971676618704600, -0.918991391647195680, -0.919011104378208210, +-0.919030814811693130, -0.919050522947600920, -0.919070228785882740, -0.919089932326488720, -0.919109633569369810, -0.919129332514476820, -0.919149029161760440, -0.919168723511171630, +-0.919188415562660950, -0.919208105316179140, -0.919227792771677210, -0.919247477929105660, -0.919267160788415860, -0.919286841349557850, -0.919306519612482660, -0.919326195577141130, +-0.919345869243484160, -0.919365540611462580, -0.919385209681027440, -0.919404876452128870, -0.919424540924718260, -0.919444203098746190, -0.919463862974163600, -0.919483520550921420, +-0.919503175828970340, -0.919522828808261420, -0.919542479488745350, -0.919562127870373500, -0.919581773953095930, -0.919601417736863990, -0.919621059221628400, -0.919640698407340310, +-0.919660335293950300, -0.919679969881409990, -0.919699602169669280, -0.919719232158679570, -0.919738859848391770, -0.919758485238756920, -0.919778108329725730, -0.919797729121249350, +-0.919817347613278710, -0.919836963805764520, -0.919856577698658470, -0.919876189291910510, -0.919895798585472100, -0.919915405579294190, -0.919935010273327690, -0.919954612667523760, +-0.919974212761833670, -0.919993810556207660, -0.920013406050597120, -0.920032999244953080, -0.920052590139226470, -0.920072178733368440, -0.920091765027330030, -0.920111349021062170, +-0.920130930714515900, -0.920150510107642260, -0.920170087200392840, -0.920189661992717680, -0.920209234484568480, -0.920228804675896180, -0.920248372566651820, -0.920267938156786980, +-0.920287501446251820, -0.920307062434998050, -0.920326621122976470, -0.920346177510138470, -0.920365731596434870, -0.920385283381817130, -0.920404832866236090, -0.920424380049642890, +-0.920443924931988900, -0.920463467513225280, -0.920483007793302720, -0.920502545772172720, -0.920522081449786310, -0.920541614826094650, -0.920561145901048980, -0.920580674674600810, +-0.920600201146700490, -0.920619725317299850, -0.920639247186349710, -0.920658766753801650, -0.920678284019606500, -0.920697798983715730, -0.920717311646080510, -0.920736822006651860, +-0.920756330065381600, -0.920775835822220220, -0.920795339277119210, -0.920814840430029810, -0.920834339280903300, -0.920853835829691050, -0.920873330076344420, -0.920892822020814240, +-0.920912311663051870, -0.920931799003008810, -0.920951284040636310, -0.920970766775885520, -0.920990247208707810, -0.921009725339054450, -0.921029201166876810, -0.921048674692126590, +-0.921068145914754280, -0.921087614834711580, -0.921107081451949860, -0.921126545766420500, -0.921146007778074650, -0.921165467486864230, -0.921184924892739730, -0.921204379995652970, +-0.921223832795555200, -0.921243283292397910, -0.921262731486132360, -0.921282177376710030, -0.921301620964082300, -0.921321062248200430, -0.921340501229015900, -0.921359937906480520, +-0.921379372280544890, -0.921398804351160950, -0.921418234118279940, -0.921437661581853250, -0.921457086741832800, -0.921476509598169400, -0.921495930150814550, -0.921515348399720050, +-0.921534764344837050, -0.921554177986117160, -0.921573589323511850, -0.921592998356972610, -0.921612405086450810, -0.921631809511898050, -0.921651211633266020, -0.921670611450505660, +-0.921690008963568790, -0.921709404172406880, -0.921728797076971530, -0.921748187677214110, -0.921767575973086560, -0.921786961964539800, -0.921806345651525530, -0.921825727033995460, +-0.921845106111901070, -0.921864482885193960, -0.921883857353825610, -0.921903229517747610, -0.921922599376911460, -0.921941966931269290, -0.921961332180771810, -0.921980695125370950, +-0.922000055765018420, -0.922019414099665700, -0.922038770129264500, -0.922058123853766620, -0.922077475273123230, -0.922096824387286020, -0.922116171196206810, -0.922135515699837200, +-0.922154857898128680, -0.922174197791033160, -0.922193535378502130, -0.922212870660487180, -0.922232203636940470, -0.922251534307812810, -0.922270862673056360, -0.922290188732622810, +-0.922309512486463760, -0.922328833934530910, -0.922348153076776310, -0.922367469913150990, -0.922386784443607110, -0.922406096668096140, -0.922425406586569910, -0.922444714198980220, +-0.922464019505278790, -0.922483322505417200, -0.922502623199347390, -0.922521921587021070, -0.922541217668390150, -0.922560511443405900, -0.922579802912020460, -0.922599092074185330, +-0.922618378929852660, -0.922637663478974250, -0.922656945721501360, -0.922676225657386160, -0.922695503286580450, -0.922714778609035840, -0.922734051624704340, -0.922753322333537800, +-0.922772590735487790, -0.922791856830506460, -0.922811120618545420, -0.922830382099556920, -0.922849641273492120, -0.922868898140303150, -0.922888152699942070, -0.922907404952360570, +-0.922926654897510470, -0.922945902535344140, -0.922965147865812740, -0.922984390888868410, -0.923003631604463080, -0.923022870012548790, -0.923042106113077240, -0.923061339906000480, +-0.923080571391270310, -0.923099800568838780, -0.923119027438658040, -0.923138252000679340, -0.923157474254855060, -0.923176694201137130, -0.923195911839477470, -0.923215127169828010, +-0.923234340192141010, -0.923253550906367850, -0.923272759312460890, -0.923291965410371950, -0.923311169200053180, -0.923330370681456400, -0.923349569854533760, -0.923368766719237070, +-0.923387961275518590, -0.923407153523330470, -0.923426343462624200, -0.923445531093352030, -0.923464716415466010, -0.923483899428918290, -0.923503080133660780, -0.923522258529645870, +-0.923541434616825030, -0.923560608395150530, -0.923579779864574620, -0.923598949025049130, -0.923618115876526310, -0.923637280418958320, -0.923656442652296960, -0.923675602576494610, +-0.923694760191503210, -0.923713915497275220, -0.923733068493762130, -0.923752219180916430, -0.923771367558690050, -0.923790513627035350, -0.923809657385904700, -0.923828798835249490, +-0.923847937975022400, -0.923867074805175380, -0.923886209325660680, -0.923905341536430560, -0.923924471437436940, -0.923943599028632210, -0.923962724309968510, -0.923981847281397980, +-0.924000967942873120, -0.924020086294345510, -0.924039202335767750, -0.924058316067091990, -0.924077427488270380, -0.924096536599255500, -0.924115643399999080, -0.924134747890453470, +-0.924153850070570940, -0.924172949940303860, -0.924192047499604370, -0.924211142748424860, -0.924230235686717360, -0.924249326314434350, -0.924268414631527980, -0.924287500637950950, +-0.924306584333654760, -0.924325665718592200, -0.924344744792715440, -0.924363821555976850, -0.924382896008328570, -0.924401968149723530, -0.924421037980113210, -0.924440105499450330, +-0.924459170707687020, -0.924478233604775990, -0.924497294190669280, -0.924516352465319270, -0.924535408428678540, -0.924554462080699140, -0.924573513421333980, -0.924592562450534670, +-0.924611609168254020, -0.924630653574444290, -0.924649695669057970, -0.924668735452047420, -0.924687772923365350, -0.924706808082963460, -0.924725840930794570, -0.924744871466811170, +-0.924763899690965510, -0.924782925603210070, -0.924801949203497340, -0.924820970491779800, -0.924839989468009720, -0.924859006132139780, -0.924878020484122600, -0.924897032523910090, +-0.924916042251454960, -0.924935049666709700, -0.924954054769626890, -0.924973057560159240, -0.924992058038258570, -0.925011056203877800, -0.925030052056969310, -0.925049045597485800, +-0.925068036825379640, -0.925087025740603420, -0.925106012343109520, -0.925124996632850750, -0.925143978609779370, -0.925162958273848420, -0.925181935625009720, -0.925200910663216190, +-0.925219883388420430, -0.925238853800574910, -0.925257821899632570, -0.925276787685545440, -0.925295751158266230, -0.925314712317747650, -0.925333671163942380, -0.925352627696802930, +-0.925371581916281770, -0.925390533822331830, -0.925409483414905480, -0.925428430693955310, -0.925447375659434580, -0.925466318311295000, -0.925485258649489610, -0.925504196673971100, +-0.925523132384692080, -0.925542065781605250, -0.925560996864663530, -0.925579925633819080, -0.925598852089024700, -0.925617776230233340, -0.925636698057397460, -0.925655617570469770, +-0.925674534769403090, -0.925693449654150120, -0.925712362224663470, -0.925731272480896260, -0.925750180422800550, -0.925769086050329370, -0.925787989363435540, -0.925806890362071640, +-0.925825789046190620, -0.925844685415745380, -0.925863579470688090, -0.925882471210971890, -0.925901360636549490, -0.925920247747373690, -0.925939132543397330, -0.925958015024573090, +-0.925976895190853800, -0.925995773042192270, -0.926014648578541650, -0.926033521799854100, -0.926052392706082750, -0.926071261297180430, -0.926090127573099830, -0.926108991533794110, +-0.926127853179216090, -0.926146712509318130, -0.926165569524053380, -0.926184424223374770, -0.926203276607235120, -0.926222126675587230, -0.926240974428383930, -0.926259819865578370, +-0.926278662987123140, -0.926297503792971270, -0.926316342283076020, -0.926335178457389550, -0.926354012315865120, -0.926372843858455750, -0.926391673085114160, -0.926410499995793830, +-0.926429324590446800, -0.926448146869026550, -0.926466966831485880, -0.926485784477777740, -0.926504599807855270, -0.926523412821671170, -0.926542223519178700, -0.926561031900330570, +-0.926579837965079810, -0.926598641713379800, -0.926617443145182910, -0.926636242260442500, -0.926655039059111290, -0.926673833541142630, -0.926692625706489360, -0.926711415555104830, +-0.926730203086941430, -0.926748988301952510, -0.926767771200091130, -0.926786551781310310, -0.926805330045563200, -0.926824105992802630, -0.926842879622981840, -0.926861650936053880, +-0.926880419931972120, -0.926899186610689040, -0.926917950972157900, -0.926936713016331960, -0.926955472743164140, -0.926974230152607710, -0.926992985244616040, -0.927011738019141500, +-0.927030488476137670, -0.927049236615557600, -0.927067982437354440, -0.927086725941481340, -0.927105467127891440, -0.927124205996537890, -0.927142942547373840, -0.927161676780352660, +-0.927180408695427060, -0.927199138292550410, -0.927217865571675850, -0.927236590532756640, -0.927255313175746050, -0.927274033500597450, -0.927292751507263420, -0.927311467195697570, +-0.927330180565852920, -0.927348891617682970, -0.927367600351140740, -0.927386306766179500, -0.927405010862752510, -0.927423712640812910, -0.927442412100314080, -0.927461109241209610, +-0.927479804063451980, -0.927498496566994790, -0.927517186751791510, -0.927535874617795190, -0.927554560164959520, -0.927573243393236990, -0.927591924302581530, -0.927610602892946170, +-0.927629279164284280, -0.927647953116549240, -0.927666624749694300, -0.927685294063672840, -0.927703961058438110, -0.927722625733943480, -0.927741288090142670, -0.927759948126988250, +-0.927778605844433950, -0.927797261242433220, -0.927815914320939240, -0.927834565079905470, -0.927853213519285740, -0.927871859639032510, -0.927890503439099730, -0.927909144919440650, +-0.927927784080008640, -0.927946420920757300, -0.927965055441639870, -0.927983687642609740, -0.928002317523620390, -0.928020945084625630, -0.928039570325578160, -0.928058193246431800, +-0.928076813847139910, -0.928095432127655990, -0.928114048087933520, -0.928132661727926300, -0.928151273047587040, -0.928169882046869570, -0.928188488725727460, -0.928207093084113980, +-0.928225695121982940, -0.928244294839287610, -0.928262892235981460, -0.928281487312018210, -0.928300080067351540, -0.928318670501934280, -0.928337258615720360, -0.928355844408663370, +-0.928374427880716670, -0.928393009031833970, -0.928411587861969090, -0.928430164371074840, -0.928448738559105150, -0.928467310426013710, -0.928485879971754020, -0.928504447196279560, +-0.928523012099544020, -0.928541574681500890, -0.928560134942103880, -0.928578692881306460, -0.928597248499062670, -0.928615801795325440, -0.928634352770048800, -0.928652901423186130, +-0.928671447754691240, -0.928689991764518160, -0.928708533452619720, -0.928727072818949950, -0.928745609863462440, -0.928764144586110900, -0.928782676986849020, -0.928801207065630520, +-0.928819734822408980, -0.928838260257138000, -0.928856783369771510, -0.928875304160263320, -0.928893822628566570, -0.928912338774635190, -0.928930852598423010, -0.928949364099883710, +-0.928967873278971010, -0.928986380135638940, -0.929004884669840660, -0.929023386881530080, -0.929041886770661020, -0.929060384337187290, -0.929078879581062610, -0.929097372502240670, +-0.929115863100675400, -0.929134351376320390, -0.929152837329129790, -0.929171320959056860, -0.929189802266055630, -0.929208281250079820, -0.929226757911083330, -0.929245232249020000, +-0.929263704263843860, -0.929282173955508160, -0.929300641323967060, -0.929319106369174360, -0.929337569091083780, -0.929356029489649350, -0.929374487564824880, -0.929392943316564190, +-0.929411396744821090, -0.929429847849549850, -0.929448296630703720, -0.929466743088236740, -0.929485187222102940, -0.929503629032256140, -0.929522068518650380, -0.929540505681239690, +-0.929558940519977450, -0.929577373034817800, -0.929595803225714780, -0.929614231092622200, -0.929632656635494100, -0.929651079854284300, -0.929669500748946830, -0.929687919319435620, +-0.929706335565704590, -0.929724749487708110, -0.929743161085399340, -0.929761570358732750, -0.929779977307662150, -0.929798381932141700, -0.929816784232125550, -0.929835184207567170, +-0.929853581858420820, -0.929871977184640430, -0.929890370186180150, -0.929908760862994010, -0.929927149215035830, -0.929945535242259870, -0.929963918944620050, -0.929982300322070520, +-0.930000679374565430, -0.930019056102058370, -0.930037430504503710, -0.930055802581855500, -0.930074172334067640, -0.930092539761094520, -0.930110904862890280, -0.930129267639408400, +-0.930147628090603470, -0.930165986216429430, -0.930184342016840420, -0.930202695491790470, -0.930221046641233950, -0.930239395465124690, -0.930257741963416930, -0.930276086136065160, +-0.930294427983022980, -0.930312767504244520, -0.930331104699684270, -0.930349439569296280, -0.930367772113034670, -0.930386102330853950, -0.930404430222707580, -0.930422755788550160, +-0.930441079028335950, -0.930459399942018980, -0.930477718529553410, -0.930496034790893710, -0.930514348725993810, -0.930532660334808080, -0.930550969617291000, -0.930569276573396280, +-0.930587581203078270, -0.930605883506291250, -0.930624183482989590, -0.930642481133127530, -0.930660776456659570, -0.930679069453539290, -0.930697360123721280, -0.930715648467160040, +-0.930733934483809590, -0.930752218173624300, -0.930770499536558440, -0.930788778572566370, -0.930807055281602350, -0.930825329663620640, -0.930843601718575940, -0.930861871446421960, +-0.930880138847113290, -0.930898403920604300, -0.930916666666849250, -0.930934927085802940, -0.930953185177418870, -0.930971440941651960, -0.930989694378456360, -0.931007945487786540, +-0.931026194269596870, -0.931044440723841740, -0.931062684850475500, -0.931080926649452520, -0.931099166120727180, -0.931117403264254300, -0.931135638079987670, -0.931153870567881790, +-0.931172100727891360, -0.931190328559970640, -0.931208554064074100, -0.931226777240156460, -0.931244998088171520, -0.931263216608074210, -0.931281432799818790, -0.931299646663359740, +-0.931317858198651650, -0.931336067405648890, -0.931354274284305950, -0.931372478834577410, -0.931390681056417870, -0.931408880949781360, -0.931427078514622700, -0.931445273750896250, +-0.931463466658556620, -0.931481657237558380, -0.931499845487856360, -0.931518031409404370, -0.931536215002157220, -0.931554396266069620, -0.931572575201095930, -0.931590751807190980, +-0.931608926084309010, -0.931627098032404730, -0.931645267651432740, -0.931663434941347960, -0.931681599902104200, -0.931699762533656380, -0.931717922835959220, -0.931736080808967300, +-0.931754236452635110, -0.931772389766917670, -0.931790540751768930, -0.931808689407143900, -0.931826835732997070, -0.931844979729283150, -0.931863121395956840, -0.931881260732972730, +-0.931899397740285410, -0.931917532417849580, -0.931935664765620060, -0.931953794783551560, -0.931971922471598320, -0.931990047829715170, -0.932008170857857030, -0.932026291555978380, +-0.932044409924034370, -0.932062525961979030, -0.932080639669767290, -0.932098751047354070, -0.932116860094693860, -0.932134966811741570, -0.932153071198451810, -0.932171173254779490, +-0.932189272980679110, -0.932207370376105570, -0.932225465441013920, -0.932243558175358310, -0.932261648579093880, -0.932279736652175230, -0.932297822394557270, -0.932315905806194720, +-0.932333986887042830, -0.932352065637055530, -0.932370142056188070, -0.932388216144395380, -0.932406287901632050, -0.932424357327853000, -0.932442424423013060, -0.932460489187067140, +-0.932478551619969950, -0.932496611721676640, -0.932514669492141570, -0.932532724931319780, -0.932550778039166190, -0.932568828815635630, -0.932586877260683010, -0.932604923374263480, +-0.932622967156331420, -0.932641008606841850, -0.932659047725749810, -0.932677084513010120, -0.932695118968577710, -0.932713151092407600, -0.932731180884454500, -0.932749208344673560, +-0.932767233473019820, -0.932785256269447640, -0.932803276733912390, -0.932821294866369000, -0.932839310666772280, -0.932857324135077380, -0.932875335271239450, -0.932893344075212850, +-0.932911350546952840, -0.932929354686414470, -0.932947356493552760, -0.932965355968322640, -0.932983353110679150, -0.933001347920577320, -0.933019340397972070, -0.933037330542818450, +-0.933055318355071830, -0.933073303834686560, -0.933091286981618140, -0.933109267795821370, -0.933127246277251520, -0.933145222425863840, -0.933163196241612810, -0.933181167724453810, +-0.933199136874341860, -0.933217103691232010, -0.933235068175079510, -0.933253030325839280, -0.933270990143466480, -0.933288947627916140, -0.933306902779143520, -0.933324855597103990, +-0.933342806081751910, -0.933360754233042880, -0.933378700050931930, -0.933396643535374220, -0.933414584686324990, -0.933432523503739510, -0.933450459987572480, -0.933468394137779270, +-0.933486325954315020, -0.933504255437135000, -0.933522182586194350, -0.933540107401448220, -0.933558029882851860, -0.933575950030360420, -0.933593867843929390, -0.933611783323513470, +-0.933629696469068020, -0.933647607280548300, -0.933665515757909570, -0.933683421901107090, -0.933701325710096340, -0.933719227184832020, -0.933737126325269510, -0.933755023131364270, +-0.933772917603071460, -0.933790809740346450, -0.933808699543144270, -0.933826587011420410, -0.933844472145130110, -0.933862354944228870, -0.933880235408671490, -0.933898113538413450, +-0.933915989333410130, -0.933933862793616900, -0.933951733918989000, -0.933969602709482150, -0.933987469165050820, -0.934005333285650940, -0.934023195071237660, -0.934041054521766450, +-0.934058911637192570, -0.934076766417471390, -0.934094618862558290, -0.934112468972408740, -0.934130316746977880, -0.934148162186221650, -0.934166005290094640, -0.934183846058552650, +-0.934201684491551050, -0.934219520589045230, -0.934237354350990980, -0.934255185777342900, -0.934273014868056920, -0.934290841623088510, -0.934308666042392820, -0.934326488125925560, +-0.934344307873642090, -0.934362125285497780, -0.934379940361448220, -0.934397753101448790, -0.934415563505455290, -0.934433371573422540, -0.934451177305306470, -0.934468980701062320, +-0.934486781760645810, -0.934504580484012300, -0.934522376871117610, -0.934540170921916770, -0.934557962636365480, -0.934575752014419230, -0.934593539056033600, -0.934611323761164180, +-0.934629106129766460, -0.934646886161795920, -0.934664663857208140, -0.934682439215959060, -0.934700212238003590, -0.934717982923297550, -0.934735751271796640, -0.934753517283456240, +-0.934771280958232030, -0.934789042296080060, -0.934806801296955040, -0.934824557960813100, -0.934842312287609720, -0.934860064277300620, -0.934877813929841370, -0.934895561245187470, +-0.934913306223294830, -0.934931048864118820, -0.934948789167615480, -0.934966527133739840, -0.934984262762447950, -0.935001996053695380, -0.935019727007437850, -0.935037455623630940, +-0.935055181902230800, -0.935072905843192360, -0.935090627446471530, -0.935108346712024250, -0.935126063639806100, -0.935143778229772790, -0.935161490481880020, -0.935179200396083490, +-0.935196907972339010, -0.935214613210602290, -0.935232316110829240, -0.935250016672975250, -0.935267714896996120, -0.935285410782847660, -0.935303104330485690, -0.935320795539866360, +-0.935338484410944690, -0.935356170943676730, -0.935373855138018410, -0.935391536993925520, -0.935409216511353670, -0.935426893690258780, -0.935444568530596770, -0.935462241032323230, +-0.935479911195394090, -0.935497579019765600, -0.935515244505392700, -0.935532907652231850, -0.935550568460238540, -0.935568226929368920, -0.935585883059579130, -0.935603536850824200, +-0.935621188303060400, -0.935638837416243760, -0.935656484190329870, -0.935674128625274880, -0.935691770721034600, -0.935709410477564840, -0.935727047894821530, -0.935744682972760590, +-0.935762315711338280, -0.935779946110509850, -0.935797574170231570, -0.935815199890459470, -0.935832823271149250, -0.935850444312256950, -0.935868063013738930, -0.935885679375550340, +-0.935903293397647660, -0.935920905079986710, -0.935938514422523400, -0.935956121425214000, -0.935973726088014100, -0.935991328410880060, -0.936008928393767590, -0.936026526036633170, +-0.936044121339432040, -0.936061714302120600, -0.936079304924654960, -0.936096893206991080, -0.936114479149084850, -0.936132062750892890, -0.936149644012370330, -0.936167222933473650, +-0.936184799514159010, -0.936202373754382310, -0.936219945654099720, -0.936237515213267260, -0.936255082431840970, -0.936272647309777000, -0.936290209847031710, -0.936307770043560580, +-0.936325327899320100, -0.936342883414266190, -0.936360436588355110, -0.936377987421542990, -0.936395535913786210, -0.936413082065040260, -0.936430625875261490, -0.936448167344406280, +-0.936465706472430660, -0.936483243259290780, -0.936500777704942670, -0.936518309809342700, -0.936535839572447020, -0.936553366994211660, -0.936570892074593210, -0.936588414813547270, +-0.936605935211030190, -0.936623453266998360, -0.936640968981407810, -0.936658482354215230, -0.936675993385376100, -0.936693502074847030, -0.936711008422584150, -0.936728512428543820, +-0.936746014092682100, -0.936763513414955450, -0.936781010395319910, -0.936798505033731970, -0.936815997330147640, -0.936833487284523760, -0.936850974896815790, -0.936868460166980330, +-0.936885943094973750, -0.936903423680752300, -0.936920901924272350, -0.936938377825490500, -0.936955851384362330, -0.936973322600844430, -0.936990791474893390, -0.937008258006465260, +-0.937025722195516500, -0.937043184042003490, -0.937060643545882480, -0.937078100707109840, -0.937095555525642390, -0.937113008001435600, -0.937130458134446290, -0.937147905924630930, +-0.937165351371945790, -0.937182794476347230, -0.937200235237791950, -0.937217673656235870, -0.937235109731635490, -0.937252543463947490, -0.937269974853128020, -0.937287403899133560, +-0.937304830601920710, -0.937322254961445720, -0.937339676977665180, -0.937357096650535680, -0.937374513980013150, -0.937391928966054390, -0.937409341608615660, -0.937426751907653680, +-0.937444159863124790, -0.937461565474985830, -0.937478968743192700, -0.937496369667702110, -0.937513768248470550, -0.937531164485454590, -0.937548558378610730, -0.937565949927895440, +-0.937583339133265300, -0.937600725994676810, -0.937618110512086540, -0.937635492685451320, -0.937652872514727060, -0.937670249999870480, -0.937687625140838370, -0.937704997937587210, +-0.937722368390073950, -0.937739736498254260, -0.937757102262085420, -0.937774465681523670, -0.937791826756525840, -0.937809185487048500, -0.937826541873048150, -0.937843895914481360, +-0.937861247611304850, -0.937878596963475310, -0.937895943970949550, -0.937913288633683620, -0.937930630951634430, -0.937947970924758680, -0.937965308553013080, -0.937982643836354100, +-0.937999976774738900, -0.938017307368123390, -0.938034635616464720, -0.938051961519719370, -0.938069285077844040, -0.938086606290795650, -0.938103925158530690, -0.938121241681005860, +-0.938138555858177960, -0.938155867690004030, -0.938173177176440110, -0.938190484317443230, -0.938207789112970090, -0.938225091562977510, -0.938242391667422290, -0.938259689426261260, +-0.938276984839450770, -0.938294277906947860, -0.938311568628709130, -0.938328857004691600, -0.938346143034851870, -0.938363426719146850, -0.938380708057533150, -0.938397987049967800, +-0.938415263696407710, -0.938432537996809150, -0.938449809951129250, -0.938467079559324850, -0.938484346821352730, -0.938501611737169840, -0.938518874306733090, -0.938536134529998960, +-0.938553392406924370, -0.938570647937466360, -0.938587901121581750, -0.938605151959227450, -0.938622400450360160, -0.938639646594936930, -0.938656890392914560, -0.938674131844249970, +-0.938691370948900320, -0.938708607706821960, -0.938725842117972160, -0.938743074182307620, -0.938760303899785490, -0.938777531270362900, -0.938794756293996110, -0.938811978970642500, +-0.938829199300258880, -0.938846417282802380, -0.938863632918229720, -0.938880846206498030, -0.938898057147564140, -0.938915265741385170, -0.938932471987918070, -0.938949675887120080, +-0.938966877438947580, -0.938984076643357920, -0.939001273500308040, -0.939018468009754970, -0.939035660171655740, -0.939052849985967720, -0.939070037452647170, -0.939087222571651560, +-0.939104405342937930, -0.939121585766463210, -0.939138763842184640, -0.939155939570059050, -0.939173112950043690, -0.939190283982095480, -0.939207452666171890, -0.939224619002229420, +-0.939241782990225320, -0.939258944630116830, -0.939276103921861010, -0.939293260865414870, -0.939310415460735900, -0.939327567707780590, -0.939344717606506290, -0.939361865156870260, +-0.939379010358829540, -0.939396153212341380, -0.939413293717362710, -0.939430431873850890, -0.939447567681762960, -0.939464701141056400, -0.939481832251687800, -0.939498961013614630, +-0.939516087426794040, -0.939533211491183300, -0.939550333206739420, -0.939567452573420110, -0.939584569591181860, -0.939601684259982140, -0.939618796579778200, -0.939635906550527310, +-0.939653014172186610, -0.939670119444713460, -0.939687222368064900, -0.939704322942198300, -0.939721421167071020, -0.939738517042640330, -0.939755610568863140, -0.939772701745696940, +-0.939789790573098860, -0.939806877051026390, -0.939823961179437120, -0.939841042958287520, -0.939858122387535300, -0.939875199467137820, -0.939892274197052350, -0.939909346577236240, +-0.939926416607646640, -0.939943484288241150, -0.939960549618976900, -0.939977612599811160, -0.939994673230701850, -0.940011731511605440, -0.940028787442479750, -0.940045841023282150, +-0.940062892253969880, -0.940079941134500330, -0.940096987664831300, -0.940114031844919480, -0.940131073674722590, -0.940148113154198000, -0.940165150283303160, -0.940182185061995470, +-0.940199217490232280, -0.940216247567970950, -0.940233275295169090, -0.940250300671784390, -0.940267323697773550, -0.940284344373094490, -0.940301362697704480, -0.940318378671561090, +-0.940335392294621820, -0.940352403566844350, -0.940369412488185510, -0.940386419058603210, -0.940403423278054820, -0.940420425146497820, -0.940437424663889800, -0.940454421830188240, +-0.940471416645350610, -0.940488409109334510, -0.940505399222097640, -0.940522386983596910, -0.940539372393790260, -0.940556355452635160, -0.940573336160089200, -0.940590314516109970, +-0.940607290520655170, -0.940624264173681830, -0.940641235475147890, -0.940658204425010800, -0.940675171023228170, -0.940692135269757700, -0.940709097164556860, -0.940726056707583250, +-0.940743013898794560, -0.940759968738148270, -0.940776921225602410, -0.940793871361113920, -0.940810819144640710, -0.940827764576140590, -0.940844707655570930, -0.940861648382889770, +-0.940878586758054360, -0.940895522781022290, -0.940912456451751590, -0.940929387770199630, -0.940946316736324230, -0.940963243350083080, -0.940980167611433770, -0.940997089520334010, +-0.941014009076741600, -0.941030926280614470, -0.941047841131909650, -0.941064753630585280, -0.941081663776599080, -0.941098571569908620, -0.941115477010471820, -0.941132380098246620, +-0.941149280833190050, -0.941166179215260360, -0.941183075244415250, -0.941199968920612420, -0.941216860243809680, -0.941233749213964850, -0.941250635831035520, -0.941267520094979710, +-0.941284402005755360, -0.941301281563319710, -0.941318158767630810, -0.941335033618646570, -0.941351906116324690, -0.941368776260623100, -0.941385644051499830, -0.941402509488912240, +-0.941419372572818270, -0.941436233303175940, -0.941453091679942950, -0.941469947703077240, -0.941486801372536710, -0.941503652688279180, -0.941520501650262460, -0.941537348258444930, +-0.941554192512783610, -0.941571034413236750, -0.941587873959762400, -0.941604711152318360, -0.941621545990862560, -0.941638378475353140, -0.941655208605747470, -0.941672036382003810, +-0.941688861804080070, -0.941705684871934180, -0.941722505585524060, -0.941739323944807750, -0.941756139949743050, -0.941772953600288010, -0.941789764896400540, -0.941806573838039010, +-0.941823380425160780, -0.941840184657724010, -0.941856986535686840, -0.941873786059007180, -0.941890583227643410, -0.941907378041552890, -0.941924170500693880, -0.941940960605024410, +-0.941957748354502520, -0.941974533749086350, -0.941991316788733820, -0.942008097473402970, -0.942024875803051940, -0.942041651777638660, -0.942058425397121480, -0.942075196661458110, +-0.942091965570606590, -0.942108732124525280, -0.942125496323172110, -0.942142258166505100, -0.942159017654482840, -0.942175774787062710, -0.942192529564203190, -0.942209281985862290, +-0.942226032051998170, -0.942242779762568980, -0.942259525117532970, -0.942276268116847950, -0.942293008760472390, -0.942309747048364570, -0.942326482980482050, -0.942343216556783440, +-0.942359947777226650, -0.942376676641770050, -0.942393403150371790, -0.942410127302990230, -0.942426849099583190, -0.942443568540108910, -0.942460285624525770, -0.942477000352791920, +-0.942493712724865480, -0.942510422740704850, -0.942527130400268140, -0.942543835703513630, -0.942560538650399790, -0.942577239240884320, -0.942593937474925700, -0.942610633352482300, +-0.942627326873512250, -0.942644018037974040, -0.942660706845825920, -0.942677393297025820, -0.942694077391532210, -0.942710759129303360, -0.942727438510297720, -0.942744115534473350, +-0.942760790201788820, -0.942777462512202290, -0.942794132465672010, -0.942810800062156450, -0.942827465301614210, -0.942844128184003090, -0.942860788709281470, -0.942877446877408040, +-0.942894102688340950, -0.942910756142038790, -0.942927407238459580, -0.942944055977561810, -0.942960702359303850, -0.942977346383644170, -0.942993988050541130, -0.943010627359953110, +-0.943027264311838590, -0.943043898906155810, -0.943060531142863370, -0.943077161021919850, -0.943093788543283180, -0.943110413706911950, -0.943127036512764750, -0.943143656960799940, +-0.943160275050975990, -0.943176890783251620, -0.943193504157584740, -0.943210115173934160, -0.943226723832258250, -0.943243330132515490, -0.943259934074664460, -0.943276535658663650, +-0.943293134884471420, -0.943309731752046350, -0.943326326261347270, -0.943342918412332090, -0.943359508204959510, -0.943376095639188340, -0.943392680714976840, -0.943409263432283600, +-0.943425843791067530, -0.943442421791286570, -0.943458997432899520, -0.943475570715864960, -0.943492141640141500, -0.943508710205687720, -0.943525276412462200, -0.943541840260423430, +-0.943558401749530100, -0.943574960879741020, -0.943591517651014230, -0.943608072063308660, -0.943624624116582880, -0.943641173810795600, -0.943657721145905400, -0.943674266121871110, +-0.943690808738650970, -0.943707348996203680, -0.943723886894488160, -0.943740422433462790, -0.943756955613086370, -0.943773486433317710, -0.943790014894115180, -0.943806540995437700, +-0.943823064737243870, -0.943839586119492590, -0.943856105142142130, -0.943872621805151300, -0.943889136108479020, -0.943905648052083880, -0.943922157635924910, -0.943938664859960250, +-0.943955169724148950, -0.943971672228449690, -0.943988172372821290, -0.944004670157222450, -0.944021165581611870, -0.944037658645948460, -0.944054149350190830, -0.944070637694297890, +-0.944087123678228670, -0.944103607301941320, -0.944120088565394870, -0.944136567468548350, -0.944153044011360240, -0.944169518193789690, -0.944185990015795510, -0.944202459477336160, +-0.944218926578370590, -0.944235391318857700, -0.944251853698756420, -0.944268313718025440, -0.944284771376623590, -0.944301226674510000, -0.944317679611643260, -0.944334130187982510, +-0.944350578403486240, -0.944367024258113590, -0.944383467751823250, -0.944399908884574370, -0.944416347656325540, -0.944432784067036350, -0.944449218116664710, -0.944465649805170120, +-0.944482079132511480, -0.944498506098647490, -0.944514930703537310, -0.944531352947139860, -0.944547772829413930, -0.944564190350318580, -0.944580605509813150, -0.944597018307855810, +-0.944613428744405900, -0.944629836819422470, -0.944646242532864440, -0.944662645884690840, -0.944679046874860930, -0.944695445503333060, -0.944711841770066620, -0.944728235675020510, +-0.944744627218153890, -0.944761016399425670, -0.944777403218794890, -0.944793787676220580, -0.944810169771661880, -0.944826549505077720, -0.944842926876427460, -0.944859301885669580, +-0.944875674532763440, -0.944892044817668200, -0.944908412740342760, -0.944924778300746620, -0.944941141498838230, -0.944957502334576980, -0.944973860807922010, -0.944990216918832340, +-0.945006570667267120, -0.945022922053185500, -0.945039271076546620, -0.945055617737309510, -0.945071962035433310, -0.945088303970877620, -0.945104643543600800, -0.945120980753562430, +-0.945137315600721560, -0.945153648085037320, -0.945169978206469420, -0.945186305964976210, -0.945202631360517190, -0.945218954393051590, -0.945235275062538680, -0.945251593368937600, +-0.945267909312207390, -0.945284222892307510, -0.945300534109197120, -0.945316842962835360, -0.945333149453181700, -0.945349453580194950, -0.945365755343834600, -0.945382054744059790, +-0.945398351780829870, -0.945414646454104110, -0.945430938763841990, -0.945447228710002200, -0.945463516292544330, -0.945479801511427740, -0.945496084366611590, -0.945512364858055230, +-0.945528642985718040, -0.945544918749559150, -0.945561192149538040, -0.945577463185614200, -0.945593731857746420, -0.945609998165894310, -0.945626262110017210, -0.945642523690074400, +-0.945658782906025340, -0.945675039757829630, -0.945691294245445960, -0.945707546368834140, -0.945723796127953430, -0.945740043522763200, -0.945756288553222800, -0.945772531219291720, +-0.945788771520929440, -0.945805009458095090, -0.945821245030748270, -0.945837478238848560, -0.945853709082355000, -0.945869937561227060, -0.945886163675424330, -0.945902387424906180, +-0.945918608809632300, -0.945934827829561620, -0.945951044484653950, -0.945967258774868650, -0.945983470700165200, -0.945999680260502960, -0.946015887455841640, -0.946032092286140600, +-0.946048294751359320, -0.946064494851457270, -0.946080692586394270, -0.946096887956129230, -0.946113080960622080, -0.946129271599832070, -0.946145459873719010, -0.946161645782242490, +-0.946177829325361650, -0.946194010503036200, -0.946210189315225710, -0.946226365761889790, -0.946242539842988010, -0.946258711558479740, -0.946274880908324790, -0.946291047892482640, +-0.946307212510912770, -0.946323374763575310, -0.946339534650428970, -0.946355692171433890, -0.946371847326549550, -0.946388000115735650, -0.946404150538951660, -0.946420298596157620, +-0.946436444287312550, -0.946452587612376380, -0.946468728571308700, -0.946484867164069210, -0.946501003390617600, -0.946517137250913470, -0.946533268744916390, -0.946549397872586300, +-0.946565524633882880, -0.946581649028765400, -0.946597771057193890, -0.946613890719127830, -0.946630008014527120, -0.946646122943351380, -0.946662235505560500, -0.946678345701113870, +-0.946694453529971390, -0.946710558992092670, -0.946726662087437610, -0.946742762815965920, -0.946758861177637300, -0.946774957172411560, -0.946791050800248390, -0.946807142061107940, +-0.946823230954949250, -0.946839317481732560, -0.946855401641417570, -0.946871483433963990, -0.946887562859331840, -0.946903639917480940, -0.946919714608370770, -0.946935786931961230, +-0.946951856888212260, -0.946967924477083670, -0.946983989698535140, -0.947000052552526840, -0.947016113039018230, -0.947032171157969450, -0.947048226909340210, -0.947064280293090640, +-0.947080331309180120, -0.947096379957568790, -0.947112426238216560, -0.947128470151083150, -0.947144511696128900, -0.947160550873313080, -0.947176587682595940, -0.947192622123937290, +-0.947208654197297050, -0.947224683902635260, -0.947240711239911600, -0.947256736209086350, -0.947272758810119190, -0.947288779042970040, -0.947304796907599390, -0.947320812403966370, +-0.947336825532031360, -0.947352836291754150, -0.947368844683095010, -0.947384850706013750, -0.947400854360470610, -0.947416855646424970, -0.947432854563837300, -0.947448851112667410, +-0.947464845292875450, -0.947480837104421440, -0.947496826547265190, -0.947512813621366970, -0.947528798326686680, -0.947544780663184700, -0.947560760630820510, -0.947576738229554460, +-0.947592713459346480, -0.947608686320156710, -0.947624656811945300, -0.947640624934672380, -0.947656590688297770, -0.947672554072781610, -0.947688515088084050, -0.947704473734165330, +-0.947720430010985270, -0.947736383918504230, -0.947752335456682140, -0.947768284625479350, -0.947784231424856020, -0.947800175854771830, -0.947816117915187270, -0.947832057606062370, +-0.947847994927357380, -0.947863929879032340, -0.947879862461047720, -0.947895792673363210, -0.947911720515939300, -0.947927645988736020, -0.947943569091713620, -0.947959489824832250, +-0.947975408188052260, -0.947991324181333690, -0.948007237804636800, -0.948023149057921840, -0.948039057941149290, -0.948054964454278840, -0.948070868597270850, -0.948086770370085820, +-0.948102669772683870, -0.948118566805025490, -0.948134461467070370, -0.948150353758779100, -0.948166243680112040, -0.948182131231029230, -0.948198016411491260, -0.948213899221458160, +-0.948229779660890280, -0.948245657729748000, -0.948261533427991580, -0.948277406755581590, -0.948293277712477730, -0.948309146298640830, -0.948325012514031010, -0.948340876358608640, +-0.948356737832333980, -0.948372596935167960, -0.948388453667070030, -0.948404308028000910, -0.948420160017921180, -0.948436009636790980, -0.948451856884570680, -0.948467701761220860, +-0.948483544266701670, -0.948499384400973700, -0.948515222163997640, -0.948531057555733080, -0.948546890576140940, -0.948562721225181590, -0.948578549502815390, -0.948594375409002820, +-0.948610198943704690, -0.948626020106880690, -0.948641838898491630, -0.948657655318497990, -0.948673469366860260, -0.948689281043538780, -0.948705090348494150, -0.948720897281686850, +-0.948736701843077230, -0.948752504032626120, -0.948768303850293540, -0.948784101296040180, -0.948799896369826530, -0.948815689071613180, -0.948831479401360590, -0.948847267359029580, +-0.948863052944580070, -0.948878836157972970, -0.948894616999168770, -0.948910395468128050, -0.948926171564811400, -0.948941945289179190, -0.948957716641192220, -0.948973485620810960, +-0.948989252227995910, -0.949005016462708070, -0.949020778324907390, -0.949036537814554770, -0.949052294931610810, -0.949068049676036090, -0.949083802047791520, -0.949099552046837160, +-0.949115299673134020, -0.949131044926642460, -0.949146787807323420, -0.949162528315137370, -0.949178266450044990, -0.949194002212007000, -0.949209735600983980, -0.949225466616936630, +-0.949241195259825870, -0.949256921529611830, -0.949272645426255450, -0.949288366949717520, -0.949304086099958640, -0.949319802876939620, -0.949335517280621270, -0.949351229310963940, +-0.949366938967928450, -0.949382646251475730, -0.949398351161566230, -0.949414053698161010, -0.949429753861220640, -0.949445451650705820, -0.949461147066577360, -0.949476840108796290, +-0.949492530777322870, -0.949508219072118240, -0.949523904993142990, -0.949539588540357920, -0.949555269713723840, -0.949570948513202010, -0.949586624938752450, -0.949602298990336320, +-0.949617970667914420, -0.949633639971447670, -0.949649306900896770, -0.949664971456222640, -0.949680633637386080, -0.949696293444347920, -0.949711950877069280, -0.949727605935510530, +-0.949743258619632710, -0.949758908929396740, -0.949774556864763640, -0.949790202425694010, -0.949805845612149200, -0.949821486424089480, -0.949837124861475980, -0.949852760924269730, +-0.949868394612431670, -0.949884025925922470, -0.949899654864703290, -0.949915281428734940, -0.949930905617978440, -0.949946527432394610, -0.949962146871944800, -0.949977763936589280, +-0.949993378626289410, -0.950008990941006100, -0.950024600880700290, -0.950040208445333210, -0.950055813634865350, -0.950071416449258080, -0.950087016888472080, -0.950102614952468620, +-0.950118210641208720, -0.950133803954653190, -0.950149394892763180, -0.950164983455499600, -0.950180569642823600, -0.950196153454696550, -0.950211734891078800, -0.950227313951931610, +-0.950242890637216230, -0.950258464946893590, -0.950274036880924820, -0.950289606439271180, -0.950305173621893370, -0.950320738428752530, -0.950336300859809800, -0.950351860915026440, +-0.950367418594363360, -0.950382973897781700, -0.950398526825242620, -0.950414077376707240, -0.950429625552136950, -0.950445171351492310, -0.950460714774734820, -0.950476255821825490, +-0.950491794492725470, -0.950507330787396020, -0.950522864705798500, -0.950538396247893490, -0.950553925413642590, -0.950569452203006810, -0.950584976615947430, -0.950600498652425570, +-0.950616018312402500, -0.950631535595839460, -0.950647050502697490, -0.950662563032938170, -0.950678073186522090, -0.950693580963410940, -0.950709086363565880, -0.950724589386948040, +-0.950740090033518670, -0.950755588303239360, -0.950771084196070930, -0.950786577711974720, -0.950802068850912010, -0.950817557612844140, -0.950833043997732500, -0.950848528005538100, +-0.950864009636222420, -0.950879488889746720, -0.950894965766072350, -0.950910440265160810, -0.950925912386972880, -0.950941382131470170, -0.950956849498614030, -0.950972314488365720, +-0.950987777100686940, -0.951003237335538490, -0.951018695192881850, -0.951034150672678600, -0.951049603774889900, -0.951065054499477090, -0.951080502846401780, -0.951095948815625200, +-0.951111392407108620, -0.951126833620813740, -0.951142272456701910, -0.951157708914734170, -0.951173142994872210, -0.951188574697077290, -0.951204004021311000, -0.951219430967534700, +-0.951234855535710190, -0.951250277725798070, -0.951265697537760360, -0.951281114971558430, -0.951296530027153750, -0.951311942704507580, -0.951327353003581730, -0.951342760924337450, +-0.951358166466736210, -0.951373569630739820, -0.951388970416309320, -0.951404368823406290, -0.951419764851992420, -0.951435158502029090, -0.951450549773477980, -0.951465938666300690, +-0.951481325180458250, -0.951496709315912460, -0.951512091072625020, -0.951527470450557190, -0.951542847449670880, -0.951558222069927350, -0.951573594311288180, -0.951588964173715190, +-0.951604331657169960, -0.951619696761613620, -0.951635059487008110, -0.951650419833314890, -0.951665777800495660, -0.951681133388512010, -0.951696486597325750, -0.951711837426898020, +-0.951727185877190630, -0.951742531948165380, -0.951757875639783760, -0.951773216952007450, -0.951788555884798050, -0.951803892438117360, -0.951819226611926860, -0.951834558406188360, +-0.951849887820863660, -0.951865214855914020, -0.951880539511301250, -0.951895861786987260, -0.951911181682933540, -0.951926499199102220, -0.951941814335454330, -0.951957127091951900, +-0.951972437468556640, -0.951987745465230240, -0.952003051081934610, -0.952018354318631240, -0.952033655175282050, -0.952048953651848720, -0.952064249748292960, -0.952079543464576790, +-0.952094834800661590, -0.952110123756509270, -0.952125410332081650, -0.952140694527340510, -0.952155976342247690, -0.952171255776765090, -0.952186532830854190, -0.952201807504476920, +-0.952217079797595070, -0.952232349710170570, -0.952247617242165220, -0.952262882393540840, -0.952278145164259130, -0.952293405554282210, -0.952308663563571910, -0.952323919192089810, +-0.952339172439797820, -0.952354423306657980, -0.952369671792631990, -0.952384917897681870, -0.952400161621769660, -0.952415402964856940, -0.952430641926905520, -0.952445878507877650, +-0.952461112707735040, -0.952476344526439590, -0.952491573963953340, -0.952506801020238100, -0.952522025695255900, -0.952537247988968880, -0.952552467901338520, -0.952567685432326950, +-0.952582900581896210, -0.952598113350008100, -0.952613323736624880, -0.952628531741708470, -0.952643737365220570, -0.952658940607123310, -0.952674141467378610, -0.952689339945948620, +-0.952704536042795260, -0.952719729757880550, -0.952734921091166640, -0.952750110042615340, -0.952765296612188670, -0.952780480799849120, -0.952795662605558150, -0.952810842029277900, +-0.952826019070970640, -0.952841193730598280, -0.952856366008123290, -0.952871535903507040, -0.952886703416712000, -0.952901868547700200, -0.952917031296433680, -0.952932191662874570, +-0.952947349646985020, -0.952962505248727050, -0.952977658468062930, -0.952992809304954560, -0.953007957759364420, -0.953023103831254210, -0.953038247520586190, -0.953053388827322600, +-0.953068527751425480, -0.953083664292857070, -0.953098798451579740, -0.953113930227555190, -0.953129059620745790, -0.953144186631113670, -0.953159311258621190, -0.953174433503230390, +-0.953189553364903520, -0.953204670843602720, -0.953219785939290350, -0.953234898651928670, -0.953250008981479490, -0.953265116927905390, -0.953280222491168390, -0.953295325671230880, +-0.953310426468055080, -0.953325524881603380, -0.953340620911837690, -0.953355714558720480, -0.953370805822213900, -0.953385894702280300, -0.953400981198882060, -0.953416065311981310, +-0.953431147041540420, -0.953446226387521630, -0.953461303349887550, -0.953476377928599960, -0.953491450123621350, -0.953506519934914200, -0.953521587362440750, -0.953536652406163250, +-0.953551715066044530, -0.953566775342046150, -0.953581833234130820, -0.953596888742261010, -0.953611941866398860, -0.953626992606506960, -0.953642040962547450, -0.953657086934482920, +-0.953672130522275730, -0.953687171725888130, -0.953702210545282920, -0.953717246980421820, -0.953732281031267730, -0.953747312697782900, -0.953762341979929710, -0.953777368877670950, +-0.953792393390968550, -0.953807415519785210, -0.953822435264083280, -0.953837452623825240, -0.953852467598973570, -0.953867480189490750, -0.953882490395339230, -0.953897498216481510, +-0.953912503652880050, -0.953927506704497550, -0.953942507371296040, -0.953957505653238220, -0.953972501550286680, -0.953987495062403880, -0.954002486189552410, -0.954017474931694860, +-0.954032461288793490, -0.954047445260810870, -0.954062426847709700, -0.954077406049452350, -0.954092382866001620, -0.954107357297319880, -0.954122329343369710, -0.954137299004113810, +-0.954152266279514880, -0.954167231169534950, -0.954182193674137040, -0.954197153793283630, -0.954212111526937300, -0.954227066875060650, -0.954242019837616700, -0.954256970414567360, +-0.954271918605875680, -0.954286864411504120, -0.954301807831415490, -0.954316748865572270, -0.954331687513937150, -0.954346623776472840, -0.954361557653142010, -0.954376489143907490, +-0.954391418248731530, -0.954406344967577040, -0.954421269300406610, -0.954436191247183040, -0.954451110807869040, -0.954466027982427520, -0.954480942770820630, -0.954495855173011390, +-0.954510765188962500, -0.954525672818636760, -0.954540578061996770, -0.954555480919005330, -0.954570381389625240, -0.954585279473819210, -0.954600175171549940, -0.954615068482780550, +-0.954629959407473190, -0.954644847945590900, -0.954659734097096480, -0.954674617861952730, -0.954689499240122810, -0.954704378231568730, -0.954719254836253750, -0.954734129054140680, +-0.954749000885192320, -0.954763870329371380, -0.954778737386640760, -0.954793602056963290, -0.954808464340301870, -0.954823324236619310, -0.954838181745878640, -0.954853036868042240, +-0.954867889603073340, -0.954882739950934640, -0.954897587911589070, -0.954912433484999880, -0.954927276671129310, -0.954942117469940510, -0.954956955881396400, -0.954971791905460000, +-0.954986625542094010, -0.955001456791261580, -0.955016285652925400, -0.955031112127048500, -0.955045936213593900, -0.955060757912524650, -0.955075577223803320, -0.955090394147393050, +-0.955105208683256770, -0.955120020831357390, -0.955134830591658050, -0.955149637964121890, -0.955164442948711280, -0.955179245545389690, -0.955194045754119920, -0.955208843574865020, +-0.955223639007588000, -0.955238432052252010, -0.955253222708819850, -0.955268010977254560, -0.955282796857519600, -0.955297580349577350, -0.955312361453391160, -0.955327140168924060, +-0.955341916496139200, -0.955356690434999490, -0.955371461985468300, -0.955386231147508090, -0.955400997921082460, -0.955415762306154330, -0.955430524302686710, -0.955445283910642760, +-0.955460041129985730, -0.955474795960678520, -0.955489548402684300, -0.955504298455966520, -0.955519046120487660, -0.955533791396211200, -0.955548534283100380, -0.955563274781118130, +-0.955578012890227700, -0.955592748610392450, -0.955607481941575190, -0.955622212883739160, -0.955636941436847520, -0.955651667600863620, -0.955666391375750490, -0.955681112761471500, +-0.955695831757989670, -0.955710548365268250, -0.955725262583270400, -0.955739974411959680, -0.955754683851298800, -0.955769390901251240, -0.955784095561780120, -0.955798797832848820, +-0.955813497714420810, -0.955828195206458790, -0.955842890308926220, -0.955857583021786470, -0.955872273345002690, -0.955886961278538340, -0.955901646822356570, -0.955916329976420620, +-0.955931010740693870, -0.955945689115139550, -0.955960365099721380, -0.955975038694401920, -0.955989709899145000, -0.956004378713913640, -0.956019045138671420, -0.956033709173381600, +-0.956048370818007750, -0.956063030072512700, -0.956077686936860130, -0.956092341411013290, -0.956106993494935660, -0.956121643188590500, -0.956136290491941150, -0.956150935404951220, +-0.956165577927583830, -0.956180218059802800, -0.956194855801571040, -0.956209491152852030, -0.956224124113609350, -0.956238754683806370, -0.956253382863406440, -0.956268008652373380, +-0.956282632050669990, -0.956297253058260080, -0.956311871675107010, -0.956326487901174250, -0.956341101736425280, -0.956355713180823570, -0.956370322234332600, -0.956384928896915730, +-0.956399533168536880, -0.956414135049158840, -0.956428734538745550, -0.956443331637260470, -0.956457926344666980, -0.956472518660928750, -0.956487108586009380, -0.956501696119872010, +-0.956516281262480450, -0.956530864013798170, -0.956545444373788630, -0.956560022342415660, -0.956574597919642500, -0.956589171105432850, -0.956603741899750390, -0.956618310302558510, +-0.956632876313820990, -0.956647439933501210, -0.956662001161562750, -0.956676559997969300, -0.956691116442684340, -0.956705670495672010, -0.956720222156895120, -0.956734771426317800, +-0.956749318303903530, -0.956763862789615890, -0.956778404883418590, -0.956792944585275310, -0.956807481895149750, -0.956822016813005380, -0.956836549338806020, -0.956851079472515460, +-0.956865607214096970, -0.956880132563514560, -0.956894655520731720, -0.956909176085712350, -0.956923694258419940, -0.956938210038818630, -0.956952723426871430, -0.956967234422542500, +-0.956981743025795420, -0.956996249236594100, -0.957010753054902020, -0.957025254480683210, -0.957039753513901140, -0.957054250154519730, -0.957068744402502890, -0.957083236257814000, +-0.957097725720417070, -0.957112212790275700, -0.957126697467353900, -0.957141179751615280, -0.957155659643024070, -0.957170137141543420, -0.957184612247137360, -0.957199084959769800, +-0.957213555279404550, -0.957228023206005420, -0.957242488739536210, -0.957256951879960740, -0.957271412627243020, -0.957285870981346880, -0.957300326942235880, -0.957314780509874060, +-0.957329231684225230, -0.957343680465253420, -0.957358126852922320, -0.957372570847196290, -0.957387012448038480, -0.957401451655413130, -0.957415888469284160, -0.957430322889615490, +-0.957444754916370930, -0.957459184549514620, -0.957473611789010250, -0.957488036634821850, -0.957502459086913450, -0.957516879145249080, -0.957531296809792320, -0.957545712080507210, +-0.957560124957357870, -0.957574535440308240, -0.957588943529322560, -0.957603349224364190, -0.957617752525397490, -0.957632153432386390, -0.957646551945295020, -0.957660948064087080, +-0.957675341788726930, -0.957689733119178380, -0.957704122055405450, -0.957718508597372180, -0.957732892745043030, -0.957747274498381260, -0.957761653857351350, -0.957776030821917310, +-0.957790405392043300, -0.957804777567693110, -0.957819147348831330, -0.957833514735421440, -0.957847879727427690, -0.957862242324814210, -0.957876602527545250, -0.957890960335584740, +-0.957905315748896810, -0.957919668767445610, -0.957934019391195160, -0.957948367620110040, -0.957962713454153620, -0.957977056893290490, -0.957991397937484780, -0.958005736586700410, +-0.958020072840901850, -0.958034406700053240, -0.958048738164118510, -0.958063067233061780, -0.958077393906847540, -0.958091718185439700, -0.958106040068802620, -0.958120359556900340, +-0.958134676649697310, -0.958148991347157470, -0.958163303649245510, -0.958177613555924900, -0.958191921067160330, -0.958206226182916070, -0.958220528903156120, -0.958234829227844860, +-0.958249127156946770, -0.958263422690425640, -0.958277715828245950, -0.958292006570371950, -0.958306294916767890, -0.958320580867398240, -0.958334864422227040, -0.958349145581218640, +-0.958363424344337410, -0.958377700711547710, -0.958391974682813900, -0.958406246258099890, -0.958420515437370390, -0.958434782220589530, -0.958449046607721680, -0.958463308598731520, +-0.958477568193582760, -0.958491825392240090, -0.958506080194667990, -0.958520332600830580, -0.958534582610692350, -0.958548830224217660, -0.958563075441370870, -0.958577318262116450, +-0.958591558686418770, -0.958605796714242290, -0.958620032345551150, -0.958634265580309950, -0.958648496418483150, -0.958662724860035010, -0.958676950904930100, -0.958691174553133020, +-0.958705395804607790, -0.958719614659319100, -0.958733831117231320, -0.958748045178309030, -0.958762256842516590, -0.958776466109818480, -0.958790672980179170, -0.958804877453563240, +-0.958819079529935390, -0.958833279209259540, -0.958847476491500590, -0.958861671376622820, -0.958875863864590890, -0.958890053955369410, -0.958904241648922960, -0.958918426945215670, +-0.958932609844212360, -0.958946790345877380, -0.958960968450175530, -0.958975144157071300, -0.958989317466529160, -0.959003488378513680, -0.959017656892989570, -0.959031823009921510, +-0.959045986729273660, -0.959060148051010810, -0.959074306975097660, -0.959088463501498680, -0.959102617630178570, -0.959116769361102240, -0.959130918694233610, -0.959145065629537720, +-0.959159210166979250, -0.959173352306522680, -0.959187492048132690, -0.959201629391774000, -0.959215764337411290, -0.959229896885009150, -0.959244027034532270, -0.959258154785945560, +-0.959272280139213170, -0.959286403094300130, -0.959300523651171020, -0.959314641809790650, -0.959328757570123920, -0.959342870932135110, -0.959356981895789110, -0.959371090461050620, +-0.959385196627884350, -0.959399300396255090, -0.959413401766127660, -0.959427500737466740, -0.959441597310237040, -0.959455691484403240, -0.959469783259930600, -0.959483872636783250, +-0.959497959614926120, -0.959512044194324120, -0.959526126374942060, -0.959540206156744620, -0.959554283539696960, -0.959568358523763320, -0.959582431108908840, -0.959596501295098210, +-0.959610569082296360, -0.959624634470468090, -0.959638697459578300, -0.959652758049591710, -0.959666816240473230, -0.959680872032187880, -0.959694925424700140, -0.959708976417975150, +-0.959723025011977700, -0.959737071206672620, -0.959751115002024920, -0.959765156397999640, -0.959779195394561360, -0.959793231991674880, -0.959807266189305450, -0.959821297987417890, +-0.959835327385976990, -0.959849354384947780, -0.959863378984295300, -0.959877401183984240, -0.959891420983979950, -0.959905438384246910, -0.959919453384750270, -0.959933465985454930, +-0.959947476186326030, -0.959961483987328280, -0.959975489388427250, -0.959989492389587080, -0.960003492990773370, -0.960017491191950790, -0.960031486993084490, -0.960045480394139510, +-0.960059471395080850, -0.960073459995873460, -0.960087446196482450, -0.960101429996872760, -0.960115411397009840, -0.960129390396858070, -0.960143366996382920, -0.960157341195549300, +-0.960171312994322350, -0.960185282392667320, -0.960199249390548790, -0.960213213987932250, -0.960227176184782590, -0.960241135981064970, -0.960255093376744640, -0.960269048371786500, +-0.960283000966155710, -0.960296951159817500, -0.960310898952736800, -0.960324844344879190, -0.960338787336209250, -0.960352727926692240, -0.960366666116293400, -0.960380601904977980, +-0.960394535292711020, -0.960408466279457970, -0.960422394865183550, -0.960436321049853100, -0.960450244833431890, -0.960464166215885040, -0.960478085197177700, -0.960492001777275230, +-0.960505915956142760, -0.960519827733745560, -0.960533737110048860, -0.960547644085017690, -0.960561548658617430, -0.960575450830813300, -0.960589350601570470, -0.960603247970854280, +-0.960617142938630320, -0.960631035504863060, -0.960644925669518420, -0.960658813432561320, -0.960672698793957220, -0.960686581753671390, -0.960700462311669170, -0.960714340467915710, +-0.960728216222376470, -0.960742089575016830, -0.960755960525801810, -0.960769829074696880, -0.960783695221667290, -0.960797558966678510, -0.960811420309695910, -0.960825279250684950, +-0.960839135789610550, -0.960852989926438310, -0.960866841661133560, -0.960880690993661690, -0.960894537923988160, -0.960908382452078320, -0.960922224577897440, -0.960936064301410990, +-0.960949901622584420, -0.960963736541383340, -0.960977569057772760, -0.960991399171718160, -0.961005226883185020, -0.961019052192138900, -0.961032875098545400, -0.961046695602369440, +-0.961060513703576700, -0.961074329402132670, -0.961088142698002910, -0.961101953591152690, -0.961115762081547700, -0.961129568169153180, -0.961143371853934840, -0.961157173135858020, +-0.961170972014888550, -0.961184768490991330, -0.961198562564132280, -0.961212354234276760, -0.961226143501390350, -0.961239930365438640, -0.961253714826387330, -0.961267496884201430, +-0.961281276538846870, -0.961295053790289120, -0.961308828638493650, -0.961322601083426150, -0.961336371125052210, -0.961350138763337300, -0.961363903998247000, -0.961377666829747230, +-0.961391427257803020, -0.961405185282380280, -0.961418940903444600, -0.961432694120961440, -0.961446444934896730, -0.961460193345216040, -0.961473939351884630, -0.961487682954868310, +-0.961501424154132870, -0.961515162949643900, -0.961528899341366980, -0.961542633329267820, -0.961556364913312090, -0.961570094093465390, -0.961583820869693740, -0.961597545241962280, +-0.961611267210236930, -0.961624986774483490, -0.961638703934667550, -0.961652418690754800, -0.961666131042711260, -0.961679840990502190, -0.961693548534093500, -0.961707253673451000, +-0.961720956408540270, -0.961734656739327230, -0.961748354665777460, -0.961762050187856880, -0.961775743305531170, -0.961789434018766040, -0.961803122327527630, -0.961816808231781170, +-0.961830491731492600, -0.961844172826627930, -0.961857851517152750, -0.961871527803033200, -0.961885201684234640, -0.961898873160722980, -0.961912542232464250, -0.961926208899424040, +-0.961939873161568370, -0.961953535018863050, -0.961967194471273880, -0.961980851518766670, -0.961994506161307330, -0.962008158398862000, -0.962021808231396050, -0.962035455658875600, +-0.962049100681266480, -0.962062743298534580, -0.962076383510645840, -0.962090021317566380, -0.962103656719261680, -0.962117289715697770, -0.962130920306840660, -0.962144548492656290, +-0.962158174273110460, -0.962171797648169290, -0.962185418617798600, -0.962199037181964310, -0.962212653340632770, -0.962226267093769240, -0.962239878441340070, -0.962253487383311290, +-0.962267093919648710, -0.962280698050318460, -0.962294299775286580, -0.962307899094518860, -0.962321496007981340, -0.962335090515640030, -0.962348682617460980, -0.962362272313410320, +-0.962375859603453950, -0.962389444487557920, -0.962403026965688250, -0.962416607037811290, -0.962430184703892520, -0.962443759963898420, -0.962457332817794780, -0.962470903265547850, +-0.962484471307123670, -0.962498036942488590, -0.962511600171608080, -0.962525160994448630, -0.962538719410976350, -0.962552275421157180, -0.962565829024957350, -0.962579380222342910, +-0.962592929013280090, -0.962606475397734920, -0.962620019375673540, -0.962633560947062320, -0.962647100111867050, -0.962660636870053990, -0.962674171221589270, -0.962687703166439150, +-0.962701232704570090, -0.962714759835947680, -0.962728284560538380, -0.962741806878308350, -0.962755326789223710, -0.962768844293250940, -0.962782359390355950, -0.962795872080504990, +-0.962809382363664420, -0.962822890239800500, -0.962836395708879470, -0.962849898770867240, -0.962863399425730290, -0.962876897673434760, -0.962890393513947120, -0.962903886947233610, +-0.962917377973260160, -0.962930866591993340, -0.962944352803399290, -0.962957836607444380, -0.962971318004094970, -0.962984796993317070, -0.962998273575077390, -0.963011747749341840, +-0.963025219516077000, -0.963038688875249350, -0.963052155826824800, -0.963065620370769810, -0.963079082507050770, -0.963092542235634010, -0.963105999556485900, -0.963119454469573030, +-0.963132906974861310, -0.963146357072317330, -0.963159804761907430, -0.963173250043597990, -0.963186692917355480, -0.963200133383146140, -0.963213571440936560, -0.963227007090692980, +-0.963240440332382210, -0.963253871165970050, -0.963267299591423210, -0.963280725608708140, -0.963294149217791330, -0.963307570418639010, -0.963320989211218110, -0.963334405595494440, +-0.963347819571434780, -0.963361231139005510, -0.963374640298173210, -0.963388047048904350, -0.963401451391165400, -0.963414853324922720, -0.963428252850142890, -0.963441649966792490, +-0.963455044674838220, -0.963468436974246110, -0.963481826864982850, -0.963495214347015020, -0.963508599420309200, -0.963521982084832200, -0.963535362340549820, -0.963548740187429200, +-0.963562115625436590, -0.963575488654538790, -0.963588859274702280, -0.963602227485893530, -0.963615593288079220, -0.963628956681226060, -0.963642317665300400, -0.963655676240269150, +-0.963669032406098580, -0.963682386162755370, -0.963695737510206210, -0.963709086448417680, -0.963722432977356600, -0.963735777096989320, -0.963749118807282650, -0.963762458108203050, +-0.963775794999717330, -0.963789129481792180, -0.963802461554394200, -0.963815791217490060, -0.963829118471046350, -0.963842443315029880, -0.963855765749407680, -0.963869085774145650, +-0.963882403389211050, -0.963895718594570350, -0.963909031390190350, -0.963922341776037860, -0.963935649752079680, -0.963948955318282060, -0.963962258474612140, -0.963975559221036620, +-0.963988857557522170, -0.964002153484035620, -0.964015447000543650, -0.964028738107012950, -0.964042026803410560, -0.964055313089703270, -0.964068596965857450, -0.964081878431840230, +-0.964095157487618200, -0.964108434133158280, -0.964121708368427370, -0.964134980193392390, -0.964148249608019700, -0.964161516612276340, -0.964174781206129320, -0.964188043389545220, +-0.964201303162491090, -0.964214560524933710, -0.964227815476839890, -0.964241068018176550, -0.964254318148910720, -0.964267565869008860, -0.964280811178438110, -0.964294054077165400, +-0.964307294565157510, -0.964320532642381380, -0.964333768308804130, -0.964347001564392240, -0.964360232409112840, -0.964373460842932960, -0.964386686865819300, -0.964399910477738990, +-0.964413131678658830, -0.964426350468545970, -0.964439566847367090, -0.964452780815089340, -0.964465992371679960, -0.964479201517105310, -0.964492408251332640, -0.964505612574328870, +-0.964518814486061250, -0.964532013986496680, -0.964545211075601870, -0.964558405753344060, -0.964571598019690280, -0.964584787874607440, -0.964597975318062680, -0.964611160350022920, +-0.964624342970455300, -0.964637523179326830, -0.964650700976604550, -0.964663876362255700, -0.964677049336246980, -0.964690219898545640, -0.964703388049118700, -0.964716553787933310, +-0.964729717114956590, -0.964742878030155790, -0.964756036533497510, -0.964769192624949200, -0.964782346304477790, -0.964795497572050630, -0.964808646427634750, -0.964821792871197180, +-0.964834936902705160, -0.964848078522125840, -0.964861217729426460, -0.964874354524573820, -0.964887488907535400, -0.964900620878278100, -0.964913750436769410, -0.964926877582976240, +-0.964940002316866160, -0.964953124638405770, -0.964966244547562630, -0.964979362044303900, -0.964992477128596700, -0.965005589800408290, -0.965018700059706020, -0.965031807906456930, +-0.965044913340628360, -0.965058016362187690, -0.965071116971101710, -0.965084215167338000, -0.965097310950863820, -0.965110404321646190, -0.965123495279652690, -0.965136583824850680, +-0.965149669957206860, -0.965162753676689020, -0.965175834983264200, -0.965188913876899870, -0.965201990357563160, -0.965215064425221540, -0.965228136079842150, -0.965241205321392570, +-0.965254272149839940, -0.965267336565151850, -0.965280398567295080, -0.965293458156237460, -0.965306515331946110, -0.965319570094388510, -0.965332622443532240, -0.965345672379344100, +-0.965358719901791900, -0.965371765010842760, -0.965384807706464290, -0.965397847988623830, -0.965410885857288740, -0.965423921312426380, -0.965436954354004230, -0.965449984981989750, +-0.965463013196350420, -0.965476038997053480, -0.965489062384066400, -0.965502083357356540, -0.965515101916891600, -0.965528118062638830, -0.965541131794566130, -0.965554143112640210, +-0.965567152016829080, -0.965580158507099990, -0.965593162583420430, -0.965606164245758070, -0.965619163494080280, -0.965632160328354530, -0.965645154748548510, -0.965658146754629690, +-0.965671136346565320, -0.965684123524323090, -0.965697108287870590, -0.965710090637175280, -0.965723070572204860, -0.965736048092926900, -0.965749023199308550, -0.965761995891317730, +-0.965774966168921890, -0.965787934032088620, -0.965800899480785510, -0.965813862514980140, -0.965826823134640190, -0.965839781339733140, -0.965852737130226790, -0.965865690506088500, +-0.965878641467285860, -0.965891590013786660, -0.965904536145558490, -0.965917479862569040, -0.965930421164786110, -0.965943360052176850, -0.965956296524709160, -0.965969230582350740, +-0.965982162225069270, -0.965995091452832470, -0.966008018265607890, -0.966020942663363250, -0.966033864646066220, -0.966046784213684510, -0.966059701366186130, -0.966072616103538230, +-0.966085528425708830, -0.966098438332665620, -0.966111345824376300, -0.966124250900808780, -0.966137153561930530, -0.966150053807709350, -0.966162951638112940, -0.966175847053109220, +-0.966188740052665860, -0.966201630636750690, -0.966214518805331490, -0.966227404558375860, -0.966240287895851810, -0.966253168817727270, -0.966266047323969590, -0.966278923414546800, +-0.966291797089426590, -0.966304668348576980, -0.966317537191965670, -0.966330403619560800, -0.966343267631329610, -0.966356129227240350, -0.966368988407260710, -0.966381845171358610, +-0.966394699519501850, -0.966407551451658350, -0.966420400967796020, -0.966433248067882670, -0.966446092751886420, -0.966458935019774760, -0.966471774871515700, -0.966484612307077270, +-0.966497447326427280, -0.966510279929533640, -0.966523110116364490, -0.966535937886887410, -0.966548763241070530, -0.966561586178881660, -0.966574406700288820, -0.966587224805259940, +-0.966600040493763140, -0.966612853765766110, -0.966625664621237000, -0.966638473060143940, -0.966651279082454410, -0.966664082688136750, -0.966676883877158890, -0.966689682649488850, +-0.966702479005094540, -0.966715272943944330, -0.966728064466005680, -0.966740853571246840, -0.966753640259635840, -0.966766424531140810, -0.966779206385729670, -0.966791985823370560, +-0.966804762844031380, -0.966817537447680400, -0.966830309634285510, -0.966843079403815200, -0.966855846756236810, -0.966868611691518940, -0.966881374209629390, -0.966894134310536500, +-0.966906891994208540, -0.966919647260613080, -0.966932400109718480, -0.966945150541492880, -0.966957898555904420, -0.966970644152921220, -0.966983387332511430, -0.966996128094643080, +-0.967008866439284520, -0.967021602366403780, -0.967034335875969210, -0.967047066967948620, -0.967059795642310260, -0.967072521899022490, -0.967085245738053430, -0.967097967159371240, +-0.967110686162944380, -0.967123402748740530, -0.967136116916728290, -0.967148828666875680, -0.967161537999150940, -0.967174244913522440, -0.967186949409958310, -0.967199651488426790, +-0.967212351148896140, -0.967225048391334830, -0.967237743215710650, -0.967250435621992200, -0.967263125610147600, -0.967275813180145110, -0.967288498331953180, -0.967301181065540310, +-0.967313861380874160, -0.967326539277923340, -0.967339214756656180, -0.967351887817041070, -0.967364558459046120, -0.967377226682639810, -0.967389892487790500, -0.967402555874466440, +-0.967415216842636210, -0.967427875392267710, -0.967440531523329430, -0.967453185235789940, -0.967465836529617480, -0.967478485404780320, -0.967491131861247240, -0.967503775898986170, +-0.967516417517965580, -0.967529056718154030, -0.967541693499519790, -0.967554327862031220, -0.967566959805656990, -0.967579589330365250, -0.967592216436124590, -0.967604841122903350, +-0.967617463390670230, -0.967630083239393370, -0.967642700669041120, -0.967655315679582180, -0.967667928270985020, -0.967680538443218110, -0.967693146196249800, -0.967705751530048560, +-0.967718354444582870, -0.967730954939821420, -0.967743553015732450, -0.967756148672284660, -0.967768741909446510, -0.967781332727186470, -0.967793921125473130, -0.967806507104275290, +-0.967819090663560870, -0.967831671803298770, -0.967844250523457350, -0.967856826824005420, -0.967869400704911450, -0.967881972166144130, -0.967894541207671710, -0.967907107829462990, +-0.967919672031486320, -0.967932233813710630, -0.967944793176104270, -0.967957350118636040, -0.967969904641274300, -0.967982456743987860, -0.967995006426745520, -0.968007553689515410, +-0.968020098532266450, -0.968032640954967220, -0.968045180957586400, -0.968057718540092590, -0.968070253702454700, -0.968082786444640960, -0.968095316766620310, -0.968107844668361310, +-0.968120370149832770, -0.968132893211003260, -0.968145413851841500, -0.968157932072316260, -0.968170447872396140, -0.968182961252050170, -0.968195472211246580, -0.968207980749954180, +-0.968220486868141990, -0.968232990565778500, -0.968245491842832600, -0.968257990699273100, -0.968270487135068470, -0.968282981150187630, -0.968295472744599260, -0.968307961918272290, +-0.968320448671175390, -0.968332933003277270, -0.968345414914546950, -0.968357894404953010, -0.968370371474464360, -0.968382846123050030, -0.968395318350678380, -0.968407788157318430, +-0.968420255542938980, -0.968432720507508950, -0.968445183050997250, -0.968457643173372460, -0.968470100874603500, -0.968482556154659280, -0.968495009013508710, -0.968507459451120600, +-0.968519907467463750, -0.968532353062507290, -0.968544796236219920, -0.968557236988570440, -0.968569675319528200, -0.968582111229061570, -0.968594544717139570, -0.968606975783731230, +-0.968619404428805450, -0.968631830652331270, -0.968644254454277600, -0.968656675834613120, -0.968669094793306980, -0.968681511330328090, -0.968693925445645370, -0.968706337139227940, +-0.968718746411044500, -0.968731153261064290, -0.968743557689256240, -0.968755959695589470, -0.968768359280032580, -0.968780756442554900, -0.968793151183125150, -0.968805543501712660, +-0.968817933398286260, -0.968830320872815180, -0.968842705925268220, -0.968855088555614420, -0.968867468763822900, -0.968879846549862700, -0.968892221913702830, -0.968904594855312550, +-0.968916965374660650, -0.968929333471716390, -0.968941699146449010, -0.968954062398827200, -0.968966423228820210, -0.968978781636397170, -0.968991137621527110, -0.969003491184179280, +-0.969015842324322920, -0.969028191041926720, -0.969040537336960050, -0.969052881209392040, -0.969065222659191820, -0.969077561686328530, -0.969089898290771410, -0.969102232472489500, +-0.969114564231452040, -0.969126893567628040, -0.969139220480987220, -0.969151544971498020, -0.969163867039129930, -0.969176186683852190, -0.969188503905634050, -0.969200818704444860, +-0.969213131080253310, -0.969225441033028990, -0.969237748562741140, -0.969250053669358790, -0.969262356352851410, -0.969274656613188010, -0.969286954450338080, -0.969299249864270740, +-0.969311542854955350, -0.969323833422361170, -0.969336121566457320, -0.969348407287213050, -0.969360690584597840, -0.969372971458580920, -0.969385249909131550, -0.969397525936219310, +-0.969409799539812990, -0.969422070719882180, -0.969434339476396120, -0.969446605809324290, -0.969458869718635930, -0.969471131204300400, -0.969483390266287050, -0.969495646904565240, +-0.969507901119104450, -0.969520152909873810, -0.969532402276842680, -0.969544649219980630, -0.969556893739256910, -0.969569135834640990, -0.969581375506102460, -0.969593612753610220, +-0.969605847577133970, -0.969618079976643070, -0.969630309952106970, -0.969642537503495160, -0.969654762630776990, -0.969666985333921930, -0.969679205612899330, -0.969691423467679000, +-0.969703638898229860, -0.969715851904521590, -0.969728062486523770, -0.969740270644205760, -0.969752476377537030, -0.969764679686487390, -0.969776880571025850, -0.969789079031122100, +-0.969801275066745630, -0.969813468677865890, -0.969825659864452570, -0.969837848626475150, -0.969850034963902980, -0.969862218876705870, -0.969874400364853060, -0.969886579428314580, +-0.969898756067059330, -0.969910930281057350, -0.969923102070277880, -0.969935271434690720, -0.969947438374265670, -0.969959602888971760, -0.969971764978778790, -0.969983924643656460, +-0.969996081883574330, -0.970008236698501890, -0.970020389088408930, -0.970032539053265030, -0.970044686593039770, -0.970056831707702850, -0.970068974397223950, -0.970081114661572430, +-0.970093252500718210, -0.970105387914630750, -0.970117520903279850, -0.970129651466635210, -0.970141779604666520, -0.970153905317343360, -0.970166028604635300, -0.970178149466512150, +-0.970190267902943710, -0.970202383913899570, -0.970214497499349400, -0.970226608659263130, -0.970238717393610230, -0.970250823702360820, -0.970262927585484050, -0.970275029042950040, +-0.970287128074728500, -0.970299224680789000, -0.970311318861101560, -0.970323410615635980, -0.970335499944361630, -0.970347586847248640, -0.970359671324266590, -0.970371753375385390, +-0.970383833000574740, -0.970395910199804650, -0.970407984973044700, -0.970420057320264710, -0.970432127241434910, -0.970444194736524550, -0.970456259805503650, -0.970468322448342140, +-0.970480382665009910, -0.970492440455476670, -0.970504495819712430, -0.970516548757686890, -0.970528599269369850, -0.970540647354731440, -0.970552693013741360, -0.970564736246369520, +-0.970576777052585830, -0.970588815432360200, -0.970600851385662540, -0.970612884912462780, -0.970624916012731040, -0.970636944686436800, -0.970648970933550180, -0.970660994754041110, +-0.970673016147879490, -0.970685035115035680, -0.970697051655479040, -0.970709065769179700, -0.970721077456107690, -0.970733086716233040, -0.970745093549525650, -0.970757097955955550, +-0.970769099935492760, -0.970781099488107090, -0.970793096613768780, -0.970805091312447850, -0.970817083584114120, -0.970829073428737590, -0.970841060846288300, -0.970853045836736480, +-0.970865028400052180, -0.970877008536205180, -0.970888986245165620, -0.970900961526903530, -0.970912934381389150, -0.970924904808592390, -0.970936872808483290, -0.970948838381032080, +-0.970960801526208780, -0.970972762243983430, -0.970984720534326500, -0.970996676397207440, -0.971008629832596730, -0.971020580840464500, -0.971032529420780670, -0.971044475573515700, +-0.971056419298639620, -0.971068360596122340, -0.971080299465934100, -0.971092235908045160, -0.971104169922425650, -0.971116101509045700, -0.971128030667875450, -0.971139957398885150, +-0.971151881702045030, -0.971163803577325350, -0.971175723024695900, -0.971187640044127280, -0.971199554635589490, -0.971211466799052790, -0.971223376534487430, -0.971235283841863860, +-0.971247188721151790, -0.971259091172321900, -0.971270991195344210, -0.971282888790188980, -0.971294783956826560, -0.971306676695227190, -0.971318567005361120, -0.971330454887198710, +-0.971342340340710320, -0.971354223365865850, -0.971366103962635900, -0.971377982130990580, -0.971389857870900380, -0.971401731182335530, -0.971413602065266500, -0.971425470519663330, +-0.971437336545496470, -0.971449200142736170, -0.971461061311353010, -0.971472920051317130, -0.971484776362598890, -0.971496630245168860, -0.971508481698997170, -0.971520330724054190, +-0.971532177320310720, -0.971544021487736550, -0.971555863226302390, -0.971567702535978460, -0.971579539416735360, -0.971591373868543660, -0.971603205891373170, -0.971615035485194790, +-0.971626862649978770, -0.971638687385695590, -0.971650509692315700, -0.971662329569809580, -0.971674147018147580, -0.971685962037300180, -0.971697774627237940, -0.971709584787931460, +-0.971721392519350860, -0.971733197821466720, -0.971745000694249630, -0.971756801137669930, -0.971768599151698330, -0.971780394736305400, -0.971792187891461270, -0.971803978617136740, +-0.971815766913302180, -0.971827552779928270, -0.971839336216985370, -0.971851117224444280, -0.971862895802275250, -0.971874671950449080, -0.971886445668936450, -0.971898216957707390, +-0.971909985816732940, -0.971921752245983430, -0.971933516245429560, -0.971945277815041810, -0.971957036954791190, -0.971968793664647720, -0.971980547944582330, -0.971992299794565470, +-0.972004049214567960, -0.972015796204560250, -0.972027540764513140, -0.972039282894397120, -0.972051022594182860, -0.972062759863841270, -0.972074494703342620, -0.972086227112657690, +-0.972097957091757170, -0.972109684640611870, -0.972121409759192260, -0.972133132447469350, -0.972144852705413400, -0.972156570532995310, -0.972168285930185780, -0.972179998896955610, +-0.972191709433275380, -0.972203417539115880, -0.972215123214447920, -0.972226826459242080, -0.972238527273469160, -0.972250225657100180, -0.972261921610105380, -0.972273615132455800, +-0.972285306224122130, -0.972296994885075260, -0.972308681115286120, -0.972320364914725070, -0.972332046283363010, -0.972343725221170960, -0.972355401728119520, -0.972367075804179580, +-0.972378747449321960, -0.972390416663517550, -0.972402083446736950, -0.972413747798951290, -0.972425409720131360, -0.972437069210247750, -0.972448726269271480, -0.972460380897173350, +-0.972472033093924270, -0.972483682859495160, -0.972495330193857030, -0.972506975096980360, -0.972518617568836290, -0.972530257609395600, -0.972541895218629330, -0.972553530396508270, +-0.972565163143003450, -0.972576793458085680, -0.972588421341725850, -0.972600046793895330, -0.972611669814564370, -0.972623290403704320, -0.972634908561285980, -0.972646524287280380, +-0.972658137581658530, -0.972669748444391470, -0.972681356875449880, -0.972692962874804780, -0.972704566442427420, -0.972716167578288600, -0.972727766282359350, -0.972739362554610690, +-0.972750956395013630, -0.972762547803539210, -0.972774136780158560, -0.972785723324842370, -0.972797307437561880, -0.972808889118288110, -0.972820468366992210, -0.972832045183645080, +-0.972843619568217970, -0.972855191520681670, -0.972866761041007440, -0.972878328129166300, -0.972889892785129270, -0.972901455008867490, -0.972913014800352190, -0.972924572159554300, +-0.972936127086444950, -0.972947679580995260, -0.972959229643176600, -0.972970777272959660, -0.972982322470315800, -0.972993865235216140, -0.973005405567631820, -0.973016943467534200, +-0.973028478934893970, -0.973040011969682590, -0.973051542571871210, -0.973063070741430950, -0.973074596478332940, -0.973086119782548440, -0.973097640654048690, -0.973109159092804820, +-0.973120675098788080, -0.973132188671969930, -0.973143699812320960, -0.973155208519812850, -0.973166714794416630, -0.973178218636103650, -0.973189720044845160, -0.973201219020612520, +-0.973212715563376740, -0.973224209673109080, -0.973235701349780880, -0.973247190593363510, -0.973258677403828100, -0.973270161781146000, -0.973281643725288470, -0.973293123236226850, +-0.973304600313932620, -0.973316074958376800, -0.973327547169530630, -0.973339016947365690, -0.973350484291853220, -0.973361949202964480, -0.973373411680671040, -0.973384871724943920, +-0.973396329335754600, -0.973407784513074530, -0.973419237256874960, -0.973430687567127250, -0.973442135443802870, -0.973453580886873170, -0.973465023896309510, -0.973476464472083470, +-0.973487902614166070, -0.973499338322528880, -0.973510771597143390, -0.973522202437980930, -0.973533630845012990, -0.973545056818211130, -0.973556480357546490, -0.973567901462990660, +-0.973579320134515090, -0.973590736372091150, -0.973602150175690410, -0.973613561545284220, -0.973624970480844290, -0.973636376982341730, -0.973647781049748360, -0.973659182683035750, +-0.973670581882174920, -0.973681978647137680, -0.973693372977895490, -0.973704764874419810, -0.973716154336682460, -0.973727541364654560, -0.973738925958307800, -0.973750308117613650, +-0.973761687842543800, -0.973773065133069720, -0.973784439989162980, -0.973795812410795160, -0.973807182397937730, -0.973818549950562380, -0.973829915068640920, -0.973841277752144350, +-0.973852638001044710, -0.973863995815313350, -0.973875351194922080, -0.973886704139842460, -0.973898054650046310, -0.973909402725504750, -0.973920748366189690, -0.973932091572072720, +-0.973943432343125530, -0.973954770679319790, -0.973966106580627210, -0.973977440047019250, -0.973988771078467710, -0.974000099674944500, -0.974011425836420750, -0.974022749562868500, +-0.974034070854259300, -0.974045389710565090, -0.974056706131757210, -0.974068020117807910, -0.974079331668688320, -0.974090640784370350, -0.974101947464825810, -0.974113251710026380, +-0.974124553519943870, -0.974135852894549960, -0.974147149833816450, -0.974158444337715030, -0.974169736406217620, -0.974181026039295790, -0.974192313236921350, -0.974203597999066080, +-0.974214880325701920, -0.974226160216800530, -0.974237437672333950, -0.974248712692273530, -0.974259985276591300, -0.974271255425259160, -0.974282523138248810, -0.974293788415532270, +-0.974305051257081220, -0.974316311662867470, -0.974327569632863040, -0.974338825167039620, -0.974350078265369350, -0.974361328927823680, -0.974372577154374750, -0.974383822944994260, +-0.974395066299654330, -0.974406307218326880, -0.974417545700983490, -0.974428781747596170, -0.974440015358136960, -0.974451246532577750, -0.974462475270890360, -0.974473701573046800, +-0.974484925439018990, -0.974496146868778830, -0.974507365862298360, -0.974518582419549580, -0.974529796540504200, -0.974541008225134340, -0.974552217473412030, -0.974563424285309070, +-0.974574628660797580, -0.974585830599849710, -0.974597030102437030, -0.974608227168531900, -0.974619421798106120, -0.974630613991131820, -0.974641803747580910, -0.974652991067425530, +-0.974664175950637700, -0.974675358397189440, -0.974686538407052880, -0.974697715980199940, -0.974708891116602530, -0.974720063816233000, -0.974731234079063370, -0.974742401905065560, +-0.974753567294211920, -0.974764730246474250, -0.974775890761824690, -0.974787048840235480, -0.974798204481678530, -0.974809357686126200, -0.974820508453550390, -0.974831656783923250, +-0.974842802677217120, -0.974853946133404040, -0.974865087152456010, -0.974876225734345180, -0.974887361879043900, -0.974898495586524080, -0.974909626856758080, -0.974920755689718250, +-0.974931882085376290, -0.974943006043704650, -0.974954127564675480, -0.974965246648261010, -0.974976363294433380, -0.974987477503164830, -0.974998589274427620, -0.975009698608193980, +-0.975020805504436040, -0.975031909963126280, -0.975043011984236600, -0.975054111567739360, -0.975065208713606800, -0.975076303421811290, -0.975087395692325170, -0.975098485525120460, +-0.975109572920169420, -0.975120657877444510, -0.975131740396917860, -0.975142820478561930, -0.975153898122348980, -0.975164973328251250, -0.975176046096241090, -0.975187116426290860, +-0.975198184318373020, -0.975209249772459490, -0.975220312788522840, -0.975231373366535430, -0.975242431506469500, -0.975253487208297630, -0.975264540471992180, -0.975275591297525170, +-0.975286639684869170, -0.975297685633996550, -0.975308729144879760, -0.975319770217491170, -0.975330808851803120, -0.975341845047787980, -0.975352878805418320, -0.975363910124666720, +-0.975374939005504980, -0.975385965447906010, -0.975396989451842170, -0.975408011017285690, -0.975419030144209280, -0.975430046832585500, -0.975441061082386480, -0.975452072893584710, +-0.975463082266152750, -0.975474089200063070, -0.975485093695288240, -0.975496095751800630, -0.975507095369572810, -0.975518092548577240, -0.975529087288786620, -0.975540079590173080, +-0.975551069452709420, -0.975562056876367990, -0.975573041861121480, -0.975584024406942360, -0.975595004513803320, -0.975605982181676600, -0.975616957410535000, -0.975627930200350880, +-0.975638900551097030, -0.975649868462745930, -0.975660833935270030, -0.975671796968642150, -0.975682757562834850, -0.975693715717820490, -0.975704671433572200, -0.975715624710061900, +-0.975726575547262610, -0.975737523945146900, -0.975748469903687350, -0.975759413422856770, -0.975770354502627500, -0.975781293142972350, -0.975792229343864000, -0.975803163105275040, +-0.975814094427178260, -0.975825023309546120, -0.975835949752351440, -0.975846873755567000, -0.975857795319165280, -0.975868714443119290, -0.975879631127401280, -0.975890545371984160, +-0.975901457176840850, -0.975912366541943690, -0.975923273467265710, -0.975934177952779810, -0.975945079998458140, -0.975955979604273830, -0.975966876770199670, -0.975977771496208120, +-0.975988663782272340, -0.975999553628364770, -0.976010441034458330, -0.976021326000525820, -0.976032208526540160, -0.976043088612473800, -0.976053966258299770, -0.976064841463990750, +-0.976075714229519660, -0.976086584554859300, -0.976097452439982690, -0.976108317884862190, -0.976119180889470920, -0.976130041453781680, -0.976140899577767400, -0.976151755261400860, +-0.976162608504654860, -0.976173459307502430, -0.976184307669916260, -0.976195153591869590, -0.976205997073334770, -0.976216838114285060, -0.976227676714693240, -0.976238512874532120, +-0.976249346593774820, -0.976260177872394270, -0.976271006710363150, -0.976281833107654480, -0.976292657064241290, -0.976303478580096360, -0.976314297655192730, -0.976325114289503420, +-0.976335928483001330, -0.976346740235659370, -0.976357549547450580, -0.976368356418348180, -0.976379160848324660, -0.976389962837353130, -0.976400762385406850, -0.976411559492458610, +-0.976422354158481550, -0.976433146383448580, -0.976443936167332600, -0.976454723510106870, -0.976465508411744400, -0.976476290872217990, -0.976487070891501000, -0.976497848469566220, +-0.976508623606386910, -0.976519396301935960, -0.976530166556186740, -0.976540934369111930, -0.976551699740684790, -0.976562462670878430, -0.976573223159665880, -0.976583981207020280, +-0.976594736812914870, -0.976605489977322440, -0.976616240700216350, -0.976626988981569630, -0.976637734821355410, -0.976648478219546810, -0.976659219176117090, -0.976669957691039370, +-0.976680693764286680, -0.976691427395832480, -0.976702158585649460, -0.976712887333711090, -0.976723613639990500, -0.976734337504460930, -0.976745058927095400, -0.976755777907867500, +-0.976766494446749900, -0.976777208543716080, -0.976787920198739280, -0.976798629411792740, -0.976809336182849490, -0.976820040511882980, -0.976830742398866360, -0.976841441843772860, +-0.976852138846575960, -0.976862833407248550, -0.976873525525764010, -0.976884215202095670, -0.976894902436216790, -0.976905587228100720, -0.976916269577720820, -0.976926949485049990, +-0.976937626950061920, -0.976948301972729640, -0.976958974553026720, -0.976969644690926290, -0.976980312386401820, -0.976990977639426550, -0.977001640449973730, -0.977012300818016930, +-0.977022958743529510, -0.977033614226484600, -0.977044267266855560, -0.977054917864615850, -0.977065566019738930, -0.977076211732198160, -0.977086855001966790, -0.977097495829018170, +-0.977108134213325870, -0.977118770154863260, -0.977129403653603680, -0.977140034709520710, -0.977150663322587490, -0.977161289492777700, -0.977171913220064690, -0.977182534504422050, +-0.977193153345822910, -0.977203769744240840, -0.977214383699649410, -0.977224995212022000, -0.977235604281332270, -0.977246210907553370, -0.977256815090658870, -0.977267416830622460, +-0.977278016127417380, -0.977288612981017320, -0.977299207391395750, -0.977309799358526130, -0.977320388882382040, -0.977330975962936940, -0.977341560600164640, -0.977352142794038260, +-0.977362722544531380, -0.977373299851617800, -0.977383874715270990, -0.977394447135464530, -0.977405017112172090, -0.977415584645366930, -0.977426149735022730, -0.977436712381113180, +-0.977447272583611970, -0.977457830342492450, -0.977468385657728420, -0.977478938529293460, -0.977489488957161030, -0.977500036941305160, -0.977510582481698980, -0.977521125578316390, +-0.977531666231130970, -0.977542204440116300, -0.977552740205246180, -0.977563273526494410, -0.977573804403834230, -0.977584332837239560, -0.977594858826684070, -0.977605382372141450, +-0.977615903473585400, -0.977626422130989490, -0.977636938344327630, -0.977647452113573400, -0.977657963438700480, -0.977668472319682900, -0.977678978756493900, -0.977689482749107500, +-0.977699984297497380, -0.977710483401637240, -0.977720980061501210, -0.977731474277062420, -0.977741966048295000, -0.977752455375172640, -0.977762942257669240, -0.977773426695758400, +-0.977783908689414010, -0.977794388238609760, -0.977804865343319670, -0.977815340003517330, -0.977825812219176860, -0.977836281990271730, -0.977846749316775840, -0.977857214198663010, +-0.977867676635907230, -0.977878136628482440, -0.977888594176362090, -0.977899049279520320, -0.977909501937930910, -0.977919952151567680, -0.977930399920404650, -0.977940845244415600, +-0.977951288123574350, -0.977961728557855010, -0.977972166547231290, -0.977982602091677310, -0.977993035191166650, -0.978003465845673440, -0.978013894055171580, -0.978024319819634890, +-0.978034743139037490, -0.978045164013353400, -0.978055582442556190, -0.978065998426620010, -0.978076411965518870, -0.978086823059226670, -0.978097231707717450, -0.978107637910965220, +-0.978118041668943780, -0.978128442981627270, -0.978138841848989800, -0.978149238271005080, -0.978159632247647350, -0.978170023778890400, -0.978180412864708470, -0.978190799505075480, +-0.978201183699965670, -0.978211565449352730, -0.978221944753210890, -0.978232321611514190, -0.978242696024236640, -0.978253067991352370, -0.978263437512835400, -0.978273804588659870, +-0.978284169218799900, -0.978294531403229640, -0.978304891141922760, -0.978315248434853850, -0.978325603281996690, -0.978335955683325540, -0.978346305638814530, -0.978356653148437890, +-0.978366998212169440, -0.978377340829983510, -0.978387681001854250, -0.978398018727755780, -0.978408354007662240, -0.978418686841547870, -0.978429017229386800, -0.978439345171153050, +-0.978449670666821090, -0.978459993716365050, -0.978470314319758840, -0.978480632476976920, -0.978490948187993310, -0.978501261452782380, -0.978511572271318570, -0.978521880643575480, +-0.978532186569527780, -0.978542490049149620, -0.978552791082415220, -0.978563089669298840, -0.978573385809774820, -0.978583679503817190, -0.978593970751400420, -0.978604259552498750, +-0.978614545907086630, -0.978624829815137880, -0.978635111276627170, -0.978645390291528640, -0.978655666859816530, -0.978665940981465420, -0.978676212656449550, -0.978686481884742940, +-0.978696748666320170, -0.978707013001155480, -0.978717274889223330, -0.978727534330497970, -0.978737791324953750, -0.978748045872565030, -0.978758297973306270, -0.978768547627151930, +-0.978778794834076040, -0.978789039594053060, -0.978799281907057670, -0.978809521773063910, -0.978819759192046450, -0.978829994163979640, -0.978840226688837860, -0.978850456766595320, +-0.978860684397226730, -0.978870909580706440, -0.978881132317008910, -0.978891352606108490, -0.978901570447979650, -0.978911785842596970, -0.978921998789935020, -0.978932209289967830, +-0.978942417342670070, -0.978952622948016330, -0.978962826105981070, -0.978973026816538750, -0.978983225079663950, -0.978993420895331030, -0.979003614263514450, -0.979013805184188900, +-0.979023993657328730, -0.979034179682908730, -0.979044363260903160, -0.979054544391286700, -0.979064723074033920, -0.979074899309119400, -0.979085073096517710, -0.979095244436203220, +-0.979105413328150490, -0.979115579772334320, -0.979125743768729300, -0.979135905317309980, -0.979146064418050740, -0.979156221070926260, -0.979166375275911330, -0.979176527032980410, +-0.979186676342108210, -0.979196823203269400, -0.979206967616438440, -0.979217109581590030, -0.979227249098698850, -0.979237386167739810, -0.979247520788687040, -0.979257652961515570, +-0.979267782686199850, -0.979277909962714690, -0.979288034791034880, -0.979298157171135000, -0.979308277102989620, -0.979318394586573550, -0.979328509621861460, -0.979338622208828170, +-0.979348732347448350, -0.979358840037696580, -0.979368945279547760, -0.979379048072976600, -0.979389148417957990, -0.979399246314466290, -0.979409341762476520, -0.979419434761963360, +-0.979429525312901620, -0.979439613415266090, -0.979449699069031790, -0.979459782274172960, -0.979469863030664630, -0.979479941338481710, -0.979490017197598980, -0.979500090607991150, +-0.979510161569633110, -0.979520230082499670, -0.979530296146565620, -0.979540359761805980, -0.979550420928195330, -0.979560479645708580, -0.979570535914320750, -0.979580589734006410, +-0.979590641104740700, -0.979600690026498520, -0.979610736499254450, -0.979620780522983630, -0.979630822097660730, -0.979640861223260880, -0.979650897899758790, -0.979660932127129460, +-0.979670963905347910, -0.979680993234388840, -0.979691020114227260, -0.979701044544838420, -0.979711066526196770, -0.979721086058277350, -0.979731103141055270, -0.979741117774505450, +-0.979751129958603030, -0.979761139693322680, -0.979771146978639320, -0.979781151814528180, -0.979791154200964190, -0.979801154137922240, -0.979811151625377460, -0.979821146663304780, +-0.979831139251679200, -0.979841129390475850, -0.979851117079669760, -0.979861102319235730, -0.979871085109149000, -0.979881065449384470, -0.979891043339917390, -0.979901018780722670, +-0.979910991771775540, -0.979920962313050700, -0.979930930404523610, -0.979940896046169070, -0.979950859237962320, -0.979960819979878380, -0.979970778271892500, -0.979980734113979570, +-0.979990687506114840, -0.980000638448273560, -0.980010586940430530, -0.980020532982561090, -0.980030476574640260, -0.980040417716643190, -0.980050356408545100, -0.980060292650321350, +-0.980070226441946630, -0.980080157783396410, -0.980090086674645810, -0.980100013115669850, -0.980109937106444010, -0.980119858646943290, -0.980129777737142830, -0.980139694377018090, +-0.980149608566544210, -0.980159520305696090, -0.980169429594449190, -0.980179336432778770, -0.980189240820659950, -0.980199142758068080, -0.980209042244978400, -0.980218939281366050, +-0.980228833867206380, -0.980238726002474530, -0.980248615687145940, -0.980258502921195760, -0.980268387704599450, -0.980278270037332030, -0.980288149919368970, -0.980298027350685610, +-0.980307902331257200, -0.980317774861058980, -0.980327644940066300, -0.980337512568254520, -0.980347377745598990, -0.980357240472075060, -0.980367100747657980, -0.980376958572323100, +-0.980386813946045880, -0.980396666868801560, -0.980406517340565610, -0.980416365361313270, -0.980426210931020110, -0.980436054049661390, -0.980445894717212550, -0.980455732933649180, +-0.980465568698946300, -0.980475402013079480, -0.980485232876024180, -0.980495061287755760, -0.980504887248249690, -0.980514710757481530, -0.980524531815426540, -0.980534350422060160, +-0.980544166577357880, -0.980553980281295150, -0.980563791533847540, -0.980573600334990410, -0.980583406684699340, -0.980593210582949680, -0.980603012029717220, -0.980612811024977100, +-0.980622607568704900, -0.980632401660876170, -0.980642193301466400, -0.980651982490451160, -0.980661769227806230, -0.980671553513506660, -0.980681335347528100, -0.980691114729846270, +-0.980700891660436720, -0.980710666139274930, -0.980720438166336360, -0.980730207741596800, -0.980739974865031730, -0.980749739536616820, -0.980759501756327420, -0.980769261524139350, +-0.980779018840028050, -0.980788773703969220, -0.980798526115938430, -0.980808276075911480, -0.980818023583863720, -0.980827768639770840, -0.980837511243608630, -0.980847251395352560, +-0.980856989094978430, -0.980866724342461800, -0.980876457137778380, -0.980886187480903730, -0.980895915371813640, -0.980905640810484040, -0.980915363796890040, -0.980925084331007670, +-0.980934802412812610, -0.980944518042280560, -0.980954231219387410, -0.980963941944108410, -0.980973650216419580, -0.980983356036296720, -0.980993059403715400, -0.981002760318651410, +-0.981012458781080570, -0.981022154790978540, -0.981031848348321130, -0.981041539453084140, -0.981051228105243480, -0.981060914304774490, -0.981070598051653310, -0.981080279345855620, +-0.981089958187357110, -0.981099634576133920, -0.981109308512161600, -0.981118979995415970, -0.981128649025872820, -0.981138315603508170, -0.981147979728297590, -0.981157641400217110, +-0.981167300619242510, -0.981176957385349710, -0.981186611698514510, -0.981196263558712920, -0.981205912965920520, -0.981215559920113330, -0.981225204421267260, -0.981234846469358210, +-0.981244486064361990, -0.981254123206254710, -0.981263757895011970, -0.981273390130609880, -0.981283019913024250, -0.981292647242231090, -0.981302272118206310, -0.981311894540925820, +-0.981321514510365640, -0.981331132026501680, -0.981340747089310070, -0.981350359698766380, -0.981359969854846860, -0.981369577557527300, -0.981379182806783930, -0.981388785602592460, +-0.981398385944929340, -0.981407983833770040, -0.981417579269090680, -0.981427172250867510, -0.981436762779076320, -0.981446350853693250, -0.981455936474694310, -0.981465519642055530, +-0.981475100355753030, -0.981484678615762610, -0.981494254422060840, -0.981503827774623080, -0.981513398673425910, -0.981522967118445220, -0.981532533109657050, -0.981542096647037730, +-0.981551657730562970, -0.981561216360209210, -0.981570772535952260, -0.981580326257768480, -0.981589877525633760, -0.981599426339524460, -0.981608972699416490, -0.981618516605286210, +-0.981628058057109620, -0.981637597054862980, -0.981647133598522180, -0.981656667688063590, -0.981666199323463330, -0.981675728504697530, -0.981685255231742440, -0.981694779504574400, +-0.981704301323169220, -0.981713820687503350, -0.981723337597552810, -0.981732852053294080, -0.981742364054703050, -0.981751873601756200, -0.981761380694429750, -0.981770885332699740, +-0.981780387516542730, -0.981789887245934520, -0.981799384520851580, -0.981808879341270260, -0.981818371707166680, -0.981827861618517210, -0.981837349075298290, -0.981846834077485740, +-0.981856316625056120, -0.981865796717985790, -0.981875274356250880, -0.981884749539827850, -0.981894222268692940, -0.981903692542822500, -0.981913160362192780, -0.981922625726780240, +-0.981932088636561120, -0.981941549091511660, -0.981951007091608430, -0.981960462636827680, -0.981969915727145760, -0.981979366362539130, -0.981988814542984030, -0.981998260268456820, +-0.982007703538933960, -0.982017144354391910, -0.982026582714806920, -0.982036018620155550, -0.982045452070414050, -0.982054883065558990, -0.982064311605566620, -0.982073737690413730, +-0.982083161320076340, -0.982092582494531020, -0.982102001213754240, -0.982111417477722460, -0.982120831286412370, -0.982130242639799870, -0.982139651537861870, -0.982149057980574720, +-0.982158461967915010, -0.982167863499859070, -0.982177262576383490, -0.982186659197464730, -0.982196053363079360, -0.982205445073203840, -0.982214834327814870, -0.982224221126888560, +-0.982233605470401840, -0.982242987358331040, -0.982252366790652750, -0.982261743767343650, -0.982271118288380210, -0.982280490353738880, -0.982289859963396350, -0.982299227117329200, +-0.982308591815513890, -0.982317954057927100, -0.982327313844545520, -0.982336671175345620, -0.982346026050303970, -0.982355378469397470, -0.982364728432602360, -0.982374075939895450, +-0.982383420991253420, -0.982392763586652730, -0.982402103726070170, -0.982411441409482440, -0.982420776636866000, -0.982430109408197640, -0.982439439723454040, -0.982448767582611790, +-0.982458092985647570, -0.982467415932538170, -0.982476736423260280, -0.982486054457790470, -0.982495370036105650, -0.982504683158182400, -0.982513993823997290, -0.982523302033527330, +-0.982532607786749000, -0.982541911083639200, -0.982551211924174830, -0.982560510308332140, -0.982569806236088250, -0.982579099707419860, -0.982588390722303750, -0.982597679280716620, +-0.982606965382635260, -0.982616249028036570, -0.982625530216897140, -0.982634808949193970, -0.982644085224903980, -0.982653359044003530, -0.982662630406469730, -0.982671899312279270, +-0.982681165761409180, -0.982690429753836250, -0.982699691289537160, -0.982708950368488820, -0.982718206990668030, -0.982727461156051810, -0.982736712864616950, -0.982745962116340240, +-0.982755208911198610, -0.982764453249169060, -0.982773695130228280, -0.982782934554353500, -0.982792171521521210, -0.982801406031708400, -0.982810638084892220, -0.982819867681049340, +-0.982829094820156790, -0.982838319502191690, -0.982847541727130620, -0.982856761494950710, -0.982865978805628980, -0.982875193659142220, -0.982884406055467450, -0.982893615994581690, +-0.982902823476461850, -0.982912028501085060, -0.982921231068428320, -0.982930431178468230, -0.982939628831182240, -0.982948824026547040, -0.982958016764539870, -0.982967207045137630, +-0.982976394868317450, -0.982985580234056240, -0.982994763142331030, -0.983003943593118930, -0.983013121586396980, -0.983022297122142170, -0.983031470200331660, -0.983040640820942450, +-0.983049808983951670, -0.983058974689336450, -0.983068137937073700, -0.983077298727140670, -0.983086457059514360, -0.983095612934171800, -0.983104766351090340, -0.983113917310247000, +-0.983123065811618790, -0.983132211855182960, -0.983141355440916520, -0.983150496568796720, -0.983159635238800680, -0.983168771450905530, -0.983177905205088410, -0.983187036501326660, +-0.983196165339597190, -0.983205291719877580, -0.983214415642144510, -0.983223537106375440, -0.983232656112547510, -0.983241772660637840, -0.983250886750624000, -0.983259998382482790, +-0.983269107556191570, -0.983278214271727570, -0.983287318529068030, -0.983296420328190200, -0.983305519669071430, -0.983314616551688720, -0.983323710976019450, -0.983332802942041060, +-0.983341892449730690, -0.983350979499065470, -0.983360064090022750, -0.983369146222579980, -0.983378225896714310, -0.983387303112403190, -0.983396377869623640, -0.983405450168353120, +-0.983414520008569100, -0.983423587390248710, -0.983432652313369290, -0.983441714777908320, -0.983450774783843130, -0.983459832331150860, -0.983468887419809090, -0.983477940049795270, +-0.983486990221086430, -0.983496037933660030, -0.983505083187493630, -0.983514125982564490, -0.983523166318850060, -0.983532204196327810, -0.983541239614974970, -0.983550272574769010, +-0.983559303075687290, -0.983568331117707470, -0.983577356700806700, -0.983586379824962550, -0.983595400490152480, -0.983604418696353950, -0.983613434443544430, -0.983622447731701270, +-0.983631458560801920, -0.983640466930823960, -0.983649472841744750, -0.983658476293541970, -0.983667477286193080, -0.983676475819675430, -0.983685471893966490, -0.983694465509043940, +-0.983703456664885230, -0.983712445361467850, -0.983721431598769350, -0.983730415376767310, -0.983739396695439190, -0.983748375554762690, -0.983757351954715140, -0.983766325895274240, +-0.983775297376417560, -0.983784266398122550, -0.983793232960366910, -0.983802197063128330, -0.983811158706384140, -0.983820117890112030, -0.983829074614289590, -0.983838028878894600, +-0.983846980683904420, -0.983855930029296720, -0.983864876915049310, -0.983873821341139650, -0.983882763307545540, -0.983891702814244540, -0.983900639861214230, -0.983909574448432300, +-0.983918506575876430, -0.983927436243524300, -0.983936363451353710, -0.983945288199342020, -0.983954210487467230, -0.983963130315706810, -0.983972047684038560, -0.983980962592440280, +-0.983989875040889530, -0.983998785029364110, -0.984007692557841710, -0.984016597626300120, -0.984025500234717130, -0.984034400383070220, -0.984043298071337390, -0.984052193299496230, +-0.984061086067524630, -0.984069976375400390, -0.984078864223101310, -0.984087749610604860, -0.984096632537889040, -0.984105513004931760, -0.984114391011710610, -0.984123266558203480, +-0.984132139644388170, -0.984141010270242590, -0.984149878435744420, -0.984158744140871680, -0.984167607385601940, -0.984176468169913220, -0.984185326493783320, -0.984194182357190140, +-0.984203035760111480, -0.984211886702525350, -0.984220735184409330, -0.984229581205741550, -0.984238424766499810, -0.984247265866661890, -0.984256104506205930, -0.984264940685109720, +-0.984273774403351060, -0.984282605660908080, -0.984291434457758680, -0.984300260793880550, -0.984309084669251710, -0.984317906083850170, -0.984326725037653950, -0.984335541530640850, +-0.984344355562789100, -0.984353167134076280, -0.984361976244480520, -0.984370782893979830, -0.984379587082552240, -0.984388388810175540, -0.984397188076827970, -0.984405984882487430, +-0.984414779227131940, -0.984423571110739530, -0.984432360533288310, -0.984441147494755970, -0.984449931995120870, -0.984458714034360920, -0.984467493612454110, -0.984476270729378710, +-0.984485045385112610, -0.984493817579633830, -0.984502587312920510, -0.984511354584950650, -0.984520119395702500, -0.984528881745153960, -0.984537641633283280, -0.984546399060068580, +-0.984555154025487770, -0.984563906529519190, -0.984572656572140770, -0.984581404153330730, -0.984590149273067090, -0.984598891931328210, -0.984607632128091990, -0.984616369863336890, +-0.984625105137040710, -0.984633837949181690, -0.984642568299738170, -0.984651296188688190, -0.984660021616009960, -0.984668744581681740, -0.984677465085681550, -0.984686183127987840, +-0.984694898708578740, -0.984703611827432160, -0.984712322484526670, -0.984721030679840400, -0.984729736413351490, -0.984738439685038270, -0.984747140494878990, -0.984755838842851780, +-0.984764534728935100, -0.984773228153106970, -0.984781919115345740, -0.984790607615629750, -0.984799293653937260, -0.984807977230246490, -0.984816658344535800, -0.984825336996783650, +-0.984834013186967950, -0.984842686915067270, -0.984851358181059840, -0.984860026984924030, -0.984868693326638070, -0.984877357206180640, -0.984886018623529650, -0.984894677578663560, +-0.984903334071560830, -0.984911988102199710, -0.984920639670558650, -0.984929288776616010, -0.984937935420350130, -0.984946579601739480, -0.984955221320762300, -0.984963860577397270, +-0.984972497371622400, -0.984981131703416280, -0.984989763572757360, -0.984998392979623990, -0.985007019923994750, -0.985015644405847880, -0.985024266425161940, -0.985032885981915300, +-0.985041503076086400, -0.985050117707653830, -0.985058729876595930, -0.985067339582891170, -0.985075946826518000, -0.985084551607455120, -0.985093153925680860, -0.985101753781173710, +-0.985110351173912100, -0.985118946103874630, -0.985127538571039740, -0.985136128575386020, -0.985144716116892250, -0.985153301195536350, -0.985161883811297320, -0.985170463964153530, +-0.985179041654083650, -0.985187616881066150, -0.985196189645079600, -0.985204759946102570, -0.985213327784113630, -0.985221893159091480, -0.985230456071014450, -0.985239016519861340, +-0.985247574505610620, -0.985256130028241080, -0.985264683087731190, -0.985273233684059610, -0.985281781817204940, -0.985290327487145730, -0.985298870693860800, -0.985307411437328580, +-0.985315949717527890, -0.985324485534437300, -0.985333018888035480, -0.985341549778301130, -0.985350078205213140, -0.985358604168749760, -0.985367127668889790, -0.985375648705612120, +-0.985384167278895220, -0.985392683388717990, -0.985401197035059130, -0.985409708217897200, -0.985418216937210880, -0.985426723192979080, -0.985435226985180490, -0.985443728313793900, +-0.985452227178797880, -0.985460723580171340, -0.985469217517892960, -0.985477708991941650, -0.985486198002296090, -0.985494684548934960, -0.985503168631837070, -0.985511650250981310, +-0.985520129406346370, -0.985528606097911260, -0.985537080325654460, -0.985545552089555080, -0.985554021389591690, -0.985562488225743330, -0.985570952597988660, -0.985579414506306710, +-0.985587873950676150, -0.985596330931075900, -0.985604785447484870, -0.985613237499882060, -0.985621687088245930, -0.985630134212555630, -0.985638578872790050, -0.985647021068927880, +-0.985655460800948240, -0.985663898068830150, -0.985672332872552070, -0.985680765212093250, -0.985689195087432470, -0.985697622498548640, -0.985706047445420790, -0.985714469928027910, +-0.985722889946348710, -0.985731307500362420, -0.985739722590047940, -0.985748135215384070, -0.985756545376349710, -0.985764953072924110, -0.985773358305086170, -0.985781761072814790, +-0.985790161376089100, -0.985798559214887900, -0.985806954589190320, -0.985815347498975260, -0.985823737944221960, -0.985832125924909210, -0.985840511441016250, -0.985848894492521890, +-0.985857275079405460, -0.985865653201645880, -0.985874028859222040, -0.985882402052113080, -0.985890772780298130, -0.985899141043756310, -0.985907506842466640, -0.985915870176408250, +-0.985924231045560150, -0.985932589449901360, -0.985940945389411240, -0.985949298864068680, -0.985957649873852810, -0.985965998418742880, -0.985974344498718010, -0.985982688113757220, +-0.985991029263839640, -0.985999367948944720, -0.986007704169051260, -0.986016037924138500, -0.986024369214185680, -0.986032698039171820, -0.986041024399076480, -0.986049348293878360, +-0.986057669723556910, -0.986065988688091370, -0.986074305187460750, -0.986082619221644310, -0.986090930790621490, -0.986099239894371200, -0.986107546532872910, -0.986115850706105630, +-0.986124152414049050, -0.986132451656681840, -0.986140748433983470, -0.986149042745933290, -0.986157334592510430, -0.986165623973694340, -0.986173910889464270, -0.986182195339799230, +-0.986190477324678790, -0.986198756844082090, -0.986207033897988580, -0.986215308486377400, -0.986223580609227990, -0.986231850266519720, -0.986240117458231700, -0.986248382184343520, +-0.986256644444834300, -0.986264904239683490, -0.986273161568870350, -0.986281416432374320, -0.986289668830174770, -0.986297918762251260, -0.986306166228582690, -0.986314411229148760, +-0.986322653763928800, -0.986330893832902180, -0.986339131436048460, -0.986347366573346760, -0.986355599244776670, -0.986363829450317640, -0.986372057189949140, -0.986380282463650280, +-0.986388505271400870, -0.986396725613180040, -0.986404943488967570, -0.986413158898742590, -0.986421371842484910, -0.986429582320173640, -0.986437790331788470, -0.986445995877308750, +-0.986454198956714160, -0.986462399569983940, -0.986470597717097770, -0.986478793398035130, -0.986486986612775450, -0.986495177361298330, -0.986503365643583430, -0.986511551459610000, +-0.986519734809357620, -0.986527915692805960, -0.986536094109934480, -0.986544270060722980, -0.986552443545150590, -0.986560614563197100, -0.986568783114842080, -0.986576949200065110, +-0.986585112818845760, -0.986593273971163590, -0.986601432656998290, -0.986609588876329440, -0.986617742629136480, -0.986625893915399450, -0.986634042735097470, -0.986642189088210440, +-0.986650332974717830, -0.986658474394599530, -0.986666613347834900, -0.986674749834403950, -0.986682883854286040, -0.986691015407460850, -0.986699144493908160, -0.986707271113607560, +-0.986715395266538840, -0.986723516952681570, -0.986731636172015540, -0.986739752924520430, -0.986747867210176040, -0.986755979028961950, -0.986764088380857830, -0.986772195265843480, +-0.986780299683898690, -0.986788401635003030, -0.986796501119136640, -0.986804598136278850, -0.986812692686409480, -0.986820784769508410, -0.986828874385555440, -0.986836961534530270, +-0.986845046216412670, -0.986853128431182450, -0.986861208178819390, -0.986869285459303410, -0.986877360272614190, -0.986885432618731520, -0.986893502497635300, -0.986901569909305220, +-0.986909634853721300, -0.986917697330863430, -0.986925757340711200, -0.986933814883244500, -0.986941869958443350, -0.986949922566287440, -0.986957972706756780, -0.986966020379831170, +-0.986974065585490500, -0.986982108323714690, -0.986990148594483640, -0.986998186397777370, -0.987006221733575440, -0.987014254601857880, -0.987022285002604800, -0.987030312935796020, +-0.987038338401411530, -0.987046361399431030, -0.987054381929834750, -0.987062399992602370, -0.987070415587714130, -0.987078428715149720, -0.987086439374889270, -0.987094447566912780, +-0.987102453291200170, -0.987110456547731440, -0.987118457336486620, -0.987126455657445610, -0.987134451510588430, -0.987142444895895090, -0.987150435813345610, -0.987158424262920110, +-0.987166410244598720, -0.987174393758361020, -0.987182374804187470, -0.987190353382057960, -0.987198329491952520, -0.987206303133851270, -0.987214274307734340, -0.987222243013581640, +-0.987230209251373390, -0.987238173021089740, -0.987246134322710470, -0.987254093156215930, -0.987262049521586140, -0.987270003418801220, -0.987277954847841200, -0.987285903808686530, +-0.987293850301317000, -0.987301794325712740, -0.987309735881854110, -0.987317674969721120, -0.987325611589293880, -0.987333545740552540, -0.987341477423477440, -0.987349406638048710, +-0.987357333384246470, -0.987365257662050850, -0.987373179471442100, -0.987381098812400330, -0.987389015684905780, -0.987396930088938810, -0.987404842024479650, -0.987412751491508090, +-0.987420658490004820, -0.987428563019949860, -0.987436465081323430, -0.987444364674105900, -0.987452261798277390, -0.987460156453818350, -0.987468048640708810, -0.987475938358929220, +-0.987483825608459820, -0.987491710389280850, -0.987499592701372440, -0.987507472544715160, -0.987515349919289240, -0.987523224825075040, -0.987531097262052570, -0.987538967230202400, +-0.987546834729504890, -0.987554699759940260, -0.987562562321488870, -0.987570422414130960, -0.987578280037847090, -0.987586135192617620, -0.987593987878422670, -0.987601838095242930, +-0.987609685843058530, -0.987617531121849800, -0.987625373931597330, -0.987633214272281350, -0.987641052143882310, -0.987648887546380920, -0.987656720479757060, -0.987664550943991420, +-0.987672378939064450, -0.987680204464956520, -0.987688027521648080, -0.987695848109119480, -0.987703666227351400, -0.987711481876324070, -0.987719295056018190, -0.987727105766413870, +-0.987734914007491920, -0.987742719779232560, -0.987750523081616480, -0.987758323914624040, -0.987766122278236010, -0.987773918172432430, -0.987781711597194190, -0.987789502552501530, +-0.987797291038335250, -0.987805077054675570, -0.987812860601503310, -0.987820641678798910, -0.987828420286542940, -0.987836196424715980, -0.987843970093298380, -0.987851741292270940, +-0.987859510021614100, -0.987867276281308440, -0.987875040071334640, -0.987882801391673390, -0.987890560242304930, -0.987898316623210150, -0.987906070534369520, -0.987913821975763720, +-0.987921570947373430, -0.987929317449179110, -0.987937061481161560, -0.987944803043301350, -0.987952542135579150, -0.987960278757975760, -0.987968012910471430, -0.987975744593047160, +-0.987983473805683520, -0.987991200548361200, -0.987998924821061000, -0.988006646623763360, -0.988014365956449090, -0.988022082819098870, -0.988029797211693480, -0.988037509134213620, +-0.988045218586639960, -0.988052925568953190, -0.988060630081134210, -0.988068332123163580, -0.988076031695022340, -0.988083728796690820, -0.988091423428150040, -0.988099115589380680, +-0.988106805280363430, -0.988114492501079410, -0.988122177251508970, -0.988129859531633130, -0.988137539341432670, -0.988145216680888280, -0.988152891549980870, -0.988160563948691340, +-0.988168233877000260, -0.988175901334888640, -0.988183566322337280, -0.988191228839327200, -0.988198888885838840, -0.988206546461853240, -0.988214201567351290, -0.988221854202313900, +-0.988229504366721740, -0.988237152060556070, -0.988244797283797330, -0.988252440036426650, -0.988260080318424830, -0.988267718129772880, -0.988275353470451480, -0.988282986340441870, +-0.988290616739724630, -0.988298244668280980, -0.988305870126091830, -0.988313493113137880, -0.988321113629400120, -0.988328731674859570, -0.988336347249497260, -0.988343960353294080, +-0.988351570986231160, -0.988359179148289080, -0.988366784839449180, -0.988374388059692240, -0.988381988808999300, -0.988389587087351470, -0.988397182894729660, -0.988404776231114780, +-0.988412367096488050, -0.988419955490830390, -0.988427541414123030, -0.988435124866346660, -0.988442705847482390, -0.988450284357511480, -0.988457860396414810, -0.988465433964173630, +-0.988473005060768740, -0.988480573686181250, -0.988488139840392410, -0.988495703523383230, -0.988503264735134720, -0.988510823475628130, -0.988518379744844470, -0.988525933542764750, +-0.988533484869370320, -0.988541033724642300, -0.988548580108561500, -0.988556124021109260, -0.988563665462266820, -0.988571204432015070, -0.988578740930335490, -0.988586274957208970, +-0.988593806512616750, -0.988601335596539950, -0.988608862208959940, -0.988616386349857600, -0.988623908019214400, -0.988631427217011470, -0.988638943943229930, -0.988646458197851020, +-0.988653969980856080, -0.988661479292226140, -0.988668986131942430, -0.988676490499986290, -0.988683992396338970, -0.988691491820981590, -0.988698988773895620, -0.988706483255062160, +-0.988713975264462360, -0.988721464802077680, -0.988728951867889340, -0.988736436461878590, -0.988743918584026770, -0.988751398234315130, -0.988758875412725000, -0.988766350119237860, +-0.988773822353834710, -0.988781292116497010, -0.988788759407206010, -0.988796224225943150, -0.988803686572689690, -0.988811146447427180, -0.988818603850136760, -0.988826058780799770, +-0.988833511239397560, -0.988840961225911590, -0.988848408740323310, -0.988855853782613980, -0.988863296352764930, -0.988870736450757740, -0.988878174076573750, -0.988885609230194310, +-0.988893041911600770, -0.988900472120774590, -0.988907899857697340, -0.988915325122350250, -0.988922747914715020, -0.988930168234772760, -0.988937586082505040, -0.988945001457893440, +-0.988952414360919300, -0.988959824791564190, -0.988967232749809470, -0.988974638235636580, -0.988982041249027220, -0.988989441789962730, -0.988996839858424680, -0.989004235454394530, +-0.989011628577853740, -0.989019019228783880, -0.989026407407166410, -0.989033793112983120, -0.989041176346215250, -0.989048557106844360, -0.989055935394852150, -0.989063311210219950, +-0.989070684552929680, -0.989078055422962570, -0.989085423820300400, -0.989092789744924540, -0.989100153196816880, -0.989107514175958880, -0.989114872682331890, -0.989122228715917820, +-0.989129582276698120, -0.989136933364654580, -0.989144281979768560, -0.989151628122022060, -0.989158971791396340, -0.989166312987873160, -0.989173651711434230, -0.989180987962061110, +-0.989188321739735590, -0.989195653044439240, -0.989202981876153850, -0.989210308234860890, -0.989217632120542260, -0.989224953533179520, -0.989232272472754360, -0.989239588939248570, +-0.989246902932643720, -0.989254214452921610, -0.989261523500064130, -0.989268830074052750, -0.989276134174869260, -0.989283435802495450, -0.989290734956913000, -0.989298031638103810, +-0.989305325846049470, -0.989312617580731750, -0.989319906842132560, -0.989327193630233800, -0.989334477945016830, -0.989341759786463770, -0.989349039154556190, -0.989356316049276100, +-0.989363590470605180, -0.989370862418525340, -0.989378131893018380, -0.989385398894065960, -0.989392663421650110, -0.989399925475752510, -0.989407185056355170, -0.989414442163439880, +-0.989421696796988440, -0.989428948956982860, -0.989436198643404820, -0.989443445856236450, -0.989450690595459310, -0.989457932861055430, -0.989465172653006710, -0.989472409971295150, +-0.989479644815902560, -0.989486877186810830, -0.989494107084001870, -0.989501334507457700, -0.989508559457160100, -0.989515781933091090, -0.989523001935232680, -0.989530219463566780, +-0.989537434518075410, -0.989544647098740350, -0.989551857205543730, -0.989559064838467450, -0.989566269997493530, -0.989573472682603870, -0.989580672893780490, -0.989587870631005510, +-0.989595065894260940, -0.989602258683528580, -0.989609448998790660, -0.989616636840028980, -0.989623822207225780, -0.989631005100363060, -0.989638185519422840, -0.989645363464387030, +-0.989652538935237860, -0.989659711931957560, -0.989666882454527830, -0.989674050502930780, -0.989681216077148650, -0.989688379177163570, -0.989695539802957440, -0.989702697954512710, +-0.989709853631810970, -0.989717006834834660, -0.989724157563565800, -0.989731305817986630, -0.989738451598079160, -0.989745594903825520, -0.989752735735207940, -0.989759874092208450, +-0.989767009974809490, -0.989774143382992850, -0.989781274316740790, -0.989788402776035640, -0.989795528760859410, -0.989802652271194350, -0.989809773307022800, -0.989816891868326780, +-0.989824007955088400, -0.989831121567290140, -0.989838232704914000, -0.989845341367942220, -0.989852447556357150, -0.989859551270141020, -0.989866652509275970, -0.989873751273744220, +-0.989880847563528230, -0.989887941378610030, -0.989895032718972060, -0.989902121584596450, -0.989909207975465440, -0.989916291891561610, -0.989923373332866950, -0.989930452299363830, +-0.989937528791034580, -0.989944602807861560, -0.989951674349827000, -0.989958743416913260, -0.989965810009102550, -0.989972874126377470, -0.989979935768720120, -0.989986994936113080, +-0.989994051628538490, -0.990001105845978670, -0.990008157588416090, -0.990015206855833220, -0.990022253648212280, -0.990029297965535740, -0.990036339807785940, -0.990043379174945230, +-0.990050416066996180, -0.990057450483920910, -0.990064482425702220, -0.990071511892322120, -0.990078538883763400, -0.990085563400008310, -0.990092585441039400, -0.990099605006838910, +-0.990106622097389310, -0.990113636712673270, -0.990120648852673150, -0.990127658517371390, -0.990134665706750570, -0.990141670420792930, -0.990148672659481250, -0.990155672422797780, +-0.990162669710725200, -0.990169664523245840, -0.990176656860342400, -0.990183646721997320, -0.990190634108193080, -0.990197619018912460, -0.990204601454137580, -0.990211581413851240, +-0.990218558898035890, -0.990225533906674230, -0.990232506439748690, -0.990239476497241980, -0.990246444079136530, -0.990253409185414930, -0.990260371816059860, -0.990267331971053770, +-0.990274289650379340, -0.990281244854019250, -0.990288197581956080, -0.990295147834172380, -0.990302095610650750, -0.990309040911374060, -0.990315983736324680, -0.990322924085485280, +-0.990329861958838540, -0.990336797356367260, -0.990343730278054000, -0.990350660723881340, -0.990357588693832060, -0.990364514187888840, -0.990371437206034270, -0.990378357748251110, +-0.990385275814521960, -0.990392191404829810, -0.990399104519157030, -0.990406015157486610, -0.990412923319801130, -0.990419829006083390, -0.990426732216315940, -0.990433632950481700, +-0.990440531208563460, -0.990447426990543780, -0.990454320296405680, -0.990461211126131720, -0.990468099479704710, -0.990474985357107430, -0.990481868758322670, -0.990488749683333220, +-0.990495628132121890, -0.990502504104671560, -0.990509377600964910, -0.990516248620984970, -0.990523117164714310, -0.990529983232135920, -0.990536846823232400, -0.990543707937986850, +-0.990550566576382070, -0.990557422738400970, -0.990564276424026220, -0.990571127633240730, -0.990577976366027400, -0.990584822622369130, -0.990591666402248830, -0.990598507705649390, +-0.990605346532553720, -0.990612182882944610, -0.990619016756805190, -0.990625848154118030, -0.990632677074866350, -0.990639503519032960, -0.990646327486600750, -0.990653148977552740, +-0.990659967991872060, -0.990666784529541270, -0.990673598590543490, -0.990680410174861860, -0.990687219282479050, -0.990694025913378300, -0.990700830067542390, -0.990707631744954460, +-0.990714430945597410, -0.990721227669454360, -0.990728021916508330, -0.990734813686742100, -0.990741602980138800, -0.990748389796681560, -0.990755174136353280, -0.990761955999137300, +-0.990768735385016200, -0.990775512293973320, -0.990782286725991670, -0.990789058681054270, -0.990795828159144240, -0.990802595160244600, -0.990809359684338480, -0.990816121731408980, +-0.990822881301439250, -0.990829638394412290, -0.990836393010311230, -0.990843145149119200, -0.990849894810819200, -0.990856641995394470, -0.990863386702828250, -0.990870128933103670, +-0.990876868686203500, -0.990883605962111340, -0.990890340760810060, -0.990897073082282920, -0.990903802926513140, -0.990910530293483860, -0.990917255183178190, -0.990923977595579490, +-0.990930697530670870, -0.990937414988435460, -0.990944129968856500, -0.990950842471917110, -0.990957552497600760, -0.990964260045890440, -0.990970965116769630, -0.990977667710221220, +-0.990984367826228780, -0.990991065464775330, -0.990997760625844220, -0.991004453309418660, -0.991011143515482030, -0.991017831244017540, -0.991024516495008450, -0.991031199268438190, +-0.991037879564289790, -0.991044557382546820, -0.991051232723192290, -0.991057905586209760, -0.991064575971582480, -0.991071243879293910, -0.991077909309327040, -0.991084572261665350, +-0.991091232736292290, -0.991097890733191210, -0.991104546252345340, -0.991111199293738140, -0.991117849857352850, -0.991124497943173030, -0.991131143551181930, -0.991137786681363100, +-0.991144427333699670, -0.991151065508175220, -0.991157701204773090, -0.991164334423476730, -0.991170965164269610, -0.991177593427134960, -0.991184219212056240, -0.991190842519017120, +-0.991197463348000850, -0.991204081698990880, -0.991210697571970780, -0.991217310966923890, -0.991223921883833680, -0.991230530322683710, -0.991237136283457550, -0.991243739766138440, +-0.991250340770709950, -0.991256939297155640, -0.991263535345458860, -0.991270128915603400, -0.991276720007572610, -0.991283308621350060, -0.991289894756919090, -0.991296478414263490, +-0.991303059593366620, -0.991309638294212150, -0.991316214516783530, -0.991322788261064350, -0.991329359527038270, -0.991335928314688970, -0.991342494623999590, -0.991349058454954020, +-0.991355619807535840, -0.991362178681728600, -0.991368735077515880, -0.991375288994881480, -0.991381840433808730, -0.991388389394281420, -0.991394935876283130, -0.991401479879797430, +-0.991408021404808100, -0.991414560451298720, -0.991421097019252850, -0.991427631108654280, -0.991434162719486810, -0.991440691851733780, -0.991447218505378980, -0.991453742680406200, +-0.991460264376799020, -0.991466783594541100, -0.991473300333616470, -0.991479814594008470, -0.991486326375700890, -0.991492835678677520, -0.991499342502921930, -0.991505846848418140, +-0.991512348715149710, -0.991518848103100430, -0.991525345012253980, -0.991531839442594150, -0.991538331394104850, -0.991544820866769650, -0.991551307860572330, -0.991557792375496790, +-0.991564274411526720, -0.991570753968646130, -0.991577231046838480, -0.991583705646087890, -0.991590177766377920, -0.991596647407692490, -0.991603114570015490, -0.991609579253330710, +-0.991616041457621940, -0.991622501182873100, -0.991628958429068060, -0.991635413196190640, -0.991641865484224620, -0.991648315293154000, -0.991654762622962480, -0.991661207473634070, +-0.991667649845152650, -0.991674089737502260, -0.991680527150666570, -0.991686962084629480, -0.991693394539374990, -0.991699824514887030, -0.991706252011149590, -0.991712677028146360, +-0.991719099565861570, -0.991725519624279020, -0.991731937203382710, -0.991738352303156550, -0.991744764923584430, -0.991751175064650380, -0.991757582726338400, -0.991763987908632520, +-0.991770390611516730, -0.991776790834974830, -0.991783188578991060, -0.991789583843549210, -0.991795976628633500, -0.991802366934227740, -0.991808754760316160, -0.991815140106882650, +-0.991821522973911350, -0.991827903361386260, -0.991834281269291300, -0.991840656697610680, -0.991847029646328430, -0.991853400115428550, -0.991859768104895290, -0.991866133614712650, +-0.991872496644864540, -0.991878857195335200, -0.991885215266108730, -0.991891570857169170, -0.991897923968500740, -0.991904274600087570, -0.991910622751913550, -0.991916968423963040, +-0.991923311616220160, -0.991929652328669140, -0.991935990561293780, -0.991942326314078530, -0.991948659587007400, -0.991954990380064630, -0.991961318693234450, -0.991967644526500990, +-0.991973967879848260, -0.991980288753260720, -0.991986607146722490, -0.991992923060217690, -0.991999236493730560, -0.992005547447245340, -0.992011855920746250, -0.992018161914217540, +-0.992024465427643550, -0.992030766461008300, -0.992037065014296120, -0.992043361087491250, -0.992049654680578040, -0.992055945793540620, -0.992062234426363540, -0.992068520579030610, +-0.992074804251526500, -0.992081085443835330, -0.992087364155941450, -0.992093640387829210, -0.992099914139482840, -0.992106185410886690, -0.992112454202025100, -0.992118720512882410, +-0.992124984343442870, -0.992131245693690820, -0.992137504563610720, -0.992143760953186790, -0.992150014862403510, -0.992156266291245310, -0.992162515239696340, -0.992168761707741040, +-0.992175005695363880, -0.992181247202549190, -0.992187486229281320, -0.992193722775544850, -0.992199956841324000, -0.992206188426603240, -0.992212417531367130, -0.992218644155599900, +-0.992224868299286020, -0.992231089962410050, -0.992237309144956230, -0.992243525846909220, -0.992249740068253510, -0.992255951808973300, -0.992262161069053290, -0.992268367848477830, +-0.992274572147231470, -0.992280773965298570, -0.992286973302663910, -0.992293170159311620, -0.992299364535226600, -0.992305556430393090, -0.992311745844795760, -0.992317932778418950, +-0.992324117231247360, -0.992330299203265430, -0.992336478694457850, -0.992342655704809060, -0.992348830234303650, -0.992355002282926060, -0.992361171850660970, -0.992367338937493070, +-0.992373503543406700, -0.992379665668386530, -0.992385825312417370, -0.992391982475483550, -0.992398137157569750, -0.992404289358660760, -0.992410439078740940, -0.992416586317794950, +-0.992422731075807580, -0.992428873352763310, -0.992435013148647020, -0.992441150463443060, -0.992447285297136220, -0.992453417649711180, -0.992459547521152620, -0.992465674911445220, +-0.992471799820573540, -0.992477922248522380, -0.992484042195276530, -0.992490159660820440, -0.992496274645139120, -0.992502387148216920, -0.992508497170038860, -0.992514604710589500, +-0.992520709769853740, -0.992526812347816030, -0.992532912444461510, -0.992539010059774630, -0.992545105193740170, -0.992551197846342940, -0.992557288017567710, -0.992563375707399280, +-0.992569460915822430, -0.992575543642821860, -0.992581623888382450, -0.992587701652489220, -0.992593776935126510, -0.992599849736279350, -0.992605920055932620, -0.992611987894071010, +-0.992618053250679530, -0.992624116125742970, -0.992630176519246010, -0.992636234431173550, -0.992642289861510600, -0.992648342810241950, -0.992654393277352390, -0.992660441262826820, +-0.992666486766650150, -0.992672529788807270, -0.992678570329283190, -0.992684608388062610, -0.992690643965130510, -0.992696677060471710, -0.992702707674071320, -0.992708735805914120, +-0.992714761455985140, -0.992720784624269270, -0.992726805310751300, -0.992732823515416360, -0.992738839238249460, -0.992744852479235380, -0.992750863238359150, -0.992756871515605770, +-0.992762877310960250, -0.992768880624407490, -0.992774881455932730, -0.992780879805520540, -0.992786875673156270, -0.992792869058824690, -0.992798859962511050, -0.992804848384200240, +-0.992810834323877290, -0.992816817781527310, -0.992822798757135190, -0.992828777250686080, -0.992834753262165080, -0.992840726791557100, -0.992846697838847380, -0.992852666404020920, +-0.992858632487062740, -0.992864596087958180, -0.992870557206691930, -0.992876515843249320, -0.992882471997615480, -0.992888425669775420, -0.992894376859714270, -0.992900325567417250, +-0.992906271792869390, -0.992912215536055800, -0.992918156796961720, -0.992924095575572150, -0.992930031871872450, -0.992935965685847630, -0.992941897017482920, -0.992947825866763440, +-0.992953752233674440, -0.992959676118201020, -0.992965597520328420, -0.992971516440041890, -0.992977432877326430, -0.992983346832167490, -0.992989258304550200, -0.992995167294459800, +-0.993001073801881410, -0.993006977826800250, -0.993012879369201800, -0.993018778429071050, -0.993024675006393350, -0.993030569101153950, -0.993036460713338180, -0.993042349842931380, +-0.993048236489918580, -0.993054120654285110, -0.993060002336016430, -0.993065881535097780, -0.993071758251514390, -0.993077632485251600, -0.993083504236294770, -0.993089373504629110, +-0.993095240290239990, -0.993101104593112850, -0.993106966413232930, -0.993112825750585570, -0.993118682605156120, -0.993124536976930040, -0.993130388865892550, -0.993136238272029240, +-0.993142085195325210, -0.993147929635765920, -0.993153771593336840, -0.993159611068023310, -0.993165448059810880, -0.993171282568684810, -0.993177114594630430, -0.993182944137633310, +-0.993188771197678790, -0.993194595774752330, -0.993200417868839500, -0.993206237479925540, -0.993212054607996000, -0.993217869253036230, -0.993223681415032030, -0.993229491093968410, +-0.993235298289831150, -0.993241103002605600, -0.993246905232277320, -0.993252704978831780, -0.993258502242254540, -0.993264297022531050, -0.993270089319646670, -0.993275879133587170, +-0.993281666464337910, -0.993287451311884560, -0.993293233676212470, -0.993299013557307430, -0.993304790955154780, -0.993310565869740200, -0.993316338301049150, -0.993322108249067300, +-0.993327875713780120, -0.993333640695173270, -0.993339403193232330, -0.993345163207942970, -0.993350920739290650, -0.993356675787261060, -0.993362428351839630, -0.993368178433012280, +-0.993373926030764350, -0.993379671145081740, -0.993385413775949910, -0.993391153923354420, -0.993396891587281280, -0.993402626767715850, -0.993408359464643790, -0.993414089678050780, +-0.993419817407922620, -0.993425542654244880, -0.993431265417003330, -0.993436985696183660, -0.993442703491771440, -0.993448418803752450, -0.993454131632112380, -0.993459841976837010, +-0.993465549837912130, -0.993471255215323310, -0.993476958109056340, -0.993482658519097010, -0.993488356445431100, -0.993494051888044180, -0.993499744846922160, -0.993505435322050710, +-0.993511123313415730, -0.993516808821003130, -0.993522491844798350, -0.993528172384787300, -0.993533850440955770, -0.993539526013289760, -0.993545199101774860, -0.993550869706396940, +-0.993556537827141820, -0.993562203463995490, -0.993567866616943520, -0.993573527285972040, -0.993579185471066610, -0.993584841172213240, -0.993590494389397730, -0.993596145122606080, +-0.993601793371823970, -0.993607439137037530, -0.993613082418232430, -0.993618723215394570, -0.993624361528509860, -0.993629997357564300, -0.993635630702543680, -0.993641261563434130, +-0.993646889940221320, -0.993652515832891270, -0.993658139241430090, -0.993663760165823470, -0.993669378606057420, -0.993674994562117830, -0.993680608033990830, -0.993686219021662430, +-0.993691827525118420, -0.993697433544344810, -0.993703037079327610, -0.993708638130052830, -0.993714236696506380, -0.993719832778674480, -0.993725426376542930, -0.993731017490097730, +-0.993736606119325130, -0.993742192264211010, -0.993747775924741280, -0.993753357100902180, -0.993758935792679710, -0.993764512000059890, -0.993770085723028830, -0.993775656961572550, +-0.993781225715677060, -0.993786791985328600, -0.993792355770513060, -0.993797917071216670, -0.993803475887425460, -0.993809032219125530, -0.993814586066303130, -0.993820137428944150, +-0.993825686307034940, -0.993831232700561510, -0.993836776609509980, -0.993842318033866470, -0.993847856973617110, -0.993853393428748120, -0.993858927399245860, -0.993864458885096110, +-0.993869987886285220, -0.993875514402799310, -0.993881038434624720, -0.993886559981747460, -0.993892079044153780, -0.993897595621830000, -0.993903109714762150, -0.993908621322936560, +-0.993914130446339470, -0.993919637084957010, -0.993925141238775400, -0.993930642907780990, -0.993936142091959910, -0.993941638791298600, -0.993947133005783190, -0.993952624735399910, +-0.993958113980135010, -0.993963600739974810, -0.993969085014905660, -0.993974566804913810, -0.993980046109985470, -0.993985522930107110, -0.993990997265264850, -0.993996469115445260, +-0.994001938480634450, -0.994007405360818660, -0.994012869755984460, -0.994018331666118080, -0.994023791091205760, -0.994029248031234160, -0.994034702486189300, -0.994040154456057760, +-0.994045603940825750, -0.994051050940479740, -0.994056495455006180, -0.994061937484391310, -0.994067377028621580, -0.994072814087683440, -0.994078248661563360, -0.994083680750247670, +-0.994089110353722600, -0.994094537471974850, -0.994099962104990740, -0.994105384252756740, -0.994110803915259300, -0.994116221092484880, -0.994121635784419810, -0.994127047991050670, +-0.994132457712363920, -0.994137864948346110, -0.994143269698983480, -0.994148671964262820, -0.994154071744170360, -0.994159469038692790, -0.994164863847816660, -0.994170256171528210, +-0.994175646009814120, -0.994181033362660950, -0.994186418230055270, -0.994191800611983530, -0.994197180508432200, -0.994202557919387940, -0.994207932844837330, -0.994213305284766810, +-0.994218675239163070, -0.994224042708012680, -0.994229407691302190, -0.994234770189018070, -0.994240130201147100, -0.994245487727675960, -0.994250842768590880, -0.994256195323878770, +-0.994261545393526180, -0.994266892977519690, -0.994272238075845970, -0.994277580688491810, -0.994282920815443560, -0.994288258456688000, -0.994293593612211810, -0.994298926282001560, +-0.994304256466044030, -0.994309584164325910, -0.994314909376833870, -0.994320232103554470, -0.994325552344474620, -0.994330870099580770, -0.994336185368859820, -0.994341498152298330, +-0.994346808449883100, -0.994352116261600800, -0.994357421587438450, -0.994362724427382380, -0.994368024781419390, -0.994373322649536480, -0.994378618031720230, -0.994383910927957420, +-0.994389201338234830, -0.994394489262539260, -0.994399774700857500, -0.994405057653176330, -0.994410338119482430, -0.994415616099762700, -0.994420891594003930, -0.994426164602192910, +-0.994431435124316530, -0.994436703160361590, -0.994441968710314870, -0.994447231774163170, -0.994452492351893480, -0.994457750443492490, -0.994463006048947110, -0.994468259168244220, +-0.994473509801370730, -0.994478757948313420, -0.994484003609059200, -0.994489246783595070, -0.994494487471907830, -0.994499725673984260, -0.994504961389811370, -0.994510194619376180, +-0.994515425362665570, -0.994520653619666240, -0.994525879390365300, -0.994531102674749650, -0.994536323472806290, -0.994541541784522030, -0.994546757609883980, -0.994551970948879040, +-0.994557181801494220, -0.994562390167716410, -0.994567596047532640, -0.994572799440929910, -0.994578000347895120, -0.994583198768415280, -0.994588394702477510, -0.994593588150068820, +-0.994598779111176110, -0.994603967585786400, -0.994609153573886800, -0.994614337075464320, -0.994619518090505970, -0.994624696618998880, -0.994629872660930060, -0.994635046216286510, +-0.994640217285055360, -0.994645385867223730, -0.994650551962778520, -0.994655715571706960, -0.994660876693996170, -0.994666035329633160, -0.994671191478605050, -0.994676345140898980, +-0.994681496316502050, -0.994686645005401380, -0.994691791207584110, -0.994696934923037230, -0.994702076151748100, -0.994707214893703840, -0.994712351148891450, -0.994717484917298280, +-0.994722616198911450, -0.994727744993717970, -0.994732871301705070, -0.994737995122860100, -0.994743116457170060, -0.994748235304622310, -0.994753351665203960, -0.994758465538902240, +-0.994763576925704270, -0.994768685825597410, -0.994773792238568880, -0.994778896164605800, -0.994783997603695510, -0.994789096555825260, -0.994794193020982150, -0.994799286999153650, +-0.994804378490326990, -0.994809467494489290, -0.994814554011627990, -0.994819638041730240, -0.994824719584783470, -0.994829798640774920, -0.994834875209691720, -0.994839949291521420, +-0.994845020886251260, -0.994850089993868590, -0.994855156614360640, -0.994860220747714740, -0.994865282393918360, -0.994870341552958730, -0.994875398224823290, -0.994880452409499410, +-0.994885504106974290, -0.994890553317235530, -0.994895600040270220, -0.994900644276066060, -0.994905686024610160, -0.994910725285890200, -0.994915762059893400, -0.994920796346607130, +-0.994925828146018820, -0.994930857458116050, -0.994935884282886040, -0.994940908620316370, -0.994945930470394370, -0.994950949833107610, -0.994955966708443550, -0.994960981096389530, +-0.994965992996933000, -0.994971002410061420, -0.994976009335762470, -0.994981013774023370, -0.994986015724831920, -0.994991015188175340, -0.994996012164041210, -0.995001006652416970, +-0.995005998653290310, -0.995010988166648680, -0.995015975192479530, -0.995020959730770430, -0.995025941781508940, -0.995030921344682630, -0.995035898420279060, -0.995040873008285590, +-0.995045845108690100, -0.995050814721479830, -0.995055781846642670, -0.995060746484166090, -0.995065708634037540, -0.995070668296244690, -0.995075625470775220, -0.995080580157616690, +-0.995085532356756670, -0.995090482068182850, -0.995095429291882770, -0.995100374027844240, -0.995105316276054700, -0.995110256036501940, -0.995115193309173420, -0.995120128094057030, +-0.995125060391140240, -0.995129990200410820, -0.995134917521856450, -0.995139842355464820, -0.995144764701223480, -0.995149684559120340, -0.995154601929142850, -0.995159516811279010, +-0.995164429205516290, -0.995169339111842470, -0.995174246530245330, -0.995179151460712560, -0.995184053903232060, -0.995188953857791270, -0.995193851324378100, -0.995198746302980330, +-0.995203638793585750, -0.995208528796181930, -0.995213416310756990, -0.995218301337298380, -0.995223183875794120, -0.995228063926231750, -0.995232941488599310, -0.995237816562884460, +-0.995242689149075100, -0.995247559247159020, -0.995252426857124010, -0.995257291978958070, -0.995262154612648780, -0.995267014758184130, -0.995271872415551930, -0.995276727584740060, +-0.995281580265736320, -0.995286430458528830, -0.995291278163105030, -0.995296123379453170, -0.995300966107560910, -0.995305806347416280, -0.995310644099007160, -0.995315479362321340, +-0.995320312137346840, -0.995325142424071660, -0.995329970222483600, -0.995334795532570650, -0.995339618354320610, -0.995344438687721490, -0.995349256532761410, -0.995354071889428040, +-0.995358884757709730, -0.995363695137594040, -0.995368503029069100, -0.995373308432122910, -0.995378111346743480, -0.995382911772918710, -0.995387709710636730, -0.995392505159885420, +-0.995397298120652920, -0.995402088592927110, -0.995406876576696130, -0.995411662071947980, -0.995416445078670550, -0.995421225596852090, -0.995426003626480590, -0.995430779167544190, +-0.995435552220030660, -0.995440322783928240, -0.995445090859225060, -0.995449856445909220, -0.995454619543968630, -0.995459380153391530, -0.995464138274166020, -0.995468893906280130, +-0.995473647049722080, -0.995478397704479880, -0.995483145870541650, -0.995487891547895520, -0.995492634736529710, -0.995497375436432350, -0.995502113647591560, -0.995506849369995450, +-0.995511582603632150, -0.995516313348490000, -0.995521041604557010, -0.995525767371821410, -0.995530490650271330, -0.995535211439895100, -0.995539929740680840, -0.995544645552616790, +-0.995549358875691180, -0.995554069709892020, -0.995558778055207760, -0.995563483911626520, -0.995568187279136650, -0.995572888157726270, -0.995577586547383710, -0.995582282448097100, +-0.995586975859854780, -0.995591666782645100, -0.995596355216456170, -0.995601041161276460, -0.995605724617094070, -0.995610405583897350, -0.995615084061674650, -0.995619760050414300, +-0.995624433550104440, -0.995629104560733610, -0.995633773082289950, -0.995638439114761800, -0.995643102658137600, -0.995647763712405710, -0.995652422277554460, -0.995657078353571980, +-0.995661731940446940, -0.995666383038167460, -0.995671031646722100, -0.995675677766099110, -0.995680321396286930, -0.995684962537274010, -0.995689601189048590, -0.995694237351599340, +-0.995698871024914280, -0.995703502208982180, -0.995708130903791290, -0.995712757109330050, -0.995717380825587030, -0.995722002052550460, -0.995726620790208910, -0.995731237038550710, +-0.995735850797564550, -0.995740462067238650, -0.995745070847561700, -0.995749677138522030, -0.995754280940108090, -0.995758882252308570, -0.995763481075111810, -0.995768077408506370, +-0.995772671252480700, -0.995777262607023370, -0.995781851472122840, -0.995786437847767770, -0.995791021733946510, -0.995795603130647740, -0.995800182037860030, -0.995804758455571700, +-0.995809332383771560, -0.995813903822448170, -0.995818472771589860, -0.995823039231185540, -0.995827603201223430, -0.995832164681692560, -0.995836723672581140, -0.995841280173877850, +-0.995845834185571490, -0.995850385707650390, -0.995854934740103450, -0.995859481282919230, -0.995864025336086200, -0.995868566899593130, -0.995873105973428600, -0.995877642557581380, +-0.995882176652039930, -0.995886708256793150, -0.995891237371829610, -0.995895763997137860, -0.995900288132706920, -0.995904809778525020, -0.995909328934581280, -0.995913845600864040, +-0.995918359777362320, -0.995922871464064660, -0.995927380660959870, -0.995931887368036620, -0.995936391585283580, -0.995940893312689650, -0.995945392550243390, -0.995949889297933710, +-0.995954383555749280, -0.995958875323678880, -0.995963364601711310, -0.995967851389835350, -0.995972335688039780, -0.995976817496313280, -0.995981296814644870, -0.995985773643023100, +-0.995990247981436980, -0.995994719829875200, -0.995999189188326640, -0.996003656056780100, -0.996008120435224350, -0.996012582323648420, -0.996017041722040970, -0.996021498630390910, +-0.996025953048687020, -0.996030404976918420, -0.996034854415073670, -0.996039301363141890, -0.996043745821111880, -0.996048187788972420, -0.996052627266712510, -0.996057064254320950, +-0.996061498751786960, -0.996065930759098990, -0.996070360276246290, -0.996074787303217630, -0.996079211840002140, -0.996083633886588490, -0.996088053442965800, -0.996092470509122970, +-0.996096885085048900, -0.996101297170732700, -0.996105706766163280, -0.996110113871329640, -0.996114518486220570, -0.996118920610825300, -0.996123320245132620, -0.996127717389131750, +-0.996132112042811600, -0.996136504206161180, -0.996140893879169380, -0.996145281061825430, -0.996149665754118230, -0.996154047956036900, -0.996158427667570460, -0.996162804888707900, +-0.996167179619438350, -0.996171551859750930, -0.996175921609634530, -0.996180288869078390, -0.996184653638071520, -0.996189015916602920, -0.996193375704661820, -0.996197733002237460, +-0.996202087809318630, -0.996206440125894540, -0.996210789951954330, -0.996215137287487230, -0.996219482132482240, -0.996223824486928590, -0.996228164350815290, -0.996232501724131690, +-0.996236836606866900, -0.996241168999009830, -0.996245498900549920, -0.996249826311476290, -0.996254151231778070, -0.996258473661444490, -0.996262793600464770, -0.996267111048827920, +-0.996271426006523410, -0.996275738473540230, -0.996280048449867840, -0.996284355935495250, -0.996288660930411800, -0.996292963434606600, -0.996297263448069130, -0.996301560970788370, +-0.996305856002753900, -0.996310148543954610, -0.996314438594380070, -0.996318726154019400, -0.996323011222861820, -0.996327293800896910, -0.996331573888113550, -0.996335851484501430, +-0.996340126590049560, -0.996344399204747380, -0.996348669328584240, -0.996352936961549470, -0.996357202103632210, -0.996361464754822120, -0.996365724915108220, -0.996369982584480170, +-0.996374237762927110, -0.996378490450438360, -0.996382740647003500, -0.996386988352611750, -0.996391233567252450, -0.996395476290915180, -0.996399716523589160, -0.996403954265263850, +-0.996408189515928690, -0.996412422275573030, -0.996416652544186320, -0.996420880321758020, -0.996425105608277460, -0.996429328403734100, -0.996433548708117510, -0.996437766521417020, +-0.996441981843622090, -0.996446194674722290, -0.996450405014706830, -0.996454612863565510, -0.996458818221287680, -0.996463021087862780, -0.996467221463280260, -0.996471419347529700, +-0.996475614740600530, -0.996479807642482450, -0.996483998053164790, -0.996488185972637110, -0.996492371400888980, -0.996496554337910070, -0.996500734783689610, -0.996504912738217290, +-0.996509088201482760, -0.996513261173475500, -0.996517431654185050, -0.996521599643601210, -0.996525765141713200, -0.996529928148510710, -0.996534088663983520, -0.996538246688121080, +-0.996542402220913060, -0.996546555262348920, -0.996550705812418450, -0.996554853871111310, -0.996558999438416860, -0.996563142514325100, -0.996567283098825360, -0.996571421191907450, +-0.996575556793561020, -0.996579689903775660, -0.996583820522541130, -0.996587948649847010, -0.996592074285682970, -0.996596197430038800, -0.996600318082904170, -0.996604436244268640, +-0.996608551914122010, -0.996612665092454160, -0.996616775779254450, -0.996620883974512980, -0.996624989678219220, -0.996629092890363060, -0.996633193610934050, -0.996637291839922110, +-0.996641387577316910, -0.996645480823108220, -0.996649571577285950, -0.996653659839839670, -0.996657745610759260, -0.996661828890034520, -0.996665909677655120, -0.996669987973610950, +-0.996674063777891920, -0.996678137090487580, -0.996682207911388060, -0.996686276240582920, -0.996690342078062170, -0.996694405423815490, -0.996698466277832760, -0.996702524640104000, +-0.996706580510618780, -0.996710633889367200, -0.996714684776339070, -0.996718733171524150, -0.996722779074912470, -0.996726822486493690, -0.996730863406257940, -0.996734901834195110, +-0.996738937770294990, -0.996742971214547470, -0.996747002166942560, -0.996751030627470170, -0.996755056596120180, -0.996759080072882500, -0.996763101057747130, -0.996767119550704070, +-0.996771135551743240, -0.996775149060854520, -0.996779160078027910, -0.996783168603253330, -0.996787174636521000, -0.996791178177820590, -0.996795179227142230, -0.996799177784476020, +-0.996803173849811870, -0.996807167423139680, -0.996811158504449680, -0.996815147093731760, -0.996819133190975930, -0.996823116796172300, -0.996827097909310900, -0.996831076530381720, +-0.996835052659374890, -0.996839026296280410, -0.996842997441088290, -0.996846966093788760, -0.996850932254371710, -0.996854895922827390, -0.996858857099145900, -0.996862815783317150, +-0.996866771975331470, -0.996870725675178870, -0.996874676882849360, -0.996878625598333290, -0.996882571821620540, -0.996886515552701360, -0.996890456791565960, -0.996894395538204360, +-0.996898331792606780, -0.996902265554763470, -0.996906196824664300, -0.996910125602299750, -0.996914051887659910, -0.996917975680734920, -0.996921896981515010, -0.996925815789990290, +-0.996929732106151100, -0.996933645929987570, -0.996937557261489920, -0.996941466100648380, -0.996945372447453180, -0.996949276301894450, -0.996953177663962740, -0.996957076533647960, +-0.996960972910940440, -0.996964866795830520, -0.996968758188308430, -0.996972647088364530, -0.996976533495988910, -0.996980417411172050, -0.996984298833904050, -0.996988177764175370, +-0.996992054201976230, -0.996995928147296980, -0.996999799600127860, -0.997003668560459190, -0.997007535028281430, -0.997011399003584930, -0.997015260486359800, -0.997019119476596490, +-0.997022975974285460, -0.997026829979416940, -0.997030681491981370, -0.997034530511969110, -0.997038377039370480, -0.997042221074175950, -0.997046062616375850, -0.997049901665960640, +-0.997053738222920650, -0.997057572287246340, -0.997061403858928050, -0.997065232937956240, -0.997069059524321450, -0.997072883618013940, -0.997076705219024140, -0.997080524327342730, +-0.997084340942959830, -0.997088155065866230, -0.997091966696052160, -0.997095775833508170, -0.997099582478224830, -0.997103386630192490, -0.997107188289401700, -0.997110987455842920, +-0.997114784129506710, -0.997118578310383420, -0.997122369998463820, -0.997126159193738150, -0.997129945896197300, -0.997133730105831400, -0.997137511822631220, -0.997141291046587330, +-0.997145067777690080, -0.997148842015930240, -0.997152613761298270, -0.997156383013784840, -0.997160149773380410, -0.997163914040075650, -0.997167675813861010, -0.997171435094727280, +-0.997175191882664900, -0.997178946177664450, -0.997182697979716810, -0.997186447288812340, -0.997190194104941810, -0.997193938428095670, -0.997197680258264830, -0.997201419595439730, +-0.997205156439611050, -0.997208890790769460, -0.997212622648905640, -0.997216352014010380, -0.997220078886074220, -0.997223803265087750, -0.997227525151041850, -0.997231244543927090, +-0.997234961443734250, -0.997238675850454000, -0.997242387764077140, -0.997246097184594230, -0.997249804111996150, -0.997253508546273480, -0.997257210487417000, -0.997260909935417610, +-0.997264606890265860, -0.997268301351952550, -0.997271993320468560, -0.997275682795804590, -0.997279369777951510, -0.997283054266899890, -0.997286736262640640, -0.997290415765164530, +-0.997294092774462460, -0.997297767290525110, -0.997301439313343360, -0.997305108842908020, -0.997308775879209850, -0.997312440422239770, -0.997316102471988540, -0.997319762028447190, +-0.997323419091606270, -0.997327073661456900, -0.997330725737989860, -0.997334375321195950, -0.997338022411066170, -0.997341667007591300, -0.997345309110762250, -0.997348948720569890, +-0.997352585837005260, -0.997356220460059120, -0.997359852589722480, -0.997363482225986140, -0.997367109368841100, -0.997370734018278250, -0.997374356174288600, -0.997377975836863050, +-0.997381593005992610, -0.997385207681668050, -0.997388819863880730, -0.997392429552621200, -0.997396036747880580, -0.997399641449649880, -0.997403243657920100, -0.997406843372682150, +-0.997410440593927250, -0.997414035321646080, -0.997417627555829860, -0.997421217296469600, -0.997424804543556310, -0.997428389297081000, -0.997431971557034670, -0.997435551323408440, +-0.997439128596193330, -0.997442703375380550, -0.997446275660960780, -0.997449845452925480, -0.997453412751265420, -0.997456977555971960, -0.997460539867035980, -0.997464099684448710, +-0.997467657008201170, -0.997471211838284470, -0.997474764174689720, -0.997478314017408160, -0.997481861366430690, -0.997485406221748640, -0.997488948583353020, -0.997492488451235060, +-0.997496025825385880, -0.997499560705796710, -0.997503093092458550, -0.997506622985362630, -0.997510150384500300, -0.997513675289862460, -0.997517197701440540, -0.997520717619225560, +-0.997524235043208750, -0.997527749973381340, -0.997531262409734550, -0.997534772352259740, -0.997538279800947890, -0.997541784755790360, -0.997545287216778380, -0.997548787183903160, +-0.997552284657156060, -0.997555779636528080, -0.997559272122010790, -0.997562762113595290, -0.997566249611272830, -0.997569734615034840, -0.997573217124872460, -0.997576697140777010, +-0.997580174662739850, -0.997583649690752310, -0.997587122224805610, -0.997590592264891000, -0.997594059811000020, -0.997597524863123810, -0.997600987421253920, -0.997604447485381460, +-0.997607905055497900, -0.997611360131594570, -0.997614812713662920, -0.997618262801694190, -0.997621710395679710, -0.997625155495611150, -0.997628598101479520, -0.997632038213276510, +-0.997635475830993320, -0.997638910954621430, -0.997642343584152380, -0.997645773719577300, -0.997649201360887970, -0.997652626508075510, -0.997656049161131600, -0.997659469320047450, +-0.997662886984814650, -0.997666302155424730, -0.997669714831868950, -0.997673125014138850, -0.997676532702226120, -0.997679937896121860, -0.997683340595817870, -0.997686740801305480, +-0.997690138512576260, -0.997693533729621660, -0.997696926452433240, -0.997700316681002560, -0.997703704415321080, -0.997707089655380240, -0.997710472401171830, -0.997713852652687080, +-0.997717230409917780, -0.997720605672855370, -0.997723978441491520, -0.997727348715817700, -0.997730716495825450, -0.997734081781506470, -0.997737444572852290, -0.997740804869854500, +-0.997744162672504650, -0.997747517980794420, -0.997750870794715360, -0.997754221114259150, -0.997757568939417360, -0.997760914270181760, -0.997764257106543710, -0.997767597448495080, +-0.997770935296027560, -0.997774270649132600, -0.997777603507801980, -0.997780933872027380, -0.997784261741800460, -0.997787587117112800, -0.997790909997956170, -0.997794230384322360, +-0.997797548276202930, -0.997800863673589560, -0.997804176576474130, -0.997807486984848220, -0.997810794898703720, -0.997814100318032080, -0.997817403242825200, -0.997820703673074850, +-0.997824001608772710, -0.997827297049910580, -0.997830589996480220, -0.997833880448473430, -0.997837168405881880, -0.997840453868697460, -0.997843736836911850, -0.997847017310516840, +-0.997850295289504420, -0.997853570773866160, -0.997856843763593960, -0.997860114258679820, -0.997863382259115310, -0.997866647764892310, -0.997869910776002620, -0.997873171292438240, +-0.997876429314190960, -0.997879684841252560, -0.997882937873615040, -0.997886188411270080, -0.997889436454209580, -0.997892682002425650, -0.997895925055909850, -0.997899165614654300, +-0.997902403678650910, -0.997905639247891440, -0.997908872322367910, -0.997912102902072220, -0.997915330986996250, -0.997918556577131910, -0.997921779672471200, -0.997925000273006120, +-0.997928218378728470, -0.997931433989630360, -0.997934647105703570, -0.997937857726940100, -0.997941065853332090, -0.997944271484871410, -0.997947474621549980, -0.997950675263359900, +-0.997953873410293180, -0.997957069062341720, -0.997960262219497630, -0.997963452881752920, -0.997966641049099490, -0.997969826721529450, -0.997973009899034920, -0.997976190581607910, +-0.997979368769240320, -0.997982544461924360, -0.997985717659651940, -0.997988888362415280, -0.997992056570206510, -0.997995222283017510, -0.997998385500840410, -0.998001546223667320, +-0.998004704451490480, -0.998007860184301880, -0.998011013422093640, -0.998014164164857780, -0.998017312412586510, -0.998020458165271960, -0.998023601422906360, -0.998026742185481710, +-0.998029880452990240, -0.998033016225423950, -0.998036149502775190, -0.998039280285036080, -0.998042408572198720, -0.998045534364255360, -0.998048657661198100, -0.998051778463019290, +-0.998054896769711040, -0.998058012581265590, -0.998061125897675040, -0.998064236718931630, -0.998067345045027700, -0.998070450875955360, -0.998073554211706960, -0.998076655052274610, +-0.998079753397650650, -0.998082849247827310, -0.998085942602796820, -0.998089033462551510, -0.998092121827083510, -0.998095207696385270, -0.998098291070449120, -0.998101371949267180, +-0.998104450332831790, -0.998107526221135190, -0.998110599614169920, -0.998113670511928010, -0.998116738914402000, -0.998119804821584240, -0.998122868233466850, -0.998125929150042280, +-0.998128987571302970, -0.998132043497241160, -0.998135096927849190, -0.998138147863119500, -0.998141196303044430, -0.998144242247616440, -0.998147285696827760, -0.998150326650670940, +-0.998153365109138320, -0.998156401072222250, -0.998159434539915070, -0.998162465512209440, -0.998165493989097710, -0.998168519970572100, -0.998171543456625180, -0.998174564447249500, +-0.998177582942437300, -0.998180598942181250, -0.998183612446473690, -0.998186623455306950, -0.998189631968673830, -0.998192637986566540, -0.998195641508977770, -0.998198642535899740, +-0.998201641067325230, -0.998204637103246580, -0.998207630643656250, -0.998210621688546910, -0.998213610237911110, -0.998216596291741200, -0.998219579850029850, -0.998222560912769400, +-0.998225539479952630, -0.998228515551572100, -0.998231489127620160, -0.998234460208089590, -0.998237428792972840, -0.998240394882262460, -0.998243358475951140, -0.998246319574031430, +-0.998249278176496000, -0.998252234283337200, -0.998255187894547920, -0.998258139010120730, -0.998261087630048060, -0.998264033754322820, -0.998266977382937350, -0.998269918515884540, +-0.998272857153156830, -0.998275793294747030, -0.998278726940647790, -0.998281658090851680, -0.998284586745351480, -0.998287512904139750, -0.998290436567209280, -0.998293357734552630, +-0.998296276406162700, -0.998299192582032040, -0.998302106262153430, -0.998305017446519560, -0.998307926135123090, -0.998310832327956810, -0.998313736025013500, -0.998316637226285720, +-0.998319535931766480, -0.998322432141448330, -0.998325325855324190, -0.998328217073386700, -0.998331105795628670, -0.998333992022042870, -0.998336875752621980, -0.998339756987358990, +-0.998342635726246600, -0.998345511969277680, -0.998348385716445020, -0.998351256967741300, -0.998354125723159400, -0.998356991982692230, -0.998359855746332570, -0.998362717014073310, +-0.998365575785907230, -0.998368432061827240, -0.998371285841826110, -0.998374137125896840, -0.998376985914032230, -0.998379832206225060, -0.998382676002468330, -0.998385517302754930, +-0.998388356107077770, -0.998391192415429730, -0.998394026227803710, -0.998396857544192610, -0.998399686364589310, -0.998402512688986830, -0.998405336517378060, -0.998408157849756010, +-0.998410976686113560, -0.998413793026443620, -0.998416606870739190, -0.998419418218993270, -0.998422227071198880, -0.998425033427348780, -0.998427837287436120, -0.998430638651453980, +-0.998433437519395170, -0.998436233891252800, -0.998439027767019760, -0.998441819146689170, -0.998444608030254140, -0.998447394417707470, -0.998450178309042370, -0.998452959704251740, +-0.998455738603328810, -0.998458515006266590, -0.998461288913057960, -0.998464060323696170, -0.998466829238174200, -0.998469595656485190, -0.998472359578622130, -0.998475121004578250, +-0.998477879934346560, -0.998480636367920170, -0.998483390305292100, -0.998486141746455670, -0.998488890691403790, -0.998491637140129670, -0.998494381092626560, -0.998497122548887450, +-0.998499861508905460, -0.998502597972674040, -0.998505331940185870, -0.998508063411434500, -0.998510792386412940, -0.998513518865114410, -0.998516242847532150, -0.998518964333659160, +-0.998521683323488900, -0.998524399817014350, -0.998527113814228760, -0.998529825315125460, -0.998532534319697460, -0.998535240827938320, -0.998537944839840930, -0.998540646355398740, +-0.998543345374604980, -0.998546041897452770, -0.998548735923935450, -0.998551427454046350, -0.998554116487778700, -0.998556803025125730, -0.998559487066080780, -0.998562168610637070, +-0.998564847658787950, -0.998567524210526640, -0.998570198265846590, -0.998572869824741030, -0.998575538887203410, -0.998578205453226730, -0.998580869522804670, -0.998583531095930450, +-0.998586190172597420, -0.998588846752798800, -0.998591500836528150, -0.998594152423778690, -0.998596801514543890, -0.998599448108817180, -0.998602092206591680, -0.998604733807861080, +-0.998607372912618580, -0.998610009520857660, -0.998612643632571740, -0.998615275247754170, -0.998617904366398410, -0.998620530988497900, -0.998623155114046090, -0.998625776743036430, +-0.998628395875462260, -0.998631012511317030, -0.998633626650594410, -0.998636238293287630, -0.998638847439390350, -0.998641454088895930, -0.998644058241797810, -0.998646659898089540, +-0.998649259057764690, -0.998651855720816610, -0.998654449887238950, -0.998657041557025170, -0.998659630730168720, -0.998662217406663280, -0.998664801586502280, -0.998667383269679300, +-0.998669962456187780, -0.998672539146021390, -0.998675113339173580, -0.998677685035638140, -0.998680254235408400, -0.998682820938478040, -0.998685385144840620, -0.998687946854489810, +-0.998690506067419050, -0.998693062783622020, -0.998695617003092280, -0.998698168725823620, -0.998700717951809480, -0.998703264681043650, -0.998705808913519570, -0.998708350649230910, +-0.998710889888171470, -0.998713426630334690, -0.998715960875714460, -0.998718492624304340, -0.998721021876097900, -0.998723548631088920, -0.998726072889271070, -0.998728594650638120, +-0.998731113915183540, -0.998733630682901330, -0.998736144953784930, -0.998738656727828240, -0.998741166005024830, -0.998743672785368570, -0.998746177068853160, -0.998748678855472250, +-0.998751178145219630, -0.998753674938089090, -0.998756169234074400, -0.998758661033169240, -0.998761150335367500, -0.998763637140662740, -0.998766121449048970, -0.998768603260519860, +-0.998771082575069300, -0.998773559392691080, -0.998776033713378860, -0.998778505537126660, -0.998780974863928140, -0.998783441693777090, -0.998785906026667500, -0.998788367862593170, +-0.998790827201547880, -0.998793284043525630, -0.998795738388520090, -0.998798190236525270, -0.998800639587534840, -0.998803086441542920, -0.998805530798543280, -0.998807972658529720, +-0.998810412021496340, -0.998812848887436820, -0.998815283256345280, -0.998817715128215490, -0.998820144503041460, -0.998822571380816980, -0.998824995761536160, -0.998827417645192780, +-0.998829837031780960, -0.998832253921294490, -0.998834668313727360, -0.998837080209073580, -0.998839489607327050, -0.998841896508481870, -0.998844300912531850, -0.998846702819471190, +-0.998849102229293680, -0.998851499141993450, -0.998853893557564600, -0.998856285476000920, -0.998858674897296410, -0.998861061821445410, -0.998863446248441590, -0.998865828178279180, +-0.998868207610952300, -0.998870584546454830, -0.998872958984780900, -0.998875330925924620, -0.998877700369880000, -0.998880067316641140, -0.998882431766202060, -0.998884793718556870, +-0.998887153173699800, -0.998889510131624860, -0.998891864592326040, -0.998894216555797580, -0.998896566022033580, -0.998898912991028180, -0.998901257462775580, -0.998903599437269700, +-0.998905938914504960, -0.998908275894475280, -0.998910610377174880, -0.998912942362597980, -0.998915271850738810, -0.998917598841591370, -0.998919923335150010, -0.998922245331408720, +-0.998924564830361960, -0.998926881832003730, -0.998929196336328260, -0.998931508343329780, -0.998933817853002610, -0.998936124865340890, -0.998938429380338830, -0.998940731397990670, +-0.998943030918290730, -0.998945327941233140, -0.998947622466812350, -0.998949914495022350, -0.998952204025857720, -0.998954491059312440, -0.998956775595380990, -0.998959057634057680, +-0.998961337175336640, -0.998963614219212310, -0.998965888765678930, -0.998968160814730830, -0.998970430366362240, -0.998972697420567710, -0.998974961977341370, -0.998977224036677660, +-0.998979483598570810, -0.998981740663015260, -0.998983995230005470, -0.998986247299535560, -0.998988496871600070, -0.998990743946193360, -0.998992988523309870, -0.998995230602943820, +-0.998997470185089660, -0.998999707269741970, -0.999001941856894840, -0.999004173946542950, -0.999006403538680640, -0.999008630633302250, -0.999010855230402340, -0.999013077329975240, +-0.999015296932015520, -0.999017514036517510, -0.999019728643475660, -0.999021940752884640, -0.999024150364738680, -0.999026357479032350, -0.999028562095760080, -0.999030764214916430, +-0.999032963836495980, -0.999035160960492940, -0.999037355586902100, -0.999039547715717900, -0.999041737346934800, -0.999043924480547350, -0.999046109116550120, -0.999048291254937550, +-0.999050470895704310, -0.999052648038844860, -0.999054822684353750, -0.999056994832225650, -0.999059164482455020, -0.999061331635036520, -0.999063496289964710, -0.999065658447234160, +-0.999067818106839420, -0.999069975268775060, -0.999072129933035850, -0.999074282099616350, -0.999076431768511130, -0.999078578939714860, -0.999080723613222090, -0.999082865789027500, +-0.999085005467125750, -0.999087142647511530, -0.999089277330179380, -0.999091409515124100, -0.999093539202340230, -0.999095666391822570, -0.999097791083565780, -0.999099913277564420, +-0.999102032973813390, -0.999104150172307140, -0.999106264873040660, -0.999108377076008410, -0.999110486781205290, -0.999112593988625950, -0.999114698698265080, -0.999116800910117450, +-0.999118900624177850, -0.999120997840440950, -0.999123092558901640, -0.999125184779554590, -0.999127274502394580, -0.999129361727416290, -0.999131446454614710, -0.999133528683984420, +-0.999135608415520290, -0.999137685649217230, -0.999139760385070020, -0.999141832623073320, -0.999143902363222040, -0.999145969605510940, -0.999148034349934930, -0.999150096596488900, +-0.999152156345167630, -0.999154213595965900, -0.999156268348878720, -0.999158320603900860, -0.999160370361027230, -0.999162417620252600, -0.999164462381571970, -0.999166504644980140, +-0.999168544410471980, -0.999170581678042620, -0.999172616447686730, -0.999174648719399320, -0.999176678493175260, -0.999178705769009470, -0.999180730546897040, -0.999182752826832670, +-0.999184772608811440, -0.999186789892828280, -0.999188804678878270, -0.999190816966956110, -0.999192826757056900, -0.999194834049175640, -0.999196838843307340, -0.999198841139446900, +-0.999200840937589430, -0.999202838237729820, -0.999204833039863070, -0.999206825343984310, -0.999208815150088410, -0.999210802458170510, -0.999212787268225600, -0.999214769580248690, +-0.999216749394234880, -0.999218726710179310, -0.999220701528076850, -0.999222673847922520, -0.999224643669711640, -0.999226610993439120, -0.999228575819100070, -0.999230538146689610, +-0.999232497976202730, -0.999234455307634660, -0.999236410140980410, -0.999238362476235100, -0.999240312313393940, -0.999242259652452060, -0.999244204493404450, -0.999246146836246350, +-0.999248086680972870, -0.999250024027579230, -0.999251958876060550, -0.999253891226411840, -0.999255821078628540, -0.999257748432705540, -0.999259673288638290, -0.999261595646421920, +-0.999263515506051410, -0.999265432867522120, -0.999267347730829370, -0.999269260095968170, -0.999271169962933750, -0.999273077331721550, -0.999274982202326580, -0.999276884574744170, +-0.999278784448969560, -0.999280681824997960, -0.999282576702824610, -0.999284469082444950, -0.999286358963853980, -0.999288246347047160, -0.999290131232019820, -0.999292013618767070, +-0.999293893507284260, -0.999295770897566720, -0.999297645789609780, -0.999299518183408790, -0.999301388078958960, -0.999303255476255540, -0.999305120375294180, -0.999306982776069890, +-0.999308842678578220, -0.999310700082814420, -0.999312554988773800, -0.999314407396451830, -0.999316257305843840, -0.999318104716945270, -0.999319949629751350, -0.999321792044257640, +-0.999323631960459370, -0.999325469378352090, -0.999327304297931150, -0.999329136719191880, -0.999330966642129730, -0.999332794066740250, -0.999334618993018790, -0.999336441420960790, +-0.999338261350561700, -0.999340078781816850, -0.999341893714721820, -0.999343706149272150, -0.999345516085463180, -0.999347323523290370, -0.999349128462749370, -0.999350930903835420, +-0.999352730846544190, -0.999354528290871120, -0.999356323236811780, -0.999358115684361610, -0.999359905633516070, -0.999361693084270810, -0.999363478036621400, -0.999365260490563290, +-0.999367040446091930, -0.999368817903202980, -0.999370592861892120, -0.999372365322154680, -0.999374135283986330, -0.999375902747382640, -0.999377667712339160, -0.999379430178851560, +-0.999381190146915400, -0.999382947616526130, -0.999384702587679640, -0.999386455060371380, -0.999388205034596910, -0.999389952510352010, -0.999391697487632240, -0.999393439966433150, +-0.999395179946750420, -0.999396917428579830, -0.999398652411916940, -0.999400384896757420, -0.999402114883096940, -0.999403842370931160, -0.999405567360255760, -0.999407289851066420, +-0.999409009843358900, -0.999410727337128880, -0.999412442332372030, -0.999414154829084020, -0.999415864827260640, -0.999417572326897650, -0.999419277327990740, -0.999420979830535570, +-0.999422679834527930, -0.999424377339963590, -0.999426072346838450, -0.999427764855148060, -0.999429454864888210, -0.999431142376054680, -0.999432827388643360, -0.999434509902650040, +-0.999436189918070260, -0.999437867434900150, -0.999439542453135380, -0.999441214972771720, -0.999442884993805070, -0.999444552516231100, -0.999446217540045810, -0.999447880065244990, +-0.999449540091824410, -0.999451197619780070, -0.999452852649107660, -0.999454505179803170, -0.999456155211862370, -0.999457802745281290, -0.999459447780055580, -0.999461090316181240, +-0.999462730353654290, -0.999464367892470400, -0.999466002932625660, -0.999467635474115990, -0.999469265516937040, -0.999470893061085050, -0.999472518106555800, -0.999474140653345280, +-0.999475760701449390, -0.999477378250864130, -0.999478993301585410, -0.999480605853609210, -0.999482215906931430, -0.999483823461548180, -0.999485428517455250, -0.999487031074648870, +-0.999488631133124920, -0.999490228692879400, -0.999491823753908220, -0.999493416316207580, -0.999495006379773290, -0.999496593944601550, -0.999498179010688380, -0.999499761578029670, +-0.999501341646621630, -0.999502919216460170, -0.999504494287541510, -0.999506066859861540, -0.999507636933416380, -0.999509204508202130, -0.999510769584214920, -0.999512332161450750, +-0.999513892239905720, -0.999515449819576070, -0.999517004900457700, -0.999518557482546810, -0.999520107565839640, -0.999521655150332090, -0.999523200236020480, -0.999524742822900820, +-0.999526282910969340, -0.999527820500222040, -0.999529355590655370, -0.999530888182265210, -0.999532418275047800, -0.999533945868999350, -0.999535470964116100, -0.999536993560394160, +-0.999538513657829750, -0.999540031256418990, -0.999541546356158220, -0.999543058957043540, -0.999544569059071190, -0.999546076662237380, -0.999547581766538570, -0.999549084371970650, +-0.999550584478530070, -0.999552082086212930, -0.999553577195015700, -0.999555069804934470, -0.999556559915965590, -0.999558047528105400, -0.999559532641350000, -0.999561015255695740, +-0.999562495371138950, -0.999563972987675960, -0.999565448105303010, -0.999566920724016540, -0.999568390843812660, -0.999569858464687820, -0.999571323586638360, -0.999572786209660610, +-0.999574246333750800, -0.999575703958905490, -0.999577159085120790, -0.999578611712393260, -0.999580061840719240, -0.999581509470095050, -0.999582954600517050, -0.999584397231981780, +-0.999585837364485360, -0.999587274998024470, -0.999588710132595320, -0.999590142768194360, -0.999591572904818150, -0.999593000542462920, -0.999594425681125220, -0.999595848320801510, +-0.999597268461488110, -0.999598686103181480, -0.999600101245878280, -0.999601513889574740, -0.999602924034267430, -0.999604331679952770, -0.999605736826627340, -0.999607139474287590, +-0.999608539622929950, -0.999609937272550990, -0.999611332423147150, -0.999612725074714990, -0.999614115227251080, -0.999615502880751740, -0.999616888035213760, -0.999618270690633580, +-0.999619650847007660, -0.999621028504332540, -0.999622403662605020, -0.999623776321821420, -0.999625146481978310, -0.999626514143072460, -0.999627879305100220, -0.999629241968058360, +-0.999630602131943320, -0.999631959796751790, -0.999633314962480420, -0.999634667629125670, -0.999636017796684320, -0.999637365465152920, -0.999638710634528140, -0.999640053304806540, +-0.999641393475984800, -0.999642731148059570, -0.999644066321027540, -0.999645398994885250, -0.999646729169629600, -0.999648056845257040, -0.999649382021764450, -0.999650704699148300, +-0.999652024877405340, -0.999653342556532490, -0.999654657736526180, -0.999655970417383190, -0.999657280599100310, -0.999658588281674310, -0.999659893465101760, -0.999661196149379430, +-0.999662496334504210, -0.999663794020472670, -0.999665089207281700, -0.999666381894927960, -0.999667672083408340, -0.999668959772719520, -0.999670244962858280, -0.999671527653821390, +-0.999672807845605750, -0.999674085538208020, -0.999675360731625110, -0.999676633425853780, -0.999677903620890930, -0.999679171316733230, -0.999680436513377680, -0.999681699210820950, +-0.999682959409060050, -0.999684217108091740, -0.999685472307912940, -0.999686725008520400, -0.999687975209911040, -0.999689222912081730, -0.999690468115029370, -0.999691710818750860, +-0.999692951023243070, -0.999694188728502910, -0.999695423934527260, -0.999696656641313130, -0.999697886848857300, -0.999699114557156760, -0.999700339766208420, -0.999701562476009160, +-0.999702782686556100, -0.999704000397846020, -0.999705215609876020, -0.999706428322642890, -0.999707638536143750, -0.999708846250375480, -0.999710051465335090, -0.999711254181019580, +-0.999712454397425950, -0.999713652114551210, -0.999714847332392350, -0.999716040050946280, -0.999717230270210200, -0.999718417990181020, -0.999719603210855730, -0.999720785932231460, +-0.999721966154305310, -0.999723143877074170, -0.999724319100535160, -0.999725491824685400, -0.999726662049521870, -0.999727829775041710, -0.999728995001242020, -0.999730157728119790, +-0.999731317955672160, -0.999732475683896230, -0.999733630912789110, -0.999734783642347910, -0.999735933872569870, -0.999737081603451870, -0.999738226834991140, -0.999739369567184900, +-0.999740509800030260, -0.999741647533524350, -0.999742782767664260, -0.999743915502447230, -0.999745045737870490, -0.999746173473931020, -0.999747298710626180, -0.999748421447953170, +-0.999749541685909020, -0.999750659424490930, -0.999751774663696360, -0.999752887403522190, -0.999753997643965890, -0.999755105385024660, -0.999756210626695620, -0.999757313368976000, +-0.999758413611863130, -0.999759511355354240, -0.999760606599446540, -0.999761699344137390, -0.999762789589423880, -0.999763877335303470, -0.999764962581773390, -0.999766045328830840, +-0.999767125576473180, -0.999768203324697740, -0.999769278573501840, -0.999770351322882720, -0.999771421572837720, -0.999772489323364040, -0.999773554574459270, -0.999774617326120610, +-0.999775677578345400, -0.999776735331130980, -0.999777790584474690, -0.999778843338373970, -0.999779893592826150, -0.999780941347828580, -0.999781986603378580, -0.999783029359473720, +-0.999784069616111220, -0.999785107373288630, -0.999786142631003180, -0.999787175389252440, -0.999788205648033720, -0.999789233407344490, -0.999790258667182190, -0.999791281427544250, +-0.999792301688428140, -0.999793319449831190, -0.999794334711750940, -0.999795347474184970, -0.999796357737130600, -0.999797365500585290, -0.999798370764546580, -0.999799373529011940, +-0.999800373793978790, -0.999801371559444820, -0.999802366825407350, -0.999803359591864060, -0.999804349858812280, -0.999805337626249680, -0.999806322894173700, -0.999807305662581910, +-0.999808285931471860, -0.999809263700841110, -0.999810238970687220, -0.999811211741007730, -0.999812182011800220, -0.999813149783062240, -0.999814115054791340, -0.999815077826985200, +-0.999816038099641370, -0.999816995872757410, -0.999817951146330990, -0.999818903920359660, -0.999819854194841100, -0.999820801969772850, -0.999821747245152710, -0.999822690020978120, +-0.999823630297246750, -0.999824568073956370, -0.999825503351104650, -0.999826436128689040, -0.999827366406707440, -0.999828294185157400, -0.999829219464036580, -0.999830142243342770, +-0.999831062523073520, -0.999831980303226730, -0.999832895583799840, -0.999833808364790850, -0.999834718646197330, -0.999835626428016930, -0.999836531710247560, -0.999837434492886760, +-0.999838334775932420, -0.999839232559382230, -0.999840127843234060, -0.999841020627485480, -0.999841910912134260, -0.999842798697178400, -0.999843683982615470, -0.999844566768443350, +-0.999845447054659830, -0.999846324841262790, -0.999847200128249790, -0.999848072915618840, -0.999848943203367700, -0.999849810991494170, -0.999850676279996240, -0.999851539068871480, +-0.999852399358117980, -0.999853257147733430, -0.999854112437715710, -0.999854965228062720, -0.999855815518772340, -0.999856663309842460, -0.999857508601270870, -0.999858351393055460, +-0.999859191685194220, -0.999860029477685040, -0.999860864770525710, -0.999861697563714350, -0.999862527857248610, -0.999863355651126610, -0.999864180945346240, -0.999865003739905390, +-0.999865824034801950, -0.999866641830034040, -0.999867457125599550, -0.999868269921496360, -0.999869080217722580, -0.999869888014276010, -0.999870693311154750, -0.999871496108356790, +-0.999872296405880050, -0.999873094203722610, -0.999873889501882380, -0.999874682300357480, -0.999875472599145780, -0.999876260398245510, -0.999877045697654570, -0.999877828497370950, +-0.999878608797392760, -0.999879386597718130, -0.999880161898344940, -0.999880934699271420, -0.999881705000495560, -0.999882472802015480, -0.999883238103829060, -0.999884000905934660, +-0.999884761208330250, -0.999885519011013970, -0.999886274313983800, -0.999887027117238090, -0.999887777420774610, -0.999888525224591820, -0.999889270528687700, -0.999890013333060490, +-0.999890753637708070, -0.999891491442628900, -0.999892226747820970, -0.999892959553282390, -0.999893689859011500, -0.999894417665006420, -0.999895142971265140, -0.999895865777786110, +-0.999896586084567440, -0.999897303891607360, -0.999898019198903860, -0.999898732006455400, -0.999899442314260090, -0.999900150122316260, -0.999900855430621900, -0.999901558239175480, +-0.999902258547975210, -0.999902956357019200, -0.999903651666305900, -0.999904344475833430, -0.999905034785600110, -0.999905722595604170, -0.999906407905843950, -0.999907090716317670, +-0.999907771027023660, -0.999908448837960260, -0.999909124149125810, -0.999909796960518400, -0.999910467272136620, -0.999911135083978550, -0.999911800396042770, -0.999912463208327500, +-0.999913123520830950, -0.999913781333551690, -0.999914436646487940, -0.999915089459638030, -0.999915739773000520, -0.999916387586573530, -0.999917032900355720, -0.999917675714345200, +-0.999918316028540640, -0.999918953842940160, -0.999919589157542310, -0.999920221972345540, -0.999920852287348170, -0.999921480102548670, -0.999922105417945460, -0.999922728233537010, +-0.999923348549321740, -0.999923966365298120, -0.999924581681464590, -0.999925194497819580, -0.999925804814361550, -0.999926412631089060, -0.999927017948000540, -0.999927620765094450, +-0.999928221082369340, -0.999928818899823660, -0.999929414217455960, -0.999930007035264690, -0.999930597353248410, -0.999931185171405670, -0.999931770489734920, -0.999932353308234710, +-0.999932933626903720, -0.999933511445740280, -0.999934086764743160, -0.999934659583910810, -0.999935229903241800, -0.999935797722734660, -0.999936363042388090, -0.999936925862200620, +-0.999937486182170820, -0.999938044002297240, -0.999938599322578560, -0.999939152143013430, -0.999939702463600420, -0.999940250284338190, -0.999940795605225310, -0.999941338426260430, +-0.999941878747442230, -0.999942416568769250, -0.999942951890240290, -0.999943484711853900, -0.999944015033608860, -0.999944542855503830, -0.999945068177537370, -0.999945590999708260, +-0.999946111322015160, -0.999946629144456760, -0.999947144467031810, -0.999947657289739000, -0.999948167612577100, -0.999948675435544660, -0.999949180758640700, -0.999949683581863650, +-0.999950183905212400, -0.999950681728685730, -0.999951177052282420, -0.999951669876001040, -0.999952160199840570, -0.999952648023799680, -0.999953133347877170, -0.999953616172071790, +-0.999954096496382450, -0.999954574320807810, -0.999955049645346760, -0.999955522469998080, -0.999955992794760550, -0.999956460619633060, -0.999956925944614490, -0.999957388769703530, +-0.999957849094899150, -0.999958306920200050, -0.999958762245605310, -0.999959215071113520, -0.999959665396723870, -0.999960113222434940, -0.999960558548245730, -0.999961001374155110, +-0.999961441700162100, -0.999961879526265360, -0.999962314852464010, -0.999962747678756810, -0.999963178005142780, -0.999963605831620810, -0.999964031158189770, -0.999964453984848680, +-0.999964874311596530, -0.999965292138432100, -0.999965707465354400, -0.999966120292362540, -0.999966530619455400, -0.999966938446631870, -0.999967343773890960, -0.999967746601231780, +-0.999968146928653100, -0.999968544756154150, -0.999968940083733830, -0.999969332911391230, -0.999969723239125140, -0.999970111066934900, -0.999970496394819270, -0.999970879222777500, +-0.999971259550808460, -0.999971637378911260, -0.999972012707085020, -0.999972385535328740, -0.999972755863641430, -0.999973123692022290, -0.999973489020470340, -0.999973851848984690, +-0.999974212177564330, -0.999974570006208490, -0.999974925334916280, -0.999975278163686700, -0.999975628492518860, -0.999975976321412000, -0.999976321650365210, -0.999976664479377610, +-0.999977004808448420, -0.999977342637576650, -0.999977677966761510, -0.999978010796002240, -0.999978341125297930, -0.999978668954647710, -0.999978994284050790, -0.999979317113506520, +-0.999979637443013880, -0.999979955272572110, -0.999980270602180530, -0.999980583431838270, -0.999980893761544420, -0.999981201591298440, -0.999981506921099440, -0.999981809750946750, +-0.999982110080839480, -0.999982407910776860, -0.999982703240758330, -0.999982996070783000, -0.999983286400850100, -0.999983574230959070, -0.999983859561109130, -0.999984142391299510, +-0.999984422721529540, -0.999984700551798560, -0.999984975882105780, -0.999985248712450540, -0.999985519042832170, -0.999985786873250020, -0.999986052203703400, -0.999986315034191660, +-0.999986575364714140, -0.999986833195270150, -0.999987088525859160, -0.999987341356480370, -0.999987591687133250, -0.999987839517817110, -0.999988084848531520, -0.999988327679275590, +-0.999988568010048870, -0.999988805840850700, -0.999989041171680530, -0.999989274002537790, -0.999989504333421820, -0.999989732164332070, -0.999989957495268090, -0.999990180326229110, +-0.999990400657214780, -0.999990618488224350, -0.999990833819257460, -0.999991046650313460, -0.999991256981391800, -0.999991464812492010, -0.999991670143613560, -0.999991872974756000, +-0.999992073305918770, -0.999992271137101210, -0.999992466468303090, -0.999992659299523750, -0.999992849630762850, -0.999993037462019730, -0.999993222793294060, -0.999993405624585390, +-0.999993585955893050, -0.999993763787216830, -0.999993939118556270, -0.999994111949910840, -0.999994282281280070, -0.999994450112663640, -0.999994615444060990, -0.999994778275471900, +-0.999994938606895810, -0.999995096438332400, -0.999995251769781320, -0.999995404601242030, -0.999995554932714190, -0.999995702764197580, -0.999995848095691640, -0.999995990927196040, +-0.999996131258710560, -0.999996269090234650, -0.999996404421768180, -0.999996537253310610, -0.999996667584861720, -0.999996795416421170, -0.999996920747988630, -0.999997043579563760, +-0.999997163911146350, -0.999997281742736050, -0.999997397074332440, -0.999997509905935390, -0.999997620237544570, -0.999997728069159650, -0.999997833400780520, -0.999997936232406740, +-0.999998036564038070, -0.999998134395674420, -0.999998229727315340, -0.999998322558960710, -0.999998412890610310, -0.999998500722263820, -0.999998586053921110, -0.999998668885581980, +-0.999998749217246070, -0.999998827048913410, -0.999998902380583640, -0.999998975212256560, -0.999999045543932150, -0.999999113375609980, -0.999999178707290160, -0.999999241538972350, +-0.999999301870656440, -0.999999359702342220, -0.999999415034029670, -0.999999467865718580, -0.999999518197408730, -0.999999566029100230, -0.999999611360792740, -0.999999654192486150, +-0.999999694524180470, -0.999999732355875580, -0.999999767687571370, -0.999999800519267730, -0.999999830850964670, -0.999999858682661950, -0.999999884014359570, -0.999999906846057440, +-0.999999927177755650, -0.999999945009453990, -0.999999960341152460, -0.999999973172851050, -0.999999983504549660, -0.999999991336248390, -0.999999996667947140, -0.999999999499645800, +-0.999999999831344580, -0.999999997663043260, -0.999999992994741960, -0.999999985826440780, -0.999999976158139510, -0.999999963989838370, -0.999999949321537350, -0.999999932153236350, +-0.999999912484935580, -0.999999890316635050, -0.999999865648334760, -0.999999838480034820, -0.999999808811735340, -0.999999776643436310, -0.999999741975137750, -0.999999704806839970, +-0.999999665138542880, -0.999999622970246580, -0.999999578301951190, -0.999999531133656920, -0.999999481465363880, -0.999999429297072080, -0.999999374628781630, -0.999999317460492860, +-0.999999257792205780, -0.999999195623920480, -0.999999130955637310, -0.999999063787356150, -0.999998994119077440, -0.999998921950801200, -0.999998847282527750, -0.999998770114257090, +-0.999998690445989550, -0.999998608277725240, -0.999998523609464510, -0.999998436441207340, -0.999998346772954180, -0.999998254604705040, -0.999998159936460350, -0.999998062768220230, +-0.999997963099985010, -0.999997860931754800, -0.999997756263530050, -0.999997649095310860, -0.999997539427097460, -0.999997427258890290, -0.999997312590689580, -0.999997195422495540, +-0.999997075754308520, -0.999996953586128830, -0.999996828917956710, -0.999996701749792600, -0.999996572081636610, -0.999996439913489300, -0.999996305245350880, -0.999996168077221690, +-0.999996028409102070, -0.999995886240992340, -0.999995741572892950, -0.999995594404804120, -0.999995444736726410, -0.999995292568660040, -0.999995137900605460, -0.999994980732562990, +-0.999994821064533080, -0.999994658896516180, -0.999994494228512610, -0.999994327060522830, -0.999994157392547160, -0.999993985224586160, -0.999993810556640160, -0.999993633388709610, +-0.999993453720794960, -0.999993271552896750, -0.999993086885015310, -0.999992899717151220, -0.999992710049304790, -0.999992517881476690, -0.999992323213667270, -0.999992126045876950, +-0.999991926378106410, -0.999991724210355980, -0.999991519542626330, -0.999991312374917780, -0.999991102707231020, -0.999990890539566470, -0.999990675871924810, -0.999990458704306360, +-0.999990239036711690, -0.999990016869141570, -0.999989792201596340, -0.999989565034076540, -0.999989335366582970, -0.999989103199116050, -0.999988868531676230, -0.999988631364264410, +-0.999988391696880920, -0.999988149529526530, -0.999987904862201680, -0.999987657694907050, -0.999987408027643300, -0.999987155860411090, -0.999986901193210990, -0.999986644026043540, +-0.999986384358909630, -0.999986122191809600, -0.999985857524744340, -0.999985590357714500, -0.999985320690720550, -0.999985048523763350, -0.999984773856843590, -0.999984496689961920, +-0.999984217023118900, -0.999983934856315430, -0.999983650189552040, -0.999983363022829530, -0.999983073356148670, -0.999982781189510120, -0.999982486522914550, -0.999982189356362850, +-0.999981889689855570, -0.999981587523393720, -0.999981282856977740, -0.999980975690608620, -0.999980666024287150, -0.999980353858013870, -0.999980039191789790, -0.999979722025615580, +-0.999979402359492120, -0.999979080193420080, -0.999978755527400340, -0.999978428361433800, -0.999978098695521120, -0.999977766529663190, -0.999977431863860900, -0.999977094698115020, +-0.999976755032426330, -0.999976412866795840, -0.999976068201224310, -0.999975721035712530, -0.999975371370261490, -0.999975019204872080, -0.999974664539545090, -0.999974307374281390, +-0.999973947709081880, -0.999973585543947660, -0.999973220878879410, -0.999972853713878010, -0.999972484048944570, -0.999972111884079970, -0.999971737219285010, -0.999971360054560670, +-0.999970980389908060, -0.999970598225327860, -0.999970213560821270, -0.999969826396389090, -0.999969436732032310, -0.999969044567752040, -0.999968649903549060, -0.999968252739424580, +-0.999967853075379390, -0.999967450911414590, -0.999967046247531080, -0.999966639083730070, -0.999966229420012340, -0.999965817256379120, -0.999965402592831400, -0.999964985429370070, +-0.999964565765996350, -0.999964143602711240, -0.999963718939515630, -0.999963291776410860, -0.999962862113397800, -0.999962429950477680, -0.999961995287651400, -0.999961558124920160, +-0.999961118462284970, -0.999960676299747050, -0.999960231637307410, -0.999959784474967140, -0.999959334812727470, -0.999958882650589410, -0.999958427988554280, -0.999957970826622970, +-0.999957511164796700, -0.999957049003076690, -0.999956584341464170, -0.999956117179960020, -0.999955647518565690, -0.999955175357282180, -0.999954700696110810, -0.999954223535052590, +-0.999953743874108850, -0.999953261713280810, -0.999952777052569460, -0.999952289891976380, -0.999951800231502430, -0.999951308071148960, -0.999950813410917290, -0.999950316250808660, +-0.999949816590824050, -0.999949314430965020, -0.999948809771232680, -0.999948302611628370, -0.999947792952153300, -0.999947280792808700, -0.999946766133595900, -0.999946248974516120, +-0.999945729315570800, -0.999945207156761160, -0.999944682498088430, -0.999944155339554160, -0.999943625681159350, -0.999943093522905560, -0.999942558864794000, -0.999942021706826000, +-0.999941482049003020, -0.999940939891326260, -0.999940395233797190, -0.999939848076417110, -0.999939298419187490, -0.999938746262109550, -0.999938191605184710, -0.999937634448414550, +-0.999937074791800160, -0.999936512635343110, -0.999935947979044840, -0.999935380822906560, -0.999934811166929950, -0.999934239011116330, -0.999933664355467040, -0.999933087199983640, +-0.999932507544667450, -0.999931925389520030, -0.999931340734542820, -0.999930753579737260, -0.999930163925104810, -0.999929571770646900, -0.999928977116365190, -0.999928379962260920, +-0.999927780308335730, -0.999927178154591090, -0.999926573501028540, -0.999925966347649520, -0.999925356694455590, -0.999924744541448310, -0.999924129888629110, -0.999923512735999550, +-0.999922893083561300, -0.999922270931315800, -0.999921646279264610, -0.999921019127409270, -0.999920389475751350, -0.999919757324292610, -0.999919122673034290, -0.999918485521978260, +-0.999917845871126090, -0.999917203720479210, -0.999916559070039290, -0.999915911919808110, -0.999915262269787000, -0.999914610119977840, -0.999913955470382090, -0.999913298321001510, +-0.999912638671837660, -0.999911976522892210, -0.999911311874166820, -0.999910644725663160, -0.999909975077382880, -0.999909302929327670, -0.999908628281499180, -0.999907951133899080, +-0.999907271486529140, -0.999906589339391030, -0.999905904692486520, -0.999905217545817180, -0.999904527899384780, -0.999903835753191080, -0.999903141107237770, -0.999902443961526610, +-0.999901744316059380, -0.999901042170837750, -0.999900337525863600, -0.999899630381138490, -0.999898920736664310, -0.999898208592442940, -0.999897493948475930, -0.999896776804765300, +-0.999896057161312690, -0.999895335018119890, -0.999894610375188790, -0.999893883232521150, -0.999893153590118770, -0.999892421447983510, -0.999891686806117290, -0.999890949664521740, +-0.999890210023198890, -0.999889467882150500, -0.999888723241378450, -0.999887976100884530, -0.999887226460670740, -0.999886474320738850, -0.999885719681090860, -0.999884962541728430, +-0.999884202902653670, -0.999883440763868370, -0.999882676125374510, -0.999881908987174000, -0.999881139349268590, -0.999880367211660400, -0.999879592574351330, -0.999878815437343250, +-0.999878035800638170, -0.999877253664237850, -0.999876469028144530, -0.999875681892360090, -0.999874892256886310, -0.999874100121725400, -0.999873305486879140, -0.999872508352349750, +-0.999871708718139020, -0.999870906584248930, -0.999870101950681710, -0.999869294817439140, -0.999868485184523430, -0.999867673051936470, -0.999866858419680260, -0.999866041287757020, +-0.999865221656168530, -0.999864399524917120, -0.999863574894004680, -0.999862747763433200, -0.999861918133205020, -0.999861086003321910, -0.999860251373786200, -0.999859414244599790, +-0.999858574615764770, -0.999857732487283490, -0.999856887859157720, -0.999856040731389780, -0.999855191103981800, -0.999854338976935760, -0.999853484350254010, -0.999852627223938420, +-0.999851767597991210, -0.999850905472414730, -0.999850040847210960, -0.999849173722382020, -0.999848304097930130, -0.999847431973857610, -0.999846557350166370, -0.999845680226858820, +-0.999844800603937100, -0.999843918481403300, -0.999843033859259660, -0.999842146737508490, -0.999841257116152020, -0.999840364995192350, -0.999839470374631830, -0.999838573254472560, +-0.999837673634716870, -0.999836771515366980, -0.999835866896425230, -0.999834959777893720, -0.999834050159774890, -0.999833138042070860, -0.999832223424784060, -0.999831306307916610, +-0.999830386691470950, -0.999829464575449410, -0.999828539959854100, -0.999827612844687460, -0.999826683229951830, -0.999825751115649420, -0.999824816501782680, -0.999823879388353930, +-0.999822939775365400, -0.999821997662819540, -0.999821053050718780, -0.999820105939065340, -0.999819156327861560, -0.999818204217109980, -0.999817249606812840, -0.999816292496972570, +-0.999815332887591610, -0.999814370778672300, -0.999813406170217080, -0.999812439062228280, -0.999811469454708450, -0.999810497347659920, -0.999809522741085140, -0.999808545634986560, +-0.999807566029366710, -0.999806583924227830, -0.999805599319572470, -0.999804612215403180, -0.999803622611722400, -0.999802630508532460, -0.999801635905836040, -0.999800638803635460, +-0.999799639201933270, -0.999798637100732020, -0.999797632500034170, -0.999796625399842260, -0.999795615800158740, -0.999794603700986270, -0.999793589102327180, -0.999792572004184250, +-0.999791552406559810, -0.999790530309456420, -0.999789505712876840, -0.999788478616823410, -0.999787449021298790, -0.999786416926305650, -0.999785382331846330, -0.999784345237923590, +-0.999783305644539990, -0.999782263551698190, -0.999781218959400640, -0.999780171867650110, -0.999779122276449160, -0.999778070185800340, -0.999777015595706420, -0.999775958506169850, +-0.999774898917193510, -0.999773836828779850, -0.999772772240931640, -0.999771705153651440, -0.999770635566942010, -0.999769563480806030, -0.999768488895246050, -0.999767411810264960, +-0.999766332225865310, -0.999765250142049760, -0.999764165558821080, -0.999763078476182070, -0.999761988894135370, -0.999760896812683650, -0.999759802231829700, -0.999758705151576280, +-0.999757605571926060, -0.999756503492881810, -0.999755398914446310, -0.999754291836622340, -0.999753182259412570, -0.999752070182819860, -0.999750955606847010, -0.999749838531496790, +-0.999748718956771980, -0.999747596882675340, -0.999746472309209770, -0.999745345236377920, -0.999744215664182810, -0.999743083592627090, -0.999741949021713650, -0.999740811951445370, +-0.999739672381825040, -0.999738530312855640, -0.999737385744539740, -0.999736238676880550, -0.999735089109880630, -0.999733937043542960, -0.999732782477870560, -0.999731625412866200, +-0.999730465848532760, -0.999729303784873120, -0.999728139221890190, -0.999726972159586950, -0.999725802597966280, -0.999724630537031200, -0.999723455976784470, -0.999722278917229090, +-0.999721099358367950, -0.999719917300204150, -0.999718732742740480, -0.999717545685980040, -0.999716356129925710, -0.999715164074580500, -0.999713969519947400, -0.999712772466029410, +-0.999711572912829420, -0.999710370860350530, -0.999709166308595740, -0.999707959257567950, -0.999706749707270360, -0.999705537657705870, -0.999704323108877470, -0.999703106060788270, +-0.999701886513441380, -0.999700664466839690, -0.999699439920986420, -0.999698212875884560, -0.999696983331537110, -0.999695751287947190, -0.999694516745117890, -0.999693279703052330, +-0.999692040161753610, -0.999690798121224740, -0.999689553581468940, -0.999688306542489190, -0.999687057004288620, -0.999685804966870540, -0.999684550430237850, -0.999683293394393770, +-0.999682033859341510, -0.999680771825084190, -0.999679507291624910, -0.999678240258966900, -0.999676970727113260, -0.999675698696067090, -0.999674424165831850, -0.999673147136410420, +-0.999671867607806240, -0.999670585580022310, -0.999669301053061950, -0.999668014026928290, -0.999666724501624640, -0.999665432477154110, -0.999664137953520050, -0.999662840930725660, +-0.999661541408774170, -0.999660239387668790, -0.999658934867412860, -0.999657627848009600, -0.999656318329462220, -0.999655006311774060, -0.999653691794948340, -0.999652374778988500, +-0.999651055263897640, -0.999649733249679210, -0.999648408736336310, -0.999647081723872510, -0.999645752212291020, -0.999644420201595050, -0.999643085691788170, -0.999641748682873480, +-0.999640409174854420, -0.999639067167734320, -0.999637722661516630, -0.999636375656204560, -0.999635026151801550, -0.999633674148311060, -0.999632319645736290, -0.999630962644080800, +-0.999629603143347810, -0.999628241143540870, -0.999626876644663320, -0.999625509646718590, -0.999624140149710130, -0.999622768153641260, -0.999621393658515430, -0.999620016664336200, +-0.999618637171106880, -0.999617255178831040, -0.999615870687512010, -0.999614483697153220, -0.999613094207758350, -0.999611702219330710, -0.999610307731873760, -0.999608910745391040, +-0.999607511259886120, -0.999606109275362420, -0.999604704791823400, -0.999603297809272600, -0.999601888327713680, -0.999600476347149880, -0.999599061867584960, -0.999597644889022360, +-0.999596225411465760, -0.999594803434918470, -0.999593378959384160, -0.999591951984866500, -0.999590522511368930, -0.999589090538895000, -0.999587656067448370, -0.999586219097032710, +-0.999584779627651350, -0.999583337659308070, -0.999581893192006520, -0.999580446225750150, -0.999578996760542740, -0.999577544796387830, -0.999576090333288980, -0.999574633371249970, +-0.999573173910274450, -0.999571711950365870, -0.999570247491528010, -0.999568780533764630, -0.999567311077079190, -0.999565839121475560, -0.999564364666957310, -0.999562887713528080, +-0.999561408261191780, -0.999559926309951830, -0.999558441859812130, -0.999556954910776230, -0.999555465462848130, -0.999553973516031150, -0.999552479070329400, -0.999550982125746330, +-0.999549482682285940, -0.999547980739951770, -0.999546476298747600, -0.999544969358677320, -0.999543459919744580, -0.999541947981953170, -0.999540433545306860, -0.999538916609809540, +-0.999537397175464970, -0.999535875242276830, -0.999534350810248990, -0.999532823879385360, -0.999531294449689580, -0.999529762521165650, -0.999528228093817250, -0.999526691167648250, +-0.999525151742662540, -0.999523609818864010, -0.999522065396256430, -0.999520518474843690, -0.999518969054629670, -0.999517417135618150, -0.999515862717813120, -0.999514305801218470, +-0.999512746385838090, -0.999511184471675750, -0.999509620058735560, -0.999508053147021180, -0.999506483736536830, -0.999504911827286180, -0.999503337419273220, -0.999501760512501950, +-0.999500181106976250, -0.999498599202700120, -0.999497014799677560, -0.999495427897912350, -0.999493838497408690, -0.999492246598170380, -0.999490652200201390, -0.999489055303505850, +-0.999487455908087630, -0.999485854013950850, -0.999484249621099270, -0.999482642729537240, -0.999481033339268520, -0.999479421450297220, -0.999477807062627340, -0.999476190176262990, +-0.999474570791208160, -0.999472948907466960, -0.999471324525043280, -0.999469697643941330, -0.999468068264165120, -0.999466436385718750, -0.999464802008606320, -0.999463165132831950, +-0.999461525758399530, -0.999459883885313370, -0.999458239513577480, -0.999456592643195970, -0.999454943274173060, -0.999453291406512730, -0.999451637040219110, -0.999449980175296520, +-0.999448320811748840, -0.999446658949580510, -0.999444994588795430, -0.999443327729397920, -0.999441658371392090, -0.999439986514782050, -0.999438312159572130, -0.999436635305766430, +-0.999434955953369060, -0.999433274102384360, -0.999431589752816430, -0.999429902904669600, -0.999428213557947980, -0.999426521712655780, -0.999424827368797340, -0.999423130526376770, +-0.999421431185398390, -0.999419729345866430, -0.999418025007785200, -0.999416318171158840, -0.999414608835991760, -0.999412897002288080, -0.999411182670052240, -0.999409465839288360, +-0.999407746510000860, -0.999406024682193970, -0.999404300355872130, -0.999402573531039450, -0.999400844207700260, -0.999399112385859100, -0.999397378065520090, -0.999395641246687560, +-0.999393901929366060, -0.999392160113559800, -0.999390415799273010, -0.999388668986510350, -0.999386919675275930, -0.999385167865574190, -0.999383413557409560, -0.999381656750786380, +-0.999379897445709100, -0.999378135642182030, -0.999376371340209620, -0.999374604539796320, -0.999372835240946440, -0.999371063443664550, -0.999369289147954980, -0.999367512353822150, +-0.999365733061270630, -0.999363951270304750, -0.999362166980928950, -0.999360380193147770, -0.999358590906965550, -0.999356799122386950, -0.999355004839416310, -0.999353208058058160, +-0.999351408778316960, -0.999349607000197260, -0.999347802723703600, -0.999345995948840440, -0.999344186675612200, -0.999342374904023560, -0.999340560634078940, -0.999338743865782920, +-0.999336924599140140, -0.999335102834154940, -0.999333278570831980, -0.999331451809175930, -0.999329622549191110, -0.999327790790882410, -0.999325956534254050, -0.999324119779310900, +-0.999322280526057430, -0.999320438774498280, -0.999318594524638000, -0.999316747776481270, -0.999314898530032520, -0.999313046785296750, -0.999311192542278180, -0.999309335800981800, +-0.999307476561411940, -0.999305614823573500, -0.999303750587470900, -0.999301883853109030, -0.999300014620492450, -0.999298142889625710, -0.999296268660513690, -0.999294391933161050, +-0.999292512707572360, -0.999290630983752480, -0.999288746761705980, -0.999286860041437520, -0.999284970822951980, -0.999283079106254020, -0.999281184891348430, -0.999279288178239740, +-0.999277388966932970, -0.999275487257432650, -0.999273583049743560, -0.999271676343870600, -0.999269767139818410, -0.999267855437591780, -0.999265941237195590, -0.999264024538634500, +-0.999262105341913400, -0.999260183647036950, -0.999258259454010030, -0.999256332762837540, -0.999254403573524240, -0.999252471886074910, -0.999250537700494320, -0.999248601016787470, +-0.999246661834959140, -0.999244720155014090, -0.999242775976957210, -0.999240829300793500, -0.999238880126527620, -0.999236928454164560, -0.999234974283709220, -0.999233017615166360, +-0.999231058448540990, -0.999229096783837980, -0.999227132621062330, -0.999225165960218710, -0.999223196801312220, -0.999221225144347750, -0.999219250989330290, -0.999217274336264620, +-0.999215295185155730, -0.999213313536008730, -0.999211329388828280, -0.999209342743619610, -0.999207353600387590, -0.999205361959137120, -0.999203367819873290, -0.999201371182601110, +-0.999199372047325340, -0.999197370414051210, -0.999195366282783710, -0.999193359653527740, -0.999191350526288380, -0.999189338901070760, -0.999187324777879640, -0.999185308156720240, +-0.999183289037597680, -0.999181267420516720, -0.999179243305482690, -0.999177216692500590, -0.999175187581575310, -0.999173155972712170, -0.999171121865916170, -0.999169085261192300, +-0.999167046158545680, -0.999165004557981520, -0.999162960459504810, -0.999160913863120780, -0.999158864768834420, -0.999156813176650840, -0.999154759086575250, -0.999152702498612880, +-0.999150643412768600, -0.999148581829047750, -0.999146517747455440, -0.999144451167996880, -0.999142382090677180, -0.999140310515501560, -0.999138236442475130, -0.999136159871603090, +-0.999134080802890680, -0.999131999236342990, -0.999129915171965370, -0.999127828609763010, -0.999125739549741040, -0.999123647991904670, -0.999121553936259230, -0.999119457382809940, +-0.999117358331561900, -0.999115256782520560, -0.999113152735691010, -0.999111046191078600, -0.999108937148688650, -0.999106825608526260, -0.999104711570596770, -0.999102595034905620, +-0.999100476001457900, -0.999098354470259080, -0.999096230441314350, -0.999094103914628940, -0.999091974890208400, -0.999089843368057840, -0.999087709348182700, -0.999085572830588300, +-0.999083433815279980, -0.999081292302263060, -0.999079148291542870, -0.999077001783124860, -0.999074852777014350, -0.999072701273216680, -0.999070547271737270, -0.999068390772581470, +-0.999066231775754710, -0.999064070281262430, -0.999061906289109850, -0.999059739799302630, -0.999057570811845990, -0.999055399326745470, -0.999053225344006420, -0.999051048863634270, +-0.999048869885634460, -0.999046688410012650, -0.999044504436773950, -0.999042317965924130, -0.999040128997468410, -0.999037937531412350, -0.999035743567761480, -0.999033547106521370, +-0.999031348147697230, -0.999029146691294830, -0.999026942737319510, -0.999024736285776820, -0.999022527336672290, -0.999020315890011500, -0.999018101945799870, -0.999015885504042970, +-0.999013666564746440, -0.999011445127915620, -0.999009221193556280, -0.999006994761673870, -0.999004765832273930, -0.999002534405362130, -0.999000300480944010, -0.998998064059025140, +-0.998995825139611050, -0.998993583722707410, -0.998991339808319890, -0.998989093396453920, -0.998986844487115280, -0.998984593080309510, -0.998982339176042180, -0.998980082774319160, +-0.998977823875145780, -0.998975562478527920, -0.998973298584471150, -0.998971032192981110, -0.998968763304063590, -0.998966491917724020, -0.998964218033968290, -0.998961941652802050, +-0.998959662774230870, -0.998957381398260620, -0.998955097524896860, -0.998952811154145360, -0.998950522286011890, -0.998948230920502000, -0.998945937057621580, -0.998943640697376400, +-0.998941341839772010, -0.998939040484814410, -0.998936736632509040, -0.998934430282861880, -0.998932121435878730, -0.998929810091565230, -0.998927496249927160, -0.998925179910970410, +-0.998922861074700630, -0.998920539741123830, -0.998918215910245540, -0.998915889582071780, -0.998913560756608310, -0.998911229433860900, -0.998908895613835450, -0.998906559296537710, +-0.998904220481973580, -0.998901879170148940, -0.998899535361069570, -0.998897189054741340, -0.998894840251170260, -0.998892488950361980, -0.998890135152322500, -0.998887778857057710, +-0.998885420064573370, -0.998883058774875600, -0.998880694987970160, -0.998878328703862950, -0.998875959922559840, -0.998873588644066950, -0.998871214868390030, -0.998868838595535210, +-0.998866459825508150, -0.998864078558314940, -0.998861694793961590, -0.998859308532453970, -0.998856919773798090, -0.998854528517999940, -0.998852134765065400, -0.998849738515000580, +-0.998847339767811480, -0.998844938523503870, -0.998842534782084070, -0.998840128543557750, -0.998837719807931230, -0.998835308575210410, -0.998832894845401390, -0.998830478618510040, +-0.998828059894542490, -0.998825638673504710, -0.998823214955402940, -0.998820788740243160, -0.998818360028031370, -0.998815928818773680, -0.998813495112476190, -0.998811058909145010, +-0.998808620208786140, -0.998806179011405670, -0.998803735317009720, -0.998801289125604510, -0.998798840437196020, -0.998796389251790480, -0.998793935569394000, -0.998791479390012670, +-0.998789020713652500, -0.998786559540319920, -0.998784095870020930, -0.998781629702761740, -0.998779161038548360, -0.998776689877387210, -0.998774216219284190, -0.998771740064245740, +-0.998769261412277950, -0.998766780263386830, -0.998764296617578930, -0.998761810474860230, -0.998759321835237080, -0.998756830698715570, -0.998754337065302030, -0.998751840935002470, +-0.998749342307823530, -0.998746841183771110, -0.998744337562851640, -0.998741831445071340, -0.998739322830436430, -0.998736811718953230, -0.998734298110627970, -0.998731782005466970, +-0.998729263403476450, -0.998726742304662850, -0.998724218709032390, -0.998721692616591380, -0.998719164027346170, -0.998716632941303080, -0.998714099358468330, -0.998711563278848360, +-0.998709024702449490, -0.998706483629278050, -0.998703940059340380, -0.998701393992642910, -0.998698845429191850, -0.998696294368993760, -0.998693740812054980, -0.998691184758381810, +-0.998688626207980600, -0.998686065160857890, -0.998683501617020020, -0.998680935576473420, -0.998678367039224410, -0.998675796005279450, -0.998673222474645180, -0.998670646447327730, +-0.998668067923333620, -0.998665486902669430, -0.998662903385341580, -0.998660317371356410, -0.998657728860720350, -0.998655137853440070, -0.998652544349521890, -0.998649948348972360, +-0.998647349851798040, -0.998644748858005250, -0.998642145367600650, -0.998639539380590690, -0.998636930896981800, -0.998634319916780640, -0.998631706439993660, -0.998629090466627510, +-0.998626471996688530, -0.998623851030183360, -0.998621227567118690, -0.998618601607500820, -0.998615973151336540, -0.998613342198632290, -0.998610708749394620, -0.998608072803630180, +-0.998605434361345630, -0.998602793422547430, -0.998600149987242340, -0.998597504055436790, -0.998594855627137570, -0.998592204702351110, -0.998589551281084180, -0.998586895363343440, +-0.998584236949135340, -0.998581576038466760, -0.998578912631344240, -0.998576246727774340, -0.998573578327763830, -0.998570907431319490, -0.998568234038447740, -0.998565558149155490, +-0.998562879763449370, -0.998560198881335960, -0.998557515502822120, -0.998554829627914420, -0.998552141256619730, -0.998549450388944710, -0.998546757024896040, -0.998544061164480360, +-0.998541362807704670, -0.998538661954575520, -0.998535958605099690, -0.998533252759284060, -0.998530544417135180, -0.998527833578660040, -0.998525120243865190, -0.998522404412757640, +-0.998519686085344140, -0.998516965261631250, -0.998514241941626080, -0.998511516125335290, -0.998508787812765640, -0.998506057003924030, -0.998503323698817340, -0.998500587897452330, +-0.998497849599835900, -0.998495108805974700, -0.998492365515875830, -0.998489619729546090, -0.998486871446992220, -0.998484120668221120, -0.998481367393239780, -0.998478611622055090, +-0.998475853354673810, -0.998473092591102840, -0.998470329331349270, -0.998467563575419770, -0.998464795323321440, -0.998462024575061060, -0.998459251330645610, -0.998456475590082100, +-0.998453697353377410, -0.998450916620538420, -0.998448133391572120, -0.998445347666485520, -0.998442559445285480, -0.998439768727979130, -0.998436975514573330, -0.998434179805075210, +-0.998431381599491520, -0.998428580897829270, -0.998425777700095770, -0.998422972006297700, -0.998420163816442270, -0.998417353130536370, -0.998414539948587200, -0.998411724270601540, +-0.998408906096586720, -0.998406085426549520, -0.998403262260497140, -0.998400436598436580, -0.998397608440374950, -0.998394777786319240, -0.998391944636276670, -0.998389108990254240, +-0.998386270848258930, -0.998383430210298070, -0.998380587076378560, -0.998377741446507700, -0.998374893320692400, -0.998372042698939870, -0.998369189581257200, -0.998366333967651620, +-0.998363475858130120, -0.998360615252699920, -0.998357752151368350, -0.998354886554142280, -0.998352018461028940, -0.998349147872035660, -0.998346274787169530, -0.998343399206437550, +-0.998340521129847280, -0.998337640557405590, -0.998334757489119820, -0.998331871924997170, -0.998328983865044760, -0.998326093309270020, -0.998323200257679950, -0.998320304710281990, +-0.998317406667083130, -0.998314506128090810, -0.998311603093312240, -0.998308697562754640, -0.998305789536425350, -0.998302879014331570, -0.998299965996480520, -0.998297050482879530, +-0.998294132473536040, -0.998291211968457160, -0.998288288967650320, -0.998285363471122620, -0.998282435478881620, -0.998279504990934540, -0.998276572007288700, -0.998273636527951310, +-0.998270698552929940, -0.998267758082231780, -0.998264815115864290, -0.998261869653834680, -0.998258921696150380, -0.998255971242818840, -0.998253018293847380, -0.998250062849243340, +-0.998247104909014140, -0.998244144473167230, -0.998241181541709930, -0.998238216114649690, -0.998235248191993830, -0.998232277773749900, -0.998229304859925340, -0.998226329450527360, +-0.998223351545563740, -0.998220371145041700, -0.998217388248968660, -0.998214402857352190, -0.998211414970199720, -0.998208424587518680, -0.998205431709316530, -0.998202436335600910, +-0.998199438466379150, -0.998196438101658810, -0.998193435241447440, -0.998190429885752350, -0.998187422034581330, -0.998184411687941700, -0.998181398845840890, -0.998178383508286800, +-0.998175365675286640, -0.998172345346848070, -0.998169322522978630, -0.998166297203685990, -0.998163269388977480, -0.998160239078860760, -0.998157206273343590, -0.998154170972433310, +-0.998151133176137680, -0.998148092884464160, -0.998145050097420490, -0.998142004815014030, -0.998138957037252750, -0.998135906764143990, -0.998132853995695400, -0.998129798731914760, +-0.998126740972809510, -0.998123680718387530, -0.998120617968656370, -0.998117552723623570, -0.998114484983296910, -0.998111414747684060, -0.998108342016792660, -0.998105266790630390, +-0.998102189069205000, -0.998099108852524180, -0.998096026140595450, -0.998092940933426710, -0.998089853231025730, -0.998086763033399940, -0.998083670340557340, -0.998080575152505590, +-0.998077477469252350, -0.998074377290805390, -0.998071274617172600, -0.998068169448361520, -0.998065061784380040, -0.998061951625235920, -0.998058838970936950, -0.998055723821490770, +-0.998052606176905390, -0.998049486037188460, -0.998046363402347870, -0.998043238272391280, -0.998040110647326560, -0.998036980527161720, -0.998033847911904300, -0.998030712801562410, +-0.998027575196143600, -0.998024435095655860, -0.998021292500107070, -0.998018147409505010, -0.998014999823857660, -0.998011849743172810, -0.998008697167458210, -0.998005542096721990, +-0.998002384530971900, -0.997999224470215830, -0.997996061914461660, -0.997992896863717390, -0.997989729317990790, -0.997986559277289960, -0.997983386741622790, -0.997980211710997040, +-0.997977034185420830, -0.997973854164901920, -0.997970671649448420, -0.997967486639068310, -0.997964299133769490, -0.997961109133559840, -0.997957916638447460, -0.997954721648440350, +-0.997951524163546380, -0.997948324183773550, -0.997945121709129970, -0.997941916739623510, -0.997938709275262400, -0.997935499316054410, -0.997932286862007740, -0.997929071913130290, +-0.997925854469430160, -0.997922634530915450, -0.997919412097594050, -0.997916187169474280, -0.997912959746563910, -0.997909729828871160, -0.997906497416404140, -0.997903262509170830, +-0.997900025107179460, -0.997896785210437900, -0.997893542818954370, -0.997890297932737090, -0.997887050551794050, -0.997883800676133360, -0.997880548305763120, -0.997877293440691650, +-0.997874036080926730, -0.997870776226476910, -0.997867513877350070, -0.997864249033554420, -0.997860981695098180, -0.997857711861989460, -0.997854439534236580, -0.997851164711847430, +-0.997847887394830550, -0.997844607583193710, -0.997841325276945580, -0.997838040476094030, -0.997834753180647400, -0.997831463390613900, -0.997828171106001750, -0.997824876326819040, +-0.997821579053074340, -0.997818279284775620, -0.997814977021931120, -0.997811672264549250, -0.997808365012638250, -0.997805055266206330, -0.997801743025261700, -0.997798428289812690, +-0.997795111059867620, -0.997791791335434830, -0.997788469116522530, -0.997785144403139150, -0.997781817195292800, -0.997778487492991920, -0.997775155296244830, -0.997771820605059870, +-0.997768483419445350, -0.997765143739409610, -0.997761801564961080, -0.997758456896107980, -0.997755109732858750, -0.997751760075221710, -0.997748407923205290, -0.997745053276817950, +-0.997741696136067780, -0.997738336500963550, -0.997734974371513370, -0.997731609747725790, -0.997728242629609240, -0.997724873017171940, -0.997721500910422550, -0.997718126309369510, +-0.997714749214021030, -0.997711369624385670, -0.997707987540471960, -0.997704602962288250, -0.997701215889843060, -0.997697826323144850, -0.997694434262201950, -0.997691039707023000, +-0.997687642657616560, -0.997684243113990950, -0.997680841076154730, -0.997677436544116340, -0.997674029517884420, -0.997670619997467420, -0.997667207982873890, -0.997663793474112380, +-0.997660376471191320, -0.997656956974119270, -0.997653534982904990, -0.997650110497556700, -0.997646683518083280, -0.997643254044493060, -0.997639822076794690, -0.997636387614996840, +-0.997632950659107950, -0.997629511209136790, -0.997626069265091790, -0.997622624826981610, -0.997619177894814800, -0.997615728468600140, -0.997612276548346060, -0.997608822134061430, +-0.997605365225754710, -0.997601905823434550, -0.997598443927109610, -0.997594979536788550, -0.997591512652480030, -0.997588043274192700, -0.997584571401935350, -0.997581097035716620, +-0.997577620175545080, -0.997574140821429480, -0.997570658973378490, -0.997567174631400880, -0.997563687795505310, -0.997560198465700650, -0.997556706641995360, -0.997553212324398420, +-0.997549715512918380, -0.997546216207564010, -0.997542714408344190, -0.997539210115267470, -0.997535703328342850, -0.997532194047578870, -0.997528682272984410, -0.997525168004568360, +-0.997521651242339270, -0.997518131986306120, -0.997514610236477580, -0.997511085992862530, -0.997507559255469740, -0.997504030024308210, -0.997500498299386470, -0.997496964080713530, +-0.997493427368298160, -0.997489888162149230, -0.997486346462275520, -0.997482802268686020, -0.997479255581389500, -0.997475706400394850, -0.997472154725710820, -0.997468600557346540, +-0.997465043895310770, -0.997461484739612380, -0.997457923090260160, -0.997454358947263200, -0.997450792310630390, -0.997447223180370490, -0.997443651556492620, -0.997440077439005650, +-0.997436500827918460, -0.997432921723240050, -0.997429340124979300, -0.997425756033145090, -0.997422169447746640, -0.997418580368792720, -0.997414988796292310, -0.997411394730254530, +-0.997407798170688140, -0.997404199117602250, -0.997400597571005960, -0.997396993530908160, -0.997393386997317940, -0.997389777970244080, -0.997386166449695910, -0.997382552435682300, +-0.997378935928212360, -0.997375316927294970, -0.997371695432939240, -0.997368071445154380, -0.997364444963949380, -0.997360815989333240, -0.997357184521315050, -0.997353550559903820, +-0.997349914105108760, -0.997346275156938970, -0.997342633715403440, -0.997338989780511390, -0.997335343352271810, -0.997331694430693920, -0.997328043015786700, -0.997324389107559490, +-0.997320732706021170, -0.997317073811181180, -0.997313412423048270, -0.997309748541632010, -0.997306082166941390, -0.997302413298985500, -0.997298741937773680, -0.997295068083314810, +-0.997291391735618430, -0.997287712894693530, -0.997284031560549340, -0.997280347733195070, -0.997276661412639930, -0.997272972598893250, -0.997269281291964020, -0.997265587491861560, +-0.997261891198595210, -0.997258192412174060, -0.997254491132607450, -0.997250787359904690, -0.997247081094074890, -0.997243372335127390, -0.997239661083071490, -0.997235947337916320, +-0.997232231099671410, -0.997228512368345870, -0.997224791143949130, -0.997221067426490300, -0.997217341215978940, -0.997213612512424130, -0.997209881315835320, -0.997206147626221840, +-0.997202411443592780, -0.997198672767957930, -0.997194931599326260, -0.997191187937707340, -0.997187441783110470, -0.997183693135545000, -0.997179941995020140, -0.997176188361545650, +-0.997172432235130520, -0.997168673615784430, -0.997164912503516580, -0.997161148898336510, -0.997157382800253460, -0.997153614209277060, -0.997149843125416660, -0.997146069548681460, +-0.997142293479081230, -0.997138514916625200, -0.997134733861323010, -0.997130950313183880, -0.997127164272217370, -0.997123375738432900, -0.997119584711840150, -0.997115791192448310, +-0.997111995180267050, -0.997108196675305810, -0.997104395677574030, -0.997100592187081360, -0.997096786203837130, -0.997092977727850990, -0.997089166759132390, -0.997085353297690770, +-0.997081537343535770, -0.997077718896677070, -0.997073897957123980, -0.997070074524886160, -0.997066248599973170, -0.997062420182394550, -0.997058589272159850, -0.997054755869278720, +-0.997050919973760720, -0.997047081585615390, -0.997043240704852400, -0.997039397331481280, -0.997035551465511590, -0.997031703106953100, -0.997027852255815360, -0.997023998912107910, +-0.997020143075840530, -0.997016284747022860, -0.997012423925664360, -0.997008560611774900, -0.997004694805363910, -0.997000826506441280, -0.996996955715016560, -0.996993082431099410, +-0.996989206654699590, -0.996985328385826760, -0.996981447624490700, -0.996977564370700950, -0.996973678624467290, -0.996969790385799250, -0.996965899654706940, -0.996962006431199920, +-0.996958110715287730, -0.996954212506980350, -0.996950311806287460, -0.996946408613218700, -0.996942502927783970, -0.996938594749993020, -0.996934684079855530, -0.996930770917381360, +-0.996926855262580290, -0.996922937115462090, -0.996919016476036530, -0.996915093344313390, -0.996911167720302530, -0.996907239604013730, -0.996903308995456870, -0.996899375894641730, +-0.996895440301578170, -0.996891502216275980, -0.996887561638744920, -0.996883618568995100, -0.996879673007036280, -0.996875724952878130, -0.996871774406530850, -0.996867821368004000, +-0.996863865837307680, -0.996859907814451660, -0.996855947299445820, -0.996851984292300150, -0.996848018793024430, -0.996844050801628740, -0.996840080318122990, -0.996836107342517040, +-0.996832131874820780, -0.996828153915044090, -0.996824173463197070, -0.996820190519289720, -0.996816205083331800, -0.996812217155333410, -0.996808226735304450, -0.996804233823255000, +-0.996800238419194850, -0.996796240523134200, -0.996792240135082940, -0.996788237255050950, -0.996784231883048430, -0.996780224019085390, -0.996776213663171820, -0.996772200815317590, +-0.996768185475532920, -0.996764167643827800, -0.996760147320212230, -0.996756124504696310, -0.996752099197290130, -0.996748071398003700, -0.996744041106847000, -0.996740008323830250, +-0.996735973048963550, -0.996731935282256790, -0.996727895023720280, -0.996723852273363910, -0.996719807031198110, -0.996715759297232660, -0.996711709071477880, -0.996707656353943760, +-0.996703601144640410, -0.996699543443578250, -0.996695483250767180, -0.996691420566217290, -0.996687355389939020, -0.996683287721942260, -0.996679217562237320, -0.996675144910834310, +-0.996671069767743440, -0.996666992132974830, -0.996662912006538890, -0.996658829388445520, -0.996654744278705150, -0.996650656677328000, -0.996646566584324160, -0.996642473999703740, +-0.996638378923477290, -0.996634281355654910, -0.996630181296246810, -0.996626078745263210, -0.996621973702714440, -0.996617866168610700, -0.996613756142962330, -0.996609643625779640, +-0.996605528617072740, -0.996601411116851970, -0.996597291125127850, -0.996593168641910390, -0.996589043667210020, -0.996584916201037060, -0.996580786243401740, -0.996576653794314480, +-0.996572518853785620, -0.996568381421825470, -0.996564241498444360, -0.996560099083652620, -0.996555954177460680, -0.996551806779878870, -0.996547656890917510, -0.996543504510587040, +-0.996539349638897680, -0.996535192275860070, -0.996531032421484440, -0.996526870075781220, -0.996522705238760850, -0.996518537910433650, -0.996514368090810180, -0.996510195779900850, +-0.996506020977715900, -0.996501843684265980, -0.996497663899561400, -0.996493481623612730, -0.996489296856430400, -0.996485109598024720, -0.996480919848406250, -0.996476727607585430, +-0.996472532875572910, -0.996468335652379020, -0.996464135938014310, -0.996459933732489310, -0.996455729035814470, -0.996451521848000120, -0.996447312169057130, -0.996443099998995830, +-0.996438885337826760, -0.996434668185560590, -0.996430448542207640, -0.996426226407778560, -0.996422001782284020, -0.996417774665734330, -0.996413545058140280, -0.996409312959512410, +-0.996405078369861140, -0.996400841289197260, -0.996396601717531310, -0.996392359654873830, -0.996388115101235370, -0.996383868056626600, -0.996379618521058270, -0.996375366494540950, +-0.996371111977085060, -0.996366854968701480, -0.996362595469400760, -0.996358333479193560, -0.996354068998090540, -0.996349802026102350, -0.996345532563239540, -0.996341260609512890, +-0.996336986164933270, -0.996332709229511120, -0.996328429803257090, -0.996324147886182070, -0.996319863478296600, -0.996315576579611560, -0.996311287190137620, -0.996306995309885420, +-0.996302700938865750, -0.996298404077089250, -0.996294104724566810, -0.996289802881309080, -0.996285498547326840, -0.996281191722630850, -0.996276882407231890, -0.996272570601140720, +-0.996268256304368220, -0.996263939516924930, -0.996259620238821860, -0.996255298470069660, -0.996250974210679320, -0.996246647460661490, -0.996242318220027180, -0.996237986488786920, +-0.996233652266951710, -0.996229315554532420, -0.996224976351539840, -0.996220634657984830, -0.996216290473878160, -0.996211943799230730, -0.996207594634053620, -0.996203242978357380, +-0.996198888832153130, -0.996194532195451510, -0.996190173068263630, -0.996185811450600370, -0.996181447342472600, -0.996177080743891110, -0.996172711654866980, -0.996168340075411110, +-0.996163966005534360, -0.996159589445247630, -0.996155210394562010, -0.996150828853488270, -0.996146444822037510, -0.996142058300220620, -0.996137669288048700, -0.996133277785532510, +-0.996128883792683160, -0.996124487309511530, -0.996120088336028720, -0.996115686872245720, -0.996111282918173410, -0.996106876473823010, -0.996102467539205390, -0.996098056114331550, +-0.996093642199212700, -0.996089225793859610, -0.996084806898283490, -0.996080385512495340, -0.996075961636506250, -0.996071535270327210, -0.996067106413969450, -0.996062675067443840, +-0.996058241230761480, -0.996053804903933580, -0.996049366086971260, -0.996044924779885380, -0.996040480982687270, -0.996036034695388040, -0.996031585917998560, -0.996027134650530170, +-0.996022680892994060, -0.996018224645401130, -0.996013765907762580, -0.996009304680089640, -0.996004840962393500, -0.996000374754685280, -0.995995906056976080, -0.995991434869277100, +-0.995986961191599570, -0.995982485023954590, -0.995978006366353470, -0.995973525218807330, -0.995969041581327370, -0.995964555453924700, -0.995960066836610760, -0.995955575729396640, +-0.995951082132293550, -0.995946586045312720, -0.995942087468465460, -0.995937586401763000, -0.995933082845216640, -0.995928576798837510, -0.995924068262636910, -0.995919557236626060, +-0.995915043720816410, -0.995910527715219150, -0.995906009219845620, -0.995901488234707030, -0.995896964759814710, -0.995892438795179970, -0.995887910340814140, -0.995883379396728550, +-0.995878845962934520, -0.995874310039443380, -0.995869771626266440, -0.995865230723415040, -0.995860687330900610, -0.995856141448734470, -0.995851593076927940, -0.995847042215492360, +-0.995842488864439270, -0.995837933023779990, -0.995833374693525840, -0.995828813873688270, -0.995824250564278700, -0.995819684765308470, -0.995815116476789000, -0.995810545698731620, +-0.995805972431148100, -0.995801396674049540, -0.995796818427447490, -0.995792237691353390, -0.995787654465778770, -0.995783068750734860, -0.995778480546233410, -0.995773889852285770, +-0.995769296668903350, -0.995764700996097710, -0.995760102833880280, -0.995755502182262610, -0.995750899041256240, -0.995746293410872620, -0.995741685291123170, -0.995737074682019550, +-0.995732461583573200, -0.995727845995795780, -0.995723227918698830, -0.995718607352293670, -0.995713984296591970, -0.995709358751605380, -0.995704730717345330, -0.995700100193823490, +-0.995695467181051510, -0.995690831679040710, -0.995686193687802870, -0.995681553207349630, -0.995676910237692450, -0.995672264778842960, -0.995667616830812730, -0.995662966393613620, +-0.995658313467257080, -0.995653658051754650, -0.995649000147118210, -0.995644339753359200, -0.995639676870489270, -0.995635011498520180, -0.995630343637463610, -0.995625673287331200, +-0.995621000448134620, -0.995616325119885510, -0.995611647302595550, -0.995606966996276490, -0.995602284200939990, -0.995597598916597830, -0.995592911143261650, -0.995588220880943230, +-0.995583528129654230, -0.995578832889406410, -0.995574135160211430, -0.995569434942081170, -0.995564732235027280, -0.995560027039061660, -0.995555319354195940, -0.995550609180441910, +-0.995545896517811450, -0.995541181366316090, -0.995536463725967940, -0.995531743596778540, -0.995527020978759670, -0.995522295871923310, -0.995517568276281350, -0.995512838191845330, +-0.995508105618627350, -0.995503370556638960, -0.995498633005892140, -0.995493892966398790, -0.995489150438170770, -0.995484405421219850, -0.995479657915557930, -0.995474907921196750, +-0.995470155438148430, -0.995465400466424730, -0.995460643006037430, -0.995455883056998610, -0.995451120619319950, -0.995446355693013540, -0.995441588278091260, -0.995436818374565100, +-0.995432045982446830, -0.995427271101748330, -0.995422493732481820, -0.995417713874658940, -0.995412931528291910, -0.995408146693392500, -0.995403359369972710, -0.995398569558044510, +-0.995393777257619910, -0.995388982468710880, -0.995384185191329430, -0.995379385425487430, -0.995374583171196980, -0.995369778428470080, -0.995364971197318820, -0.995360161477754970, +-0.995355349269790860, -0.995350534573438250, -0.995345717388709360, -0.995340897715616290, -0.995336075554170810, -0.995331250904385230, -0.995326423766271560, -0.995321594139841780, +-0.995316762025107990, -0.995311927422082410, -0.995307090330776800, -0.995302250751203600, -0.995297408683374800, -0.995292564127302380, -0.995287717082998680, -0.995282867550475570, +-0.995278015529745260, -0.995273161020819970, -0.995268304023711800, -0.995263444538432960, -0.995258582564995440, -0.995253718103411460, -0.995248851153693100, -0.995243981715852710, +-0.995239109789902380, -0.995234235375854090, -0.995229358473720400, -0.995224479083513300, -0.995219597205245000, -0.995214712838927600, -0.995209825984573530, -0.995204936642194780, +-0.995200044811803800, -0.995195150493412670, -0.995190253687033730, -0.995185354392679080, -0.995180452610361140, -0.995175548340091920, -0.995170641581883950, -0.995165732335749340, +-0.995160820601700410, -0.995155906379749270, -0.995150989669908560, -0.995146070472190280, -0.995141148786606980, -0.995136224613170640, -0.995131297951893700, -0.995126368802788600, +-0.995121437165867650, -0.995116503041143070, -0.995111566428627190, -0.995106627328332440, -0.995101685740271020, -0.995096741664455500, -0.995091795100898070, -0.995086846049611170, +-0.995081894510607130, -0.995076940483898390, -0.995071983969497250, -0.995067024967416280, -0.995062063477667680, -0.995057099500263890, -0.995052133035217220, -0.995047164082540350, +-0.995042192642245580, -0.995037218714345360, -0.995032242298852120, -0.995027263395778180, -0.995022282005136200, -0.995017298126938400, -0.995012311761197420, -0.995007322907925480, +-0.995002331567135470, -0.994997337738839470, -0.994992341423050260, -0.994987342619780170, -0.994982341329041730, -0.994977337550847270, -0.994972331285209570, -0.994967322532141150, +-0.994962311291654360, -0.994957297563761720, -0.994952281348475910, -0.994947262645809350, -0.994942241455774700, -0.994937217778384400, -0.994932191613650980, -0.994927162961587230, +-0.994922131822205460, -0.994917098195518430, -0.994912062081538710, -0.994907023480278710, -0.994901982391751090, -0.994896938815968750, -0.994891892752943870, -0.994886844202689360, +-0.994881793165217740, -0.994876739640541570, -0.994871683628673620, -0.994866625129626430, -0.994861564143412650, -0.994856500670045050, -0.994851434709536080, -0.994846366261898600, +-0.994841295327145160, -0.994836221905288530, -0.994831145996341370, -0.994826067600316110, -0.994820986717225960, -0.994815903347083250, -0.994810817489900740, -0.994805729145691320, +-0.994800638314467410, -0.994795544996242010, -0.994790449191027770, -0.994785350898837350, -0.994780250119683630, -0.994775146853579150, -0.994770041100536790, -0.994764932860569440, +-0.994759822133689740, -0.994754708919910470, -0.994749593219244500, -0.994744475031704380, -0.994739354357303210, -0.994734231196053640, -0.994729105547968450, -0.994723977413060510, +-0.994718846791342590, -0.994713713682827680, -0.994708578087528440, -0.994703440005457630, -0.994698299436628240, -0.994693156381053270, -0.994688010838745250, -0.994682862809717290, +-0.994677712293982160, -0.994672559291552740, -0.994667403802441790, -0.994662245826662520, -0.994657085364227590, -0.994651922415149990, -0.994646756979442490, -0.994641589057118190, +-0.994636418648189860, -0.994631245752670480, -0.994626070370572930, -0.994620892501910210, -0.994615712146695310, -0.994610529304941200, -0.994605343976660670, -0.994600156161866920, +-0.994594965860572610, -0.994589773072790840, -0.994584577798534820, -0.994579380037817320, -0.994574179790651320, -0.994568977057049940, -0.994563771837026040, -0.994558564130592740, +-0.994553353937763010, -0.994548141258549960, -0.994542926092966460, -0.994537708441025630, -0.994532488302740660, -0.994527265678124330, -0.994522040567189960, -0.994516812969950430, +-0.994511582886418830, -0.994506350316608280, -0.994501115260531980, -0.994495877718202800, -0.994490637689633970, -0.994485395174838470, -0.994480150173829510, -0.994474902686620200, +-0.994469652713223630, -0.994464400253652900, -0.994459145307921120, -0.994453887876041610, -0.994448627958027350, -0.994443365553891460, -0.994438100663647240, -0.994432833287307690, +-0.994427563424886030, -0.994422291076395460, -0.994417016241849310, -0.994411738921260450, -0.994406459114642320, -0.994401176822008130, -0.994395892043370870, -0.994390604778743970, +-0.994385315028140540, -0.994380022791573670, -0.994374728069056910, -0.994369430860603250, -0.994364131166226020, -0.994358828985938530, -0.994353524319753990, -0.994348217167685510, +-0.994342907529746520, -0.994337595405950350, -0.994332280796310090, -0.994326963700839170, -0.994321644119550930, -0.994316322052458460, -0.994310997499575300, -0.994305670460914560, +-0.994300340936489560, -0.994295008926313840, -0.994289674430400510, -0.994284337448763100, -0.994278997981414840, -0.994273656028369040, -0.994268311589639020, -0.994262964665238340, +-0.994257615255180190, -0.994252263359478030, -0.994246908978145160, -0.994241552111195140, -0.994236192758641170, -0.994230830920496690, -0.994225466596775130, -0.994220099787490040, +-0.994214730492654410, -0.994209358712282220, -0.994203984446386580, -0.994198607694980920, -0.994193228458078780, -0.994187846735693490, -0.994182462527838600, -0.994177075834527630, +-0.994171686655773930, -0.994166294991591150, -0.994160900841992490, -0.994155504206991610, -0.994150105086601950, -0.994144703480837060, -0.994139299389710460, -0.994133892813235390, +-0.994128483751425820, -0.994123072204294970, -0.994117658171856380, -0.994112241654123710, -0.994106822651110500, -0.994101401162830080, -0.994095977189296210, -0.994090550730522440, +-0.994085121786522310, -0.994079690357309360, -0.994074256442897150, -0.994068820043299330, -0.994063381158529440, -0.994057939788601130, -0.994052495933527850, -0.994047049593323460, +-0.994041600768001410, -0.994036149457575350, -0.994030695662058930, -0.994025239381465810, -0.994019780615809530, -0.994014319365103760, -0.994008855629362250, -0.994003389408598670, +-0.993997920702826550, -0.993992449512059670, -0.993986975836311680, -0.993981499675596130, -0.993976021029926990, -0.993970539899317610, -0.993965056283781960, -0.993959570183333700, +-0.993954081597986480, -0.993948590527754080, -0.993943096972650260, -0.993937600932688570, -0.993932102407882990, -0.993926601398247070, -0.993921097903794680, -0.993915591924539600, +-0.993910083460495470, -0.993904572511676190, -0.993899059078095500, -0.993893543159767080, -0.993888024756704900, -0.993882503868922520, -0.993876980496433910, -0.993871454639252970, +-0.993865926297393340, -0.993860395470868910, -0.993854862159693320, -0.993849326363880680, -0.993843788083444760, -0.993838247318399430, -0.993832704068758450, -0.993827158334535610, +-0.993821610115744990, -0.993816059412400370, -0.993810506224515500, -0.993804950552104380, -0.993799392395180780, -0.993793831753758910, -0.993788268627852300, -0.993782703017475180, +-0.993777134922641190, -0.993771564343364440, -0.993765991279658590, -0.993760415731537950, -0.993754837699016180, -0.993749257182107380, -0.993743674180825430, -0.993738088695184320, +-0.993732500725197920, -0.993726910270880340, -0.993721317332245450, -0.993715721909307130, -0.993710124002079700, -0.993704523610576820, -0.993698920734812810, -0.993693315374801320, +-0.993687707530556690, -0.993682097202092550, -0.993676484389423350, -0.993670869092562970, -0.993665251311525390, -0.993659631046324710, -0.993654008296974920, -0.993648383063490130, +-0.993642755345884310, -0.993637125144171680, -0.993631492458366130, -0.993625857288481850, -0.993620219634533060, -0.993614579496533650, -0.993608936874497810, -0.993603291768439640, +-0.993597644178373150, -0.993591994104312650, -0.993586341546272120, -0.993580686504265790, -0.993575028978307630, -0.993569368968411970, -0.993563706474592910, -0.993558041496864660, +-0.993552374035241210, -0.993546704089736780, -0.993541031660365560, -0.993535356747141880, -0.993529679350079740, -0.993523999469193450, -0.993518317104497120, -0.993512632256004950, +-0.993506944923731260, -0.993501255107690270, -0.993495562807896080, -0.993489868024363010, -0.993484170757105270, -0.993478471006137180, -0.993472768771472730, -0.993467064053126460, +-0.993461356851112590, -0.993455647165445210, -0.993449934996138760, -0.993444220343207450, -0.993438503206665600, -0.993432783586527530, -0.993427061482807350, -0.993421336895519700, +-0.993415609824678690, -0.993409880270298640, -0.993404148232393870, -0.993398413710978700, -0.993392676706067570, -0.993386937217674680, -0.993381195245814470, -0.993375450790501270, +-0.993369703851749390, -0.993363954429573370, -0.993358202523987430, -0.993352448135005890, -0.993346691262643300, -0.993340931906914080, -0.993335170067832340, -0.993329405745412730, +-0.993323638939669680, -0.993317869650617520, -0.993312097878270570, -0.993306323622643480, -0.993300546883750690, -0.993294767661606400, -0.993288985956225170, -0.993283201767621420, +-0.993277415095809800, -0.993271625940804540, -0.993265834302620390, -0.993260040181271450, -0.993254243576772500, -0.993248444489137850, -0.993242642918382270, -0.993236838864519970, +-0.993231032327565600, -0.993225223307533710, -0.993219411804438620, -0.993213597818295100, -0.993207781349117580, -0.993201962396920600, -0.993196140961718600, -0.993190317043526450, +-0.993184490642358360, -0.993178661758229110, -0.993172830391153230, -0.993166996541145260, -0.993161160208219650, -0.993155321392391270, -0.993149480093674650, -0.993143636312084240, +-0.993137790047634810, -0.993131941300340880, -0.993126090070217020, -0.993120236357278090, -0.993114380161538410, -0.993108521483012870, -0.993102660321715900, -0.993096796677662370, +-0.993090930550866950, -0.993085061941344050, -0.993079190849108560, -0.993073317274175030, -0.993067441216558320, -0.993061562676272880, -0.993055681653333690, -0.993049798147755180, +-0.993043912159552230, -0.993038023688739500, -0.993032132735331640, -0.993026239299343530, -0.993020343380789820, -0.993014444979685160, -0.993008544096044440, -0.993002640729882420, +-0.992996734881213760, -0.992990826550053220, -0.992984915736415670, -0.992979002440315780, -0.992973086661768420, -0.992967168400788360, -0.992961247657390360, -0.992955324431589180, +-0.992949398723399820, -0.992943470532836820, -0.992937539859915290, -0.992931606704649860, -0.992925671067055320, -0.992919732947146640, -0.992913792344938710, -0.992907849260446280, +-0.992901903693684140, -0.992895955644667370, -0.992890005113410520, -0.992884052099928800, -0.992878096604236870, -0.992872138626349820, -0.992866178166282420, -0.992860215224049440, +-0.992854249799666080, -0.992848281893147000, -0.992842311504507300, -0.992836338633761640, -0.992830363280925220, -0.992824385446012920, -0.992818405129039740, -0.992812422330020430, +-0.992806437048970090, -0.992800449285903610, -0.992794459040836070, -0.992788466313782370, -0.992782471104757480, -0.992776473413776510, -0.992770473240854320, -0.992764470586005920, +-0.992758465449246400, -0.992752457830590630, -0.992746447730053720, -0.992740435147650650, -0.992734420083396520, -0.992728402537306430, -0.992722382509395260, -0.992716359999678220, +-0.992710335008170070, -0.992704307534886250, -0.992698277579841750, -0.992692245143051430, -0.992686210224530520, -0.992680172824294100, -0.992674132942357180, -0.992668090578735060, +-0.992662045733442630, -0.992655998406495100, -0.992649948597907450, -0.992643896307695120, -0.992637841535872980, -0.992631784282456240, -0.992625724547460010, -0.992619662330899490, +-0.992613597632789670, -0.992607530453146090, -0.992601460791983640, -0.992595388649317400, -0.992589314025162820, -0.992583236919534980, -0.992577157332449000, -0.992571075263920080, +-0.992564990713963540, -0.992558903682594360, -0.992552814169828100, -0.992546722175679740, -0.992540627700164600, -0.992534530743297890, -0.992528431305094830, -0.992522329385570610, +-0.992516224984740680, -0.992510118102620240, -0.992504008739224400, -0.992497896894568580, -0.992491782568668100, -0.992485665761538070, -0.992479546473193920, -0.992473424703650850, +-0.992467300452924190, -0.992461173721029270, -0.992455044507981500, -0.992448912813796100, -0.992442778638488400, -0.992436641982073820, -0.992430502844567460, -0.992424361225984990, +-0.992418217126341600, -0.992412070545652720, -0.992405921483933580, -0.992399769941199720, -0.992393615917466330, -0.992387459412748970, -0.992381300427062960, -0.992375138960423620, +-0.992368975012846490, -0.992362808584346890, -0.992356639674940370, -0.992350468284642130, -0.992344294413467830, -0.992338118061432570, -0.992331939228552230, -0.992325757914842010, +-0.992319574120317460, -0.992313387844993900, -0.992307199088886870, -0.992301007852011810, -0.992294814134384250, -0.992288617936019750, -0.992282419256933610, -0.992276218097141280, +-0.992270014456658630, -0.992263808335500870, -0.992257599733683660, -0.992251388651222310, -0.992245175088132590, -0.992238959044429820, -0.992232740520129770, -0.992226519515247870, +-0.992220296029799660, -0.992214070063800690, -0.992207841617266610, -0.992201610690212840, -0.992195377282655060, -0.992189141394608900, -0.992182903026089690, -0.992176662177113420, +-0.992170418847695410, -0.992164173037851430, -0.992157924747596900, -0.992151673976947700, -0.992145420725919160, -0.992139164994527150, -0.992132906782787210, -0.992126646090715100, +-0.992120382918326270, -0.992114117265636590, -0.992107849132661480, -0.992101578519416830, -0.992095305425918280, -0.992089029852181280, -0.992082751798221810, -0.992076471264055510, +-0.992070188249697950, -0.992063902755164980, -0.992057614780472270, -0.992051324325635480, -0.992045031390670350, -0.992038735975592670, -0.992032438080418190, -0.992026137705162680, +-0.992019834849841690, -0.992013529514471190, -0.992007221699066850, -0.992000911403644440, -0.991994598628219810, -0.991988283372808530, -0.991981965637426690, -0.991975645422089820, +-0.991969322726813930, -0.991962997551614770, -0.991956669896507990, -0.991950339761509590, -0.991944007146635330, -0.991937672051901090, -0.991931334477322730, -0.991924994422915930, +-0.991918651888696770, -0.991912306874680790, -0.991905959380884220, -0.991899609407322690, -0.991893256954011980, -0.991886902020968300, -0.991880544608207400, -0.991874184715745070, +-0.991867822343597270, -0.991861457491779900, -0.991855090160308820, -0.991848720349200130, -0.991842348058469600, -0.991835973288133330, -0.991829596038206970, -0.991823216308706730, +-0.991816834099648380, -0.991810449411047900, -0.991804062242921390, -0.991797672595284620, -0.991791280468153680, -0.991784885861544670, -0.991778488775473370, -0.991772089209955850, +-0.991765687165008130, -0.991759282640646060, -0.991752875636885860, -0.991746466153743510, -0.991740054191235010, -0.991733639749376340, -0.991727222828183600, -0.991720803427672880, +-0.991714381547860070, -0.991707957188761260, -0.991701530350392550, -0.991695101032770030, -0.991688669235909810, -0.991682234959827880, -0.991675798204540440, -0.991669358970063360, +-0.991662917256412870, -0.991656473063605270, -0.991650026391656340, -0.991643577240582500, -0.991637125610399630, -0.991630671501123940, -0.991624214912771530, -0.991617755845358610, +-0.991611294298901380, -0.991604830273415840, -0.991598363768918190, -0.991591894785424640, -0.991585423322951410, -0.991578949381514580, -0.991572472961130380, -0.991565994061815000, +-0.991559512683584670, -0.991553028826455460, -0.991546542490443830, -0.991540053675565750, -0.991533562381837650, -0.991527068609275530, -0.991520572357895810, -0.991514073627714600, +-0.991507572418748210, -0.991501068731012740, -0.991494562564524840, -0.991488053919300390, -0.991481542795355940, -0.991475029192707580, -0.991468513111371630, -0.991461994551364300, +-0.991455473512702020, -0.991448949995401230, -0.991442423999477910, -0.991435895524948600, -0.991429364571829510, -0.991422831140137070, -0.991416295229887500, -0.991409756841097220, +-0.991403215973782450, -0.991396672627959720, -0.991390126803645240, -0.991383578500855570, -0.991377027719606900, -0.991370474459915660, -0.991363918721798190, -0.991357360505270900, +-0.991350799810350350, -0.991344236637052730, -0.991337670985394490, -0.991331102855392170, -0.991324532247061960, -0.991317959160420540, -0.991311383595484100, -0.991304805552269190, +-0.991298225030792350, -0.991291642031070010, -0.991285056553118490, -0.991278468596954340, -0.991271878162593990, -0.991265285250053860, -0.991258689859350620, -0.991252091990500680, +-0.991245491643520490, -0.991238888818426590, -0.991232283515235510, -0.991225675733963700, -0.991219065474627570, -0.991212452737243900, -0.991205837521829110, -0.991199219828399540, +-0.991192599656972150, -0.991185977007563170, -0.991179351880189240, -0.991172724274867020, -0.991166094191612720, -0.991159461630443440, -0.991152826591375490, -0.991146189074425420, +-0.991139549079609880, -0.991132906606945530, -0.991126261656448790, -0.991119614228136550, -0.991112964322025220, -0.991106311938131480, -0.991099657076471740, -0.991092999737063110, +-0.991086339919921900, -0.991079677625064880, -0.991073012852508710, -0.991066345602269920, -0.991059675874365160, -0.991053003668811440, -0.991046328985625060, -0.991039651824823010, +-0.991032972186421720, -0.991026290070437970, -0.991019605476888610, -0.991012918405790200, -0.991006228857159390, -0.990999536831013050, -0.990992842327367840, -0.990986145346240630, +-0.990979445887647970, -0.990972743951606840, -0.990966039538133670, -0.990959332647245450, -0.990952623278958940, -0.990945911433290800, -0.990939197110258020, -0.990932480309877130, +-0.990925761032165120, -0.990919039277138650, -0.990912315044814700, -0.990905588335209810, -0.990898859148340860, -0.990892127484224950, -0.990885393342878730, -0.990878656724318960, +-0.990871917628562530, -0.990865176055626410, -0.990858432005527150, -0.990851685478281950, -0.990844936473907590, -0.990838184992420820, -0.990831431033838640, -0.990824674598177800, +-0.990817915685455300, -0.990811154295688000, -0.990804390428892900, -0.990797624085086760, -0.990790855264286450, -0.990784083966509190, -0.990777310191771620, -0.990770533940090850, +-0.990763755211483630, -0.990756974005966960, -0.990750190323558040, -0.990743404164273640, -0.990736615528130640, -0.990729824415146120, -0.990723030825337080, -0.990716234758720500, +-0.990709436215313270, -0.990702635195132460, -0.990695831698195080, -0.990689025724518000, -0.990682217274118430, -0.990675406347013450, -0.990668592943219850, -0.990661777062754710, +-0.990654958705635250, -0.990648137871878220, -0.990641314561500950, -0.990634488774520430, -0.990627660510953630, -0.990620829770817780, -0.990613996554129740, -0.990607160860906830, +-0.990600322691165940, -0.990593482044924260, -0.990586638922198670, -0.990579793323006720, -0.990572945247365280, -0.990566094695291440, -0.990559241666802310, -0.990552386161915210, +-0.990545528180646890, -0.990538667723015020, -0.990531804789036350, -0.990524939378728210, -0.990518071492107690, -0.990511201129192110, -0.990504328289998460, -0.990497452974543950, +-0.990490575182845780, -0.990483694914921160, -0.990476812170787310, -0.990469926950461540, -0.990463039253960840, -0.990456149081302640, -0.990449256432504030, -0.990442361307582120, +-0.990435463706554550, -0.990428563629438210, -0.990421661076250510, -0.990414756047008570, -0.990407848541729810, -0.990400938560431430, -0.990394026103130760, -0.990387111169845010, +-0.990380193760591390, -0.990373273875387210, -0.990366351514250010, -0.990359426677196900, -0.990352499364245190, -0.990345569575412310, -0.990338637310715250, -0.990331702570171890, +-0.990324765353799100, -0.990317825661614530, -0.990310883493635390, -0.990303938849879000, -0.990296991730362790, -0.990290042135104080, -0.990283090064120190, -0.990276135517428660, +-0.990269178495046700, -0.990262218996991850, -0.990255257023281430, -0.990248292573932990, -0.990241325648963720, -0.990234356248391180, -0.990227384372232570, -0.990220410020505650, +-0.990213433193227740, -0.990206453890416280, -0.990199472112088590, -0.990192487858262300, -0.990185501128954650, -0.990178511924183380, -0.990171520243965820, -0.990164526088319290, +-0.990157529457261650, -0.990150530350810130, -0.990143528768982260, -0.990136524711795580, -0.990129518179267640, -0.990122509171415750, -0.990115497688257680, -0.990108483729810860, +-0.990101467296092940, -0.990094448387121240, -0.990087427002913410, -0.990080403143487110, -0.990073376808859760, -0.990066347999048910, -0.990059316714072100, -0.990052282953947200, +-0.990045246718691540, -0.990038208008322760, -0.990031166822858410, -0.990024123162316250, -0.990017077026713600, -0.990010028416068330, -0.990002977330398100, -0.989995923769720340, +-0.989988867734052810, -0.989981809223413060, -0.989974748237818840, -0.989967684777287690, -0.989960618841837390, -0.989953550431485580, -0.989946479546249700, -0.989939406186147730, +-0.989932330351197320, -0.989925252041416020, -0.989918171256821690, -0.989911087997431660, -0.989904002263264140, -0.989896914054336550, -0.989889823370666780, -0.989882730212272350, +-0.989875634579171160, -0.989868536471380840, -0.989861435888919170, -0.989854332831803910, -0.989847227300052810, -0.989840119293683540, -0.989833008812714190, -0.989825895857162190, +-0.989818780427045520, -0.989811662522381840, -0.989804542143188910, -0.989797419289484730, -0.989790293961287040, -0.989783166158613610, -0.989776035881482220, -0.989768903129910840, +-0.989761767903917120, -0.989754630203518950, -0.989747490028734300, -0.989740347379580830, -0.989733202256076420, -0.989726054658239150, -0.989718904586086690, -0.989711752039637020, +-0.989704597018908010, -0.989697439523917420, -0.989690279554683140, -0.989683117111223250, -0.989675952193555640, -0.989668784801698060, -0.989661614935668620, -0.989654442595485070, +-0.989647267781165410, -0.989640090492727610, -0.989632910730189550, -0.989625728493569110, -0.989618543782884500, -0.989611356598153470, -0.989604166939394130, -0.989596974806624340, +-0.989589780199862100, -0.989582583119125280, -0.989575383564432200, -0.989568181535800620, -0.989560977033248520, -0.989553770056794010, -0.989546560606455070, -0.989539348682249800, +-0.989532134284196060, -0.989524917412312080, -0.989517698066615830, -0.989510476247125070, -0.989503251953858350, -0.989496025186833440, -0.989488795946068530, -0.989481564231581620, +-0.989474330043390580, -0.989467093381513950, -0.989459854245969490, -0.989452612636775530, -0.989445368553949930, -0.989438121997510910, -0.989430872967476670, -0.989423621463865200, +-0.989416367486694700, -0.989409111035983170, -0.989401852111748800, -0.989394590714010040, -0.989387326842784630, -0.989380060498091020, -0.989372791679947180, -0.989365520388371330, +-0.989358246623381790, -0.989350970384996530, -0.989343691673233990, -0.989336410488112160, -0.989329126829649240, -0.989321840697863550, -0.989314552092773300, -0.989307261014396590, +-0.989299967462751730, -0.989292671437856930, -0.989285372939730510, -0.989278071968390680, -0.989270768523855650, -0.989263462606143620, -0.989256154215273020, -0.989248843351261950, +-0.989241530014128840, -0.989234214203891900, -0.989226895920569450, -0.989219575164179800, -0.989212251934741160, -0.989204926232271850, -0.989197598056790310, -0.989190267408314730, +-0.989182934286863320, -0.989175598692454750, -0.989168260625107210, -0.989160920084839020, -0.989153577071668510, -0.989146231585613990, -0.989138883626693890, -0.989131533194926640, +-0.989124180290330450, -0.989116824912923960, -0.989109467062725400, -0.989102106739753070, -0.989094743944025520, -0.989087378675561180, -0.989080010934378360, -0.989072640720495390, +-0.989065268033930910, -0.989057892874703250, -0.989050515242830940, -0.989043135138332200, -0.989035752561225780, -0.989028367511529780, -0.989020979989262970, -0.989013589994443780, +-0.989006197527090510, -0.988998802587221840, -0.988991405174856060, -0.988984005290011850, -0.988976602932707620, -0.988969198102961910, -0.988961790800793160, -0.988954381026219800, +-0.988946968779260690, -0.988939554059934060, -0.988932136868258540, -0.988924717204252790, -0.988917295067935020, -0.988909870459324210, -0.988902443378438690, -0.988895013825297100, +-0.988887581799917870, -0.988880147302319770, -0.988872710332521330, -0.988865270890540990, -0.988857828976397620, -0.988850384590109540, -0.988842937731695510, -0.988835488401174190, +-0.988828036598564110, -0.988820582323884030, -0.988813125577152400, -0.988805666358388070, -0.988798204667609370, -0.988790740504835290, -0.988783273870084360, -0.988775804763375230, +-0.988768333184726680, -0.988760859134157230, -0.988753382611685660, -0.988745903617330610, -0.988738422151110740, -0.988730938213044810, -0.988723451803151580, -0.988715962921449700, +-0.988708471567957940, -0.988700977742695050, -0.988693481445679700, -0.988685982676930420, -0.988678481436466420, -0.988670977724306230, -0.988663471540468520, -0.988655962884972150, +-0.988648451757835890, -0.988640938159078500, -0.988633422088718850, -0.988625903546775490, -0.988618382533267390, -0.988610859048213330, -0.988603333091632170, -0.988595804663542690, +-0.988588273763963740, -0.988580740392914100, -0.988573204550412420, -0.988565666236477900, -0.988558125451129200, -0.988550582194385190, -0.988543036466264620, -0.988535488266786610, +-0.988527937595969800, -0.988520384453833170, -0.988512828840395600, -0.988505270755675960, -0.988497710199693010, -0.988490147172465860, -0.988482581674013370, -0.988475013704354530, +-0.988467443263507990, -0.988459870351492850, -0.988452294968328090, -0.988444717114032590, -0.988437136788625330, -0.988429553992125180, -0.988421968724551240, -0.988414380985922270, +-0.988406790776257370, -0.988399198095575530, -0.988391602943895720, -0.988384005321236710, -0.988376405227617830, -0.988368802663058040, -0.988361197627576130, -0.988353590121191280, +-0.988345980143922390, -0.988338367695788420, -0.988330752776808710, -0.988323135387002120, -0.988315515526387630, -0.988307893194984470, -0.988300268392811490, -0.988292641119887900, +-0.988285011376232590, -0.988277379161864870, -0.988269744476803490, -0.988262107321068010, -0.988254467694677170, -0.988246825597650090, -0.988239181030006080, -0.988231533991764000, +-0.988223884482943070, -0.988216232503562500, -0.988208578053641370, -0.988200921133198680, -0.988193261742253860, -0.988185599880825770, -0.988177935548933740, -0.988170268746596860, +-0.988162599473834340, -0.988154927730665160, -0.988147253517108750, -0.988139576833184210, -0.988131897678910740, -0.988124216054307560, -0.988116531959393860, -0.988108845394188640, +-0.988101156358711540, -0.988093464852981440, -0.988085770877017660, -0.988078074430839500, -0.988070375514466190, -0.988062674127916930, -0.988054970271211030, -0.988047263944367590, +-0.988039555147406050, -0.988031843880345480, -0.988024130143205450, -0.988016413936005030, -0.988008695258763670, -0.988000974111500560, -0.987993250494234810, -0.987985524406986170, +-0.987977795849773630, -0.987970064822616620, -0.987962331325534460, -0.987954595358546460, -0.987946856921671950, -0.987939116014930340, -0.987931372638340970, -0.987923626791923140, +-0.987915878475696060, -0.987908127689679500, -0.987900374433892560, -0.987892618708354650, -0.987884860513085330, -0.987877099848103790, -0.987869336713429360, -0.987861571109081680, +-0.987853803035080080, -0.987846032491443980, -0.987838259478192810, -0.987830483995346010, -0.987822706042922990, -0.987814925620943310, -0.987807142729426160, -0.987799357368391080, +-0.987791569537857740, -0.987783779237845440, -0.987775986468373720, -0.987768191229462130, -0.987760393521129880, -0.987752593343396600, -0.987744790696282070, -0.987736985579805380, +-0.987729177993986410, -0.987721367938844350, -0.987713555414398980, -0.987705740420669610, -0.987697922957676000, -0.987690103025437470, -0.987682280623973670, -0.987674455753304150, +-0.987666628413448660, -0.987658798604426510, -0.987650966326257370, -0.987643131578960780, -0.987635294362556260, -0.987627454677063700, -0.987619612522502410, -0.987611767898892160, +-0.987603920806252480, -0.987596071244602910, -0.987588219213963230, -0.987580364714353070, -0.987572507745791860, -0.987564648308299490, -0.987556786401895370, -0.987548922026599390, +-0.987541055182431070, -0.987533185869410080, -0.987525314087556170, -0.987517439836888890, -0.987509563117428100, -0.987501683929193350, -0.987493802272204510, -0.987485918146481120, +-0.987478031552042950, -0.987470142488909630, -0.987462250957100940, -0.987454356956636750, -0.987446460487536590, -0.987438561549820130, -0.987430660143507440, -0.987422756268618080, +-0.987414849925171810, -0.987406941113188500, -0.987399029832687790, -0.987391116083689350, -0.987383199866213260, -0.987375281180279170, -0.987367360025906860, -0.987359436403116190, +-0.987351510311926920, -0.987343581752358810, -0.987335650724431860, -0.987327717228165700, -0.987319781263580110, -0.987311842830695290, -0.987303901929530770, -0.987295958560106550, +-0.987288012722442380, -0.987280064416558250, -0.987272113642473690, -0.987264160400209150, -0.987256204689784140, -0.987248246511218560, -0.987240285864532500, -0.987232322749745590, +-0.987224357166877950, -0.987216389115949440, -0.987208418596979830, -0.987200445609989210, -0.987192470154997450, -0.987184492232024650, -0.987176511841090560, -0.987168528982215190, +-0.987160543655418500, -0.987152555860720260, -0.987144565598140900, -0.987136572867700070, -0.987128577669417750, -0.987120580003314040, -0.987112579869408810, -0.987104577267722160, +-0.987096572198274180, -0.987088564661084630, -0.987080554656173730, -0.987072542183561330, -0.987064527243267650, -0.987056509835312680, -0.987048489959716500, -0.987040467616499000, +-0.987032442805680250, -0.987024415527280490, -0.987016385781319670, -0.987008353567817910, -0.987000318886795290, -0.986992281738271910, -0.986984242122267760, -0.986976200038803040, +-0.986968155487897850, -0.986960108469572160, -0.986952058983846190, -0.986944007030740140, -0.986935952610274110, -0.986927895722468200, -0.986919836367342480, -0.986911774544917190, +-0.986903710255212400, -0.986895643498248430, -0.986887574274045280, -0.986879502582623250, -0.986871428424002550, -0.986863351798203170, -0.986855272705245420, -0.986847191145149520, +-0.986839107117935650, -0.986831020623623820, -0.986822931662234670, -0.986814840233788180, -0.986806746338304560, -0.986798649975804020, -0.986790551146306870, -0.986782449849833320, +-0.986774346086403690, -0.986766239856038170, -0.986758131158757100, -0.986750019994580670, -0.986741906363529210, -0.986733790265623020, -0.986725671700882320, -0.986717550669327430, +-0.986709427170978540, -0.986701301205856200, -0.986693172773980610, -0.986685041875372090, -0.986676908510050970, -0.986668772678037650, -0.986660634379352140, -0.986652493614015300, +-0.986644350382047120, -0.986636204683468130, -0.986628056518298550, -0.986619905886558900, -0.986611752788269510, -0.986603597223450700, -0.986595439192122890, -0.986587278694306510, +-0.986579115730021770, -0.986570950299289430, -0.986562782402129690, -0.986554612038562870, -0.986546439208609740, -0.986538263912290160, -0.986530086149625230, -0.986521905920635040, +-0.986513723225340030, -0.986505538063760730, -0.986497350435917570, -0.986489160341831100, -0.986480967781521720, -0.986472772755009890, -0.986464575262316120, -0.986456375303460750, +-0.986448172878464650, -0.986439967987348120, -0.986431760630131600, -0.986423550806835750, -0.986415338517480980, -0.986407123762087720, -0.986398906540676860, -0.986390686853268580, +-0.986382464699883780, -0.986374240080542640, -0.986366012995266050, -0.986357783444074320, -0.986349551426988210, -0.986341316944028160, -0.986333079995214690, -0.986324840580568680, +-0.986316598700110570, -0.986308354353860990, -0.986300107541840500, -0.986291858264069620, -0.986283606520569120, -0.986275352311359650, -0.986267095636461870, -0.986258836495896300, +-0.986250574889683710, -0.986242310817844640, -0.986234044280399740, -0.986225775277369760, -0.986217503808775380, -0.986209229874637110, -0.986200953474975830, -0.986192674609812300, +-0.986184393279166960, -0.986176109483060670, -0.986167823221514080, -0.986159534494547850, -0.986151243302182960, -0.986142949644439830, -0.986134653521339440, -0.986126354932902350, +-0.986118053879149410, -0.986109750360101290, -0.986101444375778850, -0.986093135926202740, -0.986084825011393830, -0.986076511631372780, -0.986068195786160450, -0.986059877475777720, +-0.986051556700245360, -0.986043233459584000, -0.986034907753814420, -0.986026579582957810, -0.986018248947034600, -0.986009915846065900, -0.986001580280072340, -0.985993242249074920, +-0.985984901753094280, -0.985976558792151400, -0.985968213366267170, -0.985959865475462440, -0.985951515119757870, -0.985943162299174560, -0.985934807013733480, -0.985926449263455300, +-0.985918089048361090, -0.985909726368471520, -0.985901361223807670, -0.985892993614390420, -0.985884623540240760, -0.985876251001379430, -0.985867875997827550, -0.985859498529605970, +-0.985851118596735690, -0.985842736199237570, -0.985834351337132600, -0.985825964010441650, -0.985817574219185920, -0.985809181963386290, -0.985800787243063640, -0.985792390058239040, +-0.985783990408933500, -0.985775588295167760, -0.985767183716963260, -0.985758776674340750, -0.985750367167321340, -0.985741955195926000, -0.985733540760175830, -0.985725123860091700, +-0.985716704495694820, -0.985708282667006270, -0.985699858374046720, -0.985691431616837700, -0.985683002395400190, -0.985674570709755060, -0.985666136559923630, -0.985657699945926780, +-0.985649260867785480, -0.985640819325521280, -0.985632375319154930, -0.985623928848707750, -0.985615479914200730, -0.985607028515654960, -0.985598574653091640, -0.985590118326531870, +-0.985581659535996750, -0.985573198281507580, -0.985564734563085240, -0.985556268380751170, -0.985547799734526550, -0.985539328624432280, -0.985530855050489760, -0.985522379012720000, +-0.985513900511144400, -0.985505419545783970, -0.985496936116660120, -0.985488450223793830, -0.985479961867206540, -0.985471471046919230, -0.985462977762953220, -0.985454482015329810, +-0.985445983804070220, -0.985437483129195550, -0.985428979990727320, -0.985420474388686520, -0.985411966323094690, -0.985403455793972820, -0.985394942801342430, -0.985386427345224410, +-0.985377909425640520, -0.985369389042611950, -0.985360866196159810, -0.985352340886305520, -0.985343813113070290, -0.985335282876475650, -0.985326750176542810, -0.985318215013293090, +-0.985309677386747570, -0.985301137296928140, -0.985292594743855780, -0.985284049727552010, -0.985275502248038060, -0.985266952305335340, -0.985258399899465060, -0.985249845030448990, +-0.985241287698308320, -0.985232727903064490, -0.985224165644738690, -0.985215600923352590, -0.985207033738927480, -0.985198464091484700, -0.985189891981045780, -0.985181317407632040, +-0.985172740371265120, -0.985164160871966450, -0.985155578909757250, -0.985146994484659140, -0.985138407596693580, -0.985129818245881750, -0.985121226432245640, -0.985112632155806470, +-0.985104035416585640, -0.985095436214604710, -0.985086834549885220, -0.985078230422448690, -0.985069623832316550, -0.985061014779510360, -0.985052403264051630, -0.985043789285961700, +-0.985035172845262540, -0.985026553941975360, -0.985017932576121910, -0.985009308747723520, -0.985000682456801720, -0.984992053703378390, -0.984983422487474950, -0.984974788809112930, +-0.984966152668313890, -0.984957514065099460, -0.984948872999491300, -0.984940229471510940, -0.984931583481180040, -0.984922935028520240, -0.984914284113552860, -0.984905630736299890, +-0.984896974896782850, -0.984888316595023520, -0.984879655831043200, -0.984870992604863660, -0.984862326916506880, -0.984853658765994180, -0.984844988153347420, -0.984836315078588150, +-0.984827639541738020, -0.984818961542818890, -0.984810281081852310, -0.984801598158860040, -0.984792912773863720, -0.984784224926885110, -0.984775534617945980, -0.984766841847067980, +-0.984758146614272970, -0.984749448919582490, -0.984740748763018540, -0.984732046144602410, -0.984723341064356440, -0.984714633522302040, -0.984705923518461090, -0.984697211052855350, +-0.984688496125506460, -0.984679778736436530, -0.984671058885666970, -0.984662336573219890, -0.984653611799116700, -0.984644884563379730, -0.984636154866030510, -0.984627422707090920, +-0.984618688086582820, -0.984609951004527860, -0.984601211460948030, -0.984592469455865200, -0.984583724989301250, -0.984574978061278030, -0.984566228671817310, -0.984557476820941080, +-0.984548722508671090, -0.984539965735029330, -0.984531206500037560, -0.984522444803717760, -0.984513680646091900, -0.984504914027181880, -0.984496144947009650, -0.984487373405597000, +-0.984478599402965890, -0.984469822939138100, -0.984461044014135920, -0.984452262627981130, -0.984443478780695820, -0.984434692472301640, -0.984425903702820790, -0.984417112472275260, +-0.984408318780686800, -0.984399522628077620, -0.984390724014469700, -0.984381922939884690, -0.984373119404345130, -0.984364313407872670, -0.984355504950489510, -0.984346694032217530, +-0.984337880653078700, -0.984329064813095340, -0.984320246512289330, -0.984311425750682640, -0.984302602528297490, -0.984293776845155730, -0.984284948701279580, -0.984276118096691020, +-0.984267285031412140, -0.984258449505465150, -0.984249611518871800, -0.984240771071654640, -0.984231928163835420, -0.984223082795436580, -0.984214234966479860, -0.984205384676987590, +-0.984196531926981750, -0.984187676716484770, -0.984178819045518520, -0.984169958914105300, -0.984161096322267110, -0.984152231270026160, -0.984143363757404740, -0.984134493784424860, +-0.984125621351108700, -0.984116746457478380, -0.984107869103556300, -0.984098989289364570, -0.984090107014925390, -0.984081222280260960, -0.984072335085393490, -0.984063445430344960, +-0.984054553315137910, -0.984045658739794660, -0.984036761704337180, -0.984027862208787680, -0.984018960253168710, -0.984010055837502230, -0.984001148961810680, -0.983992239626116150, +-0.983983327830440960, -0.983974413574807640, -0.983965496859238180, -0.983956577683755000, -0.983947656048380410, -0.983938731953136750, -0.983929805398045980, -0.983920876383130860, +-0.983911944908413600, -0.983903010973916530, -0.983894074579661830, -0.983885135725672040, -0.983876194411969270, -0.983867250638576160, -0.983858304405514810, -0.983849355712807850, +-0.983840404560477170, -0.983831450948545740, -0.983822494877035660, -0.983813536345969350, -0.983804575355369140, -0.983795611905257440, -0.983786645995656790, -0.983777677626589520, +-0.983768706798078150, -0.983759733510144900, -0.983750757762812400, -0.983741779556102980, -0.983732798890039060, -0.983723815764643180, -0.983714830179937770, -0.983705842135945140, +-0.983696851632688050, -0.983687858670188820, -0.983678863248469980, -0.983669865367553960, -0.983660865027463300, -0.983651862228220320, -0.983642856969847770, -0.983633849252368190, +-0.983624839075803890, -0.983615826440177530, -0.983606811345511530, -0.983597793791828660, -0.983588773779151220, -0.983579751307501750, -0.983570726376902900, -0.983561698987377330, +-0.983552669138947460, -0.983543636831636040, -0.983534602065465390, -0.983525564840458390, -0.983516525156637230, -0.983507483014024910, -0.983498438412643840, -0.983489391352516780, +-0.983480341833666170, -0.983471289856114760, -0.983462235419885090, -0.983453178524999800, -0.983444119171481560, -0.983435057359352880, -0.983425993088636760, -0.983416926359355630, +-0.983407857171532230, -0.983398785525189110, -0.983389711420349140, -0.983380634857034640, -0.983371555835268700, -0.983362474355073960, -0.983353390416472960, -0.983344304019488470, +-0.983335215164143240, -0.983326123850460030, -0.983317030078461380, -0.983307933848170280, -0.983298835159609360, -0.983289734012801060, -0.983280630407768700, -0.983271524344534690, +-0.983262415823121900, -0.983253304843553110, -0.983244191405850840, -0.983235075510038300, -0.983225957156138030, -0.983216836344172900, -0.983207713074165660, -0.983198587346139190, +-0.983189459160116240, -0.983180328516119580, -0.983171195414172080, -0.983162059854296720, -0.983152921836515930, -0.983143781360853010, -0.983134638427330730, -0.983125493035971740, +-0.983116345186799130, -0.983107194879835560, -0.983098042115103880, -0.983088886892627300, -0.983079729212428370, -0.983070569074530280, -0.983061406478955680, -0.983052241425727560, +-0.983043073914868890, -0.983033903946402440, -0.983024731520351300, -0.983015556636738230, -0.983006379295586320, -0.982997199496918440, -0.982988017240757680, -0.982978832527126810, +-0.982969645356048920, -0.982960455727546640, -0.982951263641643540, -0.982942069098362130, -0.982932872097725620, -0.982923672639756880, -0.982914470724479020, -0.982905266351915000, +-0.982896059522087810, -0.982886850235020430, -0.982877638490735730, -0.982868424289257140, -0.982859207630607520, -0.982849988514809760, -0.982840766941887160, -0.982831542911862590, +-0.982822316424759030, -0.982813087480599810, -0.982803856079407900, -0.982794622221206390, -0.982785385906018270, -0.982776147133866630, -0.982766905904774670, -0.982757662218765480, +-0.982748416075862160, -0.982739167476087690, -0.982729916419465170, -0.982720662906018120, -0.982711406935769300, -0.982702148508742050, -0.982692887624959320, -0.982683624284444330, +-0.982674358487220400, -0.982665090233310500, -0.982655819522737950, -0.982646546355525840, -0.982637270731697380, -0.982627992651275760, -0.982618712114284090, -0.982609429120745670, +-0.982600143670683710, -0.982590855764121200, -0.982581565401081770, -0.982572272581588300, -0.982562977305664220, -0.982553679573332730, -0.982544379384617030, -0.982535076739540210, +-0.982525771638125820, -0.982516464080397060, -0.982507154066377120, -0.982497841596089330, -0.982488526669556880, -0.982479209286803100, -0.982469889447851300, -0.982460567152724780, +-0.982451242401446770, -0.982441915194040780, -0.982432585530529920, -0.982423253410937610, -0.982413918835287280, -0.982404581803602020, -0.982395242315905250, -0.982385900372220510, +-0.982376555972571010, -0.982367209116980060, -0.982357859805471190, -0.982348508038067610, -0.982339153814792750, -0.982329797135670040, -0.982320438000722880, -0.982311076409974390, +-0.982301712363448320, -0.982292345861168090, -0.982282976903156910, -0.982273605489438320, -0.982264231620035730, -0.982254855294972360, -0.982245476514272080, -0.982236095277958080, +-0.982226711586053790, -0.982217325438582870, -0.982207936835568510, -0.982198545777034360, -0.982189152263003740, -0.982179756293500410, -0.982170357868547560, -0.982160956988168630, +-0.982151553652387600, -0.982142147861227550, -0.982132739614712260, -0.982123328912865020, -0.982113915755709390, -0.982104500143269000, -0.982095082075567500, -0.982085661552628220, +-0.982076238574474790, -0.982066813141130760, -0.982057385252619760, -0.982047954908965240, -0.982038522110190830, -0.982029086856320180, -0.982019649147376610, -0.982010208983383980, +-0.982000766364365950, -0.981991321290345940, -0.981981873761347710, -0.981972423777394800, -0.981962971338510520, -0.981953516444719070, -0.981944059096043880, -0.981934599292508480, +-0.981925137034136640, -0.981915672320951890, -0.981906205152978000, -0.981896735530238600, -0.981887263452757340, -0.981877788920557770, -0.981868311933663860, -0.981858832492099150, +-0.981849350595887400, -0.981839866245052260, -0.981830379439617480, -0.981820890179606610, -0.981811398465043620, -0.981801904295952150, -0.981792407672355980, -0.981782908594278750, +-0.981773407061744210, -0.981763903074776230, -0.981754396633398470, -0.981744887737634690, -0.981735376387508520, -0.981725862583044060, -0.981716346324264970, -0.981706827611194990, +-0.981697306443858000, -0.981687782822277750, -0.981678256746477800, -0.981668728216482430, -0.981659197232315210, -0.981649663793999980, -0.981640127901560630, -0.981630589555021030, +-0.981621048754404810, -0.981611505499736080, -0.981601959791038480, -0.981592411628336100, -0.981582861011652490, -0.981573307941011830, -0.981563752416438010, -0.981554194437954660, +-0.981544634005586000, -0.981535071119355450, -0.981525505779287430, -0.981515937985405710, -0.981506367737734030, -0.981496795036296500, -0.981487219881116980, -0.981477642272219450, +-0.981468062209627790, -0.981458479693365860, -0.981448894723457870, -0.981439307299927450, -0.981429717422798940, -0.981420125092096090, -0.981410530307842980, -0.981400933070063490, +-0.981391333378781710, -0.981381731234021390, -0.981372126635806860, -0.981362519584162100, -0.981352910079111070, -0.981343298120677670, -0.981333683708886070, -0.981324066843760280, +-0.981314447525324370, -0.981304825753602230, -0.981295201528617930, -0.981285574850395800, -0.981275945718959710, -0.981266314134333740, -0.981256680096541990, -0.981247043605608550, +-0.981237404661557290, -0.981227763264412740, -0.981218119414198790, -0.981208473110939510, -0.981198824354659100, -0.981189173145381570, -0.981179519483131200, -0.981169863367931880, +-0.981160204799808030, -0.981150543778783410, -0.981140880304882670, -0.981131214378129670, -0.981121545998548730, -0.981111875166163830, -0.981102201880999280, -0.981092526143079070, +-0.981082847952427730, -0.981073167309069240, -0.981063484213027800, -0.981053798664327630, -0.981044110662993020, -0.981034420209048190, -0.981024727302517220, -0.981015031943424430, +-0.981005334131794140, -0.980995633867650320, -0.980985931151017510, -0.980976225981919910, -0.980966518360381730, -0.980956808286427280, -0.980947095760080660, -0.980937380781366500, +-0.980927663350308790, -0.980917943466932060, -0.980908221131260310, -0.980898496343318160, -0.980888769103129610, -0.980879039410719300, -0.980869307266111320, -0.980859572669329990, +-0.980849835620399620, -0.980840096119344860, -0.980830354166189910, -0.980820609760958970, -0.980810862903676580, -0.980801113594367060, -0.980791361833054490, -0.980781607619763740, +-0.980771850954518910, -0.980762091837344530, -0.980752330268264920, -0.980742566247304380, -0.980732799774487570, -0.980723030849838700, -0.980713259473382170, -0.980703485645142430, +-0.980693709365144110, -0.980683930633411530, -0.980674149449969110, -0.980664365814841290, -0.980654579728052590, -0.980644791189627330, -0.980635000199590160, -0.980625206757965500, +-0.980615410864777880, -0.980605612520051740, -0.980595811723811490, -0.980586008476081790, -0.980576202776887060, -0.980566394626251720, -0.980556584024200320, -0.980546770970757600, +-0.980536955465947990, -0.980527137509796030, -0.980517317102326150, -0.980507494243562980, -0.980497668933530850, -0.980487841172254850, -0.980478010959759170, -0.980468178296068470, +-0.980458343181207390, -0.980448505615200360, -0.980438665598072130, -0.980428823129847140, -0.980418978210550240, -0.980409130840205760, -0.980399281018838330, -0.980389428746472950, +-0.980379574023133920, -0.980369716848845880, -0.980359857223633610, -0.980349995147521640, -0.980340130620534710, -0.980330263642697490, -0.980320394214034610, -0.980310522334570830, +-0.980300648004330590, -0.980290771223338850, -0.980280891991620160, -0.980271010309199280, -0.980261126176100730, -0.980251239592349390, -0.980241350557970010, -0.980231459072987250, +-0.980221565137425870, -0.980211668751310490, -0.980201769914666010, -0.980191868627516950, -0.980181964889888400, -0.980172058701804900, -0.980162150063291330, -0.980152238974372310, +-0.980142325435072740, -0.980132409445417240, -0.980122491005430810, -0.980112570115138190, -0.980102646774563930, -0.980092720983733230, -0.980082792742670740, -0.980072862051401210, +-0.980062928909949620, -0.980052993318340620, -0.980043055276598960, -0.980033114784749860, -0.980023171842818060, -0.980013226450828220, -0.980003278608805320, -0.979993328316774330, +-0.979983375574759900, -0.979973420382787120, -0.979963462740880750, -0.979953502649065560, -0.979943540107366730, -0.979933575115809140, -0.979923607674417550, -0.979913637783216940, +-0.979903665442232290, -0.979893690651488240, -0.979883713411010100, -0.979873733720822760, -0.979863751580951070, -0.979853766991420020, -0.979843779952254580, -0.979833790463479630, +-0.979823798525120250, -0.979813804137201320, -0.979803807299747920, -0.979793808012784820, -0.979783806276337320, -0.979773802090430300, -0.979763795455088850, -0.979753786370337940, +-0.979743774836202340, -0.979733760852707470, -0.979723744419878200, -0.979713725537739500, -0.979703704206316580, -0.979693680425634430, -0.979683654195718010, -0.979673625516592540, +-0.979663594388282880, -0.979653560810814340, -0.979643524784211680, -0.979633486308500330, -0.979623445383705380, -0.979613402009851700, -0.979603356186964590, -0.979593307915068930, +-0.979583257194190150, -0.979573204024353220, -0.979563148405583230, -0.979553090337905390, -0.979543029821344890, -0.979532966855926720, -0.979522901441676200, -0.979512833578618510, +-0.979502763266778650, -0.979492690506181710, -0.979482615296853210, -0.979472537638818140, -0.979462457532101700, -0.979452374976729210, -0.979442289972725750, -0.979432202520116420, +-0.979422112618926750, -0.979412020269181730, -0.979401925470906760, -0.979391828224126960, -0.979381728528867510, -0.979371626385153740, -0.979361521793010950, -0.979351414752464340, +-0.979341305263539130, -0.979331193326260730, -0.979321078940654340, -0.979310962106745290, -0.979300842824558760, -0.979290721094120190, -0.979280596915454660, -0.979270470288587710, +-0.979260341213544660, -0.979250209690350810, -0.979240075719031380, -0.979229939299611770, -0.979219800432117320, -0.979209659116573320, -0.979199515353005200, -0.979189369141438280, +-0.979179220481897760, -0.979169069374409400, -0.979158915818998390, -0.979148759815690050, -0.979138601364509810, -0.979128440465482860, -0.979118277118635080, -0.979108111323991560, +-0.979097943081577720, -0.979087772391419090, -0.979077599253540990, -0.979067423667968840, -0.979057245634728180, -0.979047065153844430, -0.979036882225343020, -0.979026696849249260, +-0.979016509025588900, -0.979006318754387150, -0.978996126035669770, -0.978985930869461950, -0.978975733255789240, -0.978965533194677270, -0.978955330686151590, -0.978945125730237510, +-0.978934918326960560, -0.978924708476346380, -0.978914496178420410, -0.978904281433208290, -0.978894064240735330, -0.978883844601027290, -0.978873622514109480, -0.978863397980007770, +-0.978853170998747470, -0.978842941570354340, -0.978832709694853920, -0.978822475372271630, -0.978812238602633000, -0.978801999385963910, -0.978791757722289880, -0.978781513611636340, +-0.978771267054029170, -0.978761018049493780, -0.978750766598055820, -0.978740512699740940, -0.978730256354574780, -0.978719997562582880, -0.978709736323791100, -0.978699472638224990, +-0.978689206505910180, -0.978678937926872330, -0.978668666901137190, -0.978658393428730180, -0.978648117509677400, -0.978637839144004260, -0.978627558331736540, -0.978617275072899970, +-0.978606989367520220, -0.978596701215622920, -0.978586410617233950, -0.978576117572378950, -0.978565822081083450, -0.978555524143373550, -0.978545223759274880, -0.978534920928813110, +-0.978524615652014100, -0.978514307928903480, -0.978503997759506920, -0.978493685143850600, -0.978483370081959960, -0.978473052573861080, -0.978462732619579390, -0.978452410219140980, +-0.978442085372571490, -0.978431758079896800, -0.978421428341142760, -0.978411096156335040, -0.978400761525499480, -0.978390424448662200, -0.978380084925848830, -0.978369742957085230, +-0.978359398542397280, -0.978349051681810740, -0.978338702375351700, -0.978328350623045910, -0.978317996424919230, -0.978307639780997550, -0.978297280691306730, -0.978286919155872740, +-0.978276555174721450, -0.978266188747878850, -0.978255819875370690, -0.978245448557222840, -0.978235074793461610, -0.978224698584112540, -0.978214319929201830, -0.978203938828755340, +-0.978193555282798940, -0.978183169291358510, -0.978172780854460240, -0.978162389972130120, -0.978151996644394010, -0.978141600871277990, -0.978131202652807840, -0.978120801989009750, +-0.978110398879909580, -0.978099993325533430, -0.978089585325907170, -0.978079174881057110, -0.978068761991009120, -0.978058346655789280, -0.978047928875423470, -0.978037508649937880, +-0.978027085979358390, -0.978016660863711310, -0.978006233303022610, -0.977995803297318280, -0.977985370846624400, -0.977974935950967180, -0.977964498610372600, -0.977954058824866750, +-0.977943616594475820, -0.977933171919225570, -0.977922724799142660, -0.977912275234252950, -0.977901823224582410, -0.977891368770157480, -0.977880911871004010, -0.977870452527148100, +-0.977859990738616290, -0.977849526505434550, -0.977839059827628860, -0.977828590705225650, -0.977818119138250900, -0.977807645126730800, -0.977797168670691660, -0.977786689770159590, +-0.977776208425160780, -0.977765724635721310, -0.977755238401867620, -0.977744749723625910, -0.977734258601022250, -0.977723765034083090, -0.977713269022834170, -0.977702770567302370, +-0.977692269667513550, -0.977681766323494130, -0.977671260535270310, -0.977660752302868310, -0.977650241626314420, -0.977639728505634960, -0.977629212940856140, -0.977618694932004260, +-0.977608174479105530, -0.977597651582186480, -0.977587126241273420, -0.977576598456392440, -0.977566068227569970, -0.977555535554832320, -0.977545000438205690, -0.977534462877716730, +-0.977523922873391630, -0.977513380425256710, -0.977502835533338390, -0.977492288197662870, -0.977481738418256700, -0.977471186195146170, -0.977460631528357720, -0.977450074417917420, +-0.977439514863852170, -0.977428952866188140, -0.977418388424951770, -0.977407821540169360, -0.977397252211867350, -0.977386680440072150, -0.977376106224810300, -0.977365529566108340, +-0.977354950463992460, -0.977344368918489190, -0.977333784929625080, -0.977323198497426440, -0.977312609621919790, -0.977302018303131680, -0.977291424541088300, -0.977280828335816530, +-0.977270229687342670, -0.977259628595693260, -0.977249025060894840, -0.977238419082973820, -0.977227810661956520, -0.977217199797869920, -0.977206586490740330, -0.977195970740594280, +-0.977185352547458310, -0.977174731911358950, -0.977164108832322740, -0.977153483310376210, -0.977142855345546010, -0.977132224937858670, -0.977121592087340620, -0.977110956794018830, +-0.977100319057919500, -0.977089678879069500, -0.977079036257495260, -0.977068391193223200, -0.977057743686280400, -0.977047093736693180, -0.977036441344488300, -0.977025786509692300, +-0.977015129232331800, -0.977004469512433580, -0.976993807350024060, -0.976983142745130100, -0.976972475697778230, -0.976961806207995000, -0.976951134275807490, -0.976940459901242120, +-0.976929783084325540, -0.976919103825084620, -0.976908422123545780, -0.976897737979735780, -0.976887051393681700, -0.976876362365409870, -0.976865670894947250, -0.976854976982320380, +-0.976844280627556020, -0.976833581830681030, -0.976822880591722060, -0.976812176910705990, -0.976801470787659110, -0.976790762222608850, -0.976780051215581760, -0.976769337766604350, +-0.976758621875703730, -0.976747903542906530, -0.976737182768239400, -0.976726459551729430, -0.976715733893403380, -0.976705005793288010, -0.976694275251410060, -0.976683542267796520, +-0.976672806842474040, -0.976662068975469590, -0.976651328666809930, -0.976640585916521700, -0.976629840724632330, -0.976619093091168230, -0.976608343016156510, -0.976597590499623910, +-0.976586835541597310, -0.976576078142103340, -0.976565318301169550, -0.976554556018822350, -0.976543791295088730, -0.976533024129995760, -0.976522254523570110, -0.976511482475838850, +-0.976500707986828980, -0.976489931056567230, -0.976479151685080700, -0.976468369872396050, -0.976457585618540680, -0.976446798923541360, -0.976436009787425060, -0.976425218210218770, +-0.976414424191949240, -0.976403627732643780, -0.976392828832329250, -0.976382027491032640, -0.976371223708781040, -0.976360417485601320, -0.976349608821520550, -0.976338797716565840, +-0.976327984170764050, -0.976317168184142380, -0.976306349756727480, -0.976295528888546980, -0.976284705579627650, -0.976273879829996580, -0.976263051639680750, -0.976252221008707340, +-0.976241387937103130, -0.976230552424895650, -0.976219714472111870, -0.976208874078778770, -0.976198031244923440, -0.976187185970573080, -0.976176338255754780, -0.976165488100495530, +-0.976154635504822620, -0.976143780468762930, -0.976132922992344000, -0.976122063075592790, -0.976111200718536300, -0.976100335921201930, -0.976089468683616680, -0.976078599005807510, +-0.976067726887802190, -0.976056852329627360, -0.976045975331310540, -0.976035095892878730, -0.976024214014359240, -0.976013329695779140, -0.976002442937165760, -0.975991553738546180, +-0.975980662099947600, -0.975969768021397570, -0.975958871502923150, -0.975947972544551460, -0.975937071146309900, -0.975926167308225680, -0.975915261030325780, -0.975904352312637950, +-0.975893441155189280, -0.975882527558006970, -0.975871611521118340, -0.975860693044550700, -0.975849772128331240, -0.975838848772487500, -0.975827922977046570, -0.975816994742035760, +-0.975806064067482380, -0.975795130953413970, -0.975784195399857720, -0.975773257406841070, -0.975762316974391200, -0.975751374102535430, -0.975740428791301300, -0.975729481040716220, +-0.975718530850807290, -0.975707578221602150, -0.975696623153128000, -0.975685665645412370, -0.975674705698482580, -0.975663743312365940, -0.975652778487089980, -0.975641811222681900, +-0.975630841519169460, -0.975619869376579850, -0.975608894794940730, -0.975597917774279290, -0.975586938314622950, -0.975575956415999260, -0.975564972078435730, -0.975553985301959800, +-0.975542996086599000, -0.975532004432380640, -0.975521010339332250, -0.975510013807481370, -0.975499014836855420, -0.975488013427481930, -0.975477009579388320, -0.975466003292602250, +-0.975454994567151230, -0.975443983403062710, -0.975432969800364200, -0.975421953759083360, -0.975410935279247380, -0.975399914360884250, -0.975388891004021370, -0.975377865208686190, +-0.975366836974906450, -0.975355806302709570, -0.975344773192123090, -0.975333737643174770, -0.975322699655892130, -0.975311659230302500, -0.975300616366433950, -0.975289571064313800, +-0.975278523323969800, -0.975267473145429390, -0.975256420528720410, -0.975245365473870090, -0.975234307980906600, -0.975223248049857380, -0.975212185680749970, -0.975201120873612100, +-0.975190053628471440, -0.975178983945355740, -0.975167911824292410, -0.975156837265309440, -0.975145760268434360, -0.975134680833694590, -0.975123598961118440, -0.975112514650733230, +-0.975101427902566710, -0.975090338716646630, -0.975079247093000530, -0.975068153031656500, -0.975057056532642070, -0.975045957595985000, -0.975034856221713040, -0.975023752409853950, +-0.975012646160435480, -0.975001537473485390, -0.974990426349031550, -0.974979312787101480, -0.974968196787723060, -0.974957078350924270, -0.974945957476732850, -0.974934834165176460, +-0.974923708416283060, -0.974912580230080320, -0.974901449606595970, -0.974890316545858230, -0.974879181047894620, -0.974868043112733120, -0.974856902740401490, -0.974845759930927590, +-0.974834614684339300, -0.974823467000664470, -0.974812316879930970, -0.974801164322166460, -0.974790009327399340, -0.974778851895657050, -0.974767692026967780, -0.974756529721359180, +-0.974745364978859330, -0.974734197799495770, -0.974723028183296920, -0.974711856130290540, -0.974700681640504610, -0.974689504713966870, -0.974678325350705420, -0.974667143550748130, +-0.974655959314122970, -0.974644772640857910, -0.974633583530980730, -0.974622391984519830, -0.974611198001502870, -0.974600001581957920, -0.974588802725913080, -0.974577601433396110, +-0.974566397704434980, -0.974555191539058120, -0.974543982937293160, -0.974532771899168320, -0.974521558424711550, -0.974510342513950860, -0.974499124166914310, -0.974487903383630010, +-0.974476680164125920, -0.974465454508430140, -0.974454226416570420, -0.974442995888575410, -0.974431762924472980, -0.974420527524291090, -0.974409289688057840, -0.974398049415801220, +-0.974386806707549620, -0.974375561563331050, -0.974364313983173580, -0.974353063967105300, -0.974341811515154420, -0.974330556627348910, -0.974319299303717080, -0.974308039544287020, +-0.974296777349086820, -0.974285512718144450, -0.974274245651488570, -0.974262976149147030, -0.974251704211148040, -0.974240429837519790, -0.974229153028290500, -0.974217873783488120, +-0.974206592103141310, -0.974195307987277940, -0.974184021435926310, -0.974172732449114620, -0.974161441026871190, -0.974150147169223990, -0.974138850876201560, -0.974127552147831980, +-0.974116250984143340, -0.974104947385164180, -0.974093641350922690, -0.974082332881447190, -0.974071021976765760, -0.974059708636906720, -0.974048392861898370, -0.974037074651769140, +-0.974025754006547230, -0.974014430926260940, -0.974003105410938600, -0.973991777460608390, -0.973980447075298850, -0.973969114255038180, -0.973957778999854700, -0.973946441309776590, +-0.973935101184832620, -0.973923758625050760, -0.973912413630459660, -0.973901066201087410, -0.973889716336962530, -0.973878364038113230, -0.973867009304568150, -0.973855652136355500, +-0.973844292533503800, -0.973832930496041360, -0.973821566023996610, -0.973810199117397860, -0.973798829776273740, -0.973787458000652470, -0.973776083790562570, -0.973764707146032250, +-0.973753328067090360, -0.973741946553765110, -0.973730562606085040, -0.973719176224078550, -0.973707787407773970, -0.973696396157200050, -0.973685002472385210, -0.973673606353357870, +-0.973662207800146450, -0.973650806812779600, -0.973639403391285630, -0.973627997535693180, -0.973616589246030780, -0.973605178522326860, -0.973593765364609840, -0.973582349772908580, +-0.973570931747251400, -0.973559511287666930, -0.973548088394183720, -0.973536663066830180, -0.973525235305634950, -0.973513805110626680, -0.973502372481834020, -0.973490937419285270, +-0.973479499923009310, -0.973468059993034540, -0.973456617629389730, -0.973445172832103300, -0.973433725601203890, -0.973422275936720040, -0.973410823838680610, -0.973399369307114240, +-0.973387912342049360, -0.973376452943514710, -0.973364991111538960, -0.973353526846150510, -0.973342060147378450, -0.973330591015251210, -0.973319119449797540, -0.973307645451046090, +-0.973296169019025490, -0.973284690153764510, -0.973273208855291670, -0.973261725123635960, -0.973250238958825680, -0.973238750360890030, -0.973227259329857430, -0.973215765865756750, +-0.973204269968616640, -0.973192771638465850, -0.973181270875332900, -0.973169767679247010, -0.973158262050236700, -0.973146753988330730, -0.973135243493557960, -0.973123730565946920, +-0.973112215205526710, -0.973100697412325850, -0.973089177186373330, -0.973077654527697790, -0.973066129436327980, -0.973054601912292980, -0.973043071955621560, -0.973031539566342360, +-0.973020004744484360, -0.973008467490076190, -0.972996927803146950, -0.972985385683725500, -0.972973841131840490, -0.972962294147521000, -0.972950744730795680, -0.972939192881693500, +-0.972927638600243340, -0.972916081886474160, -0.972904522740414720, -0.972892961162093780, -0.972881397151540650, -0.972869830708783970, -0.972858261833852710, -0.972846690526775860, +-0.972835116787582050, -0.972823540616300720, -0.972811962012960500, -0.972800380977590250, -0.972788797510219180, -0.972777211610876160, -0.972765623279590040, -0.972754032516389810, +-0.972742439321304550, -0.972730843694363250, -0.972719245635594530, -0.972707645145027940, -0.972696042222692240, -0.972684436868616500, -0.972672829082829590, -0.972661218865360610, +-0.972649606216238420, -0.972637991135492430, -0.972626373623151410, -0.972614753679244440, -0.972603131303800720, -0.972591506496849000, -0.972579879258418600, -0.972568249588538490, +-0.972556617487237760, -0.972544982954545280, -0.972533345990490570, -0.972521706595102510, -0.972510064768410180, -0.972498420510442660, -0.972486773821229060, -0.972475124700798330, +-0.972463473149180020, -0.972451819166403000, -0.972440162752496450, -0.972428503907489470, -0.972416842631411260, -0.972405178924291010, -0.972393512786157710, -0.972381844217040660, +-0.972370173216968840, -0.972358499785971770, -0.972346823924078340, -0.972335145631317950, -0.972323464907719700, -0.972311781753312790, -0.972300096168126180, -0.972288408152189640, +-0.972276717705532030, -0.972265024828182560, -0.972253329520170520, -0.972241631781525230, -0.972229931612275890, -0.972218229012451580, -0.972206523982081850, -0.972194816521195770, +-0.972183106629822320, -0.972171394307991490, -0.972159679555732130, -0.972147962373073440, -0.972136242760044960, -0.972124520716675660, -0.972112796242995290, -0.972101069339032840, +-0.972089340004817840, -0.972077608240379360, -0.972065874045746960, -0.972054137420949820, -0.972042398366017360, -0.972030656880978890, -0.972018912965863740, -0.972007166620701190, +-0.971995417845520900, -0.971983666640352070, -0.971971913005224010, -0.971960156940166240, -0.971948398445208080, -0.971936637520378620, -0.971924874165707830, -0.971913108381224910, +-0.971901340166959170, -0.971889569522940140, -0.971877796449197140, -0.971866020945759580, -0.971854243012657100, -0.971842462649918910, -0.971830679857574430, -0.971818894635653410, +-0.971807106984185150, -0.971795316903199090, -0.971783524392724860, -0.971771729452791670, -0.971759932083429030, -0.971748132284666830, -0.971736330056534260, -0.971724525399060850, +-0.971712718312276010, -0.971700908796209520, -0.971689096850890780, -0.971677282476349210, -0.971665465672614470, -0.971653646439715860, -0.971641824777683240, -0.971630000686546150, +-0.971618174166334110, -0.971606345217076560, -0.971594513838803240, -0.971582680031543360, -0.971570843795326990, -0.971559005130183450, -0.971547164036142500, -0.971535320513233550, +-0.971523474561486360, -0.971511626180930450, -0.971499775371595490, -0.971487922133511090, -0.971476066466706920, -0.971464208371212390, -0.971452347847057470, -0.971440484894271710, +-0.971428619512884730, -0.971416751702926300, -0.971404881464425610, -0.971393008797413080, -0.971381133701917920, -0.971369256177969990, -0.971357376225598920, -0.971345493844834370, +-0.971333609035706090, -0.971321721798243830, -0.971309832132477240, -0.971297940038436060, -0.971286045516149830, -0.971274148565648750, -0.971262249186962250, -0.971250347380120060, +-0.971238443145152060, -0.971226536482088010, -0.971214627390957320, -0.971202715871790300, -0.971190801924616600, -0.971178885549465740, -0.971166966746367710, -0.971155045515352260, +-0.971143121856449240, -0.971131195769688430, -0.971119267255099560, -0.971107336312712400, -0.971095402942557030, -0.971083467144663090, -0.971071528919060680, -0.971059588265779320, +-0.971047645184848980, -0.971035699676299320, -0.971023751740160650, -0.971011801376462590, -0.970999848585235030, -0.970987893366507930, -0.970975935720310930, -0.970963975646674250, +-0.970952013145627510, -0.970940048217200810, -0.970928080861423790, -0.970916111078326760, -0.970904138867939360, -0.970892164230291790, -0.970880187165413690, -0.970868207673335150, +-0.970856225754085810, -0.970844241407696210, -0.970832254634195980, -0.970820265433615100, -0.970808273805983670, -0.970796279751331430, -0.970784283269688460, -0.970772284361084870, +-0.970760283025550510, -0.970748279263115470, -0.970736273073809610, -0.970724264457663130, -0.970712253414706130, -0.970700239944968350, -0.970688224048480100, -0.970676205725271020, +-0.970664184975371660, -0.970652161798811750, -0.970640136195621510, -0.970628108165830890, -0.970616077709470120, -0.970604044826569030, -0.970592009517157850, -0.970579971781266650, +-0.970567931618925520, -0.970555889030164430, -0.970543844015013700, -0.970531796573503520, -0.970519746705663660, -0.970507694411524620, -0.970495639691116190, -0.970483582544468540, +-0.970471522971612100, -0.970459460972576850, -0.970447396547392980, -0.970435329696090590, -0.970423260418699970, -0.970411188715251120, -0.970399114585774330, -0.970387038030299690, +-0.970374959048857290, -0.970362877641477660, -0.970350793808190890, -0.970338707549027070, -0.970326618864016610, -0.970314527753189490, -0.970302434216575800, -0.970290338254206410, +-0.970278239866111060, -0.970266139052320060, -0.970254035812863850, -0.970241930147772490, -0.970229822057076200, -0.970217711540805490, -0.970205598598990470, -0.970193483231661210, +-0.970181365438848480, -0.970169245220582340, -0.970157122576893130, -0.970144997507811020, -0.970132870013366460, -0.970120740093589510, -0.970108607748510930, -0.970096472978160820, +-0.970084335782569580, -0.970072196161767430, -0.970060054115784780, -0.970047909644652040, -0.970035762748399530, -0.970023613427057670, -0.970011461680656660, -0.969999307509226800, +-0.969987150912798970, -0.969974991891403240, -0.969962830445069920, -0.969950666573829670, -0.969938500277712450, -0.969926331556749230, -0.969914160410970230, -0.969901986840405740, +-0.969889810845086300, -0.969877632425042320, -0.969865451580304350, -0.969853268310902680, -0.969841082616867860, -0.969828894498230290, -0.969816703955020290, -0.969804510987268830, +-0.969792315595006000, -0.969780117778262340, -0.969767917537068480, -0.969755714871454840, -0.969743509781451630, -0.969731302267089810, -0.969719092328399810, -0.969706879965412160, +-0.969694665178157170, -0.969682447966665580, -0.969670228330967940, -0.969658006271094660, -0.969645781787076280, -0.969633554878943320, -0.969621325546726750, -0.969609093790456790, +-0.969596859610164060, -0.969584623005879220, -0.969572383977632900, -0.969560142525455300, -0.969547898649377630, -0.969535652349430180, -0.969523403625643600, -0.969511152478048420, +-0.969498898906675510, -0.969486642911555290, -0.969474384492718500, -0.969462123650195680, -0.969449860384017370, -0.969437594694214640, -0.969425326580817930, -0.969413056043857860, +-0.969400783083365190, -0.969388507699370460, -0.969376229891904420, -0.969363949660997930, -0.969351667006681520, -0.969339381928985940, -0.969327094427942070, -0.969314804503580320, +-0.969302512155931550, -0.969290217385026520, -0.969277920190895980, -0.969265620573570690, -0.969253318533081050, -0.969241014069458400, -0.969228707182733130, -0.969216397872936120, +-0.969204086140098120, -0.969191771984249660, -0.969179455405422050, -0.969167136403645820, -0.969154814978951620, -0.969142491131370520, -0.969130164860933170, -0.969117836167670330, +-0.969105505051612970, -0.969093171512791840, -0.969080835551237700, -0.969068497166981400, -0.969056156360053930, -0.969043813130486150, -0.969031467478308820, -0.969019119403552900, +-0.969006768906249040, -0.968994415986428100, -0.968982060644121400, -0.968969702879359460, -0.968957342692173260, -0.968944980082593780, -0.968932615050651870, -0.968920247596378290, +-0.968907877719804240, -0.968895505420960370, -0.968883130699877530, -0.968870753556587140, -0.968858373991119850, -0.968845992003506630, -0.968833607593778460, -0.968821220761966200, +-0.968808831508100710, -0.968796439832213420, -0.968784045734334960, -0.968771649214496430, -0.968759250272728690, -0.968746848909062930, -0.968734445123529910, -0.968722038916160930, +-0.968709630286986760, -0.968697219236038350, -0.968684805763347030, -0.968672389868943770, -0.968659971552859540, -0.968647550815125320, -0.968635127655772310, -0.968622702074831140, +-0.968610274072333580, -0.968597843648310250, -0.968585410802792260, -0.968572975535810900, -0.968560537847396930, -0.968548097737581770, -0.968535655206396280, -0.968523210253871670, +-0.968510762880039010, -0.968498313084929290, -0.968485860868573910, -0.968473406231003970, -0.968460949172250450, -0.968448489692344540, -0.968436027791317210, -0.968423563469200110, +-0.968411096726023990, -0.968398627561820160, -0.968386155976619810, -0.968373681970454040, -0.968361205543354140, -0.968348726695351100, -0.968336245426476340, -0.968323761736760940, +-0.968311275626235870, -0.968298787094932890, -0.968286296142882860, -0.968273802770117210, -0.968261306976666900, -0.968248808762563470, -0.968236308127837670, -0.968223805072521370, +-0.968211299596645650, -0.968198791700241590, -0.968186281383340620, -0.968173768645973820, -0.968161253488172720, -0.968148735909968420, -0.968136215911392320, -0.968123693492475400, +-0.968111168653249530, -0.968098641393745800, -0.968086111713995390, -0.968073579614029620, -0.968061045093880020, -0.968048508153577570, -0.968035968793154010, -0.968023427012640550, +-0.968010882812068600, -0.967998336191469360, -0.967985787150874240, -0.967973235690314790, -0.967960681809822200, -0.967948125509427880, -0.967935566789163040, -0.967923005649059420, +-0.967910442089148340, -0.967897876109461210, -0.967885307710029340, -0.967872736890884270, -0.967860163652057070, -0.967847587993579730, -0.967835009915483320, -0.967822429417799500, +-0.967809846500559570, -0.967797261163794940, -0.967784673407537270, -0.967772083231817850, -0.967759490636668220, -0.967746895622119910, -0.967734298188204110, -0.967721698334952810, +-0.967709096062397300, -0.967696491370569010, -0.967683884259499470, -0.967671274729219990, -0.967658662779762650, -0.967646048411158530, -0.967633431623439400, -0.967620812416636560, +-0.967608190790781750, -0.967595566745906520, -0.967582940282042280, -0.967570311399220780, -0.967557680097473450, -0.967545046376831700, -0.967532410237327500, -0.967519771678992390, +-0.967507130701857790, -0.967494487305955330, -0.967481841491316660, -0.967469193257973200, -0.967456542605957040, -0.967443889535299470, -0.967431234046032150, -0.967418576138186710, +-0.967405915811794910, -0.967393253066888280, -0.967380587903498570, -0.967367920321657300, -0.967355250321396130, -0.967342577902746910, -0.967329903065741400, -0.967317225810411020, +-0.967304546136787620, -0.967291864044902860, -0.967279179534788150, -0.967266492606475790, -0.967253803259997210, -0.967241111495384050, -0.967228417312668180, -0.967215720711881220, +-0.967203021693054940, -0.967190320256221200, -0.967177616401411640, -0.967164910128657680, -0.967152201437991850, -0.967139490329445460, -0.967126776803050260, -0.967114060858838220, +-0.967101342496840990, -0.967088621717090090, -0.967075898519617950, -0.967063172904456090, -0.967050444871636270, -0.967037714421190350, -0.967024981553150200, -0.967012246267547450, +-0.966999508564414190, -0.966986768443782170, -0.966974025905683150, -0.966961280950148880, -0.966948533577211670, -0.966935783786903040, -0.966923031579255080, -0.966910276954299430, +-0.966897519912067850, -0.966884760452592750, -0.966871998575905780, -0.966859234282038790, -0.966846467571023660, -0.966833698442892460, -0.966820926897676960, -0.966808152935409120, +-0.966795376556120910, -0.966782597759844320, -0.966769816546610870, -0.966757032916453210, -0.966744246869402970, -0.966731458405492130, -0.966718667524752550, -0.966705874227216430, +-0.966693078512915300, -0.966680280381881700, -0.966667479834147470, -0.966654676869744490, -0.966641871488704840, -0.966629063691060500, -0.966616253476843430, -0.966603440846085850, +-0.966590625798819600, -0.966577808335076560, -0.966564988454889250, -0.966552166158289540, -0.966539341445309290, -0.966526514315980690, -0.966513684770335950, -0.966500852808406590, +-0.966488018430225470, -0.966475181635824240, -0.966462342425234990, -0.966449500798490010, -0.966436656755621180, -0.966423810296660800, -0.966410961421640850, -0.966398110130593510, +-0.966385256423550660, -0.966372400300544830, -0.966359541761608100, -0.966346680806772440, -0.966333817436070050, -0.966320951649533240, -0.966308083447193770, -0.966295212829084260, +-0.966282339795236810, -0.966269464345683500, -0.966256586480456430, -0.966243706199587990, -0.966230823503110290, -0.966217938391055520, -0.966205050863455870, -0.966192160920343550, +-0.966179268561750740, -0.966166373787709860, -0.966153476598253120, -0.966140576993412600, -0.966127674973220720, -0.966114770537709440, -0.966101863686911420, -0.966088954420858740, +-0.966076042739583700, -0.966063128643118500, -0.966050212131495560, -0.966037293204746960, -0.966024371862905240, -0.966011448106002590, -0.965998521934071320, -0.965985593347143400, +-0.965972662345251810, -0.965959728928428630, -0.965946793096706060, -0.965933854850116510, -0.965920914188692080, -0.965907971112465620, -0.965895025621469230, -0.965882077715735310, +-0.965869127395296180, -0.965856174660184140, -0.965843219510431730, -0.965830261946071360, -0.965817301967135220, -0.965804339573655860, -0.965791374765665460, -0.965778407543196770, +-0.965765437906282110, -0.965752465854953890, -0.965739491389244420, -0.965726514509186230, -0.965713535214811620, -0.965700553506153360, -0.965687569383243740, -0.965674582846115070, +-0.965661593894800110, -0.965648602529331050, -0.965635608749740530, -0.965622612556060970, -0.965609613948324900, -0.965596612926564510, -0.965583609490812900, -0.965570603641102250, +-0.965557595377465110, -0.965544584699933870, -0.965531571608541310, -0.965518556103319490, -0.965505538184301510, -0.965492517851519790, -0.965479495105006640, -0.965466469944794900, +-0.965453442370916900, -0.965440412383405280, -0.965427379982292670, -0.965414345167611600, -0.965401307939394600, -0.965388268297674210, -0.965375226242483290, -0.965362181773854360, +-0.965349134891819950, -0.965336085596412710, -0.965323033887665050, -0.965309979765609950, -0.965296923230280050, -0.965283864281707760, -0.965270802919925730, -0.965257739144966820, +-0.965244672956863450, -0.965231604355648480, -0.965218533341354550, -0.965205459914014190, -0.965192384073659930, -0.965179305820325070, -0.965166225154041820, -0.965153142074843040, +-0.965140056582761470, -0.965126968677829430, -0.965113878360080220, -0.965100785629546380, -0.965087690486260530, -0.965074592930255440, -0.965061492961563960, -0.965048390580218630, +-0.965035285786252420, -0.965022178579697850, -0.965009068960588020, -0.964995956928955120, -0.964982842484832680, -0.964969725628253120, -0.964956606359249180, -0.964943484677853740, +-0.964930360584099640, -0.964917234078019440, -0.964904105159646310, -0.964890973829012900, -0.964877840086152070, -0.964864703931096690, -0.964851565363879500, -0.964838424384533490, +-0.964825280993091280, -0.964812135189585970, -0.964798986974050090, -0.964785836346516930, -0.964772683307019150, -0.964759527855589720, -0.964746369992261490, -0.964733209717067220, +-0.964720047030039770, -0.964706881931212460, -0.964693714420617910, -0.964680544498289110, -0.964667372164258910, -0.964654197418560290, -0.964641020261226220, -0.964627840692289570, +-0.964614658711783310, -0.964601474319740190, -0.964588287516193630, -0.964575098301176270, -0.964561906674721190, -0.964548712636861370, -0.964535516187629780, -0.964522317327059180, +-0.964509116055182970, -0.964495912372034030, -0.964482706277645320, -0.964469497772049820, -0.964456286855280510, -0.964443073527370580, -0.964429857788352880, -0.964416639638260630, +-0.964403419077126680, -0.964390196104984000, -0.964376970721866010, -0.964363742927805690, -0.964350512722836010, -0.964337280106989940, -0.964324045080300560, -0.964310807642801190, +-0.964297567794524910, -0.964284325535504580, -0.964271080865773510, -0.964257833785364780, -0.964244584294311480, -0.964231332392646580, -0.964218078080403500, -0.964204821357615090, +-0.964191562224314570, -0.964178300680535230, -0.964165036726310150, -0.964151770361672540, -0.964138501586655480, -0.964125230401292170, -0.964111956805615570, -0.964098680799659210, +-0.964085402383456300, -0.964072121557039810, -0.964058838320442920, -0.964045552673699070, -0.964032264616841330, -0.964018974149902900, -0.964005681272916970, -0.963992385985916740, +-0.963979088288935640, -0.963965788182006960, -0.963952485665163670, -0.963939180738439320, -0.963925873401866860, -0.963912563655479620, -0.963899251499311100, -0.963885936933394530, +-0.963872619957763080, -0.963859300572450060, -0.963845978777488790, -0.963832654572912560, -0.963819327958754800, -0.963805998935048590, -0.963792667501827240, -0.963779333659124380, +-0.963765997406973220, -0.963752658745407050, -0.963739317674459310, -0.963725974194163280, -0.963712628304551950, -0.963699280005659410, -0.963685929297518620, -0.963672576180163000, +-0.963659220653625970, -0.963645862717940840, -0.963632502373141020, -0.963619139619260050, -0.963605774456331220, -0.963592406884387850, -0.963579036903463360, -0.963565664513591490, +-0.963552289714805330, -0.963538912507138520, -0.963525532890624480, -0.963512150865296400, -0.963498766431188040, -0.963485379588332910, -0.963471990336764230, -0.963458598676515620, +-0.963445204607620510, -0.963431808130112420, -0.963418409244024780, -0.963405007949391100, -0.963391604246244930, -0.963378198134619450, -0.963364789614548740, -0.963351378686066130, +-0.963337965349204910, -0.963324549603998940, -0.963311131450481530, -0.963297710888686100, -0.963284287918646510, -0.963270862540396290, -0.963257434753968970, -0.963244004559397960, +-0.963230571956717020, -0.963217136945959560, -0.963203699527159340, -0.963190259700349880, -0.963176817465564490, -0.963163372822837260, -0.963149925772201710, -0.963136476313691260, +-0.963123024447339660, -0.963109570173180440, -0.963096113491247020, -0.963082654401573700, -0.963069192904193680, -0.963055728999140600, -0.963042262686448320, -0.963028793966150260, +-0.963015322838280290, -0.963001849302872030, -0.962988373359959130, -0.962974895009575120, -0.962961414251753970, -0.962947931086529430, -0.962934445513934920, -0.962920957534004420, +-0.962907467146771450, -0.962893974352269640, -0.962880479150533100, -0.962866981541595330, -0.962853481525490110, -0.962839979102251280, -0.962826474271912370, -0.962812967034507360, +-0.962799457390069890, -0.962785945338633820, -0.962772430880232900, -0.962758914014900660, -0.962745394742671290, -0.962731873063578550, -0.962718348977656070, -0.962704822484937720, +-0.962691293585457020, -0.962677762279248390, -0.962664228566345370, -0.962650692446781700, -0.962637153920591350, -0.962623612987808070, -0.962610069648465850, -0.962596523902598420, +-0.962582975750239660, -0.962569425191423410, -0.962555872226183440, -0.962542316854554050, -0.962528759076568760, -0.962515198892261670, -0.962501636301666630, -0.962488071304817390, +-0.962474503901747710, -0.962460934092492120, -0.962447361877084130, -0.962433787255557730, -0.962420210227946880, -0.962406630794285570, -0.962393048954607530, -0.962379464708946970, +-0.962365878057337750, -0.962352288999813620, -0.962338697536408880, -0.962325103667157510, -0.962311507392093370, -0.962297908711250430, -0.962284307624662770, -0.962270704132364040, +-0.962257098234388870, -0.962243489930770910, -0.962229879221544240, -0.962216266106742820, -0.962202650586400750, -0.962189032660552000, -0.962175412329230760, -0.962161789592471010, +-0.962148164450306490, -0.962134536902771840, -0.962120906949900820, -0.962107274591727510, -0.962093639828286110, -0.962080002659610470, -0.962066363085734680, -0.962052721106693150, +-0.962039076722519870, -0.962025429933248910, -0.962011780738914360, -0.961998129139550410, -0.961984475135191030, -0.961970818725870540, -0.961957159911623010, -0.961943498692482520, +-0.961929835068483060, -0.961916169039659260, -0.961902500606045100, -0.961888829767674650, -0.961875156524582110, -0.961861480876801460, -0.961847802824367330, -0.961834122367313690, +-0.961820439505674750, -0.961806754239484700, -0.961793066568777720, -0.961779376493588130, -0.961765684013950130, -0.961751989129897900, -0.961738291841465640, -0.961724592148687440, +-0.961710890051598040, -0.961697185550231430, -0.961683478644621780, -0.961669769334803530, -0.961656057620810740, -0.961642343502677630, -0.961628626980438940, -0.961614908054128640, +-0.961601186723781030, -0.961587462989430540, -0.961573736851111360, -0.961560008308857790, -0.961546277362704260, -0.961532544012684950, -0.961518808258834180, -0.961505070101186580, +-0.961491329539776230, -0.961477586574637550, -0.961463841205804970, -0.961450093433312780, -0.961436343257195180, -0.961422590677486920, -0.961408835694222090, -0.961395078307435310, +-0.961381318517160690, -0.961367556323432850, -0.961353791726286210, -0.961340024725754970, -0.961326255321873660, -0.961312483514676570, -0.961298709304198360, -0.961284932690473550, +-0.961271153673536330, -0.961257372253421230, -0.961243588430162670, -0.961229802203794950, -0.961216013574352930, -0.961202222541870820, -0.961188429106383250, -0.961174633267924630, +-0.961160835026529380, -0.961147034382232040, -0.961133231335067120, -0.961119425885069050, -0.961105618032272570, -0.961091807776711660, -0.961077995118421510, -0.961064180057436430, +-0.961050362593790840, -0.961036542727519370, -0.961022720458656330, -0.961008895787236690, -0.960995068713294760, -0.960981239236865290, -0.960967407357982580, -0.960953573076681500, +-0.960939736392996350, -0.960925897306961980, -0.960912055818612830, -0.960898211927983410, -0.960884365635108370, -0.960870516940022680, -0.960856665842760640, -0.960842812343356890, +-0.960828956441846180, -0.960815098138263050, -0.960801237432641900, -0.960787374325017930, -0.960773508815425560, -0.960759640903899310, -0.960745770590474060, -0.960731897875184320, +-0.960718022758064950, -0.960704145239150380, -0.960690265318475570, -0.960676382996074720, -0.960662498271983250, -0.960648611146235560, -0.960634721618866320, -0.960620829689910250, +-0.960606935359402110, -0.960593038627376330, -0.960579139493868310, -0.960565237958912350, -0.960551334022543330, -0.960537427684796000, -0.960523518945705090, -0.960509607805305370, +-0.960495694263631680, -0.960481778320718680, -0.960467859976601000, -0.960453939231313950, -0.960440016084892050, -0.960426090537370160, -0.960412162588782920, -0.960398232239165320, +-0.960384299488551970, -0.960370364336978090, -0.960356426784478190, -0.960342486831087360, -0.960328544476840240, -0.960314599721771800, -0.960300652565916790, -0.960286703009310180, +-0.960272751051986840, -0.960258796693981620, -0.960244839935329160, -0.960230880776064890, -0.960216919216223320, -0.960202955255839540, -0.960188988894948300, -0.960175020133584360, +-0.960161048971783230, -0.960147075409579330, -0.960133099447007870, -0.960119121084103580, -0.960105140320901440, -0.960091157157436540, -0.960077171593743730, -0.960063183629857870, +-0.960049193265814170, -0.960035200501647260, -0.960021205337392550, -0.960007207773084790, -0.959993207808759070, -0.959979205444450370, -0.959965200680193640, -0.959951193516023650, +-0.959937183951975800, -0.959923171988085190, -0.959909157624386560, -0.959895140860914990, -0.959881121697705560, -0.959867100134793370, -0.959853076172213490, -0.959839049810000900, +-0.959825021048190340, -0.959810989886817570, -0.959796956325917330, -0.959782920365524590, -0.959768882005674670, -0.959754841246402530, -0.959740798087742930, -0.959726752529731720, +-0.959712704572403540, -0.959698654215793590, -0.959684601459937060, -0.959670546304869030, -0.959656488750624590, -0.959642428797238930, -0.959628366444747250, -0.959614301693184400, +-0.959600234542586030, -0.959586164992987100, -0.959572093044422700, -0.959558018696928140, -0.959543941950538490, -0.959529862805288740, -0.959515781261214510, -0.959501697318350890, +-0.959487610976733070, -0.959473522236396150, -0.959459431097375530, -0.959445337559706180, -0.959431241623423640, -0.959417143288562870, -0.959403042555159290, -0.959388939423247880, +-0.959374833892864380, -0.959360725964043760, -0.959346615636821330, -0.959332502911232400, -0.959318387787311930, -0.959304270265095680, -0.959290150344618840, -0.959276028025916610, +-0.959261903309024280, -0.959247776193977280, -0.959233646680810790, -0.959219514769560130, -0.959205380460260710, -0.959191243752947840, -0.959177104647656600, -0.959162963144422950, +-0.959148819243281770, -0.959134672944268570, -0.959120524247418670, -0.959106373152767590, -0.959092219660350190, -0.959078063770202550, -0.959063905482359760, -0.959049744796857120, +-0.959035581713730160, -0.959021416233014290, -0.959007248354744820, -0.958993078078957280, -0.958978905405687090, -0.958964730334969320, -0.958950552866839940, -0.958936373001334270, +-0.958922190738487610, -0.958908006078335480, -0.958893819020913310, -0.958879629566256390, -0.958865437714400580, -0.958851243465381310, -0.958837046819233760, -0.958822847775993690, +-0.958808646335696510, -0.958794442498377640, -0.958780236264072720, -0.958766027632817260, -0.958751816604646480, -0.958737603179596330, -0.958723387357702130, -0.958709169138999620, +-0.958694948523524100, -0.958680725511311230, -0.958666500102396180, -0.958652272296815270, -0.958638042094603680, -0.958623809495796840, -0.958609574500430610, -0.958595337108540390, +-0.958581097320161950, -0.958566855135330580, -0.958552610554082140, -0.958538363576452280, -0.958524114202476190, -0.958509862432190050, -0.958495608265629180, -0.958481351702829440, +-0.958467092743826240, -0.958452831388655000, -0.958438567637352020, -0.958424301489952610, -0.958410032946492410, -0.958395762007007160, -0.958381488671532500, -0.958367212940104190, +-0.958352934812757740, -0.958338654289528910, -0.958324371370453560, -0.958310086055567000, -0.958295798344905530, -0.958281508238504440, -0.958267215736399610, -0.958252920838626790, +-0.958238623545221710, -0.958224323856219810, -0.958210021771657260, -0.958195717291569720, -0.958181410415992810, -0.958167101144962510, -0.958152789478514340, -0.958138475416684290, +-0.958124158959507980, -0.958109840107021270, -0.958095518859259700, -0.958081195216259670, -0.958066869178056610, -0.958052540744686380, -0.958038209916184820, -0.958023876692587710, +-0.958009541073930550, -0.957995203060249880, -0.957980862651581220, -0.957966519847960440, -0.957952174649423280, -0.957937827056005720, -0.957923477067743610, -0.957909124684672820, +-0.957894769906829200, -0.957880412734248400, -0.957866053166966820, -0.957851691205020120, -0.957837326848444140, -0.957822960097274860, -0.957808590951548240, -0.957794219411299830, +-0.957779845476566140, -0.957765469147382810, -0.957751090423785920, -0.957736709305811230, -0.957722325793494700, -0.957707939886872420, -0.957693551585980350, -0.957679160890854250, +-0.957664767801530430, -0.957650372318044290, -0.957635974440432580, -0.957621574168730840, -0.957607171502975250, -0.957592766443201680, -0.957578358989445880, -0.957563949141744590, +-0.957549536900133340, -0.957535122264648210, -0.957520705235325290, -0.957506285812200650, -0.957491863995310280, -0.957477439784690240, -0.957463013180376630, -0.957448584182405420, +-0.957434152790812560, -0.957419719005634610, -0.957405282826907290, -0.957390844254666810, -0.957376403288949130, -0.957361959929790340, -0.957347514177226740, -0.957333066031294420, +-0.957318615492029460, -0.957304162559468040, -0.957289707233646040, -0.957275249514599860, -0.957260789402365590, -0.957246326896979300, -0.957231861998477210, -0.957217394706895150, +-0.957202925022270000, -0.957188452944637390, -0.957173978474033740, -0.957159501610495120, -0.957145022354057740, -0.957130540704757560, -0.957116056662631220, -0.957101570227714800, +-0.957087081400044500, -0.957072590179656400, -0.957058096566586910, -0.957043600560872120, -0.957029102162548330, -0.957014601371651840, -0.957000098188218520, -0.956985592612285220, +-0.956971084643888030, -0.956956574283063020, -0.956942061529846620, -0.956927546384275020, -0.956913028846384410, -0.956898508916211420, -0.956883986593792150, -0.956869461879162890, +-0.956854934772360060, -0.956840405273419850, -0.956825873382378570, -0.956811339099272630, -0.956796802424138340, -0.956782263357011890, -0.956767721897929910, -0.956753178046928720, +-0.956738631804044500, -0.956724083169313790, -0.956709532142772770, -0.956694978724457750, -0.956680422914405470, -0.956665864712652250, -0.956651304119234270, -0.956636741134188060, +-0.956622175757549930, -0.956607607989356400, -0.956593037829643890, -0.956578465278448810, -0.956563890335807580, -0.956549313001756270, -0.956534733276331980, -0.956520151159570790, +-0.956505566651509320, -0.956490979752183890, -0.956476390461630800, -0.956461798779886910, -0.956447204706988630, -0.956432608242972270, -0.956418009387874360, -0.956403408141731530, +-0.956388804504580080, -0.956374198476456660, -0.956359590057397790, -0.956344979247439890, -0.956330366046619250, -0.956315750454972970, -0.956301132472537340, -0.956286512099348900, +-0.956271889335444160, -0.956257264180859660, -0.956242636635631800, -0.956228006699797570, -0.956213374373393380, -0.956198739656455740, -0.956184102549021200, -0.956169463051126380, +-0.956154821162807920, -0.956140176884102470, -0.956125530215046540, -0.956110881155676550, -0.956096229706029590, -0.956081575866142060, -0.956066919636050620, -0.956052261015791880, +-0.956037600005402390, -0.956022936604918770, -0.956008270814378000, -0.955993602633816610, -0.955978932063271110, -0.955964259102778380, -0.955949583752374930, -0.955934906012097630, +-0.955920225881982890, -0.955905543362067790, -0.955890858452388410, -0.955876171152982180, -0.955861481463885610, -0.955846789385135230, -0.955832094916767900, -0.955817398058820380, +-0.955802698811329070, -0.955787997174331270, -0.955773293147863520, -0.955758586731962460, -0.955743877926665040, -0.955729166732007810, -0.955714453148027720, -0.955699737174761530, +-0.955685018812245990, -0.955670298060517840, -0.955655574919613730, -0.955640849389570950, -0.955626121470426030, -0.955611391162215830, -0.955596658464977100, -0.955581923378746480, +-0.955567185903561380, -0.955552446039458210, -0.955537703786474070, -0.955522959144645580, -0.955508212114009710, -0.955493462694603220, -0.955478710886463190, -0.955463956689626360, +-0.955449200104129590, -0.955434441130009640, -0.955419679767303800, -0.955404916016048710, -0.955390149876281350, -0.955375381348038680, -0.955360610431357560, -0.955345837126274630, +-0.955331061432827310, -0.955316283351052340, -0.955301502880986700, -0.955286720022667350, -0.955271934776131150, -0.955257147141415190, -0.955242357118556210, -0.955227564707591400, +-0.955212769908557520, -0.955197972721491870, -0.955183173146431310, -0.955168371183412800, -0.955153566832473430, -0.955138760093650060, -0.955123950966979550, -0.955109139452499530, +-0.955094325550246540, -0.955079509260257750, -0.955064690582570260, -0.955049869517220930, -0.955035046064247050, -0.955020220223685490, -0.955005391995573330, -0.954990561379947530, +-0.954975728376845520, -0.954960892986304270, -0.954946055208360620, -0.954931215043052010, -0.954916372490415280, -0.954901527550487410, -0.954886680223305920, -0.954871830508907780, +-0.954856978407329970, -0.954842123918609790, -0.954827267042784310, -0.954812407779890630, -0.954797546129966030, -0.954782682093047400, -0.954767815669172240, -0.954752946858377080, +-0.954738075660700010, -0.954723202076177670, -0.954708326104847350, -0.954693447746746140, -0.954678567001911120, -0.954663683870379920, -0.954648798352189520, -0.954633910447377110, +-0.954619020155979880, -0.954604127478035140, -0.954589232413580070, -0.954574334962651980, -0.954559435125288070, -0.954544532901525520, -0.954529628291401310, -0.954514721294953410, +-0.954499811912218550, -0.954484900143234280, -0.954469985988037780, -0.954455069446666250, -0.954440150519156870, -0.954425229205547290, -0.954410305505874690, -0.954395379420176270, +-0.954380450948489440, -0.954365520090851520, -0.954350586847299790, -0.954335651217871560, -0.954320713202604140, -0.954305772801534720, -0.954290830014701160, -0.954275884842140540, +-0.954260937283890160, -0.954245987339987560, -0.954231035010469800, -0.954216080295374300, -0.954201123194738820, -0.954186163708600650, -0.954171201836997000, -0.954156237579965260, +-0.954141270937542970, -0.954126301909767550, -0.954111330496676400, -0.954096356698306840, -0.954081380514696150, -0.954066401945882330, -0.954051420991902430, -0.954036437652794000, +-0.954021451928594440, -0.954006463819341400, -0.953991473325071840, -0.953976480445823840, -0.953961485181634590, -0.953946487532541740, -0.953931487498582590, -0.953916485079794760, +-0.953901480276215690, -0.953886473087882990, -0.953871463514833980, -0.953856451557106410, -0.953841437214737460, -0.953826420487765110, -0.953811401376226780, -0.953796379880159970, +-0.953781355999602120, -0.953766329734590630, -0.953751301085163590, -0.953736270051358300, -0.953721236633212400, -0.953706200830763410, -0.953691162644048850, -0.953676122073106370, +-0.953661079117973600, -0.953646033778688170, -0.953630986055287620, -0.953615935947809360, -0.953600883456291460, -0.953585828580771460, -0.953570771321286870, -0.953555711677875340, +-0.953540649650574500, -0.953525585239421770, -0.953510518444455340, -0.953495449265712610, -0.953480377703231240, -0.953465303757048970, -0.953450227427203530, -0.953435148713732360, +-0.953420067616673420, -0.953404984136064230, -0.953389898271942430, -0.953374810024346100, -0.953359719393312650, -0.953344626378880070, -0.953329530981085750, -0.953314433199967670, +-0.953299333035563360, -0.953284230487910780, -0.953269125557047790, -0.953254018243011920, -0.953238908545841030, -0.953223796465572870, -0.953208682002245180, -0.953193565155895820, +-0.953178445926562530, -0.953163324314282860, -0.953148200319095080, -0.953133073941036860, -0.953117945180146030, -0.953102814036460240, -0.953087680510017470, -0.953072544600855220, +-0.953057406309011810, -0.953042265634524990, -0.953027122577432380, -0.953011977137772080, -0.952996829315581830, -0.952981679110899370, -0.952966526523762900, -0.952951371554210060, +-0.952936214202278700, -0.952921054468006570, -0.952905892351432190, -0.952890727852592880, -0.952875560971526920, -0.952860391708271970, -0.952845220062865870, -0.952830046035346930, +-0.952814869625752790, -0.952799690834121530, -0.952784509660491110, -0.952769326104899390, -0.952754140167384360, -0.952738951847983960, -0.952723761146736180, -0.952708568063678980, +-0.952693372598850120, -0.952678174752288110, -0.952662974524030590, -0.952647771914115650, -0.952632566922581360, -0.952617359549465580, -0.952602149794806170, -0.952586937658641660, +-0.952571723141009800, -0.952556506241948650, -0.952541286961496200, -0.952526065299690530, -0.952510841256569710, -0.952495614832171710, -0.952480386026534840, -0.952465154839696630, +-0.952449921271695810, -0.952434685322570140, -0.952419446992357810, -0.952404206281096900, -0.952388963188825490, -0.952373717715581320, -0.952358469861403160, -0.952343219626328840, +-0.952327967010396460, -0.952312712013644200, -0.952297454636110040, -0.952282194877832390, -0.952266932738849100, -0.952251668219198600, -0.952236401318918620, -0.952221132038047920, +-0.952205860376624360, -0.952190586334686230, -0.952175309912271620, -0.952160031109418600, -0.952144749926165380, -0.952129466362550470, -0.952114180418611960, -0.952098892094387920, +-0.952083601389916770, -0.952068308305236480, -0.952053012840385460, -0.952037714995402020, -0.952022414770324230, -0.952007112165190290, -0.951991807180038400, -0.951976499814907280, +-0.951961190069834930, -0.951945877944859520, -0.951930563440019470, -0.951915246555352650, -0.951899927290898120, -0.951884605646693750, -0.951869281622777730, -0.951853955219188700, +-0.951838626435964620, -0.951823295273144020, -0.951807961730765210, -0.951792625808866480, -0.951777287507486250, -0.951761946826662490, -0.951746603766434050, -0.951731258326839250, +-0.951715910507916150, -0.951700560309703400, -0.951685207732239190, -0.951669852775561710, -0.951654495439709810, -0.951639135724721810, -0.951623773630635880, -0.951608409157490450, +-0.951593042305324150, -0.951577673074175070, -0.951562301464081940, -0.951546927475083070, -0.951531551107216540, -0.951516172360521440, -0.951500791235035840, -0.951485407730798370, +-0.951470021847847240, -0.951454633586221180, -0.951439242945958160, -0.951423849927097390, -0.951408454529677040, -0.951393056753735420, -0.951377656599311280, -0.951362254066442930, +-0.951346849155168980, -0.951331441865527870, -0.951316032197558230, -0.951300620151298130, -0.951285205726786880, -0.951269788924062440, -0.951254369743163690, -0.951238948184128910, +-0.951223524246996850, -0.951208097931805610, -0.951192669238594470, -0.951177238167401630, -0.951161804718265720, -0.951146368891225280, -0.951130930686318930, -0.951115490103585310, +-0.951100047143062840, -0.951084601804790370, -0.951069154088806320, -0.951053703995149100, -0.951038251523857900, -0.951022796674971140, -0.951007339448527330, -0.950991879844565240, +-0.950976417863123040, -0.950960953504240260, -0.950945486767954980, -0.950930017654305960, -0.950914546163331930, -0.950899072295071530, -0.950883596049563410, -0.950868117426846400, +-0.950852636426959050, -0.950837153049940100, -0.950821667295827950, -0.950806179164662040, -0.950790688656480530, -0.950775195771322410, -0.950759700509226200, -0.950744202870230870, +-0.950728702854374610, -0.950713200461696940, -0.950697695692236280, -0.950682188546031370, -0.950666679023121080, -0.950651167123543920, -0.950635652847338970, -0.950620136194544880, +-0.950604617165200390, -0.950589095759344140, -0.950573571977015310, -0.950558045818252650, -0.950542517283094910, -0.950526986371580840, -0.950511453083749290, -0.950495917419638790, +-0.950480379379288860, -0.950464838962737920, -0.950449296170024830, -0.950433751001188650, -0.950418203456268040, -0.950402653535301840, -0.950387101238329040, -0.950371546565388580, +-0.950355989516518900, -0.950340430091759500, -0.950324868291149040, -0.950309304114726470, -0.950293737562530550, -0.950278168634600350, -0.950262597330974400, -0.950247023651692340, +-0.950231447596792680, -0.950215869166314290, -0.950200288360296350, -0.950184705178777620, -0.950169119621797180, -0.950153531689393870, -0.950137941381606790, -0.950122348698474890, +-0.950106753640036830, -0.950091156206332110, -0.950075556397399490, -0.950059954213278050, -0.950044349654006640, -0.950028742719624120, -0.950013133410170020, -0.949997521725683190, +-0.949981907666202390, -0.949966291231766900, -0.949950672422415710, -0.949935051238187780, -0.949919427679122300, -0.949903801745258130, -0.949888173436634560, -0.949872542753290250, +-0.949856909695264820, -0.949841274262597120, -0.949825636455326360, -0.949809996273491390, -0.949794353717131390, -0.949778708786285340, -0.949763061480992770, -0.949747411801292520, +-0.949731759747223680, -0.949716105318825550, -0.949700448516137110, -0.949684789339197530, -0.949669127788046020, -0.949653463862721650, -0.949637797563263390, -0.949622128889710870, +-0.949606457842103070, -0.949590784420479170, -0.949575108624878150, -0.949559430455339530, -0.949543749911901940, -0.949528066994605350, -0.949512381703488510, -0.949496694038590720, +-0.949481003999951170, -0.949465311587609160, -0.949449616801603890, -0.949433919641974540, -0.949418220108760420, -0.949402518202000500, -0.949386813921734520, -0.949371107268001560, +-0.949355398240840700, -0.949339686840291460, -0.949323973066392930, -0.949308256919184300, -0.949292538398705200, -0.949276817504994820, -0.949261094238092350, -0.949245368598037210, +-0.949229640584868580, -0.949213910198625890, -0.949198177439348310, -0.949182442307075380, -0.949166704801846390, -0.949150964923700320, -0.949135222672677140, -0.949119478048815910, +-0.949103731052155950, -0.949087981682736670, -0.949072229940597150, -0.949056475825777350, -0.949040719338316240, -0.949024960478253470, -0.949009199245628320, -0.948993435640480110, +-0.948977669662848360, -0.948961901312772360, -0.948946130590291650, -0.948930357495445630, -0.948914582028273390, -0.948898804188815000, -0.948883023977109660, -0.948867241393196670, +-0.948851456437115550, -0.948835669108905600, -0.948819879408606790, -0.948804087336258210, -0.948788292891899370, -0.948772496075569900, -0.948756696887309130, -0.948740895327156660, +-0.948725091395151930, -0.948709285091334450, -0.948693476415743750, -0.948677665368419130, -0.948661851949400560, -0.948646036158727450, -0.948630217996439100, -0.948614397462575360, +-0.948598574557175560, -0.948582749280279080, -0.948566921631925910, -0.948551091612155560, -0.948535259221007450, -0.948519424458521110, -0.948503587324736270, -0.948487747819692470, +-0.948471905943429340, -0.948456061695986400, -0.948440215077403060, -0.948424366087719410, -0.948408514726974850, -0.948392660995209020, -0.948376804892461570, -0.948360946418772110, +-0.948345085574179960, -0.948329222358725300, -0.948313356772447660, -0.948297488815386670, -0.948281618487581970, -0.948265745789073190, -0.948249870719899970, -0.948233993280102160, +-0.948218113469719400, -0.948202231288791330, -0.948186346737357360, -0.948170459815457780, -0.948154570523132120, -0.948138678860420030, -0.948122784827361230, -0.948106888423995150, +-0.948090989650362090, -0.948075088506501680, -0.948059184992453450, -0.948043279108257360, -0.948027370853953060, -0.948011460229580270, -0.947995547235178760, -0.947979631870788490, +-0.947963714136449200, -0.947947794032200200, -0.947931871558082120, -0.947915946714134260, -0.947900019500396600, -0.947884089916908870, -0.947868157963710600, -0.947852223640842210, +-0.947836286948343320, -0.947820347886253690, -0.947804406454613280, -0.947788462653461730, -0.947772516482839110, -0.947756567942785070, -0.947740617033339780, -0.947724663754542780, +-0.947708708106433930, -0.947692750089053630, -0.947676789702441400, -0.947660826946637220, -0.947644861821680950, -0.947628894327612550, -0.947612924464471540, -0.947596952232298670, +-0.947580977631133250, -0.947565000661015460, -0.947549021321985150, -0.947533039614082420, -0.947517055537346890, -0.947501069091818860, -0.947485080277538080, -0.947469089094544410, +-0.947453095542878150, -0.947437099622579270, -0.947421101333687620, -0.947405100676243170, -0.947389097650286120, -0.947373092255855860, -0.947357084492993270, -0.947341074361737870, +-0.947325061862129840, -0.947309046994209150, -0.947293029758015880, -0.947277010153590000, -0.947260988180971600, -0.947244963840200740, -0.947228937131317170, -0.947212908054361540, +-0.947196876609373680, -0.947180842796393590, -0.947164806615461320, -0.947148768066617190, -0.947132727149900710, -0.947116683865352860, -0.947100638213013160, -0.947084590192921900, +-0.947068539805119180, -0.947052487049645060, -0.947036431926539860, -0.947020374435843420, -0.947004314577596150, -0.946988252351838030, -0.946972187758609030, -0.946956120797949890, +-0.946940051469900350, -0.946923979774500710, -0.946907905711791180, -0.946891829281811590, -0.946875750484602710, -0.946859669320204380, -0.946843585788656910, -0.946827499890000480, +-0.946811411624275400, -0.946795320991521640, -0.946779227991779710, -0.946763132625089600, -0.946747034891491700, -0.946730934791025990, -0.946714832323733100, -0.946698727489653220, +-0.946682620288826550, -0.946666510721293260, -0.946650398787093670, -0.946634284486267850, -0.946618167818856660, -0.946602048784899950, -0.946585927384438140, -0.946569803617511530, +-0.946553677484160420, -0.946537548984425100, -0.946521418118345890, -0.946505284885963190, -0.946489149287316980, -0.946473011322448100, -0.946456870991396860, -0.946440728294203340, +-0.946424583230907950, -0.946408435801551210, -0.946392286006172980, -0.946376133844814340, -0.946359979317515480, -0.946343822424316580, -0.946327663165258180, -0.946311501540380570, +-0.946295337549724170, -0.946279171193329490, -0.946263002471236850, -0.946246831383486420, -0.946230657930119290, -0.946214482111175430, -0.946198303926695350, -0.946182123376719590, +-0.946165940461288430, -0.946149755180442200, -0.946133567534221840, -0.946117377522667560, -0.946101185145819870, -0.946084990403719180, -0.946068793296406030, -0.946052593823920820, +-0.946036391986304180, -0.946020187783596640, -0.946003981215838510, -0.945987772283070290, -0.945971560985332750, -0.945955347322666400, -0.945939131295111760, -0.945922912902709130, +-0.945906692145499050, -0.945890469023522470, -0.945874243536819700, -0.945858015685431370, -0.945841785469398010, -0.945825552888760130, -0.945809317943558490, -0.945793080633833380, +-0.945776840959625660, -0.945760598920975860, -0.945744354517924270, -0.945728107750512080, -0.945711858618779600, -0.945695607122767460, -0.945679353262516290, -0.945663097038066840, +-0.945646838449459180, -0.945630577496734850, -0.945614314179934020, -0.945598048499097450, -0.945581780454265770, -0.945565510045479620, -0.945549237272779730, -0.945532962136206630, +-0.945516684635801190, -0.945500404771603800, -0.945484122543655660, -0.945467837951997180, -0.945451550996669110, -0.945435261677712190, -0.945418969995167170, -0.945402675949074340, +-0.945386379539475130, -0.945370080766409940, -0.945353779629919620, -0.945337476130044820, -0.945321170266826380, -0.945304862040304950, -0.945288551450521370, -0.945272238497516400, +-0.945255923181330560, -0.945239605502005250, -0.945223285459580900, -0.945206963054098240, -0.945190638285598350, -0.945174311154121760, -0.945157981659709100, -0.945141649802401780, +-0.945125315582240330, -0.945108978999265600, -0.945092640053518450, -0.945076298745039730, -0.945059955073870190, -0.945043609040050800, -0.945027260643622300, -0.945010909884625770, +-0.944994556763101620, -0.944978201279091380, -0.944961843432635670, -0.944945483223775360, -0.944929120652551300, -0.944912755719004130, -0.944896388423175360, -0.944880018765105630, +-0.944863646744835920, -0.944847272362406950, -0.944830895617859930, -0.944814516511235600, -0.944798135042575040, -0.944781751211919100, -0.944765365019308860, -0.944748976464784840, +-0.944732585548388680, -0.944716192270161010, -0.944699796630142920, -0.944683398628375360, -0.944666998264899190, -0.944650595539755390, -0.944634190452985250, -0.944617783004629730, +-0.944601373194729700, -0.944584961023326340, -0.944568546490460400, -0.944552129596173300, -0.944535710340505760, -0.944519288723498880, -0.944502864745193630, -0.944486438405631400, +-0.944470009704853180, -0.944453578642899800, -0.944437145219812590, -0.944420709435632500, -0.944404271290400280, -0.944387830784157670, -0.944371387916945530, -0.944354942688804930, +-0.944338495099776960, -0.944322045149902810, -0.944305592839223440, -0.944289138167780150, -0.944272681135614020, -0.944256221742765910, -0.944239759989277450, -0.944223295875189720, +-0.944206829400543680, -0.944190360565380530, -0.944173889369741560, -0.944157415813667520, -0.944140939897200270, -0.944124461620380550, -0.944107980983249770, -0.944091497985849130, +-0.944075012628219580, -0.944058524910402650, -0.944042034832439310, -0.944025542394370860, -0.944009047596238600, -0.943992550438083500, -0.943976050919947180, -0.943959549041870850, +-0.943943044803895570, -0.943926538206062760, -0.943910029248413160, -0.943893517930988970, -0.943877004253830810, -0.943860488216980320, -0.943843969820478470, -0.943827449064366770, +-0.943810925948686430, -0.943794400473478730, -0.943777872638785100, -0.943761342444646710, -0.943744809891104650, -0.943728274978201000, -0.943711737705976610, -0.943695198074472770, +-0.943678656083731030, -0.943662111733792660, -0.943645565024698650, -0.943629015956491070, -0.943612464529210990, -0.943595910742899720, -0.943579354597598670, -0.943562796093349140, +-0.943546235230192760, -0.943529672008170730, -0.943513106427324550, -0.943496538487695210, -0.943479968189325000, -0.943463395532254670, -0.943446820516525950, -0.943430243142180270, +-0.943413663409258810, -0.943397081317802980, -0.943380496867854750, -0.943363910059455300, -0.943347320892646060, -0.943330729367468420, -0.943314135483964030, -0.943297539242174410, +-0.943280940642140740, -0.943264339683904880, -0.943247736367507810, -0.943231130692991690, -0.943214522660397740, -0.943197912269767570, -0.943181299521142490, -0.943164684414564250, +-0.943148066950073920, -0.943131447127713800, -0.943114824947525080, -0.943098200409549170, -0.943081573513827930, -0.943064944260402660, -0.943048312649314990, -0.943031678680606560, +-0.943015042354318990, -0.942998403670493810, -0.942981762629172330, -0.942965119230396720, -0.942948473474208290, -0.942931825360648680, -0.942915174889759510, -0.942898522061582090, +-0.942881866876158710, -0.942865209333530680, -0.942848549433739520, -0.942831887176827090, -0.942815222562834900, -0.942798555591804700, -0.942781886263778010, -0.942765214578796700, +-0.942748540536902270, -0.942731864138136260, -0.942715185382540950, -0.942698504270157560, -0.942681820801027910, -0.942665134975193770, -0.942648446792696770, -0.942631756253578310, +-0.942615063357880810, -0.942598368105645680, -0.942581670496914550, -0.942564970531729380, -0.942548268210131600, -0.942531563532163270, -0.942514856497866040, -0.942498147107281640, +-0.942481435360451590, -0.942464721257418200, -0.942448004798222990, -0.942431285982907820, -0.942414564811514420, -0.942397841284084660, -0.942381115400659940, -0.942364387161282790, +-0.942347656565994620, -0.942330923614837280, -0.942314188307852740, -0.942297450645082630, -0.942280710626568930, -0.942263968252353480, -0.942247223522478030, -0.942230476436984320, +-0.942213726995914660, -0.942196975199310670, -0.942180221047214330, -0.942163464539667260, -0.942146705676711660, -0.942129944458389050, -0.942113180884741830, -0.942096414955811530, +-0.942079646671640350, -0.942062876032270010, -0.942046103037742500, -0.942029327688099660, -0.942012549983383570, -0.941995769923636090, -0.941978987508899190, -0.941962202739214490, +-0.941945415614624640, -0.941928626135171140, -0.941911834300896200, -0.941895040111841660, -0.941878243568049170, -0.941861444669561340, -0.941844643416419940, -0.941827839808666910, +-0.941811033846344350, -0.941794225529494210, -0.941777414858158470, -0.941760601832379200, -0.941743786452198360, -0.941726968717658150, -0.941710148628800090, -0.941693326185667030, +-0.941676501388300720, -0.941659674236743130, -0.941642844731036320, -0.941626012871222380, -0.941609178657343170, -0.941592342089441310, -0.941575503167558560, -0.941558661891736980, +-0.941541818262018880, -0.941524972278446230, -0.941508123941060980, -0.941491273249905560, -0.941474420205022030, -0.941457564806452040, -0.941440707054238430, -0.941423846948423070, +-0.941406984489048140, -0.941390119676155710, -0.941373252509787980, -0.941356382989986810, -0.941339511116794920, -0.941322636890254420, -0.941305760310407250, -0.941288881377295610, +-0.941272000090961790, -0.941255116451447990, -0.941238230458796400, -0.941221342113049310, -0.941204451414248470, -0.941187558362436840, -0.941170662957656280, -0.941153765199949090, +-0.941136865089357570, -0.941119962625923790, -0.941103057809689840, -0.941086150640698450, -0.941069241118991820, -0.941052329244612020, -0.941035415017601350, -0.941018498438002230, +-0.941001579505856830, -0.940984658221207470, -0.940967734584096550, -0.940950808594566150, -0.940933880252658560, -0.940916949558416540, -0.940900016511882040, -0.940883081113097600, +-0.940866143362105390, -0.940849203258947610, -0.940832260803667110, -0.940815315996305860, -0.940798368836906370, -0.940781419325511070, -0.940764467462162140, -0.940747513246901980, +-0.940730556679773120, -0.940713597760817870, -0.940696636490078510, -0.940679672867597350, -0.940662706893417360, -0.940645738567580490, -0.940628767890129390, -0.940611794861106240, +-0.940594819480553680, -0.940577841748513780, -0.940560861665029610, -0.940543879230143150, -0.940526894443897140, -0.940509907306333770, -0.940492917817495780, -0.940475925977425350, +-0.940458931786165240, -0.940441935243757630, -0.940424936350245040, -0.940407935105670330, -0.940390931510075800, -0.940373925563503970, -0.940356917265997350, -0.940339906617598360, +-0.940322893618349310, -0.940305878268293370, -0.940288860567472740, -0.940271840515929940, -0.940254818113707480, -0.940237793360848010, -0.940220766257394040, -0.940203736803388200, +-0.940186704998873020, -0.940169670843890800, -0.940152634338484620, -0.940135595482696980, -0.940118554276570210, -0.940101510720147140, -0.940084464813470300, -0.940067416556581990, +-0.940050365949525400, -0.940033312992342940, -0.940016257685077130, -0.939999200027770710, -0.939982140020466320, -0.939965077663206580, -0.939948012956034140, -0.939930945898991620, +-0.939913876492121770, -0.939896804735467000, -0.939879730629070380, -0.939862654172974540, -0.939845575367222020, -0.939828494211855550, -0.939811410706917540, -0.939794324852451400, +-0.939777236648499330, -0.939760146095104280, -0.939743053192308770, -0.939725957940155680, -0.939708860338687610, -0.939691760387947550, -0.939674658087977900, -0.939657553438821740, +-0.939640446440521360, -0.939623337093120180, -0.939606225396660610, -0.939589111351185500, -0.939571994956737600, -0.939554876213359760, -0.939537755121094390, -0.939520631679985010, +-0.939503505890073920, -0.939486377751404200, -0.939469247264018370, -0.939452114427959620, -0.939434979243270460, -0.939417841709993870, -0.939400701828172700, -0.939383559597849470, +-0.939366415019067590, -0.939349268091869690, -0.939332118816298630, -0.939314967192397270, -0.939297813220208560, -0.939280656899774910, -0.939263498231139970, -0.939246337214346360, +-0.939229173849436830, -0.939212008136454330, -0.939194840075441850, -0.939177669666442340, -0.939160496909498540, -0.939143321804653540, -0.939126144351949970, -0.939108964551431340, +-0.939091782403140280, -0.939074597907119780, -0.939057411063412670, -0.939040221872062150, -0.939023030333110740, -0.939005836446602070, -0.938988640212578880, -0.938971441631083930, +-0.938954240702160490, -0.938937037425851440, -0.938919831802199730, -0.938902623831248560, -0.938885413513040780, -0.938868200847619460, -0.938850985835027240, -0.938833768475307970, +-0.938816548768504290, -0.938799326714659150, -0.938782102313815760, -0.938764875566016730, -0.938747646471305930, -0.938730415029725980, -0.938713181241319970, -0.938695945106130970, +-0.938678706624202160, -0.938661465795576630, -0.938644222620297340, -0.938626977098407590, -0.938609729229950340, -0.938592479014968450, -0.938575226453505660, -0.938557971545604830, +-0.938540714291309030, -0.938523454690661560, -0.938506192743705060, -0.938488928450483370, -0.938471661811039360, -0.938454392825416210, -0.938437121493657100, -0.938419847815805230, +-0.938402571791903670, -0.938385293421995730, -0.938368012706124470, -0.938350729644333300, -0.938333444236664870, -0.938316156483163240, -0.938298866383871170, -0.938281573938831940, +-0.938264279148088740, -0.938246982011684880, -0.938229682529663320, -0.938212380702067810, -0.938195076528941300, -0.938177770010327210, -0.938160461146268610, -0.938143149936808810, +-0.938125836381991210, -0.938108520481859000, -0.938091202236455590, -0.938073881645823730, -0.938056558710007480, -0.938039233429049930, -0.938021905802994160, -0.938004575831883790, +-0.937987243515761900, -0.937969908854671570, -0.937952571848656770, -0.937935232497760560, -0.937917890802026260, -0.937900546761497260, -0.937883200376216970, -0.937865851646228600, +-0.937848500571575540, -0.937831147152301310, -0.937813791388448890, -0.937796433280062240, -0.937779072827184530, -0.937761710029859200, -0.937744344888129520, -0.937726977402039030, +-0.937709607571630800, -0.937692235396948790, -0.937674860878036310, -0.937657484014936650, -0.937640104807693220, -0.937622723256349540, -0.937605339360949030, -0.937587953121535200, +-0.937570564538151460, -0.937553173610841340, -0.937535780339648020, -0.937518384724615460, -0.937500986765787080, -0.937483586463206060, -0.937466183816916150, -0.937448778826960540, +-0.937431371493383180, -0.937413961816227490, -0.937396549795536880, -0.937379135431354870, -0.937361718723724980, -0.937344299672690840, -0.937326878278295970, -0.937309454540583900, +-0.937292028459598140, -0.937274600035381990, -0.937257169267979750, -0.937239736157434500, -0.937222300703789980, -0.937204862907089600, -0.937187422767377210, -0.937169980284695890, +-0.937152535459089830, -0.937135088290602550, -0.937117638779277560, -0.937100186925158400, -0.937082732728288790, -0.937065276188712380, -0.937047817306472800, -0.937030356081613560, +-0.937012892514178300, -0.936995426604210980, -0.936977958351755120, -0.936960487756854370, -0.936943014819552440, -0.936925539539892880, -0.936908061917919310, -0.936890581953675810, +-0.936873099647205780, -0.936855614998553080, -0.936838128007761340, -0.936820638674874310, -0.936803146999935720, -0.936785652982989100, -0.936768156624078530, -0.936750657923247190, +-0.936733156880539490, -0.936715653495998830, -0.936698147769669200, -0.936680639701594100, -0.936663129291817390, -0.936645616540382590, -0.936628101447333990, -0.936610584012715240, +-0.936593064236569960, -0.936575542118942010, -0.936558017659875230, -0.936540490859413490, -0.936522961717600410, -0.936505430234479960, -0.936487896410096000, -0.936470360244491930, +-0.936452821737712270, -0.936435280889800550, -0.936417737700800610, -0.936400192170756320, -0.936382644299711300, -0.936365094087709960, -0.936347541534795820, -0.936329986641012860, +-0.936312429406405020, -0.936294869831016060, -0.936277307914889830, -0.936259743658070410, -0.936242177060601640, -0.936224608122527390, -0.936207036843891390, -0.936189463224738060, +-0.936171887265111020, -0.936154308965054360, -0.936136728324611810, -0.936119145343827560, -0.936101560022745030, -0.936083972361409060, -0.936066382359863060, -0.936048790018151110, +-0.936031195336317180, -0.936013598314405230, -0.935995998952459330, -0.935978397250523450, -0.935960793208641560, -0.935943186826857290, -0.935925578105215480, -0.935907967043759670, +-0.935890353642533920, -0.935872737901582430, -0.935855119820948930, -0.935837499400677400, -0.935819876640812450, -0.935802251541397730, -0.935784624102477420, -0.935766994324095600, +-0.935749362206296230, -0.935731727749123500, -0.935714090952621370, -0.935696451816834140, -0.935678810341805330, -0.935661166527579910, -0.935643520374201510, -0.935625871881714310, +-0.935608221050162500, -0.935590567879590160, -0.935572912370041030, -0.935555254521559850, -0.935537594334190590, -0.935519931807977430, -0.935502266942964340, -0.935484599739195620, +-0.935466930196715450, -0.935449258315567910, -0.935431584095797190, -0.935413907537447580, -0.935396228640562820, -0.935378547405187890, -0.935360863831366520, -0.935343177919143010, +-0.935325489668561550, -0.935307799079665990, -0.935290106152501300, -0.935272410887111440, -0.935254713283540480, -0.935237013341832730, -0.935219311062032380, -0.935201606444183820, +-0.935183899488331250, -0.935166190194518960, -0.935148478562791150, -0.935130764593191780, -0.935113048285765910, -0.935095329640557420, -0.935077608657610470, -0.935059885336969600, +-0.935042159678679100, -0.935024431682782710, -0.935006701349325730, -0.934988968678351910, -0.934971233669905640, -0.934953496324031350, -0.934935756640773220, -0.934918014620175760, +-0.934900270262283280, -0.934882523567140190, -0.934864774534790330, -0.934847023165279010, -0.934829269458649970, -0.934811513414947840, -0.934793755034216910, -0.934775994316501600, +-0.934758231261845980, -0.934740465870295130, -0.934722698141893130, -0.934704928076684370, -0.934687155674713280, -0.934669380936024250, -0.934651603860661820, -0.934633824448670380, +-0.934616042700094350, -0.934598258614977920, -0.934580472193366150, -0.934562683435303130, -0.934544892340833490, -0.934527098910001630, -0.934509303142852080, -0.934491505039428790, +-0.934473704599777190, -0.934455901823941230, -0.934438096711965650, -0.934420289263894750, -0.934402479479773060, -0.934384667359645200, -0.934366852903555810, -0.934349036111549180, +-0.934331216983669940, -0.934313395519962290, -0.934295571720471620, -0.934277745585241900, -0.934259917114317880, -0.934242086307744080, -0.934224253165564680, -0.934206417687824970, +-0.934188579874569270, -0.934170739725842080, -0.934152897241688150, -0.934135052422151890, -0.934117205267277930, -0.934099355777111010, -0.934081503951695760, -0.934063649791076700, +-0.934045793295298240, -0.934027934464405570, -0.934010073298443100, -0.933992209797455340, -0.933974343961487150, -0.933956475790583050, -0.933938605284787560, -0.933920732444145750, +-0.933902857268702150, -0.933884979758501490, -0.933867099913588290, -0.933849217734007310, -0.933831333219803380, -0.933813446371021040, -0.933795557187705130, -0.933777665669899950, +-0.933759771817651020, -0.933741875631002530, -0.933723977109999440, -0.933706076254686380, -0.933688173065108210, -0.933670267541309220, -0.933652359683334820, -0.933634449491229650, +-0.933616536965038320, -0.933598622104805600, -0.933580704910576320, -0.933562785382395340, -0.933544863520307300, -0.933526939324357260, -0.933509012794589420, -0.933491083931049400, +-0.933473152733781620, -0.933455219202831030, -0.933437283338242390, -0.933419345140060530, -0.933401404608329990, -0.933383461743096280, -0.933365516544403920, -0.933347569012297650, +-0.933329619146822550, -0.933311666948023480, -0.933293712415945160, -0.933275755550632580, -0.933257796352130580, -0.933239834820484120, -0.933221870955737720, -0.933203904757937020, +-0.933185936227126420, -0.933167965363351120, -0.933149992166655840, -0.933132016637085340, -0.933114038774685020, -0.933096058579499730, -0.933078076051574110, -0.933060091190953460, +-0.933042103997682500, -0.933024114471806330, -0.933006122613369900, -0.932988128422418070, -0.932970131898996020, -0.932952133043148170, -0.932934131854920470, -0.932916128334357330, +-0.932898122481503940, -0.932880114296405160, -0.932862103779106170, -0.932844090929651590, -0.932826075748087180, -0.932808058234457450, -0.932790038388807590, -0.932772016211182660, +-0.932753991701627760, -0.932735964860187840, -0.932717935686907970, -0.932699904181833240, -0.932681870345008490, -0.932663834176479360, -0.932645795676290690, -0.932627754844487460, +-0.932609711681114840, -0.932591666186218030, -0.932573618359841650, -0.932555568202031560, -0.932537515712832610, -0.932519460892289760, -0.932501403740448320, -0.932483344257353460, +-0.932465282443050160, -0.932447218297583590, -0.932429151820999060, -0.932411083013341300, -0.932393011874656170, -0.932374938404988420, -0.932356862604383440, -0.932338784472886320, +-0.932320704010542120, -0.932302621217395930, -0.932284536093493490, -0.932266448638879750, -0.932248358853599800, -0.932230266737699040, -0.932212172291222550, -0.932194075514215630, +-0.932175976406723560, -0.932157874968791540, -0.932139771200464760, -0.932121665101788290, -0.932103556672807980, -0.932085445913568790, -0.932067332824116020, -0.932049217404494870, +-0.932031099654750390, -0.932012979574928460, -0.931994857165074020, -0.931976732425232490, -0.931958605355449170, -0.931940475955769340, -0.931922344226238210, -0.931904210166901280, +-0.931886073777803860, -0.931867935058991240, -0.931849794010508490, -0.931831650632401480, -0.931813504924715490, -0.931795356887495600, -0.931777206520787330, -0.931759053824636090, +-0.931740898799086950, -0.931722741444185760, -0.931704581759977830, -0.931686419746508340, -0.931668255403822920, -0.931650088731966750, -0.931631919730985470, -0.931613748400924370, +-0.931595574741828860, -0.931577398753744010, -0.931559220436716130, -0.931541039790790060, -0.931522856816011550, -0.931504671512425770, -0.931486483880078380, -0.931468293919014420, +-0.931450101629280100, -0.931431907010920490, -0.931413710063981100, -0.931395510788507460, -0.931377309184544980, -0.931359105252139270, -0.931340898991335870, -0.931322690402180190, +-0.931304479484717400, -0.931286266238993800, -0.931268050665054470, -0.931249832762945040, -0.931231612532711030, -0.931213389974397950, -0.931195165088051110, -0.931176937873716690, +-0.931158708331439990, -0.931140476461266410, -0.931122242263241700, -0.931104005737411370, -0.931085766883821050, -0.931067525702516270, -0.931049282193542660, -0.931031036356945950, +-0.931012788192771220, -0.930994537701064880, -0.930976284881872120, -0.930958029735238780, -0.930939772261210270, -0.930921512459832120, -0.930903250331150400, -0.930884985875210620, +-0.930866719092058310, -0.930848449981739210, -0.930830178544299060, -0.930811904779783370, -0.930793628688238010, -0.930775350269708590, -0.930757069524240640, -0.930738786451879800, +-0.930720501052672340, -0.930702213326663590, -0.930683923273899370, -0.930665630894425220, -0.930647336188287100, -0.930629039155530300, -0.930610739796201240, -0.930592438110345200, +-0.930574134098008270, -0.930555827759235840, -0.930537519094073890, -0.930519208102568160, -0.930500894784764390, -0.930482579140708420, -0.930464261170445670, -0.930445940874022550, +-0.930427618251484570, -0.930409293302877580, -0.930390966028247330, -0.930372636427639790, -0.930354304501100240, -0.930335970248675200, -0.930317633670410320, -0.930299294766351310, +-0.930280953536544050, -0.930262609981034380, -0.930244264099868270, -0.930225915893091450, -0.930207565360749890, -0.930189212502889110, -0.930170857319555510, -0.930152499810794840, +-0.930134139976652950, -0.930115777817175690, -0.930097413332408920, -0.930079046522398370, -0.930060677387190450, -0.930042305926830900, -0.930023932141365580, -0.930005556030840450, +-0.929987177595301360, -0.929968796834794390, -0.929950413749365380, -0.929932028339060410, -0.929913640603925340, -0.929895250544005790, -0.929876858159348510, -0.929858463449999010, +-0.929840066416003360, -0.929821667057407650, -0.929803265374257390, -0.929784861366599210, -0.929766455034478970, -0.929748046377942620, -0.929729635397036120, -0.929711222091805460, +-0.929692806462296790, -0.929674388508556100, -0.929655968230629460, -0.929637545628562930, -0.929619120702402160, -0.929600693452193870, -0.929582263877983930, -0.929563831979818290, +-0.929545397757743140, -0.929526961211804450, -0.929508522342048060, -0.929490081148520610, -0.929471637631267940, -0.929453191790336250, -0.929434743625771610, -0.929416293137620090, +-0.929397840325927760, -0.929379385190740930, -0.929360927732105660, -0.929342467950067590, -0.929324005844673780, -0.929305541415969990, -0.929287074664002290, -0.929268605588816850, +-0.929250134190459990, -0.929231660468977430, -0.929213184424416140, -0.929194706056821750, -0.929176225366240670, -0.929157742352718970, -0.929139257016302960, -0.929120769357038800, +-0.929102279374972690, -0.929083787070150930, -0.929065292442619370, -0.929046795492424860, -0.929028296219613470, -0.929009794624231280, -0.928991290706324580, -0.928972784465939670, +-0.928954275903122410, -0.928935765017919860, -0.928917251810377880, -0.928898736280542760, -0.928880218428460800, -0.928861698254178300, -0.928843175757741560, -0.928824650939196860, +-0.928806123798590620, -0.928787594335968910, -0.928769062551378030, -0.928750528444864720, -0.928731992016475160, -0.928713453266255650, -0.928694912194252490, -0.928676368800511630, +-0.928657823085080270, -0.928639275048004360, -0.928620724689330210, -0.928602172009104220, -0.928583617007372910, -0.928565059684182460, -0.928546500039579390, -0.928527938073610000, +-0.928509373786320920, -0.928490807177758000, -0.928472238247968320, -0.928453666996998160, -0.928435093424893720, -0.928416517531701620, -0.928397939317467950, -0.928379358782239650, +-0.928360775926063030, -0.928342190748984500, -0.928323603251050340, -0.928305013432307310, -0.928286421292801700, -0.928267826832580020, -0.928249230051688800, -0.928230630950174550, +-0.928212029528083350, -0.928193425785462380, -0.928174819722357940, -0.928156211338816320, -0.928137600634884260, -0.928118987610608180, -0.928100372266034260, -0.928081754601209790, +-0.928063134616180950, -0.928044512310994160, -0.928025887685696160, -0.928007260740333460, -0.927988631474952700, -0.927969999889600160, -0.927951365984322820, -0.927932729759166630, +-0.927914091214178890, -0.927895450349406010, -0.927876807164894510, -0.927858161660690910, -0.927839513836841930, -0.927820863693393890, -0.927802211230394080, -0.927783556447888570, +-0.927764899345924320, -0.927746239924547740, -0.927727578183805580, -0.927708914123744450, -0.927690247744411110, -0.927671579045852070, -0.927652908028114180, -0.927634234691243620, +-0.927615559035287810, -0.927596881060293030, -0.927578200766306150, -0.927559518153373790, -0.927540833221542240, -0.927522145970858910, -0.927503456401370220, -0.927484764513123010, +-0.927466070306163790, -0.927447373780539430, -0.927428674936296550, -0.927409973773482110, -0.927391270292142630, -0.927372564492325080, -0.927353856374075750, -0.927335145937442040, +-0.927316433182470480, -0.927297718109207910, -0.927279000717700970, -0.927260281007996290, -0.927241558980141160, -0.927222834634182200, -0.927204107970166060, -0.927185378988139690, +-0.927166647688149940, -0.927147914070243550, -0.927129178134467270, -0.927110439880868160, -0.927091699309492870, -0.927072956420388120, -0.927054211213601210, -0.927035463689178770, +-0.927016713847167660, -0.926997961687614840, -0.926979207210567040, -0.926960450416070890, -0.926941691304174030, -0.926922929874922860, -0.926904166128364460, -0.926885400064545560, +-0.926866631683513240, -0.926847860985314240, -0.926829087969995640, -0.926810312637604270, -0.926791534988186890, -0.926772755021790910, -0.926753972738463050, -0.926735188138250400, +-0.926716401221199580, -0.926697611987357890, -0.926678820436771740, -0.926660026569488980, -0.926641230385556120, -0.926622431885020140, -0.926603631067928090, -0.926584827934326950, +-0.926566022484263780, -0.926547214717785560, -0.926528404634939350, -0.926509592235771670, -0.926490777520330380, -0.926471960488662210, -0.926453141140814120, -0.926434319476833190, +-0.926415495496766380, -0.926396669200660550, -0.926377840588563430, -0.926359009660521650, -0.926340176416582390, -0.926321340856792630, -0.926302502981199540, -0.926283662789850190, +-0.926264820282791670, -0.926245975460071150, -0.926227128321735590, -0.926208278867831970, -0.926189427098408010, -0.926170573013510470, -0.926151716613186400, -0.926132857897483120, +-0.926113996866447350, -0.926095133520126960, -0.926076267858568670, -0.926057399881819790, -0.926038529589927270, -0.926019656982938530, -0.926000782060900640, -0.925981904823860780, +-0.925963025271866140, -0.925944143404964000, -0.925925259223201120, -0.925906372726625460, -0.925887483915283860, -0.925868592789223510, -0.925849699348491710, -0.925830803593135630, +-0.925811905523202250, -0.925793005138739410, -0.925774102439794080, -0.925755197426413550, -0.925736290098645000, -0.925717380456535620, -0.925698468500132820, -0.925679554229483890, +-0.925660637644636130, -0.925641718745636390, -0.925622797532532630, -0.925603874005371920, -0.925584948164201560, -0.925566020009068850, -0.925547089540021070, -0.925528156757105200, +-0.925509221660369310, -0.925490284249860240, -0.925471344525625630, -0.925452402487712540, -0.925433458136168510, -0.925414511471040810, -0.925395562492376870, -0.925376611200223960, +-0.925357657594629180, -0.925338701675640700, -0.925319743443305360, -0.925300782897670700, -0.925281820038784120, -0.925262854866692910, -0.925243887381444250, -0.925224917583086230, +-0.925205945471666010, -0.925186971047230800, -0.925167994309828210, -0.925149015259505550, -0.925130033896310430, -0.925111050220290280, -0.925092064231492370, -0.925073075929964350, +-0.925054085315753390, -0.925035092388907470, -0.925016097149473860, -0.924997099597499980, -0.924978099733033350, -0.924959097556121160, -0.924940093066811580, -0.924921086265151680, +-0.924902077151189110, -0.924883065724971360, -0.924864051986545980, -0.924845035935960460, -0.924826017573262330, -0.924806996898499100, -0.924787973911718410, -0.924768948612967550, +-0.924749921002294470, -0.924730891079746710, -0.924711858845371770, -0.924692824299217060, -0.924673787441330330, -0.924654748271758860, -0.924635706790550850, -0.924616662997753470, +-0.924597616893414460, -0.924578568477581460, -0.924559517750302100, -0.924540464711623880, -0.924521409361594440, -0.924502351700261520, -0.924483291727672410, -0.924464229443875410, +-0.924445164848917810, -0.924426097942847250, -0.924407028725711570, -0.924387957197558170, -0.924368883358434700, -0.924349807208389220, -0.924330728747469240, -0.924311647975722520, +-0.924292564893196670, -0.924273479499939320, -0.924254391795998330, -0.924235301781421440, -0.924216209456256150, -0.924197114820550110, -0.924178017874351500, -0.924158918617707940, +-0.924139817050667060, -0.924120713173276710, -0.924101606985584520, -0.924082498487637900, -0.924063387679485480, -0.924044274561174550, -0.924025159132752960, -0.924006041394268450, +-0.923986921345768760, -0.923967798987301860, -0.923948674318915470, -0.923929547340657350, -0.923910418052575340, -0.923891286454717080, -0.923872152547130840, -0.923853016329864160, +-0.923833877802965000, -0.923814736966481200, -0.923795593820460170, -0.923776448364950430, -0.923757300599999720, -0.923738150525655670, -0.923718998141966230, -0.923699843448979370, +-0.923680686446742840, -0.923661527135304580, -0.923642365514712460, -0.923623201585014540, -0.923604035346258230, -0.923584866798492170, -0.923565695941763960, -0.923546522776121480, +-0.923527347301612680, -0.923508169518285630, -0.923488989426187620, -0.923469807025367630, -0.923450622315873050, -0.923431435297751960, -0.923412245971052310, -0.923393054335821970, +-0.923373860392109000, -0.923354664139961480, -0.923335465579427140, -0.923316264710553950, -0.923297061533390310, -0.923277856047984070, -0.923258648254383200, -0.923239438152635760, +-0.923220225742789610, -0.923201011024892600, -0.923181793998993470, -0.923162574665139850, -0.923143353023379690, -0.923124129073761180, -0.923104902816332400, -0.923085674251141410, +-0.923066443378236070, -0.923047210197664780, -0.923027974709475060, -0.923008736913715770, -0.922989496810434520, -0.922970254399679720, -0.922951009681499120, -0.922931762655941120, +-0.922912513323053240, -0.922893261682884550, -0.922874007735482670, -0.922854751480895690, -0.922835492919171880, -0.922816232050359340, -0.922796968874506240, -0.922777703391660760, +-0.922758435601870990, -0.922739165505185090, -0.922719893101650920, -0.922700618391317450, -0.922681341374232300, -0.922662062050443880, -0.922642780420000360, -0.922623496482949500, +-0.922604210239340250, -0.922584921689220460, -0.922565630832638320, -0.922546337669642110, -0.922527042200280150, -0.922507744424600480, -0.922488444342651540, -0.922469141954481490, +-0.922449837260138520, -0.922430530259670590, -0.922411220953126780, -0.922391909340554820, -0.922372595422003120, -0.922353279197519970, -0.922333960667153560, -0.922314639830951970, +-0.922295316688964140, -0.922275991241237940, -0.922256663487821760, -0.922237333428764020, -0.922218001064112890, -0.922198666393916680, -0.922179329418223890, -0.922159990137082830, +-0.922140648550541340, -0.922121304658648610, -0.922101958461452600, -0.922082609959001710, -0.922063259151344350, -0.922043906038528820, -0.922024550620603180, -0.922005192897616510, +-0.921985832869616770, -0.921966470536652480, -0.921947105898772050, -0.921927738956023870, -0.921908369708456350, -0.921888998156117910, -0.921869624299056940, -0.921850248137321530, +-0.921830869670960950, -0.921811488900023070, -0.921792105824556620, -0.921772720444609780, -0.921753332760231190, -0.921733942771468920, -0.921714550478372140, -0.921695155880988940, +-0.921675758979367930, -0.921656359773557420, -0.921636958263606140, -0.921617554449562390, -0.921598148331474690, -0.921578739909391760, -0.921559329183361920, -0.921539916153433340, +-0.921520500819655420, -0.921501083182076130, -0.921481663240744210, -0.921462240995708170, -0.921442816447016200, -0.921423389594717480, -0.921403960438860190, -0.921384528979493190, +-0.921365095216664760, -0.921345659150423550, -0.921326220780818270, -0.921306780107897460, -0.921287337131709630, -0.921267891852303510, -0.921248444269727180, -0.921228994384030280, +-0.921209542195260740, -0.921190087703467440, -0.921170630908698880, -0.921151171811003810, -0.921131710410430400, -0.921112246707028070, -0.921092780700845100, -0.921073312391930240, +-0.921053841780332010, -0.921034368866099240, -0.921014893649280570, -0.920995416129924640, -0.920975936308080170, -0.920956454183795570, -0.920936969757120030, -0.920917483028102170, +-0.920897993996790620, -0.920878502663234010, -0.920859009027481190, -0.920839513089580560, -0.920820014849581430, -0.920800514307532290, -0.920781011463481790, -0.920761506317478880, +-0.920741998869572090, -0.920722489119810360, -0.920702977068242450, -0.920683462714916970, -0.920663946059882670, -0.920644427103188720, -0.920624905844883660, -0.920605382285016430, +-0.920585856423635770, -0.920566328260790430, -0.920546797796528820, -0.920527265030900650, -0.920507729963954360, -0.920488192595738770, -0.920468652926302640, -0.920449110955694820, +-0.920429566683964250, -0.920410020111159800, -0.920390471237330310, -0.920370920062524630, -0.920351366586791290, -0.920331810810179900, -0.920312252732738980, -0.920292692354517490, +-0.920273129675564180, -0.920253564695927670, -0.920233997415657700, -0.920214427834802670, -0.920194855953411550, -0.920175281771533400, -0.920155705289216860, -0.920136126506511220, +-0.920116545423465220, -0.920096962040127810, -0.920077376356548070, -0.920057788372774520, -0.920038198088856780, -0.920018605504843600, -0.919999010620783930, -0.919979413436726730, +-0.919959813952720970, -0.919940212168815390, -0.919920608085059490, -0.919901001701502240, -0.919881393018192380, -0.919861782035178990, -0.919842168752511240, -0.919822553170238090, +-0.919802935288408510, -0.919783315107071560, -0.919763692626276000, -0.919744067846071540, -0.919724440766506950, -0.919704811387631270, -0.919685179709493590, -0.919665545732142880, +-0.919645909455627960, -0.919626270879998600, -0.919606630005303630, -0.919586986831592120, -0.919567341358913050, -0.919547693587315700, -0.919528043516849030, -0.919508391147562330, +-0.919488736479504580, -0.919469079512724720, -0.919449420247272390, -0.919429758683196650, -0.919410094820546480, -0.919390428659371040, -0.919370760199719530, -0.919351089441640790, +-0.919331416385184560, -0.919311741030399920, -0.919292063377335930, -0.919272383426041780, -0.919252701176566660, -0.919233016628959730, -0.919213329783270310, -0.919193640639547560, +-0.919173949197840680, -0.919154255458198620, -0.919134559420671240, -0.919114861085307490, -0.919095160452156560, -0.919075457521267740, -0.919055752292689990, -0.919036044766473160, +-0.919016334942666100, -0.918996622821318330, -0.918976908402479030, -0.918957191686197380, -0.918937472672522790, -0.918917751361504550, -0.918898027753191850, -0.918878301847634190, +-0.918858573644880330, -0.918838843144980430, -0.918819110347983470, -0.918799375253938620, -0.918779637862895400, -0.918759898174903110, -0.918740156190010590, -0.918720411908268140, +-0.918700665329724720, -0.918680916454429510, -0.918661165282432140, -0.918641411813781780, -0.918621656048527860, -0.918601897986719870, -0.918582137628407120, -0.918562374973638570, +-0.918542610022464620, -0.918522842774934010, -0.918503073231096370, -0.918483301391000980, -0.918463527254697380, -0.918443750822234620, -0.918423972093662780, -0.918404191069031040, +-0.918384407748388810, -0.918364622131785600, -0.918344834219270820, -0.918325044010893880, -0.918305251506704390, -0.918285456706751770, -0.918265659611085190, -0.918245860219754850, +-0.918226058532809700, -0.918206254550299580, -0.918186448272273690, -0.918166639698781760, -0.918146828829872860, -0.918127015665597180, -0.918107200206004110, -0.918087382451142850, +-0.918067562401063240, -0.918047740055814800, -0.918027915415446930, -0.918008088480009250, -0.917988259249551300, -0.917968427724122790, -0.917948593903772810, -0.917928757788551760, +-0.917908919378508830, -0.917889078673693510, -0.917869235674155570, -0.917849390379944170, -0.917829542791109620, -0.917809692907701200, -0.917789840729768550, -0.917769986257361390, +-0.917750129490529140, -0.917730270429321650, -0.917710409073788420, -0.917690545423979210, -0.917670679479943740, -0.917650811241731090, -0.917630940709391770, -0.917611067882975080, +-0.917591192762530760, -0.917571315348108430, -0.917551435639757940, -0.917531553637528360, -0.917511669341470330, -0.917491782751633010, -0.917471893868066380, -0.917452002690819950, +-0.917432109219943560, -0.917412213455486850, -0.917392315397499550, -0.917372415046031510, -0.917352512401132140, -0.917332607462851830, -0.917312700231239900, -0.917292790706346280, +-0.917272878888220730, -0.917252964776912980, -0.917233048372472440, -0.917213129674949610, -0.917193208684393910, -0.917173285400855300, -0.917153359824383400, -0.917133431955028170, +-0.917113501792839240, -0.917093569337866680, -0.917073634590160110, -0.917053697549769180, -0.917033758216744270, -0.917013816591135010, -0.916993872672991260, -0.916973926462362750, +-0.916953977959299450, -0.916934027163850860, -0.916914074076067620, -0.916894118695999130, -0.916874161023695340, -0.916854201059206120, -0.916834238802581410, -0.916814274253871190, +-0.916794307413125180, -0.916774338280393450, -0.916754366855725870, -0.916734393139172040, -0.916714417130782500, -0.916694438830606970, -0.916674458238695310, -0.916654475355097590, +-0.916634490179863310, -0.916614502713043120, -0.916594512954686640, -0.916574520904843930, -0.916554526563564950, -0.916534529930899570, -0.916514531006897950, -0.916494529791609950, +-0.916474526285085630, -0.916454520487374970, -0.916434512398527690, -0.916414502018594530, -0.916394489347625020, -0.916374474385669320, -0.916354457132777520, -0.916334437588999130, +-0.916314415754384990, -0.916294391628984850, -0.916274365212848770, -0.916254336506026720, -0.916234305508568880, -0.916214272220525210, -0.916194236641945880, -0.916174198772880980, +-0.916154158613380560, -0.916134116163494380, -0.916114071423273280, -0.916094024392766990, -0.916073975072025700, -0.916053923461099480, -0.916033869560038290, -0.916013813368892200, +-0.915993754887711950, -0.915973694116547280, -0.915953631055448360, -0.915933565704465380, -0.915913498063648520, -0.915893428133047860, -0.915873355912713680, -0.915853281402696060, +-0.915833204603044850, -0.915813125513811110, -0.915793044135044480, -0.915772960466795240, -0.915752874509113580, -0.915732786262049680, -0.915712695725653610, -0.915692602899976120, +-0.915672507785067040, -0.915652410380976670, -0.915632310687755410, -0.915612208705453230, -0.915592104434120650, -0.915571997873807720, -0.915551889024564860, -0.915531777886441910, +-0.915511664459489840, -0.915491548743758710, -0.915471430739298600, -0.915451310446159900, -0.915431187864393040, -0.915411062994047730, -0.915390935835175170, -0.915370806387825310, +-0.915350674652048340, -0.915330540627894760, -0.915310404315414770, -0.915290265714658880, -0.915270124825677270, -0.915249981648520340, -0.915229836183238390, -0.915209688429881600, +-0.915189538388500810, -0.915169386059146330, -0.915149231441868330, -0.915129074536717210, -0.915108915343743060, -0.915088753862997040, -0.915068590094529120, -0.915048424038389600, +-0.915028255694629200, -0.915008085063298000, -0.914987912144446750, -0.914967736938125610, -0.914947559444385110, -0.914927379663275750, -0.914907197594847620, -0.914887013239151890, +-0.914866826596238520, -0.914846637666158150, -0.914826446448961160, -0.914806252944698080, -0.914786057153418990, -0.914765859075175050, -0.914745658710016560, -0.914725456057993820, +-0.914705251119157570, -0.914685043893558090, -0.914664834381246130, -0.914644622582271970, -0.914624408496686250, -0.914604192124539140, -0.914583973465882050, -0.914563752520764830, +-0.914543529289238430, -0.914523303771353050, -0.914503075967159520, -0.914482845876707810, -0.914462613500049430, -0.914442378837234560, -0.914422141888313610, -0.914401902653337430, +-0.914381661132356420, -0.914361417325421310, -0.914341171232582630, -0.914320922853891100, -0.914300672189396810, -0.914280419239151150, -0.914260164003204530, -0.914239906481607580, +-0.914219646674410690, -0.914199384581664830, -0.914179120203420070, -0.914158853539727810, -0.914138584590638570, -0.914118313356202750, -0.914098039836471200, -0.914077764031494540, +-0.914057485941323410, -0.914037205566008650, -0.914016922905600880, -0.913996637960150740, -0.913976350729708730, -0.913956061214326150, -0.913935769414053410, -0.913915475328941240, +-0.913895178959040380, -0.913874880304401230, -0.913854579365075190, -0.913834276141112790, -0.913813970632564640, -0.913793662839481600, -0.913773352761914400, -0.913753040399913790, +-0.913732725753530590, -0.913712408822815680, -0.913692089607819560, -0.913671768108592960, -0.913651444325187300, -0.913631118257653090, -0.913610789906040940, -0.913590459270401940, +-0.913570126350786720, -0.913549791147245880, -0.913529453659830850, -0.913509113888592240, -0.913488771833580790, -0.913468427494847470, -0.913448080872443110, -0.913427731966418470, +-0.913407380776824480, -0.913387027303712130, -0.913366671547131800, -0.913346313507135240, -0.913325953183772740, -0.913305590577095480, -0.913285225687154200, -0.913264858513999860, +-0.913244489057682960, -0.913224117318255260, -0.913203743295767260, -0.913183366990269920, -0.913162988401814200, -0.913142607530450960, -0.913122224376231140, -0.913101838939205820, +-0.913081451219425850, -0.913061061216941970, -0.913040668931805800, -0.913020274364067850, -0.912999877513779310, -0.912979478380991140, -0.912959076965754180, -0.912938673268119170, +-0.912918267288137850, -0.912897859025860850, -0.912877448481339230, -0.912857035654623950, -0.912836620545766090, -0.912816203154816710, -0.912795783481826770, -0.912775361526847460, +-0.912754937289929620, -0.912734510771124220, -0.912714081970482760, -0.912693650888056210, -0.912673217523895520, -0.912652781878051770, -0.912632343950575690, -0.912611903741519130, +-0.912591461250932710, -0.912571016478867740, -0.912550569425375270, -0.912530120090506270, -0.912509668474312030, -0.912489214576843620, -0.912468758398152110, -0.912448299938288800, +-0.912427839197304300, -0.912407376175250700, -0.912386910872178490, -0.912366443288139100, -0.912345973423183580, -0.912325501277363120, -0.912305026850728560, -0.912284550143331760, +-0.912264071155223570, -0.912243589886455260, -0.912223106337078040, -0.912202620507142960, -0.912182132396701320, -0.912161642005804410, -0.912141149334503300, -0.912120654382849060, +-0.912100157150893430, -0.912079657638687480, -0.912059155846282390, -0.912038651773729450, -0.912018145421079840, -0.911997636788384410, -0.911977125875695350, -0.911956612683063490, +-0.911936097210540030, -0.911915579458176470, -0.911895059426023780, -0.911874537114133580, -0.911854012522556930, -0.911833485651345370, -0.911812956500549610, -0.911792425070221960, +-0.911771891360413140, -0.911751355371174580, -0.911730817102557660, -0.911710276554613670, -0.911689733727393700, -0.911669188620949700, -0.911648641235332850, -0.911628091570594210, +-0.911607539626785420, -0.911586985403957770, -0.911566428902162770, -0.911545870121451610, -0.911525309061875790, -0.911504745723486610, -0.911484180106335250, -0.911463612210473890, +-0.911443042035953390, -0.911422469582825360, -0.911401894851141090, -0.911381317840951780, -0.911360738552309590, -0.911340156985265380, -0.911319573139870890, -0.911298987016177510, +-0.911278398614236540, -0.911257807934099720, -0.911237214975818330, -0.911216619739443790, -0.911196022225027820, -0.911175422432621400, -0.911154820362276800, -0.911134216014045210, +-0.911113609387977920, -0.911093000484126670, -0.911072389302542970, -0.911051775843277900, -0.911031160106383740, -0.911010542091911790, -0.910989921799913340, -0.910969299230440120, +-0.910948674383543770, -0.910928047259275560, -0.910907417857687360, -0.910886786178830570, -0.910866152222756460, -0.910845515989517350, -0.910824877479164410, -0.910804236691749260, +-0.910783593627323530, -0.910762948285938840, -0.910742300667646390, -0.910721650772498670, -0.910700998600546650, -0.910680344151842290, -0.910659687426436990, -0.910639028424382380, +-0.910618367145730300, -0.910597703590532380, -0.910577037758840020, -0.910556369650704860, -0.910535699266179050, -0.910515026605314030, -0.910494351668161510, -0.910473674454773010, +-0.910452994965200380, -0.910432313199494800, -0.910411629157708900, -0.910390942839893860, -0.910370254246101520, -0.910349563376383510, -0.910328870230791680, -0.910308174809377530, +-0.910287477112193040, -0.910266777139289830, -0.910246074890719740, -0.910225370366534060, -0.910204663566785310, -0.910183954491524890, -0.910163243140804550, -0.910142529514676110, +-0.910121813613191000, -0.910101095436401720, -0.910080374984359790, -0.910059652257116820, -0.910038927254724790, -0.910018199977235430, -0.909997470424700470, -0.909976738597171870, +-0.909956004494701490, -0.909935268117341050, -0.909914529465142170, -0.909893788538157170, -0.909873045336437870, -0.909852299860035800, -0.909831552109003130, -0.909810802083391490, +-0.909790049783252510, -0.909769295208638700, -0.909748538359601680, -0.909727779236193410, -0.909707017838465640, -0.909686254166470310, -0.909665488220259280, -0.909644719999884610, +-0.909623949505398150, -0.909603176736851430, -0.909582401694297160, -0.909561624377786760, -0.909540844787372400, -0.909520062923105940, -0.909499278785039330, -0.909478492373224200, +-0.909457703687713060, -0.909436912728557760, -0.909416119495810140, -0.909395323989522280, -0.909374526209746130, -0.909353726156533540, -0.909332923829936690, -0.909312119230007540, +-0.909291312356797720, -0.909270503210360070, -0.909249691790746110, -0.909228878098007900, -0.909208062132197400, -0.909187243893366910, -0.909166423381567830, -0.909145600596853120, +-0.909124775539274400, -0.909103948208883740, -0.909083118605733210, -0.909062286729874880, -0.909041452581360820, -0.909020616160243100, -0.908999777466573900, -0.908978936500405290, +-0.908958093261788890, -0.908937247750777670, -0.908916399967423350, -0.908895549911777900, -0.908874697583893720, -0.908853842983822440, -0.908832986111616780, -0.908812126967328720, +-0.908791265551010420, -0.908770401862713850, -0.908749535902491300, -0.908728667670394950, -0.908707797166476980, -0.908686924390789460, -0.908666049343384570, -0.908645172024314270, +-0.908624292433631300, -0.908603410571387720, -0.908582526437635600, -0.908561640032427120, -0.908540751355814580, -0.908519860407849710, -0.908498967188585690, -0.908478071698074150, +-0.908457173936367490, -0.908436273903517890, -0.908415371599577530, -0.908394467024598810, -0.908373560178633910, -0.908352651061735130, -0.908331739673954310, -0.908310826015344520, +-0.908289910085957720, -0.908268991885846090, -0.908248071415061920, -0.908227148673657720, -0.908206223661685130, -0.908185296379197430, -0.908164366826246460, -0.908143435002884640, +-0.908122500909164240, -0.908101564545137460, -0.908080625910856920, -0.908059685006374680, -0.908038741831743380, -0.908017796387014740, -0.907996848672241950, -0.907975898687477190, +-0.907954946432772530, -0.907933991908180580, -0.907913035113753650, -0.907892076049543690, -0.907871114715604000, -0.907850151111986530, -0.907829185238743560, -0.907808217095927740, +-0.907787246683591340, -0.907766274001786890, -0.907745299050566670, -0.907724321829983190, -0.907703342340088980, -0.907682360580935990, -0.907661376552577500, -0.907640390255065600, +-0.907619401688452680, -0.907598410852791250, -0.907577417748133390, -0.907556422374532490, -0.907535424732040410, -0.907514424820709760, -0.907493422640593180, -0.907472418191742960, +-0.907451411474211600, -0.907430402488051850, -0.907409391233316100, -0.907388377710056760, -0.907367361918326120, -0.907346343858177580, -0.907325323529663110, -0.907304300932835210, +-0.907283276067746720, -0.907262248934449960, -0.907241219532997300, -0.907220187863441830, -0.907199153925835940, -0.907178117720232160, -0.907157079246683210, -0.907136038505241380, +-0.907114995495959530, -0.907093950218890170, -0.907072902674086020, -0.907051852861599170, -0.907030800781483020, -0.907009746433789950, -0.906988689818572500, -0.906967630935883280, +-0.906946569785775040, -0.906925506368299940, -0.906904440683511500, -0.906883372731461910, -0.906862302512204010, -0.906841230025790200, -0.906820155272273440, -0.906799078251706250, +-0.906777998964141350, -0.906756917409631380, -0.906735833588228850, -0.906714747499987040, -0.906693659144958470, -0.906672568523195670, -0.906651475634751460, -0.906630380479678480, +-0.906609283058029240, -0.906588183369857250, -0.906567081415214690, -0.906545977194154530, -0.906524870706729380, -0.906503761952991980, -0.906482650932995290, -0.906461537646791830, +-0.906440422094434650, -0.906419304275976390, -0.906398184191469450, -0.906377061840967560, -0.906355937224522900, -0.906334810342188430, -0.906313681194016900, -0.906292549780060800, +-0.906271416100373650, -0.906250280155008080, -0.906229141944016710, -0.906208001467452510, -0.906186858725368420, -0.906165713717817070, -0.906144566444851420, -0.906123416906524430, +-0.906102265102888830, -0.906081111033997240, -0.906059954699903190, -0.906038796100659290, -0.906017635236318400, -0.905996472106933460, -0.905975306712557330, -0.905954139053242510, +-0.905932969129042750, -0.905911796940010560, -0.905890622486198890, -0.905869445767660600, -0.905848266784448740, -0.905827085536616280, -0.905805902024216070, -0.905784716247301060, +-0.905763528205923870, -0.905742337900138250, -0.905721145329996810, -0.905699950495552520, -0.905678753396858330, -0.905657554033967300, -0.905636352406931970, -0.905615148515806160, +-0.905593942360642390, -0.905572733941493850, -0.905551523258413480, -0.905530310311454260, -0.905509095100669350, -0.905487877626111600, -0.905466657887834200, -0.905445435885889770, +-0.905424211620332150, -0.905402985091213970, -0.905381756298588410, -0.905360525242508320, -0.905339291923027090, -0.905318056340197130, -0.905296818494072400, -0.905275578384705630, +-0.905254336012150000, -0.905233091376458470, -0.905211844477684210, -0.905190595315880310, -0.905169343891099930, -0.905148090203396260, -0.905126834252822250, -0.905105576039430870, +-0.905084315563275950, -0.905063052824410130, -0.905041787822886800, -0.905020520558758920, -0.904999251032079450, -0.904977979242902130, -0.904956705191279910, -0.904935428877265860, +-0.904914150300913380, -0.904892869462275430, -0.904871586361405300, -0.904850300998356170, -0.904829013373181330, -0.904807723485933970, -0.904786431336666920, -0.904765136925434250, +-0.904743840252288600, -0.904722541317283470, -0.904701240120471930, -0.904679936661906830, -0.904658630941642340, -0.904637322959731320, -0.904616012716226940, -0.904594700211182600, +-0.904573385444651380, -0.904552068416686780, -0.904530749127341990, -0.904509427576670300, -0.904488103764725100, -0.904466777691559250, -0.904445449357226820, -0.904424118761780750, +-0.904402785905274450, -0.904381450787761110, -0.904360113409294230, -0.904338773769926550, -0.904317431869712470, -0.904296087708704730, -0.904274741286956730, -0.904253392604521980, +-0.904232041661453660, -0.904210688457805280, -0.904189332993630130, -0.904167975268981740, -0.904146615283912940, -0.904125253038478020, -0.904103888532729940, -0.904082521766722210, +-0.904061152740508130, -0.904039781454141210, -0.904018407907674400, -0.903997032101162000, -0.903975654034656960, -0.903954273708212800, -0.903932891121883020, -0.903911506275720920, +-0.903890119169780130, -0.903868729804114030, -0.903847338178776050, -0.903825944293819790, -0.903804548149298230, -0.903783149745265750, -0.903761749081775310, -0.903740346158880550, +-0.903718940976634970, -0.903697533535091630, -0.903676123834304730, -0.903654711874327670, -0.903633297655213720, -0.903611881177016630, -0.903590462439789800, -0.903569041443586740, +-0.903547618188461190, -0.903526192674466540, -0.903504764901656430, -0.903483334870083920, -0.903461902579803520, -0.903440468030868420, -0.903419031223332110, -0.903397592157248240, +-0.903376150832669980, -0.903354707249651720, -0.903333261408246770, -0.903311813308508630, -0.903290362950490920, -0.903268910334247280, -0.903247455459831430, -0.903225998327296890, +-0.903204538936697390, -0.903183077288086560, -0.903161613381517570, -0.903140147217045050, -0.903118678794722070, -0.903097208114602480, -0.903075735176739780, -0.903054259981187820, +-0.903032782527999680, -0.903011302817230080, -0.902989820848932200, -0.902968336623159900, -0.902946850139966560, -0.902925361399406160, -0.902903870401532420, -0.902882377146398960, +-0.902860881634059530, -0.902839383864567520, -0.902817883837977450, -0.902796381554342720, -0.902774877013716950, -0.902753370216154090, -0.902731861161707670, -0.902710349850431300, +-0.902688836282379500, -0.902667320457605560, -0.902645802376163210, -0.902624282038106520, -0.902602759443489000, -0.902581234592364610, -0.902559707484787200, -0.902538178120810500, +-0.902516646500487910, -0.902495112623874050, -0.902473576491022560, -0.902452038101987040, -0.902430497456821470, -0.902408954555579570, -0.902387409398314970, -0.902365861985082170, +-0.902344312315934820, -0.902322760390926630, -0.902301206210111560, -0.902279649773543470, -0.902258091081276190, -0.902236530133363690, -0.902214966929859920, -0.902193401470818720, +-0.902171833756293620, -0.902150263786339330, -0.902128691561009390, -0.902107117080357730, -0.902085540344438330, -0.902063961353304580, -0.902042380107011430, -0.902020796605612190, +-0.901999210849161010, -0.901977622837711880, -0.901956032571318620, -0.901934440050035310, -0.901912845273915910, -0.901891248243014370, -0.901869648957384640, -0.901848047417080580, +-0.901826443622156580, -0.901804837572666610, -0.901783229268664500, -0.901761618710204330, -0.901740005897340160, -0.901718390830125500, -0.901696773508615320, -0.901675153932863130, +-0.901653532102923090, -0.901631908018849290, -0.901610281680695680, -0.901588653088516320, -0.901567022242365400, -0.901545389142296870, -0.901523753788364470, -0.901502116180623150, +-0.901480476319126420, -0.901458834203928580, -0.901437189835083700, -0.901415543212645720, -0.901393894336668610, -0.901372243207207100, -0.901350589824314930, -0.901328934188046380, +-0.901307276298455420, -0.901285616155596330, -0.901263953759523170, -0.901242289110290140, -0.901220622207951410, -0.901198953052560700, -0.901177281644172990, -0.901155607982842110, +-0.901133932068622250, -0.901112253901567460, -0.901090573481732050, -0.901068890809169850, -0.901047205883935830, -0.901025518706083720, -0.901003829275667910, -0.900982137592742480, +-0.900960443657361720, -0.900938747469579800, -0.900917049029451130, -0.900895348337029780, -0.900873645392370030, -0.900851940195525720, -0.900830232746552050, -0.900808523045502740, +-0.900786811092432190, -0.900765096887394590, -0.900743380430443770, -0.900721661721635040, -0.900699940761022110, -0.900678217548659290, -0.900656492084600860, -0.900634764368901330, +-0.900613034401614780, -0.900591302182795710, -0.900569567712498410, -0.900547830990777070, -0.900526092017685850, -0.900504350793279840, -0.900482607317612870, -0.900460861590739460, +-0.900439113612713780, -0.900417363383590460, -0.900395610903423240, -0.900373856172267390, -0.900352099190176890, -0.900330339957206240, -0.900308578473409620, -0.900286814738841650, +-0.900265048753556620, -0.900243280517608930, -0.900221510031053000, -0.900199737293942980, -0.900177962306334070, -0.900156185068280100, -0.900134405579835820, -0.900112623841055390, +-0.900090839851993450, -0.900069053612704060, -0.900047265123242400, -0.900025474383662540, -0.900003681394019090, -0.899981886154366360, -0.899960088664758960, -0.899938288925251300, +-0.899916486935897870, -0.899894682696753320, -0.899872876207871600, -0.899851067469308210, -0.899829256481117000, -0.899807443243352710, -0.899785627756069850, -0.899763810019322820, +-0.899741990033166020, -0.899720167797654510, -0.899698343312842600, -0.899676516578784890, -0.899654687595535800, -0.899632856363150050, -0.899611022881682150, -0.899589187151186740, +-0.899567349171718320, -0.899545508943331520, -0.899523666466080620, -0.899501821740020800, -0.899479974765206580, -0.899458125541692350, -0.899436274069532750, -0.899414420348782160, +-0.899392564379495880, -0.899370706161728210, -0.899348845695533860, -0.899326982980967250, -0.899305118018083220, -0.899283250806936390, -0.899261381347581490, -0.899239509640073150, +-0.899217635684465890, -0.899195759480814320, -0.899173881029173620, -0.899152000329598300, -0.899130117382142990, -0.899108232186862310, -0.899086344743811110, -0.899064455053043550, +-0.899042563114615390, -0.899020668928580790, -0.898998772494994490, -0.898976873813911230, -0.898954972885385840, -0.898933069709472950, -0.898911164286227420, -0.898889256615703960, +-0.898867346697957090, -0.898845434533042110, -0.898823520121013520, -0.898801603461926280, -0.898779684555834900, -0.898757763402794340, -0.898735840002859000, -0.898713914356084500, +-0.898691986462525130, -0.898670056322235840, -0.898648123935271380, -0.898626189301686700, -0.898604252421536410, -0.898582313294875590, -0.898560371921758970, -0.898538428302240950, +-0.898516482436377270, -0.898494534324222440, -0.898472583965831300, -0.898450631361258690, -0.898428676510559470, -0.898406719413788140, -0.898384760071000430, -0.898362798482250870, +-0.898340834647594180, -0.898318868567085540, -0.898296900240779680, -0.898274929668731570, -0.898252956850996150, -0.898230981787628280, -0.898209004478683020, -0.898187024924214870, +-0.898165043124279470, -0.898143059078931550, -0.898121072788225950, -0.898099084252217630, -0.898077093470961320, -0.898055100444512530, -0.898033105172926120, -0.898011107656256800, +-0.897989107894559770, -0.897967105887890080, -0.897945101636302480, -0.897923095139852250, -0.897901086398594120, -0.897879075412583380, -0.897857062181874550, -0.897835046706523480, +-0.897813028986584770, -0.897791009022113510, -0.897768986813164640, -0.897746962359793450, -0.897724935662054360, -0.897702906720003300, -0.897680875533695020, -0.897658842103184580, +-0.897636806428526950, -0.897614768509777390, -0.897592728346990890, -0.897570685940222600, -0.897548641289527490, -0.897526594394960520, -0.897504545256577300, -0.897482493874432800, +-0.897460440248582070, -0.897438384379080300, -0.897416326265982440, -0.897394265909343460, -0.897372203309219190, -0.897350138465664470, -0.897328071378734270, -0.897306002048483990, +-0.897283930474968680, -0.897261856658243540, -0.897239780598363850, -0.897217702295384560, -0.897195621749360740, -0.897173538960348130, -0.897151453928401790, -0.897129366653576790, +-0.897107277135928300, -0.897085185375511740, -0.897063091372381720, -0.897040995126594410, -0.897018896638204670, -0.896996795907267550, -0.896974692933838580, -0.896952587717972820, +-0.896930480259725550, -0.896908370559152070, -0.896886258616307770, -0.896864144431247730, -0.896842028004027010, -0.896819909334701570, -0.896797788423326360, -0.896775665269956670, +-0.896753539874647790, -0.896731412237454670, -0.896709282358433500, -0.896687150237639120, -0.896665015875126810, -0.896642879270951880, -0.896620740425169930, -0.896598599337836030, +-0.896576456009005600, -0.896554310438734130, -0.896532162627076800, -0.896510012574088690, -0.896487860279825970, -0.896465705744343590, -0.896443548967696850, -0.896421389949941360, +-0.896399228691132420, -0.896377065191324870, -0.896354899450575230, -0.896332731468938220, -0.896310561246469350, -0.896288388783224140, -0.896266214079257990, -0.896244037134626300, +-0.896221857949384470, -0.896199676523588010, -0.896177492857291980, -0.896155306950552570, -0.896133118803424940, -0.896110928415964510, -0.896088735788226680, -0.896066540920267160, +-0.896044343812140820, -0.896022144463903940, -0.895999942875611800, -0.895977739047319810, -0.895955532979083370, -0.895933324670958210, -0.895911114122999620, -0.895888901335263330, +-0.895866686307804750, -0.895844469040679160, -0.895822249533942740, -0.895800027787650550, -0.895777803801858450, -0.895755577576621830, -0.895733349111996200, -0.895711118408036850, +-0.895688885464800080, -0.895666650282341160, -0.895644412860715500, -0.895622173199978940, -0.895599931300186890, -0.895577687161394960, -0.895555440783658900, -0.895533192167034200, +-0.895510941311576490, -0.895488688217341070, -0.895466432884384320, -0.895444175312761440, -0.895421915502528140, -0.895399653453740060, -0.895377389166452490, -0.895355122640721810, +-0.895332853876603330, -0.895310582874152770, -0.895288309633425650, -0.895266034154477810, -0.895243756437364870, -0.895221476482142560, -0.895199194288866520, -0.895176909857592570, +-0.895154623188375910, -0.895132334281273030, -0.895110043136339350, -0.895087749753630590, -0.895065454133202490, -0.895043156275110660, -0.895020856179410630, -0.894998553846158780, +-0.894976249275410640, -0.894953942467221820, -0.894931633421648160, -0.894909322138745410, -0.894887008618569290, -0.894864692861175760, -0.894842374866620440, -0.894820054634958840, +-0.894797732166247360, -0.894775407460541740, -0.894753080517897480, -0.894730751338370540, -0.894708419922016770, -0.894686086268891460, -0.894663750379051440, -0.894641412252551890, +-0.894619071889449000, -0.894596729289798280, -0.894574384453655780, -0.894552037381077360, -0.894529688072118860, -0.894507336526836120, -0.894484982745284540, -0.894462626727520970, +-0.894440268473600920, -0.894417907983580120, -0.894395545257514520, -0.894373180295460090, -0.894350813097472330, -0.894328443663607970, -0.894306071993922420, -0.894283698088471750, +-0.894261321947311780, -0.894238943570498600, -0.894216562958087930, -0.894194180110135960, -0.894171795026698520, -0.894149407707831580, -0.894127018153590640, -0.894104626364032650, +-0.894082232339213020, -0.894059836079187930, -0.894037437584013220, -0.894015036853744390, -0.893992633888438530, -0.893970228688151010, -0.893947821252937920, -0.893925411582855320, +-0.893902999677959050, -0.893880585538305410, -0.893858169163950330, -0.893835750554949790, -0.893813329711359850, -0.893790906633236130, -0.893768481320635690, -0.893746053773613940, +-0.893723623992227050, -0.893701191976531200, -0.893678757726582340, -0.893656321242436100, -0.893633882524149550, -0.893611441571778190, -0.893588998385378310, -0.893566552965005870, +-0.893544105310717150, -0.893521655422568120, -0.893499203300614940, -0.893476748944913690, -0.893454292355520320, -0.893431833532491450, -0.893409372475883150, -0.893386909185751370, +-0.893364443662152290, -0.893341975905142080, -0.893319505914776490, -0.893297033691112690, -0.893274559234206180, -0.893252082544113370, -0.893229603620890210, -0.893207122464593220, +-0.893184639075278230, -0.893162153453001760, -0.893139665597819880, -0.893117175509788530, -0.893094683188964570, -0.893072188635403830, -0.893049691849162720, -0.893027192830297300, +-0.893004691578863970, -0.892982188094918470, -0.892959682378517860, -0.892937174429718090, -0.892914664248575460, -0.892892151835146030, -0.892869637189486310, -0.892847120311652480, +-0.892824601201700930, -0.892802079859687740, -0.892779556285669410, -0.892757030479701790, -0.892734502441842050, -0.892711972172145930, -0.892689439670669940, -0.892666904937470360, +-0.892644367972603160, -0.892621828776125390, -0.892599287348093020, -0.892576743688562440, -0.892554197797590040, -0.892531649675232130, -0.892509099321545100, -0.892486546736585340, +-0.892463991920409260, -0.892441434873073040, -0.892418875594632950, -0.892396314085146080, -0.892373750344668370, -0.892351184373256330, -0.892328616170966260, -0.892306045737854770, +-0.892283473073977710, -0.892260898179392360, -0.892238321054154680, -0.892215741698321300, -0.892193160111948600, -0.892170576295092890, -0.892147990247810770, -0.892125401970158770, +-0.892102811462193170, -0.892080218723970140, -0.892057623755546980, -0.892035026556979750, -0.892012427128325070, -0.891989825469639230, -0.891967221580978740, -0.891944615462399890, +-0.891922007113959970, -0.891899396535714930, -0.891876783727721390, -0.891854168690035980, -0.891831551422715090, -0.891808931925815230, -0.891786310199393140, -0.891763686243505330, +-0.891741060058207860, -0.891718431643558130, -0.891695800999612320, -0.891673168126426940, -0.891650533024058720, -0.891627895692564180, -0.891605256131999480, -0.891582614342422030, +-0.891559970323888010, -0.891537324076454140, -0.891514675600176940, -0.891492024895113030, -0.891469371961319030, -0.891446716798851680, -0.891424059407767480, -0.891401399788123160, +-0.891378737939974910, -0.891356073863380230, -0.891333407558395410, -0.891310739025076960, -0.891288068263481730, -0.891265395273665990, -0.891242720055687050, -0.891220042609601410, +-0.891197362935465590, -0.891174681033336410, -0.891151996903270520, -0.891129310545324630, -0.891106621959555480, -0.891083931146019690, -0.891061238104774110, -0.891038542835875140, +-0.891015845339380160, -0.890993145615345480, -0.890970443663828050, -0.890947739484884480, -0.890925033078571070, -0.890902324444945550, -0.890879613584064200, -0.890856900495983870, +-0.890834185180761300, -0.890811467638453200, -0.890788747869116440, -0.890766025872807840, -0.890743301649584150, -0.890720575199502210, -0.890697846522618520, -0.890675115618990490, +-0.890652382488674730, -0.890629647131727990, -0.890606909548207200, -0.890584169738169010, -0.890561427701670130, -0.890538683438767960, -0.890515936949519140, -0.890493188233980490, +-0.890470437292208870, -0.890447684124261120, -0.890424928730194190, -0.890402171110064920, -0.890379411263930280, -0.890356649191846650, -0.890333884893871890, -0.890311118370062270, +-0.890288349620474980, -0.890265578645166760, -0.890242805444194540, -0.890220030017614960, -0.890197252365485750, -0.890174472487863410, -0.890151690384804790, -0.890128906056367080, +-0.890106119502606980, -0.890083330723581590, -0.890060539719347950, -0.890037746489962920, -0.890014951035483120, -0.889992153355966380, -0.889969353451469210, -0.889946551322048700, +-0.889923746967761780, -0.889900940388665520, -0.889878131584816430, -0.889855320556272590, -0.889832507303090270, -0.889809691825326770, -0.889786874123039030, -0.889764054196284020, +-0.889741232045119010, -0.889718407669600860, -0.889695581069786630, -0.889672752245733500, -0.889649921197498080, -0.889627087925138340, -0.889604252428710770, -0.889581414708272680, +-0.889558574763881000, -0.889535732595592380, -0.889512888203464970, -0.889490041587555290, -0.889467192747920520, -0.889444341684617720, -0.889421488397704070, -0.889398632887236750, +-0.889375775153272820, -0.889352915195869560, -0.889330053015083830, -0.889307188610972690, -0.889284321983593970, -0.889261453133004420, -0.889238582059261210, -0.889215708762421510, +-0.889192833242542610, -0.889169955499681250, -0.889147075533895380, -0.889124193345241840, -0.889101308933777700, -0.889078422299560360, -0.889055533442647090, -0.889032642363094870, +-0.889009749060960970, -0.888986853536302800, -0.888963955789177080, -0.888941055819641890, -0.888918153627754060, -0.888895249213570770, -0.888872342577149420, -0.888849433718547190, +-0.888826522637821030, -0.888803609335028890, -0.888780693810227730, -0.888757776063474950, -0.888734856094827610, -0.888711933904343110, -0.888689009492078850, -0.888666082858092120, +-0.888643154002440090, -0.888620222925179730, -0.888597289626369300, -0.888574354106065670, -0.888551416364326110, -0.888528476401208020, -0.888505534216768700, -0.888482589811065200, +-0.888459643184155600, -0.888436694336096840, -0.888413743266946440, -0.888390789976761690, -0.888367834465599860, -0.888344876733518580, -0.888321916780575040, -0.888298954606826620, +-0.888275990212330950, -0.888253023597144860, -0.888230054761326550, -0.888207083704933180, -0.888184110428022030, -0.888161134930650630, -0.888138157212876030, -0.888115177274756420, +-0.888092195116348960, -0.888069210737710830, -0.888046224138899780, -0.888023235319973180, -0.888000244280988450, -0.887977251022003090, -0.887954255543074720, -0.887931257844260640, +-0.887908257925618010, -0.887885255787205120, -0.887862251429079040, -0.887839244851297390, -0.887816236053917680, -0.887793225036997310, -0.887770211800593460, -0.887747196344764620, +-0.887724178669567650, -0.887701158775060280, -0.887678136661300020, -0.887655112328344380, -0.887632085776250970, -0.887609057005077420, -0.887586026014881120, -0.887562992805719380, +-0.887539957377650680, -0.887516919730731990, -0.887493879865020930, -0.887470837780575230, -0.887447793477452510, -0.887424746955709830, -0.887401698215405710, -0.887378647256597320, +-0.887355594079342280, -0.887332538683698320, -0.887309481069723070, -0.887286421237474030, -0.887263359187008940, -0.887240294918385410, -0.887217228431660840, -0.887194159726893530, +-0.887171088804140860, -0.887148015663460470, -0.887124940304910070, -0.887101862728547190, -0.887078782934429320, -0.887055700922614990, -0.887032616693161360, -0.887009530246126050, +-0.886986441581567140, -0.886963350699542020, -0.886940257600108420, -0.886917162283324290, -0.886894064749247260, -0.886870964997935050, -0.886847863029444960, -0.886824758843835710, +-0.886801652441164600, -0.886778543821489240, -0.886755432984867590, -0.886732319931356930, -0.886709204661015880, -0.886686087173901850, -0.886662967470072560, -0.886639845549585860, +-0.886616721412499480, -0.886593595058871360, -0.886570466488759260, -0.886547335702221000, -0.886524202699314420, -0.886501067480096940, -0.886477930044627160, -0.886454790392962490, +-0.886431648525160990, -0.886408504441280280, -0.886385358141378310, -0.886362209625512490, -0.886339058893741650, -0.886315905946123080, -0.886292750782714860, -0.886269593403574700, +-0.886246433808760560, -0.886223271998330290, -0.886200107972341830, -0.886176941730853150, -0.886153773273921750, -0.886130602601606250, -0.886107429713964280, -0.886084254611053780, +-0.886061077292932600, -0.886037897759658690, -0.886014716011289670, -0.885991532047884170, -0.885968345869500020, -0.885945157476194840, -0.885921966868026930, -0.885898774045054020, +-0.885875579007334160, -0.885852381754925310, -0.885829182287885540, -0.885805980606272470, -0.885782776710144830, -0.885759570599560230, -0.885736362274576640, -0.885713151735252220, +-0.885689938981644940, -0.885666724013812300, -0.885643506831813370, -0.885620287435705640, -0.885597065825547200, -0.885573842001396110, -0.885550615963310420, -0.885527387711348090, +-0.885504157245567410, -0.885480924566026230, -0.885457689672782820, -0.885434452565894810, -0.885411213245420940, -0.885387971711419140, -0.885364727963947380, -0.885341482003063840, +-0.885318233828826130, -0.885294983441293310, -0.885271730840523020, -0.885248476026573310, -0.885225218999502570, -0.885201959759368660, -0.885178698306229860, -0.885155434640144350, +-0.885132168761170290, -0.885108900669365760, -0.885085630364788490, -0.885062357847497650, -0.885039083117550970, -0.885015806175006410, -0.884992527019922480, -0.884969245652357240, +-0.884945962072368420, -0.884922676280015090, -0.884899388275355080, -0.884876098058446580, -0.884852805629347870, -0.884829510988117240, -0.884806214134812640, -0.884782915069492690, +-0.884759613792215350, -0.884736310303038560, -0.884713004602021400, -0.884689696689221820, -0.884666386564697870, -0.884643074228508080, -0.884619759680710490, -0.884596442921363190, +-0.884573123950525120, -0.884549802768254230, -0.884526479374608930, -0.884503153769647280, -0.884479825953427890, -0.884456495926008830, -0.884433163687448620, -0.884409829237805530, +-0.884386492577137310, -0.884363153705503340, -0.884339812622961570, -0.884316469329570200, -0.884293123825387610, -0.884269776110472310, -0.884246426184882030, -0.884223074048676170, +-0.884199719701912690, -0.884176363144649870, -0.884153004376946110, -0.884129643398859800, -0.884106280210449460, -0.884082914811773370, -0.884059547202890040, -0.884036177383857760, +-0.884012805354734700, -0.883989431115580040, -0.883966054666451840, -0.883942676007408390, -0.883919295138508310, -0.883895912059809550, -0.883872526771371510, -0.883849139273252040, +-0.883825749565509860, -0.883802357648203140, -0.883778963521390630, -0.883755567185130710, -0.883732168639481900, -0.883708767884502590, -0.883685364920251400, -0.883661959746786410, +-0.883638552364166880, -0.883615142772451010, -0.883591730971697190, -0.883568316961964140, -0.883544900743310270, -0.883521482315793750, -0.883498061679473980, -0.883474638834409020, +-0.883451213780657390, -0.883427786518277800, -0.883404357047328780, -0.883380925367868720, -0.883357491479956460, -0.883334055383650510, -0.883310617079008930, -0.883287176566091240, +-0.883263733844955600, -0.883240288915660640, -0.883216841778264980, -0.883193392432827240, -0.883169940879405480, -0.883146487118059430, -0.883123031148847050, -0.883099572971827170, +-0.883076112587058320, -0.883052649994599200, -0.883029185194508460, -0.883005718186844700, -0.882982248971666770, -0.882958777549032740, -0.882935303919002100, -0.882911828081633270, +-0.882888350036984850, -0.882864869785115580, -0.882841387326084190, -0.882817902659948860, -0.882794415786769200, -0.882770926706603400, -0.882747435419510400, -0.882723941925548820, +-0.882700446224777390, -0.882676948317254740, -0.882653448203039810, -0.882629945882191240, -0.882606441354767730, -0.882582934620827820, -0.882559425680430890, -0.882535914533635450, +-0.882512401180500230, -0.882488885621084070, -0.882465367855445160, -0.882441847883643330, -0.882418325705736860, -0.882394801321784490, -0.882371274731845180, -0.882347745935977760, +-0.882324214934240850, -0.882300681726693510, -0.882277146313394380, -0.882253608694402500, -0.882230068869776060, -0.882206526839574900, -0.882182982603857410, -0.882159436162682550, +-0.882135887516109050, -0.882112336664195750, -0.882088783607001270, -0.882065228344585230, -0.882041670877006130, -0.882018111204322830, -0.881994549326594270, -0.881970985243879400, +-0.881947418956236960, -0.881923850463726010, -0.881900279766405500, -0.881876706864333840, -0.881853131757570740, -0.881829554446174950, -0.881805974930205180, -0.881782393209720520, +-0.881758809284779900, -0.881735223155441730, -0.881711634821765950, -0.881688044283811200, -0.881664451541636200, -0.881640856595300230, -0.881617259444861910, -0.881593660090380650, +-0.881570058531915060, -0.881546454769524420, -0.881522848803267260, -0.881499240633203280, -0.881475630259391350, -0.881452017681890190, -0.881428402900759080, -0.881404785916056980, +-0.881381166727842390, -0.881357545336175390, -0.881333921741114580, -0.881310295942718810, -0.881286667941047370, -0.881263037736159330, -0.881239405328113620, -0.881215770716969440, +-0.881192133902785830, -0.881168494885621880, -0.881144853665536190, -0.881121210242588940, -0.881097564616838520, -0.881073916788344240, -0.881050266757165250, -0.881026614523360060, +-0.881002960086988860, -0.880979303448110150, -0.880955644606783220, -0.880931983563067230, -0.880908320317021150, -0.880884654868704380, -0.880860987218175960, -0.880837317365495090, +-0.880813645310720930, -0.880789971053912210, -0.880766294595129010, -0.880742615934430040, -0.880718935071874490, -0.880695252007521630, -0.880671566741430660, -0.880647879273660390, +-0.880624189604270800, -0.880600497733320720, -0.880576803660869430, -0.880553107386976120, -0.880529408911700060, -0.880505708235100440, -0.880482005357236530, -0.880458300278167740, +-0.880434592997952680, -0.880410883516651530, -0.880387171834323250, -0.880363457951027000, -0.880339741866822070, -0.880316023581767860, -0.880292303095923100, -0.880268580409347970, +-0.880244855522101520, -0.880221128434242830, -0.880197399145831390, -0.880173667656926400, -0.880149933967587230, -0.880126198077873290, -0.880102459987843750, -0.880078719697557800, +-0.880054977207075370, -0.880031232516455430, -0.880007485625757590, -0.879983736535040920, -0.879959985244364920, -0.879936231753788540, -0.879912476063371970, -0.879888718173174270, +-0.879864958083254710, -0.879841195793672810, -0.879817431304487860, -0.879793664615759360, -0.879769895727546710, -0.879746124639909420, -0.879722351352906660, -0.879698575866597720, +-0.879674798181042660, -0.879651018296300660, -0.879627236212431110, -0.879603451929493520, -0.879579665447546730, -0.879555876766651370, -0.879532085886866270, -0.879508292808250820, +-0.879484497530864770, -0.879460700054767510, -0.879436900380018430, -0.879413098506677150, -0.879389294434803070, -0.879365488164455700, -0.879341679695694320, -0.879317869028579110, +-0.879294056163169140, -0.879270241099524120, -0.879246423837703570, -0.879222604377766780, -0.879198782719773250, -0.879174958863783050, -0.879151132809855460, -0.879127304558050100, +-0.879103474108426490, -0.879079641461044110, -0.879055806615962720, -0.879031969573241700, -0.879008130332940900, -0.878984288895119260, -0.878960445259837300, -0.878936599427154300, +-0.878912751397129770, -0.878888901169823320, -0.878865048745294700, -0.878841194123602950, -0.878817337304808710, -0.878793478288971140, -0.878769617076149760, -0.878745753666404510, +-0.878721888059794680, -0.878698020256380220, -0.878674150256220750, -0.878650278059375900, -0.878626403665904940, -0.878602527075868280, -0.878578648289325410, -0.878554767306335860, +-0.878530884126959450, -0.878506998751255820, -0.878483111179284240, -0.878459221411105330, -0.878435329446778380, -0.878411435286363120, -0.878387538929919160, -0.878363640377506470, +-0.878339739629184660, -0.878315836685013450, -0.878291931545052700, -0.878268024209362010, -0.878244114678001010, -0.878220202951029980, -0.878196289028508550, -0.878172372910496430, +-0.878148454597053260, -0.878124534088238650, -0.878100611384112990, -0.878076686484735910, -0.878052759390167140, -0.878028830100466400, -0.878004898615693640, -0.877980964935908600, +-0.877957029061171120, -0.877933090991541040, -0.877909150727078310, -0.877885208267842330, -0.877861263613893610, -0.877837316765291860, -0.877813367722096730, -0.877789416484368260, +-0.877765463052165740, -0.877741507425550020, -0.877717549604580590, -0.877693589589317200, -0.877669627379819910, -0.877645662976148430, -0.877621696378362850, -0.877597727586523100, +-0.877573756600689040, -0.877549783420920490, -0.877525808047277090, -0.877501830479819670, -0.877477850718607620, -0.877453868763700910, -0.877429884615159580, -0.877405898273043490, +-0.877381909737412150, -0.877357919008326600, -0.877333926085846260, -0.877309930970031070, -0.877285933660940990, -0.877261934158636180, -0.877237932463176500, -0.877213928574621990, +-0.877189922493032630, -0.877165914218468010, -0.877141903750989100, -0.877117891090655410, -0.877093876237526990, -0.877069859191663910, -0.877045839953126130, -0.877021818521973360, +-0.876997794898266460, -0.876973769082065040, -0.876949741073429160, -0.876925710872419000, -0.876901678479094620, -0.876877643893515970, -0.876853607115743230, -0.876829568145836460, +-0.876805526983855720, -0.876781483629860860, -0.876757438083912600, -0.876733390346070780, -0.876709340416395480, -0.876685288294946850, -0.876661233981784640, -0.876637177476969680, +-0.876613118780561810, -0.876589057892621090, -0.876564994813207820, -0.876540929542382050, -0.876516862080203850, -0.876492792426733610, -0.876468720582031290, -0.876444646546157280, +-0.876420570319171200, -0.876396491901134000, -0.876372411292105640, -0.876348328492146390, -0.876324243501316100, -0.876300156319674950, -0.876276066947283770, -0.876251975384202410, +-0.876227881630491150, -0.876203785686210160, -0.876179687551419620, -0.876155587226180030, -0.876131484710551360, -0.876107380004593980, -0.876083273108368200, -0.876059164021933730, +-0.876035052745351870, -0.876010939278682340, -0.875986823621985430, -0.875962705775321540, -0.875938585738750830, -0.875914463512333260, -0.875890339096129900, -0.875866212490200690, +-0.875842083694606030, -0.875817952709406100, -0.875793819534661290, -0.875769684170431990, -0.875745546616778500, -0.875721406873761100, -0.875697264941439730, -0.875673120819875580, +-0.875648974509128710, -0.875624826009259390, -0.875600675320328040, -0.875576522442394920, -0.875552367375520110, -0.875528210119764780, -0.875504050675188990, -0.875479889041853030, +-0.875455725219817290, -0.875431559209142400, -0.875407391009888510, -0.875383220622116040, -0.875359048045885710, -0.875334873281257250, -0.875310696328291950, -0.875286517187050080, +-0.875262335857591830, -0.875238152339977700, -0.875213966634268200, -0.875189778740523390, -0.875165588658804560, -0.875141396389171770, -0.875117201931685520, -0.875093005286406210, +-0.875068806453394350, -0.875044605432710560, -0.875020402224415240, -0.874996196828568880, -0.874971989245232010, -0.874947779474464780, -0.874923567516328490, -0.874899353370883310, +-0.874875137038189750, -0.874850918518308430, -0.874826697811299290, -0.874802474917223850, -0.874778249836142160, -0.874754022568114960, -0.874729793113202650, -0.874705561471465830, +-0.874681327642965130, -0.874657091627761170, -0.874632853425914350, -0.874608613037485490, -0.874584370462534680, -0.874560125701123400, -0.874535878753311740, -0.874511629619160290, +-0.874487378298729910, -0.874463124792081100, -0.874438869099273930, -0.874414611220370120, -0.874390351155429730, -0.874366088904513510, -0.874341824467682050, -0.874317557844995990, +-0.874293289036516040, -0.874269018042302950, -0.874244744862417210, -0.874220469496919230, -0.874196191945870500, -0.874171912209331330, -0.874147630287362310, -0.874123346180024300, +-0.874099059887377790, -0.874074771409483310, -0.874050480746402350, -0.874026187898195080, -0.874001892864922470, -0.873977595646645010, -0.873953296243423660, -0.873928994655319040, +-0.873904690882391870, -0.873880384924702990, -0.873856076782312810, -0.873831766455282820, -0.873807453943673320, -0.873783139247545250, -0.873758822366959450, -0.873734503301976440, +-0.873710182052656830, -0.873685858619062120, -0.873661533001252820, -0.873637205199289670, -0.873612875213233500, -0.873588543043145150, -0.873564208689085460, -0.873539872151115280, +-0.873515533429295330, -0.873491192523686570, -0.873466849434349380, -0.873442504161345610, -0.873418156704735550, -0.873393807064580030, -0.873369455240940010, -0.873345101233875880, +-0.873320745043449480, -0.873296386669721310, -0.873272026112752010, -0.873247663372602730, -0.873223298449334330, -0.873198931343007630, -0.873174562053683600, -0.873150190581423070, +-0.873125816926287210, -0.873101441088336320, -0.873077063067632330, -0.873052682864235540, -0.873028300478207120, -0.873003915909608020, -0.872979529158499080, -0.872955140224940810, +-0.872930749108995260, -0.872906355810722730, -0.872881960330184280, -0.872857562667441080, -0.872833162822553850, -0.872808760795583780, -0.872784356586591700, -0.872759950195638790, +-0.872735541622785660, -0.872711130868094040, -0.872686717931624560, -0.872662302813438260, -0.872637885513596330, -0.872613466032159610, -0.872589044369188830, -0.872564620524745820, +-0.872540194498891310, -0.872515766291686260, -0.872491335903191830, -0.872466903333468990, -0.872442468582579010, -0.872418031650582740, -0.872393592537541450, -0.872369151243515770, +-0.872344707768567650, -0.872320262112757700, -0.872295814276147110, -0.872271364258797030, -0.872246912060768540, -0.872222457682122250, -0.872198001122920340, -0.872173542383223420, +-0.872149081463092560, -0.872124618362589140, -0.872100153081774130, -0.872075685620708580, -0.872051215979454010, -0.872026744158071350, -0.872002270156621790, -0.871977793975166170, +-0.871953315613766430, -0.871928835072483420, -0.871904352351378310, -0.871879867450512380, -0.871855380369946360, -0.871830891109742210, -0.871806399669960990, -0.871781906050663640, +-0.871757410251911560, -0.871732912273766040, -0.871708412116288130, -0.871683909779539250, -0.871659405263580540, -0.871634898568473430, -0.871610389694278510, -0.871585878641058080, +-0.871561365408872970, -0.871536849997784470, -0.871512332407853860, -0.871487812639142320, -0.871463290691710910, -0.871438766565621690, -0.871414240260935610, -0.871389711777713850, +-0.871365181116017800, -0.871340648275908850, -0.871316113257448180, -0.871291576060697290, -0.871267036685717480, -0.871242495132569680, -0.871217951401315970, -0.871193405492017510, +-0.871168857404735490, -0.871144307139531280, -0.871119754696466300, -0.871095200075601590, -0.871070643276999230, -0.871046084300720280, -0.871021523146826130, -0.870996959815378170, +-0.870972394306437800, -0.870947826620066420, -0.870923256756325540, -0.870898684715276540, -0.870874110496980270, -0.870849534101499230, -0.870824955528894380, -0.870800374779227120, +-0.870775791852558930, -0.870751206748951230, -0.870726619468465080, -0.870702030011162860, -0.870677438377105540, -0.870652844566354610, -0.870628248578971590, -0.870603650415017970, +-0.870579050074555270, -0.870554447557644770, -0.870529842864348310, -0.870505235994727180, -0.870480626948842540, -0.870456015726756790, -0.870431402328530890, -0.870406786754226670, +-0.870382169003905300, -0.870357549077628190, -0.870332926975457610, -0.870308302697454740, -0.870283676243681080, -0.870259047614198140, -0.870234416809067770, -0.870209783828351240, +-0.870185148672110280, -0.870160511340406400, -0.870135871833301320, -0.870111230150856120, -0.870086586293133180, -0.870061940260193900, -0.870037292052099680, -0.870012641668912350, +-0.869987989110693300, -0.869963334377503840, -0.869938677469406560, -0.869914018386462540, -0.869889357128733390, -0.869864693696280940, -0.869840028089166830, -0.869815360307452550, +-0.869790690351199820, -0.869766018220470500, -0.869741343915325650, -0.869716667435827870, -0.869691988782038350, -0.869667307954018920, -0.869642624951831200, -0.869617939775537030, +-0.869593252425197470, -0.869568562900875140, -0.869543871202631550, -0.869519177330528190, -0.869494481284626920, -0.869469783064989450, -0.869445082671677530, -0.869420380104752980, +-0.869395675364277310, -0.869370968450312140, -0.869346259362919980, -0.869321548102162110, -0.869296834668100370, -0.869272119060796600, -0.869247401280312530, -0.869222681326709430, +-0.869197959200050160, -0.869173234900396000, -0.869148508427808660, -0.869123779782350110, -0.869099048964082190, -0.869074315973066500, -0.869049580809365120, -0.869024843473039770, +-0.869000103964152280, -0.868975362282764060, -0.868950618428937950, -0.868925872402735220, -0.868901124204217950, -0.868876373833447730, -0.868851621290486210, -0.868826866575395980, +-0.868802109688238680, -0.868777350629076130, -0.868752589397970070, -0.868727825994982660, -0.868703060420175640, -0.868678292673610960, -0.868653522755350570, -0.868628750665456420, +-0.868603976403989900, -0.868579199971013850, -0.868554421366589780, -0.868529640590779750, -0.868504857643645600, -0.868480072525249280, -0.868455285235652300, -0.868430495774917600, +-0.868405704143106690, -0.868380910340281420, -0.868356114366503950, -0.868331316221836240, -0.868306515906340120, -0.868281713420077760, -0.868256908763111120, -0.868232101935501820, +-0.868207292937312690, -0.868182481768605240, -0.868157668429441640, -0.868132852919883960, -0.868108035239994020, -0.868083215389833570, -0.868058393369465550, -0.868033569178951580, +-0.868008742818353610, -0.867983914287733800, -0.867959083587154230, -0.867934250716676960, -0.867909415676364150, -0.867884578466277650, -0.867859739086479290, -0.867834897537032130, +-0.867810053817997580, -0.867785207929438030, -0.867760359871415310, -0.867735509643991820, -0.867710657247229070, -0.867685802681190110, -0.867660945945936680, -0.867636087041530830, +-0.867611225968034860, -0.867586362725510710, -0.867561497314020660, -0.867536629733627000, -0.867511759984391670, -0.867486888066376970, -0.867462013979644510, -0.867437137724257570, +-0.867412259300277770, -0.867387378707767280, -0.867362495946788380, -0.867337611017402700, -0.867312723919673510, -0.867287834653662550, -0.867262943219431980, -0.867238049617044090, +-0.867213153846561060, -0.867188255908045050, -0.867163355801558460, -0.867138453527163460, -0.867113549084922440, -0.867088642474897030, -0.867063733697150400, -0.867038822751744490, +-0.867013909638741480, -0.866988994358203760, -0.866964076910193500, -0.866939157294772670, -0.866914235512004310, -0.866889311561950480, -0.866864385444673260, -0.866839457160235140, +-0.866814526708698300, -0.866789594090125240, -0.866764659304578130, -0.866739722352119380, -0.866714783232810930, -0.866689841946715940, -0.866664898493896270, -0.866639952874414420, +-0.866615005088332670, -0.866590055135713410, -0.866565103016618600, -0.866540148731111510, -0.866515192279254000, -0.866490233661108440, -0.866465272876737470, -0.866440309926203130, +-0.866415344809568170, -0.866390377526894740, -0.866365408078245470, -0.866340436463682080, -0.866315462683268200, -0.866290486737065550, -0.866265508625136740, -0.866240528347544170, +-0.866215545904350240, -0.866190561295617000, -0.866165574521407860, -0.866140585581784750, -0.866115594476810190, -0.866090601206546570, -0.866065605771056510, -0.866040608170402510, +-0.866015608404646860, -0.865990606473852290, -0.865965602378081070, -0.865940596117395490, -0.865915587691858830, -0.865890577101533280, -0.865865564346481210, -0.865840549426765250, +-0.865815532342447570, -0.865790513093591340, -0.865765491680258960, -0.865740468102512820, -0.865715442360415420, -0.865690414454029500, -0.865665384383417560, -0.865640352148642100, +-0.865615317749765740, -0.865590281186851110, -0.865565242459960360, -0.865540201569157010, -0.865515158514503000, -0.865490113296061180, -0.865465065913894160, -0.865440016368064340, +-0.865414964658634100, -0.865389910785666850, -0.865364854749224870, -0.865339796549370770, -0.865314736186167170, -0.865289673659676680, -0.865264608969962050, -0.865239542117085870, +-0.865214473101110880, -0.865189401922099140, -0.865164328580114490, -0.865139253075218880, -0.865114175407475260, -0.865089095576946130, -0.865064013583694340, -0.865038929427782040, +-0.865013843109272870, -0.864988754628229000, -0.864963663984713360, -0.864938571178788470, -0.864913476210517170, -0.864888379079962190, -0.864863279787186360, -0.864838178332252180, +-0.864813074715222170, -0.864787968936159950, -0.864762860995127780, -0.864737750892188520, -0.864712638627404770, -0.864687524200839500, -0.864662407612554970, -0.864637288862614820, +-0.864612167951081420, -0.864587044878017740, -0.864561919643486390, -0.864536792247550200, -0.864511662690272020, -0.864486530971714680, -0.864461397091941030, -0.864436261051014010, +-0.864411122848995680, -0.864385982485950110, -0.864360839961939580, -0.864335695277026920, -0.864310548431275080, -0.864285399424746360, -0.864260248257504580, -0.864235094929612260, +-0.864209939441132110, -0.864184781792127210, -0.864159621982660280, -0.864134460012794370, -0.864109295882592220, -0.864084129592116890, -0.864058961141431210, -0.864033790530597700, +-0.864008617759680080, -0.863983442828741070, -0.863958265737843400, -0.863933086487050030, -0.863907905076423900, -0.863882721506027630, -0.863857535775924950, -0.863832347886178460, +-0.863807157836851140, -0.863781965628005910, -0.863756771259705740, -0.863731574732013560, -0.863706376044992560, -0.863681175198705580, -0.863655972193215330, -0.863630767028585430, +-0.863605559704878620, -0.863580350222158070, -0.863555138580486490, -0.863529924779927180, -0.863504708820542530, -0.863479490702396490, -0.863454270425551900, -0.863429047990071470, +-0.863403823396018510, -0.863378596643455950, -0.863353367732446970, -0.863328136663054520, -0.863302903435341770, -0.863277668049371230, -0.863252430505207060, -0.863227190802911770, +-0.863201948942548420, -0.863176704924180300, -0.863151458747870470, -0.863126210413681430, -0.863100959921677350, -0.863075707271920840, -0.863050452464475200, -0.863025195499403260, +-0.862999936376768420, -0.862974675096633730, -0.862949411659062360, -0.862924146064117490, -0.862898878311862180, -0.862873608402359270, -0.862848336335672710, -0.862823062111865440, +-0.862797785731000410, -0.862772507193140910, -0.862747226498349780, -0.862721943646690970, -0.862696658638227310, -0.862671371473022090, -0.862646082151138360, -0.862620790672639410, +-0.862595497037588530, -0.862570201246048880, -0.862544903298083750, -0.862519603193756310, -0.862494300933129510, -0.862468996516267290, -0.862443689943232620, -0.862418381214088760, +-0.862393070328899000, -0.862367757287725970, -0.862342442090634040, -0.862317124737686070, -0.862291805228945330, -0.862266483564474990, -0.862241159744338460, -0.862215833768599000, +-0.862190505637319910, -0.862165175350564690, -0.862139842908396400, -0.862114508310878210, -0.862089171558074070, -0.862063832650047050, -0.862038491586860410, -0.862013148368577560, +-0.861987802995261900, -0.861962455466976250, -0.861937105783784910, -0.861911753945750810, -0.861886399952937250, -0.861861043805407730, -0.861835685503225650, -0.861810325046454380, +-0.861784962435157230, -0.861759597669397690, -0.861734230749238720, -0.861708861674744590, -0.861683490445978250, -0.861658117063003330, -0.861632741525882980, -0.861607363834680950, +-0.861581983989459840, -0.861556601990284390, -0.861531217837217420, -0.861505831530322340, -0.861480443069662760, -0.861455052455301960, -0.861429659687303560, -0.861404264765731060, +-0.861378867690647860, -0.861353468462117130, -0.861328067080203040, -0.861302663544968870, -0.861277257856478020, -0.861251850014794100, -0.861226440019980500, -0.861201027872100290, +-0.861175613571218080, -0.861150197117396710, -0.861124778510699910, -0.861099357751191170, -0.861073934838934020, -0.861048509773992050, -0.861023082556428790, -0.860997653186307830, +-0.860972221663692690, -0.860946787988646540, -0.860921352161234000, -0.860895914181518010, -0.860870474049562180, -0.860845031765430260, -0.860819587329185180, -0.860794140740891670, +-0.860768692000612900, -0.860743241108412270, -0.860717788064353510, -0.860692332868500330, -0.860666875520916360, -0.860641416021665220, -0.860615954370810510, -0.860590490568415860, +-0.860565024614544540, -0.860539556509261170, -0.860514086252628820, -0.860488613844711310, -0.860463139285572280, -0.860437662575275430, -0.860412183713883950, -0.860386702701462450, +-0.860361219538074210, -0.860335734223782840, -0.860310246758652200, -0.860284757142745990, -0.860259265376127850, -0.860233771458861480, -0.860208275391010750, -0.860182777172638800, +-0.860157276803810490, -0.860131774284588870, -0.860106269615037890, -0.860080762795221280, -0.860055253825202650, -0.860029742705045510, -0.860004229434814470, -0.859978714014572820, +-0.859953196444384280, -0.859927676724312920, -0.859902154854422340, -0.859876630834776280, -0.859851104665438680, -0.859825576346473390, -0.859800045877943670, -0.859774513259914270, +-0.859748978492448580, -0.859723441575610540, -0.859697902509463760, -0.859672361294072320, -0.859646817929499480, -0.859621272415809990, -0.859595724753067450, -0.859570174941335470, +-0.859544622980678130, -0.859519068871159250, -0.859493512612842680, -0.859467954205792360, -0.859442393650072020, -0.859416830945745840, -0.859391266092877080, -0.859365699091530600, +-0.859340129941769890, -0.859314558643658800, -0.859288985197261380, -0.859263409602641030, -0.859237831859862580, -0.859212251968989540, -0.859186669930085970, -0.859161085743215590, +-0.859135499408442580, -0.859109910925830890, -0.859084320295444240, -0.859058727517346910, -0.859033132591602740, -0.859007535518275240, -0.858981936297429470, -0.858956334929128820, +-0.858930731413437230, -0.858905125750419000, -0.858879517940137730, -0.858853907982657370, -0.858828295878042660, -0.858802681626357200, -0.858777065227665060, -0.858751446682030180, +-0.858725825989516740, -0.858700203150188690, -0.858674578164110190, -0.858648951031345310, -0.858623321751957440, -0.858597690326011850, -0.858572056753571950, -0.858546421034701910, +-0.858520783169465900, -0.858495143157927850, -0.858469501000151510, -0.858443856696201930, -0.858418210246142620, -0.858392561650037860, -0.858366910907951700, -0.858341258019948210, +-0.858315602986091550, -0.858289945806445910, -0.858264286481075440, -0.858238625010043780, -0.858212961393416070, -0.858187295631255840, -0.858161627723627470, -0.858135957670595030, +-0.858110285472222570, -0.858084611128574040, -0.858058934639714500, -0.858033256005707570, -0.858007575226617410, -0.857981892302508430, -0.857956207233444680, -0.857930520019490330, +-0.857904830660709770, -0.857879139157167180, -0.857853445508926620, -0.857827749716052130, -0.857802051778608580, -0.857776351696660000, -0.857750649470270470, -0.857724945099504370, +-0.857699238584425430, -0.857673529925098930, -0.857647819121588490, -0.857622106173958510, -0.857596391082273260, -0.857570673846597130, -0.857544954466994300, -0.857519232943528940, +-0.857493509276265660, -0.857467783465268530, -0.857442055510601490, -0.857416325412329820, -0.857390593170517250, -0.857364858785228280, -0.857339122256527200, -0.857313383584478170, +-0.857287642769145370, -0.857261899810593750, -0.857236154708887480, -0.857210407464090830, -0.857184658076268200, -0.857158906545483880, -0.857133152871802250, -0.857107397055287820, +-0.857081639096004880, -0.857055878994017360, -0.857030116749390560, -0.857004352362188530, -0.856978585832475660, -0.856952817160316240, -0.856927046345774770, -0.856901273388915310, +-0.856875498289803140, -0.856849721048502100, -0.856823941665076800, -0.856798160139591650, -0.856772376472111130, -0.856746590662699650, -0.856720802711421700, -0.856695012618341800, +-0.856669220383523890, -0.856643426007033360, -0.856617629488934160, -0.856591830829291020, -0.856566030028168330, -0.856540227085630490, -0.856514422001741660, -0.856488614776567130, +-0.856462805410171170, -0.856436993902618180, -0.856411180253972670, -0.856385364464299250, -0.856359546533662420, -0.856333726462126690, -0.856307904249756670, -0.856282079896616980, +-0.856256253402771450, -0.856230424768285920, -0.856204593993224240, -0.856178761077651010, -0.856152926021630960, -0.856127088825228140, -0.856101249488508080, -0.856075408011534810, +-0.856049564394373070, -0.856023718637087370, -0.855997870739742430, -0.855972020702402860, -0.855946168525133170, -0.855920314207998080, -0.855894457751062210, -0.855868599154389730, +-0.855842738418046150, -0.855816875542095850, -0.855791010526603220, -0.855765143371633120, -0.855739274077250260, -0.855713402643518580, -0.855687529070504050, -0.855661653358270600, +-0.855635775506882970, -0.855609895516405980, -0.855584013386904150, -0.855558129118442310, -0.855532242711085190, -0.855506354164897510, -0.855480463479943440, -0.855454570656288720, +-0.855428675693997500, -0.855402778593134630, -0.855376879353764720, -0.855350977975952720, -0.855325074459762800, -0.855299168805260690, -0.855273261012510560, -0.855247351081577340, +-0.855221439012525670, -0.855195524805420490, -0.855169608460326520, -0.855143689977308500, -0.855117769356431250, -0.855091846597759050, -0.855065921701357760, -0.855039994667291640, +-0.855014065495625530, -0.854988134186424280, -0.854962200739752710, -0.854936265155675110, -0.854910327434257430, -0.854884387575563840, -0.854858445579659290, -0.854832501446608610, +-0.854806555176476750, -0.854780606769328430, -0.854754656225228620, -0.854728703544242130, -0.854702748726433930, -0.854676791771868390, -0.854650832680611370, -0.854624871452727140, +-0.854598908088280870, -0.854572942587337290, -0.854546974949960900, -0.854521005176217540, -0.854495033266171600, -0.854469059219888140, -0.854443083037431990, -0.854417104718868110, +-0.854391124264261560, -0.854365141673677160, -0.854339156947179880, -0.854313170084834760, -0.854287181086706200, -0.854261189952860160, -0.854235196683361230, -0.854209201278274160, +-0.854183203737664210, -0.854157204061596230, -0.854131202250134720, -0.854105198303345750, -0.854079192221293690, -0.854053184004043730, -0.854027173651660700, -0.854001161164209880, +-0.853975146541756100, -0.853949129784364440, -0.853923110892099930, -0.853897089865027210, -0.853871066703212220, -0.853845041406719570, -0.853819013975614330, -0.853792984409961540, +-0.853766952709826280, -0.853740918875273260, -0.853714882906368320, -0.853688844803176190, -0.853662804565761930, -0.853636762194190600, -0.853610717688527480, -0.853584671048837510, +-0.853558622275185860, -0.853532571367637720, -0.853506518326257680, -0.853480463151111700, -0.853454405842264730, -0.853428346399781600, -0.853402284823727600, -0.853376221114168000, +-0.853350155271167310, -0.853324087294791700, -0.853298017185105890, -0.853271944942175060, -0.853245870566064380, -0.853219794056838900, -0.853193715414564010, -0.853167634639304890, +-0.853141551731126600, -0.853115466690094530, -0.853089379516273280, -0.853063290209729040, -0.853037198770526530, -0.853011105198731020, -0.852985009494407810, -0.852958911657621610, +-0.852932811688438600, -0.852906709586923490, -0.852880605353141700, -0.852854498987158370, -0.852828390489038690, -0.852802279858848160, -0.852776167096651940, -0.852750052202515210, +-0.852723935176503360, -0.852697816018681220, -0.852671694729115080, -0.852645571307869670, -0.852619445755010250, -0.852593318070602350, -0.852567188254711010, -0.852541056307401290, +-0.852514922228739480, -0.852488786018790300, -0.852462647677619150, -0.852436507205291400, -0.852410364601872360, -0.852384219867427410, -0.852358073002021930, -0.852331924005721220, +-0.852305772878590220, -0.852279619620695320, -0.852253464232101350, -0.852227306712873720, -0.852201147063077810, -0.852174985282779130, -0.852148821372042400, -0.852122655330934120, +-0.852096487159519240, -0.852070316857863050, -0.852044144426031160, -0.852017969864088840, -0.851991793172101610, -0.851965614350134960, -0.851939433398254290, -0.851913250316524430, +-0.851887065105012000, -0.851860877763781940, -0.851834688292899660, -0.851808496692430640, -0.851782302962440400, -0.851756107102993880, -0.851729909114157690, -0.851703708995996570, +-0.851677506748576230, -0.851651302371962180, -0.851625095866219820, -0.851598887231414750, -0.851572676467612480, -0.851546463574878510, -0.851520248553278350, -0.851494031402877050, +-0.851467812123741230, -0.851441590715935840, -0.851415367179526480, -0.851389141514578780, -0.851362913721157690, -0.851336683799329700, -0.851310451749160090, -0.851284217570714370, +-0.851257981264058050, -0.851231742829256840, -0.851205502266376260, -0.851179259575481910, -0.851153014756639400, -0.851126767809914360, -0.851100518735371960, -0.851074267533078690, +-0.851048014203099720, -0.851021758745500790, -0.850995501160347390, -0.850969241447705360, -0.850942979607639650, -0.850916715640216980, -0.850890449545502530, -0.850864181323562010, +-0.850837910974460930, -0.850811638498265130, -0.850785363895040230, -0.850759087164851930, -0.850732808307765880, -0.850706527323847440, -0.850680244213163020, -0.850653958975778110, +-0.850627671611758230, -0.850601382121169090, -0.850575090504076650, -0.850548796760545960, -0.850522500890643740, -0.850496202894435280, -0.850469902771986310, -0.850443600523362540, +-0.850417296148629820, -0.850390989647853870, -0.850364681021100410, -0.850338370268435280, -0.850312057389923660, -0.850285742385632480, -0.850259425255626920, -0.850233105999972700, +-0.850206784618735890, -0.850180461111981980, -0.850154135479776470, -0.850127807722186210, -0.850101477839276250, -0.850075145831112770, -0.850048811697761250, -0.850022475439287880, +-0.849996137055758160, -0.849969796547238250, -0.849943453913793780, -0.849917109155490570, -0.849890762272394240, -0.849864413264571410, -0.849838062132087570, -0.849811708875008680, +-0.849785353493400450, -0.849758995987328290, -0.849732636356859140, -0.849706274602058500, -0.849679910722992090, -0.849653544719725870, -0.849627176592325890, -0.849600806340857880, +-0.849574433965387900, -0.849548059465981780, -0.849521682842705570, -0.849495304095624680, -0.849468923224805940, -0.849442540230314960, -0.849416155112217570, -0.849389767870579850, +-0.849363378505467730, -0.849336987016946600, -0.849310593405083520, -0.849284197669944010, -0.849257799811593990, -0.849231399830099430, -0.849204997725526380, -0.849178593497940780, +-0.849152187147408810, -0.849125778673996300, -0.849099368077768870, -0.849072955358793570, -0.849046540517135790, -0.849020123552861720, -0.848993704466037280, -0.848967283256728660, +-0.848940859925001230, -0.848914434470922300, -0.848888006894557120, -0.848861577195971990, -0.848835145375232970, -0.848808711432405990, -0.848782275367557350, -0.848755837180752870, +-0.848729396872058950, -0.848702954441540980, -0.848676509889266130, -0.848650063215300010, -0.848623614419708680, -0.848597163502558320, -0.848570710463915080, -0.848544255303844590, +-0.848517798022413890, -0.848491338619688840, -0.848464877095735260, -0.848438413450619660, -0.848411947684407860, -0.848385479797166280, -0.848359009788961060, -0.848332537659858170, +-0.848306063409923980, -0.848279587039224240, -0.848253108547825980, -0.848226627935794950, -0.848200145203197310, -0.848173660350099330, -0.848147173376566640, -0.848120684282666630, +-0.848094193068464790, -0.848067699734027620, -0.848041204279421090, -0.848014706704711570, -0.847988207009965240, -0.847961705195248490, -0.847935201260627380, -0.847908695206168290, +-0.847882187031937070, -0.847855676738000770, -0.847829164324425340, -0.847802649791276950, -0.847776133138621880, -0.847749614366526070, -0.847723093475056700, -0.847696570464279710, +-0.847670045334261160, -0.847643518085067550, -0.847616988716765050, -0.847590457229420170, -0.847563923623099070, -0.847537387897868260, -0.847510850053793900, -0.847484310090942050, +-0.847457768009379770, -0.847431223809173130, -0.847404677490388390, -0.847378129053091960, -0.847351578497350320, -0.847325025823229220, -0.847298471030795920, -0.847271914120116490, +-0.847245355091257310, -0.847218793944284790, -0.847192230679265190, -0.847165665296265020, -0.847139097795350790, -0.847112528176588660, -0.847085956440044920, -0.847059382585786610, +-0.847032806613879920, -0.847006228524391220, -0.846979648317386810, -0.846953065992933410, -0.846926481551096840, -0.846899894991944620, -0.846873306315542580, -0.846846715521957340, +-0.846820122611255170, -0.846793527583502790, -0.846766930438766610, -0.846740331177113110, -0.846713729798608710, -0.846687126303319990, -0.846660520691313030, -0.846633912962655220, +-0.846607303117412720, -0.846580691155651820, -0.846554077077439240, -0.846527460882841030, -0.846500842571924710, -0.846474222144756210, -0.846447599601402030, -0.846420974941929030, +-0.846394348166403470, -0.846367719274892070, -0.846341088267461460, -0.846314455144178020, -0.846287819905108480, -0.846261182550319010, -0.846234543079876890, -0.846207901493848500, +-0.846181257792300360, -0.846154611975299060, -0.846127964042910800, -0.846101313995203050, -0.846074661832242110, -0.846048007554094370, -0.846021351160826660, -0.845994692652505710, +-0.845968032029197900, -0.845941369290969970, -0.845914704437888740, -0.845888037470020620, -0.845861368387431980, -0.845834697190190440, -0.845808023878362070, -0.845781348452013690, +-0.845754670911212040, -0.845727991256023600, -0.845701309486514670, -0.845674625602753080, -0.845647939604804780, -0.845621251492736700, -0.845594561266615470, -0.845567868926507930, +-0.845541174472480560, -0.845514477904600440, -0.845487779222933940, -0.845461078427547590, -0.845434375518509080, -0.845407670495884610, -0.845380963359740890, -0.845354254110144750, +-0.845327542747163040, -0.845300829270862030, -0.845274113681309450, -0.845247395978571460, -0.845220676162715010, -0.845193954233806940, -0.845167230191913980, -0.845140504037102840, +-0.845113775769440580, -0.845087045388993820, -0.845060312895828950, -0.845033578290013800, -0.845006841571614650, -0.844980102740698460, -0.844953361797331940, -0.844926618741582150, +-0.844899873573515150, -0.844873126293199110, -0.844846376900700190, -0.844819625396085350, -0.844792871779421420, -0.844766116050775340, -0.844739358210213950, -0.844712598257804090, +-0.844685836193612820, -0.844659072017706960, -0.844632305730152910, -0.844605537331018620, -0.844578766820370470, -0.844551994198275420, -0.844525219464800300, -0.844498442620011720, +-0.844471663663977520, -0.844444882596764200, -0.844418099418438590, -0.844391314129067760, -0.844364526728718650, -0.844337737217458200, -0.844310945595353470, -0.844284151862471300, +-0.844257356018878860, -0.844230558064642420, -0.844203757999830160, -0.844176955824508470, -0.844150151538744400, -0.844123345142604900, -0.844096536636157020, -0.844069726019467390, +-0.844042913292603950, -0.844016098455633190, -0.843989281508622180, -0.843962462451637970, -0.843935641284747630, -0.843908818008018090, -0.843881992621516640, -0.843855165125310110, +-0.843828335519465230, -0.843801503804050060, -0.843774669979130980, -0.843747834044775270, -0.843720996001050110, -0.843694155848022320, -0.843667313585758750, -0.843640469214327230, +-0.843613622733794700, -0.843586774144228000, -0.843559923445694420, -0.843533070638261000, -0.843506215721994910, -0.843479358696963330, -0.843452499563233320, -0.843425638320871580, +-0.843398774969946310, -0.843371909510523990, -0.843345041942671900, -0.843318172266457220, -0.843291300481947110, -0.843264426589208300, -0.843237550588308960, -0.843210672479315580, +-0.843183792262295670, -0.843156909937316180, -0.843130025504444490, -0.843103138963747670, -0.843076250315292990, -0.843049359559147730, -0.843022466695379060, -0.842995571724053820, +-0.842968674645240060, -0.842941775459004620, -0.842914874165414770, -0.842887970764537700, -0.842861065256440220, -0.842834157641190520, -0.842807247918855530, -0.842780336089502310, +-0.842753422153198370, -0.842726506110010760, -0.842699587960006990, -0.842672667703254110, -0.842645745339819730, -0.842618820869770910, -0.842591894293174490, -0.842564965610098860, +-0.842538034820610850, -0.842511101924777740, -0.842484166922666920, -0.842457229814345570, -0.842430290599880730, -0.842403349279340690, -0.842376405852792160, -0.842349460320302780, +-0.842322512681939580, -0.842295562937770190, -0.842268611087861880, -0.842241657132282050, -0.842214701071098080, -0.842187742904376920, -0.842160782632186740, -0.842133820254594710, +-0.842106855771668110, -0.842079889183474430, -0.842052920490080960, -0.842025949691554750, -0.841998976787964090, -0.841972001779376030, -0.841945024665857970, -0.841918045447477280, +-0.841891064124301590, -0.841864080696398060, -0.841837095163834540, -0.841810107526678180, -0.841783117784996040, -0.841756125938856630, -0.841729131988326880, -0.841702135933474320, +-0.841675137774366420, -0.841648137511070700, -0.841621135143654220, -0.841594130672185250, -0.841567124096730960, -0.841540115417358960, -0.841513104634136640, -0.841486091747131510, +-0.841459076756411180, -0.841432059662043150, -0.841405040464094920, -0.841378019162633660, -0.841350995757727870, -0.841323970249444610, -0.841296942637851260, -0.841269912923015670, +-0.841242881105005340, -0.841215847183887750, -0.841188811159730100, -0.841161773032600870, -0.841134732802567230, -0.841107690469696690, -0.841080646034056970, -0.841053599495715680, +-0.841026550854740430, -0.840999500111198620, -0.840972447265157740, -0.840945392316686190, -0.840918335265851140, -0.840891276112720190, -0.840864214857361180, -0.840837151499841510, +-0.840810086040229000, -0.840783018478590830, -0.840755948814995600, -0.840728877049510490, -0.840701803182203110, -0.840674727213141290, -0.840647649142392650, -0.840620568970024910, +-0.840593486696105780, -0.840566402320702790, -0.840539315843883420, -0.840512227265716280, -0.840485136586268440, -0.840458043805607850, -0.840430948923802210, -0.840403851940919040, +-0.840376752857025840, -0.840349651672191330, -0.840322548386482570, -0.840295442999967500, -0.840268335512713740, -0.840241225924789230, -0.840214114236261580, -0.840187000447198740, +-0.840159884557668320, -0.840132766567737720, -0.840105646477475650, -0.840078524286949620, -0.840051399996227130, -0.840024273605376240, -0.839997145114464550, -0.839970014523560020, +-0.839942881832730030, -0.839915747042043300, -0.839888610151567240, -0.839861471161369670, -0.839834330071518310, -0.839807186882081220, -0.839780041593126140, -0.839752894204720880, +-0.839725744716932950, -0.839698593129831190, -0.839671439443482880, -0.839644283657956070, -0.839617125773318480, -0.839589965789638070, -0.839562803706982770, -0.839535639525419990, +-0.839508473245018540, -0.839481304865845930, -0.839454134387970120, -0.839426961811458930, -0.839399787136380300, -0.839372610362802200, -0.839345431490792660, -0.839318250520418970, +-0.839291067451750190, -0.839263882284853710, -0.839236695019797590, -0.839209505656649650, -0.839182314195477950, -0.839155120636350560, -0.839127924979334750, -0.839100727224499690, +-0.839073527371912760, -0.839046325421642040, -0.839019121373755560, -0.838991915228321280, -0.838964706985407150, -0.838937496645081220, -0.838910284207411650, -0.838883069672465840, +-0.838855853040312850, -0.838828634311020170, -0.838801413484655980, -0.838774190561288210, -0.838746965540985050, -0.838719738423813870, -0.838692509209843840, -0.838665277899142580, +-0.838638044491778150, -0.838610808987818590, -0.838583571387331970, -0.838556331690386460, -0.838529089897050110, -0.838501846007391080, -0.838474600021476890, -0.838447351939376690, +-0.838420101761158220, -0.838392849486889410, -0.838365595116638440, -0.838338338650473470, -0.838311080088462780, -0.838283819430673760, -0.838256556677175800, -0.838229291828036290, +-0.838202024883323740, -0.838174755843105970, -0.838147484707451370, -0.838120211476428120, -0.838092936150104270, -0.838065658728547660, -0.838038379211827330, -0.838011097600011020, +-0.837983813893167010, -0.837956528091363450, -0.837929240194668630, -0.837901950203150610, -0.837874658116877340, -0.837847363935917850, -0.837820067660339900, -0.837792769290211960, +-0.837765468825601880, -0.837738166266578270, -0.837710861613209180, -0.837683554865563010, -0.837656246023707360, -0.837628935087711630, -0.837601622057643550, -0.837574306933571490, +-0.837546989715563630, -0.837519670403688240, -0.837492348998013720, -0.837465025498607800, -0.837437699905539850, -0.837410372218877600, -0.837383042438689440, -0.837355710565043650, +-0.837328376598008630, -0.837301040537652640, -0.837273702384044080, -0.837246362137251340, -0.837219019797342030, -0.837191675364385770, -0.837164328838450380, -0.837136980219604030, +-0.837109629507915340, -0.837082276703452480, -0.837054921806283490, -0.837027564816477660, -0.837000205734102940, -0.836972844559227710, -0.836945481291920370, -0.836918115932249300, +-0.836890748480283000, -0.836863378936089750, -0.836836007299738170, -0.836808633571295980, -0.836781257750832670, -0.836753879838416310, -0.836726499834115180, -0.836699117737997880, +-0.836671733550132690, -0.836644347270588230, -0.836616958899432440, -0.836589568436734710, -0.836562175882562990, -0.836534781236985880, -0.836507384500071890, -0.836479985671889300, +-0.836452584752506830, -0.836425181741992870, -0.836397776640415590, -0.836370369447844150, -0.836342960164346950, -0.836315548789992260, -0.836288135324848800, -0.836260719768984860, +-0.836233302122469160, -0.836205882385369750, -0.836178460557756130, -0.836151036639696370, -0.836123610631259060, -0.836096182532512610, -0.836068752343525730, -0.836041320064367040, +-0.836013885695105040, -0.835986449235807780, -0.835959010686544880, -0.835931570047384500, -0.835904127318395250, -0.835876682499645530, -0.835849235591204160, -0.835821786593139770, +-0.835794335505520400, -0.835766882328415670, -0.835739427061893750, -0.835711969706023240, -0.835684510260872760, -0.835657048726511140, -0.835629585103006780, -0.835602119390428500, +-0.835574651588844920, -0.835547181698324200, -0.835519709718935970, -0.835492235650748590, -0.835464759493830480, -0.835437281248250560, -0.835409800914077460, -0.835382318491379340, +-0.835354833980225920, -0.835327347380685370, -0.835299858692826520, -0.835272367916717990, -0.835244875052428500, -0.835217380100026880, -0.835189883059581750, -0.835162383931162040, +-0.835134882714835710, -0.835107379410672810, -0.835079874018741400, -0.835052366539110300, -0.835024856971848250, -0.834997345317024080, -0.834969831574706610, -0.834942315744964030, +-0.834914797827866150, -0.834887277823481270, -0.834859755731878210, -0.834832231553125800, -0.834804705287292670, -0.834777176934447970, -0.834749646494660210, -0.834722113967997890, +-0.834694579354530730, -0.834667042654327120, -0.834639503867455890, -0.834611962993985990, -0.834584420033986140, -0.834556874987525180, -0.834529327854671600, -0.834501778635495130, +-0.834474227330064270, -0.834446673938447850, -0.834419118460714700, -0.834391560896933780, -0.834364001247174030, -0.834336439511504270, -0.834308875689992790, -0.834281309782709650, +-0.834253741789723340, -0.834226171711102580, -0.834198599546916440, -0.834171025297233750, -0.834143448962123560, -0.834115870541654260, -0.834088290035895690, -0.834060707444916450, +-0.834033122768785380, -0.834005536007571660, -0.833977947161343990, -0.833950356230171440, -0.833922763214123060, -0.833895168113267690, -0.833867570927673940, -0.833839971657411750, +-0.833812370302549730, -0.833784766863156720, -0.833757161339301780, -0.833729553731053840, -0.833701944038481630, -0.833674332261655100, -0.833646718400642640, -0.833619102455513410, +-0.833591484426336460, -0.833563864313180860, -0.833536242116115430, -0.833508617835209460, -0.833480991470532010, -0.833453363022151560, -0.833425732490138180, -0.833398099874560480, +-0.833370465175487520, -0.833342828392988340, -0.833315189527132240, -0.833287548577987590, -0.833259905545624570, -0.833232260430111780, -0.833204613231518290, -0.833176963949913360, +-0.833149312585365950, -0.833121659137945230, -0.833094003607720460, -0.833066345994760590, -0.833038686299134470, -0.833011024520912020, -0.832983360660162100, -0.832955694716953630, +-0.832928026691356130, -0.832900356583438420, -0.832872684393269890, -0.832845010120919050, -0.832817333766456280, -0.832789655329950200, -0.832761974811469850, -0.832734292211084750, +-0.832706607528863720, -0.832678920764876370, -0.832651231919191550, -0.832623540991878190, -0.832595847983006570, -0.832568152892645190, -0.832540455720863550, -0.832512756467730710, +-0.832485055133316050, -0.832457351717688640, -0.832429646220917420, -0.832401938643072550, -0.832374228984222860, -0.832346517244437640, -0.832318803423786060, -0.832291087522337490, +-0.832263369540161220, -0.832235649477326530, -0.832207927333902700, -0.832180203109958550, -0.832152476805564370, -0.832124748420788980, -0.832097017955701790, -0.832069285410372060, +-0.832041550784869080, -0.832013814079261670, -0.831986075293620340, -0.831958334428013700, -0.831930591482511360, -0.831902846457182490, -0.831875099352096470, -0.831847350167322700, +-0.831819598902930560, -0.831791845558989440, -0.831764090135568180, -0.831736332632737270, -0.831708573050565450, -0.831680811389122200, -0.831653047648476920, -0.831625281828699100, +-0.831597513929857480, -0.831569743952022660, -0.831541971895263470, -0.831514197759649300, -0.831486421545249650, -0.831458643252133920, -0.831430862880371600, -0.831403080430032190, +-0.831375295901184970, -0.831347509293899110, -0.831319720608244880, -0.831291929844291460, -0.831264137002108110, -0.831236342081764450, -0.831208545083329970, -0.831180746006874080, +-0.831152944852465940, -0.831125141620175810, -0.831097336310072880, -0.831069528922226630, -0.831041719456706460, -0.831013907913582090, -0.830986094292922920, -0.830958278594798540, +-0.830930460819277910, -0.830902640966431630, -0.830874819036328870, -0.830846995029038910, -0.830819168944631480, -0.830791340783176180, -0.830763510544742510, -0.830735678229399640, +-0.830707843837217960, -0.830680007368266750, -0.830652168822615500, -0.830624328200333830, -0.830596485501491340, -0.830568640726157550, -0.830540793874402270, -0.830512944946295020, +-0.830485093941904840, -0.830457240861302460, -0.830429385704556930, -0.830401528471737980, -0.830373669162915220, -0.830345807778158250, -0.830317944317536250, -0.830290078781119930, +-0.830262211168978360, -0.830234341481181250, -0.830206469717798430, -0.830178595878899310, -0.830150719964553700, -0.830122841974831330, -0.830094961909801920, -0.830067079769534530, +-0.830039195554099880, -0.830011309263567370, -0.829983420898006470, -0.829955530457487160, -0.829927637942078910, -0.829899743351851020, -0.829871846686874410, -0.829843947947218050, +-0.829816047132951980, -0.829788144244145710, -0.829760239280869060, -0.829732332243191760, -0.829704423131183750, -0.829676511944914650, -0.829648598684453730, -0.829620683349871820, +-0.829592765941238210, -0.829564846458622720, -0.829536924902095070, -0.829509001271725110, -0.829481075567582660, -0.829453147789737000, -0.829425217938258960, -0.829397286013217940, +-0.829369352014683650, -0.829341415942726030, -0.829313477797414820, -0.829285537578819950, -0.829257595287011260, -0.829229650922058030, -0.829201704484031190, -0.829173755973000140, +-0.829145805389034600, -0.829117852732204620, -0.829089898002579930, -0.829061941200230580, -0.829033982325225850, -0.829006021377636680, -0.828978058357532350, -0.828950093264983030, +-0.828922126100058440, -0.828894156862828520, -0.828866185553363110, -0.828838212171732370, -0.828810236718006020, -0.828782259192253680, -0.828754279594546060, -0.828726297924952780, +-0.828698314183543780, -0.828670328370389010, -0.828642340485558400, -0.828614350529121470, -0.828586358501149150, -0.828558364401710930, -0.828530368230876780, -0.828502369988716740, +-0.828474369675300750, -0.828446367290698870, -0.828418362834981050, -0.828390356308217330, -0.828362347710477120, -0.828334337041831680, -0.828306324302350290, -0.828278309492103240, +-0.828250292611160340, -0.828222273659591670, -0.828194252637466820, -0.828166229544856860, -0.828138204381831280, -0.828110177148460250, -0.828082147844813820, -0.828054116470961940, +-0.828026083026974780, -0.827998047512922390, -0.827970009928874930, -0.827941970274901910, -0.827913928551074490, -0.827885884757462280, -0.827857838894135330, -0.827829790961163710, +-0.827801740958617690, -0.827773688886567330, -0.827745634745082230, -0.827717578534233560, -0.827689520254090930, -0.827661459904724510, -0.827633397486204460, -0.827605332998600840, +-0.827577266441983930, -0.827549197816423890, -0.827521127121990330, -0.827493054358754420, -0.827464979526785880, -0.827436902626154880, -0.827408823656931690, -0.827380742619186370, +-0.827352659512989200, -0.827324574338409890, -0.827296487095519730, -0.827268397784388210, -0.827240306405085830, -0.827212212957682660, -0.827184117442248850, -0.827156019858854900, +-0.827127920207570750, -0.827099818488466370, -0.827071714701613000, -0.827043608847080280, -0.827015500924938580, -0.826987390935258080, -0.826959278878109050, -0.826931164753561990, +-0.826903048561686390, -0.826874930302553660, -0.826846809976233720, -0.826818687582796640, -0.826790563122312920, -0.826762436594852710, -0.826734308000486420, -0.826706177339284420, +-0.826678044611317000, -0.826649909816653870, -0.826621772955366540, -0.826593634027524730, -0.826565493033198930, -0.826537349972459310, -0.826509204845376270, -0.826481057652019850, +-0.826452908392461220, -0.826424757066770320, -0.826396603675017440, -0.826368448217273180, -0.826340290693607700, -0.826312131104091630, -0.826283969448795120, -0.826255805727788780, +-0.826227639941142340, -0.826199472088927300, -0.826171302171213600, -0.826143130188071620, -0.826114956139571870, -0.826086780025784730, -0.826058601846780590, -0.826030421602629520, +-0.826002239293402770, -0.825974054919170530, -0.825945868480003180, -0.825917679975971100, -0.825889489407144790, -0.825861296773594770, -0.825833102075391510, -0.825804905312605090, +-0.825776706485306770, -0.825748505593566720, -0.825720302637455440, -0.825692097617043430, -0.825663890532401190, -0.825635681383599110, -0.825607470170707460, -0.825579256893797520, +-0.825551041552939460, -0.825522824148203880, -0.825494604679661180, -0.825466383147381970, -0.825438159551436850, -0.825409933891896210, -0.825381706168830330, -0.825353476382310710, +-0.825325244532407300, -0.825297010619190810, -0.825268774642731850, -0.825240536603100930, -0.825212296500368650, -0.825184054334605180, -0.825155810105882010, -0.825127563814269330, +-0.825099315459837720, -0.825071065042657930, -0.825042812562800320, -0.825014558020335850, -0.824986301415334910, -0.824958042747868100, -0.824929782018005820, -0.824901519225819560, +-0.824873254371379480, -0.824844987454756320, -0.824816718476020670, -0.824788447435243150, -0.824760174332494040, -0.824731899167845060, -0.824703621941366260, -0.824675342653128470, +-0.824647061303202310, -0.824618777891658490, -0.824590492418567740, -0.824562204884000670, -0.824533915288028220, -0.824505623630720330, -0.824477329912148950, -0.824449034132384350, +-0.824420736291497040, -0.824392436389557950, -0.824364134426637700, -0.824335830402807220, -0.824307524318136590, -0.824279216172697620, -0.824250905966560700, -0.824222593699796450, +-0.824194279372475690, -0.824165962984669380, -0.824137644536448000, -0.824109324027882620, -0.824081001459043390, -0.824052676830002050, -0.824024350140829200, -0.823996021391595330, +-0.823967690582371510, -0.823939357713228350, -0.823911022784236890, -0.823882685795467420, -0.823854346746991650, -0.823826005638879980, -0.823797662471203340, -0.823769317244032570, +-0.823740969957438510, -0.823712620611491970, -0.823684269206264030, -0.823655915741824730, -0.823627560218246240, -0.823599202635598830, -0.823570842993953330, -0.823542481293380810, +-0.823514117533952090, -0.823485751715738120, -0.823457383838809180, -0.823429013903237310, -0.823400641909092900, -0.823372267856446900, -0.823343891745370260, -0.823315513575933800, +-0.823287133348208690, -0.823258751062265650, -0.823230366718175730, -0.823201980316009440, -0.823173591855838720, -0.823145201337733940, -0.823116808761766180, -0.823088414128006370, +-0.823060017436525570, -0.823031618687394270, -0.823003217880684420, -0.822974815016466410, -0.822946410094811510, -0.822918003115790440, -0.822889594079474480, -0.822861182985934470, +-0.822832769835241560, -0.822804354627466710, -0.822775937362680400, -0.822747518040954810, -0.822719096662360430, -0.822690673226968320, -0.822662247734849420, -0.822633820186075000, +-0.822605390580716020, -0.822576958918843080, -0.822548525200528240, -0.822520089425842090, -0.822491651594855710, -0.822463211707640140, -0.822434769764266550, -0.822406325764806100, +-0.822377879709329850, -0.822349431597908300, -0.822320981430613720, -0.822292529207516720, -0.822264074928688360, -0.822235618594199910, -0.822207160204122320, -0.822178699758526750, +-0.822150237257484040, -0.822121772701066230, -0.822093306089344060, -0.822064837422388450, -0.822036366700270920, -0.822007893923062390, -0.821979419090834160, -0.821950942203657280, +-0.821922463261602680, -0.821893982264742310, -0.821865499213147110, -0.821837014106888030, -0.821808526946036460, -0.821780037730663550, -0.821751546460840700, -0.821723053136638290, +-0.821694557758128830, -0.821666060325383030, -0.821637560838471950, -0.821609059297467080, -0.821580555702439490, -0.821552050053460550, -0.821523542350601430, -0.821495032593933530, +-0.821466520783527550, -0.821438006919455790, -0.821409491001788950, -0.821380973030598320, -0.821352453005955390, -0.821323930927931210, -0.821295406796596850, -0.821266880612024350, +-0.821238352374284660, -0.821209822083449170, -0.821181289739589040, -0.821152755342775760, -0.821124218893080520, -0.821095680390574790, -0.821067139835329750, -0.821038597227416460, +-0.821010052566907180, -0.820981505853872750, -0.820952957088384560, -0.820924406270514000, -0.820895853400332330, -0.820867298477911180, -0.820838741503321150, -0.820810182476634840, +-0.820781621397922990, -0.820753058267257200, -0.820724493084708740, -0.820695925850349010, -0.820667356564249490, -0.820638785226481480, -0.820610211837116130, -0.820581636396225720, +-0.820553058903881190, -0.820524479360154050, -0.820495897765115670, -0.820467314118837550, -0.820438728421391210, -0.820410140672847450, -0.820381550873279020, -0.820352959022756510, +-0.820324365121351650, -0.820295769169135940, -0.820267171166180750, -0.820238571112557710, -0.820209969008338200, -0.820181364853593280, -0.820152758648395430, -0.820124150392815610, +-0.820095540086925530, -0.820066927730796590, -0.820038313324500280, -0.820009696868108210, -0.819981078361691430, -0.819952457805322330, -0.819923835199072190, -0.819895210543012510, +-0.819866583837214670, -0.819837955081750500, -0.819809324276691400, -0.819780691422108960, -0.819752056518074810, -0.819723419564659990, -0.819694780561937120, -0.819666139509977350, +-0.819637496408852200, -0.819608851258633360, -0.819580204059392250, -0.819551554811200230, -0.819522903514129820, -0.819494250168252170, -0.819465594773638890, -0.819436937330361600, +-0.819408277838492020, -0.819379616298101740, -0.819350952709262390, -0.819322287072045690, -0.819293619386522680, -0.819264949652766190, -0.819236277870847300, -0.819207604040837700, +-0.819178928162809130, -0.819150250236833190, -0.819121570262981710, -0.819092888241325760, -0.819064204171938040, -0.819035518054889940, -0.819006829890252970, -0.818978139678098960, +-0.818949447418499510, -0.818920753111526460, -0.818892056757251630, -0.818863358355746080, -0.818834657907082650, -0.818805955411332500, -0.818777250868567560, -0.818748544278859460, +-0.818719835642280010, -0.818691124958900950, -0.818662412228793660, -0.818633697452030740, -0.818604980628683590, -0.818576261758824030, -0.818547540842523790, -0.818518817879854700, +-0.818490092870888590, -0.818461365815697170, -0.818432636714351960, -0.818403905566925550, -0.818375172373489450, -0.818346437134115370, -0.818317699848875260, -0.818288960517840840, +-0.818260219141084040, -0.818231475718676160, -0.818202730250690120, -0.818173982737197210, -0.818145233178269480, -0.818116481573978540, -0.818087727924396440, -0.818058972229595010, +-0.818030214489646190, -0.818001454704621820, -0.817972692874593290, -0.817943928999633530, -0.817915163079813930, -0.817886395115206440, -0.817857625105882890, -0.817828853051915440, +-0.817800078953375250, -0.817771302810335390, -0.817742524622867230, -0.817713744391042830, -0.817684962114934020, -0.817656177794612750, -0.817627391430151170, -0.817598603021621020, +-0.817569812569094450, -0.817541020072642730, -0.817512225532339040, -0.817483428948254760, -0.817454630320461950, -0.817425829649032430, -0.817397026934038480, -0.817368222175551940, +-0.817339415373644300, -0.817310606528388610, -0.817281795639856480, -0.817252982708119860, -0.817224167733250680, -0.817195350715321120, -0.817166531654403230, -0.817137710550569050, +-0.817108887403889980, -0.817080062214439180, -0.817051234982288380, -0.817022405707509390, -0.816993574390174390, -0.816964741030355430, -0.816935905628124680, -0.816907068183553630, +-0.816878228696715450, -0.816849387167681630, -0.816820543596524340, -0.816791697983315750, -0.816762850328127900, -0.816734000631032960, -0.816705148892102990, -0.816676295111409600, +-0.816647439289026060, -0.816618581425023860, -0.816589721519475180, -0.816560859572452280, -0.816531995584027230, -0.816503129554272070, -0.816474261483258630, -0.816445391371060090, +-0.816416519217748050, -0.816387645023394780, -0.816358768788072340, -0.816329890511852900, -0.816301010194808830, -0.816272127837012200, -0.816243243438535270, -0.816214356999449770, +-0.816185468519828870, -0.816156577999744170, -0.816127685439268170, -0.816098790838472920, -0.816069894197430590, -0.816040995516213120, -0.816012094794893670, -0.815983192033543970, +-0.815954287232236290, -0.815925380391042900, -0.815896471510036080, -0.815867560589288000, -0.815838647628871150, -0.815809732628857590, -0.815780815589319140, -0.815751896510329200, +-0.815722975391959590, -0.815694052234282490, -0.815665127037370260, -0.815636199801295200, -0.815607270526129140, -0.815578339211945450, -0.815549405858815860, -0.815520470466812860, +-0.815491533036008520, -0.815462593566475440, -0.815433652058285880, -0.815404708511512140, -0.815375762926226710, -0.815346815302501300, -0.815317865640409420, -0.815288913940022790, +-0.815259960201414000, -0.815231004424655240, -0.815202046609818880, -0.815173086756977530, -0.815144124866202910, -0.815115160937568530, -0.815086194971146210, -0.815057226967008330, +-0.815028256925227510, -0.814999284845875920, -0.814970310729026260, -0.814941334574750710, -0.814912356383121320, -0.814883376154211690, -0.814854393888093440, -0.814825409584839290, +-0.814796423244521620, -0.814767434867212930, -0.814738444452985600, -0.814709452001911580, -0.814680457514064590, -0.814651460989516350, -0.814622462428339470, -0.814593461830606440, +-0.814564459196389870, -0.814535454525762040, -0.814506447818795550, -0.814477439075562910, -0.814448428296136280, -0.814419415480589050, -0.814390400628993260, -0.814361383741421530, +-0.814332364817946240, -0.814303343858640120, -0.814274320863575100, -0.814245295832824790, -0.814216268766461250, -0.814187239664556970, -0.814158208527184680, -0.814129175354416870, +-0.814100140146326030, -0.814071102902984900, -0.814042063624466070, -0.814013022310841490, -0.813983978962184880, -0.813954933578568300, -0.813925886160064450, -0.813896836706745840, +-0.813867785218685190, -0.813838731695954550, -0.813809676138627540, -0.813780618546776410, -0.813751558920473680, -0.813722497259792070, -0.813693433564804170, -0.813664367835582710, +-0.813635300072200420, -0.813606230274729780, -0.813577158443243080, -0.813548084577814020, -0.813519008678514680, -0.813489930745417980, -0.813460850778596310, -0.813431768778122510, +-0.813402684744069290, -0.813373598676508940, -0.813344510575515050, -0.813315420441159900, -0.813286328273516100, -0.813257234072656600, -0.813228137838654000, -0.813199039571581020, +-0.813169939271510490, -0.813140836938514580, -0.813111732572667000, -0.813082626174040150, -0.813053517742706840, -0.813024407278739590, -0.812995294782211440, -0.812966180253194890, +-0.812937063691762550, -0.812907945097987920, -0.812878824471943600, -0.812849701813702090, -0.812820577123336330, -0.812791450400919160, -0.812762321646523400, -0.812733190860221780, +-0.812704058042087120, -0.812674923192191920, -0.812645786310609910, -0.812616647397413350, -0.812587506452675300, -0.812558363476468370, -0.812529218468865610, -0.812500071429939190, +-0.812470922359763150, -0.812441771258409880, -0.812412618125952110, -0.812383462962462780, -0.812354305768014820, -0.812325146542681180, -0.812295985286534570, -0.812266821999648060, +-0.812237656682093910, -0.812208489333946180, -0.812179319955277260, -0.812150148546159970, -0.812120975106667250, -0.812091799636872170, -0.812062622136847100, -0.812033442606665990, +-0.812004261046401330, -0.811975077456125850, -0.811945891835912810, -0.811916704185835060, -0.811887514505965410, -0.811858322796377040, -0.811829129057143000, -0.811799933288335440, +-0.811770735490028650, -0.811741535662295010, -0.811712333805207460, -0.811683129918839170, -0.811653924003262970, -0.811624716058552020, -0.811595506084778820, -0.811566294082017300, +-0.811537080050340090, -0.811507863989820110, -0.811478645900530430, -0.811449425782544310, -0.811420203635934480, -0.811390979460774210, -0.811361753257135890, -0.811332525025093790, +-0.811303294764720410, -0.811274062476088690, -0.811244828159271790, -0.811215591814342880, -0.811186353441375130, -0.811157113040440800, -0.811127870611614290, -0.811098626154968080, +-0.811069379670575240, -0.811040131158509040, -0.811010880618842410, -0.810981628051648640, -0.810952373457000890, -0.810923116834971540, -0.810893858185635090, -0.810864597509063810, +-0.810835334805331100, -0.810806070074510110, -0.810776803316673900, -0.810747534531895630, -0.810718263720248130, -0.810688990881805350, -0.810659716016640220, -0.810630439124825690, +-0.810601160206435130, -0.810571879261541730, -0.810542596290218520, -0.810513311292538900, -0.810484024268575910, -0.810454735218402390, -0.810425444142092610, -0.810396151039719070, +-0.810366855911355270, -0.810337558757074360, -0.810308259576949520, -0.810278958371053460, -0.810249655139460570, -0.810220349882243450, -0.810191042599475610, -0.810161733291230090, +-0.810132421957580170, -0.810103108598599240, -0.810073793214360570, -0.810044475804937440, -0.810015156370402560, -0.809985834910830320, -0.809956511426293550, -0.809927185916865410, +-0.809897858382619300, -0.809868528823628590, -0.809839197239966560, -0.809809863631706040, -0.809780527998921310, -0.809751190341685300, -0.809721850660071300, -0.809692508954152790, +-0.809663165224002830, -0.809633819469695040, -0.809604471691302670, -0.809575121888898690, -0.809545770062557350, -0.809516416212351600, -0.809487060338354820, -0.809457702440640410, +-0.809428342519281640, -0.809398980574352110, -0.809369616605924550, -0.809340250614073550, -0.809310882598871850, -0.809281512560392930, -0.809252140498710300, -0.809222766413897340, +-0.809193390306027440, -0.809164012175173970, -0.809134632021410010, -0.809105249844810030, -0.809075865645446870, -0.809046479423394030, -0.809017091178725110, -0.808987700911513400, +-0.808958308621832380, -0.808928914309755110, -0.808899517975356090, -0.808870119618708250, -0.808840719239885100, -0.808811316838960240, -0.808781912416006940, -0.808752505971099040, +-0.808723097504309710, -0.808693687015712760, -0.808664274505381030, -0.808634859973389130, -0.808605443419810000, -0.808576024844717360, -0.808546604248184700, -0.808517181630285410, +-0.808487756991092650, -0.808458330330681150, -0.808428901649123730, -0.808399470946494000, -0.808370038222865680, -0.808340603478312270, -0.808311166712907370, -0.808281727926724480, +-0.808252287119837320, -0.808222844292318940, -0.808193399444243840, -0.808163952575685410, -0.808134503686717020, -0.808105052777412400, -0.808075599847845050, -0.808046144898088790, +-0.808016687928216680, -0.807987228938303330, -0.807957767928421890, -0.807928304898646090, -0.807898839849049420, -0.807869372779705720, -0.807839903690688590, -0.807810432582071640, +-0.807780959453928250, -0.807751484306332810, -0.807722007139358710, -0.807692527953079660, -0.807663046747569170, -0.807633563522901170, -0.807604078279149150, -0.807574591016386510, +-0.807545101734687960, -0.807515610434126560, -0.807486117114776140, -0.807456621776710400, -0.807427124420003190, -0.807397625044728120, -0.807368123650959000, -0.807338620238769120, +-0.807309114808233090, -0.807279607359424390, -0.807250097892416530, -0.807220586407283560, -0.807191072904098970, -0.807161557382936820, -0.807132039843870270, -0.807102520286974160, +-0.807072998712321630, -0.807043475119986640, -0.807013949510043020, -0.806984421882564470, -0.806954892237624950, -0.806925360575298070, -0.806895826895657860, -0.806866291198777620, +-0.806836753484732050, -0.806807213753594770, -0.806777672005439260, -0.806748128240339700, -0.806718582458369800, -0.806689034659602840, -0.806659484844113870, -0.806629933011976270, +-0.806600379163263770, -0.806570823298050300, -0.806541265416409690, -0.806511705518416110, -0.806482143604143160, -0.806452579673664790, -0.806423013727054610, -0.806393445764387320, +-0.806363875785736430, -0.806334303791175770, -0.806304729780779490, -0.806275153754621330, -0.806245575712775220, -0.806215995655314770, -0.806186413582314800, -0.806156829493848810, +-0.806127243389990640, -0.806097655270814450, -0.806068065136394170, -0.806038472986803640, -0.806008878822117030, -0.805979282642407590, -0.805949684447750500, -0.805920084238219260, +-0.805890482013887690, -0.805860877774830060, -0.805831271521120110, -0.805801663252832090, -0.805772052970039290, -0.805742440672816970, -0.805712826361238420, -0.805683210035377910, +-0.805653591695309370, -0.805623971341106860, -0.805594348972844430, -0.805564724590596030, -0.805535098194435360, -0.805505469784437490, -0.805475839360675900, -0.805446206923224770, +-0.805416572472158030, -0.805386936007549960, -0.805357297529474490, -0.805327657038005350, -0.805298014533217480, -0.805268370015184590, -0.805238723483980840, -0.805209074939680190, +-0.805179424382356900, -0.805149771812085020, -0.805120117228938730, -0.805090460632992170, -0.805060802024318960, -0.805031141402994250, -0.805001478769091670, -0.804971814122685370, +-0.804942147463849510, -0.804912478792658370, -0.804882808109185440, -0.804853135413506000, -0.804823460705693880, -0.804793783985822910, -0.804764105253967580, -0.804734424510201940, +-0.804704741754600270, -0.804675056987236740, -0.804645370208185610, -0.804615681417520490, -0.804585990615316660, -0.804556297801647950, -0.804526602976588400, -0.804496906140212410, +-0.804467207292594130, -0.804437506433807850, -0.804407803563927160, -0.804378098683027560, -0.804348391791182780, -0.804318682888466970, -0.804288971974954530, -0.804259259050719490, +-0.804229544115836470, -0.804199827170379520, -0.804170108214422470, -0.804140387248040710, -0.804110664271307950, -0.804080939284298470, -0.804051212287086760, -0.804021483279746980, +-0.803991752262353420, -0.803962019234980010, -0.803932284197702130, -0.803902547150593500, -0.803872808093728410, -0.803843067027181450, -0.803813323951026780, -0.803783578865338690, +-0.803753831770191770, -0.803724082665659760, -0.803694331551818020, -0.803664578428740390, -0.803634823296501380, -0.803605066155175350, -0.803575307004836590, -0.803545545845559590, +-0.803515782677418300, -0.803486017500487870, -0.803456250314842580, -0.803426481120556590, -0.803396709917704400, -0.803366936706360390, -0.803337161486599170, -0.803307384258494910, +-0.803277605022122200, -0.803247823777555100, -0.803218040524868780, -0.803188255264137400, -0.803158467995435440, -0.803128678718837310, -0.803098887434417490, -0.803069094142249920, +-0.803039298842410100, -0.803009501534972080, -0.802979702220010250, -0.802949900897599210, -0.802920097567813460, -0.802890292230727390, -0.802860484886415590, -0.802830675534952580, +-0.802800864176412390, -0.802771050810870520, -0.802741235438401040, -0.802711418059078530, -0.802681598672977390, -0.802651777280172340, -0.802621953880737760, -0.802592128474747810, +-0.802562301062278110, -0.802532471643402580, -0.802502640218195950, -0.802472806786732720, -0.802442971349087380, -0.802413133905334640, -0.802383294455549120, -0.802353452999804760, +-0.802323609538177380, -0.802293764070740930, -0.802263916597570130, -0.802234067118739460, -0.802204215634323650, -0.802174362144397300, -0.802144506649034470, -0.802114649148310990, +-0.802084789642300790, -0.802054928131078700, -0.802025064614719340, -0.801995199093297200, -0.801965331566887100, -0.801935462035563650, -0.801905590499401020, -0.801875716958475040, +-0.801845841412859640, -0.801815963862629650, -0.801786084307859800, -0.801756202748624800, -0.801726319184999260, -0.801696433617057340, -0.801666546044874860, -0.801636656468526000, +-0.801606764888085580, -0.801576871303628200, -0.801546975715228700, -0.801517078122961690, -0.801487178526901990, -0.801457276927124320, -0.801427373323702950, -0.801397467716713720, +-0.801367560106230780, -0.801337650492328970, -0.801307738875083000, -0.801277825254567700, -0.801247909630857350, -0.801217992004027660, -0.801188072374153130, -0.801158150741308250, +-0.801128227105568080, -0.801098301467007450, -0.801068373825700950, -0.801038444181723430, -0.801008512535149930, -0.800978578886054620, -0.800948643234513310, -0.800918705580600410, +-0.800888765924390840, -0.800858824265959330, -0.800828880605380710, -0.800798934942729800, -0.800768987278081210, -0.800739037611510550, -0.800709085943092310, -0.800679132272901440, +-0.800649176601012650, -0.800619218927500990, -0.800589259252441290, -0.800559297575908380, -0.800529333897976650, -0.800499368218722250, -0.800469400538219360, -0.800439430856543010, +-0.800409459173768050, -0.800379485489969400, -0.800349509805222010, -0.800319532119600390, -0.800289552433180450, -0.800259570746036710, -0.800229587058243990, -0.800199601369877220, +-0.800169613681011470, -0.800139623991721780, -0.800109632302082980, -0.800079638612169570, -0.800049642922057600, -0.800019645231821560, -0.799989645541536290, -0.799959643851277050, +-0.799929640161118670, -0.799899634471136100, -0.799869626781403940, -0.799839617091998250, -0.799809605402993620, -0.799779591714464890, -0.799749576026487110, -0.799719558339135550, +-0.799689538652484930, -0.799659516966610530, -0.799629493281587390, -0.799599467597489900, -0.799569439914394330, -0.799539410232375180, -0.799509378551507500, -0.799479344871866340, +-0.799449309193526860, -0.799419271516563560, -0.799389231841052590, -0.799359190167068470, -0.799329146494686450, -0.799299100823981590, -0.799269053155028940, -0.799239003487903670, +-0.799208951822680920, -0.799178898159435770, -0.799148842498242810, -0.799118784839178310, -0.799088725182316880, -0.799058663527733580, -0.799028599875503680, -0.798998534225702220, +-0.798968466578403920, -0.798938396933684960, -0.798908325291620040, -0.798878251652284320, -0.798848176015752980, -0.798818098382101160, -0.798788018751404040, -0.798757937123736990, +-0.798727853499175080, -0.798697767877792900, -0.798667680259666950, -0.798637590644871720, -0.798607499033482600, -0.798577405425574650, -0.798547309821223240, -0.798517212220503540, +-0.798487112623490260, -0.798457011030259680, -0.798426907440886620, -0.798396801855446370, -0.798366694274013970, -0.798336584696664910, -0.798306473123474470, -0.798276359554517700, +-0.798246243989869650, -0.798216126429606380, -0.798186006873802920, -0.798155885322534340, -0.798125761775876130, -0.798095636233903450, -0.798065508696691680, -0.798035379164315660, +-0.798005247636851660, -0.797975114114374610, -0.797944978596959680, -0.797914841084682360, -0.797884701577618040, -0.797854560075841770, -0.797824416579429260, -0.797794271088455690, +-0.797764123602995760, -0.797733974123126190, -0.797703822648921700, -0.797673669180457570, -0.797643513717809280, -0.797613356261052340, -0.797583196810261350, -0.797553035365512920, +-0.797522871926881870, -0.797492706494443700, -0.797462539068273690, -0.797432369648447440, -0.797402198235040220, -0.797372024828127410, -0.797341849427784630, -0.797311672034086700, +-0.797281492647110120, -0.797251311266929830, -0.797221127893621210, -0.797190942527259860, -0.797160755167921060, -0.797130565815679870, -0.797100374470612770, -0.797070181132794710, +-0.797039985802301290, -0.797009788479207890, -0.796979589163589910, -0.796949387855523160, -0.796919184555082700, -0.796888979262344480, -0.796858771977383200, -0.796828562700275470, +-0.796798351431096450, -0.796768138169921420, -0.796737922916826100, -0.796707705671885980, -0.796677486435176660, -0.796647265206772980, -0.796617041986751760, -0.796586816775187940, +-0.796556589572157030, -0.796526360377734610, -0.796496129191996300, -0.796465896015017720, -0.796435660846874340, -0.796405423687641330, -0.796375184537395310, -0.796344943396211310, +-0.796314700264164950, -0.796284455141331840, -0.796254208027787570, -0.796223958923607760, -0.796193707828867560, -0.796163454743643690, -0.796133199668011100, -0.796102942602045500, +-0.796072683545822500, -0.796042422499417920, -0.796012159462907260, -0.795981894436366130, -0.795951627419870240, -0.795921358413494870, -0.795891087417316510, -0.795860814431410550, +-0.795830539455852470, -0.795800262490718110, -0.795769983536083080, -0.795739702592022540, -0.795709419658613190, -0.795679134735930440, -0.795648847824049770, -0.795618558923047000, +-0.795588268032997760, -0.795557975153977970, -0.795527680286063130, -0.795497383429329190, -0.795467084583851290, -0.795436783749706060, -0.795406480926968970, -0.795376176115715650, +-0.795345869316021910, -0.795315560527963480, -0.795285249751615630, -0.795254936987055180, -0.795224622234357410, -0.795194305493598150, -0.795163986764853000, -0.795133666048197910, +-0.795103343343708690, -0.795073018651461070, -0.795042691971530990, -0.795012363303993610, -0.794982032648925750, -0.794951700006402920, -0.794921365376500820, -0.794891028759295290, +-0.794860690154862160, -0.794830349563277360, -0.794800006984616170, -0.794769662418955410, -0.794739315866370590, -0.794708967326937410, -0.794678616800731820, -0.794648264287829750, +-0.794617909788306930, -0.794587553302239400, -0.794557194829702440, -0.794526834370772980, -0.794496471925526530, -0.794466107494038900, -0.794435741076385930, -0.794405372672643550, +-0.794375002282887820, -0.794344629907194120, -0.794314255545639280, -0.794283879198298790, -0.794253500865248710, -0.794223120546564740, -0.794192738242323060, -0.794162353952599490, +-0.794131967677470070, -0.794101579417010760, -0.794071189171296930, -0.794040796940405640, -0.794010402724412370, -0.793980006523393070, -0.793949608337423780, -0.793919208166580570, +-0.793888806010938700, -0.793858401870575330, -0.793827995745565950, -0.793797587635986620, -0.793767177541913280, -0.793736765463422090, -0.793706351400588870, -0.793675935353489900, +-0.793645517322201010, -0.793615097306797800, -0.793584675307357430, -0.793554251323955300, -0.793523825356667540, -0.793493397405570230, -0.793462967470739520, -0.793432535552250790, +-0.793402101650181210, -0.793371665764606380, -0.793341227895602460, -0.793310788043245510, -0.793280346207611450, -0.793249902388776570, -0.793219456586817030, -0.793189008801808760, +-0.793158559033827370, -0.793128107282950250, -0.793097653549252770, -0.793067197832811210, -0.793036740133701620, -0.793006280452000170, -0.792975818787783120, -0.792945355141125850, +-0.792914889512105870, -0.792884421900798550, -0.792853952307280290, -0.792823480731627010, -0.792793007173915100, -0.792762531634220720, -0.792732054112619930, -0.792701574609188440, +-0.792671093124003630, -0.792640609657141120, -0.792610124208676940, -0.792579636778687590, -0.792549147367249130, -0.792518655974437710, -0.792488162600329170, -0.792457667245000770, +-0.792427169908528240, -0.792396670590987730, -0.792366169292455510, -0.792335666013007980, -0.792305160752721170, -0.792274653511671590, -0.792244144289934730, -0.792213633087588080, +-0.792183119904707360, -0.792152604741368730, -0.792122087597648680, -0.792091568473623500, -0.792061047369369220, -0.792030524284961900, -0.791999999220478810, -0.791969472175995670, +-0.791938943151588860, -0.791908412147334760, -0.791877879163309650, -0.791847344199589690, -0.791816807256251480, -0.791786268333371180, -0.791755727431024740, -0.791725184549289530, +-0.791694639688241280, -0.791664092847956470, -0.791633544028511490, -0.791602993229982620, -0.791572440452445680, -0.791541885695978160, -0.791511328960656010, -0.791480770246555500, +-0.791450209553753000, -0.791419646882325020, -0.791389082232347940, -0.791358515603898250, -0.791327946997052110, -0.791297376411885580, -0.791266803848476250, -0.791236229306899850, +-0.791205652787232870, -0.791175074289551810, -0.791144493813933040, -0.791113911360453060, -0.791083326929187700, -0.791052740520214570, -0.791022152133609600, -0.790991561769449290, +-0.790960969427810020, -0.790930375108768400, -0.790899778812400810, -0.790869180538783740, -0.790838580287993140, -0.790807978060106720, -0.790777373855200310, -0.790746767673350500, +-0.790716159514633700, -0.790685549379126610, -0.790654937266905500, -0.790624323178046650, -0.790593707112627440, -0.790563089070724030, -0.790532469052412920, -0.790501847057770490, +-0.790471223086873560, -0.790440597139798640, -0.790409969216622100, -0.790379339317420100, -0.790348707442270370, -0.790318073591248840, -0.790287437764432110, -0.790256799961896790, +-0.790226160183719490, -0.790195518429976710, -0.790164874700744700, -0.790134228996100970, -0.790103581316121680, -0.790072931660883440, -0.790042280030462950, -0.790011626424936720, +-0.789980970844381350, -0.789950313288873660, -0.789919653758490050, -0.789888992253306890, -0.789858328773401790, -0.789827663318850790, -0.789796995889730620, -0.789766326486118110, +-0.789735655108089630, -0.789704981755721570, -0.789674306429091530, -0.789643629128275680, -0.789612949853350840, -0.789582268604393620, -0.789551585381480740, -0.789520900184688900, +-0.789490213014094720, -0.789459523869775140, -0.789428832751806090, -0.789398139660265620, -0.789367444595229670, -0.789336747556775190, -0.789306048544978880, -0.789275347559917350, +-0.789244644601667540, -0.789213939670305510, -0.789183232765909180, -0.789152523888554840, -0.789121813038319080, -0.789091100215278840, -0.789060385419510850, -0.789029668651091920, +-0.788998949910098780, -0.788968229196607810, -0.788937506510696720, -0.788906781852441900, -0.788876055221920060, -0.788845326619208140, -0.788814596044382870, -0.788783863497521160, +-0.788753128978699200, -0.788722392487995030, -0.788691654025484800, -0.788660913591245460, -0.788630171185353830, -0.788599426807886860, -0.788568680458921260, -0.788537932138533960, +-0.788507181846801240, -0.788476429583801150, -0.788445675349609960, -0.788414919144304620, -0.788384160967962040, -0.788353400820658970, -0.788322638702472430, -0.788291874613478720, +-0.788261108553755860, -0.788230340523380260, -0.788199570522428840, -0.788168798550978430, -0.788138024609106090, -0.788107248696888640, -0.788076470814403020, -0.788045690961726280, +-0.788014909138934790, -0.787984125346106510, -0.787953339583318040, -0.787922551850646080, -0.787891762148167810, -0.787860970475960150, -0.787830176834099500, -0.787799381222663910, +-0.787768583641729970, -0.787737784091374520, -0.787706982571674600, -0.787676179082707150, -0.787645373624549340, -0.787614566197278100, -0.787583756800970370, -0.787552945435702870, +-0.787522132101553420, -0.787491316798598630, -0.787460499526915550, -0.787429680286581220, -0.787398859077672820, -0.787368035900267160, -0.787337210754440850, -0.787306383640272060, +-0.787275554557837380, -0.787244723507213750, -0.787213890488478340, -0.787183055501708200, -0.787152218546980360, -0.787121379624372120, -0.787090538733959840, -0.787059695875821700, +-0.787028851050034280, -0.786998004256674880, -0.786967155495820300, -0.786936304767547950, -0.786905452071934740, -0.786874597409057520, -0.786843740778994220, -0.786812882181821550, +-0.786782021617616790, -0.786751159086456870, -0.786720294588419080, -0.786689428123580560, -0.786658559692018480, -0.786627689293809440, -0.786596816929031830, -0.786565942597762020, +-0.786535066300077410, -0.786504188036055150, -0.786473307805772400, -0.786442425609306440, -0.786411541446733750, -0.786380655318132840, -0.786349767223580300, -0.786318877163153300, +-0.786287985136929100, -0.786257091144984990, -0.786226195187398110, -0.786195297264245860, -0.786164397375605170, -0.786133495521553090, -0.786102591702167790, -0.786071685917525960, +-0.786040778167705010, -0.786009868452781980, -0.785978956772834360, -0.785948043127938760, -0.785917127518173660, -0.785886209943615690, -0.785855290404342210, -0.785824368900430500, +-0.785793445431957950, -0.785762519999001710, -0.785731592601639160, -0.785700663239947580, -0.785669731914003910, -0.785638798623886410, -0.785607863369671920, -0.785576926151437700, +-0.785545986969261260, -0.785515045823219850, -0.785484102713390750, -0.785453157639850910, -0.785422210602678690, -0.785391261601951050, -0.785360310637745140, -0.785329357710138450, +-0.785298402819208490, -0.785267445965032400, -0.785236487147687680, -0.785205526367251270, -0.785174563623801560, -0.785143598917415480, -0.785112632248170290, -0.785081663616143620, +-0.785050693021412730, -0.785019720464055220, -0.784988745944147800, -0.784957769461768980, -0.784926791016995810, -0.784895810609905650, -0.784864828240576020, -0.784833843909084280, +-0.784802857615507940, -0.784771869359924380, -0.784740879142410640, -0.784709886963045330, -0.784678892821905280, -0.784647896719067980, -0.784616898654610820, -0.784585898628611610, +-0.784554896641147530, -0.784523892692295720, -0.784492886782134690, -0.784461878910741480, -0.784430869078193480, -0.784399857284568400, -0.784368843529943630, -0.784337827814396760, +-0.784306810138005290, -0.784275790500846840, -0.784244768902998430, -0.784213745344538580, -0.784182719825544330, -0.784151692346093280, -0.784120662906263030, -0.784089631506131200, +-0.784058598145774610, -0.784027562825272200, -0.783996525544700780, -0.783965486304138090, -0.783934445103661730, -0.783903401943349180, -0.783872356823278160, -0.783841309743526170, +-0.783810260704171040, -0.783779209705289580, -0.783748156746960740, -0.783717101829261580, -0.783686044952269570, -0.783654986116062440, -0.783623925320717780, -0.783592862566313440, +-0.783561797852926230, -0.783530731180635210, -0.783499662549517310, -0.783468591959650350, -0.783437519411111840, -0.783406444903979480, -0.783375368438331110, -0.783344290014244220, +-0.783313209631796070, -0.783282127291065500, -0.783251042992129550, -0.783219956735066060, -0.783188868519952620, -0.783157778346867060, -0.783126686215886990, -0.783095592127089790, +-0.783064496080554060, -0.783033398076357080, -0.783002298114576560, -0.782971196195290430, -0.782940092318576200, -0.782908986484511790, -0.782877878693174930, -0.782846768944642780, +-0.782815657238994270, -0.782784543576306670, -0.782753427956657590, -0.782722310380125070, -0.782691190846786730, -0.782660069356720390, -0.782628945910003320, -0.782597820506714450, +-0.782566693146931060, -0.782535563830730860, -0.782504432558191800, -0.782473299329391690, -0.782442164144408260, -0.782411027003319440, -0.782379887906203160, -0.782348746853136490, +-0.782317603844198570, -0.782286458879466570, -0.782255311959018430, -0.782224163082932080, -0.782193012251285350, -0.782161859464155400, -0.782130704721621490, -0.782099548023760690, +-0.782068389370651150, -0.782037228762370470, -0.782006066198996930, -0.781974901680608010, -0.781943735207282000, -0.781912566779096600, -0.781881396396129190, -0.781850224058458940, +-0.781819049766163010, -0.781787873519319550, -0.781756695318006400, -0.781725515162301490, -0.781694333052282750, -0.781663148988027690, -0.781631962969615230, -0.781600774997122880, +-0.781569585070628680, -0.781538393190210460, -0.781507199355946260, -0.781476003567914130, -0.781444805826191800, -0.781413606130857090, -0.781382404481988810, -0.781351200879664590, +-0.781319995323962350, -0.781288787814960140, -0.781257578352735900, -0.781226366937367800, -0.781195153568933210, -0.781163938247511180, -0.781132720973179430, -0.781101501746015890, +-0.781070280566098510, -0.781039057433505430, -0.781007832348314720, -0.780976605310604530, -0.780945376320452130, -0.780914145377936910, -0.780882912483136350, -0.780851677636128510, +-0.780820440836991430, -0.780789202085803270, -0.780757961382642090, -0.780726718727585480, -0.780695474120712610, -0.780664227562100970, -0.780632979051828820, -0.780601728589974340, +-0.780570476176615460, -0.780539221811830330, -0.780507965495697230, -0.780476707228294100, -0.780445447009698760, -0.780414184839990370, -0.780382920719246420, -0.780351654647545300, +-0.780320386624964950, -0.780289116651583630, -0.780257844727478940, -0.780226570852730280, -0.780195295027415140, -0.780164017251611770, -0.780132737525398360, -0.780101455848853150, +-0.780070172222054210, -0.780038886645079920, -0.780007599118008320, -0.779976309640917240, -0.779945018213885950, -0.779913724836992060, -0.779882429510313950, -0.779851132233929660, +-0.779819833007917570, -0.779788531832355410, -0.779757228707322450, -0.779725923632896390, -0.779694616609155510, -0.779663307636178080, -0.779631996714042490, -0.779600683842826770, +-0.779569369022609430, -0.779538052253468620, -0.779506733535482170, -0.779475412868729340, -0.779444090253288090, -0.779412765689236560, -0.779381439176653150, -0.779350110715616110, +-0.779318780306203830, -0.779287447948494030, -0.779256113642566190, -0.779224777388497940, -0.779193439186367850, -0.779162099036254220, -0.779130756938235300, -0.779099412892389380, +-0.779068066898795040, -0.779036718957530020, -0.779005369068673680, -0.778974017232303860, -0.778942663448499050, -0.778911307717337630, -0.778879950038897870, -0.778848590413258270, +-0.778817228840496640, -0.778785865320692490, -0.778754499853923750, -0.778723132440268690, -0.778691763079805810, -0.778660391772613480, -0.778629018518770200, -0.778597643318354460, +-0.778566266171444420, -0.778534887078118350, -0.778503506038455530, -0.778472123052533990, -0.778440738120432020, -0.778409351242228320, -0.778377962418001280, -0.778346571647828610, +-0.778315178931790250, -0.778283784269963810, -0.778252387662427990, -0.778220989109261190, -0.778189588610541880, -0.778158186166348690, -0.778126781776759870, -0.778095375441854250, +-0.778063967161709560, -0.778032556936405490, -0.778001144766020110, -0.777969730650631800, -0.777938314590319150, -0.777906896585160770, -0.777875476635234600, -0.777844054740620240, +-0.777812630901395850, -0.777781205117639820, -0.777749777389430740, -0.777718347716847220, -0.777686916099967870, -0.777655482538871180, -0.777624047033635860, -0.777592609584339840, +-0.777561170191062740, -0.777529728853882830, -0.777498285572878590, -0.777466840348128630, -0.777435393179711550, -0.777403944067706080, -0.777372493012190020, -0.777341040013243450, +-0.777309585070944160, -0.777278128185371010, -0.777246669356602470, -0.777215208584717270, -0.777183745869794000, -0.777152281211911490, -0.777120814611147680, -0.777089346067582290, +-0.777057875581293580, -0.777026403152360270, -0.776994928780860850, -0.776963452466874150, -0.776931974210478880, -0.776900494011752980, -0.776869011870776500, -0.776837527787627490, +-0.776806041762384660, -0.776774553795126720, -0.776743063885932280, -0.776711572034880280, -0.776680078242049430, -0.776648582507518340, -0.776617084831365160, -0.776585585213669830, +-0.776554083654510620, -0.776522580153966140, -0.776491074712115200, -0.776459567329036650, -0.776428058004808520, -0.776396546739510860, -0.776365033533221840, -0.776333518386020270, +-0.776302001297984880, -0.776270482269194480, -0.776238961299727800, -0.776207438389663770, -0.776175913539081220, -0.776144386748058190, -0.776112858016674840, -0.776081327345009340, +-0.776049794733140510, -0.776018260181147280, -0.775986723689108260, -0.775955185257101940, -0.775923644885208260, -0.775892102573505380, -0.775860558322072240, -0.775829012130987760, +-0.775797464000330780, -0.775765913930180020, -0.775734361920614620, -0.775702807971713200, -0.775671252083554250, -0.775639694256217820, -0.775608134489782050, -0.775576572784325900, +-0.775545009139928410, -0.775513443556668290, -0.775481876034624710, -0.775450306573875700, -0.775418735174501660, -0.775387161836580740, -0.775355586560191880, -0.775324009345414010, +-0.775292430192326190, -0.775260849101007230, -0.775229266071536190, -0.775197681103991450, -0.775166094198453060, -0.775134505354999390, -0.775102914573709500, -0.775071321854662320, +-0.775039727197936790, -0.775008130603611960, -0.774976532071766310, -0.774944931602479790, -0.774913329195831000, -0.774881724851898880, -0.774850118570762470, -0.774818510352500710, +-0.774786900197192760, -0.774755288104917560, -0.774723674075753490, -0.774692058109780810, -0.774660440207078030, -0.774628820367724070, -0.774597198591798100, -0.774565574879379160, +-0.774533949230546300, -0.774502321645378020, -0.774470692123954470, -0.774439060666354150, -0.774407427272656210, -0.774375791942939710, -0.774344154677283680, -0.774312515475767290, +-0.774280874338469590, -0.774249231265469740, -0.774217586256846340, -0.774185939312679430, -0.774154290433047620, -0.774122639618030180, -0.774090986867706050, -0.774059332182154610, +-0.774027675561454130, -0.773996017005685100, -0.773964356514926010, -0.773932694089256020, -0.773901029728754300, -0.773869363433499990, -0.773837695203572260, -0.773806025039050380, +-0.773774352940013400, -0.773742678906539920, -0.773711002938710310, -0.773679325036603190, -0.773647645200297830, -0.773615963429873380, -0.773584279725408890, -0.773552594086983850, +-0.773520906514676640, -0.773489217008567760, -0.773457525568735820, -0.773425832195260180, -0.773394136888219790, -0.773362439647694130, -0.773330740473762380, -0.773299039366503790, +-0.773267336325997090, -0.773235631352322540, -0.773203924445558850, -0.773172215605785530, -0.773140504833081500, -0.773108792127526370, -0.773077077489199070, -0.773045360918178660, +-0.773013642414545290, -0.772981921978377890, -0.772950199609755750, -0.772918475308758010, -0.772886749075464060, -0.772855020909953390, -0.772823290812305050, -0.772791558782597980, +-0.772759824820912430, -0.772728088927327470, -0.772696351101922250, -0.772664611344776150, -0.772632869655968560, -0.772601126035578730, -0.772569380483685510, -0.772537633000369480, +-0.772505883585709260, -0.772474132239784450, -0.772442378962674200, -0.772410623754458130, -0.772378866615215380, -0.772347107545025560, -0.772315346543967940, -0.772283583612121350, +-0.772251818749566390, -0.772220051956381880, -0.772188283232647210, -0.772156512578441870, -0.772124739993845230, -0.772092965478936240, -0.772061189033795390, -0.772029410658501500, +-0.771997630353134180, -0.771965848117772690, -0.771934063952496640, -0.771902277857385410, -0.771870489832518380, -0.771838699877975270, -0.771806907993834780, -0.771775114180177630, +-0.771743318437082660, -0.771711520764629340, -0.771679721162897290, -0.771647919631966000, -0.771616116171914830, -0.771584310782822860, -0.771552503464770560, -0.771520694217837090, +-0.771488883042101840, -0.771457069937644400, -0.771425254904544390, -0.771393437942881070, -0.771361619052734260, -0.771329798234182800, -0.771297975487307500, -0.771266150812187190, +-0.771234324208901480, -0.771202495677529960, -0.771170665218152250, -0.771138832830847830, -0.771106998515695750, -0.771075162272776840, -0.771043324102169910, -0.771011484003954690, +-0.770979641978210780, -0.770947798025017780, -0.770915952144455300, -0.770884104336602930, -0.770852254601539720, -0.770820402939346390, -0.770788549350102100, -0.770756693833886450, +-0.770724836390779040, -0.770692977020859590, -0.770661115724207700, -0.770629252500902420, -0.770597387351024570, -0.770565520274653190, -0.770533651271868130, -0.770501780342748850, +-0.770469907487375210, -0.770438032705826780, -0.770406155998183180, -0.770374277364524240, -0.770342396804929000, -0.770310514319478390, -0.770278629908251580, -0.770246743571328050, +-0.770214855308787750, -0.770182965120710270, -0.770151073007174780, -0.770119178968262210, -0.770087283004051710, -0.770055385114623010, -0.770023485300055820, -0.769991583560429960, +-0.769959679895825030, -0.769927774306321090, -0.769895866791997510, -0.769863957352933780, -0.769832045989210730, -0.769800132700907640, -0.769768217488104090, -0.769736300350880030, +-0.769704381289315290, -0.769672460303489570, -0.769640537393482040, -0.769608612559373850, -0.769576685801244050, -0.769544757119172580, -0.769512826513239270, -0.769480893983523820, +-0.769448959530106170, -0.769417023153066040, -0.769385084852482800, -0.769353144628437510, -0.769321202481009330, -0.769289258410278070, -0.769257312416323780, -0.769225364499226070, +-0.769193414659065100, -0.769161462895919910, -0.769129509209871660, -0.769097553600999630, -0.769065596069383740, -0.769033636615103930, -0.769001675238239920, -0.768969711938871760, +-0.768937746717079370, -0.768905779572941930, -0.768873810506540690, -0.768841839517954930, -0.768809866607264470, -0.768777891774549470, -0.768745915019889760, -0.768713936343365160, +-0.768681955745055160, -0.768649973225040920, -0.768617988783401710, -0.768586002420217460, -0.768554014135568230, -0.768522023929534060, -0.768490031802194770, -0.768458037753630310, +-0.768426041783920820, -0.768394043893145700, -0.768362044081386090, -0.768330042348721260, -0.768298038695231390, -0.768266033120996390, -0.768234025626096330, -0.768202016210610570, +-0.768170004874620390, -0.768137991618205170, -0.768105976441445070, -0.768073959344419910, -0.768041940327209960, -0.768009919389895050, -0.767977896532555440, -0.767945871755270960, +-0.767913845058121320, -0.767881816441187690, -0.767849785904549440, -0.767817753448286730, -0.767785719072479610, -0.767753682777208240, -0.767721644562552760, -0.767689604428592460, +-0.767657562375408720, -0.767625518403081130, -0.767593472511689750, -0.767561424701314610, -0.767529374972035990, -0.767497323323933940, -0.767465269757088510, -0.767433214271579400, +-0.767401156867487780, -0.767369097544893240, -0.767337036303876060, -0.767304973144516180, -0.767272908066893970, -0.767240841071089360, -0.767208772157182190, -0.767176701325253620, +-0.767144628575383350, -0.767112553907651430, -0.767080477322138130, -0.767048398818923730, -0.767016318398088260, -0.766984236059712000, -0.766952151803874550, -0.766920065630657400, +-0.766887977540139930, -0.766855887532402640, -0.766823795607525560, -0.766791701765589080, -0.766759606006673260, -0.766727508330857900, -0.766695408738224280, -0.766663307228852230, +-0.766631203802821790, -0.766599098460213460, -0.766566991201107380, -0.766534882025583730, -0.766502770933722990, -0.766470657925605200, -0.766438543001310310, -0.766406426160919580, +-0.766374307404512730, -0.766342186732170140, -0.766310064143972180, -0.766277939639998910, -0.766245813220330360, -0.766213684885047820, -0.766181554634230990, -0.766149422467960360, +-0.766117288386316100, -0.766085152389378690, -0.766053014477228290, -0.766020874649945500, -0.765988732907610380, -0.765956589250302970, -0.765924443678104530, -0.765892296191095110, +-0.765860146789354880, -0.765827995472964320, -0.765795842242003810, -0.765763687096553620, -0.765731530036693700, -0.765699371062505520, -0.765667210174068800, -0.765635047371464150, +-0.765602882654771940, -0.765570716024072450, -0.765538547479446160, -0.765506377020973570, -0.765474204648734390, -0.765442030362810220, -0.765409854163281110, -0.765377676050227330, +-0.765345496023729370, -0.765313314083867600, -0.765281130230722530, -0.765248944464374190, -0.765216756784903970, -0.765184567192391810, -0.765152375686918300, -0.765120182268563930, +-0.765087986937408980, -0.765055789693534050, -0.765023590537019740, -0.764991389467945870, -0.764959186486394050, -0.764926981592444320, -0.764894774786177070, -0.764862566067672890, +-0.764830355437012390, -0.764798142894275950, -0.764765928439543500, -0.764733712072896870, -0.764701493794415990, -0.764669273604181350, -0.764637051502273460, -0.764604827488773010, +-0.764572601563760500, -0.764540373727316420, -0.764508143979521490, -0.764475912320455640, -0.764443678750200470, -0.764411443268836250, -0.764379205876443260, -0.764346966573102420, +-0.764314725358894000, -0.764282482233898270, -0.764250237198196960, -0.764217990251869980, -0.764185741394998060, -0.764153490627661800, -0.764121237949941800, -0.764088983361918660, +-0.764056726863673100, -0.764024468455285710, -0.763992208136836660, -0.763959945908407550, -0.763927681770078640, -0.763895415721930540, -0.763863147764043850, -0.763830877896499280, +-0.763798606119377550, -0.763766332432758710, -0.763734056836724680, -0.763701779331355410, -0.763669499916731830, -0.763637218592934320, -0.763604935360043920, -0.763572650218141140, +-0.763540363167306670, -0.763508074207620790, -0.763475783339165210, -0.763443490562020210, -0.763411195876266600, -0.763378899281984880, -0.763346600779255870, -0.763314300368160500, +-0.763281998048778720, -0.763249693821192570, -0.763217387685482080, -0.763185079641728210, -0.763152769690011560, -0.763120457830413050, -0.763088144063013400, -0.763055828387893430, +-0.763023510805133200, -0.762991191314814850, -0.762958869917018560, -0.762926546611825020, -0.762894221399315060, -0.762861894279569630, -0.762829565252669540, -0.762797234318694840, +-0.762764901477727690, -0.762732566729848240, -0.762700230075137430, -0.762667891513675980, -0.762635551045544810, -0.762603208670824760, -0.762570864389596760, -0.762538518201941630, +-0.762506170107939530, -0.762473820107672620, -0.762441468201221160, -0.762409114388665990, -0.762376758670088030, -0.762344401045568220, -0.762312041515186830, -0.762279680079025910, +-0.762247316737165730, -0.762214951489687320, -0.762182584336671520, -0.762150215278199260, -0.762117844314351480, -0.762085471445209110, -0.762053096670852970, -0.762020719991363560, +-0.761988341406822920, -0.761955960917311440, -0.761923578522910150, -0.761891194223699770, -0.761858808019761470, -0.761826419911175500, -0.761794029898024140, -0.761761637980387650, +-0.761729244158347200, -0.761696848431983490, -0.761664450801377680, -0.761632051266610820, -0.761599649827763740, -0.761567246484917580, -0.761534841238152740, -0.761502434087551360, +-0.761470025033193940, -0.761437614075161310, -0.761405201213534830, -0.761372786448395230, -0.761340369779823670, -0.761307951207900620, -0.761275530732708370, -0.761243108354327180, +-0.761210684072838320, -0.761178257888322610, -0.761145829800861320, -0.761113399810535500, -0.761080967917426190, -0.761048534121613770, -0.761016098423180630, -0.760983660822207360, +-0.760951221318774800, -0.760918779912964300, -0.760886336604856720, -0.760853891394533410, -0.760821444282074770, -0.760788995267563050, -0.760756544351078870, -0.760724091532703370, +-0.760691636812517610, -0.760659180190602750, -0.760626721667039930, -0.760594261241910320, -0.760561798915295070, -0.760529334687274680, -0.760496868557931640, -0.760464400527346320, +-0.760431930595600100, -0.760399458762773930, -0.760366985028949280, -0.760334509394206440, -0.760302031858627990, -0.760269552422294440, -0.760237071085286930, -0.760204587847686850, +-0.760172102709575250, -0.760139615671033500, -0.760107126732142650, -0.760074635892983850, -0.760042143153638050, -0.760009648514187400, -0.759977151974712610, -0.759944653535294950, +-0.759912153196015680, -0.759879650956956090, -0.759847146818196650, -0.759814640779819970, -0.759782132841906770, -0.759749623004538190, -0.759717111267795510, -0.759684597631760110, +-0.759652082096513140, -0.759619564662136090, -0.759587045328710020, -0.759554524096315850, -0.759522000965035860, -0.759489475934950970, -0.759456949006142250, -0.759424420178691270, +-0.759391889452679210, -0.759359356828187450, -0.759326822305296690, -0.759294285884089430, -0.759261747564646480, -0.759229207347049240, -0.759196665231378850, -0.759164121217716810, +-0.759131575306144500, -0.759099027496743290, -0.759066477789593910, -0.759033926184778940, -0.759001372682378990, -0.758968817282475780, -0.758936259985150570, -0.758903700790484640, +-0.758871139698559350, -0.758838576709455760, -0.758806011823256240, -0.758773445040041740, -0.758740876359893620, -0.758708305782893390, -0.758675733309122300, -0.758643158938661850, +-0.758610582671593540, -0.758578004507998840, -0.758545424447958470, -0.758512842491555040, -0.758480258638869590, -0.758447672889983600, -0.758415085244978250, -0.758382495703935230, +-0.758349904266935490, -0.758317310934061520, -0.758284715705394240, -0.758252118581015160, -0.758219519561005860, -0.758186918645447740, -0.758154315834422280, -0.758121711128011080, +-0.758089104526295520, -0.758056496029356650, -0.758023885637277180, -0.757991273350137940, -0.757958659168020520, -0.757926043091006530, -0.757893425119177340, -0.757860805252614120, +-0.757828183491399350, -0.757795559835614090, -0.757762934285340030, -0.757730306840658670, -0.757697677501651400, -0.757665046268400030, -0.757632413140986060, -0.757599778119490970, +-0.757567141203995930, -0.757534502394583640, -0.757501861691335040, -0.757469219094331740, -0.757436574603655540, -0.757403928219387730, -0.757371279941610240, -0.757338629770403890, +-0.757305977705851620, -0.757273323748034350, -0.757240667897033810, -0.757208010152931490, -0.757175350515809310, -0.757142688985748660, -0.757110025562831250, -0.757077360247138230, +-0.757044693038752440, -0.757012023937754910, -0.756979352944227250, -0.756946680058251280, -0.756914005279908600, -0.756881328609280810, -0.756848650046449190, -0.756815969591496550, +-0.756783287244503940, -0.756750603005553190, -0.756717916874725890, -0.756685228852103760, -0.756652538937768630, -0.756619847131802080, -0.756587153434285950, -0.756554457845301400, +-0.756521760364931240, -0.756489060993256630, -0.756456359730359410, -0.756423656576321270, -0.756390951531224040, -0.756358244595148890, -0.756325535768178630, -0.756292825050394520, +-0.756260112441878410, -0.756227397942711880, -0.756194681552976980, -0.756161963272755420, -0.756129243102128920, -0.756096521041179190, -0.756063797089987720, -0.756031071248637330, +-0.755998343517209180, -0.755965613895785200, -0.755932882384447110, -0.755900148983276950, -0.755867413692355880, -0.755834676511766720, -0.755801937441590970, -0.755769196481910210, +-0.755736453632806620, -0.755703708894361890, -0.755670962266657750, -0.755638213749776360, -0.755605463343799300, -0.755572711048808190, -0.755539956864885730, -0.755507200792113420, +-0.755474442830573080, -0.755441682980346640, -0.755408921241516040, -0.755376157614163100, -0.755343392098369200, -0.755310624694217390, -0.755277855401789040, -0.755245084221165990, +-0.755212311152430260, -0.755179536195663800, -0.755146759350948440, -0.755113980618366210, -0.755081199997998500, -0.755048417489928350, -0.755015633094237030, -0.754982846811006800, +-0.754950058640319390, -0.754917268582256830, -0.754884476636901060, -0.754851682804333570, -0.754818887084637400, -0.754786089477894050, -0.754753289984185450, -0.754720488603593750, +-0.754687685336200680, -0.754654880182088480, -0.754622073141339000, -0.754589264214033720, -0.754556453400256010, -0.754523640700087040, -0.754490826113609070, -0.754458009640903930, +-0.754425191282053880, -0.754392371037140850, -0.754359548906246240, -0.754326724889453290, -0.754293898986843630, -0.754261071198499170, -0.754228241524502070, -0.754195409964934390, +-0.754162576519878170, -0.754129741189415450, -0.754096903973628390, -0.754064064872598580, -0.754031223886409090, -0.753998381015141610, -0.753965536258878080, -0.753932689617700770, +-0.753899841091691720, -0.753866990680932550, -0.753834138385506390, -0.753801284205494970, -0.753768428140980330, -0.753735570192044510, -0.753702710358769900, -0.753669848641238540, +-0.753636985039532360, -0.753604119553733850, -0.753571252183924510, -0.753538382930187490, -0.753505511792604610, -0.753472638771257920, -0.753439763866229680, -0.753406887077601950, +-0.753374008405457100, -0.753341127849876500, -0.753308245410943770, -0.753275361088740380, -0.753242474883348720, -0.753209586794850730, -0.753176696823328770, -0.753143804968865130, +-0.753110911231541950, -0.753078015611440940, -0.753045118108645490, -0.753012218723237200, -0.752979317455298340, -0.752946414304911270, -0.752913509272158050, -0.752880602357121060, +-0.752847693559882130, -0.752814782880524390, -0.752781870319129800, -0.752748955875780500, -0.752716039550558770, -0.752683121343546980, -0.752650201254827400, -0.752617279284482300, +-0.752584355432593500, -0.752551429699244270, -0.752518502084516540, -0.752485572588492470, -0.752452641211254550, -0.752419707952885040, -0.752386772813466220, -0.752353835793079910, +-0.752320896891809590, -0.752287956109736980, -0.752255013446944450, -0.752222068903514510, -0.752189122479529400, -0.752156174175071410, -0.752123223990222910, -0.752090271925066500, +-0.752057317979683780, -0.752024362154158240, -0.751991404448571930, -0.751958444863007110, -0.751925483397546170, -0.751892520052271470, -0.751859554827264850, -0.751826587722610020, +-0.751793618738388680, -0.751760647874683220, -0.751727675131576230, -0.751694700509150100, -0.751661724007487100, -0.751628745626669930, -0.751595765366780850, -0.751562783227901710, +-0.751529799210116200, -0.751496813313506260, -0.751463825538154270, -0.751430835884142610, -0.751397844351553990, -0.751364850940470670, -0.751331855650974710, -0.751298858483149590, +-0.751265859437077470, -0.751232858512840610, -0.751199855710521610, -0.751166851030202980, -0.751133844471967290, -0.751100836035896950, -0.751067825722073870, -0.751034813530581880, +-0.751001799461502810, -0.750968783514919250, -0.750935765690913690, -0.750902745989568850, -0.750869724410967000, -0.750836700955190390, -0.750803675622322530, -0.750770648412445450, +-0.750737619325641870, -0.750704588361994160, -0.750671555521584930, -0.750638520804496890, -0.750605484210812520, -0.750572445740613880, -0.750539405393984670, -0.750506363171007050, +-0.750473319071763400, -0.750440273096336430, -0.750407225244808960, -0.750374175517263260, -0.750341123913781600, -0.750308070434447690, -0.750275015079343580, -0.750241957848551970, +-0.750208898742155460, -0.750175837760236770, -0.750142774902878400, -0.750109710170163150, -0.750076643562173520, -0.750043575078991780, -0.750010504720701740, -0.749977432487385350, +-0.749944358379125430, -0.749911282396004570, -0.749878204538105500, -0.749845124805510350, -0.749812043198302970, -0.749778959716565500, -0.749745874360380650, -0.749712787129831030, +-0.749679698024999560, -0.749646607045968750, -0.749613514192821520, -0.749580419465640360, -0.749547322864507760, -0.749514224389507210, -0.749481124040721310, -0.749448021818232450, +-0.749414917722123650, -0.749381811752477420, -0.749348703909376800, -0.749315594192903720, -0.749282482603142340, -0.749249369140174700, -0.749216253804083630, -0.749183136594951950, +-0.749150017512862480, -0.749116896557897930, -0.749083773730141010, -0.749050649029674220, -0.749017522456581370, -0.748984394010944740, -0.748951263692847040, -0.748918131502371190, +-0.748884997439600130, -0.748851861504616470, -0.748818723697502580, -0.748785584018342500, -0.748752442467218390, -0.748719299044213300, -0.748686153749409830, -0.748653006582891020, +-0.748619857544739810, -0.748586706635038790, -0.748553553853870460, -0.748520399201318850, -0.748487242677466250, -0.748454084282395570, -0.748420924016189650, -0.748387761878931410, +-0.748354597870703800, -0.748321431991589070, -0.748288264241671270, -0.748255094621032900, -0.748221923129756880, -0.748188749767925930, -0.748155574535623200, -0.748122397432931410, +-0.748089218459933700, -0.748056037616713020, -0.748022854903351520, -0.747989670319933580, -0.747956483866541340, -0.747923295543257980, -0.747890105350166310, -0.747856913287349490, +-0.747823719354889780, -0.747790523552871340, -0.747757325881376560, -0.747724126340488460, -0.747690924930290100, -0.747657721650864300, -0.747624516502294330, -0.747591309484663010, +-0.747558100598053390, -0.747524889842548060, -0.747491677218230950, -0.747458462725184790, -0.747425246363492390, -0.747392028133236800, -0.747358808034501280, -0.747325586067368650, +-0.747292362231921410, -0.747259136528243940, -0.747225908956418610, -0.747192679516528570, -0.747159448208656760, -0.747126215032886340, -0.747092979989300470, -0.747059743077982060, +-0.747026504299013740, -0.746993263652479640, -0.746960021138462490, -0.746926776757045330, -0.746893530508311200, -0.746860282392343140, -0.746827032409224430, -0.746793780559037670, +-0.746760526841866890, -0.746727271257794810, -0.746694013806904590, -0.746660754489279380, -0.746627493305002220, -0.746594230254156390, -0.746560965336824920, -0.746527698553090420, +-0.746494429903037270, -0.746461159386748060, -0.746427887004306070, -0.746394612755794330, -0.746361336641295890, -0.746328058660894240, -0.746294778814671880, -0.746261497102713060, +-0.746228213525100600, -0.746194928081917560, -0.746161640773247200, -0.746128351599172680, -0.746095060559777370, -0.746061767655144430, -0.746028472885357010, -0.745995176250497830, +-0.745961877750651260, -0.745928577385900020, -0.745895275156327360, -0.745861971062016460, -0.745828665103050680, -0.745795357279512630, -0.745762047591486900, -0.745728736039055870, +-0.745695422622303040, -0.745662107341311780, -0.745628790196165130, -0.745595471186946470, -0.745562150313739290, -0.745528827576626530, -0.745495502975691340, -0.745462176511017870, +-0.745428848182688840, -0.745395517990787850, -0.745362185935398050, -0.745328852016602820, -0.745295516234485310, -0.745262178589128470, -0.745228839080616880, -0.745195497709033150, +-0.745162154474460550, -0.745128809376982670, -0.745095462416682790, -0.745062113593644270, -0.745028762907950390, -0.744995410359683970, -0.744962055948929720, -0.744928699675770360, +-0.744895341540289140, -0.744861981542569660, -0.744828619682695200, -0.744795255960749140, -0.744761890376814390, -0.744728522930975470, -0.744695153623315290, -0.744661782453917230, +-0.744628409422864680, -0.744595034530241120, -0.744561657776129930, -0.744528279160614700, -0.744494898683778050, -0.744461516345704900, -0.744428132146477850, -0.744394746086180500, +-0.744361358164896240, -0.744327968382708650, -0.744294576739701120, -0.744261183235956580, -0.744227787871559630, -0.744194390646593210, -0.744160991561140790, -0.744127590615285990, +-0.744094187809112070, -0.744060783142702850, -0.744027376616141490, -0.743993968229511800, -0.743960557982896620, -0.743927145876380650, -0.743893731910046710, -0.743860316083978510, +-0.743826898398259550, -0.743793478852973310, -0.743760057448202730, -0.743726634184032620, -0.743693209060545920, -0.743659782077826350, -0.743626353235957160, -0.743592922535022070, +-0.743559489975104790, -0.743526055556288700, -0.743492619278657510, -0.743459181142294150, -0.743425741147283440, -0.743392299293708430, -0.743358855581652600, -0.743325410011199670, +-0.743291962582433240, -0.743258513295436800, -0.743225062150293600, -0.743191609147088260, -0.743158154285903930, -0.743124697566824200, -0.743091238989932790, -0.743057778555313190, +-0.743024316263049210, -0.742990852113224460, -0.742957386105921880, -0.742923918241226500, -0.742890448519221370, -0.742856976939989980, -0.742823503503616370, -0.742790028210183810, +-0.742756551059776230, -0.742723072052476670, -0.742689591188369970, -0.742656108467539380, -0.742622623890068610, -0.742589137456041160, -0.742555649165540840, -0.742522159018651370, +-0.742488667015456680, -0.742455173156039590, -0.742421677440485150, -0.742388179868876510, -0.742354680441297490, -0.742321179157831800, -0.742287676018563050, -0.742254171023575160, +-0.742220664172951290, -0.742187155466776270, -0.742153644905133470, -0.742120132488106490, -0.742086618215779260, -0.742053102088235380, -0.742019584105558790, -0.741986064267833200, +-0.741952542575142540, -0.741919019027569850, -0.741885493625200180, -0.741851966368116790, -0.741818437256403510, -0.741784906290144150, -0.741751373469422550, -0.741717838794321960, +-0.741684302264927210, -0.741650763881321890, -0.741617223643589510, -0.741583681551814090, -0.741550137606079570, -0.741516591806469670, -0.741483044153068200, -0.741449494645959110, +-0.741415943285225860, -0.741382390070953190, -0.741348835003224680, -0.741315278082123940, -0.741281719307735120, -0.741248158680141930, -0.741214596199427760, -0.741181031865677630, +-0.741147465678975050, -0.741113897639403720, -0.741080327747047680, -0.741046756001990880, -0.741013182404317130, -0.740979606954110360, -0.740946029651454730, -0.740912450496433280, +-0.740878869489131290, -0.740845286629632230, -0.740811701918019930, -0.740778115354378430, -0.740744526938791560, -0.740710936671343360, -0.740677344552117200, -0.740643750581198360, +-0.740610154758670090, -0.740576557084616560, -0.740542957559121470, -0.740509356182269100, -0.740475752954143250, -0.740442147874827980, -0.740408540944406890, -0.740374932162964900, +-0.740341321530585740, -0.740307709047353210, -0.740274094713351370, -0.740240478528664260, -0.740206860493376030, -0.740173240607570060, -0.740139618871331510, -0.740105995284743970, +-0.740072369847891490, -0.740038742560858000, -0.740005113423727660, -0.739971482436584620, -0.739937849599512810, -0.739904214912596280, -0.739870578375918740, -0.739836939989565350, +-0.739803299753619580, -0.739769657668165600, -0.739736013733287460, -0.739702367949069180, -0.739668720315594500, -0.739635070832948660, -0.739601419501215050, -0.739567766320477830, +-0.739534111290821360, -0.739500454412329480, -0.739466795685086550, -0.739433135109176520, -0.739399472684683760, -0.739365808411691640, -0.739332142290285650, -0.739298474320549400, +-0.739264804502566820, -0.739231132836422280, -0.739197459322199930, -0.739163783959983280, -0.739130106749857800, -0.739096427691907090, -0.739062746786215200, -0.739029064032866610, +-0.738995379431945270, -0.738961692983535420, -0.738928004687721350, -0.738894314544587320, -0.738860622554216920, -0.738826928716695530, -0.738793233032106870, -0.738759535500535080, +-0.738725836122064440, -0.738692134896779210, -0.738658431824763650, -0.738624726906101480, -0.738591020140878070, -0.738557311529177030, -0.738523601071082720, -0.738489888766679540, +-0.738456174616051400, -0.738422458619283020, -0.738388740776458440, -0.738355021087661490, -0.738321299552977430, -0.738287576172490190, -0.738253850946284040, -0.738220123874443250, +-0.738186394957052070, -0.738152664194195120, -0.738118931585955760, -0.738085197132419600, -0.738051460833670570, -0.738017722689792820, -0.737983982700870730, -0.737950240866988790, +-0.737916497188231160, -0.737882751664682310, -0.737849004296426640, -0.737815255083547840, -0.737781504026131520, -0.737747751124261390, -0.737713996378021820, -0.737680239787497300, +-0.737646481352772220, -0.737612721073930390, -0.737578958951057300, -0.737545194984236760, -0.737511429173553280, -0.737477661519091220, -0.737443892020935080, -0.737410120679169110, +-0.737376347493877930, -0.737342572465145780, -0.737308795593056620, -0.737275016877696140, -0.737241236319148060, -0.737207453917496870, -0.737173669672827160, -0.737139883585223200, +-0.737106095654768920, -0.737072305881550040, -0.737038514265650260, -0.737004720807154400, -0.736970925506146620, -0.736937128362711520, -0.736903329376933700, -0.736869528548897420, +-0.736835725878687400, -0.736801921366387450, -0.736768115012083280, -0.736734306815858830, -0.736700496777798590, -0.736666684897987150, -0.736632871176509000, -0.736599055613448740, +-0.736565238208890080, -0.736531418962918960, -0.736497597875619410, -0.736463774947075820, -0.736429950177372780, -0.736396123566594780, -0.736362295114826540, -0.736328464822152640, +-0.736294632688656910, -0.736260798714425180, -0.736226962899541370, -0.736193125244090310, -0.736159285748156370, -0.736125444411824260, -0.736091601235178470, -0.736057756218303160, +-0.736023909361283920, -0.735990060664205030, -0.735956210127150960, -0.735922357750206310, -0.735888503533455920, -0.735854647476984150, -0.735820789580875710, -0.735786929845214770, +-0.735753068270087130, -0.735719204855576850, -0.735685339601768410, -0.735651472508746740, -0.735617603576596450, -0.735583732805402010, -0.735549860195247710, -0.735515985746219240, +-0.735482109458400980, -0.735448231331877310, -0.735414351366733170, -0.735380469563053140, -0.735346585920921840, -0.735312700440424180, -0.735278813121644780, -0.735244923964667670, +-0.735211032969578790, -0.735177140136462510, -0.735143245465403220, -0.735109348956485940, -0.735075450609795180, -0.735041550425415300, -0.735007648403432020, -0.734973744543929720, +-0.734939838846992990, -0.734905931312706760, -0.734872021941155640, -0.734838110732424440, -0.734804197686597990, -0.734770282803761110, -0.734736366083997840, -0.734702447527394220, +-0.734668527134034520, -0.734634604904003560, -0.734600680837386060, -0.734566754934266820, -0.734532827194730680, -0.734498897618862000, -0.734464966206746510, -0.734431032958468680, +-0.734397097874113220, -0.734363160953765080, -0.734329222197509070, -0.734295281605430010, -0.734261339177612600, -0.734227394914141350, -0.734193448815102290, -0.734159500880579460, +-0.734125551110657910, -0.734091599505422580, -0.734057646064958160, -0.734023690789349590, -0.733989733678681370, -0.733955774733039190, -0.733921813952507660, -0.733887851337171710, +-0.733853886887116060, -0.733819920602425620, -0.733785952483185460, -0.733751982529480370, -0.733718010741394750, -0.733684037119014640, -0.733650061662424520, -0.733616084371709220, +-0.733582105246953780, -0.733548124288242900, -0.733514141495661850, -0.733480156869294800, -0.733446170409227990, -0.733412182115545710, -0.733378191988332980, -0.733344200027674860, +-0.733310206233656170, -0.733276210606361940, -0.733242213145877230, -0.733208213852286960, -0.733174212725675620, -0.733140209766129260, -0.733106204973732360, -0.733072198348569960, +-0.733038189890727110, -0.733004179600288850, -0.732970167477339450, -0.732936153521965170, -0.732902137734250610, -0.732868120114280710, -0.732834100662140500, -0.732800079377915030, +-0.732766056261689340, -0.732732031313548470, -0.732698004533577580, -0.732663975921861050, -0.732629945478485260, -0.732595913203534570, -0.732561879097094140, -0.732527843159248900, +-0.732493805390084130, -0.732459765789684750, -0.732425724358135470, -0.732391681095522440, -0.732357636001930160, -0.732323589077443880, -0.732289540322148550, -0.732255489736129420, +-0.732221437319471540, -0.732187383072260060, -0.732153326994579580, -0.732119269086516260, -0.732085209348154910, -0.732051147779580470, -0.732017084380878090, -0.731983019152133150, +-0.731948952093430580, -0.731914883204854980, -0.731880812486492840, -0.731846739938428750, -0.731812665560747640, -0.731778589353535010, -0.731744511316875790, -0.731710431450855350, +-0.731676349755558840, -0.731642266231070870, -0.731608180877477810, -0.731574093694864260, -0.731540004683315480, -0.731505913842916740, -0.731471821173753200, -0.731437726675910120, +-0.731403630349472090, -0.731369532194525610, -0.731335432211155270, -0.731301330399446450, -0.731267226759484190, -0.731233121291353870, -0.731199013995140760, -0.731164904870930110, +-0.731130793918807200, -0.731096681138856840, -0.731062566531165190, -0.731028450095817290, -0.730994331832898080, -0.730960211742493150, -0.730926089824687650, -0.730891966079566410, +-0.730857840507215810, -0.730823713107720540, -0.730789583881166100, -0.730755452827637540, -0.730721319947220560, -0.730687185240000090, -0.730653048706061740, -0.730618910345490760, +-0.730584770158371980, -0.730550628144791770, -0.730516484304835070, -0.730482338638587030, -0.730448191146133240, -0.730414041827558980, -0.730379890682949620, -0.730345737712389860, +-0.730311582915966430, -0.730277426293764020, -0.730243267845868130, -0.730209107572363900, -0.730174945473337060, -0.730140781548872740, -0.730106615799056560, -0.730072448223973100, +-0.730038278823709310, -0.730004107598349660, -0.729969934547979870, -0.729935759672685200, -0.729901582972551030, -0.729867404447662960, -0.729833224098105800, -0.729799041923966160, +-0.729764857925328970, -0.729730672102279600, -0.729696484454903540, -0.729662294983286270, -0.729628103687513410, -0.729593910567670090, -0.729559715623841480, -0.729525518856114160, +-0.729491320264572970, -0.729457119849303610, -0.729422917610391460, -0.729388713547921900, -0.729354507661980620, -0.729320299952652460, -0.729286090420024240, -0.729251879064180650, +-0.729217665885207420, -0.729183450883190030, -0.729149234058213970, -0.729115015410364940, -0.729080794939728220, -0.729046572646389610, -0.729012348530433950, -0.728978122591948050, +-0.728943894831016740, -0.728909665247725820, -0.728875433842160580, -0.728841200614406940, -0.728806965564549600, -0.728772728692675400, -0.728738489998869480, -0.728704249483217330, +-0.728670007145804540, -0.728635762986716730, -0.728601517006039480, -0.728567269203858390, -0.728533019580259290, -0.728498768135326880, -0.728464514869148210, -0.728430259781808310, +-0.728396002873392680, -0.728361744143987020, -0.728327483593677050, -0.728293221222548360, -0.728258957030686100, -0.728224691018176990, -0.728190423185106070, -0.728156153531559270, +-0.728121882057621850, -0.728087608763379970, -0.728053333648918890, -0.728019056714324540, -0.727984777959681970, -0.727950497385078000, -0.727916214990597890, -0.727881930776327120, +-0.727847644742351640, -0.727813356888756920, -0.727779067215628910, -0.727744775723052630, -0.727710482411114910, -0.727676187279901020, -0.727641890329496780, -0.727607591559987780, +-0.727573290971459730, -0.727538988563998460, -0.727504684337689670, -0.727470378292618620, -0.727436070428872260, -0.727401760746535730, -0.727367449245694740, -0.727333135926435110, +-0.727298820788842670, -0.727264503833003230, -0.727230185059001940, -0.727195864466925750, -0.727161542056859900, -0.727127217828890120, -0.727092891783102440, -0.727058563919582460, +-0.727024234238416000, -0.726989902739689110, -0.726955569423487270, -0.726921234289896080, -0.726886897339002250, -0.726852558570891370, -0.726818217985648940, -0.726783875583360990, +-0.726749531364113350, -0.726715185327991400, -0.726680837475081940, -0.726646487805470480, -0.726612136319242710, -0.726577783016484680, -0.726543427897282100, -0.726509070961721020, +-0.726474712209887240, -0.726440351641866710, -0.726405989257744690, -0.726371625057608330, -0.726337259041542890, -0.726302891209634320, -0.726268521561968420, -0.726234150098631240, +-0.726199776819708820, -0.726165401725286320, -0.726131024815450780, -0.726096646090287790, -0.726062265549883180, -0.726027883194322880, -0.725993499023692810, -0.725959113038079030, +-0.725924725237567570, -0.725890335622243590, -0.725855944192194460, -0.725821550947505330, -0.725787155888262480, -0.725752759014551610, -0.725718360326458980, -0.725683959824070300, +-0.725649557507471180, -0.725615153376748760, -0.725580747431988530, -0.725546339673276420, -0.725511930100698370, -0.725477518714340520, -0.725443105514288920, -0.725408690500629500, +-0.725374273673447760, -0.725339855032831050, -0.725305434578864540, -0.725271012311634600, -0.725236588231227050, -0.725202162337728050, -0.725167734631223640, -0.725133305111799190, +-0.725098873779542190, -0.725064440634538010, -0.725030005676872700, -0.724995568906632410, -0.724961130323903080, -0.724926689928771070, -0.724892247721322210, -0.724857803701642770, +-0.724823357869818330, -0.724788910225935950, -0.724754460770081320, -0.724720009502340720, -0.724685556422799860, -0.724651101531545220, -0.724616644828662170, -0.724582186314238210, +-0.724547725988358700, -0.724513263851109920, -0.724478799902577910, -0.724444334142848920, -0.724409866572009120, -0.724375397190144770, -0.724340925997341790, -0.724306452993685900, +-0.724271978179264480, -0.724237501554163110, -0.724203023118467960, -0.724168542872265400, -0.724134060815641360, -0.724099576948682210, -0.724065091271473450, -0.724030603784102670, +-0.723996114486655350, -0.723961623379217660, -0.723927130461875960, -0.723892635734716410, -0.723858139197825380, -0.723823640851288920, -0.723789140695192730, -0.723754638729624310, +-0.723720134954669360, -0.723685629370414030, -0.723651121976944590, -0.723616612774347410, -0.723582101762708650, -0.723547588942114020, -0.723513074312651110, -0.723478557874405400, +-0.723444039627463400, -0.723409519571911240, -0.723374997707835200, -0.723340474035321760, -0.723305948554457180, -0.723271421265327060, -0.723236892168019010, -0.723202361262618720, +-0.723167828549212580, -0.723133294027886840, -0.723098757698727780, -0.723064219561821990, -0.723029679617254840, -0.722995137865114270, -0.722960594305485760, -0.722926048938455800, +-0.722891501764110770, -0.722856952782536920, -0.722822401993820640, -0.722787849398048520, -0.722753294995306610, -0.722718738785680940, -0.722684180769259000, -0.722649620946126610, +-0.722615059316370160, -0.722580495880076110, -0.722545930637330750, -0.722511363588219990, -0.722476794732831440, -0.722442224071250920, -0.722407651603564900, -0.722373077329859560, +-0.722338501250221700, -0.722303923364737480, -0.722269343673493490, -0.722234762176576120, -0.722200178874071290, -0.722165593766066590, -0.722131006852647970, -0.722096418133901690, +-0.722061827609914550, -0.722027235280772730, -0.721992641146562140, -0.721958045207370720, -0.721923447463284070, -0.721888847914388790, -0.721854246560771460, -0.721819643402518580, +-0.721785038439716420, -0.721750431672451790, -0.721715823100811060, -0.721681212724880170, -0.721646600544746830, -0.721611986560496970, -0.721577370772217170, -0.721542753179993950, +-0.721508133783913760, -0.721473512584063340, -0.721438889580528490, -0.721404264773397140, -0.721369638162754900, -0.721335009748688690, -0.721300379531285010, -0.721265747510630330, +-0.721231113686811250, -0.721196478059914490, -0.721161840630025750, -0.721127201397233190, -0.721092560361622500, -0.721057917523280520, -0.721023272882293620, -0.720988626438748610, +-0.720953978192732100, -0.720919328144330020, -0.720884676293630070, -0.720850022640718620, -0.720815367185681950, -0.720780709928606990, -0.720746050869580210, -0.720711390008688340, +-0.720676727346017950, -0.720642062881655780, -0.720607396615687850, -0.720572728548201980, -0.720538058679284330, -0.720503387009021500, -0.720468713537500190, -0.720434038264807120, +-0.720399361191028320, -0.720364682316251840, -0.720330001640563600, -0.720295319164050210, -0.720260634886798700, -0.720225948808895570, -0.720191260930427510, -0.720156571251481360, +-0.720121879772143700, -0.720087186492500810, -0.720052491412640490, -0.720017794532649020, -0.719983095852613110, -0.719948395372619340, -0.719913693092754660, -0.719878989013105100, +-0.719844283133758700, -0.719809575454801510, -0.719774865976320450, -0.719740154698402250, -0.719705441621133590, -0.719670726744601420, -0.719636010068892330, -0.719601291594093360, +-0.719566571320290450, -0.719531849247571740, -0.719497125376023390, -0.719462399705732230, -0.719427672236785050, -0.719392942969268700, -0.719358211903270100, -0.719323479038875170, +-0.719288744376172300, -0.719254007915247520, -0.719219269656187770, -0.719184529599079750, -0.719149787744010500, -0.719115044091066750, -0.719080298640335400, -0.719045551391902630, +-0.719010802345856680, -0.718976051502283610, -0.718941298861270560, -0.718906544422904140, -0.718871788187271380, -0.718837030154459210, -0.718802270324553790, -0.718767508697643390, +-0.718732745273814140, -0.718697980053153000, -0.718663213035746980, -0.718628444221682930, -0.718593673611047760, -0.718558901203928400, -0.718524127000411790, -0.718489351000584200, +-0.718454573204533880, -0.718419793612347200, -0.718385012224110890, -0.718350229039912190, -0.718315444059837830, -0.718280657283974280, -0.718245868712409700, -0.718211078345230460, +-0.718176286182523490, -0.718141492224375840, -0.718106696470874440, -0.718071898922106320, -0.718037099578158420, -0.718002298439117780, -0.717967495505070770, -0.717932690776105660, +-0.717897884252308830, -0.717863075933767300, -0.717828265820568020, -0.717793453912798140, -0.717758640210544030, -0.717723824713893840, -0.717689007422934180, -0.717654188337751850, +-0.717619367458434240, -0.717584544785068170, -0.717549720317740670, -0.717514894056538900, -0.717480066001549900, -0.717445236152860040, -0.717410404510557820, -0.717375571074729490, +-0.717340735845462320, -0.717305898822843350, -0.717271060006959500, -0.717236219397898060, -0.717201376995745490, -0.717166532800590060, -0.717131686812518270, -0.717096839031617360, +-0.717061989457974280, -0.717027138091676170, -0.716992284932810310, -0.716957429981463720, -0.716922573237723020, -0.716887714701676340, -0.716852854373410510, -0.716817992253012460, +-0.716783128340569450, -0.716748262636168530, -0.716713395139897070, -0.716678525851841550, -0.716643654772090240, -0.716608781900729740, -0.716573907237847420, -0.716539030783530210, +-0.716504152537865590, -0.716469272500940390, -0.716434390672842090, -0.716399507053657960, -0.716364621643474250, -0.716329734442379680, -0.716294845450460740, -0.716259954667804680, +-0.716225062094498770, -0.716190167730630270, -0.716155271576285560, -0.716120373631553450, -0.716085473896520330, -0.716050572371273560, -0.716015669055900310, -0.715980763950487930, +-0.715945857055123700, -0.715910948369894660, -0.715876037894888410, -0.715841125630191310, -0.715806211575892190, -0.715771295732077430, -0.715736378098834390, -0.715701458676250460, +-0.715666537464412890, -0.715631614463408390, -0.715596689673325350, -0.715561763094250790, -0.715526834726271650, -0.715491904569475420, -0.715456972623949470, -0.715422038889781180, +-0.715387103367057690, -0.715352166055866380, -0.715317226956294180, -0.715282286068429470, -0.715247343392359070, -0.715212398928170230, -0.715177452675950560, -0.715142504635787100, +-0.715107554807767440, -0.715072603191978300, -0.715037649788508150, -0.715002694597444030, -0.714967737618873110, -0.714932778852882870, -0.714897818299560560, -0.714862855958993900, +-0.714827891831269930, -0.714792925916475700, -0.714757958214699780, -0.714722988726028910, -0.714688017450550660, -0.714653044388352310, -0.714618069539521340, -0.714583092904145230, +-0.714548114482310700, -0.714513134274106560, -0.714478152279619530, -0.714443168498937190, -0.714408182932146920, -0.714373195579336210, -0.714338206440592430, -0.714303215516003180, +-0.714268222805655270, -0.714233228309637420, -0.714198232028036450, -0.714163233960940060, -0.714128234108435400, -0.714093232470610180, -0.714058229047552010, -0.714023223839347580, +-0.713988216846085710, -0.713953208067853230, -0.713918197504737840, -0.713883185156826920, -0.713848171024207940, -0.713813155106968630, -0.713778137405196470, -0.713743117918978930, +-0.713708096648402960, -0.713673073593557360, -0.713638048754529080, -0.713603022131405700, -0.713567993724274820, -0.713532963533223820, -0.713497931558339850, -0.713462897799711730, +-0.713427862257426270, -0.713392824931571190, -0.713357785822234080, -0.713322744929502540, -0.713287702253464050, -0.713252657794206320, -0.713217611551816950, -0.713182563526382980, +-0.713147513717993120, -0.713112462126734630, -0.713077408752694870, -0.713042353595961580, -0.713007296656622440, -0.712972237934765160, -0.712937177430476470, -0.712902115143845600, +-0.712867051074959400, -0.712831985223905560, -0.712796917590771790, -0.712761848175645700, -0.712726776978614970, -0.712691703999767330, -0.712656629239189820, -0.712621552696971360, +-0.712586474373199000, -0.712551394267960330, -0.712516312381343390, -0.712481228713435550, -0.712446143264324650, -0.712411056034097820, -0.712375967022843890, -0.712340876230650120, +-0.712305783657604110, -0.712270689303793670, -0.712235593169306510, -0.712200495254230350, -0.712165395558652990, -0.712130294082661490, -0.712095190826344870, -0.712060085789790300, +-0.712024978973085480, -0.711989870376318220, -0.711954759999576250, -0.711919647842947370, -0.711884533906518850, -0.711849418190379610, -0.711814300694616710, -0.711779181419318170, +-0.711744060364571610, -0.711708937530464940, -0.711673812917085980, -0.711638686524522330, -0.711603558352862150, -0.711568428402192250, -0.711533296672602010, -0.711498163164178580, +-0.711463027877009770, -0.711427890811183290, -0.711392751966787080, -0.711357611343908400, -0.711322468942636290, -0.711287324763058000, -0.711252178805261480, -0.711217031069334430, +-0.711181881555364770, -0.711146730263440550, -0.711111577193649370, -0.711076422346079370, -0.711041265720817610, -0.711006107317953220, -0.710970947137573690, -0.710935785179766740, +-0.710900621444620410, -0.710865455932222500, -0.710830288642660850, -0.710795119576022930, -0.710759948732397890, -0.710724776111872900, -0.710689601714535990, -0.710654425540475090, +-0.710619247589778010, -0.710584067862533030, -0.710548886358827740, -0.710513703078749610, -0.710478518022387820, -0.710443331189829830, -0.710408142581163470, -0.710372952196476780, +-0.710337760035857580, -0.710302566099394130, -0.710267370387173580, -0.710232172899285310, -0.710196973635816460, -0.710161772596855310, -0.710126569782489670, -0.710091365192807580, +-0.710056158827897080, -0.710020950687846210, -0.709985740772742350, -0.709950529082674750, -0.709915315617730910, -0.709880100377998650, -0.709844883363566210, -0.709809664574521550, +-0.709774444010952690, -0.709739221672947120, -0.709703997560594100, -0.709668771673981120, -0.709633544013196230, -0.709598314578327450, -0.709563083369462940, -0.709527850386690640, +-0.709492615630098800, -0.709457379099775350, -0.709422140795807790, -0.709386900718285580, -0.709351658867296120, -0.709316415242927430, -0.709281169845267790, -0.709245922674405230, +-0.709210673730427230, -0.709175423013423180, -0.709140170523480440, -0.709104916260687390, -0.709069660225132070, -0.709034402416902520, -0.708999142836087000, -0.708963881482773670, +-0.708928618357050570, -0.708893353459005390, -0.708858086788727420, -0.708822818346304120, -0.708787548131823870, -0.708752276145374730, -0.708717002387044940, -0.708681726856922540, +-0.708646449555095370, -0.708611170481652560, -0.708575889636681830, -0.708540607020271440, -0.708505322632509540, -0.708470036473484280, -0.708434748543284030, -0.708399458841996730, +-0.708364167369710310, -0.708328874126514020, -0.708293579112495570, -0.708258282327743130, -0.708222983772345050, -0.708187683446389490, -0.708152381349964720, -0.708117077483158330, +-0.708081771846059920, -0.708046464438757070, -0.708011155261338070, -0.707975844313891270, -0.707940531596504720, -0.707905217109266900, -0.707869900852265980, -0.707834582825589750, +-0.707799263029327720, -0.707763941463567360, -0.707728618128397270, -0.707693293023905600, -0.707657966150180840, -0.707622637507311030, -0.707587307095383980, -0.707551974914489400, +-0.707516640964714780, -0.707481305246148610, -0.707445967758879140, -0.707410628502994740, -0.707375287478583800, -0.707339944685734690, -0.707304600124535670, -0.707269253795074440, +-0.707233905697440820, -0.707198555831722420, -0.707163204198007600, -0.707127850796384740, -0.707092495626942320, -0.707057138689768050, -0.707021779984951530, -0.706986419512580570, +-0.706951057272743540, -0.706915693265528830, -0.706880327491024920, -0.706844959949320170, -0.706809590640503080, -0.706774219564662020, -0.706738846721884690, -0.706703472112260920, +-0.706668095735878520, -0.706632717592825870, -0.706597337683191330, -0.706561956007063510, -0.706526572564530890, -0.706491187355681060, -0.706455800380603960, -0.706420411639387400, +-0.706385021132119760, -0.706349628858889520, -0.706314234819785280, -0.706278839014895410, -0.706243441444308510, -0.706208042108112280, -0.706172641006396650, -0.706137238139249450, +-0.706101833506759040, -0.706066427109014130, -0.706031018946103090, -0.705995609018114530, -0.705960197325136370, -0.705924783867258320, -0.705889368644568300, -0.705853951657154810, +-0.705818532905106540, -0.705783112388511880, -0.705747690107459410, -0.705712266062037740, -0.705676840252334790, -0.705641412678440380, -0.705605983340442440, -0.705570552238429460, +-0.705535119372490250, -0.705499684742713180, -0.705464248349186860, -0.705428810191999320, -0.705393370271240380, -0.705357928586997970, -0.705322485139360800, -0.705287039928417350, +-0.705251592954256320, -0.705216144216966320, -0.705180693716636050, -0.705145241453353890, -0.705109787427208090, -0.705074331638288480, -0.705038874086682980, -0.705003414772480300, +-0.704967953695769150, -0.704932490856638010, -0.704897026255175030, -0.704861559891470150, -0.704826091765611400, -0.704790621877687370, -0.704755150227786790, -0.704719676815998340, +-0.704684201642410750, -0.704648724707112590, -0.704613246010192710, -0.704577765551739010, -0.704542283331841550, -0.704506799350588350, -0.704471313608068140, -0.704435826104369720, +-0.704400336839581700, -0.704364845813792770, -0.704329353027091210, -0.704293858479566830, -0.704258362171307770, -0.704222864102402870, -0.704187364272940820, -0.704151862683010330, +-0.704116359332700230, -0.704080854222099100, -0.704045347351295310, -0.704009838720378810, -0.703974328329437630, -0.703938816178560690, -0.703903302267836710, -0.703867786597354380, +-0.703832269167202760, -0.703796749977469660, -0.703761229028245340, -0.703725706319618060, -0.703690181851676420, -0.703654655624509350, -0.703619127638205670, -0.703583597892854180, +-0.703548066388543610, -0.703512533125362330, -0.703476998103400360, -0.703441461322745760, -0.703405922783487680, -0.703370382485714710, -0.703334840429515770, -0.703299296614979810, +-0.703263751042194850, -0.703228203711251170, -0.703192654622237120, -0.703157103775241320, -0.703121551170352800, -0.703085996807660370, -0.703050440687252860, -0.703014882809219420, +-0.702979323173648640, -0.702943761780629010, -0.702908198630250560, -0.702872633722601670, -0.702837067057771160, -0.702801498635847950, -0.702765928456920990, -0.702730356521078630, +-0.702694782828411020, -0.702659207379006330, -0.702623630172953820, -0.702588051210342070, -0.702552470491260240, -0.702516888015797260, -0.702481303784042050, -0.702445717796083560, +-0.702410130052010250, -0.702374540551912060, -0.702338949295877700, -0.702303356283995870, -0.702267761516355620, -0.702232164993046080, -0.702196566714155980, -0.702160966679773900, +-0.702125364889990110, -0.702089761344892870, -0.702054156044571220, -0.702018548989114090, -0.701982940178610630, -0.701947329613149870, -0.701911717292820760, -0.701876103217711770, +-0.701840487387913160, -0.701804869803513200, -0.701769250464601150, -0.701733629371266040, -0.701698006523596820, -0.701662381921682510, -0.701626755565611600, -0.701591127455474580, +-0.701555497591359600, -0.701519865973355920, -0.701484232601552680, -0.701448597476038720, -0.701412960596903280, -0.701377321964235520, -0.701341681578123710, -0.701306039438658440, +-0.701270395545928070, -0.701234749900021660, -0.701199102501028350, -0.701163453349037290, -0.701127802444137640, -0.701092149786417870, -0.701056495375968370, -0.701020839212877610, +-0.700985181297234640, -0.700949521629128820, -0.700913860208649210, -0.700878197035884940, -0.700842532110925060, -0.700806865433859060, -0.700771197004775080, -0.700735526823763830, +-0.700699854890913800, -0.700664181206314020, -0.700628505770053870, -0.700592828582222490, -0.700557149642908270, -0.700521468952201910, -0.700485786510191890, -0.700450102316967360, +-0.700414416372617590, -0.700378728677231830, -0.700343039230899130, -0.700307348033708870, -0.700271655085750290, -0.700235960387112000, -0.700200263937884260, -0.700164565738156000, +-0.700128865788016250, -0.700093164087554400, -0.700057460636859590, -0.700021755436020520, -0.699986048485127690, -0.699950339784269790, -0.699914629333535990, -0.699878917133015640, +-0.699843203182797910, -0.699807487482972280, -0.699771770033627890, -0.699736050834854020, -0.699700329886739470, -0.699664607189374730, -0.699628882742848400, -0.699593156547249960, +-0.699557428602668560, -0.699521698909193690, -0.699485967466914490, -0.699450234275919680, -0.699414499336299960, -0.699378762648144030, -0.699343024211541150, -0.699307284026580820, +-0.699271542093352180, -0.699235798411944610, -0.699200052982447700, -0.699164305804949930, -0.699128556879542120, -0.699092806206312870, -0.699057053785351550, -0.699021299616747640, +-0.698985543700590520, -0.698949786036969440, -0.698914026625973350, -0.698878265467692830, -0.698842502562216580, -0.698806737909634100, -0.698770971510034760, -0.698735203363508030, +-0.698699433470143290, -0.698663661830029930, -0.698627888443257520, -0.698592113309914660, -0.698556336430092180, -0.698520557803878780, -0.698484777431364060, -0.698448995312637380, +-0.698413211447788230, -0.698377425836905430, -0.698341638480079690, -0.698305849377399810, -0.698270058528955300, -0.698234265934835730, -0.698198471595130490, -0.698162675509928940, +-0.698126877679320800, -0.698091078103395550, -0.698055276782241880, -0.698019473715950630, -0.697983668904610720, -0.697947862348311630, -0.697912054047142850, -0.697876244001193970, +-0.697840432210553920, -0.697804618675313290, -0.697768803395561240, -0.697732986371387030, -0.697697167602880470, -0.697661347090130950, -0.697625524833228150, -0.697589700832261460, +-0.697553875087320470, -0.697518047598494230, -0.697482218365873540, -0.697446387389547230, -0.697410554669605000, -0.697374720206136330, -0.697338883999230940, -0.697303046048978300, +-0.697267206355467350, -0.697231364918789120, -0.697195521739032430, -0.697159676816286880, -0.697123830150642170, -0.697087981742188000, -0.697052131591013760, -0.697016279697209250, +-0.696980426060863300, -0.696944570682067050, -0.696908713560909330, -0.696872854697479730, -0.696836994091868060, -0.696801131744164030, -0.696765267654457010, -0.696729401822836270, +-0.696693534249392620, -0.696657664934215100, -0.696621793877393540, -0.696585921079017400, -0.696550046539176400, -0.696514170257960360, -0.696478292235458870, -0.696442412471761750, +-0.696406530966957820, -0.696370647721138330, -0.696334762734392100, -0.696298876006809060, -0.696262987538478820, -0.696227097329491060, -0.696191205379934950, -0.696155311689901410, +-0.696119416259479710, -0.696083519088759320, -0.696047620177830280, -0.696011719526782090, -0.695975817135704670, -0.695939913004687600, -0.695904007133820830, -0.695868099523193400, +-0.695832190172896330, -0.695796279083018780, -0.695760366253650560, -0.695724451684881510, -0.695688535376801200, -0.695652617329499010, -0.695616697543065770, -0.695580776017590940, +-0.695544852753164130, -0.695508927749875160, -0.695473001007813840, -0.695437072527070100, -0.695401142307733640, -0.695365210349894290, -0.695329276653641300, -0.695293341219065830, +-0.695257404046256910, -0.695221465135304470, -0.695185524486298450, -0.695149582099328530, -0.695113637974484780, -0.695077692111856220, -0.695041744511534000, -0.695005795173607500, +-0.694969844098166530, -0.694933891285300920, -0.694897936735100590, -0.694861980447655350, -0.694826022423055250, -0.694790062661389430, -0.694754101162749160, -0.694718137927223480, +-0.694682172954902530, -0.694646206245876140, -0.694610237800234340, -0.694574267618066840, -0.694538295699463020, -0.694502322044514120, -0.694466346653309420, -0.694430369525938950, +-0.694394390662492420, -0.694358410063059980, -0.694322427727731450, -0.694286443656596970, -0.694250457849745590, -0.694214470307268790, -0.694178481029255830, -0.694142490015796640, +-0.694106497266981260, -0.694070502782899610, -0.694034506563641740, -0.693998508609296900, -0.693962508919956480, -0.693926507495709720, -0.693890504336646790, -0.693854499442857490, +-0.693818492814431980, -0.693782484451460290, -0.693746474354032360, -0.693710462522238220, -0.693674448956167370, -0.693638433655910940, -0.693602416621558420, -0.693566397853199960, +-0.693530377350925380, -0.693494355114824930, -0.693458331144988000, -0.693422305441505740, -0.693386278004467840, -0.693350248833964230, -0.693314217930084960, -0.693278185292920180, +-0.693242150922559920, -0.693206114819094220, -0.693170076982613350, -0.693134037413206560, -0.693097996110965340, -0.693061953075979180, -0.693025908308338100, -0.692989861808132270, +-0.692953813575451720, -0.692917763610386710, -0.692881711913026610, -0.692845658483462800, -0.692809603321784980, -0.692773546428083090, -0.692737487802447370, -0.692701427444967880, +-0.692665365355734860, -0.692629301534838370, -0.692593235982367990, -0.692557168698415220, -0.692521099683069520, -0.692485028936421050, -0.692448956458560080, -0.692412882249576640, +-0.692376806309561000, -0.692340728638602740, -0.692304649236793250, -0.692268568104222100, -0.692232485240979580, -0.692196400647155930, -0.692160314322841200, -0.692124226268125640, +-0.692088136483099640, -0.692052044967852550, -0.692015951722475990, -0.691979856747059640, -0.691943760041693560, -0.691907661606468110, -0.691871561441473440, -0.691835459546800040, +-0.691799355922537160, -0.691763250568776630, -0.691727143485608040, -0.691691034673121430, -0.691654924131407390, -0.691618811860555960, -0.691582697860657510, -0.691546582131802310, +-0.691510464674080620, -0.691474345487582130, -0.691438224572398450, -0.691402101928619280, -0.691365977556334780, -0.691329851455635300, -0.691293723626611230, -0.691257594069352280, +-0.691221462783949910, -0.691185329770493850, -0.691149195029074570, -0.691113058559782220, -0.691076920362707290, -0.691040780437939930, -0.691004638785570720, -0.690968495405689940, +-0.690932350298387290, -0.690896203463754240, -0.690860054901880850, -0.690823904612857250, -0.690787752596773940, -0.690751598853721170, -0.690715443383789540, -0.690679286187068530, +-0.690643127263649960, -0.690606966613623640, -0.690570804237079840, -0.690534640134109030, -0.690498474304801710, -0.690462306749248130, -0.690426137467538780, -0.690389966459763470, +-0.690353793726013910, -0.690317619266379800, -0.690281443080951630, -0.690245265169819880, -0.690209085533075030, -0.690172904170807460, -0.690136721083106860, -0.690100536270065180, +-0.690064349731772220, -0.690028161468318360, -0.689991971479794080, -0.689955779766289860, -0.689919586327896180, -0.689883391164703540, -0.689847194276801750, -0.689810995664282610, +-0.689774795327236070, -0.689738593265752490, -0.689702389479922460, -0.689666183969836480, -0.689629976735584900, -0.689593767777257890, -0.689557557094947040, -0.689521344688742270, +-0.689485130558734170, -0.689448914705013240, -0.689412697127670060, -0.689376477826795010, -0.689340256802478900, -0.689304034054812110, -0.689267809583884670, -0.689231583389788180, +-0.689195355472612900, -0.689159125832449090, -0.689122894469387570, -0.689086661383518710, -0.689050426574932650, -0.689014190043721110, -0.688977951789974120, -0.688941711813782280, +-0.688905470115236060, -0.688869226694426300, -0.688832981551443350, -0.688796734686378030, -0.688760486099320830, -0.688724235790361790, -0.688687983759592840, -0.688651730007103890, +-0.688615474532985660, -0.688579217337328630, -0.688542958420223620, -0.688506697781761320, -0.688470435422031460, -0.688434171341126280, -0.688397905539135600, -0.688361638016150130, +-0.688325368772260690, -0.688289097807557760, -0.688252825122132040, -0.688216550716074350, -0.688180274589474510, -0.688143996742424770, -0.688107717175014950, -0.688071435887335880, +-0.688035152879478140, -0.687998868151532660, -0.687962581703589930, -0.687926293535740090, -0.687890003648075180, -0.687853712040685240, -0.687817418713660980, -0.687781123667093320, +-0.687744826901072750, -0.687708528415690080, -0.687672228211036130, -0.687635926287200940, -0.687599622644276650, -0.687563317282353200, -0.687527010201521630, -0.687490701401872410, +-0.687454390883496470, -0.687418078646484520, -0.687381764690926710, -0.687345449016915190, -0.687309131624539990, -0.687272812513892050, -0.687236491685061960, -0.687200169138140750, +-0.687163844873219020, -0.687127518890387810, -0.687091191189737720, -0.687054861771358990, -0.687018530635343680, -0.686982197781782160, -0.686945863210765120, -0.686909526922383500, +-0.686873188916727880, -0.686836849193888770, -0.686800507753958180, -0.686764164597026380, -0.686727819723184090, -0.686691473132522210, -0.686655124825131690, -0.686618774801103340, +-0.686582423060528080, -0.686546069603496730, -0.686509714430099560, -0.686473357540428820, -0.686436998934574660, -0.686400638612628010, -0.686364276574679690, -0.686327912820820730, +-0.686291547351141950, -0.686255180165733720, -0.686218811264688200, -0.686182440648095640, -0.686146068316046960, -0.686109694268633000, -0.686073318505944880, -0.686036941028073550, +-0.686000561835109820, -0.685964180927144060, -0.685927798304268420, -0.685891413966573270, -0.685855027914149650, -0.685818640147088490, -0.685782250665480710, -0.685745859469417240, +-0.685709466558988570, -0.685673071934286840, -0.685636675595402420, -0.685600277542426250, -0.685563877775449470, -0.685527476294562900, -0.685491073099857800, -0.685454668191424870, +-0.685418261569354700, -0.685381853233739570, -0.685345443184669720, -0.685309031422236310, -0.685272617946530270, -0.685236202757642740, -0.685199785855664660, -0.685163367240686490, +-0.685126946912800520, -0.685090524872097210, -0.685054101118667600, -0.685017675652602740, -0.684981248473993660, -0.684944819582931410, -0.684908388979507230, -0.684871956663812060, +-0.684835522635936280, -0.684799086895972350, -0.684762649444010770, -0.684726210280142470, -0.684689769404458690, -0.684653326817050490, -0.684616882518008340, -0.684580436507424730, +-0.684543988785389910, -0.684507539351995040, -0.684471088207331490, -0.684434635351490070, -0.684398180784562160, -0.684361724506638790, -0.684325266517811110, -0.684288806818169610, +-0.684252345407806770, -0.684215882286812960, -0.684179417455279550, -0.684142950913297580, -0.684106482660958190, -0.684070012698352550, -0.684033541025571350, -0.683997067642706850, +-0.683960592549849760, -0.683924115747091220, -0.683887637234522280, -0.683851157012234310, -0.683814675080318460, -0.683778191438865870, -0.683741706087967140, -0.683705219027714860, +-0.683668730258199410, -0.683632239779512260, -0.683595747591744460, -0.683559253694987380, -0.683522758089332050, -0.683486260774869180, -0.683449761751691360, -0.683413261019889200, +-0.683376758579553820, -0.683340254430776510, -0.683303748573648620, -0.683267241008261310, -0.683230731734705830, -0.683194220753073010, -0.683157708063455220, -0.683121193665943150, +-0.683084677560628180, -0.683048159747601470, -0.683011640226954380, -0.682975118998778160, -0.682938596063163430, -0.682902071420202980, -0.682865545069987200, -0.682829017012607680, +-0.682792487248155670, -0.682755955776722320, -0.682719422598399130, -0.682682887713277340, -0.682646351121448450, -0.682609812823002930, -0.682573272818033480, -0.682536731106630930, +-0.682500187688886540, -0.682463642564891670, -0.682427095734737700, -0.682390547198515440, -0.682353996956317270, -0.682317445008234210, -0.682280891354357540, -0.682244335994778630, +-0.682207778929588950, -0.682171220158879770, -0.682134659682742450, -0.682098097501268600, -0.682061533614548800, -0.682024968022675870, -0.681988400725740520, -0.681951831723834110, +-0.681915261017048140, -0.681878688605473960, -0.681842114489203180, -0.681805538668326380, -0.681768961142936390, -0.681732381913124020, -0.681695800978980750, -0.681659218340597840, +-0.681622633998067000, -0.681586047951479590, -0.681549460200926990, -0.681512870746500130, -0.681476279588291710, -0.681439686726392550, -0.681403092160894230, -0.681366495891888140, +-0.681329897919465970, -0.681293298243718870, -0.681256696864738000, -0.681220093782615940, -0.681183488997443630, -0.681146882509312660, -0.681110274318314500, -0.681073664424540650, +-0.681037052828082580, -0.681000439529031890, -0.680963824527479500, -0.680927207823518230, -0.680890589417238790, -0.680853969308732990, -0.680817347498092310, -0.680780723985408230, +-0.680744098770772240, -0.680707471854275490, -0.680670843236010570, -0.680634212916068740, -0.680597580894541140, -0.680560947171519710, -0.680524311747095930, -0.680487674621361390, +-0.680451035794407580, -0.680414395266326300, -0.680377753037208270, -0.680341109107146510, -0.680304463476232080, -0.680267816144556340, -0.680231167112211210, -0.680194516379288070, +-0.680157863945878070, -0.680121209812073910, -0.680084553977966850, -0.680047896443648380, -0.680011237209210200, -0.679974576274743890, -0.679937913640341170, -0.679901249306093640, +-0.679864583272092980, -0.679827915538430140, -0.679791246105198250, -0.679754574972488260, -0.679717902140391850, -0.679681227609000630, -0.679644551378406400, -0.679607873448700110, +-0.679571193819974660, -0.679534512492321440, -0.679497829465831820, -0.679461144740597600, -0.679424458316710610, -0.679387770194262440, -0.679351080373344800, -0.679314388854049490, +-0.679277695636467560, -0.679241000720692050, -0.679204304106813980, -0.679167605794925300, -0.679130905785117480, -0.679094204077482440, -0.679057500672111790, -0.679020795569096890, +-0.678984088768530560, -0.678947380270504050, -0.678910670075109080, -0.678873958182437450, -0.678837244592580880, -0.678800529305631170, -0.678763812321680260, -0.678727093640819070, +-0.678690373263140740, -0.678653651188736660, -0.678616927417698300, -0.678580201950117700, -0.678543474786086560, -0.678506745925696710, -0.678470015369039390, -0.678433283116207650, +-0.678396549167292750, -0.678359813522386500, -0.678323076181580610, -0.678286337144967110, -0.678249596412637710, -0.678212853984684340, -0.678176109861198920, -0.678139364042272490, +-0.678102616527998300, -0.678065867318467630, -0.678029116413772170, -0.677992363814004070, -0.677955609519254930, -0.677918853529616230, -0.677882095845181000, -0.677845336466040500, +-0.677808575392286670, -0.677771812624011430, -0.677735048161306590, -0.677698282004264190, -0.677661514152976040, -0.677624744607534190, -0.677587973368029780, -0.677551200434556080, +-0.677514425807204330, -0.677477649486066590, -0.677440871471234770, -0.677404091762800700, -0.677367310360855730, -0.677330527265493140, -0.677293742476804290, -0.677256955994881120, +-0.677220167819815420, -0.677183377951699360, -0.677146586390624860, -0.677109793136683960, -0.677072998189968470, -0.677036201550569870, -0.676999403218581430, -0.676962603194094510, +-0.676925801477201050, -0.676888998067993080, -0.676852192966562630, -0.676815386173001740, -0.676778577687401680, -0.676741767509855820, -0.676704955640455630, -0.676668142079292930, +-0.676631326826459880, -0.676594509882048610, -0.676557691246150950, -0.676520870918859150, -0.676484048900264480, -0.676447225190460410, -0.676410399789538210, -0.676373572697590020, +-0.676336743914707880, -0.676299913440983950, -0.676263081276510250, -0.676226247421378050, -0.676189411875681050, -0.676152574639510400, -0.676115735712958350, -0.676078895096116960, +-0.676042052789078360, -0.676005208791934600, -0.675968363104777810, -0.675931515727700160, -0.675894666660793010, -0.675857815904149840, -0.675820963457862130, -0.675784109322022040, +-0.675747253496721710, -0.675710395982053290, -0.675673536778108150, -0.675636675884979780, -0.675599813302759760, -0.675562949031540240, -0.675526083071413370, -0.675489215422471200, +-0.675452346084806090, -0.675415475058509960, -0.675378602343675300, -0.675341727940393380, -0.675304851848757880, -0.675267974068860190, -0.675231094600792560, -0.675194213444647250, +-0.675157330600516410, -0.675120446068491530, -0.675083559848666190, -0.675046671941131990, -0.675009782345981080, -0.674972891063305820, -0.674935998093198150, -0.674899103435750660, +-0.674862207091055270, -0.674825309059204460, -0.674788409340289720, -0.674751507934404530, -0.674714604841640590, -0.674677700062090270, -0.674640793595845500, -0.674603885442998870, +-0.674566975603642540, -0.674530064077868090, -0.674493150865769110, -0.674456235967437310, -0.674419319382964840, -0.674382401112444070, -0.674345481155967370, -0.674308559513626890, +-0.674271636185515110, -0.674234711171723510, -0.674197784472345800, -0.674160856087473670, -0.674123926017199280, -0.674086994261615220, -0.674050060820813530, -0.674013125694886810, +-0.673976188883926630, -0.673939250388026600, -0.673902310207278420, -0.673865368341774460, -0.673828424791607090, -0.673791479556868690, -0.673754532637651500, -0.673717584034048130, +-0.673680633746150730, -0.673643681774050980, -0.673606728117842830, -0.673569772777617870, -0.673532815753468350, -0.673495857045486870, -0.673458896653765680, -0.673421934578396720, +-0.673384970819473460, -0.673348005377087830, -0.673311038251332210, -0.673274069442298950, -0.673237098950080550, -0.673200126774769370, -0.673163152916457900, -0.673126177375238500, +-0.673089200151202990, -0.673052221244445190, -0.673015240655056910, -0.672978258383130410, -0.672941274428758280, -0.672904288792033010, -0.672867301473046410, -0.672830312471892070, +-0.672793321788662020, -0.672756329423448650, -0.672719335376344540, -0.672682339647441950, -0.672645342236833590, -0.672608343144611930, -0.672571342370869350, -0.672534339915697780, +-0.672497335779191020, -0.672460329961440890, -0.672423322462539890, -0.672386313282580690, -0.672349302421655580, -0.672312289879857250, -0.672275275657277630, -0.672238259754010410, +-0.672201242170147540, -0.672164222905781590, -0.672127201961005170, -0.672090179335910640, -0.672053155030590600, -0.672016129045137740, -0.671979101379643890, -0.671942072034202980, +-0.671905041008906910, -0.671868008303848190, -0.671830973919119500, -0.671793937854813340, -0.671756900111022290, -0.671719860687838400, -0.671682819585355470, -0.671645776803665550, +-0.671608732342861110, -0.671571686203034870, -0.671534638384279400, -0.671497588886687420, -0.671460537710351410, -0.671423484855363300, -0.671386430321817330, -0.671349374109805110, +-0.671312316219419560, -0.671275256650753160, -0.671238195403898620, -0.671201132478948640, -0.671164067875995140, -0.671127001595132170, -0.671089933636451640, -0.671052864000046380, +-0.671015792686008860, -0.670978719694431900, -0.670941645025408100, -0.670904568679030140, -0.670867490655390860, -0.670830410954582180, -0.670793329576698130, -0.670756246521830750, +-0.670719161790072740, -0.670682075381516810, -0.670644987296255660, -0.670607897534381440, -0.670570806095988180, -0.670533712981167820, -0.670496618190013270, -0.670459521722617140, +-0.670422423579072110, -0.670385323759471130, -0.670348222263906780, -0.670311119092471990, -0.670274014245258560, -0.670236907722360890, -0.670199799523870880, -0.670162689649881460, +-0.670125578100485230, -0.670088464875775110, -0.670051349975843810, -0.670014233400783480, -0.669977115150688140, -0.669939995225650180, -0.669902873625762060, -0.669865750351116840, +-0.669828625401807320, -0.669791498777926100, -0.669754370479566210, -0.669717240506819690, -0.669680108859780800, -0.669642975538541570, -0.669605840543194940, -0.669568703873833710, +-0.669531565530550710, -0.669494425513438740, -0.669457283822590070, -0.669420140458098940, -0.669382995420057410, -0.669345848708558290, -0.669308700323694720, -0.669271550265559290, +-0.669234398534245050, -0.669197245129844690, -0.669160090052450700, -0.669122933302157110, -0.669085774879056070, -0.669048614783240740, -0.669011453014803800, -0.668974289573838200, +-0.668937124460436960, -0.668899957674692240, -0.668862789216698280, -0.668825619086547360, -0.668788447284332290, -0.668751273810146210, -0.668714098664081820, -0.668676921846232290, +-0.668639743356690520, -0.668602563195549230, -0.668565381362901000, -0.668528197858839990, -0.668491012683458340, -0.668453825836849310, -0.668416637319105610, -0.668379447130320380, +-0.668342255270585770, -0.668305061739996380, -0.668267866538644120, -0.668230669666622370, -0.668193471124023830, -0.668156270910941650, -0.668119069027468760, -0.668081865473698300, +-0.668044660249723090, -0.668007453355635490, -0.667970244791530110, -0.667933034557498970, -0.667895822653635340, -0.667858609080032140, -0.667821393836782300, -0.667784176923979070, +-0.667746958341714820, -0.667709738090083720, -0.667672516169178330, -0.667635292579091600, -0.667598067319916670, -0.667560840391746570, -0.667523611794674340, -0.667486381528793030, +-0.667449149594195210, -0.667411915990975160, -0.667374680719225340, -0.667337443779038700, -0.667300205170508590, -0.667262964893727940, -0.667225722948789790, -0.667188479335786730, +-0.667151234054813140, -0.667113987105961480, -0.667076738489324810, -0.667039488204996370, -0.667002236253069090, -0.666964982633636350, -0.666927727346791070, -0.666890470392625830, +-0.666853211771235130, -0.666815951482711330, -0.666778689527147690, -0.666741425904637250, -0.666704160615273270, -0.666666893659149000, -0.666629625036356700, -0.666592354746991080, +-0.666555082791144500, -0.666517809168910350, -0.666480533880381530, -0.666443256925651430, -0.666405978304813180, -0.666368698017960060, -0.666331416065185090, -0.666294132446580980, +-0.666256847162242210, -0.666219560212261250, -0.666182271596731490, -0.666144981315745950, -0.666107689369398010, -0.666070395757780150, -0.666033100480986960, -0.665995803539111140, +-0.665958504932245620, -0.665921204660483990, -0.665883902723919290, -0.665846599122644880, -0.665809293856753910, -0.665771986926339760, -0.665734678331494910, -0.665697368072314060, +-0.665660056148889790, -0.665622742561315480, -0.665585427309684170, -0.665548110394089340, -0.665510791814624250, -0.665473471571381480, -0.665436149664455740, -0.665398826093939630, +-0.665361500859926400, -0.665324173962509420, -0.665286845401782070, -0.665249515177837590, -0.665212183290769250, -0.665174849740669870, -0.665137514527634030, -0.665100177651754330, +-0.665062839113124250, -0.665025498911837040, -0.664988157047986080, -0.664950813521664740, -0.664913468332965720, -0.664876121481983720, -0.664838772968811330, -0.664801422793542150, +-0.664764070956269220, -0.664726717457086220, -0.664689362296086440, -0.664652005473363230, -0.664614646989009410, -0.664577286843119560, -0.664539925035786520, -0.664502561567103630, +-0.664465196437164400, -0.664427829646062060, -0.664390461193890220, -0.664353091080741590, -0.664315719306710850, -0.664278345871890830, -0.664240970776375010, -0.664203594020256750, +-0.664166215603629430, -0.664128835526586640, -0.664091453789221630, -0.664054070391628120, -0.664016685333898790, -0.663979298616128370, -0.663941910238409650, -0.663904520200836230, +-0.663867128503501380, -0.663829735146498790, -0.663792340129921280, -0.663754943453863430, -0.663717545118418410, -0.663680145123679340, -0.663642743469740060, -0.663605340156693810, +-0.663567935184634310, -0.663530528553654910, -0.663493120263849210, -0.663455710315309920, -0.663418298708132180, -0.663380885442408590, -0.663343470518232840, -0.663306053935698410, +-0.663268635694898910, -0.663231215795927700, -0.663193794238877920, -0.663156371023844170, -0.663118946150919600, -0.663081519620197680, -0.663044091431771900, -0.663006661585735850, +-0.662969230082183230, -0.662931796921207520, -0.662894362102901650, -0.662856925627360540, -0.662819487494677120, -0.662782047704944980, -0.662744606258257600, -0.662707163154708900, +-0.662669718394392150, -0.662632271977400490, -0.662594823903828840, -0.662557374173770140, -0.662519922787317970, -0.662482469744565930, -0.662445015045607820, -0.662407558690537130, +-0.662370100679447570, -0.662332641012432060, -0.662295179689585620, -0.662257716711001310, -0.662220252076772600, -0.662182785786993300, -0.662145317841757010, -0.662107848241157430, +-0.662070376985287590, -0.662032904074242530, -0.661995429508115070, -0.661957953286999130, -0.661920475410988310, -0.661882995880176290, -0.661845514694656800, -0.661808031854523530, +-0.661770547359870060, -0.661733061210789670, -0.661695573407377280, -0.661658083949725920, -0.661620592837929400, -0.661583100072081320, -0.661545605652275600, -0.661508109578605170, +-0.661470611851165070, -0.661433112470048550, -0.661395611435349080, -0.661358108747160720, -0.661320604405577050, -0.661283098410691880, -0.661245590762598920, -0.661208081461391980, +-0.661170570507164210, -0.661133057900010760, -0.661095543640024540, -0.661058027727299490, -0.661020510161929420, -0.660982990944008030, -0.660945470073629140, -0.660907947550885890, +-0.660870423375873540, -0.660832897548685020, -0.660795370069414360, -0.660757840938155260, -0.660720310155001430, -0.660682777720047020, -0.660645243633385500, -0.660607707895110360, +-0.660570170505316520, -0.660532631464097240, -0.660495090771546330, -0.660457548427757830, -0.660420004432825450, -0.660382458786842990, -0.660344911489903710, -0.660307362542102870, +-0.660269811943533510, -0.660232259694289780, -0.660194705794465260, -0.660157150244154110, -0.660119593043450030, -0.660082034192446930, -0.660044473691238090, -0.660006911539918750, +-0.659969347738582180, -0.659931782287322190, -0.659894215186232700, -0.659856646435407760, -0.659819076034941170, -0.659781503984926190, -0.659743930285458080, -0.659706354936630210, +-0.659668777938536510, -0.659631199291270790, -0.659593618994927080, -0.659556037049599310, -0.659518453455381510, -0.659480868212367510, -0.659443281320650660, -0.659405692780326350, +-0.659368102591487810, -0.659330510754228990, -0.659292917268643810, -0.659255322134826400, -0.659217725352870040, -0.659180126922870090, -0.659142526844919700, -0.659104925119113010, +-0.659067321745544050, -0.659029716724306770, -0.658992110055495180, -0.658954501739203340, -0.658916891775525260, -0.658879280164554330, -0.658841666906385790, -0.658804052001113140, +-0.658766435448830290, -0.658728817249631390, -0.658691197403610370, -0.658653575910861490, -0.658615952771477890, -0.658578327985555160, -0.658540701553186560, -0.658503073474466240, +-0.658465443749488230, -0.658427812378346580, -0.658390179361135420, -0.658352544697948790, -0.658314908388880180, -0.658277270434024950, -0.658239630833476470, -0.658201989587329010, +-0.658164346695676580, -0.658126702158613240, -0.658089055976233130, -0.658051408148629720, -0.658013758675898510, -0.657976107558132850, -0.657938454795426900, -0.657900800387874910, +-0.657863144335570800, -0.657825486638608960, -0.657787827297083290, -0.657750166311087400, -0.657712503680716880, -0.657674839406064970, -0.657637173487225950, -0.657599505924294060, +-0.657561836717363460, -0.657524165866528180, -0.657486493371881810, -0.657448819233519940, -0.657411143451535950, -0.657373466026024200, -0.657335786957078730, -0.657298106244793790, +-0.657260423889263530, -0.657222739890582330, -0.657185054248844210, -0.657147366964142780, -0.657109678036573610, -0.657071987466230190, -0.657034295253206890, -0.656996601397597860, +-0.656958905899497240, -0.656921208758998730, -0.656883509976197820, -0.656845809551188210, -0.656808107484064040, -0.656770403774919690, -0.656732698423849180, -0.656694991430947010, +-0.656657282796307420, -0.656619572520024560, -0.656581860602192040, -0.656544147042905650, -0.656506431842258760, -0.656468715000345870, -0.656430996517261220, -0.656393276393099080, +-0.656355554627953030, -0.656317831221918780, -0.656280106175089920, -0.656242379487560920, -0.656204651159425830, -0.656166921190779130, -0.656129189581715180, -0.656091456332328240, +-0.656053721442712680, -0.656015984912962090, -0.655978246743172290, -0.655940506933436750, -0.655902765483850070, -0.655865022394506390, -0.655827277665500200, -0.655789531296925850, +-0.655751783288876950, -0.655714033641449310, -0.655676282354736520, -0.655638529428833050, -0.655600774863833280, -0.655563018659831460, -0.655525260816922200, -0.655487501335199840, +-0.655449740214757990, -0.655411977455692460, -0.655374213058096950, -0.655336447022065950, -0.655298679347693810, -0.655260910035075030, -0.655223139084303850, -0.655185366495474320, +-0.655147592268681910, -0.655109816404020550, -0.655072038901584720, -0.655034259761468670, -0.654996478983767120, -0.654958696568574310, -0.654920912515984720, -0.654883126826092840, +-0.654845339498992480, -0.654807550534779460, -0.654769759933547580, -0.654731967695391330, -0.654694173820405180, -0.654656378308683510, -0.654618581160320230, -0.654580782375411170, +-0.654542981954050250, -0.654505179896331720, -0.654467376202350400, -0.654429570872200550, -0.654391763905976750, -0.654353955303773600, -0.654316145065685580, -0.654278333191806390, +-0.654240519682232180, -0.654202704537056650, -0.654164887756374270, -0.654127069340279750, -0.654089249288867580, -0.654051427602231560, -0.654013604280467620, -0.653975779323669790, +-0.653937952731932450, -0.653900124505350180, -0.653862294644017570, -0.653824463148029330, -0.653786630017479830, -0.653748795252463880, -0.653710958853075170, -0.653673120819409760, +-0.653635281151561550, -0.653597439849625150, -0.653559596913695140, -0.653521752343866110, -0.653483906140232770, -0.653446058302888930, -0.653408208831930630, -0.653370357727451890, +-0.653332504989547090, -0.653294650618311160, -0.653256794613838570, -0.653218936976224020, -0.653181077705562110, -0.653143216801946870, -0.653105354265474110, -0.653067490096238100, +-0.653029624294333310, -0.652991756859854560, -0.652953887792896310, -0.652916017093553290, -0.652878144761919630, -0.652840270798091370, -0.652802395202162320, -0.652764517974227300, +-0.652726639114381000, -0.652688758622718130, -0.652650876499333290, -0.652612992744321390, -0.652575107357776910, -0.652537220339794000, -0.652499331690468700, -0.652461441409895040, +-0.652423549498167830, -0.652385655955381780, -0.652347760781631480, -0.652309863977011180, -0.652271965541616930, -0.652234065475542750, -0.652196163778883340, -0.652158260451733530, +-0.652120355494188120, -0.652082448906341820, -0.652044540688289320, -0.652006630840125560, -0.651968719361944560, -0.651930806253842370, -0.651892891515913230, -0.651854975148251750, +-0.651817057150952950, -0.651779137524111430, -0.651741216267821440, -0.651703293382179030, -0.651665368867278440, -0.651627442723214380, -0.651589514950081770, -0.651551585547975320, +-0.651513654516989950, -0.651475721857220470, -0.651437787568761580, -0.651399851651707660, -0.651361914106154740, -0.651323974932197070, -0.651286034129929360, -0.651248091699446640, +-0.651210147640843730, -0.651172201954215320, -0.651134254639655910, -0.651096305697261400, -0.651058355127126180, -0.651020402929345040, -0.650982449104012930, -0.650944493651224640, +-0.650906536571075220, -0.650868577863659370, -0.650830617529071450, -0.650792655567407620, -0.650754691978762120, -0.650716726763230000, -0.650678759920905960, -0.650640791451885030, +-0.650602821356262240, -0.650564849634131640, -0.650526876285589580, -0.650488901310730340, -0.650450924709648830, -0.650412946482439970, -0.650374966629198800, -0.650336985150020250, +-0.650299002044999240, -0.650261017314230030, -0.650223030957808870, -0.650185042975830240, -0.650147053368388850, -0.650109062135579950, -0.650071069277498470, -0.650033074794239220, +-0.649995078685896570, -0.649957080952566990, -0.649919081594344640, -0.649881080611324550, -0.649843078003601860, -0.649805073771271390, -0.649767067914428290, -0.649729060433167470, +-0.649691051327584090, -0.649653040597772400, -0.649615028243828660, -0.649577014265847460, -0.649538998663923730, -0.649500981438152380, -0.649462962588628680, -0.649424942115446880, +-0.649386920018703460, -0.649348896298492680, -0.649310870954909580, -0.649272843988049410, -0.649234815398007200, -0.649196785184877780, -0.649158753348756500, -0.649120719889738300, +-0.649082684807917640, -0.649044648103390910, -0.649006609776252570, -0.648968569826597790, -0.648930528254521470, -0.648892485060118980, -0.648854440243485150, -0.648816393804714560, +-0.648778345743903690, -0.648740296061146910, -0.648702244756539370, -0.648664191830176320, -0.648626137282152790, -0.648588081112563830, -0.648550023321504690, -0.648511963909069840, +-0.648473902875355780, -0.648435840220456860, -0.648397775944468460, -0.648359710047485600, -0.648321642529603450, -0.648283573390917130, -0.648245502631521250, -0.648207430251512280, +-0.648169356250984710, -0.648131280630033780, -0.648093203388754760, -0.648055124527242570, -0.648017044045592570, -0.647978961943900030, -0.647940878222259430, -0.647902792880767240, +-0.647864705919518170, -0.647826617338607250, -0.647788527138129840, -0.647750435318180990, -0.647712341878856180, -0.647674246820249770, -0.647636150142458460, -0.647598051845576840, +-0.647559951929699950, -0.647521850394923270, -0.647483747241341940, -0.647445642469051230, -0.647407536078146490, -0.647369428068722770, -0.647331318440874880, -0.647293207194699400, +-0.647255094330290830, -0.647216979847744620, -0.647178863747155940, -0.647140746028620040, -0.647102626692231620, -0.647064505738087270, -0.647026383166281800, -0.646988258976910260, +-0.646950133170068110, -0.646912005745850620, -0.646873876704353030, -0.646835746045670850, -0.646797613769899300, -0.646759479877133000, -0.646721344367468640, -0.646683207241001030, +-0.646645068497825330, -0.646606928138037000, -0.646568786161731300, -0.646530642569003610, -0.646492497359948740, -0.646454350534663270, -0.646416202093241910, -0.646378052035780030, +-0.646339900362372990, -0.646301747073116270, -0.646263592168105140, -0.646225435647435060, -0.646187277511200640, -0.646149117759498790, -0.646110956392424110, -0.646072793410072070, +-0.646034628812538040, -0.645996462599917390, -0.645958294772305600, -0.645920125329797370, -0.645881954272489620, -0.645843781600476840, -0.645805607313854720, -0.645767431412718530, +-0.645729253897163740, -0.645691074767285930, -0.645652894023180270, -0.645614711664941780, -0.645576527692667160, -0.645538342106451330, -0.645500154906389570, -0.645461966092577330, +-0.645423775665110330, -0.645385583624083830, -0.645347389969592620, -0.645309194701733650, -0.645270997820601710, -0.645232799326292290, -0.645194599218900880, -0.645156397498523050, +-0.645118194165254070, -0.645079989219189630, -0.645041782660425330, -0.645003574489055760, -0.644965364705178070, -0.644927153308886840, -0.644888940300277770, -0.644850725679446460, +-0.644812509446488160, -0.644774291601498020, -0.644736072144572740, -0.644697851075807350, -0.644659628395297330, -0.644621404103138280, -0.644583178199425680, -0.644544950684255100, +-0.644506721557722150, -0.644468490819922410, -0.644430258470950810, -0.644392024510904160, -0.644353788939877490, -0.644315551757966400, -0.644277312965266360, -0.644239072561873070, +-0.644200830547882020, -0.644162586923388350, -0.644124341688488760, -0.644086094843278390, -0.644047846387852730, -0.644009596322307590, -0.643971344646738330, -0.643933091361240770, +-0.643894836465910390, -0.643856579960842330, -0.643818321846133520, -0.643780062121878880, -0.643741800788174000, -0.643703537845114690, -0.643665273292796550, -0.643627007131315270, +-0.643588739360765660, -0.643550469981244990, -0.643512198992848060, -0.643473926395670690, -0.643435652189808470, -0.643397376375357210, -0.643359098952412390, -0.643320819921069930, +-0.643282539281424650, -0.643244257033573800, -0.643205973177612190, -0.643167687713635750, -0.643129400641740070, -0.643091111962020840, -0.643052821674573780, -0.643014529779494140, +-0.642976236276878720, -0.642937941166822790, -0.642899644449421940, -0.642861346124772080, -0.642823046192968820, -0.642784744654107840, -0.642746441508285080, -0.642708136755596240, +-0.642669830396136450, -0.642631522430002660, -0.642593212857289990, -0.642554901678094370, -0.642516588892511510, -0.642478274500637210, -0.642439958502566520, -0.642401640898396580, +-0.642363321688222520, -0.642325000872140170, -0.642286678450245450, -0.642248354422633840, -0.642210028789401480, -0.642171701550643960, -0.642133372706457210, -0.642095042256936370, +-0.642056710202178580, -0.642018376542279110, -0.641980041277333550, -0.641941704407437920, -0.641903365932688150, -0.641865025853179840, -0.641826684169008340, -0.641788340880270810, +-0.641749995987062390, -0.641711649489479010, -0.641673301387616470, -0.641634951681570700, -0.641596600371437620, -0.641558247457312940, -0.641519892939292010, -0.641481536817472000, +-0.641443179091948150, -0.641404819762816380, -0.641366458830172630, -0.641328096294112580, -0.641289732154732390, -0.641251366412127210, -0.641212999066394170, -0.641174630117628760, +-0.641136259565926680, -0.641097887411384070, -0.641059513654096640, -0.641021138294160410, -0.640982761331671420, -0.640944382766724830, -0.640906002599417880, -0.640867620829846050, +-0.640829237458105050, -0.640790852484291020, -0.640752465908499880, -0.640714077730827560, -0.640675687951369310, -0.640637296570222610, -0.640598903587482620, -0.640560509003245350, +-0.640522112817606850, -0.640483715030663040, -0.640445315642509950, -0.640406914653243510, -0.640368512062959860, -0.640330107871754260, -0.640291702079724080, -0.640253294686964570, +-0.640214885693571880, -0.640176475099641930, -0.640138062905270870, -0.640099649110553950, -0.640061233715588540, -0.640022816720470010, -0.639984398125294510, -0.639945977930157950, +-0.639907556135156600, -0.639869132740386260, -0.639830707745943080, -0.639792281151923100, -0.639753852958421800, -0.639715423165536530, -0.639676991773362680, -0.639638558781996380, +-0.639600124191533670, -0.639561688002070580, -0.639523250213703380, -0.639484810826527310, -0.639446369840639960, -0.639407927256136600, -0.639369483073113480, -0.639331037291666630, +-0.639292589911892200, -0.639254140933886330, -0.639215690357745060, -0.639177238183563870, -0.639138784411440340, -0.639100329041469740, -0.639061872073748430, -0.639023413508372330, +-0.638984953345437810, -0.638946491585040800, -0.638908028227276990, -0.638869563272243650, -0.638831096720036570, -0.638792628570751590, -0.638754158824485160, -0.638715687481333230, +-0.638677214541392150, -0.638638740004758070, -0.638600263871526350, -0.638561786141794710, -0.638523306815658610, -0.638484825893214200, -0.638446343374557860, -0.638407859259785490, +-0.638369373548993590, -0.638330886242277520, -0.638292397339734970, -0.638253906841461330, -0.638215414747552940, -0.638176921058106080, -0.638138425773216890, -0.638099928892981620, +-0.638061430417496630, -0.638022930346857970, -0.637984428681161340, -0.637945925420504210, -0.637907420564982400, -0.637868914114691930, -0.637830406069729290, -0.637791896430190520, +-0.637753385196171420, -0.637714872367769470, -0.637676357945080370, -0.637637841928200390, -0.637599324317225770, -0.637560805112252880, -0.637522284313377980, -0.637483761920697330, +-0.637445237934307300, -0.637406712354303570, -0.637368185180783640, -0.637329656413843200, -0.637291126053578740, -0.637252594100086390, -0.637214060553462640, -0.637175525413803620, +-0.637136988681205160, -0.637098450355764960, -0.637059910437578590, -0.637021368926742440, -0.636982825823352860, -0.636944281127506230, -0.636905734839298910, -0.636867186958827160, +-0.636828637486186900, -0.636790086421475610, -0.636751533764789210, -0.636712979516223960, -0.636674423675876230, -0.636635866243842390, -0.636597307220218900, -0.636558746605101480, +-0.636520184398587930, -0.636481620600773850, -0.636443055211755810, -0.636404488231630090, -0.636365919660493050, -0.636327349498441390, -0.636288777745571240, -0.636250204401978440, +-0.636211629467760890, -0.636173052943014180, -0.636134474827834920, -0.636095895122319450, -0.636057313826564160, -0.636018730940665740, -0.635980146464719680, -0.635941560398823990, +-0.635902972743074390, -0.635864383497567350, -0.635825792662399360, -0.635787200237666880, -0.635748606223466520, -0.635710010619894520, -0.635671413427047470, -0.635632814645021300, +-0.635594214273913720, -0.635555612313820630, -0.635517008764838410, -0.635478403627063760, -0.635439796900593050, -0.635401188585522190, -0.635362578681949120, -0.635323967189969530, +-0.635285354109680010, -0.635246739441177160, -0.635208123184557440, -0.635169505339917340, -0.635130885907353560, -0.635092264886962580, -0.635053642278840200, -0.635015018083084360, +-0.634976392299791080, -0.634937764929056740, -0.634899135970978020, -0.634860505425651530, -0.634821873293172970, -0.634783239573640470, -0.634744604267149850, -0.634705967373797700, +-0.634667328893680720, -0.634628688826895380, -0.634590047173538290, -0.634551403933706020, -0.634512759107495380, -0.634474112695002090, -0.634435464696324170, -0.634396815111557650, +-0.634358163940799020, -0.634319511184145090, -0.634280856841692330, -0.634242200913537340, -0.634203543399776250, -0.634164884300506990, -0.634126223615825490, -0.634087561345828440, +-0.634048897490612550, -0.634010232050274290, -0.633971565024910590, -0.633932896414617920, -0.633894226219492320, -0.633855554439631820, -0.633816881075132450, -0.633778206126090820, +-0.633739529592603820, -0.633700851474767850, -0.633662171772679810, -0.633623490486435630, -0.633584807616133450, -0.633546123161869310, -0.633507437123739690, -0.633468749501841620, +-0.633430060296271690, -0.633391369507126490, -0.633352677134502940, -0.633313983178497630, -0.633275287639206820, -0.633236590516728310, -0.633197891811158490, -0.633159191522593810, +-0.633120489651131210, -0.633081786196867390, -0.633043081159898380, -0.633004374540322320, -0.632965666338235370, -0.632926956553734320, -0.632888245186915780, -0.632849532237876660, +-0.632810817706713770, -0.632772101593523820, -0.632733383898403500, -0.632694664621449190, -0.632655943762758800, -0.632617221322428590, -0.632578497300555260, -0.632539771697235740, +-0.632501044512566830, -0.632462315746644580, -0.632423585399567220, -0.632384853471430920, -0.632346119962332480, -0.632307384872368820, -0.632268648201636530, -0.632229909950232760, +-0.632191170118254100, -0.632152428705797580, -0.632113685712959340, -0.632074941139837530, -0.632036194986528410, -0.631997447253128670, -0.631958697939735470, -0.631919947046445500, +-0.631881194573355560, -0.631842440520562040, -0.631803684888163080, -0.631764927676254920, -0.631726168884934380, -0.631687408514298500, -0.631648646564444080, -0.631609883035467940, +-0.631571117927467230, -0.631532351240537970, -0.631493582974778530, -0.631454813130285180, -0.631416041707154710, -0.631377268705484270, -0.631338494125370580, -0.631299717966910650, +-0.631260940230200740, -0.631222160915339110, -0.631183380022422140, -0.631144597551546730, -0.631105813502809810, -0.631067027876308310, -0.631028240672139250, -0.630989451890399680, +-0.630950661531186400, -0.630911869594595780, -0.630873076080726180, -0.630834280989673980, -0.630795484321535980, -0.630756686076409330, -0.630717886254390960, -0.630679084855577110, +-0.630640281880066270, -0.630601477327954680, -0.630562671199339510, -0.630523863494317660, -0.630485054212986060, -0.630446243355441860, -0.630407430921782090, -0.630368616912103660, +-0.630329801326503070, -0.630290984165078670, -0.630252165427926720, -0.630213345115144490, -0.630174523226828760, -0.630135699763076820, -0.630096874723984900, -0.630058048109651490, +-0.630019219920172960, -0.629980390155646440, -0.629941558816168870, -0.629902725901837380, -0.629863891412749120, -0.629825055349001130, -0.629786217710690540, -0.629747378497913730, +-0.629708537710769070, -0.629669695349353130, -0.629630851413762960, -0.629592005904095590, -0.629553158820448270, -0.629514310162918030, -0.629475459931601260, -0.629436608126596630, +-0.629397754748000420, -0.629358899795909870, -0.629320043270422010, -0.629281185171634120, -0.629242325499643210, -0.629203464254546540, -0.629164601436440480, -0.629125737045423630, +-0.629086871081592450, -0.629048003545044090, -0.629009134435875690, -0.628970263754184410, -0.628931391500067490, -0.628892517673621420, -0.628853642274944780, -0.628814765304134050, +-0.628775886761286370, -0.628737006646499010, -0.628698124959869100, -0.628659241701493790, -0.628620356871470550, -0.628581470469896320, -0.628542582496867670, -0.628503692952483320, +-0.628464801836839730, -0.628425909150034160, -0.628387014892163860, -0.628348119063325880, -0.628309221663617020, -0.628270322693135760, -0.628231422151978690, -0.628192520040243170, +-0.628153616358026250, -0.628114711105425270, -0.628075804282537510, -0.628036895889460320, -0.627997985926290860, -0.627959074393125700, -0.627920161290063560, -0.627881246617201020, +-0.627842330374635330, -0.627803412562463970, -0.627764493180783870, -0.627725572229691940, -0.627686649709286780, -0.627647725619664980, -0.627608799960923890, -0.627569872733160780, +-0.627530943936473020, -0.627492013570957850, -0.627453081636712760, -0.627414148133834780, -0.627375213062420830, -0.627336276422569620, -0.627297338214377610, -0.627258398437942290, +-0.627219457093361020, -0.627180514180731060, -0.627141569700149780, -0.627102623651713880, -0.627063676035522160, -0.627024726851671320, -0.626985776100258520, -0.626946823781381330, +-0.626907869895137140, -0.626868914441623290, -0.626829957420937060, -0.626790998833175240, -0.626752038678436650, -0.626713076956817990, -0.626674113668416630, -0.626635148813330050, +-0.626596182391655490, -0.626557214403490550, -0.626518244848931820, -0.626479273728078100, -0.626440301041026330, -0.626401326787873750, -0.626362350968717950, -0.626323373583656200, +-0.626284394632785960, -0.626245414116204820, -0.626206432034009390, -0.626167448386298560, -0.626128463173169170, -0.626089476394718570, -0.626050488051044350, -0.626011498142243770, +-0.625972506668414640, -0.625933513629653440, -0.625894519026059190, -0.625855522857728610, -0.625816525124759160, -0.625777525827248440, -0.625738524965294030, -0.625699522538993190, +-0.625660518548443510, -0.625621512993742580, -0.625582505874987200, -0.625543497192276200, -0.625504486945706590, -0.625465475135375650, -0.625426461761380950, -0.625387446823820190, +-0.625348430322790190, -0.625309412258389650, -0.625270392630715710, -0.625231371439865740, -0.625192348685937320, -0.625153324369028040, -0.625114298489235500, -0.625075271046657170, +-0.625036242041390630, -0.624997211473532820, -0.624958179343182650, -0.624919145650437050, -0.624880110395393600, -0.624841073578149890, -0.624802035198803510, -0.624762995257452050, +-0.624723953754192320, -0.624684910689123460, -0.624645866062342290, -0.624606819873946510, -0.624567772124033580, -0.624528722812701330, -0.624489671940047230, -0.624450619506168980, +-0.624411565511163390, -0.624372509955129720, -0.624333452838164660, -0.624294394160366030, -0.624255333921831410, -0.624216272122658400, -0.624177208762944800, -0.624138143842787430, +-0.624099077362285430, -0.624060009321535710, -0.624020939720635990, -0.623981868559683850, -0.623942795838777100, -0.623903721558013320, -0.623864645717490340, -0.623825568317304960, +-0.623786489357556320, -0.623747408838341570, -0.623708326759758180, -0.623669243121904080, -0.623630157924876750, -0.623591071168774100, -0.623551982853693070, -0.623512892979732780, +-0.623473801546990280, -0.623434708555563270, -0.623395614005549440, -0.623356517897046600, -0.623317420230152570, -0.623278321004964830, -0.623239220221581400, -0.623200117880099100, +-0.623161013980617300, -0.623121908523233010, -0.623082801508043850, -0.623043692935147720, -0.623004582804642330, -0.622965471116624810, -0.622926357871194320, -0.622887243068448000, +-0.622848126708483440, -0.622809008791398670, -0.622769889317291270, -0.622730768286259280, -0.622691645698400300, -0.622652521553812230, -0.622613395852592120, -0.622574268594839220, +-0.622535139780650670, -0.622496009410124280, -0.622456877483357870, -0.622417744000449250, -0.622378608961496220, -0.622339472366596040, -0.622300334215847850, -0.622261194509348800, +-0.622222053247196820, -0.622182910429489700, -0.622143766056325260, -0.622104620127801430, -0.622065472644016020, -0.622026323605066270, -0.621987173011051440, -0.621948020862068570, +-0.621908867158215810, -0.621869711899590730, -0.621830555086291480, -0.621791396718415770, -0.621752236796060840, -0.621713075319326070, -0.621673912288308710, -0.621634747703106450, +-0.621595581563817330, -0.621556413870539280, -0.621517244623370100, -0.621478073822407940, -0.621438901467749830, -0.621399727559495240, -0.621360552097741210, -0.621321375082585890, +-0.621282196514127080, -0.621243016392462820, -0.621203834717691030, -0.621164651489908960, -0.621125466709215980, -0.621086280375709230, -0.621047092489486860, -0.621007903050646680, +-0.620968712059286830, -0.620929519515505120, -0.620890325419399700, -0.620851129771068490, -0.620811932570608630, -0.620772733818119700, -0.620733533513698980, -0.620694331657444360, +-0.620655128249453900, -0.620615923289825620, -0.620576716778656890, -0.620537508716047070, -0.620498299102093420, -0.620459087936894080, -0.620419875220546980, -0.620380660953150250, +-0.620341445134801830, -0.620302227765599850, -0.620263008845642230, -0.620223788375026340, -0.620184566353851770, -0.620145342782215780, -0.620106117660216390, -0.620066890987951760, +-0.620027662765519790, -0.619988432993018760, -0.619949201670545900, -0.619909968798200820, -0.619870734376080760, -0.619831498404283860, -0.619792260882908290, -0.619753021812051940, +-0.619713781191813080, -0.619674539022289860, -0.619635295303579530, -0.619596050035781550, -0.619556803218993650, -0.619517554853313610, -0.619478304938839710, -0.619439053475670080, +-0.619399800463902750, -0.619360545903635210, -0.619321289794967030, -0.619282032137995710, -0.619242772932819260, -0.619203512179535840, -0.619164249878243700, -0.619124986029040870, +-0.619085720632025600, -0.619046453687295270, -0.619007185194949570, -0.618967915155085980, -0.618928643567802530, -0.618889370433197470, -0.618850095751368960, -0.618810819522415230, +-0.618771541746433780, -0.618732262423524080, -0.618692981553783830, -0.618653699137311160, -0.618614415174204120, -0.618575129664561070, -0.618535842608480270, -0.618496554006059850, +-0.618457263857397970, -0.618417972162592310, -0.618378678921742360, -0.618339384134945710, -0.618300087802300610, -0.618260789923905320, -0.618221490499858080, -0.618182189530256390, +-0.618142887015199930, -0.618103582954786180, -0.618064277349113620, -0.618024970198280290, -0.617985661502384430, -0.617946351261524530, -0.617907039475798730, -0.617867726145305380, +-0.617828411270141990, -0.617789094850408230, -0.617749776886201700, -0.617710457377620760, -0.617671136324763780, -0.617631813727728800, -0.617592489586614390, -0.617553163901518040, +-0.617513836672539450, -0.617474507899776310, -0.617435177583326890, -0.617395845723289540, -0.617356512319762520, -0.617317177372844190, -0.617277840882633040, -0.617238502849226540, +-0.617199163272724500, -0.617159822153224510, -0.617120479490824940, -0.617081135285624250, -0.617041789537720600, -0.617002442247212570, -0.616963093414197750, -0.616923743038775840, +-0.616884391121044650, -0.616845037661102440, -0.616805682659047560, -0.616766326114978610, -0.616726968028993740, -0.616687608401191520, -0.616648247231669560, -0.616608884520527640, +-0.616569520267863490, -0.616530154473775680, -0.616490787138362360, -0.616451418261722120, -0.616412047843953310, -0.616372675885153650, -0.616333302385423050, -0.616293927344859220, +-0.616254550763560500, -0.616215172641625510, -0.616175792979152480, -0.616136411776240010, -0.616097029032986470, -0.616057644749490430, -0.616018258925849490, -0.615978871562163690, +-0.615939482658530710, -0.615900092215049040, -0.615860700231817050, -0.615821306708933310, -0.615781911646495650, -0.615742515044603980, -0.615703116903355880, -0.615663717222850070, +-0.615624316003185010, -0.615584913244459080, -0.615545508946770850, -0.615506103110218920, -0.615466695734901760, -0.615427286820917070, -0.615387876368364890, -0.615348464377343030, +-0.615309050847949960, -0.615269635780284370, -0.615230219174444650, -0.615190801030529370, -0.615151381348636340, -0.615111960128865600, -0.615072537371314950, -0.615033113076082990, +-0.614993687243268190, -0.614954259872969260, -0.614914830965284540, -0.614875400520312860, -0.614835968538151920, -0.614796535018901860, -0.614757099962660370, -0.614717663369526160, +-0.614678225239597700, -0.614638785572973800, -0.614599344369752940, -0.614559901630032930, -0.614520457353913920, -0.614481011541493700, -0.614441564192871100, -0.614402115308144480, +-0.614362664887412540, -0.614323212930773970, -0.614283759438327470, -0.614244304410170750, -0.614204847846404060, -0.614165389747125090, -0.614125930112432770, -0.614086468942425690, +-0.614047006237202320, -0.614007541996861470, -0.613968076221501070, -0.613928608911221140, -0.613889140066119720, -0.613849669686295510, -0.613810197771847090, -0.613770724322873160, +-0.613731249339472430, -0.613691772821743480, -0.613652294769785220, -0.613612815183695480, -0.613573334063574390, -0.613533851409519990, -0.613494367221630980, -0.613454881500006040, +-0.613415394244743890, -0.613375905455942560, -0.613336415133702070, -0.613296923278120690, -0.613257429889296880, -0.613217934967329570, -0.613178438512317460, -0.613138940524359130, +-0.613099441003553510, -0.613059939949999410, -0.613020437363794630, -0.612980933245039440, -0.612941427593831970, -0.612901920410270920, -0.612862411694455100, -0.612822901446483210, +-0.612783389666454070, -0.612743876354465700, -0.612704361510618360, -0.612664845135010180, -0.612625327227739880, -0.612585807788906260, -0.612546286818608120, -0.612506764316944170, +-0.612467240284013450, -0.612427714719913860, -0.612388187624745670, -0.612348658998607020, -0.612309128841596720, -0.612269597153813680, -0.612230063935356620, -0.612190529186324330, +-0.612150992906814960, -0.612111455096928990, -0.612071915756764230, -0.612032374886419820, -0.611992832485994340, -0.611953288555586840, -0.611913743095296110, -0.611874196105220980, +-0.611834647585459690, -0.611795097536112500, -0.611755545957277660, -0.611715992849053760, -0.611676438211540050, -0.611636882044835130, -0.611597324349038020, -0.611557765124246980, +-0.611518204370562150, -0.611478642088081780, -0.611439078276904910, -0.611399512937130240, -0.611359946068856910, -0.611320377672183610, -0.611280807747209390, -0.611241236294033150, +-0.611201663312753160, -0.611162088803469670, -0.611122512766280930, -0.611082935201285980, -0.611043356108583740, -0.611003775488273000, -0.610964193340452160, -0.610924609665221550, +-0.610885024462679340, -0.610845437732924660, -0.610805849476056320, -0.610766259692173350, -0.610726668381374790, -0.610687075543759560, -0.610647481179426690, -0.610607885288474320, +-0.610568287871002920, -0.610528688927110870, -0.610489088456897090, -0.610449486460460490, -0.610409882937900330, -0.610370277889314640, -0.610330671314804010, -0.610291063214466690, +-0.610251453588401720, -0.610211842436708120, -0.610172229759484930, -0.610132615556831180, -0.610092999828845790, -0.610053382575628020, -0.610013763797276010, -0.609974143493890340, +-0.609934521665569270, -0.609894898312411950, -0.609855273434517400, -0.609815647031984540, -0.609776019104912640, -0.609736389653400050, -0.609696758677547130, -0.609657126177452270, +-0.609617492153214700, -0.609577856604933350, -0.609538219532707370, -0.609498580936635780, -0.609458940816817840, -0.609419299173351690, -0.609379656006338140, -0.609340011315875340, +-0.609300365102062650, -0.609260717364998980, -0.609221068104783490, -0.609181417321515320, -0.609141765015292940, -0.609102111186216820, -0.609062455834385450, -0.609022798959897970, +-0.608983140562853410, -0.608943480643351130, -0.608903819201490060, -0.608864156237369450, -0.608824491751088440, -0.608784825742745510, -0.608745158212441240, -0.608705489160274000, +-0.608665818586343050, -0.608626146490747640, -0.608586472873586800, -0.608546797734959120, -0.608507121074965070, -0.608467442893703250, -0.608427763191272900, -0.608388081967773050, +-0.608348399223303080, -0.608308714957962020, -0.608269029171849220, -0.608229341865063830, -0.608189653037704450, -0.608149962689871540, -0.608110270821663800, -0.608070577433180270, +-0.608030882524520420, -0.607991186095783290, -0.607951488147067560, -0.607911788678473730, -0.607872087690100480, -0.607832385182047070, -0.607792681154412650, -0.607752975607296460, +-0.607713268540797880, -0.607673559955016150, -0.607633849850050530, -0.607594138225999500, -0.607554425082963870, -0.607514710421042210, -0.607474994240333800, -0.607435276540937870, +-0.607395557322953690, -0.607355836586480620, -0.607316114331617360, -0.607276390558464390, -0.607236665267120610, -0.607196938457685080, -0.607157210130257140, -0.607117480284936170, +-0.607077748921821650, -0.607038016041012600, -0.606998281642607940, -0.606958545726708150, -0.606918808293412050, -0.606879069342818990, -0.606839328875028230, -0.606799586890139130, +-0.606759843388251060, -0.606720098369462610, -0.606680351833874700, -0.606640603781585910, -0.606600854212695610, -0.606561103127303160, -0.606521350525507930, -0.606481596407409280, +-0.606441840773106810, -0.606402083622699540, -0.606362324956286500, -0.606322564773968290, -0.606282803075843700, -0.606243039862012110, -0.606203275132572880, -0.606163508887625490, +-0.606123741127268520, -0.606083971851603010, -0.606044201060727540, -0.606004428754741590, -0.605964654933744630, -0.605924879597835920, -0.605885102747115050, -0.605845324381681480, +-0.605805544501634490, -0.605765763107072970, -0.605725980198097760, -0.605686195774807650, -0.605646409837302000, -0.605606622385680300, -0.605566833420042140, -0.605527042940486090, +-0.605487250947113200, -0.605447457440022150, -0.605407662419312540, -0.605367865885083620, -0.605328067837435090, -0.605288268276466420, -0.605248467202277100, -0.605208664614966580, +-0.605168860514633700, -0.605129054901379470, -0.605089247775302490, -0.605049439136502440, -0.605009628985078710, -0.604969817321130980, -0.604930004144758730, -0.604890189456060660, +-0.604850373255137910, -0.604810555542089180, -0.604770736317014060, -0.604730915580012130, -0.604691093331182870, -0.604651269570625980, -0.604611444298440830, -0.604571617514726430, +-0.604531789219583620, -0.604491959413111400, -0.604452128095409160, -0.604412295266576690, -0.604372460926713480, -0.604332625075919120, -0.604292787714292510, -0.604252948841934590, +-0.604213108458944380, -0.604173266565421360, -0.604133423161465120, -0.604093578247175360, -0.604053731822651650, -0.604013883887993600, -0.603974034443300110, -0.603934183488672340, +-0.603894331024208970, -0.603854477050009940, -0.603814621566174600, -0.603774764572802770, -0.603734906069993920, -0.603695046057847180, -0.603655184536463500, -0.603615321505941880, +-0.603575456966382040, -0.603535590917883450, -0.603495723360545910, -0.603455854294469020, -0.603415983719752580, -0.603376111636496180, -0.603336238044798740, -0.603296362944761410, +-0.603256486336483210, -0.603216608220063730, -0.603176728595602780, -0.603136847463200070, -0.603096964822954380, -0.603057080674967110, -0.603017195019337040, -0.602977307856164100, +-0.602937419185547770, -0.602897529007587970, -0.602857637322384400, -0.602817744130036640, -0.602777849430644610, -0.602737953224307120, -0.602698055511125540, -0.602658156291198790, +-0.602618255564626670, -0.602578353331508890, -0.602538449591945250, -0.602498544346035560, -0.602458637593878630, -0.602418729335575940, -0.602378819571226410, -0.602338908300929840, +-0.602298995524785940, -0.602259081242894620, -0.602219165455355480, -0.602179248162268530, -0.602139329363732710, -0.602099409059849380, -0.602059487250717450, -0.602019563936436740, +-0.601979639117107170, -0.601939712792828540, -0.601899784963700560, -0.601859855629822470, -0.601819924791295420, -0.601779992448218560, -0.601740058600691800, -0.601700123248814720, +-0.601660186392687480, -0.601620248032409770, -0.601580308168081280, -0.601540366799801500, -0.601500423927671450, -0.601460479551790270, -0.601420533672258010, -0.601380586289174350, +-0.601340637402639210, -0.601300687012752520, -0.601260735119613310, -0.601220781723323050, -0.601180826823980890, -0.601140870421686620, -0.601100912516540080, -0.601060953108641380, +-0.601020992198090240, -0.600981029784986690, -0.600941065869430410, -0.600901100451520900, -0.600861133531359280, -0.600821165109044930, -0.600781195184677540, -0.600741223758357150, +-0.600701250830183770, -0.600661276400256570, -0.600621300468676900, -0.600581323035543900, -0.600541344100957610, -0.600501363665018050, -0.600461381727825040, -0.600421398289478490, +-0.600381413350078550, -0.600341426909725030, -0.600301438968517180, -0.600261449526556580, -0.600221458583942270, -0.600181466140774280, -0.600141472197152640, -0.600101476753177380, +-0.600061479808948420, -0.600021481364565010, -0.599981481420128640, -0.599941479975738550, -0.599901477031494770, -0.599861472587497220, -0.599821466643846060, -0.599781459200641190, +-0.599741450257982760, -0.599701439815969910, -0.599661427874704220, -0.599621414434284960, -0.599581399494812150, -0.599541383056385820, -0.599501365119106120, -0.599461345683072970, +-0.599421324748385720, -0.599381302315145860, -0.599341278383452750, -0.599301252953406420, -0.599261226025107010, -0.599221197598654440, -0.599181167674148970, -0.599141136251690520, +-0.599101103331378560, -0.599061068913314560, -0.599021032997597900, -0.598980995584328600, -0.598940956673606920, -0.598900916265532770, -0.598860874360206300, -0.598820830957726980, +-0.598780786058196290, -0.598740739661713590, -0.598700691768379150, -0.598660642378292860, -0.598620591491555000, -0.598580539108265700, -0.598540485228524990, -0.598500429852433120, +-0.598460372980089470, -0.598420314611595620, -0.598380254747050920, -0.598340193386555530, -0.598300130530209810, -0.598260066178113670, -0.598220000330366600, -0.598179932987070400, +-0.598139864148324210, -0.598099793814228510, -0.598059721984883220, -0.598019648660388590, -0.597979573840844880, -0.597939497526352340, -0.597899419717010880, -0.597859340412920330, +-0.597819259614182030, -0.597779177320895580, -0.597739093533161240, -0.597699008251079130, -0.597658921474749530, -0.597618833204272670, -0.597578743439747930, -0.597538652181277110, +-0.597498559428959570, -0.597458465182895690, -0.597418369443185600, -0.597378272209929670, -0.597338173483228040, -0.597298073263180960, -0.597257971549887910, -0.597217868343450700, +-0.597177763643968910, -0.597137657451542570, -0.597097549766272160, -0.597057440588257830, -0.597017329917600040, -0.596977217754398050, -0.596937104098753780, -0.596896988950766700, +-0.596856872310537300, -0.596816754178165600, -0.596776634553751960, -0.596736513437396860, -0.596696390829200450, -0.596656266729262310, -0.596616141137684240, -0.596576014054565840, +-0.596535885480007360, -0.596495755414109150, -0.596455623856971600, -0.596415490808694940, -0.596375356269378880, -0.596335220239125220, -0.596295082718033440, -0.596254943706203910, +-0.596214803203736990, -0.596174661210733150, -0.596134517727292650, -0.596094372753515840, -0.596054226289503110, -0.596014078335354030, -0.595973928891170620, -0.595933777957052270, +-0.595893625533099440, -0.595853471619412600, -0.595813316216092130, -0.595773159323237600, -0.595733000940950940, -0.595692841069331740, -0.595652679708480460, -0.595612516858497370, +-0.595572352519483150, -0.595532186691537960, -0.595492019374762260, -0.595451850569256650, -0.595411680275120590, -0.595371508492456010, -0.595331335221362720, -0.595291160461941190, +-0.595250984214291570, -0.595210806478514650, -0.595170627254710590, -0.595130446542979310, -0.595090264343422600, -0.595050080656140290, -0.595009895481232730, -0.594969708818800510, +-0.594929520668943890, -0.594889331031763560, -0.594849139907359880, -0.594808947295832670, -0.594768753197283730, -0.594728557611812870, -0.594688360539520790, -0.594648161980507630, +-0.594607961934874200, -0.594567760402720750, -0.594527557384147310, -0.594487352879255580, -0.594447146888145480, -0.594406939410917600, -0.594366730447672300, -0.594326519998510160, +-0.594286308063531780, -0.594246094642837620, -0.594205879736527500, -0.594165663344703330, -0.594125445467465150, -0.594085226104913210, -0.594045005257148320, -0.594004782924270840, +-0.593964559106381350, -0.593924333803579900, -0.593884107015968170, -0.593843878743646300, -0.593803648986714670, -0.593763417745273970, -0.593723185019424670, -0.593682950809267470, +-0.593642715114902850, -0.593602477936431390, -0.593562239273953020, -0.593521999127569870, -0.593481757497381630, -0.593441514383489130, -0.593401269785992720, -0.593361023704993110, +-0.593320776140590310, -0.593280527092886260, -0.593240276561980970, -0.593200024547974820, -0.593159771050968730, -0.593119516071063170, -0.593079259608358830, -0.593039001662956420, +-0.592998742234956410, -0.592958481324458830, -0.592918218931565820, -0.592877955056377190, -0.592837689698993750, -0.592797422859515980, -0.592757154538044780, -0.592716884734680650, +-0.592676613449523490, -0.592636340682675680, -0.592596066434236900, -0.592555790704307970, -0.592515513492989590, -0.592475234800382440, -0.592434954626587130, -0.592394672971704560, +-0.592354389835834440, -0.592314105219079230, -0.592273819121538650, -0.592233531543313490, -0.592193242484504560, -0.592152951945212560, -0.592112659925538080, -0.592072366425581360, +-0.592032071445444340, -0.591991774985227150, -0.591951477045030590, -0.591911177624955260, -0.591870876725101970, -0.591830574345571630, -0.591790270486464710, -0.591749965147881470, +-0.591709658329923950, -0.591669350032692390, -0.591629040256287380, -0.591588729000809830, -0.591548416266360460, -0.591508102053040050, -0.591467786360948540, -0.591427469190188400, +-0.591387150540859660, -0.591346830413062910, -0.591306508806899170, -0.591266185722469030, -0.591225861159873520, -0.591185535119213350, -0.591145207600589420, -0.591104878604101660, +-0.591064548129852430, -0.591024216177941760, -0.590983882748470690, -0.590943547841539800, -0.590903211457250110, -0.590862873595701670, -0.590822534256996710, -0.590782193441235500, +-0.590741851148518740, -0.590701507378947330, -0.590661162132622210, -0.590620815409644170, -0.590580467210114150, -0.590540117534132820, -0.590499766381800570, -0.590459413753219640, +-0.590419059648490170, -0.590378704067712980, -0.590338347010989080, -0.590297988478419410, -0.590257628470104660, -0.590217266986145070, -0.590176904026643130, -0.590136539591698870, +-0.590096173681413320, -0.590055806295887280, -0.590015437435221780, -0.589975067099517640, -0.589934695288875880, -0.589894322003396530, -0.589853947243182300, -0.589813571008332980, +-0.589773193298949950, -0.589732814115133790, -0.589692433456985630, -0.589652051324606410, -0.589611667718096370, -0.589571282637557760, -0.589530896083091060, -0.589490508054797080, +-0.589450118552776850, -0.589409727577131280, -0.589369335127961410, -0.589328941205368270, -0.589288545809452000, -0.589248148940315080, -0.589207750598057740, -0.589167350782781150, +-0.589126949494586110, -0.589086546733573630, -0.589046142499844880, -0.589005736793499990, -0.588965329614641540, -0.588924920963369790, -0.588884510839785660, -0.588844099243990280, +-0.588803686176084580, -0.588763271636169820, -0.588722855624346790, -0.588682438140716640, -0.588642019185379620, -0.588601598758438320, -0.588561176859992980, -0.588520753490144770, +-0.588480328648994690, -0.588439902336643670, -0.588399474553192300, -0.588359045298742940, -0.588318614573395960, -0.588278182377252380, -0.588237748710413340, -0.588197313572980000, +-0.588156876965053370, -0.588116438886734480, -0.588075999338124600, -0.588035558319323970, -0.587995115830435070, -0.587954671871558480, -0.587914226442795230, -0.587873779544246360, +-0.587833331176013000, -0.587792881338195630, -0.587752430030896830, -0.587711977254216870, -0.587671523008256980, -0.587631067293118310, -0.587590610108902010, -0.587550151455709100, +-0.587509691333640950, -0.587469229742798470, -0.587428766683282140, -0.587388302155194770, -0.587347836158636500, -0.587307368693708700, -0.587266899760512500, -0.587226429359149040, +-0.587185957489719470, -0.587145484152324260, -0.587105009347066110, -0.587064533074045490, -0.587024055333363440, -0.586983576125121310, -0.586943095449420250, -0.586902613306361400, +-0.586862129696046120, -0.586821644618574670, -0.586781158074049850, -0.586740670062572240, -0.586700180584242890, -0.586659689639163040, -0.586619197227433940, -0.586578703349156960, +-0.586538208004432460, -0.586497711193363140, -0.586457212916049580, -0.586416713172592920, -0.586376211963094530, -0.586335709287655660, -0.586295205146377450, -0.586254699539361160, +-0.586214192466708250, -0.586173683928519100, -0.586133173924896390, -0.586092662455940830, -0.586052149521753550, -0.586011635122436040, -0.585971119258089310, -0.585930601928814080, +-0.585890083134713020, -0.585849562875886850, -0.585809041152436700, -0.585768517964464050, -0.585727993312070040, -0.585687467195356030, -0.585646939614423270, -0.585606410569373350, +-0.585565880060306520, -0.585525348087325810, -0.585484814650531700, -0.585444279750025550, -0.585403743385908730, -0.585363205558282470, -0.585322666267247490, -0.585282125512906700, +-0.585241583295360470, -0.585201039614710260, -0.585160494471057560, -0.585119947864503500, -0.585079399795149670, -0.585038850263097320, -0.584998299268447820, -0.584957746811301860, +-0.584917192891762250, -0.584876637509929690, -0.584836080665905530, -0.584795522359791150, -0.584754962591688020, -0.584714401361697390, -0.584673838669920070, -0.584633274516458860, +-0.584592708901414570, -0.584552141824888350, -0.584511573286981890, -0.584471003287796440, -0.584430431827433480, -0.584389858905994490, -0.584349284523580040, -0.584308708680293170, +-0.584268131376234570, -0.584227552611505610, -0.584186972386207760, -0.584146390700442500, -0.584105807554311180, -0.584065222947914630, -0.584024636881355860, -0.583984049354735360, +-0.583943460368154810, -0.583902869921715690, -0.583862278015519260, -0.583821684649667220, -0.583781089824260910, -0.583740493539401830, -0.583699895795190880, -0.583659296591730880, +-0.583618695929122740, -0.583578093807467720, -0.583537490226867520, -0.583496885187423600, -0.583456278689236770, -0.583415670732409960, -0.583375061317043860, -0.583334450443240280, +-0.583293838111100470, -0.583253224320726130, -0.583212609072218610, -0.583171992365679630, -0.583131374201210750, -0.583090754578912570, -0.583050133498888350, -0.583009510961238760, +-0.582968886966065410, -0.582928261513469770, -0.582887634603553530, -0.582847006236417500, -0.582806376412164600, -0.582765745130895850, -0.582725112392712630, -0.582684478197716740, +-0.582643842546009650, -0.582603205437692840, -0.582562566872868120, -0.582521926851636950, -0.582481285374100270, -0.582440642440361090, -0.582399998050520230, -0.582359352204679490, +-0.582318704902940240, -0.582278056145404290, -0.582237405932173210, -0.582196754263347940, -0.582156101139031490, -0.582115446559324680, -0.582074790524329310, -0.582034133034147080, +-0.581993474088879360, -0.581952813688628060, -0.581912151833494650, -0.581871488523580170, -0.581830823758987760, -0.581790157539818220, -0.581749489866173250, -0.581708820738154660, +-0.581668150155863930, -0.581627478119402850, -0.581586804628872360, -0.581546129684375580, -0.581505453286013440, -0.581464775433887750, -0.581424096128099980, -0.581383415368752040, +-0.581342733155945650, -0.581302049489782370, -0.581261364370363910, -0.581220677797791410, -0.581179989772167890, -0.581139300293594400, -0.581098609362172610, -0.581057916978004350, +-0.581017223141191310, -0.580976527851834510, -0.580935831110036990, -0.580895132915900000, -0.580854433269525130, -0.580813732171014290, -0.580773029620468950, -0.580732325617991150, +-0.580691620163682480, -0.580650913257644840, -0.580610204899979050, -0.580569495090788590, -0.580528783830174370, -0.580488071118238190, -0.580447356955081870, -0.580406641340807110, +-0.580365924275515030, -0.580325205759308790, -0.580284485792289640, -0.580243764374559270, -0.580203041506219370, -0.580162317187371990, -0.580121591418118810, -0.580080864198561640, +-0.580040135528802290, -0.579999405408941900, -0.579958673839083730, -0.579917940819328790, -0.579877206349779020, -0.579836470430536320, -0.579795733061702400, -0.579754994243379170, +-0.579714253975667670, -0.579673512258671360, -0.579632769092491170, -0.579592024477229020, -0.579551278412986930, -0.579510530899866590, -0.579469781937969940, -0.579429031527398770, +-0.579388279668254460, -0.579347526360640020, -0.579306771604656820, -0.579266015400406680, -0.579225257747991500, -0.579184498647513200, -0.579143738099073600, -0.579102976102773950, +-0.579062212658717600, -0.579021447767005700, -0.578980681427740280, -0.578939913641023040, -0.578899144406956000, -0.578858373725641200, -0.578817601597180430, -0.578776828021674850, +-0.578736052999228030, -0.578695276529941020, -0.578654498613915820, -0.578613719251254490, -0.578572938442058700, -0.578532156186430610, -0.578491372484471470, -0.578450587336284630, +-0.578409800741971240, -0.578369012701633320, -0.578328223215372920, -0.578287432283292050, -0.578246639905492520, -0.578205846082076370, -0.578165050813145620, -0.578124254098801530, +-0.578083455939147450, -0.578042656334284870, -0.578001855284315580, -0.577961052789341620, -0.577920248849465130, -0.577879443464787150, -0.577838636635411350, -0.577797828361439000, +-0.577757018642972130, -0.577716207480112540, -0.577675394872962600, -0.577634580821624110, -0.577593765326199100, -0.577552948386789720, -0.577512130003497330, -0.577471310176425280, +-0.577430488905674940, -0.577389666191348350, -0.577348842033547640, -0.577308016432374840, -0.577267189387931980, -0.577226360900320310, -0.577185530969643650, -0.577144699596003010, +-0.577103866779500760, -0.577063032520238720, -0.577022196818319230, -0.576981359673844120, -0.576940521086915630, -0.576899681057635230, -0.576858839586106180, -0.576817996672430170, +-0.576777152316709120, -0.576736306519045170, -0.576695459279540470, -0.576654610598297150, -0.576613760475416570, -0.576572908911002320, -0.576532055905155770, -0.576491201457979050, +-0.576450345569574310, -0.576409488240043790, -0.576368629469489520, -0.576327769258013660, -0.576286907605717660, -0.576246044512705110, -0.576205179979077500, -0.576164314004936950, +-0.576123446590385500, -0.576082577735525510, -0.576041707440459130, -0.576000835705287710, -0.575959962530114830, -0.575919087915042090, -0.575878211860171740, -0.575837334365605800, +-0.575796455431446530, -0.575755575057796070, -0.575714693244756660, -0.575673809992430560, -0.575632925300919250, -0.575592039170326310, -0.575551151600753210, -0.575510262592302310, +-0.575469372145075760, -0.575428480259175810, -0.575387586934703820, -0.575346692171763710, -0.575305795970456830, -0.575264898330885450, -0.575223999253151820, -0.575183098737358180, +-0.575142196783606790, -0.575101293391999890, -0.575060388562639860, -0.575019482295628050, -0.574978574591068270, -0.574937665449062000, -0.574896754869711700, -0.574855842853119410, +-0.574814929399387500, -0.574774014508618310, -0.574733098180913340, -0.574692180416376370, -0.574651261215109010, -0.574610340577213390, -0.574569418502791970, -0.574528494991947030, +-0.574487570044780790, -0.574446643661395640, -0.574405715841893150, -0.574364786586377130, -0.574323855894949160, -0.574282923767711510, -0.574241990204766520, -0.574201055206216670, +-0.574160118772164110, -0.574119180902710410, -0.574078241597959620, -0.574037300858013190, -0.573996358682973610, -0.573955415072943010, -0.573914470028023870, -0.573873523548318660, +-0.573832575633929530, -0.573791626284958280, -0.573750675501508710, -0.573709723283682420, -0.573668769631581870, -0.573627814545309310, -0.573586858024967340, -0.573545900070658090, +-0.573504940682483480, -0.573463979860547200, -0.573423017604950850, -0.573382053915797110, -0.573341088793188240, -0.573300122237226590, -0.573259154248014660, -0.573218184825654790, +-0.573177213970249460, -0.573136241681900470, -0.573095267960711530, -0.573054292806784440, -0.573013316220221560, -0.572972338201125480, -0.572931358749598550, -0.572890377865742370, +-0.572849395549661080, -0.572808411801456250, -0.572767426621230480, -0.572726440009086120, -0.572685451965125550, -0.572644462489451440, -0.572603471582166180, -0.572562479243372220, +-0.572521485473171390, -0.572480490271667470, -0.572439493638962400, -0.572398495575158540, -0.572357496080358460, -0.572316495154664650, -0.572275492798179690, -0.572234489011005150, +-0.572193483793245190, -0.572152477145001500, -0.572111469066376550, -0.572070459557472930, -0.572029448618393220, -0.571988436249239900, -0.571947422450115540, -0.571906407221121740, +-0.571865390562362740, -0.571824372473940250, -0.571783352955956840, -0.571742332008515100, -0.571701309631717500, -0.571660285825666530, -0.571619260590464200, -0.571578233926214430, +-0.571537205833019150, -0.571496176310980710, -0.571455145360201920, -0.571414112980785260, -0.571373079172833310, -0.571332043936448650, -0.571291007271733210, -0.571249969178790900, +-0.571208929657723740, -0.571167888708634220, -0.571126846331625030, -0.571085802526798640, -0.571044757294257740, -0.571003710634104270, -0.570962662546442230, -0.570921613031373560, +-0.570880562089000840, -0.570839509719426760, -0.570798455922753800, -0.570757400699084760, -0.570716344048522230, -0.570675285971168900, -0.570634226467126470, -0.570593165536499300, +-0.570552103179389200, -0.570511039395898870, -0.570469974186130990, -0.570428907550188050, -0.570387839488172180, -0.570346770000187410, -0.570305699086335770, -0.570264626746719850, +-0.570223552981442340, -0.570182477790605930, -0.570141401174313440, -0.570100323132667340, -0.570059243665770430, -0.570018162773724750, -0.569977080456634310, -0.569935996714601270, +-0.569894911547728200, -0.569853824956117800, -0.569812736939872890, -0.569771647499096150, -0.569730556633889500, -0.569689464344357190, -0.569648370630601250, -0.569607275492724390, +-0.569566178930829390, -0.569525080945018860, -0.569483981535395700, -0.569442880702062500, -0.569401778445121410, -0.569360674764676670, -0.569319569660830190, -0.569278463133684800, +-0.569237355183343170, -0.569196245809908240, -0.569155135013482690, -0.569114022794168450, -0.569072909152070090, -0.569031794087289320, -0.568990677599929050, -0.568949559690092200, +-0.568908440357881350, -0.568867319603399420, -0.568826197426749220, -0.568785073828032780, -0.568743948807354350, -0.568702822364816170, -0.568661694500520840, -0.568620565214571270, +-0.568579434507070270, -0.568538302378120750, -0.568497168827824640, -0.568456033856286510, -0.568414897463608180, -0.568373759649892560, -0.568332620415242570, -0.568291479759761130, +-0.568250337683550930, -0.568209194186714890, -0.568168049269355820, -0.568126902931575970, -0.568085755173479480, -0.568044605995168710, -0.568003455396746350, -0.567962303378315440, +-0.567921149939978780, -0.567879995081838400, -0.567838838803998770, -0.567797681106562150, -0.567756521989631220, -0.567715361453309030, -0.567674199497698480, -0.567633036122902390, +-0.567591871329023780, -0.567550705116165450, -0.567509537484429560, -0.567468368433920570, -0.567427197964740730, -0.567386026076992840, -0.567344852770779950, -0.567303678046204850, +-0.567262501903370580, -0.567221324342379370, -0.567180145363335500, -0.567138964966341310, -0.567097783151499720, -0.567056599918913660, -0.567015415268686040, -0.566974229200920000, +-0.566933041715718340, -0.566891852813183330, -0.566850662493419420, -0.566809470756528770, -0.566768277602614610, -0.566727083031779650, -0.566685887044127030, -0.566644689639759670, +-0.566603490818779810, -0.566562290581292040, -0.566521088927398500, -0.566479885857202210, -0.566438681370806220, -0.566397475468313650, -0.566356268149827200, -0.566315059415450240, +-0.566273849265284790, -0.566232637699435440, -0.566191424718004540, -0.566150210321095140, -0.566108994508810140, -0.566067777281252680, -0.566026558638525800, -0.565985338580731740, +-0.565944117107975100, -0.565902894220358110, -0.565861669917983920, -0.565820444200955560, -0.565779217069376060, -0.565737988523348560, -0.565696758562976080, -0.565655527188361760, +-0.565614294399607750, -0.565573060196818860, -0.565531824580097320, -0.565490587549546180, -0.565449349105268560, -0.565408109247367510, -0.565366867975945600, -0.565325625291107080, +-0.565284381192954650, -0.565243135681591240, -0.565201888757119960, -0.565160640419643870, -0.565119390669266310, -0.565078139506090200, -0.565036886930218810, -0.564995632941754480, +-0.564954377540801690, -0.564913120727463030, -0.564871862501841520, -0.564830602864040410, -0.564789341814162740, -0.564748079352311860, -0.564706815478589920, -0.564665550193101720, +-0.564624283495949510, -0.564583015387236760, -0.564541745867066400, -0.564500474935541670, -0.564459202592765830, -0.564417928838841900, -0.564376653673872460, -0.564335377097962110, +-0.564294099111213310, -0.564252819713729200, -0.564211538905613150, -0.564170256686968190, -0.564128973057897550, -0.564087688018503840, -0.564046401568891630, -0.564005113709163290, +-0.563963824439422280, -0.563922533759771750, -0.563881241670314840, -0.563839948171154790, -0.563798653262394870, -0.563757356944137640, -0.563716059216487710, -0.563674760079547640, +-0.563633459533420700, -0.563592157578210020, -0.563550854214019070, -0.563509549440950890, -0.563468243259108160, -0.563426935668595470, -0.563385626669515530, -0.563344316261971460, +-0.563303004446066620, -0.563261691221904390, -0.563220376589587790, -0.563179060549220290, -0.563137743100905140, -0.563096424244744820, -0.563055103980844350, -0.563013782309305990, +-0.562972459230233200, -0.562931134743729240, -0.562889808849897480, -0.562848481548840480, -0.562807152840662960, -0.562765822725467600, -0.562724491203357660, -0.562683158274436490, +-0.562641823938807460, -0.562600488196573820, -0.562559151047838930, -0.562517812492706270, -0.562476472531278300, -0.562435131163659840, -0.562393788389953580, -0.562352444210262870, +-0.562311098624690970, -0.562269751633341470, -0.562228403236316730, -0.562187053433721770, -0.562145702225659180, -0.562104349612232320, -0.562062995593544560, -0.562021640169699350, +-0.561980283340800080, -0.561938925106949980, -0.561897565468252650, -0.561856204424810660, -0.561814841976728930, -0.561773478124110050, -0.561732112867057490, -0.561690746205674610, +-0.561649378140064880, -0.561608008670331780, -0.561566637796577890, -0.561525265518908130, -0.561483891837425200, -0.561442516752232450, -0.561401140263433570, -0.561359762371131720, +-0.561318383075430470, -0.561277002376433300, -0.561235620274242900, -0.561194236768964180, -0.561152851860699850, -0.561111465549553490, -0.561070077835628340, -0.561028688719028000, +-0.560987298199856040, -0.560945906278214950, -0.560904512954209960, -0.560863118227943660, -0.560821722099519530, -0.560780324569041140, -0.560738925636611870, -0.560697525302335300, +-0.560656123566315000, -0.560614720428654350, -0.560573315889456140, -0.560531909948825290, -0.560490502606864840, -0.560449093863678030, -0.560407683719368550, -0.560366272174039780, +-0.560324859227794620, -0.560283444880738110, -0.560242029132972940, -0.560200611984602690, -0.560159193435730840, -0.560117773486461080, -0.560076352136896990, -0.560034929387141830, +-0.559993505237299520, -0.559952079687472630, -0.559910652737766190, -0.559869224388283240, -0.559827794639127240, -0.559786363490401670, -0.559744930942210230, -0.559703496994655710, +-0.559662061647843270, -0.559620624901875590, -0.559579186756856360, -0.559537747212889180, -0.559496306270077630, -0.559454863928525280, -0.559413420188335730, -0.559371975049612780, +-0.559330528512459010, -0.559289080576979680, -0.559247631243277700, -0.559206180511456650, -0.559164728381620120, -0.559123274853871810, -0.559081819928315290, -0.559040363605053490, +-0.558998905884191430, -0.558957446765832260, -0.558915986250079320, -0.558874524337036550, -0.558833061026807410, -0.558791596319495600, -0.558750130215204810, -0.558708662714037960, +-0.558667193816100190, -0.558625723521494420, -0.558584251830324340, -0.558542778742693650, -0.558501304258706030, -0.558459828378465080, -0.558418351102073940, -0.558376872429637520, +-0.558335392361259060, -0.558293910897042060, -0.558252428037090190, -0.558210943781507370, -0.558169458130397200, -0.558127971083863360, -0.558086482642009550, -0.558044992804938800, +-0.558003501572756360, -0.557962008945565020, -0.557920514923468840, -0.557879019506571260, -0.557837522694976220, -0.557796024488786510, -0.557754524888107620, -0.557713023893042340, +-0.557671521503694480, -0.557630017720167850, -0.557588512542566250, -0.557547005970993270, -0.557505498005552820, -0.557463988646348610, -0.557422477893483650, -0.557380965747063310, +-0.557339452207190500, -0.557297937273969040, -0.557256420947502830, -0.557214903227895460, -0.557173384115250190, -0.557131863609672150, -0.557090341711264480, -0.557048818420130880, +-0.557007293736375250, -0.556965767660101420, -0.556924240191413180, -0.556882711330414340, -0.556841181077208700, -0.556799649431899410, -0.556758116394591720, -0.556716581965388760, +-0.556675046144394340, -0.556633508931712260, -0.556591970327446450, -0.556550430331700600, -0.556508888944578060, -0.556467346166183980, -0.556425801996621620, -0.556384256435994650, +-0.556342709484407120, -0.556301161141962710, -0.556259611408765450, -0.556218060284919270, -0.556176507770527070, -0.556134953865694340, -0.556093398570524310, -0.556051841885120690, +-0.556010283809587610, -0.555968724344028660, -0.555927163488547980, -0.555885601243248590, -0.555844037608235970, -0.555802472583613370, -0.555760906169484480, -0.555719338365953330, +-0.555677769173123840, -0.555636198591099920, -0.555594626619985490, -0.555553053259883800, -0.555511478510900100, -0.555469902373137870, -0.555428324846700790, -0.555386745931692900, +-0.555345165628218230, -0.555303583936380570, -0.555262000856283190, -0.555220416388031550, -0.555178830531728900, -0.555137243287479150, -0.555095654655386350, -0.555054064635554400, +-0.555012473228087220, -0.554970880433088950, -0.554929286250663400, -0.554887690680913930, -0.554846093723946000, -0.554804495379862760, -0.554762895648768350, -0.554721294530766680, +-0.554679692025961790, -0.554638088134456810, -0.554596482856357540, -0.554554876191766910, -0.554513268140789160, -0.554471658703528210, -0.554430047880088210, -0.554388435670572940, +-0.554346822075086680, -0.554305207093733320, -0.554263590726616240, -0.554221972973840900, -0.554180353835510680, -0.554138733311729580, -0.554097111402601540, -0.554055488108230800, +-0.554013863428721390, -0.553972237364176450, -0.553930609914701780, -0.553888981080400520, -0.553847350861376820, -0.553805719257734700, -0.553764086269578290, -0.553722451897011750, +-0.553680816140138980, -0.553639178999063450, -0.553597540473890760, -0.553555900564724260, -0.553514259271667860, -0.553472616594825940, -0.553430972534302400, -0.553389327090201500, +-0.553347680262626480, -0.553306032051683050, -0.553264382457474560, -0.553222731480105030, -0.553181079119678730, -0.553139425376299680, -0.553097770250072120, -0.553056113741100090, +-0.553014455849487160, -0.552972796575338710, -0.552931135918758310, -0.552889473879849990, -0.552847810458718110, -0.552806145655466600, -0.552764479470199800, -0.552722811903020970, +-0.552681142954035920, -0.552639472623348000, -0.552597800911061480, -0.552556127817280360, -0.552514453342108910, -0.552472777485651380, -0.552431100248011900, -0.552389421629294610, +-0.552347741629603100, -0.552306060249042940, -0.552264377487717620, -0.552222693345731370, -0.552181007823188460, -0.552139320920192910, -0.552097632636848410, -0.552055942973260550, +-0.552014251929532800, -0.551972559505769400, -0.551930865702074610, -0.551889170518552690, -0.551847473955307870, -0.551805776012444290, -0.551764076690066330, -0.551722375988277450, +-0.551680673907183340, -0.551638970446887480, -0.551597265607494340, -0.551555559389107940, -0.551513851791832650, -0.551472142815772730, -0.551430432461031740, -0.551388720727715280, +-0.551347007615927140, -0.551305293125771480, -0.551263577257352640, -0.551221860010774780, -0.551180141386142240, -0.551138421383559400, -0.551096700003129710, -0.551054977244959110, +-0.551013253109151060, -0.550971527595809810, -0.550929800705039720, -0.550888072436945150, -0.550846342791630470, -0.550804611769199150, -0.550762879369756990, -0.550721145593407680, +-0.550679410440255590, -0.550637673910404860, -0.550595936003959950, -0.550554196721025240, -0.550512456061704960, -0.550470714026102930, -0.550428970614324720, -0.550387225826474150, +-0.550345479662655570, -0.550303732122973230, -0.550261983207531610, -0.550220232916434960, -0.550178481249786970, -0.550136728207693660, -0.550094973790258400, -0.550053217997585660, +-0.550011460829780030, -0.549969702286945640, -0.549927942369187070, -0.549886181076608580, -0.549844418409314640, -0.549802654367408940, -0.549760888950997400, -0.549719122160183590, +-0.549677353995071890, -0.549635584455766880, -0.549593813542372910, -0.549552041254993680, -0.549510267593735110, -0.549468492558700780, -0.549426716149995280, -0.549384938367722950, +-0.549343159211988400, -0.549301378682895750, -0.549259596780549810, -0.549217813505054830, -0.549176028856514620, -0.549134242835034980, -0.549092455440719830, -0.549050666673673420, +-0.549008876534000430, -0.548967085021805250, -0.548925292137192320, -0.548883497880265470, -0.548841702251130600, -0.548799905249891530, -0.548758106876652610, -0.548716307131518420, +-0.548674506014593550, -0.548632703525982370, -0.548590899665789330, -0.548549094434118480, -0.548507287831075500, -0.548465479856764300, -0.548423670511289480, -0.548381859794755400, +-0.548340047707266740, -0.548298234248927980, -0.548256419419842820, -0.548214603220117390, -0.548172785649855500, -0.548130966709161620, -0.548089146398140210, -0.548047324716896100, +-0.548005501665533520, -0.547963677244157290, -0.547921851452871090, -0.547880024291781060, -0.547838195760990910, -0.547796365860605320, -0.547754534590728760, -0.547712701951465930, +-0.547670867942921300, -0.547629032565198680, -0.547587195818404320, -0.547545357702642010, -0.547503518218016240, -0.547461677364631690, -0.547419835142592960, -0.547377991552004620, +-0.547336146592971250, -0.547294300265597560, -0.547252452569987450, -0.547210603506246840, -0.547168753074479760, -0.547126901274790800, -0.547085048107284640, -0.547043193572065770, +-0.547001337669238200, -0.546959480398908070, -0.546917621761179200, -0.546875761756156260, -0.546833900383943970, -0.546792037644646900, -0.546750173538369740, -0.546708308065217200, +-0.546666441225293840, -0.546624573018703600, -0.546582703445552710, -0.546540832505945100, -0.546498960199985340, -0.546457086527778250, -0.546415211489428290, -0.546373335085040490, +-0.546331457314718550, -0.546289578178568600, -0.546247697676694790, -0.546205815809201800, -0.546163932576194220, -0.546122047977776750, -0.546080162014054180, -0.546038274685131330, +-0.545996385991111890, -0.545954495932102320, -0.545912604508206440, -0.545870711719529170, -0.545828817566174960, -0.545786922048248860, -0.545745025165855320, -0.545703126919098610, +-0.545661227308084750, -0.545619326332917760, -0.545577423993702570, -0.545535520290543750, -0.545493615223546220, -0.545451708792814570, -0.545409800998453600, -0.545367891840567440, +-0.545325981319262350, -0.545284069434642250, -0.545242156186811930, -0.545200241575876320, -0.545158325601940110, -0.545116408265107990, -0.545074489565484210, -0.545032569503174800, +-0.544990648078284120, -0.544948725290916760, -0.544906801141177620, -0.544864875629171410, -0.544822948755003030, -0.544781020518777300, -0.544739090920599020, -0.544697159960572220, +-0.544655227638803360, -0.544613293955396370, -0.544571358910456160, -0.544529422504087530, -0.544487484736395410, -0.544445545607483710, -0.544403605117459000, -0.544361663266425210, +-0.544319720054487370, -0.544277775481750160, -0.544235829548318510, -0.544193882254297210, -0.544151933599791300, -0.544109983584905480, -0.544068032209744090, -0.544026079474413280, +-0.543984125379017300, -0.543942169923660960, -0.543900213108449160, -0.543858254933486940, -0.543816295398878990, -0.543774334504729670, -0.543732372251145120, -0.543690408638229710, +-0.543648443666088330, -0.543606477334825700, -0.543564509644546940, -0.543522540595356980, -0.543480570187360620, -0.543438598420662110, -0.543396625295367810, -0.543354650811581960, +-0.543312674969409490, -0.543270697768955310, -0.543228719210324450, -0.543186739293621710, -0.543144758018951460, -0.543102775386419930, -0.543060791396131610, -0.543018806048191190, +-0.542976819342703810, -0.542934831279774380, -0.542892841859507920, -0.542850851082009370, -0.542808858947382840, -0.542766865455734940, -0.542724870607169900, -0.542682874401792640, +-0.542640876839708300, -0.542598877921021680, -0.542556877645837930, -0.542514876014261180, -0.542472873026398020, -0.542430868682352570, -0.542388862982230100, -0.542346855926135410, +-0.542304847514173630, -0.542262837746449570, -0.542220826623068590, -0.542178814144135490, -0.542136800309754640, -0.542094785120032400, -0.542052768575073340, -0.542010750674982280, +-0.541968731419864460, -0.541926710809824690, -0.541884688844967430, -0.541842665525399170, -0.541800640851224370, -0.541758614822547830, -0.541716587439474820, -0.541674558702110340, +-0.541632528610559440, -0.541590497164927130, -0.541548464365318670, -0.541506430211838310, -0.541464394704592620, -0.541422357843685980, -0.541380319629223390, -0.541338280061310020, +-0.541296239140050980, -0.541254196865551320, -0.541212153237915380, -0.541170108257249870, -0.541128061923659030, -0.541086014237248000, -0.541043965198122030, -0.541001914806386150, +-0.540959863062145390, -0.540917809965504980, -0.540875755516569410, -0.540833699715445150, -0.540791642562236550, -0.540749584057048980, -0.540707524199987350, -0.540665462991156920, +-0.540623400430662930, -0.540581336518609620, -0.540539271255103700, -0.540497204640249640, -0.540455136674152570, -0.540413067356917630, -0.540370996688649960, -0.540328924669454920, +-0.540286851299437540, -0.540244776578702180, -0.540202700507355750, -0.540160623085502500, -0.540118544313247790, -0.540076464190696660, -0.540034382717954340, -0.539992299895126090, +-0.539950215722316270, -0.539908130199631800, -0.539866043327176910, -0.539823955105056870, -0.539781865533377040, -0.539739774612242540, -0.539697682341758520, -0.539655588722030340, +-0.539613493753163250, -0.539571397435261610, -0.539529299768432220, -0.539487200752779560, -0.539445100388408980, -0.539402998675425630, -0.539360895613934740, -0.539318791204040910, +-0.539276685445850830, -0.539234578339468970, -0.539192469885000800, -0.539150360082551350, -0.539108248932226090, -0.539066136434130040, -0.539024022588368790, -0.538981907395047480, +-0.538939790854270570, -0.538897672966144990, -0.538855553730775320, -0.538813433148266570, -0.538771311218724350, -0.538729187942253880, -0.538687063318959660, -0.538644937348948470, +-0.538602810032325020, -0.538560681369194550, -0.538518551359662310, -0.538476420003833780, -0.538434287301814090, -0.538392153253708710, -0.538350017859623000, -0.538307881119661440, +-0.538265743033931040, -0.538223603602536180, -0.538181462825582320, -0.538139320703174830, -0.538097177235418940, -0.538055032422420250, -0.538012886264283120, -0.537970738761114560, +-0.537928589913019170, -0.537886439720102310, -0.537844288182469430, -0.537802135300225690, -0.537759981073476670, -0.537717825502327720, -0.537675668586883430, -0.537633510327250710, +-0.537591350723534260, -0.537549189775839320, -0.537507027484271480, -0.537464863848936100, -0.537422698869938540, -0.537380532547383490, -0.537338364881377870, -0.537296195872026260, +-0.537254025519434240, -0.537211853823707170, -0.537169680784950420, -0.537127506403269450, -0.537085330678769730, -0.537043153611556630, -0.537000975201735060, -0.536958795449411610, +-0.536916614354691290, -0.536874431917679470, -0.536832248138481520, -0.536790063017202890, -0.536747876553948400, -0.536705688748824960, -0.536663499601937270, -0.536621309113390900, +-0.536579117283291220, -0.536536924111743810, -0.536494729598854030, -0.536452533744727460, -0.536410336549469460, -0.536368138013184950, -0.536325938135980840, -0.536283736917961830, +-0.536241534359233610, -0.536199330459901420, -0.536157125220070970, -0.536114918639846950, -0.536072710719336380, -0.536030501458643950, -0.535988290857875360, -0.535946078917136080, +-0.535903865636531470, -0.535861651016167340, -0.535819435056149040, -0.535777217756582050, -0.535734999117571390, -0.535692779139223970, -0.535650557821644500, -0.535608335164938780, +-0.535566111169212160, -0.535523885834570220, -0.535481659161118560, -0.535439431148962090, -0.535397201798207710, -0.535354971108960350, -0.535312739081325590, -0.535270505715408910, +-0.535228271011316090, -0.535186034969152510, -0.535143797589023860, -0.535101558871034940, -0.535059318815292890, -0.535017077421902520, -0.534974834690969510, -0.534932590622599350, +-0.534890345216897820, -0.534848098473970300, -0.534805850393921920, -0.534763600976859490, -0.534721350222888250, -0.534679098132113450, -0.534636844704641010, -0.534594589940576510, +-0.534552333840025430, -0.534510076403093560, -0.534467817629886490, -0.534425557520509130, -0.534383296075068630, -0.534341033293669890, -0.534298769176418500, -0.534256503723420260, +-0.534214236934780760, -0.534171968810604910, -0.534129699350999960, -0.534087428556070610, -0.534045156425922760, -0.534002882960662120, -0.533960608160394150, -0.533918332025224650, +-0.533876054555259440, -0.533833775750603980, -0.533791495611363410, -0.533749214137644760, -0.533706931329553160, -0.533664647187194200, -0.533622361710673570, -0.533580074900097070, +-0.533537786755569620, -0.533495497277198470, -0.533453206465088650, -0.533410914319345730, -0.533368620840075520, -0.533326326027383830, -0.533284029881376240, -0.533241732402158660, +-0.533199433589836680, -0.533157133444515320, -0.533114831966301940, -0.533072529155301570, -0.533030225011619780, -0.532987919535362400, -0.532945612726635320, -0.532903304585544140, +-0.532860995112193980, -0.532818684306691990, -0.532776372169143420, -0.532734058699653850, -0.532691743898329070, -0.532649427765275020, -0.532607110300597380, -0.532564791504402060, +-0.532522471376793870, -0.532480149917880290, -0.532437827127766330, -0.532395503006557910, -0.532353177554360620, -0.532310850771280370, -0.532268522657423080, -0.532226193212893660, +-0.532183862437799580, -0.532141530332245760, -0.532099196896338110, -0.532056862130182550, -0.532014526033884770, -0.531972188607550690, -0.531929849851286220, -0.531887509765197050, +-0.531845168349388330, -0.531802825603967520, -0.531760481529039540, -0.531718136124710420, -0.531675789391085950, -0.531633441328272060, -0.531591091936373770, -0.531548741215498440, +-0.531506389165751330, -0.531464035787238220, -0.531421681080065040, -0.531379325044337710, -0.531336967680162030, -0.531294608987643910, -0.531252248966889270, -0.531209887618003250, +-0.531167524941093210, -0.531125160936264380, -0.531082795603622700, -0.531040428943274080, -0.530998060955324310, -0.530955691639878660, -0.530913320997044470, -0.530870949026927110, +-0.530828575729632270, -0.530786201105265980, -0.530743825153934260, -0.530701447875742920, -0.530659069270797980, -0.530616689339205360, -0.530574308081070310, -0.530531925496500190, +-0.530489541585600240, -0.530447156348476500, -0.530404769785234880, -0.530362381895981280, -0.530319992680821750, -0.530277602139861410, -0.530235210273207970, -0.530192817080966330, +-0.530150422563242740, -0.530108026720143120, -0.530065629551773390, -0.530023231058239670, -0.529980831239647790, -0.529938430096103090, -0.529896027627713040, -0.529853623834583010, +-0.529811218716818800, -0.529768812274526660, -0.529726404507812390, -0.529683995416782130, -0.529641585001541130, -0.529599173262196960, -0.529556760198854890, -0.529514345811620820, +-0.529471930100601010, -0.529429513065901250, -0.529387094707627790, -0.529344675025886560, -0.529302254020782900, -0.529259831692424300, -0.529217408040916220, -0.529174983066364570, +-0.529132556768875490, -0.529090129148554910, -0.529047700205509170, -0.529005269939843310, -0.528962838351665020, -0.528920405441079770, -0.528877971208193350, -0.528835535653112140, +-0.528793098775941940, -0.528750660576789100, -0.528708221055759650, -0.528665780212959510, -0.528623338048494260, -0.528580894562471370, -0.528538449754996310, -0.528496003626175100, +-0.528453556176113780, -0.528411107404918700, -0.528368657312695110, -0.528326205899550480, -0.528283753165590510, -0.528241299110920990, -0.528198843735648400, -0.528156387039878550, +-0.528113929023717790, -0.528071469687272250, -0.528029009030647980, -0.527986547053950430, -0.527944083757287300, -0.527901619140763940, -0.527859153204486510, -0.527816685948561240, +-0.527774217373094270, -0.527731747478191740, -0.527689276263959120, -0.527646803730503990, -0.527604329877931930, -0.527561854706348980, -0.527519378215861370, -0.527476900406575360, +-0.527434421278597080, -0.527391940832032780, -0.527349459066987820, -0.527306975983570010, -0.527264491581884820, -0.527222005862038270, -0.527179518824136830, -0.527137030468286530, +-0.527094540794593610, -0.527052049803163670, -0.527009557494104270, -0.526967063867521120, -0.526924568923520130, -0.526882072662207880, -0.526839575083690390, -0.526797076188073920, +-0.526754575975464820, -0.526712074445968460, -0.526669571599692740, -0.526627067436743030, -0.526584561957225690, -0.526542055161246860, -0.526499547048913000, -0.526457037620330250, +-0.526414526875604080, -0.526372014814842410, -0.526329501438150720, -0.526286986745635230, -0.526244470737402330, -0.526201953413558240, -0.526159434774209230, -0.526116914819461660, +-0.526074393549421760, -0.526031870964195240, -0.525989347063889670, -0.525946821848610750, -0.525904295318464830, -0.525861767473558170, -0.525819238313997020, -0.525776707839887060, +-0.525734176051336100, -0.525691642948449720, -0.525649108531334170, -0.525606572800095930, -0.525564035754841230, -0.525521497395676440, -0.525478957722707810, -0.525436416736041910, +-0.525393874435784110, -0.525351330822042440, -0.525308785894922470, -0.525266239654530560, -0.525223692100972970, -0.525181143234356160, -0.525138593054786500, -0.525096041562369660, +-0.525053488757213360, -0.525010934639423500, -0.524968379209106110, -0.524925822466367880, -0.524883264411315160, -0.524840705044054110, -0.524798144364691410, -0.524755582373332640, +-0.524713019070085610, -0.524670454455056000, -0.524627888528350290, -0.524585321290074850, -0.524542752740336130, -0.524500182879240500, -0.524457611706893640, -0.524415039223403490, +-0.524372465428875830, -0.524329890323416930, -0.524287313907133350, -0.524244736180131450, -0.524202157142517720, -0.524159576794398620, -0.524116995135879840, -0.524074412167069290, +-0.524031827888072680, -0.523989242298996570, -0.523946655399947340, -0.523904067191031440, -0.523861477672355360, -0.523818886844024890, -0.523776294706147840, -0.523733701258830120, +-0.523691106502178210, -0.523648510436298450, -0.523605913061297560, -0.523563314377281760, -0.523520714384357650, -0.523478113082631810, -0.523435510472209930, -0.523392906553200030, +-0.523350301325707810, -0.523307694789839850, -0.523265086945702730, -0.523222477793402810, -0.523179867333046000, -0.523137255564740220, -0.523094642488591390, -0.523052028104705860, +-0.523009412413190320, -0.522966795414151250, -0.522924177107695230, -0.522881557493928620, -0.522838936572958210, -0.522796314344889710, -0.522753690809831140, -0.522711065967888410, +-0.522668439819168000, -0.522625812363776480, -0.522583183601820430, -0.522540553533406340, -0.522497922158640220, -0.522455289477629980, -0.522412655490481550, -0.522370020197301500, +-0.522327383598196420, -0.522284745693272770, -0.522242106482637360, -0.522199465966396660, -0.522156824144656470, -0.522114181017525050, -0.522071536585108190, -0.522028890847512470, +-0.521986243804844490, -0.521943595457210920, -0.521900945804718350, -0.521858294847472700, -0.521815642585582110, -0.521772989019152370, -0.521730334148290060, -0.521687677973102000, +-0.521645020493694770, -0.521602361710174930, -0.521559701622649200, -0.521517040231223470, -0.521474377536005900, -0.521431713537102380, -0.521389048234619620, -0.521346381628664200, +-0.521303713719342810, -0.521261044506762140, -0.521218373991028110, -0.521175702172248960, -0.521133029050530490, -0.521090354625979410, -0.521047678898702520, -0.521005001868806380, +-0.520962323536397820, -0.520919643901583410, -0.520876962964469840, -0.520834280725163130, -0.520791597183771550, -0.520748912340400880, -0.520706226195157940, -0.520663538748149520, +-0.520620849999482100, -0.520578159949261930, -0.520535468597597030, -0.520492775944593530, -0.520450081990358140, -0.520407386734997420, -0.520364690178618310, -0.520321992321327480, +-0.520279293163231630, -0.520236592704437560, -0.520193890945051200, -0.520151187885180890, -0.520108483524932660, -0.520065777864413210, -0.520023070903729350, -0.519980362642987750, +-0.519937653082295230, -0.519894942221757810, -0.519852230061483840, -0.519809516601579370, -0.519766801842150960, -0.519724085783305640, -0.519681368425150110, -0.519638649767791060, +-0.519595929811335510, -0.519553208555889270, -0.519510486001560910, -0.519467762148456250, -0.519425036996682080, -0.519382310546345430, -0.519339582797552990, -0.519296853750411680, +-0.519254123405027300, -0.519211391761508540, -0.519168658819961220, -0.519125924580492230, -0.519083189043208490, -0.519040452208216710, -0.518997714075623780, -0.518954974645536640, +-0.518912233918061290, -0.518869491893306110, -0.518826748571377230, -0.518784003952381450, -0.518741258036425680, -0.518698510823616730, -0.518655762314061520, -0.518613012507866070, +-0.518570261405138950, -0.518527509005986100, -0.518484755310514520, -0.518442000318831140, -0.518399244031042650, -0.518356486447256070, -0.518313727567578320, -0.518270967392116200, +-0.518228205920975850, -0.518185443154265850, -0.518142679092092220, -0.518099913734561880, -0.518057147081781740, -0.518014379133858730, -0.517971609890898970, -0.517928839353011040, +-0.517886067520300970, -0.517843294392875690, -0.517800519970842200, -0.517757744254307430, -0.517714967243378290, -0.517672188938161800, -0.517629409338764780, -0.517586628445293460, +-0.517543846257856320, -0.517501062776559610, -0.517458278001510230, -0.517415491932815110, -0.517372704570581380, -0.517329915914915730, -0.517287125965924630, -0.517244334723716450, +-0.517201542188397420, -0.517158748360074580, -0.517115953238854840, -0.517073156824845230, -0.517030359118152650, -0.516987560118884250, -0.516944759827146160, -0.516901958243046970, +-0.516859155366692910, -0.516816351198190920, -0.516773545737648000, -0.516730738985171300, -0.516687930940867620, -0.516645121604843550, -0.516602310977207320, -0.516559499058065310, +-0.516516685847524530, -0.516473871345692110, -0.516431055552674990, -0.516388238468580170, -0.516345420093514810, -0.516302600427585130, -0.516259779470899740, -0.516216957223564870, +-0.516174133685687650, -0.516131308857375020, -0.516088482738734200, -0.516045655329872120, -0.516002826630895140, -0.515959996641911830, -0.515917165363028560, -0.515874332794352350, +-0.515831498935990340, -0.515788663788049660, -0.515745827350637230, -0.515702989623860190, -0.515660150607825770, -0.515617310302640130, -0.515574468708412060, -0.515531625825247810, +-0.515488781653254400, -0.515445936192539090, -0.515403089443209010, -0.515360241405370290, -0.515317392079131850, -0.515274541464599940, -0.515231689561881590, -0.515188836371084040, +-0.515145981892314530, -0.515103126125679880, -0.515060269071287550, -0.515017410729244450, -0.514974551099657060, -0.514931690182634180, -0.514888827978281950, -0.514845964486707720, +-0.514803099708018520, -0.514760233642321600, -0.514717366289724090, -0.514674497650332460, -0.514631627724255300, -0.514588756511599080, -0.514545884012470920, -0.514503010226978090, +-0.514460135155227700, -0.514417258797327030, -0.514374381153383190, -0.514331502223502660, -0.514288622007794130, -0.514245740506364070, -0.514202857719319620, -0.514159973646767910, +-0.514117088288816420, -0.514074201645572160, -0.514031313717141720, -0.513988424503633580, -0.513945534005154530, -0.513902642221811590, -0.513859749153712020, -0.513816854800963170, +-0.513773959163672080, -0.513731062241946090, -0.513688164035891790, -0.513645264545617760, -0.513602363771230590, -0.513559461712837510, -0.513516558370545770, -0.513473653744462630, +-0.513430747834695330, -0.513387840641350460, -0.513344932164536690, -0.513302022404360620, -0.513259111360929500, -0.513216199034350670, -0.513173285424731280, -0.513130370532178580, +-0.513087454356800140, -0.513044536898702890, -0.513001618157993610, -0.512958698134781120, -0.512915776829171780, -0.512872854241273050, -0.512829930371192180, -0.512787005219036420, +-0.512744078784912460, -0.512701151068929000, -0.512658222071192720, -0.512615291791810870, -0.512572360230890810, -0.512529427388539790, -0.512486493264865280, -0.512443557859974530, +-0.512400621173974890, -0.512357683206972840, -0.512314743959077390, -0.512271803430395130, -0.512228861621033320, -0.512185918531099290, -0.512142974160700650, -0.512100028509943630, +-0.512057081578937370, -0.512014133367788450, -0.511971183876604120, -0.511928233105491850, -0.511885281054558990, -0.511842327723913030, -0.511799373113661080, -0.511756417223910850, +-0.511713460054768700, -0.511670501606343750, -0.511627541878742490, -0.511584580872072480, -0.511541618586440870, -0.511498655021955240, -0.511455690178723050, -0.511412724056850900, +-0.511369756656447570, -0.511326787977619880, -0.511283818020475290, -0.511240846785121160, -0.511197874271664850, -0.511154900480213840, -0.511111925410875690, -0.511068949063756880, +-0.511025971438966440, -0.510982992536611170, -0.510940012356798310, -0.510897030899635450, -0.510854048165230060, -0.510811064153689490, -0.510768078865120550, -0.510725092299632140, +-0.510682104457330980, -0.510639115338324620, -0.510596124942720440, -0.510553133270625900, -0.510510140322148590, -0.510467146097395850, -0.510424150596475390, -0.510381153819493670, +-0.510338155766559830, -0.510295156437780670, -0.510252155833263550, -0.510209153953116170, -0.510166150797445760, -0.510123146366359250, -0.510080140659965650, -0.510037133678371780, +-0.509994125421684990, -0.509951115890012850, -0.509908105083462960, -0.509865093002142780, -0.509822079646159890, -0.509779065015621870, -0.509736049110635300, -0.509693031931309440, +-0.509650013477751070, -0.509606993750067570, -0.509563972748366620, -0.509520950472755700, -0.509477926923341710, -0.509434902100233570, -0.509391876003538190, -0.509348848633363160, +-0.509305819989816060, -0.509262790073004350, -0.509219758883035610, -0.509176726420017540, -0.509133692684057730, -0.509090657675262850, -0.509047621393742040, -0.509004583839602230, +-0.508961545012950990, -0.508918504913895790, -0.508875463542544430, -0.508832420899004380, -0.508789376983382450, -0.508746331795787880, -0.508703285336327580, -0.508660237605108920, +-0.508617188602239700, -0.508574138327827610, -0.508531086781980110, -0.508488033964804800, -0.508444979876408800, -0.508401924516901030, -0.508358867886388400, -0.508315809984978720, +-0.508272750812779450, -0.508229690369898290, -0.508186628656442930, -0.508143565672520280, -0.508100501418239370, -0.508057435893707330, -0.508014369099031530, -0.507971301034319980, +-0.507928231699680040, -0.507885161095219640, -0.507842089221046340, -0.507799016077267740, -0.507755941663990850, -0.507712865981324920, -0.507669789029376760, -0.507626710808254170, +-0.507583631318064720, -0.507540550558916340, -0.507497468530915710, -0.507454385234172190, -0.507411300668792700, -0.507368214834885030, -0.507325127732556780, -0.507282039361915630, +-0.507238949723069490, -0.507195858816125940, -0.507152766641192800, -0.507109673198376850, -0.507066578487787580, -0.507023482509531890, -0.506980385263717360, -0.506937286750452020, +-0.506894186969843340, -0.506851085921998460, -0.506807983607026720, -0.506764880025034950, -0.506721775176130930, -0.506678669060422580, -0.506635561678017490, -0.506592453029023560, +-0.506549343113548380, -0.506506231931699970, -0.506463119483585130, -0.506420005769313230, -0.506376890788991400, -0.506333774542727320, -0.506290657030628810, -0.506247538252803660, +-0.506204418209359570, -0.506161296900403790, -0.506118174326045440, -0.506075050486391790, -0.506031925381550400, -0.505988799011629190, -0.505945671376736070, -0.505902542476978630, +-0.505859412312465010, -0.505816280883301990, -0.505773148189599060, -0.505730014231463240, -0.505686879009002330, -0.505643742522324360, -0.505600604771536900, -0.505557465756748090, +-0.505514325478064740, -0.505471183935596310, -0.505428041129449950, -0.505384897059733550, -0.505341751726554820, -0.505298605130021780, -0.505255457270242130, -0.505212308147323990, +-0.505169157761374170, -0.505126006112502360, -0.505082853200815360, -0.505039699026421320, -0.504996543589428140, -0.504953386889943400, -0.504910228928075360, -0.504867069703930920, +-0.504823909217619550, -0.504780747469248390, -0.504737584458925360, -0.504694420186758470, -0.504651254652855430, -0.504608087857324250, -0.504564919800272960, -0.504521750481809250, +-0.504478579902040480, -0.504435408061076010, -0.504392234959022970, -0.504349060595989380, -0.504305884972083060, -0.504262708087412140, -0.504219529942083630, -0.504176350536207130, +-0.504133169869889650, -0.504089987943239340, -0.504046804756363990, -0.504003620309371620, -0.503960434602370280, -0.503917247635467750, -0.503874059408772170, -0.503830869922390680, +-0.503787679176432750, -0.503744487171005730, -0.503701293906217320, -0.503658099382175760, -0.503614903598988970, -0.503571706556764860, -0.503528508255610800, -0.503485308695636240, +-0.503442107876948320, -0.503398905799655180, -0.503355702463864740, -0.503312497869685130, -0.503269292017224150, -0.503226084906590040, -0.503182876537889840, -0.503139666911233350, +-0.503096456026727700, -0.503053243884480810, -0.503010030484600800, -0.502966815827195820, -0.502923599912373680, -0.502880382740241830, -0.502837164310909860, -0.502793944624484900, +-0.502750723681075100, -0.502707501480788470, -0.502664278023733150, -0.502621053310017050, -0.502577827339748320, -0.502534600113034300, -0.502491371629984580, -0.502448141890706410, +-0.502404910895307810, -0.502361678643897020, -0.502318445136581970, -0.502275210373470890, -0.502231974354670930, -0.502188737080291770, -0.502145498550440880, -0.502102258765226180, +-0.502059017724755920, -0.502015775429138000, -0.501972531878480680, -0.501929287072892080, -0.501886041012480240, -0.501842793697352410, -0.501799545127618480, -0.501756295303385720, +-0.501713044224762150, -0.501669791891856010, -0.501626538304775330, -0.501583283463627570, -0.501540027368522430, -0.501496770019567160, -0.501453511416870000, -0.501410251560539090, +-0.501366990450682450, -0.501323728087408440, -0.501280464470824970, -0.501237199601040410, -0.501193933478162100, -0.501150666102299750, -0.501107397473560700, -0.501064127592053210, +-0.501020856457885300, -0.500977584071165330, -0.500934310432001430, -0.500891035540500850, -0.500847759396773620, -0.500804482000926860, -0.500761203353068950, -0.500717923453308010, +-0.500674642301752290, -0.500631359898509930, -0.500588076243689170, -0.500544791337397490, -0.500501505179744570, -0.500458217770837880, -0.500414929110785670, -0.500371639199696070, +-0.500328348037677450, -0.500285055624837940, -0.500241761961285000, -0.500198467047128450, -0.500155170882475740, -0.500111873467435130, -0.500068574802114750, -0.500025274886623070, +-0.499981973721068060, -0.499938671305558190, -0.499895367640200870, -0.499852062725105850, -0.499808756560380710, -0.499765449146133690, -0.499722140482473040, -0.499678830569507020, +-0.499635519407343960, -0.499592206996091300, -0.499548893335858890, -0.499505578426754250, -0.499462262268885680, -0.499418944862361490, -0.499375626207289870, -0.499332306303779230, +-0.499288985151937760, -0.499245662751873880, -0.499202339103695100, -0.499159014207511190, -0.499115688063429760, -0.499072360671559130, -0.499029032032007550, -0.498985702144883470, +-0.498942371010294260, -0.498899038628350000, -0.498855704999158100, -0.498812370122826920, -0.498769033999464820, -0.498725696629180150, -0.498682358012081220, -0.498639018148276380, +-0.498595677037874050, -0.498552334680981700, -0.498508991077709300, -0.498465646228164470, -0.498422300132455480, -0.498378952790690780, -0.498335604202978620, -0.498292254369427530, +-0.498248903290144980, -0.498205550965240940, -0.498162197394823090, -0.498118842578999690, -0.498075486517879200, -0.498032129211569970, -0.497988770660180440, -0.497945410863818990, +-0.497902049822593230, -0.497858687536613110, -0.497815324005986270, -0.497771959230821180, -0.497728593211226090, -0.497685225947309570, -0.497641857439179990, -0.497598487686945030, +-0.497555116690714560, -0.497511744450596320, -0.497468370966698710, -0.497424996239130220, -0.497381620267999200, -0.497338243053414120, -0.497294864595483440, -0.497251484894314870, +-0.497208103950018300, -0.497164721762701490, -0.497121338332472910, -0.497077953659440910, -0.497034567743714070, -0.496991180585400820, -0.496947792184608830, -0.496904402541448190, +-0.496861011656026470, -0.496817619528452270, -0.496774226158833990, -0.496730831547280150, -0.496687435693899230, -0.496644038598799690, -0.496600640262090110, -0.496557240683878130, +-0.496513839864273830, -0.496470437803384900, -0.496427034501319920, -0.496383629958187360, -0.496340224174095680, -0.496296817149152690, -0.496253408883468420, -0.496209999377150660, +-0.496166588630307880, -0.496123176643048610, -0.496079763415481430, -0.496036348947714810, -0.495992933239857330, -0.495949516292017560, -0.495906098104303140, -0.495862678676824320, +-0.495819258009688790, -0.495775836103005070, -0.495732412956881810, -0.495688988571427510, -0.495645562946750720, -0.495602136082959280, -0.495558707980163270, -0.495515278638470450, +-0.495471848057989490, -0.495428416238828830, -0.495384983181097190, -0.495341548884903120, -0.495298113350355120, -0.495254676577561060, -0.495211238566631130, -0.495167799317673070, +-0.495124358830795530, -0.495080917106107080, -0.495037474143716350, -0.494994029943731930, -0.494950584506261670, -0.494907137831415710, -0.494863689919301910, -0.494820240770028840, +-0.494776790383705200, -0.494733338760439620, -0.494689885900340690, -0.494646431803517030, -0.494602976470076510, -0.494559519900129310, -0.494516062093783290, -0.494472603051147150, +-0.494429142772329520, -0.494385681257439040, -0.494342218506584330, -0.494298754519873260, -0.494255289297416130, -0.494211822839320800, -0.494168355145695850, -0.494124886216650070, +-0.494081416052292060, -0.494037944652730490, -0.493994472018074060, -0.493950998148431460, -0.493907523043910560, -0.493864046704621640, -0.493820569130672630, -0.493777090322172210, +-0.493733610279229020, -0.493690129001951810, -0.493646646490448540, -0.493603162744829400, -0.493559677765202380, -0.493516191551676140, -0.493472704104359390, -0.493429215423360930, +-0.493385725508789450, -0.493342234360753580, -0.493298741979362190, -0.493255248364723120, -0.493211753516946740, -0.493168257436141010, -0.493124760122414570, -0.493081261575876280, +-0.493037761796634780, -0.492994260784798910, -0.492950758540476650, -0.492907255063778190, -0.492863750354811670, -0.492820244413685720, -0.492776737240509190, -0.492733228835390780, +-0.492689719198439350, -0.492646208329763580, -0.492602696229471500, -0.492559182897673530, -0.492515668334477520, -0.492472152539992380, -0.492428635514326860, -0.492385117257589770, +-0.492341597769889840, -0.492298077051335160, -0.492254555102036080, -0.492211031922100580, -0.492167507511637570, -0.492123981870755730, -0.492080454999563930, -0.492036926898171020, +-0.491993397566685750, -0.491949867005216260, -0.491906335213872890, -0.491862802192763630, -0.491819267941997370, -0.491775732461682990, -0.491732195751929220, -0.491688657812844990, +-0.491645118644538360, -0.491601578247119700, -0.491558036620697080, -0.491514493765379370, -0.491470949681275420, -0.491427404368494140, -0.491383857827144280, -0.491340310057334810, +-0.491296761059174580, -0.491253210832771630, -0.491209659378236460, -0.491166106695677170, -0.491122552785202560, -0.491078997646921590, -0.491035441280943120, -0.490991883687375290, +-0.490948324866328500, -0.490904764817910900, -0.490861203542231390, -0.490817641039398900, -0.490774077309522270, -0.490730512352710480, -0.490686946169072380, -0.490643378758716940, +-0.490599810121752240, -0.490556240258288870, -0.490512669168434830, -0.490469096852299110, -0.490425523309990670, -0.490381948541618430, -0.490338372547291350, -0.490294795327117510, +-0.490251216881207490, -0.490207637209669420, -0.490164056312612230, -0.490120474190144930, -0.490076890842376430, -0.490033306269415710, -0.489989720471371740, -0.489946133448352640, +-0.489902545200469050, -0.489858955727829060, -0.489815365030541680, -0.489771773108715890, -0.489728179962460650, -0.489684585591884990, -0.489640989997097100, -0.489597393178207500, +-0.489553795135324380, -0.489510195868556820, -0.489466595378013740, -0.489422993663804210, -0.489379390726037140, -0.489335786564821630, -0.489292181180265850, -0.489248574572480440, +-0.489204966741573540, -0.489161357687654290, -0.489117747410831580, -0.489074135911214570, -0.489030523188912160, -0.488986909244032710, -0.488943294076686740, -0.488899677686982500, +-0.488856060075029130, -0.488812441240935590, -0.488768821184810910, -0.488725199906764220, -0.488681577406904490, -0.488637953685340850, -0.488594328742181560, -0.488550702577537190, +-0.488507075191516090, -0.488463446584227300, -0.488419816755779890, -0.488376185706282940, -0.488332553435844750, -0.488288919944575960, -0.488245285232584810, -0.488201649299980560, +-0.488158012146872100, -0.488114373773368640, -0.488070734179579250, -0.488027093365613010, -0.487983451331579000, -0.487939808077585640, -0.487896163603743550, -0.487852517910160990, +-0.487808870996947200, -0.487765222864211200, -0.487721573512062130, -0.487677922940608350, -0.487634271149960550, -0.487590618140227080, -0.487546963911517080, -0.487503308463939630, +-0.487459651797603980, -0.487415993912619140, -0.487372334809094310, -0.487328674487138680, -0.487285012946860550, -0.487241350188370670, -0.487197686211777450, -0.487154021017189960, +-0.487110354604717470, -0.487066686974469090, -0.487023018126553960, -0.486979348061080510, -0.486935676778159520, -0.486892004277899300, -0.486848330560409050, -0.486804655625798000, +-0.486760979474175290, -0.486717302105650120, -0.486673623520331780, -0.486629943718328520, -0.486586262699751190, -0.486542580464708220, -0.486498897013308780, -0.486455212345662140, +-0.486411526461877460, -0.486367839362063960, -0.486324151046330030, -0.486280461514786540, -0.486236770767541900, -0.486193078804705360, -0.486149385626386100, -0.486105691232693370, +-0.486061995623736420, -0.486018298799624440, -0.485974600760466780, -0.485930901506371800, -0.485887201037450370, -0.485843499353810880, -0.485799796455562700, -0.485756092342815030, +-0.485712387015677090, -0.485668680474257430, -0.485624972718666840, -0.485581263749013840, -0.485537553565407620, -0.485493842167957550, -0.485450129556772910, -0.485406415731962910, +-0.485362700693636910, -0.485318984441904130, -0.485275266976873070, -0.485231548298654670, -0.485187828407357410, -0.485144107303090540, -0.485100384985963420, -0.485056661456085340, +-0.485012936713564820, -0.484969210758512740, -0.484925483591037650, -0.484881755211248820, -0.484838025619255650, -0.484794294815167390, -0.484750562799093400, -0.484706829571142970, +-0.484663095131425470, -0.484619359480049530, -0.484575622617125890, -0.484531884542763190, -0.484488145257070850, -0.484444404760158100, -0.484400663052134310, -0.484356920133108940, +-0.484313176003190400, -0.484269430662489790, -0.484225684111115550, -0.484181936349177110, -0.484138187376783820, -0.484094437194045050, -0.484050685801070250, -0.484006933197968670, +-0.483963179384849010, -0.483919424361822170, -0.483875668128996740, -0.483831910686482180, -0.483788152034387850, -0.483744392172823110, -0.483700631101897430, -0.483656868821719380, +-0.483613105332399870, -0.483569340634047660, -0.483525574726772100, -0.483481807610682600, -0.483438039285888580, -0.483394269752499440, -0.483350499010624660, -0.483306727060373640, +-0.483262953901854970, -0.483219179535179730, -0.483175403960456550, -0.483131627177794840, -0.483087849187304070, -0.483044069989093660, -0.483000289583272350, -0.482956507969951040, +-0.482912725149238440, -0.482868941121244120, -0.482825155886077380, -0.482781369443847750, -0.482737581794664690, -0.482693792938637730, -0.482650002875876230, -0.482606211606488980, +-0.482562419130586950, -0.482518625448278890, -0.482474830559674270, -0.482431034464882560, -0.482387237164013270, -0.482343438657175160, -0.482299638944479140, -0.482255838026034110, +-0.482212035901949440, -0.482168232572334650, -0.482124428037299320, -0.482080622296952920, -0.482036815351404970, -0.481993007200764990, -0.481949197845141670, -0.481905387284646160, +-0.481861575519387190, -0.481817762549474280, -0.481773948375016910, -0.481730132996124720, -0.481686316412907210, -0.481642498625473090, -0.481598679633933550, -0.481554859438397260, +-0.481511038038973880, -0.481467215435772870, -0.481423391628903800, -0.481379566618476310, -0.481335740404599870, -0.481291912987383270, -0.481248084366937720, -0.481204254543371900, +-0.481160423516795500, -0.481116591287318040, -0.481072757855049050, -0.481028923220098210, -0.480985087382574280, -0.480941250342588390, -0.480897412100249390, -0.480853572655666860, +-0.480809732008950390, -0.480765890160209600, -0.480722047109554070, -0.480678202857093450, -0.480634357402937310, -0.480590510747194500, -0.480546662889976160, -0.480502813831391210, +-0.480458963571549210, -0.480415112110559760, -0.480371259448532590, -0.480327405585576460, -0.480283550521802600, -0.480239694257319880, -0.480195836792237930, -0.480151978126666380, +-0.480108118260714870, -0.480064257194493080, -0.480020394928110610, -0.479976531461677180, -0.479932666795301670, -0.479888800929095250, -0.479844933863166790, -0.479801065597626030, +-0.479757196132582610, -0.479713325468146210, -0.479669453604425700, -0.479625580541532310, -0.479581706279575030, -0.479537830818663410, -0.479493954158907280, -0.479450076300416250, +-0.479406197243300030, -0.479362316987668290, -0.479318435533630790, -0.479274552881296390, -0.479230669030776380, -0.479186783982179730, -0.479142897735616140, -0.479099010291195280, +-0.479055121649026860, -0.479011231809220670, -0.478967340771885630, -0.478923448537133030, -0.478879555105071740, -0.478835660475811660, -0.478791764649462380, -0.478747867626133640, +-0.478703969405935290, -0.478660069988977030, -0.478616169375367770, -0.478572267565218870, -0.478528364558639340, -0.478484460355738880, -0.478440554956627240, -0.478396648361414270, +-0.478352740570209660, -0.478308831583122370, -0.478264921400263830, -0.478221010021743000, -0.478177097447669620, -0.478133183678153490, -0.478089268713304370, -0.478045352553232160, +-0.478001435198046500, -0.477957516647856520, -0.477913596902773520, -0.477869675962906470, -0.477825753828365280, -0.477781830499259710, -0.477737905975699540, -0.477693980257794640, +-0.477650053345653970, -0.477606125239389000, -0.477562195939108650, -0.477518265444922870, -0.477474333756941370, -0.477430400875274110, -0.477386466800030770, -0.477342531531321280, +-0.477298595069254710, -0.477254657413942460, -0.477210718565493520, -0.477166778524017790, -0.477122837289625120, -0.477078894862425330, -0.477034951242528320, -0.476991006430043940, +-0.476947060425081280, -0.476903113227751700, -0.476859164838164370, -0.476815215256429170, -0.476771264482655890, -0.476727312516954440, -0.476683359359434680, -0.476639405010206570, +-0.476595449469379150, -0.476551492737063930, -0.476507534813369940, -0.476463575698407080, -0.476419615392285330, -0.476375653895114550, -0.476331691207004580, -0.476287727328064630, +-0.476243762258406140, -0.476199795998138280, -0.476155828547370870, -0.476111859906213960, -0.476067890074777340, -0.476023919053171040, -0.475979946841504910, -0.475935973439888140, +-0.475891998848432200, -0.475848023067246270, -0.475804046096440340, -0.475760067936124240, -0.475716088586407960, -0.475672108047401510, -0.475628126319213970, -0.475584143401956870, +-0.475540159295739450, -0.475496174000671620, -0.475452187516863410, -0.475408199844424670, -0.475364210983465430, -0.475320220934095710, -0.475276229696424580, -0.475232237270563740, +-0.475188243656622270, -0.475144248854710180, -0.475100252864937460, -0.475056255687414110, -0.475012257322250160, -0.474968257769554760, -0.474924257029439520, -0.474880255102013590, +-0.474836251987387050, -0.474792247685669910, -0.474748242196972090, -0.474704235521403730, -0.474660227659074730, -0.474616218610094400, -0.474572208374574310, -0.474528196952623660, +-0.474484184344352580, -0.474440170549870980, -0.474396155569288990, -0.474352139402716590, -0.474308122050263850, -0.474264103512040070, -0.474220083788156780, -0.474176062878723270, +-0.474132040783849570, -0.474088017503645820, -0.474043993038221980, -0.473999967387688240, -0.473955940552154510, -0.473911912531730150, -0.473867883326526800, -0.473823852936653740, +-0.473779821362221080, -0.473735788603338870, -0.473691754660117150, -0.473647719532666040, -0.473603683221094860, -0.473559645725515290, -0.473515607046036570, -0.473471567182768840, +-0.473427526135822170, -0.473383483905306710, -0.473339440491332530, -0.473295395894009760, -0.473251350113447710, -0.473207303149758060, -0.473163255003050180, -0.473119205673434130, +-0.473075155161020110, -0.473031103465918200, -0.472987050588238480, -0.472942996528090350, -0.472898941285585570, -0.472854884860833380, -0.472810827253944020, -0.472766768465027580, +-0.472722708494194230, -0.472678647341554070, -0.472634585007217330, -0.472590521491293320, -0.472546456793893840, -0.472502390915128130, -0.472458323855106500, -0.472414255613939070, +-0.472370186191735990, -0.472326115588607430, -0.472282043804662820, -0.472237970840013840, -0.472193896694769970, -0.472149821369041380, -0.472105744862938210, -0.472061667176570670, +-0.472017588310048970, -0.471973508263483280, -0.471929427036983040, -0.471885344630660060, -0.471841261044623710, -0.471797176278984150, -0.471753090333851710, -0.471709003209336510, +-0.471664914905548790, -0.471620825422598810, -0.471576734760596030, -0.471532642919652130, -0.471488549899876650, -0.471444455701379770, -0.471400360324271740, -0.471356263768662850, +-0.471312166034663300, -0.471268067122383340, -0.471223967031932370, -0.471179865763422300, -0.471135763316962610, -0.471091659692663480, -0.471047554890635160, -0.471003448910988000, +-0.470959341753832190, -0.470915233419277270, -0.470871123907435020, -0.470827013218415020, -0.470782901352327420, -0.470738788309282620, -0.470694674089390810, -0.470650558692762340, +-0.470606442119507420, -0.470562324369735660, -0.470518205443558880, -0.470474085341086590, -0.470429964062429040, -0.470385841607696640, -0.470341717976999580, -0.470297593170448280, +-0.470253467188152140, -0.470209340030223190, -0.470165211696770840, -0.470121082187905490, -0.470076951503737460, -0.470032819644376990, -0.469988686609934480, -0.469944552400520300, +-0.469900417016243910, -0.469856280457217280, -0.469812142723549990, -0.469768003815352280, -0.469723863732734560, -0.469679722475807250, -0.469635580044680530, -0.469591436439464160, +-0.469547291660269980, -0.469503145707207530, -0.469458998580387250, -0.469414850279919470, -0.469370700805914530, -0.469326550158482850, -0.469282398337734830, -0.469238245343780000, +-0.469194091176730330, -0.469149935836695450, -0.469105779323785720, -0.469061621638111550, -0.469017462779783350, -0.468973302748911470, -0.468929141545606330, -0.468884979169977570, +-0.468840815622137140, -0.468796650902194630, -0.468752485010260570, -0.468708317946445240, -0.468664149710859120, -0.468619980303612630, -0.468575809724816220, -0.468531637974579470, +-0.468487465053014420, -0.468443290960230680, -0.468399115696338740, -0.468354939261449000, -0.468310761655671930, -0.468266582879117930, -0.468222402931896760, -0.468178221814120280, +-0.468134039525898270, -0.468089856067341210, -0.468045671438559460, -0.468001485639663540, -0.467957298670763910, -0.467913110531971040, -0.467868921223394570, -0.467824730745146630, +-0.467780539097336860, -0.467736346280075710, -0.467692152293473720, -0.467647957137641350, -0.467603760812689060, -0.467559563318726610, -0.467515364655866020, -0.467471164824217020, +-0.467426963823890150, -0.467382761654995820, -0.467338558317644590, -0.467294353811947010, -0.467250148138013520, -0.467205941295953830, -0.467161733285880120, -0.467117524107902080, +-0.467073313762130240, -0.467029102248675050, -0.466984889567647170, -0.466940675719157040, -0.466896460703314420, -0.466852244520231500, -0.466808027170017900, -0.466763808652784270, +-0.466719588968641070, -0.466675368117698940, -0.466631146100068390, -0.466586922915859960, -0.466542698565183430, -0.466498473048150950, -0.466454246364872320, -0.466410018515458050, +-0.466365789500018720, -0.466321559318664920, -0.466277327971507230, -0.466233095458656210, -0.466188861780221670, -0.466144626936315810, -0.466100390927048300, -0.466056153752529840, +-0.466011915412871010, -0.465967675908182390, -0.465923435238574600, -0.465879193404158180, -0.465834950405043020, -0.465790706241341280, -0.465746460913162740, -0.465702214420618100, +-0.465657966763817880, -0.465613717942872760, -0.465569467957893330, -0.465525216808989450, -0.465480964496273300, -0.465436711019854790, -0.465392456379844440, -0.465348200576353010, +-0.465303943609491010, -0.465259685479369190, -0.465215426186098180, -0.465171165729787780, -0.465126904110550240, -0.465082641328495470, -0.465038377383734100, -0.464994112276376770, +-0.464949846006534220, -0.464905578574316970, -0.464861309979835050, -0.464817040223200580, -0.464772769304523550, -0.464728497223914570, -0.464684223981484400, -0.464639949577343610, +-0.464595674011603010, -0.464551397284373170, -0.464507119395764060, -0.464462840345887920, -0.464418560134854720, -0.464374278762775150, -0.464329996229759790, -0.464285712535919490, +-0.464241427681364950, -0.464197141666206010, -0.464152854490554990, -0.464108566154521840, -0.464064276658217310, -0.464019986001752040, -0.463975694185236820, -0.463931401208782400, +-0.463887107072499420, -0.463842811776497940, -0.463798515320890170, -0.463754217705786180, -0.463709918931296590, -0.463665618997532230, -0.463621317904603760, -0.463577015652622050, +-0.463532712241697790, -0.463488407671940990, -0.463444101943463920, -0.463399795056376630, -0.463355487010789820, -0.463311177806814300, -0.463266867444560860, -0.463222555924140190, +-0.463178243245663200, -0.463133929409239810, -0.463089614414982310, -0.463045298263000840, -0.463000980953406140, -0.462956662486308960, -0.462912342861820090, -0.462868022080050400, +-0.462823700141109850, -0.462779377045110850, -0.462735052792163430, -0.462690727382378380, -0.462646400815866440, -0.462602073092738600, -0.462557744213105470, -0.462513414177078030, +-0.462469082984766300, -0.462424750636282630, -0.462380417131737050, -0.462336082471240470, -0.462291746654903690, -0.462247409682837510, -0.462203071555152780, -0.462158732271959640, +-0.462114391833370440, -0.462070050239495270, -0.462025707490444970, -0.461981363586330350, -0.461937018527262380, -0.461892672313351850, -0.461848324944709620, -0.461803976421445830, +-0.461759626743672880, -0.461715275911500860, -0.461670923925040610, -0.461626570784403110, -0.461582216489699100, -0.461537861041039610, -0.461493504438534710, -0.461449146682296810, +-0.461404787772435990, -0.461360427709063270, -0.461316066492289460, -0.461271704122225460, -0.461227340598982240, -0.461182975922670600, -0.461138610093400790, -0.461094243111285220, +-0.461049874976434070, -0.461005505688958210, -0.460961135248968590, -0.460916763656576130, -0.460872390911891800, -0.460828017015025680, -0.460783641966090280, -0.460739265765195800, +-0.460694888412453150, -0.460650509907973290, -0.460606130251867140, -0.460561749444245660, -0.460517367485219820, -0.460472984374900530, -0.460428600113398030, -0.460384214700824800, +-0.460339828137291020, -0.460295440422907710, -0.460251051557785780, -0.460206661542036210, -0.460162270375770010, -0.460117878059097320, -0.460073484592130770, -0.460029089974980430, +-0.459984694207757450, -0.459940297290572670, -0.459895899223537190, -0.459851500006761950, -0.459807099640357930, -0.459762698124435380, -0.459718295459106920, -0.459673891644482690, +-0.459629486680673720, -0.459585080567791020, -0.459540673305945670, -0.459496264895248590, -0.459451855335810120, -0.459407444627742740, -0.459363032771156750, -0.459318619766163230, +-0.459274205612873130, -0.459229790311397490, -0.459185373861847430, -0.459140956264333880, -0.459096537518967170, -0.459052117625859900, -0.459007696585122360, -0.458963274396865570, +-0.458918851061200620, -0.458874426578238510, -0.458830000948090340, -0.458785574170866350, -0.458741146246679220, -0.458696717175639260, -0.458652286957857480, -0.458607855593445020, +-0.458563423082512910, -0.458518989425172220, -0.458474554621534080, -0.458430118671708740, -0.458385681575808890, -0.458341243333944830, -0.458296803946227680, -0.458252363412768540, +-0.458207921733678470, -0.458163478909068610, -0.458119034939049260, -0.458074589823733060, -0.458030143563230460, -0.457985696157652440, -0.457941247607110250, -0.457896797911714890, +-0.457852347071577510, -0.457807895086809360, -0.457763441957521390, -0.457718987683824020, -0.457674532265830050, -0.457630075703649660, -0.457585617997394110, -0.457541159147174530, +-0.457496699153102090, -0.457452238015287840, -0.457407775733842230, -0.457363312308877950, -0.457318847740505410, -0.457274382028835750, -0.457229915173980150, -0.457185447176049700, +-0.457140978035155690, -0.457096507751409250, -0.457052036324920700, -0.457007563755802870, -0.456963090044166130, -0.456918615190121670, -0.456874139193780670, -0.456829662055254330, +-0.456785183774653820, -0.456740704352089580, -0.456696223787674330, -0.456651742081518540, -0.456607259233733410, -0.456562775244430120, -0.456518290113719920, -0.456473803841713990, +-0.456429316428523520, -0.456384827874258990, -0.456340338179033130, -0.456295847342956470, -0.456251355366140200, -0.456206862248695550, -0.456162367990733730, -0.456117872592365970, +-0.456073376053702790, -0.456028878374856890, -0.455984379555938850, -0.455939879597059840, -0.455895378498331120, -0.455850876259863980, -0.455806372881769620, -0.455761868364159330, +-0.455717362707143580, -0.455672855910835280, -0.455628347975344740, -0.455583838900783410, -0.455539328687262430, -0.455494817334893170, -0.455450304843786850, -0.455405791214053950, +-0.455361276445807370, -0.455316760539157650, -0.455272243494215970, -0.455227725311093730, -0.455183205989902140, -0.455138685530752540, -0.455094163933756230, -0.455049641199024520, +-0.455005117326667930, -0.454960592316799310, -0.454916066169529230, -0.454871538884968950, -0.454827010463229870, -0.454782480904423190, -0.454737950208660370, -0.454693418376051870, +-0.454648885406710610, -0.454604351300747170, -0.454559816058272840, -0.454515279679398920, -0.454470742164236830, -0.454426203512897920, -0.454381663725493490, -0.454337122802134060, +-0.454292580742932660, -0.454248037547999810, -0.454203493217446850, -0.454158947751385160, -0.454114401149926070, -0.454069853413181010, -0.454025304541260550, -0.453980754534277550, +-0.453936203392342750, -0.453891651115567400, -0.453847097704062900, -0.453802543157940660, -0.453757987477312110, -0.453713430662288530, -0.453668872712980620, -0.453624313629501340, +-0.453579753411961220, -0.453535192060471770, -0.453490629575144300, -0.453446065956090270, -0.453401501203421100, -0.453356935317247360, -0.453312368297682070, -0.453267800144835860, +-0.453223230858820160, -0.453178660439746360, -0.453134088887725940, -0.453089516202870300, -0.453044942385290860, -0.453000367435098250, -0.452955791352405550, -0.452911214137323330, +-0.452866635789963110, -0.452822056310436320, -0.452777475698854350, -0.452732893955328670, -0.452688311079969980, -0.452643727072891360, -0.452599141934203360, -0.452554555664017530, +-0.452509968262445330, -0.452465379729598160, -0.452420790065587550, -0.452376199270525030, -0.452331607344521160, -0.452287014287689080, -0.452242420100139430, -0.452197824781983780, +-0.452153228333333550, -0.452108630754300240, -0.452064032044995350, -0.452019432205530420, -0.451974831236016060, -0.451930229136565440, -0.451885625907289260, -0.451841021548299030, +-0.451796416059706220, -0.451751809441622350, -0.451707201694159010, -0.451662592817427600, -0.451617982811538980, -0.451573371676606160, -0.451528759412739900, -0.451484146020051770, +-0.451439531498653290, -0.451394915848655930, -0.451350299070171320, -0.451305681163310160, -0.451261062128185560, -0.451216441964908340, -0.451171820673590020, -0.451127198254342110, +-0.451082574707276250, -0.451037950032503960, -0.450993324230136770, -0.450948697300285470, -0.450904069243063200, -0.450859440058580810, -0.450814809746949760, -0.450770178308281750, +-0.450725545742688250, -0.450680912050280880, -0.450636277231170500, -0.450591641285470130, -0.450547004213290750, -0.450502366014743800, -0.450457726689940940, -0.450413086238993790, +-0.450368444662013870, -0.450323801959112870, -0.450279158130401590, -0.450234513175993220, -0.450189867095998510, -0.450145219890529190, -0.450100571559696790, -0.450055922103612950, +-0.450011271522389340, -0.449966619816136730, -0.449921966984968390, -0.449877313028995090, -0.449832657948328550, -0.449788001743080370, -0.449743344413362170, -0.449698685959285580, +-0.449654026380962300, -0.449609365678503180, -0.449564703852021410, -0.449520040901627890, -0.449475376827434270, -0.449430711629552230, -0.449386045308093340, -0.449341377863169410, +-0.449296709294892020, -0.449252039603372070, -0.449207368788722810, -0.449162696851055090, -0.449118023790480660, -0.449073349607111150, -0.449028674301058310, -0.448983997872433760, +-0.448939320321349200, -0.448894641647915540, -0.448849961852246130, -0.448805280934451770, -0.448760598894644200, -0.448715915732935120, -0.448671231449436270, -0.448626546044259390, +-0.448581859517515280, -0.448537171869317350, -0.448492483099776460, -0.448447793209004410, -0.448403102197112880, -0.448358410064213560, -0.448313716810418210, -0.448269022435838600, +-0.448224326940585620, -0.448179630324772590, -0.448134932588510500, -0.448090233731911090, -0.448045533755086100, -0.448000832658147270, -0.447956130441206410, -0.447911427104374370, +-0.447866722647764560, -0.447822017071487940, -0.447777310375656320, -0.447732602560381390, -0.447687893625774940, -0.447643183571948770, -0.447598472399014680, -0.447553760107083590, +-0.447509046696268840, -0.447464332166681520, -0.447419616518433370, -0.447374899751636190, -0.447330181866401780, -0.447285462862841880, -0.447240742741067510, -0.447196021501192090, +-0.447151299143326630, -0.447106575667582940, -0.447061851074072760, -0.447017125362908000, -0.446972398534200400, -0.446927670588061820, -0.446882941524603280, -0.446838211343938140, +-0.446793480046177530, -0.446748747631433190, -0.446704014099816970, -0.446659279451440680, -0.446614543686416230, -0.446569806804855470, -0.446525068806869320, -0.446480329692571340, +-0.446435589462072510, -0.446390848115484740, -0.446346105652919820, -0.446301362074489670, -0.446256617380306090, -0.446211871570480920, -0.446167124645125370, -0.446122376604352720, +-0.446077627448274170, -0.446032877177001570, -0.445988125790646730, -0.445943373289321600, -0.445898619673138040, -0.445853864942207130, -0.445809109096642340, -0.445764352136554800, +-0.445719594062056410, -0.445674834873258980, -0.445630074570274480, -0.445585313153214810, -0.445540550622191830, -0.445495786977316680, -0.445451022218702860, -0.445406256346461530, +-0.445361489360704520, -0.445316721261543760, -0.445271952049091260, -0.445227181723458820, -0.445182410284757690, -0.445137637733101280, -0.445092864068600770, -0.445048089291368130, +-0.445003313401515280, -0.444958536399154110, -0.444913758284396610, -0.444868979057354730, -0.444824198718139610, -0.444779417266864760, -0.444734634703641380, -0.444689851028581440, +-0.444645066241796840, -0.444600280343399600, -0.444555493333501640, -0.444510705212214140, -0.444465915979650680, -0.444421125635922450, -0.444376334181141420, -0.444331541615419550, +-0.444286747938868800, -0.444241953151601140, -0.444197157253728660, -0.444152360245362480, -0.444107562126616170, -0.444062762897600990, -0.444017962558428900, -0.443973161109211870, +-0.443928358550061960, -0.443883554881091160, -0.443838750102411470, -0.443793944214134100, -0.443749137216372660, -0.443704329109238400, -0.443659519892843300, -0.443614709567299430, +-0.443569898132718740, -0.443525085589213330, -0.443480271936895210, -0.443435457175875620, -0.443390641306268150, -0.443345824328184090, -0.443301006241735520, -0.443256187047034340, +-0.443211366744192760, -0.443166545333322780, -0.443121722814535600, -0.443076899187944910, -0.443032074453661990, -0.442987248611798890, -0.442942421662467610, -0.442897593605780350, +-0.442852764441849070, -0.442807934170785900, -0.442763102792702030, -0.442718270307711270, -0.442673436715924850, -0.442628602017454800, -0.442583766212413240, -0.442538929300912260, +-0.442494091283063990, -0.442449252158979680, -0.442404411928773060, -0.442359570592555370, -0.442314728150438760, -0.442269884602535360, -0.442225039948957180, -0.442180194189816470, +-0.442135347325225250, -0.442090499355294870, -0.442045650280139040, -0.442000800099869080, -0.441955948814597100, -0.441911096424435270, -0.441866242929495720, -0.441821388329890540, +-0.441776532625731080, -0.441731675817131130, -0.441686817904201940, -0.441641958887055710, -0.441597098765804610, -0.441552237540560780, -0.441507375211436290, -0.441462511778543400, +-0.441417647241993450, -0.441372781601900190, -0.441327914858374910, -0.441283047011529870, -0.441238178061477250, -0.441193308008329180, -0.441148436852197790, -0.441103564593195330, +-0.441058691231433210, -0.441013816767025110, -0.440968941200082450, -0.440924064530717470, -0.440879186759042360, -0.440834307885169200, -0.440789427909210330, -0.440744546831277890, +-0.440699664651483250, -0.440654781369940300, -0.440609896986760340, -0.440565011502055680, -0.440520124915938500, -0.440475237228520940, -0.440430348439915350, -0.440385458550233090, +-0.440340567559587950, -0.440295675468091400, -0.440250782275855680, -0.440205887982992980, -0.440160992589615610, -0.440116096095835680, -0.440071198501765570, -0.440026299807516620, +-0.439981400013202740, -0.439936499118935400, -0.439891597124826780, -0.439846694030989140, -0.439801789837534820, -0.439756884544575950, -0.439711978152224130, -0.439667070660593180, +-0.439622162069794490, -0.439577252379940440, -0.439532341591143240, -0.439487429703515230, -0.439442516717168610, -0.439397602632215670, -0.439352687448767990, -0.439307771166939310, +-0.439262853786841270, -0.439217935308586050, -0.439173015732286010, -0.439128095058053450, -0.439083173286000660, -0.439038250416239120, -0.438993326448882730, -0.438948401384043010, +-0.438903475221832320, -0.438858547962362950, -0.438813619605747220, -0.438768690152097410, -0.438723759601525880, -0.438678827954144200, -0.438633895210066180, -0.438588961369403450, +-0.438544026432268310, -0.438499090398773110, -0.438454153269030200, -0.438409215043151890, -0.438364275721250580, -0.438319335303437750, -0.438274393789827350, -0.438229451180531030, +-0.438184507475661010, -0.438139562675329770, -0.438094616779649610, -0.438049669788732890, -0.438004721702692060, -0.437959772521638540, -0.437914822245686450, -0.437869870874947280, +-0.437824918409533470, -0.437779964849557330, -0.437735010195131280, -0.437690054446367720, -0.437645097603378160, -0.437600139666276760, -0.437555180635174960, -0.437510220510185180, +-0.437465259291419880, -0.437420296978991430, -0.437375333573012230, -0.437330369073594680, -0.437285403480850430, -0.437240436794893490, -0.437195469015835450, -0.437150500143788700, +-0.437105530178865720, -0.437060559121178920, -0.437015586970840750, -0.436970613727962750, -0.436925639392659100, -0.436880663965041270, -0.436835687445221830, -0.436790709833313140, +-0.436745731129427720, -0.436700751333677920, -0.436655770446176260, -0.436610788467034380, -0.436565805396366360, -0.436520821234283760, -0.436475835980899170, -0.436430849636324950, +-0.436385862200673600, -0.436340873674057660, -0.436295884056588650, -0.436250893348380800, -0.436205901549545690, -0.436160908660195800, -0.436115914680443690, -0.436070919610401730, +-0.436025923450182540, -0.435980926199898480, -0.435935927859661340, -0.435890928429585160, -0.435845927909781720, -0.435800926300363380, -0.435755923601442770, -0.435710919813132310, +-0.435665914935544630, -0.435620908968791300, -0.435575901912986510, -0.435530893768241940, -0.435485884534670190, -0.435440874212383700, -0.435395862801495000, -0.435350850302116680, +-0.435305836714361240, -0.435260822038341160, -0.435215806274168280, -0.435170789421956640, -0.435125771481818080, -0.435080752453865020, -0.435035732338210130, -0.434990711134965900, +-0.434945688844244890, -0.434900665466158850, -0.434855641000821970, -0.434810615448345980, -0.434765588808843420, -0.434720561082426900, -0.434675532269209020, -0.434630502369302290, +-0.434585471382819280, -0.434540439309871800, -0.434495406150574030, -0.434450371905037710, -0.434405336573375540, -0.434360300155699990, -0.434315262652123670, -0.434270224062759170, +-0.434225184387718340, -0.434180143627115380, -0.434135101781062020, -0.434090058849670950, -0.434045014833054690, -0.433999969731325930, -0.433954923544597190, -0.433909876272981170, +-0.433864827916589700, -0.433819778475536880, -0.433774727949934660, -0.433729676339895620, -0.433684623645532400, -0.433639569866957620, -0.433594515004283920, -0.433549459057623100, +-0.433504402027089450, -0.433459343912794780, -0.433414284714851770, -0.433369224433373060, -0.433324163068471270, -0.433279100620259090, -0.433234037088849110, -0.433188972474353280, +-0.433143906776885800, -0.433098839996558570, -0.433053772133484280, -0.433008703187775510, -0.432963633159544950, -0.432918562048905330, -0.432873489855968570, -0.432828416580848810, +-0.432783342223658050, -0.432738266784508880, -0.432693190263514100, -0.432648112660786340, -0.432603033976438290, -0.432557954210582630, -0.432512873363332110, -0.432467791434798630, +-0.432422708425096390, -0.432377624334337460, -0.432332539162634420, -0.432287452910100070, -0.432242365576847090, -0.432197277162988170, -0.432152187668635280, -0.432107097093902710, +-0.432062005438902390, -0.432016912703747040, -0.431971818888549410, -0.431926723993422300, -0.431881628018478290, -0.431836530963830290, -0.431791432829590090, -0.431746333615872170, +-0.431701233322788370, -0.431656131950451490, -0.431611029498974340, -0.431565925968469540, -0.431520821359049960, -0.431475715670827540, -0.431430608903916600, -0.431385501058429150, +-0.431340392134478000, -0.431295282132175770, -0.431250171051635430, -0.431205058892969620, -0.431159945656291120, -0.431114831341712020, -0.431069715949346620, -0.431024599479306940, +-0.430979481931705770, -0.430934363306655850, -0.430889243604270060, -0.430844122824661170, -0.430799000967941160, -0.430753878034224440, -0.430708754023623020, -0.430663628936249710, +-0.430618502772217360, -0.430573375531638710, -0.430528247214626620, -0.430483117821293950, -0.430437987351752700, -0.430392855806117250, -0.430347723184499650, -0.430302589487012780, +-0.430257454713769420, -0.430212318864882370, -0.430167181940464600, -0.430122043940628030, -0.430076904865487160, -0.430031764715154030, -0.429986623489741540, -0.429941481189362430, +-0.429896337814129610, -0.429851193364156000, -0.429806047839554340, -0.429760901240437590, -0.429715753566917820, -0.429670604819109400, -0.429625454997124510, -0.429580304101076000, +-0.429535152131076740, -0.429489999087239560, -0.429444844969677390, -0.429399689778502290, -0.429354533513828800, -0.429309376175768980, -0.429264217764435680, -0.429219058279941830, +-0.429173897722400390, -0.429128736091924150, -0.429083573388626130, -0.429038409612618300, -0.428993244764015290, -0.428948078842929180, -0.428902911849472880, -0.428857743783759290, +-0.428812574645901330, -0.428767404436011910, -0.428722233154203210, -0.428677060800589760, -0.428631887375283630, -0.428586712878397720, -0.428541537310045130, -0.428496360670338640, +-0.428451182959391220, -0.428406004177315890, -0.428360824324224730, -0.428315643400232320, -0.428270461405450830, -0.428225278339993130, -0.428180094203972290, -0.428134908997501170, +-0.428089722720692790, -0.428044535373659330, -0.427999346956515310, -0.427954157469372930, -0.427908966912345150, -0.427863775285544920, -0.427818582589085280, -0.427773388823079190, +-0.427728193987639620, -0.427682998082878800, -0.427637801108911250, -0.427592603065849170, -0.427547403953805640, -0.427502203772893610, -0.427457002523225990, -0.427411800204915930, +-0.427366596818075540, -0.427321392362819460, -0.427276186839259940, -0.427230980247509880, -0.427185772587682420, -0.427140563859890520, -0.427095354064247200, -0.427050143200865540, +-0.427004931269858500, -0.426959718271338270, -0.426914504205419600, -0.426869289072214660, -0.426824072871836550, -0.426778855604398210, -0.426733637270012680, -0.426688417868793140, +-0.426643197400851710, -0.426597975866303100, -0.426552753265259540, -0.426507529597834110, -0.426462304864139890, -0.426417079064289830, -0.426371852198397130, -0.426326624266574810, +-0.426281395268935100, -0.426236165205592710, -0.426190934076659870, -0.426145701882249760, -0.426100468622475360, -0.426055234297449790, -0.426009998907286140, -0.425964762452096690, +-0.425919524931996140, -0.425874286347096730, -0.425829046697511650, -0.425783805983353970, -0.425738564204736770, -0.425693321361773120, -0.425648077454576170, -0.425602832483258250, +-0.425557586447934070, -0.425512339348715910, -0.425467091185716910, -0.425421841959050140, -0.425376591668828800, -0.425331340315165950, -0.425286087898173960, -0.425240834417967560, +-0.425195579874659110, -0.425150324268361630, -0.425105067599188420, -0.425059809867252500, -0.425014551072667060, -0.424969291215545280, -0.424924030295999400, -0.424878768314144280, +-0.424833505270092230, -0.424788241163956470, -0.424742975995850040, -0.424697709765886220, -0.424652442474178100, -0.424607174120838040, -0.424561904705980870, -0.424516634229718970, +-0.424471362692165450, -0.424426090093433570, -0.424380816433636400, -0.424335541712887230, -0.424290265931299200, -0.424244989088984730, -0.424199711186058540, -0.424154432222633100, +-0.424109152198821560, -0.424063871114737150, -0.424018588970493050, -0.423973305766202510, -0.423928021501978670, -0.423882736177933980, -0.423837449794183310, -0.423792162350838940, +-0.423746873848014180, -0.423701584285822270, -0.423656293664376400, -0.423611001983789760, -0.423565709244175640, -0.423520415445646450, -0.423475120588316990, -0.423429824672299730, +-0.423384527697707960, -0.423339229664654810, -0.423293930573253600, -0.423248630423617600, -0.423203329215859180, -0.423158026950093250, -0.423112723626432260, -0.423067419244989470, +-0.423022113805878120, -0.422976807309211500, -0.422931499755102860, -0.422886191143665490, -0.422840881475011810, -0.422795570749256720, -0.422750258966512690, -0.422704946126893080, +-0.422659632230511060, -0.422614317277479950, -0.422569001267913080, -0.422523684201922880, -0.422478366079624250, -0.422433046901129760, -0.422387726666552610, -0.422342405376006150, +-0.422297083029603670, -0.422251759627458530, -0.422206435169683920, -0.422161109656392470, -0.422115783087699040, -0.422070455463716130, -0.422025126784557110, -0.421979797050335280, +-0.421934466261163930, -0.421889134417156420, -0.421843801518425320, -0.421798467565085430, -0.421753132557249440, -0.421707796495030600, -0.421662459378542300, -0.421617121207897790, +-0.421571781983210490, -0.421526441704593750, -0.421481100372160130, -0.421435757986024510, -0.421390414546299550, -0.421345070053098510, -0.421299724506534800, -0.421254377906721820, +-0.421209030253772820, -0.421163681547801320, -0.421118331788919780, -0.421072980977243220, -0.421027629112884220, -0.420982276195956130, -0.420936922226572310, -0.420891567204846220, +-0.420846211130891270, -0.420800854004820700, -0.420755495826747260, -0.420710136596785860, -0.420664776315049120, -0.420619414981650400, -0.420574052596703160, -0.420528689160320820, +-0.420483324672616730, -0.420437959133703580, -0.420392592543696260, -0.420347224902707480, -0.420301856210850700, -0.420256486468239210, -0.420211115674986540, -0.420165743831206030, +-0.420120370937011210, -0.420074996992514660, -0.420029621997831390, -0.419984245953074100, -0.419938868858356180, -0.419893490713791060, -0.419848111519492250, -0.419802731275573160, +-0.419757349982146420, -0.419711967639327110, -0.419666584247227910, -0.419621199805962240, -0.419575814315643560, -0.419530427776385330, -0.419485040188301020, -0.419439651551504140, +-0.419394261866107340, -0.419348871132225690, -0.419303479349971810, -0.419258086519459280, -0.419212692640801520, -0.419167297714112040, -0.419121901739504310, -0.419076504717091010, +-0.419031106646987230, -0.418985707529305750, -0.418940307364159940, -0.418894906151663360, -0.418849503891929540, -0.418804100585072000, -0.418758696231204150, -0.418713290830438790, +-0.418667884382890990, -0.418622476888673490, -0.418577068347899760, -0.418531658760683380, -0.418486248127137860, -0.418440836447376730, -0.418395423721513500, -0.418350009949660930, +-0.418304595131934080, -0.418259179268445800, -0.418213762359309570, -0.418168344404638900, -0.418122925404547370, -0.418077505359148560, -0.418032084268555980, -0.417986662132882380, +-0.417941238952242890, -0.417895814726750360, -0.417850389456518260, -0.417804963141660210, -0.417759535782289750, -0.417714107378520440, -0.417668677930465030, -0.417623247438238750, +-0.417577815901954360, -0.417532383321725430, -0.417486949697665530, -0.417441515029888300, -0.417396079318507250, -0.417350642563635970, -0.417305204765387290, -0.417259765923876420, +-0.417214326039216150, -0.417168885111520060, -0.417123443140901770, -0.417078000127474870, -0.417032556071352920, -0.416987110972648790, -0.416941664831477710, -0.416896217647952480, +-0.416850769422186680, -0.416805320154294000, -0.416759869844387950, -0.416714418492582280, -0.416668966098990570, -0.416623512663725600, -0.416578058186902630, -0.416532602668634570, +-0.416487146109034980, -0.416441688508217560, -0.416396229866295870, -0.416350770183383620, -0.416305309459593650, -0.416259847695041210, -0.416214384889839200, -0.416168921044101140, +-0.416123456157940830, -0.416077990231471850, -0.416032523264807940, -0.415987055258062680, -0.415941586211348970, -0.415896116124782110, -0.415850644998474960, -0.415805172832541260, +-0.415759699627094530, -0.415714225382248610, -0.415668750098117100, -0.415623273774813730, -0.415577796412451410, -0.415532318011145320, -0.415486838571008490, -0.415441358092154540, +-0.415395876574697230, -0.415350394018750180, -0.415304910424427190, -0.415259425791841890, -0.415213940121107240, -0.415168453412338550, -0.415122965665648710, -0.415077476881151490, +-0.415031987058960550, -0.414986496199189590, -0.414941004301952470, -0.414895511367362020, -0.414850017395533570, -0.414804522386580110, -0.414759026340615290, -0.414713529257752960, +-0.414668031138106800, -0.414622531981790550, -0.414577031788917970, -0.414531530559602010, -0.414486028293957980, -0.414440524992098940, -0.414395020654138580, -0.414349515280190650, +-0.414304008870368940, -0.414258501424787210, -0.414212992943558400, -0.414167483426797990, -0.414121972874618770, -0.414076461287134660, -0.414030948664459440, -0.413985435006706810, +-0.413939920313990570, -0.413894404586424570, -0.413848887824121710, -0.413803370027197470, -0.413757851195764800, -0.413712331329937510, -0.413666810429829390, -0.413621288495554240, +-0.413575765527225860, -0.413530241524957260, -0.413484716488863870, -0.413439190419058630, -0.413393663315655520, -0.413348135178768170, -0.413302606008510540, -0.413257075804996380, +-0.413211544568339470, -0.413166012298652960, -0.413120478996052200, -0.413074944660650260, -0.413029409292560930, -0.412983872891898140, -0.412938335458775620, -0.412892796993307280, +-0.412847257495606910, -0.412801716965787600, -0.412756175403964810, -0.412710632810251610, -0.412665089184761800, -0.412619544527609290, -0.412573998838907880, -0.412528452118771480, +-0.412482904367314000, -0.412437355584648390, -0.412391805770890240, -0.412346254926152570, -0.412300703050549280, -0.412255150144194170, -0.412209596207201270, -0.412164041239684310, +-0.412118485241756480, -0.412072928213533200, -0.412027370155127640, -0.411981811066653660, -0.411936250948225110, -0.411890689799955970, -0.411845127621960070, -0.411799564414351390, +-0.411754000177242950, -0.411708434910750380, -0.411662868614986690, -0.411617301290065800, -0.411571732936101660, -0.411526163553208260, -0.411480593141499370, -0.411435021701088250, +-0.411389449232090310, -0.411343875734618840, -0.411298301208787630, -0.411252725654710660, -0.411207149072501890, -0.411161571462275220, -0.411115992824144630, -0.411070413158223290, +-0.411024832464626680, -0.410979250743468030, -0.410933667994861250, -0.410888084218920260, -0.410842499415759070, -0.410796913585491640, -0.410751326728231110, -0.410705738844093120, +-0.410660149933190720, -0.410614559995638010, -0.410568969031548820, -0.410523377041037250, -0.410477784024217250, -0.410432189981202790, -0.410386594912107050, -0.410340998817045610, +-0.410295401696131660, -0.410249803549479260, -0.410204204377202290, -0.410158604179414850, -0.410113002956230880, -0.410067400707764430, -0.410021797434128640, -0.409976193135439150, +-0.409930587811809190, -0.409884981463352780, -0.409839374090183890, -0.409793765692416600, -0.409748156270164920, -0.409702545823542760, -0.409656934352663480, -0.409611321857642710, +-0.409565708338593570, -0.409520093795630200, -0.409474478228866570, -0.409428861638416740, -0.409383244024394800, -0.409337625386913870, -0.409292005726089760, -0.409246385042035590, +-0.409200763334865490, -0.409155140604693430, -0.409109516851633550, -0.409063892075799910, -0.409018266277306470, -0.408972639456266610, -0.408927011612795930, -0.408881382747007750, +-0.408835752859016130, -0.408790121948935100, -0.408744490016878740, -0.408698857062961160, -0.408653223087295680, -0.408607588089997920, -0.408561952071181180, -0.408516315030959590, +-0.408470676969447170, -0.408425037886758100, -0.408379397783006410, -0.408333756658306240, -0.408288114512770810, -0.408242471346515980, -0.408196827159654940, -0.408151181952301820, +-0.408105535724570760, -0.408059888476575870, -0.408014240208431240, -0.407968590920250230, -0.407922940612148510, -0.407877289284239500, -0.407831636936637210, -0.407785983569455830, +-0.407740329182809560, -0.407694673776812400, -0.407649017351578550, -0.407603359907221410, -0.407557701443856610, -0.407512041961597570, -0.407466381460558470, -0.407420719940853380, +-0.407375057402596500, -0.407329393845902000, -0.407283729270883190, -0.407238063677655860, -0.407192397066333370, -0.407146729437029840, -0.407101060789859530, -0.407055391124936610, +-0.407009720442375160, -0.406964048742289420, -0.406918376024793580, -0.406872702290000940, -0.406827027538027410, -0.406781351768986280, -0.406735674982991790, -0.406689997180158080, +-0.406644318360599390, -0.406598638524429900, -0.406552957671763030, -0.406507275802714560, -0.406461592917397920, -0.406415909015927280, -0.406370224098416890, -0.406324538164980880, +-0.406278851215733590, -0.406233163250789120, -0.406187474270260970, -0.406141784274264950, -0.406096093262914460, -0.406050401236323690, -0.406004708194606990, -0.405959014137878490, +-0.405913319066252440, -0.405867622979842300, -0.405821925878763870, -0.405776227763130660, -0.405730528633056920, -0.405684828488656830, -0.405639127330044650, -0.405593425157334650, +-0.405547721970641100, -0.405502017770077440, -0.405456312555759530, -0.405410606327800850, -0.405364899086315680, -0.405319190831418210, -0.405273481563222790, -0.405227771281843670, +-0.405182059987394320, -0.405136347679990630, -0.405090634359746020, -0.405044920026774890, -0.404999204681191440, -0.404953488323109960, -0.404907770952644740, -0.404862052569910150, +-0.404816333175019580, -0.404770612768089010, -0.404724891349231900, -0.404679168918562540, -0.404633445476195290, -0.404587721022244440, -0.404541995556824240, -0.404496269080048270, +-0.404450541592032420, -0.404404813092890230, -0.404359083582735980, -0.404313353061684090, -0.404267621529848740, -0.404221888987344400, -0.404176155434285310, -0.404130420870785820, +-0.404084685296959460, -0.404038948712922230, -0.403993211118787610, -0.403947472514669950, -0.403901732900683650, -0.403855992276942970, -0.403810250643562350, -0.403764508000655280, +-0.403718764348337760, -0.403673019686723310, -0.403627274015926300, -0.403581527336061120, -0.403535779647242130, -0.403490030949583690, -0.403444281243200140, -0.403398530528205120, +-0.403352778804714540, -0.403307026072842080, -0.403261272332701980, -0.403215517584408770, -0.403169761828076730, -0.403124005063820290, -0.403078247291753010, -0.403032488511990920, +-0.402986728724647640, -0.402940967929837520, -0.402895206127674990, -0.402849443318274440, -0.402803679501750280, -0.402757914678216920, -0.402712148847787940, -0.402666382010579470, +-0.402620614166704970, -0.402574845316278960, -0.402529075459415850, -0.402483304596230050, -0.402437532726835970, -0.402391759851347290, -0.402345985969879970, -0.402300211082547710, +-0.402254435189464910, -0.402208658290746040, -0.402162880386505490, -0.402117101476857750, -0.402071321561917270, -0.402025540641797690, -0.401979758716615070, -0.401933975786483040, +-0.401888191851516090, -0.401842406911828600, -0.401796620967535160, -0.401750834018750110, -0.401705046065587210, -0.401659257108162530, -0.401613467146589630, -0.401567676180983100, +-0.401521884211457400, -0.401476091238126940, -0.401430297261106290, -0.401384502280509920, -0.401338706296452240, -0.401292909309047040, -0.401247111318410340, -0.401201312324655830, +-0.401155512327898090, -0.401109711328251570, -0.401063909325830750, -0.401018106320750190, -0.400972302313123530, -0.400926497303066900, -0.400880691290694040, -0.400834884276119460, +-0.400789076259457700, -0.400743267240823210, -0.400697457220330570, -0.400651646198094290, -0.400605834174228070, -0.400560021148848090, -0.400514207122068030, -0.400468392094002480, +-0.400422576064765940, -0.400376759034472950, -0.400330941003238070, -0.400285121971175050, -0.400239301938400020, -0.400193480905026710, -0.400147658871169710, -0.400101835836943590, +-0.400056011802462860, -0.400010186767842110, -0.399964360733195860, -0.399918533698637950, -0.399872705664284460, -0.399826876630249240, -0.399781046596646820, -0.399735215563591820, +-0.399689383531198760, -0.399643550499582220, -0.399597716468856000, -0.399551881439136280, -0.399506045410536910, -0.399460208383172420, -0.399414370357157380, -0.399368531332606410, +-0.399322691309634100, -0.399276850288355130, -0.399231008268883140, -0.399185165251334520, -0.399139321235822910, -0.399093476222463050, -0.399047630211369460, -0.399001783202656830, +-0.398955935196439740, -0.398910086192831970, -0.398864236191949830, -0.398818385193907110, -0.398772533198818390, -0.398726680206798360, -0.398680826217961640, -0.398634971232422810, +-0.398589115250296610, -0.398543258271696730, -0.398497400296739580, -0.398451541325538890, -0.398405681358209420, -0.398359820394865670, -0.398313958435622400, -0.398268095480594220, +-0.398222231529895830, -0.398176366583641030, -0.398130500641946110, -0.398084633704924970, -0.398038765772692260, -0.397992896845362600, -0.397947026923050730, -0.397901156005871230, +-0.397855284093938890, -0.397809411187367510, -0.397763537286273450, -0.397717662390770500, -0.397671786500973400, -0.397625909616996840, -0.397580031738955510, -0.397534152866964140, +-0.397488273001136540, -0.397442392141589050, -0.397396510288435590, -0.397350627441790890, -0.397304743601769590, -0.397258858768486430, -0.397212972942056150, -0.397167086122593380, +-0.397121198310212140, -0.397075309505028730, -0.397029419707156990, -0.396983528916711740, -0.396937637133807640, -0.396891744358559450, -0.396845850591081910, -0.396799955831488920, +-0.396754060079896890, -0.396708163336419670, -0.396662265601172070, -0.396616366874268770, -0.396570467155824560, -0.396524566445954240, -0.396478664744772450, -0.396432762052393190, +-0.396386858368932840, -0.396340953694505340, -0.396295048029225490, -0.396249141373207990, -0.396203233726567630, -0.396157325089419200, -0.396111415461876670, -0.396065504844056340, +-0.396019593236072330, -0.395973680638039280, -0.395927767050072040, -0.395881852472285410, -0.395835936904794130, -0.395790020347713050, -0.395744102801156020, -0.395698184265239620, +-0.395652264740077700, -0.395606344225785170, -0.395560422722476770, -0.395514500230267300, -0.395468576749271610, -0.395422652279604440, -0.395376726821379810, -0.395330800374714240, +-0.395284872939721590, -0.395238944516516810, -0.395193015105214650, -0.395147084705929960, -0.395101153318777600, -0.395055220943872300, -0.395009287581328140, -0.394963353231261580, +-0.394917417893786650, -0.394871481569018190, -0.394825544257071000, -0.394779605958059940, -0.394733666672099910, -0.394687726399304880, -0.394641785139791310, -0.394595842893673330, +-0.394549899661065680, -0.394503955442083330, -0.394458010236841130, -0.394412064045453810, -0.394366116868036410, -0.394320168704702880, -0.394274219555569740, -0.394228269420751010, +-0.394182318300361660, -0.394136366194516470, -0.394090413103330430, -0.394044459026918310, -0.393998503965394210, -0.393952547918874680, -0.393906590887473820, -0.393860632871306460, +-0.393814673870487520, -0.393768713885131850, -0.393722752915354470, -0.393676790961270170, -0.393630828022993040, -0.393584864100639700, -0.393538899194324220, -0.393492933304161460, +-0.393446966430266390, -0.393400998572753850, -0.393355029731738860, -0.393309059907335500, -0.393263089099660230, -0.393217117308827300, -0.393171144534951560, -0.393125170778147960, +-0.393079196038531480, -0.393033220316216960, -0.392987243611319370, -0.392941265923952900, -0.392895287254234060, -0.392849307602276990, -0.392803326968196640, -0.392757345352107990, +-0.392711362754125990, -0.392665379174365610, -0.392619394612941710, -0.392573409069968570, -0.392527422545562670, -0.392481435039838290, -0.392435446552910240, -0.392389457084893640, +-0.392343466635903360, -0.392297475206054400, -0.392251482795461790, -0.392205489404239660, -0.392159495032504580, -0.392113499680370790, -0.392067503347953260, -0.392021506035366950, +-0.391975507742726880, -0.391929508470148070, -0.391883508217744590, -0.391837506985633240, -0.391791504773928100, -0.391745501582744180, -0.391699497412196560, -0.391653492262400150, +-0.391607486133470020, -0.391561479025521130, -0.391515470938667790, -0.391469461873026560, -0.391423451828711690, -0.391377440805838190, -0.391331428804521100, -0.391285415824875420, +-0.391239401867016170, -0.391193386931057650, -0.391147371017116440, -0.391101354125306830, -0.391055336255743850, -0.391009317408542500, -0.390963297583817810, -0.390917276781684970, +-0.390871255002258890, -0.390825232245653850, -0.390779208511986550, -0.390733183801371290, -0.390687158113922960, -0.390641131449756820, -0.390595103808987820, -0.390549075191731100, +-0.390503045598100840, -0.390457015028213780, -0.390410983482184170, -0.390364950960127130, -0.390318917462157690, -0.390272882988390970, -0.390226847538942050, -0.390180811113926000, +-0.390134773713457120, -0.390088735337652090, -0.390042695986625220, -0.389996655660491690, -0.389950614359366450, -0.389904572083364650, -0.389858528832601470, -0.389812484607191980, +-0.389766439407250420, -0.389720393232893590, -0.389674346084235790, -0.389628297961392140, -0.389582248864477730, -0.389536198793607680, -0.389490147748897120, -0.389444095730461240, +-0.389398042738414270, -0.389351988772873030, -0.389305933833951790, -0.389259877921765750, -0.389213821036429990, -0.389167763178059680, -0.389121704346769960, -0.389075644542675180, +-0.389029583765892140, -0.388983522016535080, -0.388937459294719230, -0.388891395600559740, -0.388845330934171730, -0.388799265295670440, -0.388753198685170940, -0.388707131102787650, +-0.388661062548637360, -0.388614993022834420, -0.388568922525493960, -0.388522851056731230, -0.388476778616661360, -0.388430705205399570, -0.388384630823060180, -0.388338555469760040, +-0.388292479145613490, -0.388246401850735720, -0.388200323585241980, -0.388154244349247450, -0.388108164142867250, -0.388062082966216690, -0.388016000819410070, -0.387969917702564280, +-0.387923833615793750, -0.387877748559213590, -0.387831662532939050, -0.387785575537085310, -0.387739487571767680, -0.387693398637100560, -0.387647308733200690, -0.387601217860182590, +-0.387555126018161440, -0.387509033207252440, -0.387462939427570870, -0.387416844679231990, -0.387370748962350960, -0.387324652277042270, -0.387278554623422750, -0.387232456001606830, +-0.387186356411709790, -0.387140255853846870, -0.387094154328133270, -0.387048051834684330, -0.387001948373615230, -0.386955843945040460, -0.386909738549076900, -0.386863632185838970, +-0.386817524855441960, -0.386771416558001120, -0.386725307293631800, -0.386679197062449190, -0.386633085864568570, -0.386586973700104420, -0.386540860569173640, -0.386494746471890750, +-0.386448631408370990, -0.386402515378729610, -0.386356398383082000, -0.386310280421543360, -0.386264161494228150, -0.386218041601253450, -0.386171920742733600, -0.386125798918783960, +-0.386079676129519770, -0.386033552375056430, -0.385987427655509250, -0.385941301970993470, -0.385895175321623600, -0.385849047707516600, -0.385802919128787000, -0.385756789585550100, +-0.385710659077921240, -0.385664527606015720, -0.385618395169948890, -0.385572261769835280, -0.385526127405791790, -0.385479992077932990, -0.385433855786374180, -0.385387718531230770, +-0.385341580312618060, -0.385295441130651390, -0.385249300985446130, -0.385203159877116840, -0.385157017805780380, -0.385110874771551430, -0.385064730774545280, -0.385018585814877300, +-0.384972439892662890, -0.384926293008017340, -0.384880145161055230, -0.384833996351893640, -0.384787846580647020, -0.384741695847430730, -0.384695544152360290, -0.384649391495550940, +-0.384603237877118140, -0.384557083297177190, -0.384510927755842780, -0.384464771253231810, -0.384418613789458960, -0.384372455364639540, -0.384326295978889010, -0.384280135632322720, +-0.384233974325056130, -0.384187812057204540, -0.384141648828882630, -0.384095484640207430, -0.384049319491293510, -0.384003153382256320, -0.383956986313211230, -0.383910818284273650, +-0.383864649295559020, -0.383818479347182830, -0.383772308439259580, -0.383726136571906350, -0.383679963745237830, -0.383633789959369360, -0.383587615214416420, -0.383541439510494460, +-0.383495262847718900, -0.383449085226204360, -0.383402906646067910, -0.383356727107424240, -0.383310546610388710, -0.383264365155076840, -0.383218182741604020, -0.383171999370085780, +-0.383125815040637530, -0.383079629753373900, -0.383033443508412060, -0.382987256305866550, -0.382941068145852940, -0.382894879028486680, -0.382848688953883190, -0.382802497922157980, +-0.382756305933425740, -0.382710112987803500, -0.382663919085406030, -0.382617724226348770, -0.382571528410747150, -0.382525331638716710, -0.382479133910372970, -0.382432935225831380, +-0.382386735585206640, -0.382340534988615870, -0.382294333436173750, -0.382248130927995810, -0.382201927464197570, -0.382155723044894480, -0.382109517670202130, -0.382063311340235130, +-0.382017104055110630, -0.381970895814943420, -0.381924686619848960, -0.381878476469942830, -0.381832265365340430, -0.381786053306157390, -0.381739840292509240, -0.381693626324510650, +-0.381647411402278810, -0.381601195525928470, -0.381554978695575140, -0.381508760911334340, -0.381462542173321650, -0.381416322481652580, -0.381370101836441930, -0.381323880237806830, +-0.381277657685862030, -0.381231434180723080, -0.381185209722505520, -0.381138984311324980, -0.381092757947296970, -0.381046530630537010, -0.381000302361160780, -0.380954073139282980, +-0.380907842965020780, -0.380861611838488990, -0.380815379759803170, -0.380769146729078910, -0.380722912746431770, -0.380676677811977340, -0.380630441925830400, -0.380584205088108200, +-0.380537967298925470, -0.380491728558397860, -0.380445488866640870, -0.380399248223770190, -0.380353006629901350, -0.380306764085150020, -0.380260520589631000, -0.380214276143461430, +-0.380168030746756200, -0.380121784399630900, -0.380075537102201160, -0.380029288854582540, -0.379983039656890730, -0.379936789509240480, -0.379890538411749080, -0.379844286364531320, +-0.379798033367702850, -0.379751779421379330, -0.379705524525676300, -0.379659268680709480, -0.379613011886594520, -0.379566754143446210, -0.379520495451381780, -0.379474235810516200, +-0.379427975220964940, -0.379381713682843790, -0.379335451196268380, -0.379289187761354290, -0.379242923378216410, -0.379196658046972060, -0.379150391767736070, -0.379104124540624140, +-0.379057856365751840, -0.379011587243234920, -0.378965317173189040, -0.378919046155729860, -0.378872774190972210, -0.378826501279033500, -0.378780227420028480, -0.378733952614072940, +-0.378687676861282520, -0.378641400161772890, -0.378595122515659740, -0.378548843923057990, -0.378502564384084970, -0.378456283898855490, -0.378410002467485350, -0.378363720090090170, +-0.378317436766785700, -0.378271152497687610, -0.378224867282911660, -0.378178581122573580, -0.378132294016788160, -0.378086005965672880, -0.378039716969342580, -0.377993427027912940, +-0.377947136141499770, -0.377900844310218750, -0.377854551534185680, -0.377808257813515350, -0.377761963148325160, -0.377715667538730150, -0.377669370984845930, -0.377623073486788250, +-0.377576775044672910, -0.377530475658615640, -0.377484175328732190, -0.377437874055137460, -0.377391571837948860, -0.377345268677281350, -0.377298964573250680, -0.377252659525972590, +-0.377206353535562870, -0.377160046602137200, -0.377113738725810670, -0.377067429906700560, -0.377021120144921900, -0.376974809440590420, -0.376928497793821930, -0.376882185204732210, +-0.376835871673437020, -0.376789557200052140, -0.376743241784692540, -0.376696925427475680, -0.376650608128516470, -0.376604289887930770, -0.376557970705834360, -0.376511650582342980, +-0.376465329517572500, -0.376419007511637870, -0.376372684564656560, -0.376326360676743520, -0.376280035848014560, -0.376233710078585580, -0.376187383368572270, -0.376141055718090480, +-0.376094727127256110, -0.376048397596184080, -0.376002067124991850, -0.375955735713794480, -0.375909403362707730, -0.375863070071847550, -0.375816735841329630, -0.375770400671269880, +-0.375724064561783310, -0.375677727512987390, -0.375631389524997190, -0.375585050597928520, -0.375538710731897150, -0.375492369927019070, -0.375446028183410050, -0.375399685501185960, +-0.375353341880462650, -0.375306997321355200, -0.375260651823981000, -0.375214305388455240, -0.375167958014893670, -0.375121609703412240, -0.375075260454126760, -0.375028910267153180, +-0.374982559142606480, -0.374936207080604160, -0.374889854081261350, -0.374843500144693920, -0.374797145271017710, -0.374750789460348680, -0.374704432712802630, -0.374658075028495520, +-0.374611716407542430, -0.374565356850060820, -0.374518996356165810, -0.374472634925973380, -0.374426272559599320, -0.374379909257159580, -0.374333545018770030, -0.374287179844545850, +-0.374240813734604550, -0.374194446689061160, -0.374148078708031680, -0.374101709791632040, -0.374055339939978080, -0.374008969153185770, -0.373962597431371060, -0.373916224774649030, +-0.373869851183137260, -0.373823476656950870, -0.373777101196205770, -0.373730724801017930, -0.373684347471503250, -0.373637969207777750, -0.373591590009956450, -0.373545209878157040, +-0.373498828812494580, -0.373452446813085090, -0.373406063880044440, -0.373359680013488630, -0.373313295213533620, -0.373266909480295390, -0.373220522813889070, -0.373174135214432270, +-0.373127746682040130, -0.373081357216828610, -0.373034966818913680, -0.372988575488411360, -0.372942183225437600, -0.372895790030107530, -0.372849395902538850, -0.372803000842846680, +-0.372756604851146980, -0.372710207927555770, -0.372663810072189020, -0.372617411285162790, -0.372571011566593000, -0.372524610916595720, -0.372478209335286080, -0.372431806822781710, +-0.372385403379197840, -0.372338999004650450, -0.372292593699255600, -0.372246187463129210, -0.372199780296387390, -0.372153372199145290, -0.372106963171520590, -0.372060553213628460, +-0.372014142325584940, -0.371967730507506090, -0.371921317759507930, -0.371874904081706430, -0.371828489474217700, -0.371782073937156900, -0.371735657470641740, -0.371689240074787490, +-0.371642821749710080, -0.371596402495525670, -0.371549982312350200, -0.371503561200299810, -0.371457139159489690, -0.371410716190037520, -0.371364292292058580, -0.371317867465668920, +-0.371271441710984530, -0.371225015028121610, -0.371178587417196120, -0.371132158878324180, -0.371085729411620990, -0.371039299017204340, -0.370992867695189410, -0.370946435445692280, +-0.370900002268829130, -0.370853568164715930, -0.370807133133468860, -0.370760697175203100, -0.370714260290036400, -0.370667822478084050, -0.370621383739462180, -0.370574944074286820, +-0.370528503482674130, -0.370482061964740150, -0.370435619520601060, -0.370389176150372030, -0.370342731854170940, -0.370296286632113000, -0.370249840484314360, -0.370203393410891090, +-0.370156945411959370, -0.370110496487635280, -0.370064046638034110, -0.370017595863273650, -0.369971144163469210, -0.369924691538736860, -0.369878237989192840, -0.369831783514953220, +-0.369785328116134130, -0.369738871792851700, -0.369692414545221280, -0.369645956373360670, -0.369599497277385170, -0.369553037257410900, -0.369506576313554050, -0.369460114445930740, +-0.369413651654657170, -0.369367187939849460, -0.369320723301622970, -0.369274257740095480, -0.369227791255382350, -0.369181323847599720, -0.369134855516863810, -0.369088386263290770, +-0.369041916086996770, -0.368995444988097940, -0.368948972966709700, -0.368902500022949830, -0.368856026156933750, -0.368809551368777580, -0.368763075658597510, -0.368716599026509770, +-0.368670121472630560, -0.368623642997075170, -0.368577163599961510, -0.368530683281404980, -0.368484202041521710, -0.368437719880427950, -0.368391236798239870, -0.368344752795073730, +-0.368298267871045690, -0.368251782026271120, -0.368205295260867980, -0.368158807574951560, -0.368112318968638160, -0.368065829442043910, -0.368019338995285160, -0.367972847628477980, +-0.367926355341737900, -0.367879862135182760, -0.367833368008927960, -0.367786872963089760, -0.367740376997784340, -0.367693880113127980, -0.367647382309236940, -0.367600883586227440, +-0.367554383944214910, -0.367507883383317250, -0.367461381903649850, -0.367414879505329030, -0.367368376188471010, -0.367321871953192050, -0.367275366799608370, -0.367228860727835500, +-0.367182353737991240, -0.367135845830191150, -0.367089337004551430, -0.367042827261188360, -0.366996316600218250, -0.366949805021757340, -0.366903292525921910, -0.366856779112827380, +-0.366810264782591770, -0.366763749535330530, -0.366717233371159860, -0.366670716290196150, -0.366624198292555600, -0.366577679378354620, -0.366531159547709370, -0.366484638800735450, +-0.366438117137550760, -0.366391594558270750, -0.366345071063011730, -0.366298546651890100, -0.366252021325022050, -0.366205495082523980, -0.366158967924512140, -0.366112439851102090, +-0.366065910862411750, -0.366019380958556630, -0.365972850139653030, -0.365926318405817350, -0.365879785757165840, -0.365833252193814910, -0.365786717715880010, -0.365740182323479100, +-0.365693646016727770, -0.365647108795742300, -0.365600570660639110, -0.365554031611534440, -0.365507491648544740, -0.365460950771786250, -0.365414408981374620, -0.365367866277427730, +-0.365321322660061230, -0.365274778129391410, -0.365228232685534620, -0.365181686328607260, -0.365135139058725690, -0.365088590876005430, -0.365042041780564540, -0.364995491772518550, +-0.364948940851983820, -0.364902389019076730, -0.364855836273913710, -0.364809282616611050, -0.364762728047285210, -0.364716172566051710, -0.364669616173028620, -0.364623058868331460, +-0.364576500652076640, -0.364529941524380620, -0.364483381485359750, -0.364436820535130380, -0.364390258673808140, -0.364343695901511110, -0.364297132218354860, -0.364250567624455730, +-0.364204002119930200, -0.364157435704894670, -0.364110868379465550, -0.364064300143759230, -0.364017730997891360, -0.363971160941979950, -0.363924589976140690, -0.363878018100489920, +-0.363831445315144160, -0.363784871620219720, -0.363738297015833160, -0.363691721502100830, -0.363645145079138370, -0.363598567747063840, -0.363551989505992930, -0.363505410356042060, +-0.363458830297327620, -0.363412249329966130, -0.363365667454074000, -0.363319084669767760, -0.363272500977162900, -0.363225916376377690, -0.363179330867527630, -0.363132744450729240, +-0.363086157126099040, -0.363039568893753440, -0.362992979753808900, -0.362946389706381050, -0.362899798751588120, -0.362853206889545640, -0.362806614120370190, -0.362760020444178160, +-0.362713425861086070, -0.362666830371210450, -0.362620233974667750, -0.362573636671573660, -0.362527038462046260, -0.362480439346201280, -0.362433839324155180, -0.362387238396024550, +-0.362340636561925780, -0.362294033821975390, -0.362247430176289130, -0.362200825624985120, -0.362154220168179050, -0.362107613805987380, -0.362061006538526740, -0.362014398365913540, +-0.361967789288264400, -0.361921179305695730, -0.361874568418323270, -0.361827956626265270, -0.361781343929637340, -0.361734730328556080, -0.361688115823137980, -0.361641500413499630, +-0.361594884099757490, -0.361548266882027290, -0.361501648760427290, -0.361455029735073150, -0.361408409806081410, -0.361361788973568690, -0.361315167237651500, -0.361268544598446370, +-0.361221921056069870, -0.361175296610637740, -0.361128671262268220, -0.361082045011076990, -0.361035417857180680, -0.360988789800695820, -0.360942160841738970, -0.360895530980426760, +-0.360848900216875660, -0.360802268551201510, -0.360755635983522560, -0.360709002513954440, -0.360662368142613880, -0.360615732869617340, -0.360569096695081530, -0.360522459619122940, +-0.360475821641858210, -0.360429182763403130, -0.360382542983875900, -0.360335902303392300, -0.360289260722068900, -0.360242618240022410, -0.360195974857369370, -0.360149330574226380, +-0.360102685390709220, -0.360056039306936190, -0.360009392323023090, -0.359962744439086490, -0.359916095655243020, -0.359869445971609300, -0.359822795388301970, -0.359776143905437720, +-0.359729491523132220, -0.359682838241503820, -0.359636184060668330, -0.359589528980742370, -0.359542873001842570, -0.359496216124085610, -0.359449558347588130, -0.359402899672465910, +-0.359356240098837270, -0.359309579626818030, -0.359262918256524840, -0.359216255988074380, -0.359169592821583230, -0.359122928757168110, -0.359076263794945730, -0.359029597935031810, +-0.358982931177544710, -0.358936263522600270, -0.358889594970315250, -0.358842925520806160, -0.358796255174189780, -0.358749583930582820, -0.358702911790101000, -0.358656238752862730, +-0.358609564818983930, -0.358562889988581160, -0.358516214261771160, -0.358469537638670680, -0.358422860119396280, -0.358376181704064820, -0.358329502392791990, -0.358282822185696290, +-0.358236141082893530, -0.358189459084500390, -0.358142776190633620, -0.358096092401409880, -0.358049407716945930, -0.358002722137358510, -0.357956035662763410, -0.357909348293279030, +-0.357862660029021280, -0.357815970870106910, -0.357769280816652600, -0.357722589868775090, -0.357675898026591110, -0.357629205290217410, -0.357582511659769840, -0.357535817135366810, +-0.357489121717124270, -0.357442425405158910, -0.357395728199587480, -0.357349030100526710, -0.357302331108093400, -0.357255631222403390, -0.357208930443575160, -0.357162228771724600, +-0.357115526206968510, -0.357068822749423530, -0.357022118399206560, -0.356975413156434270, -0.356928707021223420, -0.356881999993690020, -0.356835292073952430, -0.356788583262126590, +-0.356741873558329310, -0.356695162962677340, -0.356648451475287450, -0.356601739096276460, -0.356555025825760260, -0.356508311663857380, -0.356461596610683660, -0.356414880666355960, +-0.356368163830991120, -0.356321446104705790, -0.356274727487616900, -0.356228007979841170, -0.356181287581494590, -0.356134566292695630, -0.356087844113560260, -0.356041121044205270, +-0.355994397084747450, -0.355947672235303660, -0.355900946495990690, -0.355854219866924500, -0.355807492348223620, -0.355760763940004000, -0.355714034642382490, -0.355667304455475900, +-0.355620573379401010, -0.355573841414274730, -0.355527108560213800, -0.355480374817334300, -0.355433640185754680, -0.355386904665590970, -0.355340168256959970, -0.355293430959978560, +-0.355246692774763620, -0.355199953701431930, -0.355153213740100340, -0.355106472890884870, -0.355059731153904050, -0.355012988529273930, -0.354966245017111330, -0.354919500617533080, +-0.354872755330656100, -0.354826009156597230, -0.354779262095473390, -0.354732514147400480, -0.354685765312497180, -0.354639015590879460, -0.354592264982664160, -0.354545513487968260, +-0.354498761106908530, -0.354452007839601900, -0.354405253686164430, -0.354358498646714650, -0.354311742721368620, -0.354264985910243250, -0.354218228213455390, -0.354171469631122000, +-0.354124710163359890, -0.354077949810286060, -0.354031188572016490, -0.353984426448669790, -0.353937663440361980, -0.353890899547210090, -0.353844134769330910, -0.353797369106841340, +-0.353750602559858410, -0.353703835128498120, -0.353657066812879120, -0.353610297613117410, -0.353563527529329960, -0.353516756561633730, -0.353469984710145570, -0.353423211974982440, +-0.353376438356261310, -0.353329663854098200, -0.353282888468611830, -0.353236112199918180, -0.353189335048134270, -0.353142557013377050, -0.353095778095763420, -0.353048998295410370, +-0.353002217612433940, -0.352955436046952840, -0.352908653599083130, -0.352861870268941780, -0.352815086056645740, -0.352768300962312040, -0.352721514986057530, -0.352674728127999270, +-0.352627940388253350, -0.352581151766938440, -0.352534362264170560, -0.352487571880066850, -0.352440780614744210, -0.352393988468319600, -0.352347195440910030, -0.352300401532631650, +-0.352253606743603060, -0.352206811073940470, -0.352160014523760830, -0.352113217093181220, -0.352066418782318540, -0.352019619591289750, -0.351972819520211980, -0.351926018569202140, +-0.351879216738376410, -0.351832414027853540, -0.351785610437749530, -0.351738805968181580, -0.351692000619266590, -0.351645194391121570, -0.351598387283863560, -0.351551579297608770, +-0.351504770432475850, -0.351457960688581040, -0.351411150066041340, -0.351364338564973730, -0.351317526185495280, -0.351270712927722990, -0.351223898791773960, -0.351177083777764300, +-0.351130267885812810, -0.351083451116035620, -0.351036633468549850, -0.350989814943472420, -0.350942995540920510, -0.350896175261011130, -0.350849354103860420, -0.350802532069587170, +-0.350755709158307620, -0.350708885370138780, -0.350662060705197730, -0.350615235163601550, -0.350568408745467240, -0.350521581450911950, -0.350474753280051840, -0.350427924233005670, +-0.350381094309889730, -0.350334263510821030, -0.350287431835916710, -0.350240599285293770, -0.350193765859069310, -0.350146931557359650, -0.350100096380283440, -0.350053260327957030, +-0.350006423400497480, -0.349959585598021870, -0.349912746920647280, -0.349865907368490820, -0.349819066941669590, -0.349772225640299860, -0.349725383464500440, -0.349678540414387510, +-0.349631696490078250, -0.349584851691689740, -0.349538006019339100, -0.349491159473143460, -0.349444312053219070, -0.349397463759684780, -0.349350614592656760, -0.349303764552252260, +-0.349256913638588300, -0.349210061851782110, -0.349163209191950710, -0.349116355659211340, -0.349069501253681020, -0.349022645975476160, -0.348975789824715550, -0.348928932801515380, +-0.348882074905992930, -0.348835216138265290, -0.348788356498449640, -0.348741495986663040, -0.348694634603021910, -0.348647772347644990, -0.348600909220648680, -0.348554045222150060, +-0.348507180352266350, -0.348460314611114650, -0.348413447998812190, -0.348366580515476140, -0.348319712161222760, -0.348272842936171000, -0.348225972840437050, -0.348179101874138200, +-0.348132230037391630, -0.348085357330314430, -0.348038483753023880, -0.347991609305636270, -0.347944733988270470, -0.347897857801042820, -0.347850980744070560, -0.347804102817470820, +-0.347757224021360830, -0.347710344355857790, -0.347663463821078880, -0.347616582417140500, -0.347569700144161440, -0.347522817002258180, -0.347475932991547890, -0.347429048112147700, +-0.347382162364174960, -0.347335275747746750, -0.347288388262979590, -0.347241499909992260, -0.347194610688901170, -0.347147720599823570, -0.347100829642876640, -0.347053937818177670, +-0.347007045125843790, -0.346960151565992360, -0.346913257138739720, -0.346866361844204770, -0.346819465682503880, -0.346772568653754390, -0.346725670758073420, -0.346678771995578280, +-0.346631872366386210, -0.346584971870613660, -0.346538070508379480, -0.346491168279800140, -0.346444265184992830, -0.346397361224074940, -0.346350456397163610, -0.346303550704376130, +-0.346256644145829800, -0.346209736721641790, -0.346162828431928690, -0.346115919276809290, -0.346069009256400110, -0.346022098370818430, -0.345975186620181510, -0.345928274004606570, +-0.345881360524210980, -0.345834446179111190, -0.345787530969426050, -0.345740614895272140, -0.345693697956766690, -0.345646780154026940, -0.345599861487170260, -0.345552941956313970, +-0.345506021561575280, -0.345459100303070750, -0.345412178180919240, -0.345365255195237310, -0.345318331346142260, -0.345271406633751390, -0.345224481058181990, -0.345177554619551350, +-0.345130627317976000, -0.345083699153574950, -0.345036770126464660, -0.344989840236762440, -0.344942909484585560, -0.344895977870051500, -0.344849045393277430, -0.344802112054380770, +-0.344755177853477980, -0.344708242790688070, -0.344661306866127560, -0.344614370079913800, -0.344567432432164140, -0.344520493922995830, -0.344473554552526320, -0.344426614320872130, +-0.344379673228152160, -0.344332731274483050, -0.344285788459982140, -0.344238844784766740, -0.344191900248954190, -0.344144954852661940, -0.344098008596007250, -0.344051061479106750, +-0.344004113502079430, -0.343957164665041780, -0.343910214968111250, -0.343863264411405190, -0.343816312995041010, -0.343769360719136000, -0.343722407583806730, -0.343675453589172290, +-0.343628498735349230, -0.343581543022454920, -0.343534586450606750, -0.343487629019922140, -0.343440670730518430, -0.343393711582513030, -0.343346751576022510, -0.343299790711166010, +-0.343252828988059980, -0.343205866406821880, -0.343158902967569120, -0.343111938670419110, -0.343064973515489260, -0.343018007502896960, -0.342971040632758790, -0.342924072905193890, +-0.342877104320318820, -0.342830134878250980, -0.342783164579107790, -0.342736193423006650, -0.342689221410065080, -0.342642248540400430, -0.342595274814129320, -0.342548300231370890, +-0.342501324792241710, -0.342454348496859180, -0.342407371345340830, -0.342360393337803990, -0.342313414474366200, -0.342266434755144010, -0.342219454180256620, -0.342172472749820540, +-0.342125490463953350, -0.342078507322772400, -0.342031523326395140, -0.341984538474939090, -0.341937552768521720, -0.341890566207259660, -0.341843578791271970, -0.341796590520675350, +-0.341749601395587240, -0.341702611416125120, -0.341655620582406510, -0.341608628894548790, -0.341561636352668730, -0.341514642956885380, -0.341467648707315440, -0.341420653604076360, +-0.341373657647285670, -0.341326660837060760, -0.341279663173519270, -0.341232664656778590, -0.341185665286955490, -0.341138665064168960, -0.341091663988535800, -0.341044662060173530, +-0.340997659279199560, -0.340950655645731460, -0.340903651159886690, -0.340856645821781990, -0.340809639631536490, -0.340762632589266870, -0.340715624695090700, -0.340668615949125450, +-0.340621606351488690, -0.340574595902297880, -0.340527584601670650, -0.340480572449723570, -0.340433559446575880, -0.340386545592344330, -0.340339530887146360, -0.340292515331099610, +-0.340245498924321540, -0.340198481666929790, -0.340151463559041740, -0.340104444600774270, -0.340057424792246490, -0.340010404133575140, -0.339963382624877800, -0.339916360266272030, +-0.339869337057875310, -0.339822312999805250, -0.339775288092179440, -0.339728262335114550, -0.339681235728729880, -0.339634208273142060, -0.339587179968468770, -0.339540150814827520, +-0.339493120812335900, -0.339446089961111420, -0.339399058261270930, -0.339352025712933660, -0.339304992316216250, -0.339257958071236430, -0.339210922978111670, -0.339163887036959600, +-0.339116850247897840, -0.339069812611043910, -0.339022774126514660, -0.338975734794429330, -0.338928694614904600, -0.338881653588058160, -0.338834611714007580, -0.338787568992870490, +-0.338740525424764460, -0.338693481009806290, -0.338646435748115260, -0.338599389639808120, -0.338552342685002510, -0.338505294883816090, -0.338458246236366390, -0.338411196742771040, +-0.338364146403147770, -0.338317095217613270, -0.338270043186286840, -0.338222990309285320, -0.338175936586726340, -0.338128882018727480, -0.338081826605406480, -0.338034770346880840, +-0.337987713243267480, -0.337940655294685700, -0.337893596501252220, -0.337846536863084800, -0.337799476380301000, -0.337752415053018560, -0.337705352881355060, -0.337658289865428120, +-0.337611226005354700, -0.337564161301254000, -0.337517095753242900, -0.337470029361439110, -0.337422962125960180, -0.337375894046923920, -0.337328825124447840, -0.337281755358649740, +-0.337234684749646460, -0.337187613297557250, -0.337140541002499020, -0.337093467864589440, -0.337046393883946190, -0.336999319060686920, -0.336952243394929410, -0.336905166886791230, +-0.336858089536389350, -0.336811011343843060, -0.336763932309269260, -0.336716852432785600, -0.336669771714509850, -0.336622690154559650, -0.336575607753052670, -0.336528524510105900, +-0.336481440425838660, -0.336434355500367770, -0.336387269733811060, -0.336340183126286110, -0.336293095677910710, -0.336246007388802610, -0.336198918259079490, -0.336151828288858200, +-0.336104737478258200, -0.336057645827396330, -0.336010553336390410, -0.335963460005358040, -0.335916365834417030, -0.335869270823685120, -0.335822174973279210, -0.335775078283318710, +-0.335727980753920460, -0.335680882385202270, -0.335633783177281930, -0.335586683130277060, -0.335539582244305520, -0.335492480519485050, -0.335445377955932490, -0.335398274553767360, +-0.335351170313106520, -0.335304065234067750, -0.335256959316768850, -0.335209852561327510, -0.335162744967861580, -0.335115636536487960, -0.335068527267326060, -0.335021417160492830, +-0.334974306216106080, -0.334927194434283540, -0.334880081815143000, -0.334832968358802330, -0.334785854065379140, -0.334738738934990570, -0.334691622967755950, -0.334644506163792270, +-0.334597388523217300, -0.334550270046148900, -0.334503150732704810, -0.334456030583002830, -0.334408909597160800, -0.334361787775295630, -0.334314665117526890, -0.334267541623971430, +-0.334220417294747110, -0.334173292129971770, -0.334126166129763200, -0.334079039294239210, -0.334031911623517640, -0.333984783117715400, -0.333937653776952110, -0.333890523601344640, +-0.333843392591010870, -0.333796260746068610, -0.333749128066635700, -0.333701994552830010, -0.333654860204768420, -0.333607725022570580, -0.333560589006353440, -0.333513452156234790, +-0.333466314472332490, -0.333419175954764450, -0.333372036603648450, -0.333324896419102350, -0.333277755401243210, -0.333230613550190460, -0.333183470866061200, -0.333136327348973300, +-0.333089182999044550, -0.333042037816392860, -0.332994891801136060, -0.332947744953391190, -0.332900597273277810, -0.332853448760912880, -0.332806299416414380, -0.332759149239900130, +-0.332711998231488000, -0.332664846391295900, -0.332617693719441660, -0.332570540216042380, -0.332523385881217550, -0.332476230715084250, -0.332429074717760400, -0.332381917889363830, +-0.332334760230012460, -0.332287601739824250, -0.332240442418916150, -0.332193282267407800, -0.332146121285416260, -0.332098959473059400, -0.332051796830455100, -0.332004633357721350, +-0.331957469054976030, -0.331910303922337000, -0.331863137959921390, -0.331815971167848780, -0.331768803546236220, -0.331721635095201690, -0.331674465814863040, -0.331627295705338280, +-0.331580124766745200, -0.331532952999201880, -0.331485780402825280, -0.331438606977735080, -0.331391432724048420, -0.331344257641883130, -0.331297081731357190, -0.331249904992588550, +-0.331202727425695180, -0.331155549030794920, -0.331108369808005010, -0.331061189757445030, -0.331014008879232050, -0.330966827173484020, -0.330919644640318920, -0.330872461279854760, +-0.330825277092209440, -0.330778092077500030, -0.330730906235846280, -0.330683719567365250, -0.330636532072174920, -0.330589343750393280, -0.330542154602138260, -0.330494964627527870, +-0.330447773826680060, -0.330400582199711970, -0.330353389746743280, -0.330306196467891060, -0.330259002363273440, -0.330211807433008260, -0.330164611677213560, -0.330117415096007340, +-0.330070217689506730, -0.330023019457831410, -0.329975820401098570, -0.329928620519426170, -0.329881419812932230, -0.329834218281734700, -0.329787015925951670, -0.329739812745701080, +-0.329692608741100120, -0.329645403912268490, -0.329598198259323350, -0.329550991782382670, -0.329503784481564590, -0.329456576356987000, -0.329409367408767970, -0.329362157637024640, +-0.329314947041876800, -0.329267735623441640, -0.329220523381837050, -0.329173310317181220, -0.329126096429592120, -0.329078881719187700, -0.329031666186086150, -0.328984449830404590, +-0.328937232652262710, -0.328890014651777750, -0.328842795829067780, -0.328795576184250820, -0.328748355717444870, -0.328701134428768080, -0.328653912318338460, -0.328606689386273190, +-0.328559465632692060, -0.328512241057712260, -0.328465015661451860, -0.328417789444028880, -0.328370562405561510, -0.328323334546167630, -0.328276105865965510, -0.328228876365072250, +-0.328181646043607610, -0.328134414901688880, -0.328087182939434120, -0.328039950156961410, -0.327992716554388770, -0.327945482131834390, -0.327898246889415430, -0.327851010827251770, +-0.327803773945460510, -0.327756536244159850, -0.327709297723467800, -0.327662058383502540, -0.327614818224382150, -0.327567577246224710, -0.327520335449147440, -0.327473092833270200, +-0.327425849398710280, -0.327378605145585640, -0.327331360074014590, -0.327284114184115070, -0.327236867476005280, -0.327189619949802500, -0.327142371605626480, -0.327095122443594570, +-0.327047872463824830, -0.327000621666435400, -0.326953370051544400, -0.326906117619270020, -0.326858864369730330, -0.326811610303042620, -0.326764355419326750, -0.326717099718700000, +-0.326669843201280450, -0.326622585867186340, -0.326575327716535750, -0.326528068749446840, -0.326480808966036930, -0.326433548366425800, -0.326386286950730850, -0.326339024719070170, +-0.326291761671561880, -0.326244497808324260, -0.326197233129475350, -0.326149967635133380, -0.326102701325415630, -0.326055434200441970, -0.326008166260329750, -0.325960897505197080, +-0.325913627935162150, -0.325866357550343210, -0.325819086350858320, -0.325771814336824890, -0.325724541508362770, -0.325677267865589310, -0.325629993408622700, -0.325582718137581050, +-0.325535442052582670, -0.325488165153745620, -0.325440887441188210, -0.325393608915028550, -0.325346329575384060, -0.325299049422374530, -0.325251768456117420, -0.325204486676730850, +-0.325157204084333130, -0.325109920679042370, -0.325062636460976770, -0.325015351430253780, -0.324968065586993260, -0.324920778931312550, -0.324873491463329890, -0.324826203183163520, +-0.324778914090931630, -0.324731624186752440, -0.324684333470744210, -0.324637041943024280, -0.324589749603712620, -0.324542456452926560, -0.324495162490784420, -0.324447867717404300, +-0.324400572132904570, -0.324353275737403360, -0.324305978531018170, -0.324258680513868800, -0.324211381686072770, -0.324164082047748330, -0.324116781599013640, -0.324069480339987000, +-0.324022178270786660, -0.323974875391530860, -0.323927571702337050, -0.323880267203325130, -0.323832961894612580, -0.323785655776317570, -0.323738348848558450, -0.323691041111453470, +-0.323643732565120910, -0.323596423209678130, -0.323549113045245140, -0.323501802071939400, -0.323454490289879100, -0.323407177699182650, -0.323359864299968210, -0.323312550092354100, +-0.323265235076458660, -0.323217919252399230, -0.323170602620295900, -0.323123285180266010, -0.323075966932427960, -0.323028647876899940, -0.322981328013800310, -0.322934007343247400, +-0.322886685865358620, -0.322839363580253950, -0.322792040488050880, -0.322744716588867660, -0.322697391882822700, -0.322650066370034290, -0.322602740050620670, -0.322555412924700190, +-0.322508084992391200, -0.322460756253811150, -0.322413426709080080, -0.322366096358315420, -0.322318765201635490, -0.322271433239158690, -0.322224100471003310, -0.322176766897287640, +-0.322129432518129200, -0.322082097333648070, -0.322034761343961700, -0.321987424549188380, -0.321940086949446540, -0.321892748544854450, -0.321845409335530520, -0.321798069321593050, +-0.321750728503159560, -0.321703386880350110, -0.321656044453282160, -0.321608701222074130, -0.321561357186844310, -0.321514012347711150, -0.321466666704792960, -0.321419320258207190, +-0.321371973008074020, -0.321324624954510920, -0.321277276097636230, -0.321229926437568370, -0.321182575974425680, -0.321135224708326560, -0.321087872639389370, -0.321040519767731680, +-0.320993166093473500, -0.320945811616732410, -0.320898456337626810, -0.320851100256275060, -0.320803743372795550, -0.320756385687306690, -0.320709027199926000, -0.320661667910773610, +-0.320614307819967080, -0.320566946927624720, -0.320519585233865030, -0.320472222738806380, -0.320424859442567160, -0.320377495345265770, -0.320330130447019860, -0.320282764747949420, +-0.320235398248172100, -0.320188030947806230, -0.320140662846970350, -0.320093293945782730, -0.320045924244361960, -0.319998553742825490, -0.319951182441293500, -0.319903810339883520, +-0.319856437438714060, -0.319809063737903470, -0.319761689237570260, -0.319714313937832780, -0.319666937838809560, -0.319619560940618940, -0.319572183243378600, -0.319524804747208680, +-0.319477425452226740, -0.319430045358551180, -0.319382664466300540, -0.319335282775593250, -0.319287900286547740, -0.319240516999281690, -0.319193132913915100, -0.319145748030565720, +-0.319098362349352020, -0.319050975870392330, -0.319003588593805230, -0.318956200519709190, -0.318908811648222600, -0.318861421979463160, -0.318814031513551030, -0.318766640250603810, +-0.318719248190739990, -0.318671855334078050, -0.318624461680736440, -0.318577067230833680, -0.318529671984487450, -0.318482275941817830, -0.318434879102942550, -0.318387481467980070, +-0.318340083037048920, -0.318292683810267540, -0.318245283787754460, -0.318197882969628140, -0.318150481356006260, -0.318103078947009070, -0.318055675742754170, -0.318008271743360050, +-0.317960866948945260, -0.317913461359628340, -0.317866054975527720, -0.317818647796761110, -0.317771239823448790, -0.317723831055708340, -0.317676421493658270, -0.317629011137417210, +-0.317581599987103560, -0.317534188042835950, -0.317486775304732850, -0.317439361772911990, -0.317391947447493550, -0.317344532328595270, -0.317297116416335620, -0.317249699710833220, +-0.317202282212206590, -0.317154863920574180, -0.317107444836053800, -0.317060024958765670, -0.317012604288827440, -0.316965182826357720, -0.316917760571475080, -0.316870337524298000, +-0.316822913684945080, -0.316775489053534860, -0.316728063630185960, -0.316680637415016010, -0.316633210408145350, -0.316585782609691610, -0.316538354019773480, -0.316490924638509420, +-0.316443494466018050, -0.316396063502418000, -0.316348631747826900, -0.316301199202365050, -0.316253765866150230, -0.316206331739300960, -0.316158896821935930, -0.316111461114173600, +-0.316064024616132640, -0.316016587327931590, -0.315969149249688270, -0.315921710381522890, -0.315874270723553230, -0.315826830275897920, -0.315779389038675530, -0.315731947012004630, +-0.315684504196003910, -0.315637060590791050, -0.315589616196486460, -0.315542171013207750, -0.315494725041073620, -0.315447278280202690, -0.315399830730713590, -0.315352382392724890, +-0.315304933266355230, -0.315257483351722380, -0.315210032648946700, -0.315162581158145880, -0.315115128879438660, -0.315067675812943590, -0.315020221958779380, -0.314972767317064580, +-0.314925311887917000, -0.314877855671457040, -0.314830398667802380, -0.314782940877071760, -0.314735482299383750, -0.314688022934857090, -0.314640562783610360, -0.314593101845762170, +-0.314545640121430440, -0.314498177610735450, -0.314450714313794950, -0.314403250230727740, -0.314355785361652370, -0.314308319706687540, -0.314260853265951930, -0.314213386039563340, +-0.314165918027642100, -0.314118449230306070, -0.314070979647673940, -0.314023509279864330, -0.313976038126995980, -0.313928566189187520, -0.313881093466557680, -0.313833619959224210, +-0.313786145667307560, -0.313738670590925530, -0.313691194730196850, -0.313643718085240160, -0.313596240656174200, -0.313548762443117580, -0.313501283446189110, -0.313453803665506570, +-0.313406323101190380, -0.313358841753358370, -0.313311359622129250, -0.313263876707621740, -0.313216393009954520, -0.313168908529246340, -0.313121423265615870, -0.313073937219181030, +-0.313026450390062160, -0.312978962778377170, -0.312931474384244790, -0.312883985207783710, -0.312836495249112670, -0.312789004508350400, -0.312741512985614760, -0.312694020681026200, +-0.312646527594702570, -0.312599033726762620, -0.312551539077325080, -0.312504043646508690, -0.312456547434432240, -0.312409050441214360, -0.312361552666973070, -0.312314054111828670, +-0.312266554775899210, -0.312219054659303330, -0.312171553762159770, -0.312124052084587380, -0.312076549626704840, -0.312029046388630100, -0.311981542370483590, -0.311934037572383190, +-0.311886531994447770, -0.311839025636795940, -0.311791518499546560, -0.311744010582818420, -0.311696501886730200, -0.311648992411399930, -0.311601482156948000, -0.311553971123492370, +-0.311506459311151840, -0.311458946720045150, -0.311411433350291090, -0.311363919202008400, -0.311316404275315100, -0.311268888570331640, -0.311221372087175980, -0.311173854825966880, +-0.311126336786823110, -0.311078817969863530, -0.311031298375206880, -0.310983778002972000, -0.310936256853276800, -0.310888734926241860, -0.310841212221985020, -0.310793688740625180, +-0.310746164482281150, -0.310698639447071660, -0.310651113635115610, -0.310603587046531740, -0.310556059681438120, -0.310508531539955110, -0.310461002622200830, -0.310413472928294020, +-0.310365942458353530, -0.310318411212498200, -0.310270879190846840, -0.310223346393518280, -0.310175812820630500, -0.310128278472304010, -0.310080743348656870, -0.310033207449807830, +-0.309985670775875800, -0.309938133326979610, -0.309890595103238020, -0.309843056104769140, -0.309795516331693500, -0.309747975784129050, -0.309700434462194640, -0.309652892366009120, +-0.309605349495691410, -0.309557805851360280, -0.309510261433134700, -0.309462716241132580, -0.309415170275474550, -0.309367623536278560, -0.309320076023663510, -0.309272527737748270, +-0.309224978678651730, -0.309177428846492740, -0.309129878241389320, -0.309082326863462100, -0.309034774712828970, -0.308987221789608970, -0.308939668093920930, -0.308892113625883650, +-0.308844558385616140, -0.308797002373237210, -0.308749445588864970, -0.308701888032619940, -0.308654329704620150, -0.308606770604984590, -0.308559210733832080, -0.308511650091281560, +-0.308464088677451900, -0.308416526492461150, -0.308368963536429950, -0.308321399809476370, -0.308273835311719260, -0.308226270043277570, -0.308178704004270170, -0.308131137194816050, +-0.308083569615034080, -0.308036001265042330, -0.307988432144961410, -0.307940862254909460, -0.307893291595005340, -0.307845720165367990, -0.307798147966116320, -0.307750574997369240, +-0.307703001259245770, -0.307655426751863970, -0.307607851475344420, -0.307560275429805240, -0.307512698615365400, -0.307465121032143800, -0.307417542680259390, -0.307369963559831150, +-0.307322383670977970, -0.307274803013817990, -0.307227221588471880, -0.307179639395057660, -0.307132056433694340, -0.307084472704500950, -0.307036888207596340, -0.306989302943099510, +-0.306941716911128540, -0.306894130111804160, -0.306846542545244460, -0.306798954211568390, -0.306751365110894960, -0.306703775243343080, -0.306656184609031820, -0.306608593208080040, +-0.306561001040605960, -0.306513408106730220, -0.306465814406570950, -0.306418219940247150, -0.306370624707877790, -0.306323028709581890, -0.306275431945478400, -0.306227834415685460, +-0.306180236120323800, -0.306132637059511600, -0.306085037233367770, -0.306037436642011330, -0.305989835285561280, -0.305942233164136710, -0.305894630277856520, -0.305847026626838880, +-0.305799422211204600, -0.305751817031071680, -0.305704211086559260, -0.305656604377786300, -0.305608996904871810, -0.305561388667934860, -0.305513779667093590, -0.305466169902468720, +-0.305418559374178440, -0.305370948082341720, -0.305323336027077620, -0.305275723208505210, -0.305228109626743520, -0.305180495281911550, -0.305132880174127430, -0.305085264303512020, +-0.305037647670183430, -0.304990030274260690, -0.304942412115862930, -0.304894793195109090, -0.304847173512118320, -0.304799553067009570, -0.304751931859901130, -0.304704309890913680, +-0.304656687160165420, -0.304609063667775510, -0.304561439413862930, -0.304513814398546690, -0.304466188621945970, -0.304418562084179780, -0.304370934785366310, -0.304323306725626410, +-0.304275677905078150, -0.304228048323840760, -0.304180417982033210, -0.304132786879774690, -0.304085155017184140, -0.304037522394379870, -0.303989889011482610, -0.303942254868610650, +-0.303894619965883070, -0.303846984303418940, -0.303799347881337330, -0.303751710699757370, -0.303704072758798130, -0.303656434058577840, -0.303608794599217360, -0.303561154380834810, +-0.303513513403549430, -0.303465871667480290, -0.303418229172746410, -0.303370585919467030, -0.303322941907760270, -0.303275297137747040, -0.303227651609545570, -0.303180005323274940, +-0.303132358279054330, -0.303084710477002810, -0.303037061917239500, -0.302989412599883550, -0.302941762525053230, -0.302894111692869340, -0.302846460103450180, -0.302798807756914870, +-0.302751154653382480, -0.302703500792972260, -0.302655846175803320, -0.302608190801993860, -0.302560534671664830, -0.302512877784934410, -0.302465220141921790, -0.302417561742746140, +-0.302369902587526610, -0.302322242676382300, -0.302274582009432360, -0.302226920586795180, -0.302179258408591500, -0.302131595474939670, -0.302083931785958880, -0.302036267341768250, +-0.301988602142486910, -0.301940936188234090, -0.301893269479128980, -0.301845602015289820, -0.301797933796837450, -0.301750264823890280, -0.301702595096567490, -0.301654924614988160, +-0.301607253379271520, -0.301559581389536810, -0.301511908645903100, -0.301464235148488750, -0.301416560897414700, -0.301368885892799200, -0.301321210134761540, -0.301273533623420800, +-0.301225856358896260, -0.301178178341307110, -0.301130499570771590, -0.301082820047410720, -0.301035139771342830, -0.300987458742687010, -0.300939776961562600, -0.300892094428088730, +-0.300844411142384640, -0.300796727104569510, -0.300749042314761680, -0.300701356773082130, -0.300653670479649190, -0.300605983434582060, -0.300558295638000020, -0.300510607090022200, +-0.300462917790767840, -0.300415227740355340, -0.300367536938905670, -0.300319845386537110, -0.300272153083368960, -0.300224460029520410, -0.300176766225110750, -0.300129071670259150, +-0.300081376365084860, -0.300033680309706290, -0.299985983504244320, -0.299938285948817440, -0.299890587643544870, -0.299842888588545800, -0.299795188783939510, -0.299747488229845260, +-0.299699786926381440, -0.299652084873668960, -0.299604382071826330, -0.299556678520972730, -0.299508974221227410, -0.299461269172709650, -0.299413563375538700, -0.299365856829833910, +-0.299318149535713560, -0.299270441493298730, -0.299222732702707770, -0.299175023164060030, -0.299127312877474680, -0.299079601843071090, -0.299031890060968420, -0.298984177531286090, +-0.298936464254142440, -0.298888750229658500, -0.298841035457952650, -0.298793319939144260, -0.298745603673352570, -0.298697886660696800, -0.298650168901296360, -0.298602450395270500, +-0.298554731142737670, -0.298507011143818890, -0.298459290398632500, -0.298411568907297970, -0.298363846669934480, -0.298316123686661380, -0.298268399957597960, -0.298220675482862680, +-0.298172950262576560, -0.298125224296858060, -0.298077497585826520, -0.298029770129601250, -0.297982041928301580, -0.297934312982046760, -0.297886583290956130, -0.297838852855148220, +-0.297791121674744030, -0.297743389749862030, -0.297695657080621570, -0.297647923667141990, -0.297600189509542590, -0.297552454607942660, -0.297504718962460780, -0.297456982573217950, +-0.297409245440332700, -0.297361507563924320, -0.297313768944112160, -0.297266029581015560, -0.297218289474753870, -0.297170548625446510, -0.297122807033211920, -0.297075064698171130, +-0.297027321620442710, -0.296979577800145940, -0.296931833237400300, -0.296884087932325010, -0.296836341885039550, -0.296788595095662360, -0.296740847564314510, -0.296693099291114590, +-0.296645350276181890, -0.296597600519635800, -0.296549850021595730, -0.296502098782181030, -0.296454346801511110, -0.296406594079704430, -0.296358840616882170, -0.296311086413162780, +-0.296263331468665680, -0.296215575783510210, -0.296167819357815830, -0.296120062191701890, -0.296072304285286970, -0.296024545638692130, -0.295976786252035940, -0.295929026125437760, +-0.295881265259017030, -0.295833503652893130, -0.295785741307185490, -0.295737978222013480, -0.295690214397496490, -0.295642449833753150, -0.295594684530904540, -0.295546918489069220, +-0.295499151708366600, -0.295451384188916090, -0.295403615930837140, -0.295355846934249100, -0.295308077199270660, -0.295260306726022830, -0.295212535514624230, -0.295164763565194330, +-0.295116990877852480, -0.295069217452718190, -0.295021443289910870, -0.294973668389549860, -0.294925892751753900, -0.294878116376644070, -0.294830339264338880, -0.294782561414957900, +-0.294734782828620480, -0.294687003505446130, -0.294639223445554270, -0.294591442649063510, -0.294543661116094980, -0.294495878846767310, -0.294448095841199910, -0.294400312099512280, +-0.294352527621823900, -0.294304742408254160, -0.294256956458922580, -0.294209169773947790, -0.294161382353450910, -0.294113594197550510, -0.294065805306366220, -0.294018015680017340, +-0.293970225318623490, -0.293922434222304020, -0.293874642391177670, -0.293826849825365500, -0.293779056524986260, -0.293731262490159350, -0.293683467721004290, -0.293635672217640530, +-0.293587875980187650, -0.293540079008765050, -0.293492281303491360, -0.293444482864487880, -0.293396683691873160, -0.293348883785766790, -0.293301083146288170, -0.293253281773556810, +-0.293205479667692280, -0.293157676828813160, -0.293109873257040740, -0.293062068952493650, -0.293014263915291340, -0.292966458145553440, -0.292918651643399310, -0.292870844408948620, +-0.292823036442320770, -0.292775227743635350, -0.292727418313011020, -0.292679608150568980, -0.292631797256427960, -0.292583985630707370, -0.292536173273526880, -0.292488360185005960, +-0.292440546365264060, -0.292392731814420050, -0.292344916532594980, -0.292297100519907650, -0.292249283776477580, -0.292201466302424270, -0.292153648097867310, -0.292105829162926270, +-0.292058009497720590, -0.292010189102369090, -0.291962367976992930, -0.291914546121710860, -0.291866723536642450, -0.291818900221907210, -0.291771076177624710, -0.291723251403914530, +-0.291675425900895350, -0.291627599668688510, -0.291579772707412640, -0.291531945017187320, -0.291484116598132170, -0.291436287450366700, -0.291388457574010500, -0.291340626969183230, +-0.291292795636003470, -0.291244963574592560, -0.291197130785069310, -0.291149297267553180, -0.291101463022163830, -0.291053628049020850, -0.291005792348243750, -0.290957955919951330, +-0.290910118764264870, -0.290862280881303110, -0.290814442271185690, -0.290766602934032110, -0.290718762869962070, -0.290670922079095060, -0.290623080561550780, -0.290575238317447970, +-0.290527395346907910, -0.290479551650049350, -0.290431707226991910, -0.290383862077855210, -0.290336016202758840, -0.290288169601822410, -0.290240322275164770, -0.290192474222907120, +-0.290144625445168280, -0.290096775942067950, -0.290048925713725590, -0.290001074760260990, -0.289953223081793670, -0.289905370678443240, -0.289857517550329460, -0.289809663697571000, +-0.289761809120289260, -0.289713953818602990, -0.289666097792631800, -0.289618241042495390, -0.289570383568313380, -0.289522525370205400, -0.289474666448290290, -0.289426806802689340, +-0.289378946433521360, -0.289331085340906010, -0.289283223524963000, -0.289235360985811870, -0.289187497723572380, -0.289139633738364100, -0.289091769030305920, -0.289043903599519150, +-0.288996037446122620, -0.288948170570236030, -0.288900302971979000, -0.288852434651471200, -0.288804565608832330, -0.288756695844181180, -0.288708825357639140, -0.288660954149325020, +-0.288613082219358550, -0.288565209567859360, -0.288517336194947180, -0.288469462100741590, -0.288421587285362380, -0.288373711748928400, -0.288325835491560930, -0.288277958513378900, +-0.288230080814501970, -0.288182202395049820, -0.288134323255142160, -0.288086443394898690, -0.288038562814438290, -0.287990681513882300, -0.287942799493349670, -0.287894916752959970, +-0.287847033292833010, -0.287799149113088460, -0.287751264213846060, -0.287703378595225430, -0.287655492257345600, -0.287607605200327800, -0.287559717424291040, -0.287511828929355010, +-0.287463939715639330, -0.287416049783263850, -0.287368159132348260, -0.287320267763011390, -0.287272375675374720, -0.287224482869557100, -0.287176589345678300, -0.287128695103857970, +-0.287080800144215940, -0.287032904466871910, -0.286985008071945660, -0.286937110959555990, -0.286889213129824350, -0.286841314582869770, -0.286793415318811860, -0.286745515337770370, +-0.286697614639865150, -0.286649713225215870, -0.286601811093942340, -0.286553908246163390, -0.286506004682000550, -0.286458100401572660, -0.286410195404999570, -0.286362289692400960, +-0.286314383263896630, -0.286266476119606320, -0.286218568259649860, -0.286170659684146120, -0.286122750393216550, -0.286074840386980170, -0.286026929665556600, -0.285979018229065800, +-0.285931106077627390, -0.285883193211361240, -0.285835279630386240, -0.285787365334823910, -0.285739450324793140, -0.285691534600413740, -0.285643618161805560, -0.285595701009088270, +-0.285547783142381770, -0.285499864561805820, -0.285451945267479300, -0.285404025259523800, -0.285356104538058260, -0.285308183103202440, -0.285260260955076170, -0.285212338093799260, +-0.285164414519491480, -0.285116490232271810, -0.285068565232261760, -0.285020639519580340, -0.284972713094347300, -0.284924785956682470, -0.284876858106705650, -0.284828929544536700, +-0.284781000270295460, -0.284733070284100830, -0.284685139586074390, -0.284637208176335090, -0.284589276055002780, -0.284541343222197320, -0.284493409678038430, -0.284445475422646090, +-0.284397540456139130, -0.284349604778639240, -0.284301668390265270, -0.284253731291137180, -0.284205793481374760, -0.284157854961097860, -0.284109915730426320, -0.284061975789479950, +-0.284014035138377810, -0.283966093777241470, -0.283918151706189840, -0.283870208925342870, -0.283822265434820360, -0.283774321234742220, -0.283726376325228240, -0.283678430706398310, +-0.283630484378371520, -0.283582537341269310, -0.283534589595210770, -0.283486641140315740, -0.283438691976704130, -0.283390742104495770, -0.283342791523810590, -0.283294840234768420, +-0.283246888237488280, -0.283198935532091740, -0.283150982118697940, -0.283103027997426650, -0.283055073168397790, -0.283007117631731200, -0.282959161387546900, -0.282911204435963790, +-0.282863246777103510, -0.282815288411085160, -0.282767329338028560, -0.282719369558053660, -0.282671409071280300, -0.282623447877828450, -0.282575485977817950, -0.282527523371367880, +-0.282479560058599920, -0.282431596039632970, -0.282383631314587100, -0.282335665883582110, -0.282287699746738010, -0.282239732904174590, -0.282191765356011040, -0.282143797102368920, +-0.282095828143367260, -0.282047858479126060, -0.281999888109765230, -0.281951917035404680, -0.281903945256164300, -0.281855972772164120, -0.281807999583523090, -0.281760025690362960, +-0.281712051092802730, -0.281664075790962420, -0.281616099784961880, -0.281568123074921070, -0.281520145660960010, -0.281472167543197700, -0.281424188721755840, -0.281376209196753490, +-0.281328228968310610, -0.281280248036547220, -0.281232266401583160, -0.281184284063538400, -0.281136301022533010, -0.281088317278685940, -0.281040332832118990, -0.280992347682951170, +-0.280944361831302500, -0.280896375277292890, -0.280848388021042390, -0.280800400062670870, -0.280752411402298400, -0.280704422040044030, -0.280656431976029460, -0.280608441210373820, +-0.280560449743197050, -0.280512457574619180, -0.280464464704760160, -0.280416471133739960, -0.280368476861678590, -0.280320481888695180, -0.280272486214911410, -0.280224489840446460, +-0.280176492765420280, -0.280128494989952850, -0.280080496514164170, -0.280032497338174260, -0.279984497462102240, -0.279936496886069860, -0.279888495610196190, -0.279840493634601340, +-0.279792490959405230, -0.279744487584727860, -0.279696483510689320, -0.279648478737409560, -0.279600473265007750, -0.279552467093605590, -0.279504460223322260, -0.279456452654277820, +-0.279408444386592240, -0.279360435420385520, -0.279312425755777750, -0.279264415392887990, -0.279216404331838140, -0.279168392572747230, -0.279120380115735310, -0.279072366960922470, +-0.279024353108428710, -0.278976338558374060, -0.278928323310878580, -0.278880307366061450, -0.278832290724044420, -0.278784273384946600, -0.278736255348888130, -0.278688236615989020, +-0.278640217186369330, -0.278592197060149090, -0.278544176237447480, -0.278496154718386290, -0.278448132503084760, -0.278400109591662840, -0.278352085984240660, -0.278304061680938300, +-0.278256036681875760, -0.278208010987173130, -0.278159984596949630, -0.278111957511327000, -0.278063929730424490, -0.278015901254362150, -0.277967872083260070, -0.277919842217238310, +-0.277871811656416940, -0.277823780400916040, -0.277775748450854840, -0.277727715806355080, -0.277679682467536050, -0.277631648434517870, -0.277583613707420520, -0.277535578286364160, +-0.277487542171468820, -0.277439505362854670, -0.277391467860640840, -0.277343429664949240, -0.277295390775899040, -0.277247351193610380, -0.277199310918203380, -0.277151269949798050, +-0.277103228288514580, -0.277055185934472150, -0.277007142887792600, -0.276959099148595230, -0.276911054717000120, -0.276863009593127320, -0.276814963777097020, -0.276766917269029360, +-0.276718870069044330, -0.276670822177261360, -0.276622773593802110, -0.276574724318785940, -0.276526674352332970, -0.276478623694563330, -0.276430572345597150, -0.276382520305554490, +-0.276334467574554710, -0.276286414152719590, -0.276238360040168440, -0.276190305237021370, -0.276142249743398570, -0.276094193559420110, -0.276046136685206220, -0.275998079120876980, +-0.275950020866551630, -0.275901961922352110, -0.275853902288397730, -0.275805841964808560, -0.275757780951704780, -0.275709719249206560, -0.275661656857434050, -0.275613593776506520, +-0.275565530006545880, -0.275517465547671370, -0.275469400400003230, -0.275421334563661580, -0.275373268038766610, -0.275325200825438490, -0.275277132923797350, -0.275229064333962490, +-0.275180995056055870, -0.275132925090196710, -0.275084854436505270, -0.275036783095101710, -0.274988711066106170, -0.274940638349638830, -0.274892564945819930, -0.274844490854768750, +-0.274796416076607210, -0.274748340611454640, -0.274700264459431190, -0.274652187620657070, -0.274604110095252540, -0.274556031883337660, -0.274507952985032780, -0.274459873400457080, +-0.274411793129732630, -0.274363712172978670, -0.274315630530315380, -0.274267548201863050, -0.274219465187741870, -0.274171381488072020, -0.274123297102972840, -0.274075212032566300, +-0.274027126276971680, -0.273979039836309280, -0.273930952710699280, -0.273882864900261920, -0.273834776405117330, -0.273786687225385850, -0.273738597361186830, -0.273690506812642120, +-0.273642415579871120, -0.273594323662994130, -0.273546231062131330, -0.273498137777402950, -0.273450043808929180, -0.273401949156829530, -0.273353853821225790, -0.273305757802237430, +-0.273257661099984670, -0.273209563714587770, -0.273161465646167000, -0.273113366894842500, -0.273065267460734620, -0.273017167343962700, -0.272969066544648750, -0.272920965062912080, +-0.272872862898873030, -0.272824760052651830, -0.272776656524368720, -0.272728552314143950, -0.272680447422096960, -0.272632341848349720, -0.272584235593021640, -0.272536128656232950, +-0.272488021038103880, -0.272439912738754840, -0.272391803758305960, -0.272343694096877640, -0.272295583754589180, -0.272247472731562630, -0.272199361027917360, -0.272151248643773770, +-0.272103135579251980, -0.272055021834472390, -0.272006907409555240, -0.271958792304620830, -0.271910676519788560, -0.271862560055180450, -0.271814442910916000, -0.271766325087115400, +-0.271718206583898950, -0.271670087401387040, -0.271621967539699860, -0.271573846998957810, -0.271525725779280300, -0.271477603880789290, -0.271429481303604280, -0.271381358047845580, +-0.271333234113633470, -0.271285109501088250, -0.271236984210330320, -0.271188858241479040, -0.271140731594656460, -0.271092604269982050, -0.271044476267576160, -0.270996347587559030, +-0.270948218230051110, -0.270900088195172580, -0.270851957483043860, -0.270803826093784340, -0.270755694027516150, -0.270707561284358740, -0.270659427864432420, -0.270611293767857470, +-0.270563158994754360, -0.270515023545243320, -0.270466887419443860, -0.270418750617478050, -0.270370613139465370, -0.270322474985526200, -0.270274336155780780, -0.270226196650349530, +-0.270178056469352780, -0.270129915612910890, -0.270081774081143370, -0.270033631874172290, -0.269985488992117110, -0.269937345435098170, -0.269889201203235900, -0.269841056296650670, +-0.269792910715462740, -0.269744764459791670, -0.269696617529759600, -0.269648469925485970, -0.269600321647091130, -0.269552172694695500, -0.269504023068419470, -0.269455872768383340, +-0.269407721794707570, -0.269359570147511610, -0.269311417826917590, -0.269263264833045020, -0.269215111166014320, -0.269166956825945770, -0.269118801812959880, -0.269070646127176960, +-0.269022489768716620, -0.268974332737700880, -0.268926175034249320, -0.268878016658482270, -0.268829857610520250, -0.268781697890483560, -0.268733537498492600, -0.268685376434667830, +-0.268637214699129600, -0.268589052291997480, -0.268540889213393590, -0.268492725463437440, -0.268444561042249560, -0.268396395949950180, -0.268348230186659880, -0.268300063752498990, +-0.268251896647587080, -0.268203728872046300, -0.268155560425996140, -0.268107391309557130, -0.268059221522849670, -0.268011051065994100, -0.267962879939110890, -0.267914708142320550, +-0.267866535675742530, -0.267818362539499030, -0.267770188733709670, -0.267722014258494790, -0.267673839113974850, -0.267625663300270380, -0.267577486817501710, -0.267529309665788470, +-0.267481131845252850, -0.267432953356014360, -0.267384774198193510, -0.267336594371910710, -0.267288413877286410, -0.267240232714441080, -0.267192050883495180, -0.267143868384568330, +-0.267095685217782650, -0.267047501383257720, -0.266999316881114060, -0.266951131711472110, -0.266902945874452290, -0.266854759370175170, -0.266806572198760250, -0.266758384360329780, +-0.266710195855003330, -0.266662006682901410, -0.266613816844144480, -0.266565626338853000, -0.266517435167147430, -0.266469243329148290, -0.266421050824975190, -0.266372857654750330, +-0.266324663818593320, -0.266276469316624630, -0.266228274148964770, -0.266180078315734260, -0.266131881817053490, -0.266083684653042220, -0.266035486823822550, -0.265987288329514180, +-0.265939089170237620, -0.265890889346113320, -0.265842688857261760, -0.265794487703803540, -0.265746285885859020, -0.265698083403548890, -0.265649880256992600, -0.265601676446312500, +-0.265553471971628210, -0.265505266833060250, -0.265457061030729140, -0.265408854564755330, -0.265360647435259440, -0.265312439642361010, -0.265264231186182360, -0.265216022066843190, +-0.265167812284463900, -0.265119601839165110, -0.265071390731067280, -0.265023178960290980, -0.264974966526956790, -0.264926753431184270, -0.264878539673095710, -0.264830325252810860, +-0.264782110170450170, -0.264733894426134210, -0.264685678019983490, -0.264637460952118600, -0.264589243222659200, -0.264541024831727530, -0.264492805779443290, -0.264444586065927080, +-0.264396365691299370, -0.264348144655680740, -0.264299922959191750, -0.264251700601952970, -0.264203477584084080, -0.264155253905707380, -0.264107029566942490, -0.264058804567910090, +-0.264010578908730590, -0.263962352589524720, -0.263914125610412940, -0.263865897971515000, -0.263817669672953170, -0.263769440714847150, -0.263721211097317550, -0.263672980820484900, +-0.263624749884469820, -0.263576518289392820, -0.263528286035374590, -0.263480053122534750, -0.263431819550995650, -0.263383585320876970, -0.263335350432299390, -0.263287114885383370, +-0.263238878680249590, -0.263190641817018620, -0.263142404295810150, -0.263094166116746580, -0.263045927279947580, -0.262997687785533730, -0.262949447633625650, -0.262901206824344040, +-0.262852965357809330, -0.262804723234142220, -0.262756480453463340, -0.262708237015892350, -0.262659992921551680, -0.262611748170560990, -0.262563502763040910, -0.262515256699112130, +-0.262467009978895160, -0.262418762602510680, -0.262370514570078480, -0.262322265881720810, -0.262274016537557440, -0.262225766537709070, -0.262177515882296320, -0.262129264571439700, +-0.262081012605260010, -0.262032759983877710, -0.261984506707412690, -0.261936252775987250, -0.261887998189721190, -0.261839742948735130, -0.261791487053149700, -0.261743230503085570, +-0.261694973298663370, -0.261646715440002840, -0.261598456927226390, -0.261550197760453850, -0.261501937939805750, -0.261453677465402820, -0.261405416337365750, -0.261357154555815100, +-0.261308892120871550, -0.261260629032654900, -0.261212365291287550, -0.261164100896889300, -0.261115835849580810, -0.261067570149482730, -0.261019303796715670, -0.260971036791400430, +-0.260922769133656700, -0.260874500823606860, -0.260826231861370830, -0.260777962247069230, -0.260729691980822690, -0.260681421062751940, -0.260633149492977610, -0.260584877271620440, +-0.260536604398800160, -0.260488330874639300, -0.260440056699257570, -0.260391781872775730, -0.260343506395314390, -0.260295230266994300, -0.260246953487936140, -0.260198676058259750, +-0.260150397978087530, -0.260102119247539290, -0.260053839866735800, -0.260005559835797650, -0.259957279154845620, -0.259908997824000400, -0.259860715843382720, -0.259812433213113200, +-0.259764149933311760, -0.259715866004100790, -0.259667581425600150, -0.259619296197930620, -0.259571010321212770, -0.259522723795567460, -0.259474436621115300, -0.259426148797976150, +-0.259377860326272580, -0.259329571206124270, -0.259281281437652110, -0.259232991020976690, -0.259184699956218790, -0.259136408243499210, -0.259088115882938560, -0.259039822874656770, +-0.258991529218776270, -0.258943234915416930, -0.258894939964699530, -0.258846644366744760, -0.258798348121673400, -0.258750051229606150, -0.258701753690662950, -0.258653455504966210, +-0.258605156672635840, -0.258556857193792570, -0.258508557068557130, -0.258460256297050330, -0.258411954879392840, -0.258363652815705500, -0.258315350106108180, -0.258267046750723320, +-0.258218742749670880, -0.258170438103071550, -0.258122132811046120, -0.258073826873715380, -0.258025520291200070, -0.257977213063620090, -0.257928905191097960, -0.257880596673753570, +-0.257832287511707670, -0.257783977705081050, -0.257735667253994440, -0.257687356158568750, -0.257639044418924600, -0.257590732035182010, -0.257542419007463440, -0.257494105335888850, +-0.257445791020578960, -0.257397476061654640, -0.257349160459236560, -0.257300844213445620, -0.257252527324401740, -0.257204209792227360, -0.257155891617042440, -0.257107572798967840, +-0.257059253338124290, -0.257010933234632590, -0.256962612488613570, -0.256914291100187990, -0.256865969069475840, -0.256817646396599650, -0.256769323081679320, -0.256720999124835700, +-0.256672674526189580, -0.256624349285861750, -0.256576023403973060, -0.256527696880644360, -0.256479369715995500, -0.256431041910149090, -0.256382713463225050, -0.256334384375344280, +-0.256286054646627510, -0.256237724277195660, -0.256189393267169440, -0.256141061616669720, -0.256092729325816560, -0.256044396394732370, -0.255996062823537210, -0.255947728612351880, +-0.255899393761297280, -0.255851058270494150, -0.255802722140063390, -0.255754385370124960, -0.255706047960801430, -0.255657709912212760, -0.255609371224479850, -0.255561031897723500, +-0.255512691932064550, -0.255464351327623910, -0.255416010084522360, -0.255367668202879930, -0.255319325682819180, -0.255270982524460120, -0.255222638727923610, -0.255174294293330490, +-0.255125949220801670, -0.255077603510457940, -0.255029257162419360, -0.254980910176808520, -0.254932562553745360, -0.254884214293350840, -0.254835865395745760, -0.254787515861051030, +-0.254739165689387480, -0.254690814880876030, -0.254642463435636680, -0.254594111353792010, -0.254545758635462140, -0.254497405280767810, -0.254449051289829970, -0.254400696662769490, +-0.254352341399707300, -0.254303985500763390, -0.254255628966060350, -0.254207271795718280, -0.254158913989858020, -0.254110555548600460, -0.254062196472066510, -0.254013836760377090, +-0.253965476413653020, -0.253917115432014450, -0.253868753815583940, -0.253820391564481550, -0.253772028678828200, -0.253723665158744780, -0.253675301004352150, -0.253626936215771310, +-0.253578570793123130, -0.253530204736527600, -0.253481838046107470, -0.253433470721982750, -0.253385102764274340, -0.253336734173103210, -0.253288364948590190, -0.253239995090856260, +-0.253191624600022370, -0.253143253476208530, -0.253094881719537480, -0.253046509330129180, -0.252998136308104580, -0.252949762653584710, -0.252901388366690350, -0.252853013447542570, +-0.252804637896261400, -0.252756261712969500, -0.252707884897786890, -0.252659507450834600, -0.252611129372233570, -0.252562750662104710, -0.252514371320568920, -0.252465991347747280, +-0.252417610743759730, -0.252369229508729090, -0.252320847642775290, -0.252272465146019420, -0.252224082018582370, -0.252175698260585170, -0.252127313872148650, -0.252078928853393000, +-0.252030543204440900, -0.251982156925412480, -0.251933770016428640, -0.251885382477610330, -0.251836994309078630, -0.251788605510954390, -0.251740216083358670, -0.251691826026411550, +-0.251643435340235700, -0.251595044024951310, -0.251546652080679280, -0.251498259507540620, -0.251449866305656300, -0.251401472475147330, -0.251353078016133820, -0.251304682928738480, +-0.251256287213081410, -0.251207890869283630, -0.251159493897466110, -0.251111096297749860, -0.251062698070255890, -0.251014299215105210, -0.250965899732417840, -0.250917499622316630, +-0.250869098884921650, -0.250820697520353960, -0.250772295528734480, -0.250723892910184270, -0.250675489664824340, -0.250627085792775710, -0.250578681294158500, -0.250530276169095400, +-0.250481870417706640, -0.250433464040113190, -0.250385057036436100, -0.250336649406796340, -0.250288241151314980, -0.250239832270113040, -0.250191422763310630, -0.250143012631030500, +-0.250094601873392890, -0.250046190490518740, -0.249997778482529130, -0.249949365849545050, -0.249900952591687600, -0.249852538709076870, -0.249804124201835680, -0.249755709070084150, +-0.249707293313943370, -0.249658876933534330, -0.249610459928978120, -0.249562042300395780, -0.249513624047908310, -0.249465205171635900, -0.249416785671701360, -0.249368365548224860, +-0.249319944801327440, -0.249271523431130150, -0.249223101437754090, -0.249174678821320220, -0.249126255581948840, -0.249077831719762640, -0.249029407234881900, -0.248980982127427610, +-0.248932556397520880, -0.248884130045282760, -0.248835703070834330, -0.248787275474296600, -0.248738847255789850, -0.248690418415436850, -0.248641988953357790, -0.248593558869673770, +-0.248545128164505830, -0.248496696837975100, -0.248448264890202610, -0.248399832321308610, -0.248351399131415850, -0.248302965320644640, -0.248254530889115980, -0.248206095836951020, +-0.248157660164270820, -0.248109223871196470, -0.248060786957849030, -0.248012349424348800, -0.247963911270818540, -0.247915472497378500, -0.247867033104149790, -0.247818593091253480, +-0.247770152458810680, -0.247721711206942530, -0.247673269335770080, -0.247624826845413620, -0.247576383735995910, -0.247527940007637280, -0.247479495660458790, -0.247431050694581570, +-0.247382605110126720, -0.247334158907215330, -0.247285712085968560, -0.247237264646506670, -0.247188816588952450, -0.247140367913426200, -0.247091918620049030, -0.247043468708942060, +-0.246995018180226430, -0.246946567034023230, -0.246898115270452770, -0.246849662889637890, -0.246801209891698850, -0.246752756276756770, -0.246704302044932820, -0.246655847196348120, +-0.246607391731123780, -0.246558935649380940, -0.246510478951239950, -0.246462021636823600, -0.246413563706252200, -0.246365105159646880, -0.246316645997128800, -0.246268186218819130, +-0.246219725824838980, -0.246171264815308630, -0.246122803190350990, -0.246074340950086370, -0.246025878094635860, -0.245977414624120680, -0.245928950538661960, -0.245880485838380850, +-0.245832020523398560, -0.245783554593835330, -0.245735088049814060, -0.245686620891455100, -0.245638153118879570, -0.245589684732208660, -0.245541215731563540, -0.245492746117065400, +-0.245444275888834520, -0.245395805046993790, -0.245347333591663580, -0.245298861522965010, -0.245250388841019300, -0.245201915545947610, -0.245153441637871140, -0.245104967116911070, +-0.245056491983187710, -0.245008016236824000, -0.244959539877940220, -0.244911062906657620, -0.244862585323097350, -0.244814107127380610, -0.244765628319628610, -0.244717148899962540, +-0.244668668868502720, -0.244620188225372100, -0.244571706970691030, -0.244523225104580660, -0.244474742627162260, -0.244426259538556980, -0.244377775838886060, -0.244329291528270680, +-0.244280806606831240, -0.244232321074690640, -0.244183834931969210, -0.244135348178788240, -0.244086860815268870, -0.244038372841532350, -0.243989884257699880, -0.243941395063891870, +-0.243892905260231220, -0.243844414846838300, -0.243795923823834360, -0.243747432191340600, -0.243698939949478280, -0.243650447098368580, -0.243601953638132780, -0.243553459568891210, +-0.243504964890766870, -0.243456469603880120, -0.243407973708352210, -0.243359477204304340, -0.243310980091857780, -0.243262482371133790, -0.243213984042252720, -0.243165485105337560, +-0.243116985560508670, -0.243068485407887340, -0.243019984647594780, -0.242971483279752270, -0.242922981304481030, -0.242874478721902350, -0.242825975532136610, -0.242777471735306780, +-0.242728967331533290, -0.242680462320937370, -0.242631956703640320, -0.242583450479763350, -0.242534943649427760, -0.242486436212753950, -0.242437928169864920, -0.242389419520881080, +-0.242340910265923660, -0.242292400405113990, -0.242243889938573290, -0.242195378866422890, -0.242146867188784030, -0.242098354905777160, -0.242049842017525250, -0.242001328524148740, +-0.241952814425768910, -0.241904299722507040, -0.241855784414484410, -0.241807268501822330, -0.241758751984642080, -0.241710234863064090, -0.241661717137211380, -0.241613198807204360, +-0.241564679873164350, -0.241516160335212640, -0.241467640193470560, -0.241419119448059330, -0.241370598099099470, -0.241322076146713970, -0.241273553591023260, -0.241225030432148680, +-0.241176506670211540, -0.241127982305333140, -0.241079457337634750, -0.241030931767237720, -0.240982405594262540, -0.240933878818832160, -0.240885351441067100, -0.240836823461088670, +-0.240788294879018180, -0.240739765694976960, -0.240691235909086310, -0.240642705521467580, -0.240594174532241220, -0.240545642941530270, -0.240497110749455230, -0.240448577956137420, +-0.240400044561698140, -0.240351510566258780, -0.240302975969940630, -0.240254440772864180, -0.240205904975152480, -0.240157368576926020, -0.240108831578306150, -0.240060293979414200, +-0.240011755780371480, -0.239963216981299410, -0.239914677582319300, -0.239866137583551600, -0.239817596985119450, -0.239769055787143300, -0.239720513989744500, -0.239671971593044430, +-0.239623428597164430, -0.239574885002225850, -0.239526340808349200, -0.239477796015657550, -0.239429250624271420, -0.239380704634312190, -0.239332158045901160, -0.239283610859159750, +-0.239235063074209300, -0.239186514691171190, -0.239137965710165960, -0.239089416131316650, -0.239040865954743830, -0.238992315180568820, -0.238943763808913020, -0.238895211839897810, +-0.238846659273644600, -0.238798106110274720, -0.238749552349908720, -0.238700997992669690, -0.238652443038678160, -0.238603887488055530, -0.238555331340923190, -0.238506774597402520, +-0.238458217257614900, -0.238409659321680900, -0.238361100789723580, -0.238312541661863550, -0.238263981938222120, -0.238215421618920790, -0.238166860704080860, -0.238118299193823800, +-0.238069737088270980, -0.238021174387542940, -0.237972611091762880, -0.237924047201051230, -0.237875482715529500, -0.237826917635319050, -0.237778351960541310, -0.237729785691317700, +-0.237681218827769600, -0.237632651370017630, -0.237584083318184870, -0.237535514672391900, -0.237486945432760140, -0.237438375599411030, -0.237389805172465970, -0.237341234152046390, +-0.237292662538272890, -0.237244090331268590, -0.237195517531154030, -0.237146944138050710, -0.237098370152080020, -0.237049795573363390, -0.237001220402022290, -0.236952644638178140, +-0.236904068281951510, -0.236855491333465590, -0.236806913792840910, -0.236758335660198970, -0.236709756935661180, -0.236661177619348990, -0.236612597711383880, -0.236564017211886380, +-0.236515436120979720, -0.236466854438784490, -0.236418272165422080, -0.236369689301014010, -0.236321105845681720, -0.236272521799546660, -0.236223937162730320, -0.236175351935353240, +-0.236126766117538660, -0.236078179709407170, -0.236029592711080230, -0.235981005122679300, -0.235932416944325850, -0.235883828176141370, -0.235835238818247310, -0.235786648870764310, +-0.235738058333815530, -0.235689467207521620, -0.235640875492004020, -0.235592283187384260, -0.235543690293783780, -0.235495096811324050, -0.235446502740125740, -0.235397908080312050, +-0.235349312832003550, -0.235300716995321820, -0.235252120570388250, -0.235203523557324410, -0.235154925956251730, -0.235106327767291760, -0.235057728990565100, -0.235009129626195000, +-0.234960529674302030, -0.234911929135007770, -0.234863328008433680, -0.234814726294701290, -0.234766123993932070, -0.234717521106247520, -0.234668917631768340, -0.234620313570617690, +-0.234571708922916290, -0.234523103688785590, -0.234474497868347150, -0.234425891461722460, -0.234377284469033050, -0.234328676890399550, -0.234280068725945230, -0.234231459975790730, +-0.234182850640057590, -0.234134240718867320, -0.234085630212341440, -0.234037019120601510, -0.233988407443769000, -0.233939795181964620, -0.233891182335311640, -0.233842568903930680, +-0.233793954887943300, -0.233745340287471020, -0.233696725102635420, -0.233648109333557980, -0.233599492980359420, -0.233550876043162990, -0.233502258522089360, -0.233453640417260080, +-0.233405021728796710, -0.233356402456820790, -0.233307782601453850, -0.233259162162817470, -0.233210541141032320, -0.233161919536221670, -0.233113297348506220, -0.233064674578007530, +-0.233016051224847170, -0.232967427289146660, -0.232918802771027580, -0.232870177670611490, -0.232821551988019130, -0.232772925723373710, -0.232724298876795990, -0.232675671448407530, +-0.232627043438329910, -0.232578414846684650, -0.232529785673593360, -0.232481155919176760, -0.232432525583558120, -0.232383894666858160, -0.232335263169198470, -0.232286631090700610, +-0.232237998431486180, -0.232189365191676770, -0.232140731371393930, -0.232092096970758420, -0.232043461989893510, -0.231994826428919940, -0.231946190287959320, -0.231897553567133210, +-0.231848916266563230, -0.231800278386370960, -0.231751639926677990, -0.231703000887605040, -0.231654361269275470, -0.231605721071809990, -0.231557080295330200, -0.231508438939957730, +-0.231459797005814150, -0.231411154493021080, -0.231362511401699280, -0.231313867731972040, -0.231265223483960140, -0.231216578657785170, -0.231167933253568770, -0.231119287271432520, +-0.231070640711498050, -0.231021993573887000, -0.230973345858720090, -0.230924697566120690, -0.230876048696209530, -0.230827399249108250, -0.230778749224938490, -0.230730098623821820, +-0.230681447445879930, -0.230632795691233570, -0.230584143360006070, -0.230535490452318220, -0.230486836968291610, -0.230438182908047930, -0.230389528271708800, -0.230340873059395850, +-0.230292217271230730, -0.230243560907334170, -0.230194903967829600, -0.230146246452837770, -0.230097588362480290, -0.230048929696878870, -0.230000270456155120, -0.229951610640430680, +-0.229902950249827240, -0.229854289284465520, -0.229805627744468970, -0.229756965629958370, -0.229708302941055320, -0.229659639677881530, -0.229610975840558650, -0.229562311429208300, +-0.229513646443951340, -0.229464980884911100, -0.229416314752208420, -0.229367648045964960, -0.229318980766302360, -0.229270312913342320, -0.229221644487206500, -0.229172975488016570, +-0.229124305915893330, -0.229075635770960210, -0.229026965053338000, -0.228978293763148350, -0.228929621900512970, -0.228880949465553570, -0.228832276458391770, -0.228783602879149260, +-0.228734928727946900, -0.228686254004908080, -0.228637578710153640, -0.228588902843805230, -0.228540226405984560, -0.228491549396813350, -0.228442871816413260, -0.228394193664905130, +-0.228345514942412370, -0.228296835649055810, -0.228248155784957160, -0.228199475350238160, -0.228150794345020450, -0.228102112769425740, -0.228053430623575750, -0.228004747907591340, +-0.227956064621595900, -0.227907380765710320, -0.227858696340056290, -0.227810011344755510, -0.227761325779929690, -0.227712639645700570, -0.227663952942188970, -0.227615265669518370, +-0.227566577827809590, -0.227517889417184400, -0.227469200437764450, -0.227420510889671520, -0.227371820773027310, -0.227323130087953520, -0.227274438834571070, -0.227225747013003380, +-0.227177054623371320, -0.227128361665796640, -0.227079668140401040, -0.227030974047306270, -0.226982279386634070, -0.226933584158505310, -0.226884888363043440, -0.226836192000369360, +-0.226787495070604810, -0.226738797573871500, -0.226690099510291200, -0.226641400879985660, -0.226592701683076630, -0.226544001919684960, -0.226495301589934170, -0.226446600693945090, +-0.226397899231839560, -0.226349197203739250, -0.226300494609765950, -0.226251791450041400, -0.226203087724687390, -0.226154383433824800, -0.226105678577577100, -0.226056973156065210, +-0.226008267169410890, -0.225959560617735920, -0.225910853501162020, -0.225862145819811010, -0.225813437573804620, -0.225764728763263760, -0.225716019388311960, -0.225667309449070120, +-0.225618598945660000, -0.225569887878203370, -0.225521176246822020, -0.225472464051637730, -0.225423751292771420, -0.225375037970346610, -0.225326324084484190, -0.225277609635305960, +-0.225228894622933720, -0.225180179047489240, -0.225131462909094300, -0.225082746207870720, -0.225034028943939400, -0.224985311117423870, -0.224936592728445070, -0.224887873777124770, +-0.224839154263584810, -0.224790434187946950, -0.224741713550333010, -0.224692992350863900, -0.224644270589663210, -0.224595548266851820, -0.224546825382551550, -0.224498101936884240, +-0.224449377929971690, -0.224400653361935650, -0.224351928232898010, -0.224303202542979670, -0.224254476292304190, -0.224205749480992530, -0.224157022109166490, -0.224108294176947890, +-0.224059565684458560, -0.224010836631820310, -0.223962107019154120, -0.223913376846583520, -0.223864646114229460, -0.223815914822213800, -0.223767182970658340, -0.223718450559684950, +-0.223669717589415420, -0.223620984059971580, -0.223572249971474430, -0.223523515324047520, -0.223474780117811830, -0.223426044352889180, -0.223377308029401420, -0.223328571147470400, +-0.223279833707217930, -0.223231095708765900, -0.223182357152235250, -0.223133618037749560, -0.223084878365429840, -0.223036138135397940, -0.222987397347775670, -0.222938656002684920, +-0.222889914100247530, -0.222841171640585340, -0.222792428623819370, -0.222743685050073190, -0.222694940919467820, -0.222646196232125060, -0.222597450988166830, -0.222548705187714970, +-0.222499958830891350, -0.222451211917816970, -0.222402464448615420, -0.222353716423407700, -0.222304967842315710, -0.222256218705461280, -0.222207469012966310, -0.222158718764952660, +-0.222109967961542230, -0.222061216602856020, -0.222012464689017610, -0.221963712220148050, -0.221914959196369220, -0.221866205617802960, -0.221817451484571220, -0.221768696796795840, +-0.221719941554597840, -0.221671185758100880, -0.221622429407425940, -0.221573672502694910, -0.221524915044029710, -0.221476157031552240, -0.221427398465384370, -0.221378639345648000, +-0.221329879672464150, -0.221281119445956490, -0.221232358666246020, -0.221183597333454660, -0.221134835447704290, -0.221086073009116840, -0.221037310017814210, -0.220988546473917440, +-0.220939782377550190, -0.220891017728833460, -0.220842252527889190, -0.220793486774839290, -0.220744720469805670, -0.220695953612910250, -0.220647186204274950, -0.220598418244020820, +-0.220549649732271510, -0.220500880669148050, -0.220452111054772410, -0.220403340889266500, -0.220354570172752230, -0.220305798905351540, -0.220257027087186360, -0.220208254718377740, +-0.220159481799049340, -0.220110708329322220, -0.220061934309318360, -0.220013159739159660, -0.219964384618968060, -0.219915608948865500, -0.219866832728973890, -0.219818055959414370, +-0.219769278640310540, -0.219720500771783540, -0.219671722353955300, -0.219622943386947710, -0.219574163870882800, -0.219525383805882460, -0.219476603192067800, -0.219427822029562510, +-0.219379040318487650, -0.219330258058965190, -0.219281475251117100, -0.219232691895065310, -0.219183907990931790, -0.219135123538838520, -0.219086338538906550, -0.219037552991259600, +-0.218988766896018760, -0.218939980253306020, -0.218891193063243340, -0.218842405325952670, -0.218793617041555980, -0.218744828210174380, -0.218696038831931560, -0.218647248906948670, +-0.218598458435347640, -0.218549667417250490, -0.218500875852779160, -0.218452083742055630, -0.218403291085201900, -0.218354497882339070, -0.218305704133590850, -0.218256909839078390, +-0.218208114998923650, -0.218159319613248640, -0.218110523682175290, -0.218061727205825670, -0.218012930184320830, -0.217964132617784550, -0.217915334506337960, -0.217866535850103020, +-0.217817736649201730, -0.217768936903756090, -0.217720136613888120, -0.217671335779719810, -0.217622534401372300, -0.217573732478969300, -0.217524930012631980, -0.217476127002482340, +-0.217427323448642380, -0.217378519351234120, -0.217329714710379540, -0.217280909526200690, -0.217232103798818720, -0.217183297528357330, -0.217134490714937680, -0.217085683358681840, +-0.217036875459711760, -0.216988067018149520, -0.216939258034117090, -0.216890448507736530, -0.216841638439128960, -0.216792827828418190, -0.216744016675725320, -0.216695204981172450, +-0.216646392744881540, -0.216597579966974650, -0.216548766647573800, -0.216499952786800180, -0.216451138384777560, -0.216402323441627080, -0.216353507957470770, -0.216304691932430710, +-0.216255875366628940, -0.216207058260187430, -0.216158240613228330, -0.216109422425872720, -0.216060603698244450, -0.216011784430464650, -0.215962964622655410, -0.215914144274938740, +-0.215865323387436720, -0.215816501960271380, -0.215767679993563940, -0.215718857487438130, -0.215670034442015210, -0.215621210857417200, -0.215572386733766160, -0.215523562071184140, +-0.215474736869793240, -0.215425911129715460, -0.215377084851072070, -0.215328258033986840, -0.215279430678580940, -0.215230602784976470, -0.215181774353295500, -0.215132945383660070, +-0.215084115876192310, -0.215035285831013360, -0.214986455248247080, -0.214937624128014680, -0.214888792470438210, -0.214839960275639730, -0.214791127543741380, -0.214742294274865210, +-0.214693460469133290, -0.214644626126666850, -0.214595791247589730, -0.214546955832023130, -0.214498119880089130, -0.214449283391909830, -0.214400446367607330, -0.214351608807303700, +-0.214302770711121050, -0.214253932079180640, -0.214205092911606220, -0.214156253208519110, -0.214107412970041350, -0.214058572196295040, -0.214009730887402330, -0.213960889043485260, +-0.213912046664665120, -0.213863203751065710, -0.213814360302808320, -0.213765516320015030, -0.213716671802807930, -0.213667826751309160, -0.213618981165640820, -0.213570135045925010, +-0.213521288392283020, -0.213472441204838690, -0.213423593483713230, -0.213374745229028770, -0.213325896440907490, -0.213277047119471430, -0.213228197264842790, -0.213179346877143630, +-0.213130495956495250, -0.213081644503021470, -0.213032792516843620, -0.212983939998083770, -0.212935086946864060, -0.212886233363306640, -0.212837379247533650, -0.212788524599666320, +-0.212739669419828550, -0.212690813708141640, -0.212641957464727670, -0.212593100689708800, -0.212544243383207180, -0.212495385545344970, -0.212446527176244290, -0.212397668276026410, +-0.212348808844815250, -0.212299948882732040, -0.212251088389898980, -0.212202227366438180, -0.212153365812471820, -0.212104503728122060, -0.212055641113510160, -0.212006777968760020, +-0.211957914293992940, -0.211909050089331090, -0.211860185354896590, -0.211811320090811630, -0.211762454297198390, -0.211713587974179000, -0.211664721121874760, -0.211615853740409620, +-0.211566985829904820, -0.211518117390482540, -0.211469248422265000, -0.211420378925374320, -0.211371508899932700, -0.211322638346062320, -0.211273767263884440, -0.211224895653523040, +-0.211176023515099400, -0.211127150848735710, -0.211078277654554110, -0.211029403932676830, -0.210980529683226060, -0.210931654906323070, -0.210882779602091840, -0.210833903770653640, +-0.210785027412130680, -0.210736150526645160, -0.210687273114319260, -0.210638395175275190, -0.210589516709635110, -0.210540637717520380, -0.210491758199054910, -0.210442878154360080, +-0.210393997583558030, -0.210345116486770980, -0.210296234864121160, -0.210247352715730720, -0.210198470041721930, -0.210149586842216100, -0.210100703117337140, -0.210051818867206450, +-0.210002934091946200, -0.209954048791678620, -0.209905162966525920, -0.209856276616610300, -0.209807389742053120, -0.209758502342978350, -0.209709614419507330, -0.209660725971762250, +-0.209611836999865380, -0.209562947503938890, -0.209514057484105040, -0.209465166940486060, -0.209416275873203300, -0.209367384282380690, -0.209318492168139640, -0.209269599530602340, +-0.209220706369891070, -0.209171812686128030, -0.209122918479435430, -0.209074023749934700, -0.209025128497749760, -0.208976232723002000, -0.208927336425813650, -0.208878439606306980, +-0.208829542264604210, -0.208780644400827550, -0.208731746015099310, -0.208682847107540840, -0.208633947678276120, -0.208585047727426500, -0.208536147255114300, -0.208487246261461700, +-0.208438344746591010, -0.208389442710624430, -0.208340540153684280, -0.208291637075891880, -0.208242733477371270, -0.208193829358243820, -0.208144924718631800, -0.208096019558657470, +-0.208047113878443100, -0.207998207678110920, -0.207949300957782380, -0.207900393717581460, -0.207851485957629530, -0.207802577678048880, -0.207753668878961820, -0.207704759560490560, +-0.207655849722757410, -0.207606939365884650, -0.207558028489993660, -0.207509117095208450, -0.207460205181650480, -0.207411292749441980, -0.207362379798705250, -0.207313466329562570, +-0.207264552342136230, -0.207215637836548480, -0.207166722812920810, -0.207117807271377190, -0.207068891212039030, -0.207019974635028660, -0.206971057540468350, -0.206922139928480380, +-0.206873221799187100, -0.206824303152709860, -0.206775383989172750, -0.206726464308697180, -0.206677544111405430, -0.206628623397419830, -0.206579702166862690, -0.206530780419856290, +-0.206481858156522920, -0.206432935376984040, -0.206384012081363700, -0.206335088269783310, -0.206286163942365240, -0.206237239099231720, -0.206188313740505110, -0.206139387866307730, +-0.206090461476760990, -0.206041534571988980, -0.205992607152113150, -0.205943679217255790, -0.205894750767539210, -0.205845821803085780, -0.205796892324017790, -0.205747962330457560, +-0.205699031822526580, -0.205650100800348870, -0.205601169264045900, -0.205552237213740020, -0.205503304649553550, -0.205454371571608810, -0.205405437980028140, -0.205356503874933870, +-0.205307569256447470, -0.205258634124693030, -0.205209698479792010, -0.205160762321866720, -0.205111825651039550, -0.205062888467432810, -0.205013950771168820, -0.204965012562369130, +-0.204916073841157760, -0.204867134607656180, -0.204818194861986800, -0.204769254604271920, -0.204720313834633900, -0.204671372553195090, -0.204622430760077860, -0.204573488455403660, +-0.204524545639296650, -0.204475602311878250, -0.204426658473270850, -0.204377714123596790, -0.204328769262978470, -0.204279823891538200, -0.204230878009398380, -0.204181931616680500, +-0.204132984713508660, -0.204084037300004350, -0.204035089376289970, -0.203986140942487850, -0.203937191998720370, -0.203888242545109930, -0.203839292581777990, -0.203790342108848720, +-0.203741391126443570, -0.203692439634684950, -0.203643487633695220, -0.203594535123596790, -0.203545582104512010, -0.203496628576563280, -0.203447674539872110, -0.203398719994562600, +-0.203349764940756320, -0.203300809378575610, -0.203251853308142910, -0.203202896729580560, -0.203153939643010960, -0.203104982048555620, -0.203056023946338730, -0.203007065336481750, +-0.202958106219107120, -0.202909146594337230, -0.202860186462294480, -0.202811225823101270, -0.202762264676879970, -0.202713303023752150, -0.202664340863841940, -0.202615378197270880, +-0.202566415024161370, -0.202517451344635830, -0.202468487158816660, -0.202419522466826260, -0.202370557268787080, -0.202321591564820630, -0.202272625355051060, -0.202223658639599930, +-0.202174691418589650, -0.202125723692142630, -0.202076755460381310, -0.202027786723428110, -0.201978817481404590, -0.201929847734434870, -0.201880877482640530, -0.201831906726144010, +-0.201782935465067730, -0.201733963699534090, -0.201684991429665530, -0.201636018655584530, -0.201587045377412590, -0.201538071595273930, -0.201489097309290040, -0.201440122519583460, +-0.201391147226276550, -0.201342171429491760, -0.201293195129351570, -0.201244218325978390, -0.201195241019493760, -0.201146263210021940, -0.201097284897684440, -0.201048306082603740, +-0.200999326764902260, -0.200950346944702460, -0.200901366622126790, -0.200852385797296860, -0.200803404470336820, -0.200754422641368280, -0.200705440310513660, -0.200656457477895460, +-0.200607474143636110, -0.200558490307858080, -0.200509505970683820, -0.200460521132234920, -0.200411535792635570, -0.200362549952007420, -0.200313563610472870, -0.200264576768154400, +-0.200215589425174510, -0.200166601581655640, -0.200117613237719400, -0.200068624393489990, -0.200019635049089040, -0.199970645204638970, -0.199921654860262310, -0.199872664016081500, +-0.199823672672219040, -0.199774680828797400, -0.199725688485938190, -0.199676695643765610, -0.199627702302401320, -0.199578708461967760, -0.199529714122587410, -0.199480719284382800, +-0.199431723947476380, -0.199382728111990650, -0.199333731778047250, -0.199284734945770370, -0.199235737615281660, -0.199186739786703590, -0.199137741460158700, -0.199088742635769420, +-0.199039743313658310, -0.198990743493946960, -0.198941743176759640, -0.198892742362217930, -0.198843741050444390, -0.198794739241561490, -0.198745736935691750, -0.198696734132957660, +-0.198647730833481720, -0.198598727037385600, -0.198549722744793540, -0.198500717955827160, -0.198451712670608990, -0.198402706889261540, -0.198353700611907320, -0.198304693838668860, +-0.198255686569668630, -0.198206678805028350, -0.198157670544872240, -0.198108661789321930, -0.198059652538500000, -0.198010642792528920, -0.197961632551531210, -0.197912621815629460, +-0.197863610584945250, -0.197814598859602900, -0.197765586639724070, -0.197716573925431240, -0.197667560716846990, -0.197618547014093840, -0.197569532817294340, -0.197520518126570980, +-0.197471502942045460, -0.197422487263842070, -0.197373471092082450, -0.197324454426889150, -0.197275437268384730, -0.197226419616691680, -0.197177401471932610, -0.197128382834229180, +-0.197079363703705630, -0.197030344080483700, -0.196981323964685870, -0.196932303356434770, -0.196883282255852890, -0.196834260663062810, -0.196785238578187080, -0.196736216001347390, +-0.196687192932668010, -0.196638169372270660, -0.196589145320277910, -0.196540120776812270, -0.196491095741996330, -0.196442070215952640, -0.196393044198802940, -0.196344017690671470, +-0.196294990691679970, -0.196245963201950980, -0.196196935221607080, -0.196147906750770870, -0.196098877789564860, -0.196049848338111680, -0.196000818396532990, -0.195951787964953130, +-0.195902757043493800, -0.195853725632277600, -0.195804693731427060, -0.195755661341064780, -0.195706628461313370, -0.195657595092295380, -0.195608561234132530, -0.195559526886949160, +-0.195510492050866960, -0.195461456726008510, -0.195412420912496440, -0.195363384610453330, -0.195314347820001730, -0.195265310541264280, -0.195216272774362680, -0.195167234519421280, +-0.195118195776561780, -0.195069156545906790, -0.195020116827578920, -0.194971076621700740, -0.194922035928394880, -0.194872994747783050, -0.194823953079989620, -0.194774910925136300, +-0.194725868283345700, -0.194676825154740440, -0.194627781539443100, -0.194578737437576310, -0.194529692849262690, -0.194480647774623950, -0.194431602213784470, -0.194382556166865980, +-0.194333509633991120, -0.194284462615282450, -0.194235415110862650, -0.194186367120854330, -0.194137318645379170, -0.194088269684561610, -0.194039220238523380, -0.193990170307387110, +-0.193941119891275410, -0.193892068990310890, -0.193843017604616200, -0.193793965734313980, -0.193744913379525980, -0.193695860540376550, -0.193646807216987490, -0.193597753409481380, +-0.193548699117980920, -0.193499644342608690, -0.193450589083487360, -0.193401533340738670, -0.193352477114487050, -0.193303420404854210, -0.193254363211962820, -0.193205305535935540, +-0.193156247376894990, -0.193107188734963800, -0.193058129610264670, -0.193009070002919340, -0.192960009913052180, -0.192910949340785010, -0.192861888286240480, -0.192812826749541200, +-0.192763764730809890, -0.192714702230169150, -0.192665639247741630, -0.192616575783649190, -0.192567511838016150, -0.192518447410964330, -0.192469382502616420, -0.192420317113095010, +-0.192371251242522830, -0.192322184891022540, -0.192273118058716750, -0.192224050745727320, -0.192174982952178640, -0.192125914678192480, -0.192076845923891540, -0.192027776689398490, +-0.191978706974836020, -0.191929636780326730, -0.191880566105992520, -0.191831494951957750, -0.191782423318344250, -0.191733351205274680, -0.191684278612871740, -0.191635205541258120, +-0.191586131990556460, -0.191537057960889490, -0.191487983452379000, -0.191438908465149410, -0.191389832999322550, -0.191340757055021130, -0.191291680632367790, -0.191242603731485240, +-0.191193526352496200, -0.191144448495522480, -0.191095370160688500, -0.191046291348116100, -0.190997212057927970, -0.190948132290246820, -0.190899052045195330, -0.190849971322896220, +-0.190800890123472150, -0.190751808447045010, -0.190702726293739220, -0.190653643663676600, -0.190604560556979890, -0.190555476973771760, -0.190506392914174950, -0.190457308378312150, +-0.190408223366305220, -0.190359137878278600, -0.190310051914354130, -0.190260965474654510, -0.190211878559302490, -0.190162791168420800, -0.190113703302132120, -0.190064614960559150, +-0.190015526143823800, -0.189966436852050500, -0.189917347085361120, -0.189868256843878370, -0.189819166127724980, -0.189770074937023660, -0.189720983271897150, -0.189671891132468180, +-0.189622798518858630, -0.189573705431192950, -0.189524611869592990, -0.189475517834181510, -0.189426423325081250, -0.189377328342414910, -0.189328232886305260, -0.189279136956875040, +-0.189230040554246080, -0.189180943678542910, -0.189131846329887390, -0.189082748508402230, -0.189033650214210200, -0.188984551447434060, -0.188935452208196550, -0.188886352496619500, +-0.188837252312827470, -0.188788151656942290, -0.188739050529086770, -0.188689948929383570, -0.188640846857955540, -0.188591744314925370, -0.188542641300415840, -0.188493537814548860, +-0.188444433857448880, -0.188395329429237810, -0.188346224530038440, -0.188297119159973490, -0.188248013319165770, -0.188198907007738000, -0.188149800225812070, -0.188100692973512530, +-0.188051585250961270, -0.188002477058281050, -0.187953368395594620, -0.187904259263024760, -0.187855149660694280, -0.187806039588725880, -0.187756929047241560, -0.187707818036365770, +-0.187658706556220410, -0.187609594606928330, -0.187560482188612240, -0.187511369301394950, -0.187462255945399230, -0.187413142120747000, -0.187364027827562780, -0.187314913065968510, +-0.187265797836086930, -0.187216682138040880, -0.187167565971953110, -0.187118449337946440, -0.187069332236143640, -0.187020214666666630, -0.186971096629639950, -0.186921978125185550, +-0.186872859153426190, -0.186823739714484680, -0.186774619808483840, -0.186725499435546420, -0.186676378595795280, -0.186627257289352310, -0.186578135516342060, -0.186529013276886480, +-0.186479890571108360, -0.186430767399130530, -0.186381643761075770, -0.186332519657066900, -0.186283395087226740, -0.186234270051677230, -0.186185144550542890, -0.186136018583945680, +-0.186086892152008470, -0.186037765254853990, -0.185988637892605110, -0.185939510065384640, -0.185890381773314520, -0.185841253016519330, -0.185792123795120970, -0.185742994109242330, +-0.185693863959006190, -0.185644733344535410, -0.185595602265952790, -0.185546470723381150, -0.185497338716942490, -0.185448206246761340, -0.185399073312959660, -0.185349939915660320, +-0.185300806054986110, -0.185251671731059890, -0.185202536944004510, -0.185153401693941900, -0.185104265980996660, -0.185055129805290740, -0.185005993166947020, -0.184956856066088300, +-0.184907718502837440, -0.184858580477317290, -0.184809441989650690, -0.184760303039959610, -0.184711163628368650, -0.184662023754999790, -0.184612883419975870, -0.184563742623419710, +-0.184514601365454220, -0.184465459646202230, -0.184416317465785680, -0.184367174824329240, -0.184318031721954880, -0.184268888158785420, -0.184219744134943740, -0.184170599650552690, +-0.184121454705735150, -0.184072309300614000, -0.184023163435311170, -0.183974017109951320, -0.183924870324656400, -0.183875723079549330, -0.183826575374752940, -0.183777427210390140, +-0.183728278586583750, -0.183679129503456660, -0.183629979961130870, -0.183580829959731020, -0.183531679499379100, -0.183482528580197950, -0.183433377202310510, -0.183384225365839590, +-0.183335073070908160, -0.183285920317638130, -0.183236767106154190, -0.183187613436578330, -0.183138459309033440, -0.183089304723642380, -0.183040149680528090, -0.182990994179813400, +-0.182941838221621240, -0.182892681806073630, -0.182843524933295140, -0.182794367603407860, -0.182745209816534690, -0.182696051572798470, -0.182646892872322110, -0.182597733715228530, +-0.182548574101640630, -0.182499414031680410, -0.182450253505472500, -0.182401092523138990, -0.182351931084802740, -0.182302769190586660, -0.182253606840613670, -0.182204444035006660, +-0.182155280773887650, -0.182106117057381330, -0.182056952885609720, -0.182007788258695710, -0.181958623176762230, -0.181909457639932190, -0.181860291648328540, -0.181811125202074130, +-0.181761958301291020, -0.181712790946103930, -0.181663623136634840, -0.181614454873006680, -0.181565286155342400, -0.181516116983764880, -0.181466947358397110, -0.181417777279361060, +-0.181368606746781460, -0.181319435760780330, -0.181270264321480630, -0.181221092429005250, -0.181171920083477160, -0.181122747285019260, -0.181073574033754490, -0.181024400329804910, +-0.180975226173295200, -0.180926051564347430, -0.180876876503084540, -0.180827700989629440, -0.180778525024105100, -0.180729348606634450, -0.180680171737340410, -0.180630994416345090, +-0.180581816643773150, -0.180532638419746650, -0.180483459744388590, -0.180434280617821850, -0.180385101040169420, -0.180335921011554240, -0.180286740532098370, -0.180237559601926530, +-0.180188378221160790, -0.180139196389924120, -0.180090014108339440, -0.180040831376529740, -0.179991648194617960, -0.179942464562727060, -0.179893280480979110, -0.179844095949498850, +-0.179794910968408330, -0.179745725537830550, -0.179696539657888450, -0.179647353328704990, -0.179598166550403170, -0.179548979323105930, -0.179499791646935360, -0.179450603522016170, +-0.179401414948470510, -0.179352225926421280, -0.179303036455991490, -0.179253846537304110, -0.179204656170482120, -0.179155465355647610, -0.179106274092925320, -0.179057082382437340, +-0.179007890224306630, -0.178958697618656240, -0.178909504565609080, -0.178860311065288160, -0.178811117117816470, -0.178761922723316090, -0.178712727881911810, -0.178663532593725690, +-0.178614336858880730, -0.178565140677499960, -0.178515944049706300, -0.178466746975622810, -0.178417549455371580, -0.178368351489077340, -0.178319153076862220, -0.178269954218849200, +-0.178220754915161320, -0.178171555165921540, -0.178122354971252890, -0.178073154331278320, -0.178023953246120030, -0.177974751715902710, -0.177925549740748510, -0.177876347320780420, +-0.177827144456121490, -0.177777941146894690, -0.177728737393223040, -0.177679533195229530, -0.177630328553036340, -0.177581123466768190, -0.177531917936547210, -0.177482711962496460, +-0.177433505544738940, -0.177384298683397640, -0.177335091378595600, -0.177285883630454940, -0.177236675439100460, -0.177187466804654280, -0.177138257727239460, -0.177089048206978960, +-0.177039838243995860, -0.176990627838413160, -0.176941416990353900, -0.176892205699940210, -0.176842993967296890, -0.176793781792546070, -0.176744569175810830, -0.176695356117214130, +-0.176646142616879050, -0.176596928674928630, -0.176547714291485860, -0.176498499466672950, -0.176449284200614680, -0.176400068493433180, -0.176350852345251500, -0.176301635756192700, +-0.176252418726379810, -0.176203201255935860, -0.176153983344983060, -0.176104764993646160, -0.176055546202047330, -0.176006326970309660, -0.175957107298556180, -0.175907887186909920, +-0.175858666635493930, -0.175809445644431290, -0.175760224213844160, -0.175711002343857340, -0.175661780034593010, -0.175612557286174230, -0.175563334098724040, -0.175514110472365560, +-0.175464886407221770, -0.175415661903414900, -0.175366436961069740, -0.175317211580308500, -0.175267985761254240, -0.175218759504029990, -0.175169532808758850, -0.175120305675563890, +-0.175071078104568150, -0.175021850095893860, -0.174972621649665820, -0.174923392766006210, -0.174874163445038120, -0.174824933686884620, -0.174775703491668790, -0.174726472859513700, +-0.174677241790542420, -0.174628010284877180, -0.174578778342642770, -0.174529545963961420, -0.174480313148956210, -0.174431079897750220, -0.174381846210466540, -0.174332612087228220, +-0.174283377528157510, -0.174234142533379240, -0.174184907103015600, -0.174135671237189680, -0.174086434936024600, -0.174037198199643420, -0.173987961028169240, -0.173938723421725170, +-0.173889485380433420, -0.173840246904418850, -0.173791007993803620, -0.173741768648710910, -0.173692528869263760, -0.173643288655585290, -0.173594048007798570, -0.173544806926026780, +-0.173495565410392070, -0.173446323461019320, -0.173397081078030760, -0.173347838261549510, -0.173298595011698640, -0.173249351328601310, -0.173200107212380610, -0.173150862663158740, +-0.173101617681060580, -0.173052372266208400, -0.173003126418725280, -0.172953880138734360, -0.172904633426358730, -0.172855386281721510, -0.172806138704945820, -0.172756890696153940, +-0.172707642255470670, -0.172658393383018300, -0.172609144078919970, -0.172559894343298770, -0.172510644176277820, -0.172461393577980270, -0.172412142548528350, -0.172362891088046980, +-0.172313639196658350, -0.172264386874485640, -0.172215134121651960, -0.172165880938280450, -0.172116627324494200, -0.172067373280416440, -0.172018118806169320, -0.171968863901877820, +-0.171919608567664140, -0.171870352803651430, -0.171821096609962860, -0.171771839986721520, -0.171722582934050600, -0.171673325452073230, -0.171624067540911670, -0.171574809200690790, +-0.171525550431532920, -0.171476291233561150, -0.171427031606898650, -0.171377771551668580, -0.171328511067994100, -0.171279250155997430, -0.171229988815803540, -0.171180727047534680, +-0.171131464851313970, -0.171082202227264640, -0.171032939175509770, -0.170983675696172570, -0.170934411789376180, -0.170885147455242890, -0.170835882693897570, -0.170786617505462590, +-0.170737351890061030, -0.170688085847816110, -0.170638819378850980, -0.170589552483288800, -0.170540285161252720, -0.170491017412865070, -0.170441749238250760, -0.170392480637532070, +-0.170343211610832160, -0.170293942158274230, -0.170244672279981470, -0.170195401976076990, -0.170146131246683150, -0.170096860091924850, -0.170047588511924420, -0.169998316506805000, +-0.169949044076689790, -0.169899771221701970, -0.169850497941964720, -0.169801224237601240, -0.169751950108733810, -0.169702675555487380, -0.169653400577984280, -0.169604125176347650, +-0.169554849350700730, -0.169505573101166680, -0.169456296427868690, -0.169407019330929080, -0.169357741810472810, -0.169308463866622180, -0.169259185499500390, -0.169209906709230640, +-0.169160627495936130, -0.169111347859740050, -0.169062067800765600, -0.169012787319135080, -0.168963506414973490, -0.168914225088403150, -0.168864943339547210, -0.168815661168528950, +-0.168766378575471500, -0.168717095560498130, -0.168667812123731140, -0.168618528265295470, -0.168569243985313500, -0.168519959283908420, -0.168470674161203450, -0.168421388617321780, +-0.168372102652386670, -0.168322816266521260, -0.168273529459847970, -0.168224242232491690, -0.168174954584574850, -0.168125666516220600, -0.168076378027552180, -0.168027089118692820, +-0.167977799789765740, -0.167928510040894150, -0.167879219872200420, -0.167829929283809520, -0.167780638275843800, -0.167731346848426470, -0.167682055001680790, -0.167632762735729970, +-0.167583470050697240, -0.167534176946705800, -0.167484883423878100, -0.167435589482339030, -0.167386295122210980, -0.167337000343617230, -0.167287705146680950, -0.167238409531525410, +-0.167189113498273870, -0.167139817047048640, -0.167090520177974740, -0.167041222891174570, -0.166991925186771330, -0.166942627064888270, -0.166893328525648640, -0.166844029569175710, +-0.166794730195592680, -0.166745430405021960, -0.166696130197588550, -0.166646829573414780, -0.166597528532623970, -0.166548227075339340, -0.166498925201684130, -0.166449622911781610, +-0.166400320205754150, -0.166351017083726770, -0.166301713545821850, -0.166252409592162640, -0.166203105222872430, -0.166153800438074430, -0.166104495237891950, -0.166055189622448220, +-0.166005883591865630, -0.165956577146269210, -0.165907270285781370, -0.165857963010525330, -0.165808655320624390, -0.165759347216201810, -0.165710038697380880, -0.165660729764283950, +-0.165611420417036080, -0.165562110655759650, -0.165512800480577980, -0.165463489891614270, -0.165414178888991850, -0.165364867472833990, -0.165315555643263950, -0.165266243400404160, +-0.165216930744379630, -0.165167617675312770, -0.165118304193326850, -0.165068990298545190, -0.165019675991091050, -0.164970361271087720, -0.164921046138658490, -0.164871730593925760, +-0.164822414637014610, -0.164773098268047400, -0.164723781487147420, -0.164674464294438020, -0.164625146690042440, -0.164575828674084020, -0.164526510246685990, -0.164477191407970850, +-0.164427872158063560, -0.164378552497086630, -0.164329232425163310, -0.164279911942416900, -0.164230591048970730, -0.164181269744948070, -0.164131948030471350, -0.164082625905665640, +-0.164033303370653360, -0.163983980425557840, -0.163934657070502370, -0.163885333305610230, -0.163836009131004770, -0.163786684546809310, -0.163737359553146220, -0.163688034150140630, +-0.163638708337914970, -0.163589382116592520, -0.163540055486296630, -0.163490728447150570, -0.163441400999277730, -0.163392073142800490, -0.163342744877843950, -0.163293416204530530, +-0.163244087122983580, -0.163194757633326410, -0.163145427735682360, -0.163096097430174720, -0.163046766716926860, -0.162997435596061200, -0.162948104067702800, -0.162898772131974180, +-0.162849439788998600, -0.162800107038899440, -0.162750773881800010, -0.162701440317823630, -0.162652106347092790, -0.162602771969732550, -0.162553437185865370, -0.162504101995614630, +-0.162454766399103610, -0.162405430396455660, -0.162356093987794160, -0.162306757173242420, -0.162257419952922920, -0.162208082326960740, -0.162158744295478360, -0.162109405858599090, +-0.162060067016446320, -0.162010727769143410, -0.161961388116813650, -0.161912048059580430, -0.161862707597566210, -0.161813366730896110, -0.161764025459692570, -0.161714683784078990, +-0.161665341704178680, -0.161615999220115020, -0.161566656332011370, -0.161517313039991090, -0.161467969344176620, -0.161418625244693140, -0.161369280741663070, -0.161319935835209820, +-0.161270590525456700, -0.161221244812527110, -0.161171898696544440, -0.161122552177631110, -0.161073205255912290, -0.161023857931510470, -0.160974510204549000, -0.160925162075151230, +-0.160875813543440580, -0.160826464609540390, -0.160777115273574050, -0.160727765535664040, -0.160678415395935470, -0.160629064854510870, -0.160579713911513630, -0.160530362567067100, +-0.160481010821294650, -0.160431658674319660, -0.160382306126264670, -0.160332953177254790, -0.160283599827412530, -0.160234246076861260, -0.160184891925724380, -0.160135537374125250, +-0.160086182422187310, -0.160036827070033890, -0.159987471317787540, -0.159938115165573380, -0.159888758613513950, -0.159839401661732610, -0.159790044310352760, -0.159740686559497800, +-0.159691328409291120, -0.159641969859855270, -0.159592610911315350, -0.159543251563793900, -0.159493891817414330, -0.159444531672300020, -0.159395171128574400, -0.159345810186360850, +-0.159296448845782760, -0.159247087106962670, -0.159197724970025740, -0.159148362435094500, -0.159098999502292370, -0.159049636171742730, -0.159000272443568990, -0.158950908317894570, +-0.158901543794842890, -0.158852178874536480, -0.158802813557100490, -0.158753447842657460, -0.158704081731330830, -0.158654715223243980, -0.158605348318520330, -0.158555981017283330, +-0.158506613319656380, -0.158457245225761990, -0.158407876735725400, -0.158358507849669090, -0.158309138567716530, -0.158259768889991130, -0.158210398816616280, -0.158161028347715450, +-0.158111657483411160, -0.158062286223828620, -0.158012914569090360, -0.157963542519319820, -0.157914170074640430, -0.157864797235175570, -0.157815424001048750, -0.157766050372383390, +-0.157716676349302000, -0.157667301931929790, -0.157617927120389360, -0.157568551914804070, -0.157519176315297410, -0.157469800321992810, -0.157420423935013740, -0.157371047154482720, +-0.157321669980524940, -0.157272292413262990, -0.157222914452820330, -0.157173536099320360, -0.157124157352886540, -0.157074778213642350, -0.157025398681711230, -0.156976018757215700, +-0.156926638440281010, -0.156877257731029730, -0.156827876629585310, -0.156778495136071200, -0.156729113250610840, -0.156679730973327710, -0.156630348304344360, -0.156580965243786040, +-0.156531581791775290, -0.156482197948435570, -0.156432813713890400, -0.156383429088263170, -0.156334044071677340, -0.156284658664256420, -0.156235272866122990, -0.156185886677402240, +-0.156136500098216810, -0.156087113128690090, -0.156037725768945590, -0.155988338019106780, -0.155938949879297130, -0.155889561349640100, -0.155840172430258300, -0.155790783121276950, +-0.155741393422818620, -0.155692003335006820, -0.155642612857965020, -0.155593221991816660, -0.155543830736685260, -0.155494439092693420, -0.155445047059966340, -0.155395654638626670, +-0.155346261828797850, -0.155296868630603350, -0.155247475044166690, -0.155198081069611360, -0.155148686707060830, -0.155099291956637690, -0.155049896818467200, -0.155000501292671980, +-0.154951105379375480, -0.154901709078701240, -0.154852312390772740, -0.154802915315713410, -0.154753517853646830, -0.154704120004695580, -0.154654721768984900, -0.154605323146637410, +-0.154555924137776610, -0.154506524742526020, -0.154457124961009080, -0.154407724793349350, -0.154358324239669440, -0.154308923300094600, -0.154259521974747430, -0.154210120263751470, +-0.154160718167230200, -0.154111315685307140, -0.154061912818105800, -0.154012509565749660, -0.153963105928361380, -0.153913701906066210, -0.153864297498986780, -0.153814892707246630, +-0.153765487530969220, -0.153716081970278080, -0.153666676025296770, -0.153617269696147890, -0.153567862982956690, -0.153518455885845840, -0.153469048404938860, -0.153419640540359250, +-0.153370232292230540, -0.153320823660676260, -0.153271414645819920, -0.153222005247784150, -0.153172595466694260, -0.153123185302672880, -0.153073774755843520, -0.153024363826329750, +-0.152974952514255050, -0.152925540819742970, -0.152876128742917030, -0.152826716283899900, -0.152777303442816870, -0.152727890219790580, -0.152678476614944550, -0.152629062628402340, +-0.152579648260287470, -0.152530233510723480, -0.152480818379833020, -0.152431402867741400, -0.152381986974571280, -0.152332570700446170, -0.152283154045489640, -0.152233737009825230, +-0.152184319593576510, -0.152134901796866950, -0.152085483619819270, -0.152036065062558760, -0.151986646125208070, -0.151937226807890790, -0.151887807110730440, -0.151838387033850550, +-0.151788966577374700, -0.151739545741426450, -0.151690124526128460, -0.151640702931606000, -0.151591280957981830, -0.151541858605379410, -0.151492435873922390, -0.151443012763734260, +-0.151393589274938590, -0.151344165407658080, -0.151294741162018020, -0.151245316538141130, -0.151195891536150930, -0.151146466156171030, -0.151097040398324920, -0.151047614262736250, +-0.150998187749528530, -0.150948760858824440, -0.150899333590749360, -0.150849905945425910, -0.150800477922977740, -0.150751049523528330, -0.150701620747201340, -0.150652191594120270, +-0.150602762064407840, -0.150553332158189390, -0.150503901875587630, -0.150454471216726090, -0.150405040181728370, -0.150355608770718070, -0.150306176983818730, -0.150256744821153950, +-0.150207312282846450, -0.150157879369021530, -0.150108446079801920, -0.150059012415311170, -0.150009578375672910, -0.149960143961010710, -0.149910709171448140, -0.149861274007108800, +-0.149811838468115380, -0.149762402554593280, -0.149712966266665140, -0.149663529604454610, -0.149614092568085220, -0.149564655157680640, -0.149515217373364400, -0.149465779215259250, +-0.149416340683490520, -0.149366901778180930, -0.149317462499454100, -0.149268022847433600, -0.149218582822243070, -0.149169142424006060, -0.149119701652846190, -0.149070260508886190, +-0.149020818992251450, -0.148971377103064630, -0.148921934841449360, -0.148872492207529270, -0.148823049201427940, -0.148773605823269010, -0.148724162073176040, -0.148674717951271800, +-0.148625273457681640, -0.148575828592528300, -0.148526383355935380, -0.148476937748026510, -0.148427491768925310, -0.148378045418755350, -0.148328598697639400, -0.148279151605702850, +-0.148229704143068410, -0.148180256309859730, -0.148130808106200380, -0.148081359532214020, -0.148031910588024260, -0.147982461273754720, -0.147933011589528180, -0.147883561535469940, +-0.147834111111702830, -0.147784660318350440, -0.147735209155536400, -0.147685757623384320, -0.147636305722017860, -0.147586853451559750, -0.147537400812135400, -0.147487947803867540, +-0.147438494426879780, -0.147389040681295820, -0.147339586567239250, -0.147290132084833710, -0.147240677234202870, -0.147191222015469410, -0.147141766428758810, -0.147092310474193770, +-0.147042854151897970, -0.146993397461995020, -0.146943940404608590, -0.146894482979862300, -0.146845025187879810, -0.146795567028783880, -0.146746108502699900, -0.146696649609750650, +-0.146647190350059770, -0.146597730723750930, -0.146548270730947760, -0.146498810371773920, -0.146449349646352170, -0.146399888554807900, -0.146350427097263950, -0.146300965273843900, +-0.146251503084671440, -0.146202040529870240, -0.146152577609563930, -0.146103114323876180, -0.146053650672929770, -0.146004186656850110, -0.145954722275759950, -0.145905257529783030, +-0.145855792419042950, -0.145806326943663380, -0.145756861103768010, -0.145707394899480480, -0.145657928330923560, -0.145608461398222730, -0.145558994101500750, -0.145509526440881250, +-0.145460058416487960, -0.145410590028444530, -0.145361121276874620, -0.145311652161901010, -0.145262182683649150, -0.145212712842241850, -0.145163242637802750, -0.145113772070455560, +-0.145064301140323950, -0.145014829847531560, -0.144965358192202100, -0.144915886174458390, -0.144866413794425830, -0.144816941052227230, -0.144767467947986280, -0.144717994481826650, +-0.144668520653872030, -0.144619046464246140, -0.144569571913071740, -0.144520097000474270, -0.144470621726576600, -0.144421146091502330, -0.144371670095375220, -0.144322193738318920, +-0.144272717020457160, -0.144223239941913580, -0.144173762502811050, -0.144124284703274960, -0.144074806543428190, -0.144025328023394380, -0.143975849143297250, -0.143926369903260520, +-0.143876890303407860, -0.143827410343862950, -0.143777930024748650, -0.143728449346190420, -0.143678968308311030, -0.143629486911234260, -0.143580005155083760, -0.143530523039983230, +-0.143481040566056400, -0.143431557733426080, -0.143382074542217770, -0.143332590992554270, -0.143283107084559270, -0.143233622818356530, -0.143184138194069720, -0.143134653211822560, +-0.143085167871738780, -0.143035682173941190, -0.142986196118555260, -0.142936709705703880, -0.142887222935510680, -0.142837735808099440, -0.142788248323593880, -0.142738760482117670, +-0.142689272283794580, -0.142639783728747440, -0.142590294817101700, -0.142540805548980220, -0.142491315924506730, -0.142441825943804940, -0.142392335606998630, -0.142342844914211420, +-0.142293353865566270, -0.142243862461188590, -0.142194370701201250, -0.142144878585728000, -0.142095386114892530, -0.142045893288818610, -0.141996400107629960, -0.141946906571450320, +-0.141897412680402510, -0.141847918434612060, -0.141798423834201800, -0.141748928879295490, -0.141699433570016850, -0.141649937906489640, -0.141600441888837580, -0.141550945517183530, +-0.141501448791653020, -0.141451951712368850, -0.141402454279454830, -0.141352956493034670, -0.141303458353232100, -0.141253959860170920, -0.141204461013974820, -0.141154961814766670, +-0.141105462262672010, -0.141055962357813700, -0.141006462100315480, -0.140956961490301120, -0.140907460527894320, -0.140857959213218890, -0.140808457546398590, -0.140758955527556240, +-0.140709453156817380, -0.140659950434304880, -0.140610447360142500, -0.140560943934454010, -0.140511440157363170, -0.140461936028993730, -0.140412431549468560, -0.140362926718913180, +-0.140313421537450520, -0.140263916005204270, -0.140214410122298240, -0.140164903888856190, -0.140115397305001890, -0.140065890370859090, -0.140016383086550680, -0.139966875452202180, +-0.139917367467936510, -0.139867859133877420, -0.139818350450148680, -0.139768841416874040, -0.139719332034177330, -0.139669822302182280, -0.139620312221011790, -0.139570801790791400, +-0.139521291011644010, -0.139471779883693390, -0.139422268407063320, -0.139372756581877560, -0.139323244408259940, -0.139273731886333320, -0.139224219016223260, -0.139174705798052630, +-0.139125192231945250, -0.139075678318024860, -0.139026164056415300, -0.138976649447240340, -0.138927134490623740, -0.138877619186688420, -0.138828103535559970, -0.138778587537361220, +-0.138729071192216000, -0.138679554500248130, -0.138630037461581370, -0.138580520076339500, -0.138531002344645440, -0.138481484266624770, -0.138431965842400390, -0.138382447072096100, +-0.138332927955835680, -0.138283408493742960, -0.138233888685941690, -0.138184368532555720, -0.138134848033707960, -0.138085327189523930, -0.138035806000126600, -0.137986284465639760, +-0.137936762586187200, -0.137887240361892730, -0.137837717792880150, -0.137788194879272410, -0.137738671621195070, -0.137689148018771050, -0.137639624072124130, -0.137590099781378180, +-0.137540575146656960, -0.137491050168084330, -0.137441524845784060, -0.137391999179879100, -0.137342473170495030, -0.137292946817754750, -0.137243420121782120, -0.137193893082700940, +-0.137144365700635010, -0.137094837975708210, -0.137045309908044280, -0.136995781497766200, -0.136946252744999550, -0.136896723649867270, -0.136847194212493170, -0.136797664433001090, +-0.136748134311514860, -0.136698603848158300, -0.136649073043055210, -0.136599541896328560, -0.136550010408103940, -0.136500478578504280, -0.136450946407653460, -0.136401413895675230, +-0.136351881042693500, -0.136302347848832050, -0.136252814314213850, -0.136203280438964510, -0.136153746223206950, -0.136104211667065020, -0.136054676770662570, -0.136005141534123440, +-0.135955605957571450, -0.135906070041130450, -0.135856533784923380, -0.135806997189075850, -0.135757460253710850, -0.135707922978952210, -0.135658385364923720, -0.135608847411749310, +-0.135559309119552750, -0.135509770488457050, -0.135460231518587800, -0.135410692210067960, -0.135361152563021420, -0.135311612577571960, -0.135262072253843510, -0.135212531591959840, +-0.135162990592044870, -0.135113449254221530, -0.135063907578615440, -0.135014365565349600, -0.134964823214547840, -0.134915280526334030, -0.134865737500832000, -0.134816194138165650, +-0.134766650438457920, -0.134717106401834430, -0.134667562028418200, -0.134618017318333030, -0.134568472271702850, -0.134518926888651500, -0.134469381169302790, -0.134419835113780670, +-0.134370288722208050, -0.134320741994710590, -0.134271194931411290, -0.134221647532433990, -0.134172099797902590, -0.134122551727940940, -0.134073003322672880, -0.134023454582222340, +-0.133973905506712290, -0.133924356096268320, -0.133874806351013480, -0.133825256271071640, -0.133775705856566650, -0.133726155107622370, -0.133676604024362740, -0.133627052606911570, +-0.133577500855391910, -0.133527948769929380, -0.133478396350646960, -0.133428843597668540, -0.133379290511118050, -0.133329737091119310, -0.133280183337796230, -0.133230629251271800, +-0.133181074831671690, -0.133131520079118880, -0.133081964993737280, -0.133032409575650770, -0.132982853824983230, -0.132933297741858580, -0.132883741326400660, -0.132834184578732500, +-0.132784627498979790, -0.132735070087265480, -0.132685512343713510, -0.132635954268447760, -0.132586395861592130, -0.132536837123270500, -0.132487278053605880, -0.132437718652723970, +-0.132388158920747760, -0.132338598857801140, -0.132289038464008020, -0.132239477739492320, -0.132189916684377930, -0.132140355298788730, -0.132090793582847780, -0.132041231536680710, +-0.131991669160410580, -0.131942106454161270, -0.131892543418056700, -0.131842980052220750, -0.131793416356777350, -0.131743852331849540, -0.131694287977563000, -0.131644723294040730, +-0.131595158281406640, -0.131545592939784660, -0.131496027269298680, -0.131446461270072650, -0.131396894942230450, -0.131347328285895150, -0.131297761301192420, -0.131248193988245250, +-0.131198626347177630, -0.131149058378113440, -0.131099490081176580, -0.131049921456491030, -0.131000352504180660, -0.130950783224368510, -0.130901213617180300, -0.130851643682739050, +-0.130802073421168700, -0.130752502832593150, -0.130702931917136360, -0.130653360674922230, -0.130603789106074700, -0.130554217210716830, -0.130504644988974290, -0.130455072440970130, +-0.130405499566828290, -0.130355926366672700, -0.130306352840627300, -0.130256778988816020, -0.130207204811361920, -0.130157630308390670, -0.130108055480025350, -0.130058480326389890, +-0.130008904847608240, -0.129959329043804310, -0.129909752915102070, -0.129860176461625450, -0.129810599683497510, -0.129761022580843930, -0.129711445153787820, -0.129661867402453080, +-0.129612289326963700, -0.129562710927443560, -0.129513132204016670, -0.129463553156806050, -0.129413973785937410, -0.129364394091533890, -0.129314814073719340, -0.129265233732617780, +-0.129215653068353110, -0.129166072081049330, -0.129116490770830370, -0.129066909137819290, -0.129017327182141820, -0.128967744903921040, -0.128918162303280880, -0.128868579380345320, +-0.128818996135238340, -0.128769412568083830, -0.128719828679004940, -0.128670244468127330, -0.128620659935574140, -0.128571075081469280, -0.128521489905936730, -0.128471904409100470, +-0.128422318591084440, -0.128372732452012610, -0.128323145992008090, -0.128273559211196570, -0.128223972109701130, -0.128174384687645780, -0.128124796945154470, -0.128075208882351160, +-0.128025620499359840, -0.127976031796304480, -0.127926442773308140, -0.127876853430496570, -0.127827263767992890, -0.127777673785921030, -0.127728083484404980, -0.127678492863568720, +-0.127628901923536240, -0.127579310664431510, -0.127529719086377610, -0.127480127189500300, -0.127430534973922680, -0.127380942439768720, -0.127331349587162380, -0.127281756416227710, +-0.127232162927088610, -0.127182569119868250, -0.127132974994692340, -0.127083380551683970, -0.127033785790967160, -0.126984190712665900, -0.126934595316904150, -0.126884999603805920, +-0.126835403573495180, -0.126785807226095060, -0.126736210561731290, -0.126686613580527020, -0.126637016282606210, -0.126587418668092840, -0.126537820737110920, -0.126488222489784470, +-0.126438623926236560, -0.126389025046593000, -0.126339425850976850, -0.126289826339512160, -0.126240226512322890, -0.126190626369533040, -0.126141025911266660, -0.126091425137647680, +-0.126041824048799270, -0.125992222644847190, -0.125942620925914540, -0.125893018892125340, -0.125843416543603620, -0.125793813880473340, -0.125744210902858510, -0.125694607610882280, +-0.125645004004670410, -0.125595400084346030, -0.125545795850033170, -0.125496191301855800, -0.125446586439937950, -0.125396981264403630, -0.125347375775376880, -0.125297769972980780, +-0.125248163857341170, -0.125198557428581130, -0.125148950686824690, -0.125099343632195910, -0.125049736264818720, -0.125000128584817210, -0.124950520592315400, -0.124900912287436380, +-0.124851303670305970, -0.124801694741047310, -0.124752085499784410, -0.124702475946641290, -0.124652866081741980, -0.124603255905210500, -0.124553645417170000, -0.124504034617746270, +-0.124454423507062470, -0.124404812085242590, -0.124355200352410680, -0.124305588308690790, -0.124255975954206910, -0.124206363289083090, -0.124156750313442490, -0.124107137027410900, +-0.124057523431111450, -0.124007909524668210, -0.123958295308205180, -0.123908680781846430, -0.123859065945715950, -0.123809450799937830, -0.123759835344635190, -0.123710219579933850, +-0.123660603505956960, -0.123610987122828560, -0.123561370430672700, -0.123511753429613400, -0.123462136119774720, -0.123412518501279820, -0.123362900574254500, -0.123313282338821940, +-0.123263663795106170, -0.123214044943231240, -0.123164425783321190, -0.123114806315500090, -0.123065186539891970, -0.123015566456620000, -0.122965946065809990, -0.122916325367585120, +-0.122866704362069440, -0.122817083049386990, -0.122767461429661840, -0.122717839503018040, -0.122668217269578740, -0.122618594729469800, -0.122568971882814360, -0.122519348729736510, +-0.122469725270360260, -0.122420101504809710, -0.122370477433208920, -0.122320853055681920, -0.122271228372351910, -0.122221603383344720, -0.122171978088783490, -0.122122352488792340, +-0.122072726583495310, -0.122023100373016460, -0.121973473857479860, -0.121923847037009580, -0.121874219911728800, -0.121824592481763330, -0.121774964747236400, -0.121725336708272060, +-0.121675708364994380, -0.121626079717527410, -0.121576450765995260, -0.121526821510521090, -0.121477191951230750, -0.121427562088247430, -0.121377931921695200, -0.121328301451698150, +-0.121278670678380340, -0.121229039601865860, -0.121179408222278780, -0.121129776539742300, -0.121080144554382250, -0.121030512266321850, -0.120980879675685160, -0.120931246782596270, +-0.120881613587179280, -0.120831980089558240, -0.120782346289857250, -0.120732712188199520, -0.120683077784710880, -0.120633443079514550, -0.120583808072734620, -0.120534172764495170, +-0.120484537154920290, -0.120434901244134060, -0.120385265032259690, -0.120335628519423050, -0.120285991705747330, -0.120236354591356630, -0.120186717176375050, -0.120137079460926680, +-0.120087441445135600, -0.120037803129125930, -0.119988164513020860, -0.119938525596946260, -0.119888886381025350, -0.119839246865382230, -0.119789607050140990, -0.119739966935425730, +-0.119690326521360550, -0.119640685808068680, -0.119591044795675960, -0.119541403484305640, -0.119491761874081820, -0.119442119965128590, -0.119392477757570060, -0.119342835251530330, +-0.119293192447133520, -0.119243549344502830, -0.119193905943764170, -0.119144262245040720, -0.119094618248456640, -0.119044973954136000, -0.118995329362202930, -0.118945684472781530, +-0.118896039285995930, -0.118846393801969350, -0.118796748020827670, -0.118747101942694100, -0.118697455567692790, -0.118647808895947840, -0.118598161927583360, -0.118548514662723480, +-0.118498867101491430, -0.118449219244013110, -0.118399571090411730, -0.118349922640811410, -0.118300273895336300, -0.118250624854110500, -0.118200975517258140, -0.118151325884903350, +-0.118101675957169350, -0.118052025734182040, -0.118002375216064670, -0.117952724402941370, -0.117903073294936250, -0.117853421892173450, -0.117803770194777100, -0.117754118202871310, +-0.117704465916579350, -0.117654813336027110, -0.117605160461337840, -0.117555507292635660, -0.117505853830044720, -0.117456200073689130, -0.117406546023693060, -0.117356891680179740, +-0.117307237043275060, -0.117257582113102300, -0.117207926889785580, -0.117158271373449040, -0.117108615564216830, -0.117058959462213060, -0.117009303067561910, -0.116959646380386630, +-0.116909989400813100, -0.116860332128964600, -0.116810674564965260, -0.116761016708939250, -0.116711358561010680, -0.116661700121303740, -0.116612041389941650, -0.116562382367050340, +-0.116512723052753080, -0.116463063447174000, -0.116413403550437280, -0.116363743362667030, -0.116314082883987440, -0.116264422114522630, -0.116214761054395890, -0.116165099703733120, +-0.116115438062657620, -0.116065776131293500, -0.116016113909764960, -0.115966451398196130, -0.115916788596711170, -0.115867125505434240, -0.115817462124488610, -0.115767798454000200, +-0.115718134494092310, -0.115668470244889080, -0.115618805706514670, -0.115569140879093240, -0.115519475762748970, -0.115469810357605120, -0.115420144663787640, -0.115370478681419780, +-0.115320812410625740, -0.115271145851529660, -0.115221479004255710, -0.115171811868928070, -0.115122144445670900, -0.115072476734607480, -0.115022808735863760, -0.114973140449563010, +-0.114923471875829420, -0.114873803014787140, -0.114824133866560360, -0.114774464431273250, -0.114724794709049960, -0.114675124700013810, -0.114625454404290730, -0.114575783822004020, +-0.114526112953277840, -0.114476441798236390, -0.114426770357003830, -0.114377098629704340, -0.114327426616461230, -0.114277754317400430, -0.114228081732645250, -0.114178408862319860, +-0.114128735706548450, -0.114079062265455190, -0.114029388539164290, -0.113979714527799910, -0.113930040231485370, -0.113880365650346610, -0.113830690784506930, -0.113781015634090530, +-0.113731340199221580, -0.113681664480024290, -0.113631988476622830, -0.113582312189140530, -0.113532635617703310, -0.113482958762434510, -0.113433281623458320, -0.113383604200898940, +-0.113333926494880530, -0.113284248505527300, -0.113234570232963460, -0.113184891677312300, -0.113135212838699800, -0.113085533717249280, -0.113035854313084910, -0.112986174626330910, +-0.112936494657111470, -0.112886814405550790, -0.112837133871773090, -0.112787453055901650, -0.112737771958062480, -0.112688090578378880, -0.112638408916975030, -0.112588726973975180, +-0.112539044749503510, -0.112489362243684220, -0.112439679456640660, -0.112389996388498770, -0.112340313039381880, -0.112290629409414210, -0.112240945498719980, -0.112191261307423380, +-0.112141576835648630, -0.112091892083519940, -0.112042207051160620, -0.111992521738696680, -0.111942836146251430, -0.111893150273949100, -0.111843464121913890, -0.111793777690270020, +-0.111744090979141700, -0.111694403988653160, -0.111644716718927710, -0.111595029170091370, -0.111545341342267440, -0.111495653235580180, -0.111445964850153780, -0.111396276186112450, +-0.111346587243580440, -0.111296898022681080, -0.111247208523540360, -0.111197518746281630, -0.111147828691029090, -0.111098138357906970, -0.111048447747039520, -0.110998756858550940, +-0.110949065692565480, -0.110899374249206460, -0.110849682528599890, -0.110799990530869110, -0.110750298256138370, -0.110700605704531870, -0.110650912876173860, -0.110601219771188570, +-0.110551526389699340, -0.110501832731832190, -0.110452138797710440, -0.110402444587458360, -0.110352750101200160, -0.110303055339060080, -0.110253360301162380, -0.110203664987631260, +-0.110153969398590110, -0.110104273534164910, -0.110054577394479030, -0.110004880979656700, -0.109955184289822180, -0.109905487325099690, -0.109855790085613480, -0.109806092571487800, +-0.109756394782846000, -0.109706696719814100, -0.109656998382515470, -0.109607299771074320, -0.109557600885614950, -0.109507901726261560, -0.109458202293138410, -0.109408502586368870, +-0.109358802606078970, -0.109309102352392070, -0.109259401825432400, -0.109209701025324220, -0.109159999952191790, -0.109110298606159370, -0.109060596987351200, -0.109010895095890650, +-0.108961192931903760, -0.108911490495513870, -0.108861787786845260, -0.108812084806022180, -0.108762381553168890, -0.108712678028409640, -0.108662974231868710, -0.108613270163669450, +-0.108563565823937900, -0.108513861212797440, -0.108464156330372320, -0.108414451176786820, -0.108364745752165180, -0.108315040056631670, -0.108265334090309700, -0.108215627853325250, +-0.108165921345801750, -0.108116214567863440, -0.108066507519634590, -0.108016800201239480, -0.107967092612802370, -0.107917384754447520, -0.107867676626298330, -0.107817968228480830, +-0.107768259561118410, -0.107718550624335340, -0.107668841418255890, -0.107619131943004350, -0.107569422198704970, -0.107519712185481150, -0.107470001903458940, -0.107420291352761710, +-0.107370580533513770, -0.107320869445839360, -0.107271158089862800, -0.107221446465708330, -0.107171734573500250, -0.107122022413361940, -0.107072309985419470, -0.107022597289796210, +-0.106972884326616470, -0.106923171096004520, -0.106873457598084640, -0.106823743832981110, -0.106774029800818220, -0.106724315501719390, -0.106674600935810630, -0.106624886103215380, +-0.106575171004057920, -0.106525455638462520, -0.106475740006553490, -0.106426024108455100, -0.106376307944290770, -0.106326591514186570, -0.106276874818265880, -0.106227157856653000, +-0.106177440629472220, -0.106127723136847850, -0.106078005378904160, -0.106028287355765470, -0.105978569067555180, -0.105928850514399330, -0.105879131696421370, -0.105829412613745580, +-0.105779693266496260, -0.105729973654797690, -0.105680253778774210, -0.105630533638550090, -0.105580813234248740, -0.105531092565996240, -0.105481371633916020, -0.105431650438132370, +-0.105381928978769590, -0.105332207255951990, -0.105282485269803870, -0.105232763020448660, -0.105183040508012420, -0.105133317732618580, -0.105083594694391440, -0.105033871393455320, +-0.104984147829934520, -0.104934424003953350, -0.104884699915636120, -0.104834975565106250, -0.104785250952489830, -0.104735526077910280, -0.104685800941491940, -0.104636075543359060, +-0.104586349883636020, -0.104536623962447090, -0.104486897779915710, -0.104437171336167990, -0.104387444631327330, -0.104337717665518050, -0.104287990438864500, -0.104238262951490950, +-0.104188535203521750, -0.104138807195081210, -0.104089078926292780, -0.104039350397282530, -0.103989621608173900, -0.103939892559091220, -0.103890163250158800, -0.103840433681500990, +-0.103790703853242090, -0.103740973765506410, -0.103691243418417430, -0.103641512812101220, -0.103591781946681240, -0.103542050822281790, -0.103492319439027220, -0.103442587797041850, +-0.103392855896450020, -0.103343123737375160, -0.103293391319943360, -0.103243658644278090, -0.103193925710503680, -0.103144192518744460, -0.103094459069124750, -0.103044725361768900, +-0.102994991396801220, -0.102945257174345190, -0.102895522694526900, -0.102845787957469810, -0.102796052963298230, -0.102746317712136530, -0.102696582204109040, -0.102646846439340090, +-0.102597110417953150, -0.102547374140074300, -0.102497637605827030, -0.102447900815335650, -0.102398163768724530, -0.102348426466118000, -0.102298688907640410, -0.102248951093416090, +-0.102199213023568510, -0.102149474698223770, -0.102099736117505350, -0.102049997281537600, -0.102000258190444850, -0.101950518844351450, -0.101900779243381760, -0.101851039387660120, +-0.101801299277309990, -0.101751558912457500, -0.101701818293226120, -0.101652077419740190, -0.101602336292124060, -0.101552594910502100, -0.101502853274998650, -0.101453111385737180, +-0.101403369242843820, -0.101353626846442030, -0.101303884196656170, -0.101254141293610610, -0.101204398137429690, -0.101154654728237790, -0.101104911066159240, -0.101055167151317530, +-0.101005422983838790, -0.100955678563846480, -0.100905933891464970, -0.100856188966818650, -0.100806443790031840, -0.100756698361228930, -0.100706952680533380, -0.100657206748071340, +-0.100607460563966290, -0.100557714128342570, -0.100507967441324580, -0.100458220503036650, -0.100408473313603200, -0.100358725873148550, -0.100308978181796200, -0.100259230239672290, +-0.100209482046900310, -0.100159733603604610, -0.100109984909909590, -0.100060235965939600, -0.100010486771819030, -0.099960737327672244, -0.099910987633622717, -0.099861237689796614, +-0.099811487496317422, -0.099761737053309499, -0.099711986360897231, -0.099662235419205006, -0.099612484228357195, -0.099562732788477284, -0.099512981099691436, -0.099463229162123121, +-0.099413476975896739, -0.099363724541136664, -0.099313971857967281, -0.099264218926512965, -0.099214465746898101, -0.099164712319246187, -0.099114958643683387, -0.099065204720333172, +-0.099015450549319955, -0.098965696130768124, -0.098915941464802037, -0.098866186551546095, -0.098816431391124698, -0.098766675983661331, -0.098716920329282157, -0.098667164428110687, +-0.098617408280271310, -0.098567651885888397, -0.098517895245086362, -0.098468138357989593, -0.098418381224721602, -0.098368623845408523, -0.098318866220173898, -0.098269108349142098, +-0.098219350232437538, -0.098169591870184592, -0.098119833262507672, -0.098070074409531166, -0.098020315311378586, -0.097970555968176110, -0.097920796380047248, -0.097871036547116388, +-0.097821276469507931, -0.097771516147346291, -0.097721755580755867, -0.097671994769860160, -0.097622233714785345, -0.097572472415654962, -0.097522710872593385, -0.097472949085725027, +-0.097423187055174304, -0.097373424781065615, -0.097323662263523361, -0.097273899502671082, -0.097224136498634914, -0.097174373251538423, -0.097124609761505984, -0.097074846028662037, +-0.097025082053130970, -0.096975317835037184, -0.096925553374505119, -0.096875788671658289, -0.096826023726622856, -0.096776258539522375, -0.096726493110481246, -0.096676727439623883, +-0.096626961527074701, -0.096577195372958113, -0.096527428977397647, -0.096477662340519507, -0.096427895462447205, -0.096378128343305169, -0.096328360983217801, -0.096278593382309541, +-0.096228825540704790, -0.096179057458527978, -0.096129289135902643, -0.096079520572954963, -0.096029751769808491, -0.095979982726587629, -0.095930213443416817, -0.095880443920420458, +-0.095830674157723006, -0.095780904155448862, -0.095731133913721581, -0.095681363432667338, -0.095631592712409688, -0.095581821753073060, -0.095532050554781880, -0.095482279117660565, +-0.095432507441833556, -0.095382735527424392, -0.095332963374559279, -0.095283190983361757, -0.095233418353956253, -0.095183645486467211, -0.095133872381019058, -0.095084099037736208, +-0.095034325456743118, -0.094984551638163342, -0.094934777582123056, -0.094885003288745828, -0.094835228758156101, -0.094785453990478288, -0.094735678985836846, -0.094685903744356217, +-0.094636128266159941, -0.094586352551374223, -0.094536576600122615, -0.094486800412529576, -0.094437023988719532, -0.094387247328816939, -0.094337470432946213, -0.094287693301231823, +-0.094237915933797309, -0.094188138330768889, -0.094138360492270132, -0.094088582418425465, -0.094038804109359345, -0.093989025565196213, -0.093939246786060512, -0.093889467772076698, +-0.093839688523368339, -0.093789909040061625, -0.093740129322280152, -0.093690349370148363, -0.093640569183790684, -0.093590788763331587, -0.093541008108895526, -0.093491227220606057, +-0.093441446098589398, -0.093391664742969130, -0.093341883153869695, -0.093292101331415550, -0.093242319275731164, -0.093192536986940966, -0.093142754465169439, -0.093092971710540137, +-0.093043188723179279, -0.092993405503210461, -0.092943622050758123, -0.092893838365946738, -0.092844054448900759, -0.092794270299744630, -0.092744485918602834, -0.092694701305598939, +-0.092644916460859178, -0.092595131384507118, -0.092545346076667229, -0.092495560537463981, -0.092445774767021829, -0.092395988765465245, -0.092346202532917795, -0.092296416069505727, +-0.092246629375352621, -0.092196842450582947, -0.092147055295321162, -0.092097267909691735, -0.092047480293819137, -0.091997692447827850, -0.091947904371841443, -0.091898116065986149, +-0.091848327530385576, -0.091798538765164181, -0.091748749770446433, -0.091698960546356817, -0.091649171093019802, -0.091599381410558969, -0.091549591499100580, -0.091499801358768201, +-0.091450010989686317, -0.091400220391979412, -0.091350429565771940, -0.091300638511188414, -0.091250847228353291, -0.091201055717390150, -0.091151263978425268, -0.091101472011582224, +-0.091051679816985490, -0.091001887394759562, -0.090952094745028925, -0.090902301867918034, -0.090852508763551401, -0.090802715432052608, -0.090752921873547915, -0.090703128088160917, +-0.090653334076016098, -0.090603539837237942, -0.090553745371950933, -0.090503950680279555, -0.090454155762347430, -0.090404360618280791, -0.090354565248203261, -0.090304769652239311, +-0.090254973830513438, -0.090205177783150126, -0.090155381510273871, -0.090105585012009173, -0.090055788288479613, -0.090005991339811478, -0.089956194166128350, -0.089906396767554755, +-0.089856599144215163, -0.089806801296234057, -0.089757003223735962, -0.089707204926845363, -0.089657406405685855, -0.089607607660383726, -0.089557808691062571, -0.089508009497846902, +-0.089458210080861203, -0.089408410440229985, -0.089358610576077732, -0.089308810488528081, -0.089259010177707279, -0.089209209643738949, -0.089159408886747601, -0.089109607906857721, +-0.089059806704193833, -0.089010005278880422, -0.088960203631041998, -0.088910401760802185, -0.088860599668287257, -0.088810797353620824, -0.088760994816927397, -0.088711192058331473, +-0.088661389077957578, -0.088611585875930210, -0.088561782452372992, -0.088511978807412212, -0.088462174941171479, -0.088412370853775304, -0.088362566545348201, -0.088312762016014679, +-0.088262957265899264, -0.088213152295126454, -0.088163347103819872, -0.088113541692105807, -0.088063736060107894, -0.088013930207950633, -0.087964124135758548, -0.087914317843656165, +-0.087864511331767967, -0.087814704600218507, -0.087764897649131396, -0.087715090478632921, -0.087665283088846732, -0.087615475479897315, -0.087565667651909221, -0.087515859605006963, +-0.087466051339315051, -0.087416242854957124, -0.087366434152059483, -0.087316625230745751, -0.087266816091140453, -0.087217006733368116, -0.087167197157553264, -0.087117387363820423, +-0.087067577352294104, -0.087017767123097972, -0.086967956676358288, -0.086918146012198730, -0.086868335130743796, -0.086818524032118025, -0.086768712716445942, -0.086718901183852087, +-0.086669089434460972, -0.086619277468396247, -0.086569465285784214, -0.086519652886748524, -0.086469840271413703, -0.086420027439904276, -0.086370214392344782, -0.086320401128859747, +-0.086270587649572822, -0.086220773954610322, -0.086170960044095885, -0.086121145918154049, -0.086071331576909341, -0.086021517020486313, -0.085971702249009491, -0.085921887262603414, +-0.085872072061391733, -0.085822256645500750, -0.085772441015054129, -0.085722625170176411, -0.085672809110992121, -0.085622992837625811, -0.085573176350202021, -0.085523359648844402, +-0.085473542733679284, -0.085423725604830289, -0.085373908262421999, -0.085324090706578926, -0.085274272937425621, -0.085224454955086640, -0.085174636759686520, -0.085124818351348927, +-0.085074999730200176, -0.085025180896363919, -0.084975361849964723, -0.084925542591127098, -0.084875723119975641, -0.084825903436634861, -0.084776083541229327, -0.084726263433882704, +-0.084676443114721306, -0.084626622583868785, -0.084576801841449722, -0.084526980887588657, -0.084477159722410128, -0.084427338346038716, -0.084377516758598059, -0.084327694960214500, +-0.084277872951011704, -0.084228050731114223, -0.084178228300646626, -0.084128405659733438, -0.084078582808499253, -0.084028759747068610, -0.083978936475565175, -0.083929112994115290, +-0.083879289302842622, -0.083829465401871722, -0.083779641291327173, -0.083729816971333512, -0.083679992442015308, -0.083630167703497127, -0.083580342755902634, -0.083530517599358173, +-0.083480692233987422, -0.083430866659914935, -0.083381040877265292, -0.083331214886163033, -0.083281388686732738, -0.083231562279098101, -0.083181735663385423, -0.083131908839718424, +-0.083082081808221644, -0.083032254569019665, -0.082982427122237037, -0.082932599467998358, -0.082882771606428166, -0.082832943537650167, -0.082783115261790691, -0.082733286778973431, +-0.082683458089322953, -0.082633629192963826, -0.082583800090020629, -0.082533970780617943, -0.082484141264879435, -0.082434311542931446, -0.082384481614897698, -0.082334651480902743, +-0.082284821141071149, -0.082234990595527510, -0.082185159844396394, -0.082135328887802367, -0.082085497725869150, -0.082035666358723058, -0.081985834786487813, -0.081936003009287980, +-0.081886171027248142, -0.081836338840492864, -0.081786506449146743, -0.081736673853334357, -0.081686841053179401, -0.081637008048808232, -0.081587174840344542, -0.081537341427912913, +-0.081487507811637938, -0.081437673991644186, -0.081387839968056250, -0.081338005740997824, -0.081288171310595264, -0.081238336676972292, -0.081188501840253474, -0.081138666800563392, +-0.081088831558026653, -0.081038996112767839, -0.080989160464911517, -0.080939324614581420, -0.080889488561903894, -0.080839652307002657, -0.080789815850002278, -0.080739979191027364, +-0.080690142330202497, -0.080640305267652285, -0.080590468003501295, -0.080540630537873262, -0.080490792870894529, -0.080440955002688816, -0.080391116933380719, -0.080341278663094831, +-0.080291440191955749, -0.080241601520088052, -0.080191762647615475, -0.080141923574664375, -0.080092084301358474, -0.080042244827822351, -0.079992405154180629, -0.079942565280557876, +-0.079892725207078727, -0.079842884933867764, -0.079793044461048693, -0.079743203788747899, -0.079693362917089103, -0.079643521846196885, -0.079593680576195869, -0.079543839107210662, +-0.079493997439365846, -0.079444155572785155, -0.079394313507594960, -0.079344471243918982, -0.079294628781881829, -0.079244786121608096, -0.079194943263222406, -0.079145100206849353, +-0.079095256952613546, -0.079045413500638720, -0.078995569851051245, -0.078945726003974842, -0.078895881959534120, -0.078846037717853701, -0.078796193279058180, -0.078746348643272179, +-0.078696503810620308, -0.078646658781226286, -0.078596813555216513, -0.078546968132714695, -0.078497122513845469, -0.078447276698733429, -0.078397430687503197, -0.078347584480279384, +-0.078297738077185736, -0.078247891478348625, -0.078198044683891785, -0.078148197693939825, -0.078098350508617381, -0.078048503128049049, -0.077998655552359478, -0.077948807781673249, +-0.077898959816114124, -0.077849111655808489, -0.077799263300880064, -0.077749414751453486, -0.077699566007653376, -0.077649717069604343, -0.077599867937431025, -0.077550018611258043, +-0.077500169091209117, -0.077450319377410648, -0.077400469469986397, -0.077350619369060958, -0.077300769074758982, -0.077250918587205078, -0.077201067906523882, -0.077151217032839128, +-0.077101365966277216, -0.077051514706961879, -0.077001663255017769, -0.076951811610569493, -0.076901959773741702, -0.076852107744658990, -0.076802255523446022, -0.076752403110226533, +-0.076702550505126921, -0.076652697708270920, -0.076602844719783181, -0.076552991539788340, -0.076503138168411006, -0.076453284605775843, -0.076403430852006571, -0.076353576907229603, +-0.076303722771568702, -0.076253868445148490, -0.076204013928093617, -0.076154159220528692, -0.076104304322578378, -0.076054449234367313, -0.076004593956019231, -0.075954738487660545, +-0.075904882829415016, -0.075855026981407281, -0.075805170943761976, -0.075755314716603739, -0.075705458300057232, -0.075655601694247065, -0.075605744899297014, -0.075555887915333478, +-0.075506030742480232, -0.075456173380861899, -0.075406315830603143, -0.075356458091828601, -0.075306600164662910, -0.075256742049229816, -0.075206883745655775, -0.075157025254064508, +-0.075107166574580692, -0.075057307707328949, -0.075007448652433945, -0.074957589410020314, -0.074907729980212709, -0.074857870363134904, -0.074808010558913299, -0.074758150567671669, +-0.074708290389534665, -0.074658430024626923, -0.074608569473073122, -0.074558708734997883, -0.074508847810524997, -0.074458986699780877, -0.074409125402889284, -0.074359263919974883, +-0.074309402251162324, -0.074259540396576257, -0.074209678356341346, -0.074159816130582229, -0.074109953719422680, -0.074060091122989141, -0.074010228341405374, -0.073960365374796042, +-0.073910502223285796, -0.073860638886999286, -0.073810775366061177, -0.073760911660596132, -0.073711047770727928, -0.073661183696582991, -0.073611319438285083, -0.073561454995958897, +-0.073511590369729055, -0.073461725559720248, -0.073411860566057113, -0.073361995388863455, -0.073312130028265685, -0.073262264484387593, -0.073212398757353844, -0.073162532847289102, +-0.073112666754318018, -0.073062800478565268, -0.073012934020155518, -0.072963067379212557, -0.072913200555862798, -0.072863333550230044, -0.072813466362438961, -0.072763598992614212, +-0.072713731440880461, -0.072663863707362372, -0.072613995792183750, -0.072564127695471034, -0.072514259417347987, -0.072464390957939287, -0.072414522317369612, -0.072364653495763639, +-0.072314784493246020, -0.072264915309941447, -0.072215045945973694, -0.072165176401469230, -0.072115306676551805, -0.072065436771346122, -0.072015566685976848, -0.071965696420568659, +-0.071915825975246220, -0.071865955350134222, -0.071816084545356443, -0.071766213561039349, -0.071716342397306718, -0.071666471054283226, -0.071616599532093567, -0.071566727830862403, +-0.071516855950714414, -0.071466983891773403, -0.071417111654165824, -0.071367239238015454, -0.071317366643446997, -0.071267493870585119, -0.071217620919554511, -0.071167747790479852, +-0.071117874483485818, -0.071068000998696201, -0.071018127336237483, -0.070968253496233438, -0.070918379478808774, -0.070868505284088154, -0.070818630912196256, -0.070768756363257801, +-0.070718881637397438, -0.070669006734738998, -0.070619131655408923, -0.070569256399531016, -0.070519380967229969, -0.070469505358630474, -0.070419629573857223, -0.070369753613034880, +-0.070319877476287276, -0.070270001163740867, -0.070220124675519455, -0.070170248011747718, -0.070120371172550378, -0.070070494158052096, -0.070020616968377594, -0.069970739603651536, +-0.069920862063997752, -0.069870984349542697, -0.069821106460410176, -0.069771228396724894, -0.069721350158611542, -0.069671471746194813, -0.069621593159599399, -0.069571714398949117, +-0.069521835464370449, -0.069471956355987172, -0.069422077073924018, -0.069372197618305667, -0.069322317989256824, -0.069272438186902180, -0.069222558211366456, -0.069172678062773441, +-0.069122797741249617, -0.069072917246918789, -0.069023036579905675, -0.068973155740334968, -0.068923274728331374, -0.068873393544019598, -0.068823512187524333, -0.068773630658969409, +-0.068723748958481282, -0.068673867086183796, -0.068623985042201630, -0.068574102826659503, -0.068524220439682121, -0.068474337881394190, -0.068424455151919528, -0.068374572251384616, +-0.068324689179913273, -0.068274805937630204, -0.068224922524660128, -0.068175038941127739, -0.068125155187157754, -0.068075271262874881, -0.068025387168402937, -0.067975502903868418, +-0.067925618469395141, -0.067875733865107812, -0.067825849091131152, -0.067775964147589879, -0.067726079034608686, -0.067676193752312291, -0.067626308300824542, -0.067576422680271891, +-0.067526536890778199, -0.067476650932468157, -0.067426764805466485, -0.067376878509897903, -0.067326992045887130, -0.067277105413557983, -0.067227218613036960, -0.067177331644447891, +-0.067127444507915496, -0.067077557203564481, -0.067027669731519579, -0.066977782091905511, -0.066927894284846981, -0.066878006310467822, -0.066828118168894543, -0.066778229860250962, +-0.066728341384661813, -0.066678452742251801, -0.066628563933145674, -0.066578674957468123, -0.066528785815342995, -0.066478896506896798, -0.066429007032253365, -0.066379117391537401, +-0.066329227584873654, -0.066279337612386829, -0.066229447474201661, -0.066179557170442882, -0.066129666701234324, -0.066079776066702484, -0.066029885266971192, -0.065979994302165196, +-0.065930103172409216, -0.065880211877827985, -0.065830320418546209, -0.065780428794688636, -0.065730537006379111, -0.065680645053744130, -0.065630752936907524, -0.065580860655994055, +-0.065530968211128415, -0.065481075602435365, -0.065431182830039625, -0.065381289894065039, -0.065331396794638119, -0.065281503531882709, -0.065231610105923529, -0.065181716516885341, +-0.065131822764892849, -0.065081928850070803, -0.065032034772543934, -0.064982140532436089, -0.064932246129873777, -0.064882351564980859, -0.064832456837882066, -0.064782561948702119, +-0.064732666897565766, -0.064682771684597754, -0.064632876309922815, -0.064582980773664783, -0.064533085075950208, -0.064483189216902909, -0.064433293196647631, -0.064383397015309124, +-0.064333500673012134, -0.064283604169881381, -0.064233707506040738, -0.064183810681616701, -0.064133913696733144, -0.064084016551514814, -0.064034119246086429, -0.063984221780572753, +-0.063934324155098518, -0.063884426369788472, -0.063834528424766473, -0.063784630320159047, -0.063734732056090038, -0.063684833632684207, -0.063634935050066274, -0.063585036308361029, +-0.063535137407693176, -0.063485238348186590, -0.063435339129967808, -0.063385439753160674, -0.063335540217889938, -0.063285640524280345, -0.063235740672456658, -0.063185840662543624, +-0.063135940494665976, -0.063086040168947602, -0.063036139685515011, -0.062986239044492076, -0.062936338246003531, -0.062886437290174152, -0.062836536177128671, -0.062786634906991851, +-0.062736733479888451, -0.062686831895942319, -0.062636930155280005, -0.062587028258025354, -0.062537126204303142, -0.062487223994238117, -0.062437321627955025, -0.062387419105578629, +-0.062337516427232800, -0.062287613593044071, -0.062237710603136306, -0.062187807457634262, -0.062137904156662697, -0.062088000700346375, -0.062038097088810050, -0.061988193322178489, +-0.061938289400575552, -0.061888385324127777, -0.061838481092959037, -0.061788576707194100, -0.061738672166957720, -0.061688767472374659, -0.061638862623569678, -0.061588957620667538, +-0.061539052463792127, -0.061489147153069960, -0.061439241688624933, -0.061389336070581800, -0.061339430299065328, -0.061289524374200273, -0.061239618296111416, -0.061189712064922623, +-0.061139805680760433, -0.061089899143748738, -0.061039992454012287, -0.060990085611675855, -0.060940178616864217, -0.060890271469702120, -0.060840364170314354, -0.060790456718824791, +-0.060740549115359969, -0.060690641360043776, -0.060640733453000979, -0.060590825394356347, -0.060540917184234655, -0.060491008822760664, -0.060441100310058268, -0.060391191646254012, +-0.060341282831471776, -0.060291373865836329, -0.060241464749472444, -0.060191555482504905, -0.060141646065058472, -0.060091736497257929, -0.060041826779227155, -0.059991916911092701, +-0.059942006892978454, -0.059892096725009190, -0.059842186407309685, -0.059792275940004712, -0.059742365323219054, -0.059692454557077473, -0.059642543641703877, -0.059592632577224809, +-0.059542721363764158, -0.059492810001446704, -0.059442898490397224, -0.059392986830740499, -0.059343075022601305, -0.059293163066103535, -0.059243250961373749, -0.059193338708535832, +-0.059143426307714575, -0.059093513759034745, -0.059043601062621132, -0.058993688218598517, -0.058943775227091683, -0.058893862088224523, -0.058843948802123590, -0.058794035368912791, +-0.058744121788716901, -0.058694208061660709, -0.058644294187868998, -0.058594380167466549, -0.058544466000578145, -0.058494551687327694, -0.058444637227841753, -0.058394722622244218, +-0.058344807870659869, -0.058294892973213511, -0.058244977930029911, -0.058195062741233872, -0.058145147406949288, -0.058095231927302725, -0.058045316302418083, -0.057995400532420145, +-0.057945484617433707, -0.057895568557583557, -0.057845652352994485, -0.057795736003791287, -0.057745819510097857, -0.057695902872040773, -0.057645986089743924, -0.057596069163332111, +-0.057546152092930125, -0.057496234878662761, -0.057446317520654808, -0.057396400019030180, -0.057346482373915431, -0.057296564585434480, -0.057246646653712117, -0.057196728578873139, +-0.057146810361042334, -0.057096892000344505, -0.057046973496904449, -0.056997054850846073, -0.056947136062295942, -0.056897217131377978, -0.056847298058216963, -0.056797378842937708, +-0.056747459485665008, -0.056697539986523653, -0.056647620345638451, -0.056597700563133312, -0.056547780639134806, -0.056497860573766857, -0.056447940367154247, -0.056398020019421791, +-0.056348099530694279, -0.056298178901096528, -0.056248258130752432, -0.056198337219788584, -0.056148416168328892, -0.056098494976498159, -0.056048573644421187, -0.055998652172222788, +-0.055948730560027755, -0.055898808807960894, -0.055848886916146125, -0.055798964884710020, -0.055749042713776509, -0.055699120403470394, -0.055649197953916471, -0.055599275365239557, +-0.055549352637564456, -0.055499429771015969, -0.055449506765718019, -0.055399583621797192, -0.055349660339377410, -0.055299736918583475, -0.055249813359540198, -0.055199889662372388, +-0.055149965827204848, -0.055100041854161515, -0.055050117743368959, -0.055000193494951111, -0.054950269109032779, -0.054900344585738767, -0.054850419925193905, -0.054800495127522983, +-0.054750570192850831, -0.054700645121301364, -0.054650719913001168, -0.054600794568074179, -0.054550869086645200, -0.054500943468839047, -0.054451017714780538, -0.054401091824594482, +-0.054351165798404814, -0.054301239636338115, -0.054251313338518313, -0.054201386905070238, -0.054151460336118687, -0.054101533631788490, -0.054051606792204457, -0.054001679817491405, +-0.053951752707773269, -0.053901825463176636, -0.053851898083825442, -0.053801970569844502, -0.053752042921358635, -0.053702115138492663, -0.053652187221371397, -0.053602259170119668, +-0.053552330984861410, -0.053502402665723203, -0.053452474212828990, -0.053402545626303595, -0.053352616906271834, -0.053302688052858531, -0.053252759066188503, -0.053202829946385699, +-0.053152900693576699, -0.053102971307885452, -0.053053041789436775, -0.053003112138355499, -0.052953182354766440, -0.052903252438794422, -0.052853322390564270, -0.052803392210199931, +-0.052753461897828001, -0.052703531453572407, -0.052653600877557993, -0.052603670169909571, -0.052553739330751977, -0.052503808360210034, -0.052453877258408568, -0.052403946025471528, +-0.052354014661525505, -0.052304083166694444, -0.052254151541103182, -0.052204219784876535, -0.052154287898139341, -0.052104355881016425, -0.052054423733631734, -0.052004491456111870, +-0.051954559048580776, -0.051904626511163288, -0.051854693843984230, -0.051804761047168441, -0.051754828120840750, -0.051704895065125982, -0.051654961880148093, -0.051605028566033689, +-0.051555095122906715, -0.051505161550891999, -0.051455227850114381, -0.051405294020698690, -0.051355360062769764, -0.051305425976451553, -0.051255491761870664, -0.051205557419151046, +-0.051155622948417537, -0.051105688349794967, -0.051055753623408182, -0.051005818769382004, -0.050955883787841286, -0.050905948678909969, -0.050856013442714662, -0.050806078079379327, +-0.050756142589028802, -0.050706206971787911, -0.050656271227781512, -0.050606335357134428, -0.050556399359971506, -0.050506463236416700, -0.050456526986596618, -0.050406590610635224, +-0.050356654108657355, -0.050306717480787848, -0.050256780727151548, -0.050206843847873300, -0.050156906843077047, -0.050106969712889422, -0.050057032457434369, -0.050007095076836733, +-0.049957157571221364, -0.049907219940713100, -0.049857282185436780, -0.049807344305517261, -0.049757406301078493, -0.049707468172247096, -0.049657529919147028, -0.049607591541903133, +-0.049557653040640262, -0.049507714415483260, -0.049457775666556972, -0.049407836793986241, -0.049357897797895033, -0.049307958678409966, -0.049258019435655005, -0.049208080069754995, +-0.049158140580834786, -0.049108200969019224, -0.049058261234433159, -0.049008321377200556, -0.048958381397448035, -0.048908441295299560, -0.048858501070879981, -0.048808560724314151, +-0.048758620255726921, -0.048708679665243136, -0.048658738952987654, -0.048608798119084438, -0.048558857163660110, -0.048508916086838647, -0.048458974888744892, -0.048409033569503691, +-0.048359092129239917, -0.048309150568078406, -0.048259208886143136, -0.048209267083560728, -0.048159325160455152, -0.048109383116951260, -0.048059440953173917, -0.048009498669247967, +-0.047959556265298277, -0.047909613741449690, -0.047859671097826184, -0.047809728334554387, -0.047759785451758269, -0.047709842449562681, -0.047659899328092496, -0.047609956087472559, +-0.047560012727827734, -0.047510069249282874, -0.047460125651961955, -0.047410181935991613, -0.047360238101495811, -0.047310294148599413, -0.047260350077427286, -0.047210405888104275, +-0.047160461580755257, -0.047110517155504197, -0.047060572612477723, -0.047010627951799826, -0.046960683173595356, -0.046910738277989181, -0.046860793265106157, -0.046810848135071151, +-0.046760902888009027, -0.046710957524043757, -0.046661012043301982, -0.046611066445907672, -0.046561120731985699, -0.046511174901660922, -0.046461228955058213, -0.046411282892302425, +-0.046361336713517547, -0.046311390418830214, -0.046261444008364405, -0.046211497482244984, -0.046161550840596824, -0.046111604083544783, -0.046061657211213733, -0.046011710223728540, +-0.045961763121213181, -0.045911815903794305, -0.045861868571595889, -0.045811921124742798, -0.045761973563359912, -0.045712025887572089, -0.045662078097504194, -0.045612130193281114, +-0.045562182175026812, -0.045512234042867951, -0.045462285796928500, -0.045412337437333333, -0.045362388964207329, -0.045312440377675345, -0.045262491677862261, -0.045212542864892062, +-0.045162593938891396, -0.045112644899984240, -0.045062695748295481, -0.045012746483949977, -0.044962797107072607, -0.044912847617788243, -0.044862898016221758, -0.044812948302497144, +-0.044762998476741041, -0.044713048539077448, -0.044663098489631237, -0.044613148328527273, -0.044563198055890436, -0.044513247671845613, -0.044463297176517667, -0.044413346570030585, +-0.044363395852511034, -0.044313445024082986, -0.044263494084871326, -0.044213543035000934, -0.044163591874596682, -0.044113640603783449, -0.044063689222685234, -0.044013737731428679, +-0.043963786130137773, -0.043913834418937411, -0.043863882597952458, -0.043813930667307800, -0.043763978627128317, -0.043714026477538886, -0.043664074218663501, -0.043614121850628823, +-0.043564169373558836, -0.043514216787578421, -0.043464264092812468, -0.043414311289385860, -0.043364358377423466, -0.043314405357049293, -0.043264452228389996, -0.043214498991569567, +-0.043164545646712883, -0.043114592193944846, -0.043064638633390322, -0.043014684965174202, -0.042964731189421367, -0.042914777306255820, -0.042864823315804219, -0.042814869218190561, +-0.042764915013539725, -0.042714960701976605, -0.042665006283626079, -0.042615051758613041, -0.042565097127062371, -0.042515142389098072, -0.042465187544846808, -0.042415232594432570, +-0.042365277537980257, -0.042315322375614743, -0.042265367107460927, -0.042215411733643689, -0.042165456254287040, -0.042115500669517636, -0.042065544979459475, -0.042015589184237458, +-0.041965633283976470, -0.041915677278801390, -0.041865721168837126, -0.041815764954208551, -0.041765808635039682, -0.041715852211457176, -0.041665895683585044, -0.041615939051548166, +-0.041565982315471442, -0.041516025475479765, -0.041466068531698028, -0.041416111484251110, -0.041366154333263030, -0.041316197078860452, -0.041266239721167386, -0.041216282260308712, +-0.041166324696409337, -0.041116367029594154, -0.041066409259988050, -0.041016451387715036, -0.040966493412901775, -0.040916535335672286, -0.040866577156151461, -0.040816618874464188, +-0.040766660490735372, -0.040716702005089901, -0.040666743417652682, -0.040616784728547711, -0.040566825937901667, -0.040516867045838553, -0.040466908052483277, -0.040416948957960733, +-0.040366989762395812, -0.040317030465913416, -0.040267071068637562, -0.040217111570694915, -0.040167151972209485, -0.040117192273306179, -0.040067232474109891, -0.040017272574745529, +-0.039967312575337977, -0.039917352476012143, -0.039867392276892046, -0.039817431978104355, -0.039767471579773082, -0.039717511082023128, -0.039667550484979400, -0.039617589788766797, +-0.039567628993510212, -0.039517668099334560, -0.039467707106363853, -0.039417746014724760, -0.039367784824541306, -0.039317823535938386, -0.039267862149040912, -0.039217900663973779, +-0.039167939080861899, -0.039117977399829279, -0.039068015621002608, -0.039018053744505891, -0.038968091770464043, -0.038918129699001963, -0.038868167530244566, -0.038818205264316744, +-0.038768242901343411, -0.038718280441448587, -0.038668317884758940, -0.038618355231398505, -0.038568392481492179, -0.038518429635164872, -0.038468466692541496, -0.038418503653746952, +-0.038368540518905259, -0.038318577288143099, -0.038268613961584499, -0.038218650539354367, -0.038168687021577601, -0.038118723408379122, -0.038068759699883839, -0.038018795896216651, +-0.037968831997501590, -0.037918868003865333, -0.037868903915431906, -0.037818939732326216, -0.037768975454673184, -0.037719011082597710, -0.037669046616224708, -0.037619082055679091, +-0.037569117401084880, -0.037519152652568763, -0.037469187810254767, -0.037419222874267799, -0.037369257844732773, -0.037319292721774602, -0.037269327505518202, -0.037219362196087596, +-0.037169396793609470, -0.037119431298207849, -0.037069465710007653, -0.037019500029133796, -0.036969534255711187, -0.036919568389864738, -0.036869602431719370, -0.036819636381399110, +-0.036769670239030647, -0.036719704004738007, -0.036669737678646112, -0.036619771260879869, -0.036569804751564197, -0.036519838150824012, -0.036469871458784234, -0.036419904675568888, +-0.036369937801304673, -0.036319970836115607, -0.036270003780126618, -0.036220036633462613, -0.036170069396248526, -0.036120102068609258, -0.036070134650668849, -0.036020167142553995, +-0.035970199544388723, -0.035920231856297946, -0.035870264078406593, -0.035820296210839583, -0.035770328253721825, -0.035720360207178253, -0.035670392071332893, -0.035620423846312435, +-0.035570455532240919, -0.035520487129243265, -0.035470518637444395, -0.035420550056969230, -0.035370581387942683, -0.035320612630488801, -0.035270643784734275, -0.035220674850803137, +-0.035170705828820314, -0.035120736718910722, -0.035070767521199288, -0.035020798235810939, -0.034970828862870597, -0.034920859402502294, -0.034870889854832728, -0.034820920219985937, +-0.034770950498086844, -0.034720980689260376, -0.034671010793631461, -0.034621040811325013, -0.034571070742465966, -0.034521100587178354, -0.034471130345588873, -0.034421160017821577, +-0.034371189604001373, -0.034321219104253196, -0.034271248518701974, -0.034221277847472628, -0.034171307090689197, -0.034121336248478393, -0.034071365320964248, -0.034021394308271682, +-0.033971423210525639, -0.033921452027851032, -0.033871480760372795, -0.033821509408215857, -0.033771537971504263, -0.033721566450364705, -0.033671594844921236, -0.033621623155298777, +-0.033571651381622263, -0.033521679524016613, -0.033471707582606772, -0.033421735557517658, -0.033371763448873319, -0.033321791256800459, -0.033271818981423118, -0.033221846622866237, +-0.033171874181254730, -0.033121901656713547, -0.033071929049367600, -0.033021956359340951, -0.032971983586760296, -0.032922010731749683, -0.032872037794434039, -0.032822064774938306, +-0.032772091673387412, -0.032722118489906284, -0.032672145224619857, -0.032622171877652185, -0.032572198449129973, -0.032522224939177259, -0.032472251347918986, -0.032422277675480081, +-0.032372303921985486, -0.032322330087560129, -0.032272356172328064, -0.032222382176415987, -0.032172408099947959, -0.032122433943048916, -0.032072459705843784, -0.032022485388457499, +-0.031972510991015002, -0.031922536513641235, -0.031872561956460231, -0.031822587319598715, -0.031772612603180726, -0.031722637807331207, -0.031672662932175091, -0.031622687977837322, +-0.031572712944442832, -0.031522737832116558, -0.031472762640982560, -0.031422787371167535, -0.031372812022795543, -0.031322836595991520, -0.031272861090880406, -0.031222885507587138, +-0.031172909846236659, -0.031122934106953017, -0.031072958289862927, -0.031022982395090441, -0.030973006422760501, -0.030923030372998043, -0.030873054245928008, -0.030823078041675341, +-0.030773101760364976, -0.030723125402120969, -0.030673148967070036, -0.030623172455336231, -0.030573195867044496, -0.030523219202319773, -0.030473242461286999, -0.030423265644071117, +-0.030373288750797076, -0.030323311781588921, -0.030273334736573378, -0.030223357615874497, -0.030173380419617219, -0.030123403147926494, -0.030073425800927259, -0.030023448378744461, +-0.029973470881502151, -0.029923493309327056, -0.029873515662343225, -0.029823537940675604, -0.029773560144449141, -0.029723582273788775, -0.029673604328819457, -0.029623626309666126, +-0.029573648216452839, -0.029523670049306321, -0.029473691808350629, -0.029423713493710708, -0.029373735105511504, -0.029323756643877957, -0.029273778108935024, -0.029223799500806755, +-0.029173820819619875, -0.029123842065498444, -0.029073863238567407, -0.029023884338951714, -0.028973905366776308, -0.028923926322166140, -0.028873947205246157, -0.028823968016140417, +-0.028773988754975645, -0.028724009421875901, -0.028674030016966130, -0.028624050540371287, -0.028574070992216320, -0.028524091372626171, -0.028474111681725797, -0.028424131919639255, +-0.028374152086493271, -0.028324172182411907, -0.028274192207520112, -0.028224212161942836, -0.028174232045805030, -0.028124251859231647, -0.028074271602346743, -0.028024291275277047, +-0.027974310878146627, -0.027924330411080427, -0.027874349874203400, -0.027824369267640502, -0.027774388591516676, -0.027724407845956880, -0.027674427031085178, -0.027624446147028296, +-0.027574465193910300, -0.027524484171856139, -0.027474503080990767, -0.027424521921439141, -0.027374540693326205, -0.027324559396776922, -0.027274578031915350, -0.027224596598868223, +-0.027174615097759602, -0.027124633528714442, -0.027074651891857700, -0.027024670187314331, -0.026974688415209284, -0.026924706575666629, -0.026874724668813094, -0.026824742694772748, +-0.026774760653670546, -0.026724778545631440, -0.026674796370780390, -0.026624814129242350, -0.026574831821142272, -0.026524849446604229, -0.026474867005754948, -0.026424884498718500, +-0.026374901925619840, -0.026324919286583929, -0.026274936581735717, -0.026224953811200161, -0.026174970975101339, -0.026124988073565971, -0.026075005106718136, -0.026025022074682790, +-0.025975038977584887, -0.025925055815549384, -0.025875072588701246, -0.025825089297165423, -0.025775105941065992, -0.025725122520529681, -0.025675139035680566, -0.025625155486643601, +-0.025575171873543748, -0.025525188196505968, -0.025475204455655216, -0.025425220651116451, -0.025375236783013750, -0.025325252851473842, -0.025275268856620802, -0.025225284798579592, +-0.025175300677475167, -0.025125316493432494, -0.025075332246576525, -0.025025347937031341, -0.024975363564923674, -0.024925379130377599, -0.024875394633518077, -0.024825410074470068, +-0.024775425453358531, -0.024725440770308433, -0.024675456025444732, -0.024625471218891505, -0.024575486350775486, -0.024525501421220751, -0.024475516430352263, -0.024425531378294982, +-0.024375546265173874, -0.024325561091113904, -0.024275575856240027, -0.024225590560676323, -0.024175605204549529, -0.024125619787983724, -0.024075634311103870, -0.024025648774034930, +-0.023975663176901869, -0.023925677519829647, -0.023875691802942346, -0.023825706026366703, -0.023775720190226796, -0.023725734294647586, -0.023675748339754041, -0.023625762325671127, +-0.023575776252523804, -0.023525790120437044, -0.023475803929534918, -0.023425817679944172, -0.023375831371788881, -0.023325845005194010, -0.023275858580284529, -0.023225872097185400, +-0.023175885556021590, -0.023125898956917180, -0.023075912299998912, -0.023025925585390860, -0.022975938813217994, -0.022925951983605284, -0.022875965096677692, -0.022825978152560187, +-0.022775991151377739, -0.022726004093254423, -0.022676016978316987, -0.022626029806689506, -0.022576042578496949, -0.022526055293864290, -0.022476067952916491, -0.022426080555778521, +-0.022376093102575351, -0.022326105593431057, -0.022276118028472392, -0.022226130407823428, -0.022176142731609141, -0.022126154999954496, -0.022076167212984461, -0.022026179370824010, +-0.021976191473597223, -0.021926203521430845, -0.021876215514448960, -0.021826227452776535, -0.021776239336538539, -0.021726251165859949, -0.021676262940865727, -0.021626274661680850, +-0.021576286328429398, -0.021526297941238118, -0.021476309500231092, -0.021426321005533294, -0.021376332457269692, -0.021326343855565262, -0.021276355200544970, -0.021226366492333788, +-0.021176377731055806, -0.021126388916837765, -0.021076400049803750, -0.021026411130078738, -0.020976422157787698, -0.020926433133055602, -0.020876444056007422, -0.020826454926767247, +-0.020776465745461818, -0.020726476512215229, -0.020676487227152446, -0.020626497890398447, -0.020576508502078202, -0.020526519062316687, -0.020476529571238872, -0.020426540028968848, +-0.020376550435633359, -0.020326560791356498, -0.020276571096263230, -0.020226581350478539, -0.020176591554127390, -0.020126601707334765, -0.020076611810224746, -0.020026621862924088, +-0.019976631865556874, -0.019926641818248082, -0.019876651721122681, -0.019826661574305654, -0.019776671377921974, -0.019726681132096614, -0.019676690836953663, -0.019626700492619872, +-0.019576710099219331, -0.019526719656877016, -0.019476729165717899, -0.019426738625866961, -0.019376748037449178, -0.019326757400589523, -0.019276766715412088, -0.019226775982043622, +-0.019176785200608216, -0.019126794371230847, -0.019076803494036496, -0.019026812569150130, -0.018976821596696739, -0.018926830576800401, -0.018876839509587878, -0.018826848395183254, +-0.018776857233711509, -0.018726866025297623, -0.018676874770066569, -0.018626883468143330, -0.018576892119652882, -0.018526900724719315, -0.018476909283469387, -0.018426917796027183, +-0.018376926262517686, -0.018326934683065871, -0.018276943057796723, -0.018226951386835215, -0.018176959670305439, -0.018126967908334155, -0.018076976101045448, -0.018026984248564304, +-0.017976992351015696, -0.017927000408524612, -0.017877008421216024, -0.017827016389214915, -0.017777024312645377, -0.017727032191634167, -0.017677040026305376, -0.017627047816783984, +-0.017577055563194971, -0.017527063265663324, -0.017477070924314015, -0.017427078539272032, -0.017377086110661463, -0.017327093638609063, -0.017277101123238933, -0.017227108564676050, +-0.017177115963045397, -0.017127123318471951, -0.017077130631080698, -0.017027137900995731, -0.016977145128343803, -0.016927152313249018, -0.016877159455836351, -0.016827166556230785, +-0.016777173614557300, -0.016727180630940884, -0.016677187605506513, -0.016627194538378288, -0.016577201429682966, -0.016527208279544636, -0.016477215088088290, -0.016427221855438903, +-0.016377228581721463, -0.016327235267060949, -0.016277241911582349, -0.016227248515409756, -0.016177255078669930, -0.016127261601486968, -0.016077268083985848, -0.016027274526291560, +-0.015977280928529087, -0.015927287290823409, -0.015877293613298628, -0.015827299896081497, -0.015777306139296118, -0.015727312343067474, -0.015677318507520549, -0.015627324632780330, +-0.015577330718971796, -0.015527336766219937, -0.015477342774648847, -0.015427348744385288, -0.015377354675553359, -0.015327360568278043, -0.015277366422684324, -0.015227372238897190, +-0.015177378017041625, -0.015127383757241725, -0.015077389459624257, -0.015027395124313314, -0.014977400751433882, -0.014927406341110951, -0.014877411893469502, -0.014827417408634523, +-0.014777422886731001, -0.014727428327883034, -0.014677433732217386, -0.014627439099858150, -0.014577444430930319, -0.014527449725558876, -0.014477454983868808, -0.014427460205985104, +-0.014377465392032749, -0.014327470542135842, -0.014277475656421148, -0.014227480735012763, -0.014177485778035678, -0.014127490785614876, -0.014077495757875350, -0.014027500694942083, +-0.013977505596939176, -0.013927510463993393, -0.013877515296228835, -0.013827520093770489, -0.013777524856743341, -0.013727529585272381, -0.013677534279482598, -0.013627538939498980, +-0.013577543565445625, -0.013527548157449300, -0.013477552715634104, -0.013427557240125027, -0.013377561731047058, -0.013327566188525182, -0.013277570612684392, -0.013227575003649676, +-0.013177579361545134, -0.013127583686497531, -0.013077587978630970, -0.013027592238070438, -0.012977596464940925, -0.012927600659367423, -0.012877604821474917, -0.012827608951387511, +-0.012777613049231971, -0.012727617115132400, -0.012677621149213785, -0.012627625151601117, -0.012577629122419387, -0.012527633061793582, -0.012477636969848696, -0.012427640846708830, +-0.012377644692500750, -0.012327648507348557, -0.012277652291377244, -0.012227656044711798, -0.012177659767477214, -0.012127663459798481, -0.012077667121799701, -0.012027670753607641, +-0.011977674355346402, -0.011927677927140980, -0.011877681469116361, -0.011827684981397541, -0.011777688464109506, -0.011727691917377251, -0.011677695341324878, -0.011627698736079155, +-0.011577702101764184, -0.011527705438504959, -0.011477708746426471, -0.011427712025653710, -0.011377715276311668, -0.011327718498525340, -0.011277721692418826, -0.011227724858118897, +-0.011177727995749655, -0.011127731105436094, -0.011077734187303205, -0.011027737241475979, -0.010977740268079411, -0.010927743267237604, -0.010877746239077328, -0.010827749183722686, +-0.010777752101298671, -0.010727754991930275, -0.010677757855742492, -0.010627760692860314, -0.010577763503408734, -0.010527766287511857, -0.010477769045296454, -0.010427771776886627, +-0.010377774482407372, -0.010327777161983680, -0.010277779815740545, -0.010227782443802959, -0.010177785046295918, -0.010127787623343527, -0.010077790175072555, -0.010027792701607108, +-0.009977795203072178, -0.009927797679592761, -0.009877800131293850, -0.009827802558300437, -0.009777804960736630, -0.009727807338729199, -0.009677809692402251, -0.009627812021880778, +-0.009577814327289774, -0.009527816608754234, -0.009477818866399155, -0.009427821100349525, -0.009377823310729457, -0.009327825497665717, -0.009277827661282415, -0.009227829801704543, +-0.009177831919057097, -0.009127834013465071, -0.009077836085053460, -0.009027838133946371, -0.008977840160270574, -0.008927842164150176, -0.008877844145710174, -0.008827846105075561, +-0.008777848042371333, -0.008727849957722486, -0.008677851851254012, -0.008627853723090022, -0.008577855573357284, -0.008527857402179907, -0.008477859209682888, -0.008427860995991221, +-0.008377862761229902, -0.008327864505523924, -0.008277866228998286, -0.008227867931777095, -0.008177869613987121, -0.008127871275752473, -0.008077872917198147, -0.008027874538449140, +-0.007977876139630444, -0.007927877720867060, -0.007877879282283094, -0.007827880824005316, -0.007777882346157837, -0.007727883848865652, -0.007677885332253757, -0.007627886796447149, +-0.007577888241570824, -0.007527889667749779, -0.007477891075108121, -0.007427892463772623, -0.007377893833867394, -0.007327895185517431, -0.007277896518847729, -0.007227897833983287, +-0.007177899131049100, -0.007127900410169277, -0.007077901671470591, -0.007027902915077151, -0.006977904141113954, -0.006927905349705996, -0.006877906540978275, -0.006827907715055787, +-0.006777908872063531, -0.006727910012125614, -0.006677911135368810, -0.006627912241917228, -0.006577913331895865, -0.006527914405429720, -0.006477915462643789, -0.006427916503663068, +-0.006377917528612556, -0.006327918537616363, -0.006277919530801261, -0.006227920508291360, -0.006177921470211658, -0.006127922416687153, -0.006077923347842841, -0.006027924263803722, +-0.005977925164693903, -0.005927926050640159, -0.005877926921766601, -0.005827927778198225, -0.005777928620060029, -0.005727929447477013, -0.005677930260574172, -0.005627931059476505, +-0.005577931844308124, -0.005527932615195800, -0.005477933372263645, -0.005427934115636657, -0.005377934845439833, -0.005327935561798172, -0.005277936264836673, -0.005227936954680332, +-0.005177937631453262, -0.005127938295282235, -0.005077938946291362, -0.005027939584605642, -0.004977940210350073, -0.004927940823649654, -0.004877941424629382, -0.004827942013413369, +-0.004777942590128389, -0.004727943154898552, -0.004677943707848858, -0.004627944249104304, -0.004577944778789890, -0.004527945297030614, -0.004477945803951475, -0.004427946299676583, +-0.004377946784332712, -0.004327947258043976, -0.004277947720935371, -0.004227948173131897, -0.004177948614758552, -0.004127949045940336, -0.004077949466801360, -0.004027949877468397, +-0.003977950278065560, -0.003927950668717847, -0.003877951049550258, -0.003827951420687791, -0.003777951782255445, -0.003727952134378220, -0.003677952477180227, -0.003627952810788240, +-0.003577953135326371, -0.003527953450919620, -0.003477953757692985, -0.003427954055771466, -0.003377954345280061, -0.003327954626343770, -0.003277954899086705, -0.003227955163635641, +-0.003177955420114689, -0.003127955668648848, -0.003077955909363118, -0.003027956142382499, -0.002977956367831988, -0.002927956585835699, -0.002877956796520407, -0.002827957000010223, +-0.002777957196430146, -0.002727957385905176, -0.002677957568560313, -0.002627957744520555, -0.002577957913910904, -0.002527958076855469, -0.002477958233481027, -0.002427958383911690, +-0.002377958528272457, -0.002327958666688328, -0.002277958799284302, -0.002227958926185378, -0.002177959047516558, -0.002127959163401952, -0.002077959273968336, -0.002027959379339822, +-0.001977959479641409, -0.001927959574998098, -0.001877959665534888, -0.001827959751376778, -0.001777959832647881, -0.001727959909474973, -0.001677959981982165, -0.001627960050294457, +-0.001577960114536849, -0.001527960174834340, -0.001477960231311931, -0.001427960284094622, -0.001377960333306523, -0.001327960379074412, -0.001277960421522400, -0.001227960460775487, +-0.001177960496958673, -0.001127960530196958, -0.001077960560615341, -0.001027960588337934, -0.000977960613491515, -0.000927960636200194, -0.000877960656588971, -0.000827960674782847, +-0.000777960690906820, -0.000727960705085893, -0.000677960717445063, -0.000627960728108444, -0.000577960737202810, -0.000527960744852275, -0.000477960751181838, -0.000427960756316500, +-0.000377960760381259, -0.000327960763501117, -0.000277960765801072, -0.000227960767405237, -0.000177960768440389, -0.000127960769030639, -0.000077960769300987 +}; + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c new file mode 100644 index 0000000..87908ed --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c @@ -0,0 +1,204 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_linear_interp_example_f32.c +* +* Description: Example code demonstrating usage of sin function +* and uses linear interpolation to get higher precision +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup LinearInterpExample Linear Interpolate Example + * + * CMSIS DSP Software Library -- Linear Interpolate Example + * + * Description + * This example demonstrates usage of linear interpolate modules and fast math modules. + * Method 1 uses fast math sine function to calculate sine values using cubic interpolation and method 2 uses + * linear interpolation function and results are compared to reference output. + * Example shows linear interpolation function can be used to get higher precision compared to fast math sin calculation. + * + * \par Block Diagram: + * \par + * \image html linearInterpExampleMethod1.gif "Method 1: Sine caluclation using fast math" + * \par + * \image html linearInterpExampleMethod2.gif "Method 2: Sine caluclation using interpolation function" + * + * \par Variables Description: + * \par + * \li \c testInputSin_f32 points to the input values for sine calculation + * \li \c testRefSinOutput32_f32 points to the reference values caculated from sin() matlab function + * \li \c testOutput points to output buffer calculation from cubic interpolation + * \li \c testLinIntOutput points to output buffer calculation from linear interpolation + * \li \c snr1 Signal to noise ratio for reference and cubic interpolation output + * \li \c snr2 Signal to noise ratio for reference and linear interpolation output + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_sin_f32() + * - arm_linear_interp_f32() + * + * Refer + * \link arm_linear_interp_example_f32.c \endlink + * + */ + + +/** \example arm_linear_interp_example_f32.c + */ + +#include "arm_math.h" +#include "math_helper.h" + +#define SNR_THRESHOLD 90 +#define TEST_LENGTH_SAMPLES 10 +#define XSPACING (0.00005f) + +/* ---------------------------------------------------------------------- +* Test input data for F32 SIN function +* Generated by the MATLAB rand() function +* randn('state', 0) +* xi = (((1/4.18318581819710)* randn(blockSize, 1) * 2* pi)); +* --------------------------------------------------------------------*/ +float32_t testInputSin_f32[TEST_LENGTH_SAMPLES] = +{ + -0.649716504673081170, -2.501723745497831200, + 0.188250329003310100, 0.432092748487532540, + -1.722010988459680800, 1.788766476323060600, + 1.786136060975809500, -0.056525543169408797, + 0.491596272728153760, 0.262309671126153390 +}; + +/*------------------------------------------------------------------------------ +* Reference out of SIN F32 function for Block Size = 10 +* Calculated from sin(testInputSin_f32) +*------------------------------------------------------------------------------*/ +float32_t testRefSinOutput32_f32[TEST_LENGTH_SAMPLES] = +{ + -0.604960695383043530, -0.597090287967934840, + 0.187140422442966500, 0.418772124875992690, + -0.988588831792106880, 0.976338412038794010, + 0.976903856413481100, -0.056495446835214236, + 0.472033731854734240, 0.259311907228582830 +}; + +/*------------------------------------------------------------------------------ +* Method 1: Test out Buffer Calculated from Cubic Interpolation +*------------------------------------------------------------------------------*/ +float32_t testOutput[TEST_LENGTH_SAMPLES]; + +/*------------------------------------------------------------------------------ +* Method 2: Test out buffer Calculated from Linear Interpolation +*------------------------------------------------------------------------------*/ +float32_t testLinIntOutput[TEST_LENGTH_SAMPLES]; + +/*------------------------------------------------------------------------------ +* External table used for linear interpolation +*------------------------------------------------------------------------------*/ +extern float arm_linear_interep_table[188495]; + +/* ---------------------------------------------------------------------- +* Global Variables for caluclating SNR's for Method1 & Method 2 +* ------------------------------------------------------------------- */ +float32_t snr1; +float32_t snr2; + +/* ---------------------------------------------------------------------------- +* Calculation of Sine values from Cubic Interpolation and Linear interpolation +* ---------------------------------------------------------------------------- */ +int32_t main(void) +{ + uint32_t i; + arm_status status; + + arm_linear_interp_instance_f32 S = {188495, -3.141592653589793238, XSPACING, &arm_linear_interep_table[0]}; + + /*------------------------------------------------------------------------------ + * Method 1: Test out Calculated from Cubic Interpolation + *------------------------------------------------------------------------------*/ + for(i=0; i< TEST_LENGTH_SAMPLES; i++) + { + testOutput[i] = arm_sin_f32(testInputSin_f32[i]); + } + + /*------------------------------------------------------------------------------ + * Method 2: Test out Calculated from Cubic Interpolation and Linear interpolation + *------------------------------------------------------------------------------*/ + + for(i=0; i< TEST_LENGTH_SAMPLES; i++) + { + testLinIntOutput[i] = arm_linear_interp_f32(&S, testInputSin_f32[i]); + } + + /*------------------------------------------------------------------------------ + * SNR calculation for method 1 + *------------------------------------------------------------------------------*/ + snr1 = arm_snr_f32(testRefSinOutput32_f32, testOutput, 2); + + /*------------------------------------------------------------------------------ + * SNR calculation for method 2 + *------------------------------------------------------------------------------*/ + snr2 = arm_snr_f32(testRefSinOutput32_f32, testLinIntOutput, 2); + + /*------------------------------------------------------------------------------ + * Initialise status depending on SNR calculations + *------------------------------------------------------------------------------*/ + if ( snr2 > snr1) + { + status = ARM_MATH_SUCCESS; + } + else + { + status = ARM_MATH_TEST_FAILURE; + } + + /* ---------------------------------------------------------------------- + ** Loop here if the signals fail the PASS check. + ** This denotes a test failure + ** ------------------------------------------------------------------- */ + if ( status != ARM_MATH_SUCCESS) + { + while (1); + } + + while (1); /* main function does not return */ +} + + /** \endlink */ diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/math_helper.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/math_helper.c new file mode 100644 index 0000000..f615e6f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/math_helper.c @@ -0,0 +1,466 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 b +* +* Project: CMSIS DSP Library +* +* Title: math_helper.c +* +* Description: Definition of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +* Include standard header files +* -------------------------------------------------------------------- */ +#include + +/* ---------------------------------------------------------------------- +* Include project header files +* -------------------------------------------------------------------- */ +#include "math_helper.h" + +/** + * @brief Caluclation of SNR + * @param[in] pRef Pointer to the reference buffer + * @param[in] pTest Pointer to the test buffer + * @param[in] buffSize total number of samples + * @return SNR + * The function Caluclates signal to noise ratio for the reference output + * and test output + */ + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) +{ + float EnergySignal = 0.0, EnergyError = 0.0; + uint32_t i; + float SNR; + int temp; + int *test; + + for (i = 0; i < buffSize; i++) + { + /* Checking for a NAN value in pRef array */ + test = (int *)(&pRef[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + /* Checking for a NAN value in pTest array */ + test = (int *)(&pTest[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + EnergySignal += pRef[i] * pRef[i]; + EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); + } + + /* Checking for a NAN value in EnergyError */ + test = (int *)(&EnergyError); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + + SNR = 10 * log10 (EnergySignal / EnergyError); + + return (SNR); + +} + + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Converts float to fixed in q12.20 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to outputbuffer + * @param[in] numSamples number of samples in the input buffer + * @return none + * The function converts floating point values to fixed point(q12.20) values + */ + +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1048576.0f corresponds to pow(2, 20) */ + pOut[i] = (q31_t) (pIn[i] * 1048576.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 1.0) + { + pOut[i] = 0x000FFFFF; + } + } +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q31 (q31_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q7 (q7_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + + + +/** + * @brief Caluclates number of guard bits + * @param[in] num_adds number of additions + * @return guard bits + * The function Caluclates the number of guard bits + * depending on the numtaps + */ + +uint32_t arm_calc_guard_bits (uint32_t num_adds) +{ + uint32_t i = 1, j = 0; + + if (num_adds == 1) + { + return (0); + } + + while (i < num_adds) + { + i = i * 2; + j++; + } + + return (j); +} + +/** + * @brief Apply guard bits to buffer + * @param[in,out] pIn pointer to input buffer + * @param[in] numSamples number of samples in the input buffer + * @param[in] guard_bits guard bits + * @return none + */ + +void arm_apply_guard_bits (float32_t *pIn, + uint32_t numSamples, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); + } +} + +/** + * @brief Calculates pow(2, numShifts) + * @param[in] numShifts number of shifts + * @return pow(2, numShifts) + */ +uint32_t arm_calc_2pow(uint32_t numShifts) +{ + + uint32_t i, val = 1; + + for (i = 0; i < numShifts; i++) + { + val = val * 2; + } + + return(val); +} + + + +/** + * @brief Converts float to fixed q14 + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q14 (float *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 16384.0f corresponds to pow(2, 14) */ + pOut[i] = (q15_t) (pIn[i] * 16384.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFF; + } + + } + +} + + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q30 (float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q29 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 536870912.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 4.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + + +/** + * @brief Converts float to fixed q28 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q28 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 268435456.0f corresponds to pow(2, 28) */ + pOut[i] = (q31_t) (pIn[i] * 268435456.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 8.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Clip the float values to +/- 1 + * @param[in,out] pIn input buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_clip_f32 (float *pIn, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + if (pIn[i] > 1.0f) + { + pIn[i] = 1.0; + } + else if ( pIn[i] < -1.0f) + { + pIn[i] = -1.0; + } + + } +} + + + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/math_helper.h b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/math_helper.h new file mode 100644 index 0000000..5a18734 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2013 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* +* Title: math_helper.h +* +* Description: Prototypes of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + + +#include "arm_math.h" + +#ifndef MATH_HELPER_H +#define MATH_HELPER_H + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); +void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); +void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_clip_f32(float *pIn, uint32_t numSamples); +uint32_t arm_calc_guard_bits(uint32_t num_adds); +void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); +uint32_t arm_calc_2pow(uint32_t guard_bits); +#endif + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/Abstract.txt new file mode 100644 index 0000000..f45b0e0 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_matrix_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/arm_matrix_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/arm_matrix_example_f32.c new file mode 100644 index 0000000..3d7a505 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/arm_matrix_example_f32.c @@ -0,0 +1,233 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_matrix_example_f32.c +* +* Description: Example code demonstrating least square fit to data +* using matrix functions +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup MatrixExample Matrix Example + * + * \par Description: + * \par + * Demonstrates the use of Matrix Transpose, Matrix Muliplication, and Matrix Inverse + * functions to apply least squares fitting to input data. Least squares fitting is + * the procedure for finding the best-fitting curve that minimizes the sum of the + * squares of the offsets (least square error) from a given set of data. + * + * \par Algorithm: + * \par + * The linear combination of parameters considered is as follows: + * \par + * A * X = B, where \c X is the unknown value and can be estimated + * from \c A & \c B. + * \par + * The least squares estimate \c X is given by the following equation: + * \par + * X = Inverse(AT * A) * AT * B + * + * \par Block Diagram: + * \par + * \image html matrixExample.gif + * + * \par Variables Description: + * \par + * \li \c A_f32 input matrix in the linear combination equation + * \li \c B_f32 output matrix in the linear combination equation + * \li \c X_f32 unknown matrix estimated using \c A_f32 & \c B_f32 matrices + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_mat_init_f32() + * - arm_mat_trans_f32() + * - arm_mat_mult_f32() + * - arm_mat_inverse_f32() + * + * Refer + * \link arm_matrix_example_f32.c \endlink + * + */ + + +/** \example arm_matrix_example_f32.c + */ + +#include "arm_math.h" +#include "math_helper.h" + +#define SNR_THRESHOLD 90 + +/* -------------------------------------------------------------------------------- +* Test input data(Cycles) taken from FIR Q15 module for differant cases of blockSize +* and tapSize +* --------------------------------------------------------------------------------- */ + +const float32_t B_f32[4] = +{ + 782.0, 7577.0, 470.0, 4505.0 +}; + +/* -------------------------------------------------------------------------------- +* Formula to fit is C1 + C2 * numTaps + C3 * blockSize + C4 * numTaps * blockSize +* -------------------------------------------------------------------------------- */ + +const float32_t A_f32[16] = +{ + /* Const, numTaps, blockSize, numTaps*blockSize */ + 1.0, 32.0, 4.0, 128.0, + 1.0, 32.0, 64.0, 2048.0, + 1.0, 16.0, 4.0, 64.0, + 1.0, 16.0, 64.0, 1024.0, +}; + + +/* ---------------------------------------------------------------------- +* Temporary buffers for storing intermediate values +* ------------------------------------------------------------------- */ +/* Transpose of A Buffer */ +float32_t AT_f32[16]; +/* (Transpose of A * A) Buffer */ +float32_t ATMA_f32[16]; +/* Inverse(Transpose of A * A) Buffer */ +float32_t ATMAI_f32[16]; +/* Test Output Buffer */ +float32_t X_f32[4]; + +/* ---------------------------------------------------------------------- +* Reference ouput buffer C1, C2, C3 and C4 taken from MATLAB +* ------------------------------------------------------------------- */ +const float32_t xRef_f32[4] = {73.0, 8.0, 21.25, 2.875}; + +float32_t snr; + + +/* ---------------------------------------------------------------------- +* Max magnitude FFT Bin test +* ------------------------------------------------------------------- */ + +int32_t main(void) +{ + + arm_matrix_instance_f32 A; /* Matrix A Instance */ + arm_matrix_instance_f32 AT; /* Matrix AT(A transpose) instance */ + arm_matrix_instance_f32 ATMA; /* Matrix ATMA( AT multiply with A) instance */ + arm_matrix_instance_f32 ATMAI; /* Matrix ATMAI(Inverse of ATMA) instance */ + arm_matrix_instance_f32 B; /* Matrix B instance */ + arm_matrix_instance_f32 X; /* Matrix X(Unknown Matrix) instance */ + + uint32_t srcRows, srcColumns; /* Temporary variables */ + arm_status status; + + /* Initialise A Matrix Instance with numRows, numCols and data array(A_f32) */ + srcRows = 4; + srcColumns = 4; + arm_mat_init_f32(&A, srcRows, srcColumns, (float32_t *)A_f32); + + /* Initialise Matrix Instance AT with numRows, numCols and data array(AT_f32) */ + srcRows = 4; + srcColumns = 4; + arm_mat_init_f32(&AT, srcRows, srcColumns, AT_f32); + + /* calculation of A transpose */ + status = arm_mat_trans_f32(&A, &AT); + + + /* Initialise ATMA Matrix Instance with numRows, numCols and data array(ATMA_f32) */ + srcRows = 4; + srcColumns = 4; + arm_mat_init_f32(&ATMA, srcRows, srcColumns, ATMA_f32); + + /* calculation of AT Multiply with A */ + status = arm_mat_mult_f32(&AT, &A, &ATMA); + + /* Initialise ATMAI Matrix Instance with numRows, numCols and data array(ATMAI_f32) */ + srcRows = 4; + srcColumns = 4; + arm_mat_init_f32(&ATMAI, srcRows, srcColumns, ATMAI_f32); + + /* calculation of Inverse((Transpose(A) * A) */ + status = arm_mat_inverse_f32(&ATMA, &ATMAI); + + /* calculation of (Inverse((Transpose(A) * A)) * Transpose(A)) */ + status = arm_mat_mult_f32(&ATMAI, &AT, &ATMA); + + /* Initialise B Matrix Instance with numRows, numCols and data array(B_f32) */ + srcRows = 4; + srcColumns = 1; + arm_mat_init_f32(&B, srcRows, srcColumns, (float32_t *)B_f32); + + /* Initialise X Matrix Instance with numRows, numCols and data array(X_f32) */ + srcRows = 4; + srcColumns = 1; + arm_mat_init_f32(&X, srcRows, srcColumns, X_f32); + + /* calculation ((Inverse((Transpose(A) * A)) * Transpose(A)) * B) */ + status = arm_mat_mult_f32(&ATMA, &B, &X); + + /* Comparison of reference with test output */ + snr = arm_snr_f32((float32_t *)xRef_f32, X_f32, 4); + + /*------------------------------------------------------------------------------ + * Initialise status depending on SNR calculations + *------------------------------------------------------------------------------*/ + if ( snr > SNR_THRESHOLD) + { + status = ARM_MATH_SUCCESS; + } + else + { + status = ARM_MATH_TEST_FAILURE; + } + + + /* ---------------------------------------------------------------------- + ** Loop here if the signals fail the PASS check. + ** This denotes a test failure + ** ------------------------------------------------------------------- */ + if ( status != ARM_MATH_SUCCESS) + { + while (1); + } + + while (1); /* main function does not return */ +} + + /** \endlink */ diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/math_helper.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/math_helper.c new file mode 100644 index 0000000..f615e6f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/math_helper.c @@ -0,0 +1,466 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 b +* +* Project: CMSIS DSP Library +* +* Title: math_helper.c +* +* Description: Definition of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +* Include standard header files +* -------------------------------------------------------------------- */ +#include + +/* ---------------------------------------------------------------------- +* Include project header files +* -------------------------------------------------------------------- */ +#include "math_helper.h" + +/** + * @brief Caluclation of SNR + * @param[in] pRef Pointer to the reference buffer + * @param[in] pTest Pointer to the test buffer + * @param[in] buffSize total number of samples + * @return SNR + * The function Caluclates signal to noise ratio for the reference output + * and test output + */ + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) +{ + float EnergySignal = 0.0, EnergyError = 0.0; + uint32_t i; + float SNR; + int temp; + int *test; + + for (i = 0; i < buffSize; i++) + { + /* Checking for a NAN value in pRef array */ + test = (int *)(&pRef[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + /* Checking for a NAN value in pTest array */ + test = (int *)(&pTest[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + EnergySignal += pRef[i] * pRef[i]; + EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); + } + + /* Checking for a NAN value in EnergyError */ + test = (int *)(&EnergyError); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + + SNR = 10 * log10 (EnergySignal / EnergyError); + + return (SNR); + +} + + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Converts float to fixed in q12.20 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to outputbuffer + * @param[in] numSamples number of samples in the input buffer + * @return none + * The function converts floating point values to fixed point(q12.20) values + */ + +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1048576.0f corresponds to pow(2, 20) */ + pOut[i] = (q31_t) (pIn[i] * 1048576.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 1.0) + { + pOut[i] = 0x000FFFFF; + } + } +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q31 (q31_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q7 (q7_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + + + +/** + * @brief Caluclates number of guard bits + * @param[in] num_adds number of additions + * @return guard bits + * The function Caluclates the number of guard bits + * depending on the numtaps + */ + +uint32_t arm_calc_guard_bits (uint32_t num_adds) +{ + uint32_t i = 1, j = 0; + + if (num_adds == 1) + { + return (0); + } + + while (i < num_adds) + { + i = i * 2; + j++; + } + + return (j); +} + +/** + * @brief Apply guard bits to buffer + * @param[in,out] pIn pointer to input buffer + * @param[in] numSamples number of samples in the input buffer + * @param[in] guard_bits guard bits + * @return none + */ + +void arm_apply_guard_bits (float32_t *pIn, + uint32_t numSamples, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); + } +} + +/** + * @brief Calculates pow(2, numShifts) + * @param[in] numShifts number of shifts + * @return pow(2, numShifts) + */ +uint32_t arm_calc_2pow(uint32_t numShifts) +{ + + uint32_t i, val = 1; + + for (i = 0; i < numShifts; i++) + { + val = val * 2; + } + + return(val); +} + + + +/** + * @brief Converts float to fixed q14 + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q14 (float *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 16384.0f corresponds to pow(2, 14) */ + pOut[i] = (q15_t) (pIn[i] * 16384.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFF; + } + + } + +} + + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q30 (float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q29 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 536870912.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 4.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + + +/** + * @brief Converts float to fixed q28 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q28 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 268435456.0f corresponds to pow(2, 28) */ + pOut[i] = (q31_t) (pIn[i] * 268435456.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 8.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Clip the float values to +/- 1 + * @param[in,out] pIn input buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_clip_f32 (float *pIn, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + if (pIn[i] > 1.0f) + { + pIn[i] = 1.0; + } + else if ( pIn[i] < -1.0f) + { + pIn[i] = -1.0; + } + + } +} + + + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/math_helper.h b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/math_helper.h new file mode 100644 index 0000000..5a18734 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_matrix_example/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2013 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* +* Title: math_helper.h +* +* Description: Prototypes of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + + +#include "arm_math.h" + +#ifndef MATH_HELPER_H +#define MATH_HELPER_H + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); +void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); +void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_clip_f32(float *pIn, uint32_t numSamples); +uint32_t arm_calc_guard_bits(uint32_t num_adds); +void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); +uint32_t arm_calc_2pow(uint32_t guard_bits); +#endif + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/Abstract.txt new file mode 100644 index 0000000..d202e78 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_signal_converge_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/arm_signal_converge_data.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/arm_signal_converge_data.c new file mode 100644 index 0000000..3a2337d --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/arm_signal_converge_data.c @@ -0,0 +1,269 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_signal_converge_data.c +* +* Description: Test input data for Floating point LMS Norm FIR filter +* +* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +#include "arm_math.h" + +/* ---------------------------------------------------------------------- +** Test input data for Floating point LMS Norm FIR filter +** Generated by the MATLAB randn() function +** ------------------------------------------------------------------- */ + +float32_t testInput_f32[1536] = +{ +-0.432565, -1.665584, 0.125332, 0.287676, -1.146471, 1.190915, 1.189164, -0.037633, +0.327292, 0.174639, -0.186709, 0.725791, -0.588317, 2.183186, -0.136396, 0.113931, +1.066768, 0.059281, -0.095648, -0.832349, 0.294411, -1.336182, 0.714325, 1.623562, +-0.691776, 0.857997, 1.254001, -1.593730, -1.440964, 0.571148, -0.399886, 0.689997, +0.815622, 0.711908, 1.290250, 0.668601, 1.190838, -1.202457, -0.019790, -0.156717, +-1.604086, 0.257304, -1.056473, 1.415141, -0.805090, 0.528743, 0.219321, -0.921902, +-2.170674, -0.059188, -1.010634, 0.614463, 0.507741, 1.692430, 0.591283, -0.643595, +0.380337, -1.009116, -0.019511, -0.048221, 0.000043, -0.317859, 1.095004, -1.873990, +0.428183, 0.895638, 0.730957, 0.577857, 0.040314, 0.677089, 0.568900, -0.255645, +-0.377469, -0.295887, -1.475135, -0.234004, 0.118445, 0.314809, 1.443508, -0.350975, +0.623234, 0.799049, 0.940890, -0.992092, 0.212035, 0.237882, -1.007763, -0.742045, +1.082295, -0.131500, 0.389880, 0.087987, -0.635465, -0.559573, 0.443653, -0.949904, +0.781182, 0.568961, -0.821714, -0.265607, -1.187777, -2.202321, 0.986337, -0.518635, +0.327368, 0.234057, 0.021466, -1.003944, -0.947146, -0.374429, -1.185886, -1.055903, +1.472480, 0.055744, -1.217317, -0.041227, -1.128344, -1.349278, -0.261102, 0.953465, +0.128644, 0.656468, -1.167819, -0.460605, -0.262440, -1.213152, -1.319437, 0.931218, +0.011245, -0.645146, 0.805729, 0.231626, -0.989760, 1.339586, 0.289502, 1.478917, +1.138028, -0.684139, -1.291936, -0.072926, -0.330599, -0.843628, 0.497770, 1.488490, +-0.546476, -0.846758, -0.246337, 0.663024, -0.854197, -1.201315, -0.119869, -0.065294, +0.485296, -0.595491, -0.149668, -0.434752, -0.079330, 1.535152, -0.606483, -1.347363, +0.469383, -0.903567, 0.035880, -0.627531, 0.535398, 0.552884, -0.203690, -2.054325, +0.132561, 1.592941, 1.018412, -1.580402, -0.078662, -0.681657, -1.024553, -1.234353, +0.288807, -0.429303, 0.055801, -0.367874, -0.464973, 0.370961, 0.728283, 2.112160, +-1.357298, -1.022610, 1.037834, -0.389800, -1.381266, 0.315543, 1.553243, 0.707894, +1.957385, 0.504542, 1.864529, -0.339812, -1.139779, -0.211123, 1.190245, -1.116209, +0.635274, -0.601412, 0.551185, -1.099840, 0.085991, -2.004563, -0.493088, 0.462048, +-0.321005, 1.236556, -0.631280, -2.325211, -1.231637, 1.055648, -0.113224, 0.379224, +0.944200, -2.120427, -0.644679, -0.704302, -1.018137, -0.182082, 1.521013, -0.038439, +1.227448, -0.696205, 0.007524, -0.782893, 0.586939, -0.251207, 0.480136, 0.668155, +-0.078321, 0.889173, 2.309287, 0.524639, -0.011787, 0.913141, 0.055941, -1.107070, +0.485498, -0.005005, -0.276218, 1.276452, 1.863401, -0.522559, 0.103424, -0.807649, +0.680439, -2.364590, 0.990115, 0.218899, 0.261662, 1.213444, -0.274667, -0.133134, +-1.270500, -1.663606, -0.703554, 0.280880, -0.541209, -1.333531, 1.072686, -0.712085, +-0.011286, -0.000817, -0.249436, 0.396575, -0.264013, -1.664011, -1.028975, 0.243095, +-1.256590, -0.347183, -0.941372, -1.174560, -1.021142, -0.401667, 0.173666, -0.116118, +1.064119, -0.245386, -1.517539, 0.009734, 0.071373, 0.316536, 0.499826, 1.278084, +-0.547816, 0.260808, -0.013177, -0.580264, 2.136308, -0.257617, -1.409528, 1.770101, +0.325546, -1.119040, 0.620350, 1.269782, -0.896043, 0.135175, -0.139040, -1.163395, +1.183720, -0.015430, 0.536219, -0.716429, -0.655559, 0.314363, 0.106814, 1.848216, +-0.275106, 2.212554, 1.508526, -1.945079, -1.680543, -0.573534, -0.185817, 0.008934, +0.836950, -0.722271, -0.721490, -0.201181, -0.020464, 0.278890, 1.058295, 0.621673, +-1.750615, 0.697348, 0.811486, 0.636345, 1.310080, 0.327098, -0.672993, -0.149327, +-2.449018, 0.473286, 0.116946, -0.591104, -0.654708, -1.080662, -0.047731, 0.379345, +-0.330361, -0.499898, -0.035979, -0.174760, -0.957265, 1.292548, 0.440910, 1.280941, +-0.497730, -1.118717, 0.807650, 0.041200, -0.756209, -0.089129, -2.008850, 1.083918, +-0.981191, -0.688489, 1.339479, -0.909243, -0.412858, -0.506163, 1.619748, 0.080901, +-1.081056, -1.124518, 1.735676, 1.937459, 1.635068, -1.255940, -0.213538, -0.198932, +0.307499, -0.572325, -0.977648, -0.446809, 1.082092, 2.372648, 0.229288, -0.266623, +0.701672, -0.487590, 1.862480, 1.106851, -1.227566, -0.669885, 1.340929, 0.388083, +0.393059, -1.707334, 0.227859, 0.685633, -0.636790, -1.002606, -0.185621, -1.054033, +-0.071539, 0.279198, 1.373275, 0.179841, -0.542017, 1.634191, 0.825215, 0.230761, +0.671634, -0.508078, 0.856352, 0.268503, 0.624975, -1.047338, 1.535670, 0.434426, +-1.917136, 0.469940, 1.274351, 0.638542, 1.380782, 1.319843, -0.909429, -2.305605, +1.788730, 0.390798, 0.020324, -0.405977, -1.534895, 0.221373, -1.374479, -0.839286, +-0.208643, 0.755913, 0.375734, -1.345413, 1.481876, 0.032736, 1.870453, -1.208991, +-0.782632, -0.767299, -0.107200, -0.977057, -0.963988, -2.379172, -0.838188, 0.257346, +-0.183834, -0.167615, -0.116989, 0.168488, -0.501206, -0.705076, 0.508165, -0.420922, +0.229133, -0.959497, -0.146043, 0.744538, -0.890496, 0.139062, -0.236144, -0.075459, +-0.358572, -2.077635, -0.143546, 1.393341, 0.651804, -0.377134, -0.661443, 0.248958, +-0.383516, -0.528480, 0.055388, 1.253769, -2.520004, 0.584856, -1.008064, 0.944285, +-2.423957, -0.223831, 0.058070, -0.424614, -0.202918, -1.513077, -1.126352, -0.815002, +0.366614, -0.586107, 1.537409, 0.140072, -1.862767, -0.454193, -0.652074, 0.103318, +-0.220632, -0.279043, -0.733662, -0.064534, -1.444004, 0.612340, -1.323503, -0.661577, +-0.146115, 0.248085, -0.076633, 1.738170, 1.621972, 0.626436, 0.091814, -0.807607, +-0.461337, -1.405969, -0.374530, -0.470911, 1.751296, 0.753225, 0.064989, -0.292764, +0.082823, 0.766191, 2.236850, 0.326887, 0.863304, 0.679387, 0.554758, 1.001630, +1.259365, 0.044151, -0.314138, 0.226708, 0.996692, 1.215912, -0.542702, 0.912228, +-0.172141, -0.335955, 0.541487, 0.932111, -0.570253, -1.498605, -0.050346, 0.553025, +0.083498, 1.577524, -0.330774, 0.795155, -0.784800, -1.263121, 0.666655, -1.392632, +-1.300562, -0.605022, -1.488565, 0.558543, -0.277354, -1.293685, -0.888435, -0.986520, +-0.071618, -2.414591, -0.694349, -1.391389, 0.329648, 0.598544, 0.147175, -0.101439, +-2.634981, 0.028053, -0.876310, -0.265477, -0.327578, -1.158247, 0.580053, 0.239756, +-0.350885, 0.892098, 1.578299, -1.108174, -0.025931, -1.110628, 0.750834, 0.500167, +-0.517261, -0.559209, -0.753371, 0.925813, -0.248520, -0.149835, -1.258415, 0.312620, +2.690277, 0.289696, -1.422803, 0.246786, -1.435773, 0.148573, -1.693073, 0.719188, +1.141773, 1.551936, 1.383630, -0.758092, 0.442663, 0.911098, -1.074086, 0.201762, +0.762863, -1.288187, -0.952962, 0.778175, -0.006331, 0.524487, 1.364272, 0.482039, +-0.787066, 0.751999, -0.166888, -0.816228, 2.094065, 0.080153, -0.937295, 0.635739, +1.682028, 0.593634, 0.790153, 0.105254, -0.158579, 0.870907, -0.194759, 0.075474, +-0.526635, -0.685484, -0.268388, -1.188346, 0.248579, 0.102452, -0.041007, -2.247582, +-0.510776, 0.249243, 0.369197, 0.179197, -0.037283, -1.603310, 0.339372, -0.131135, +0.485190, 0.598751, -0.086031, 0.325292, -0.335143, -0.322449, -0.382374, -0.953371, +0.233576, 1.235245, -0.578532, -0.501537, 0.722864, 0.039498, 1.541279, -1.701053, +-1.033741, -0.763708, 2.176426, 0.431612, -0.443765, 0.029996, -0.315671, 0.977846, +0.018295, 0.817963, 0.702341, -0.231271, -0.113690, 0.127941, -0.799410, -0.238612, +-0.089463, -1.023264, 0.937538, -1.131719, -0.710702, -1.169501, 1.065437, -0.680394, +-1.725773, 0.813200, 1.441867, 0.672272, 0.138665, -0.859534, -0.752251, 1.229615, +1.150754, -0.608025, 0.806158, 0.217133, -0.373461, -0.832030, 0.286866, -1.818892, +-1.573051, 2.015666, -0.071982, 2.628909, -0.243317, 0.173276, 0.923207, -0.178553, +-0.521705, 1.431962, -0.870117, 0.807542, -0.510635, 0.743514, 0.847898, -0.829901, +0.532994, 1.032848, -1.052024, 0.362114, -0.036787, -1.227636, -0.275099, -0.160435, +-1.083575, -1.954213, -0.909487, -0.005579, -1.723490, 1.263077, -0.600433, -2.063925, +0.110911, 1.487614, 0.053002, 0.161981, -0.026878, 0.173576, 0.882168, 0.182294, +0.755295, 0.508035, 0.131880, 0.280104, -0.982848, -0.944087, -0.013058, 0.354345, +-0.894709, 0.812111, 0.109537, 2.731644, 0.411079, -1.306862, 0.383806, 0.499504, +-0.510786, 0.234922, -0.597825, 0.020771, 0.419443, 1.191104, 0.771214, -2.644222, +0.285430, 0.826093, -0.008122, 0.858438, 0.774788, 1.305945, 1.231503, 0.958564, +-1.654548, -0.990396, 0.685236, -0.974870, -0.606726, 0.686794, 0.020049, 1.063801, +-1.341050, 0.479510, -1.633974, -1.442665, 0.293781, -0.140364, -1.130341, -0.292538, +-0.582536, -0.896348, 0.248601, -1.489663, 0.313509, -2.025084, 0.528990, 0.343471, +0.758193, -0.691940, 0.680179, -1.072541, 0.899772, -2.123092, 0.284712, -0.733323, +-0.773376, 0.151842, -0.336843, 0.970761, -0.107236, 1.013492, -0.475347, 0.068948, +0.398592, 1.116326, 0.620451, -0.287674, -1.371773, -0.685868, 0.331685, -0.997722, +0.291418, 1.107078, 0.244959, 0.164976, 0.406231, 1.215981, 1.448424, -1.025137, +0.205418, 0.588882, -0.264024, 2.495318, 0.855948, -0.850954, 0.811879, 0.700242, +0.759938, -1.712909, 1.537021, -1.609847, 1.109526, -1.109704, 0.385469, 0.965231, +0.818297, 0.037049, -0.926012, -0.111919, -0.803030, -1.665006, -0.901401, 0.588350, +0.554159, -0.415173, 0.061795, 0.457432, 0.199014, 0.257558, 2.080730, -2.277237, +0.339022, 0.289894, 0.662261, -0.580860, 0.887752, 0.171871, 0.848821, 0.963769, +1.321918, -0.064345, 1.317053, 0.228017, -1.429637, -0.149701, -0.504968, -1.729141, +-0.417472, -0.614969, 0.720777, 0.339364, 0.882845, 0.284245, -0.145541, -0.089646, +0.289161, 1.164831, 0.805729, -1.355643, 0.120893, -0.222178, 0.571732, -0.300140, +1.134277, -0.179356, -1.467067, 1.395346, 0.440836, 0.565384, -0.693623, 0.833869, +-2.237378, 1.097644, -0.001617, -1.614573, -1.228727, 0.207405, 0.220942, -1.006073, +-0.453067, 1.399453, -0.461964, 0.032716, 0.798783, 0.896816, 0.137892, -1.619146, +-1.646606, 0.428707, -0.737231, 0.564926, -1.384167, 0.460268, 0.629384, 0.379847, +-1.013330, -0.347243, 0.441912, -1.590240, -0.701417, -1.077601, 1.002220, 1.729481, +0.709032, -0.747897, 0.228862, -0.223497, -0.853275, 0.345627, 0.109764, -1.133039, +-0.683124, -0.277856, 0.654790, -1.248394, -0.597539, -0.481813, 0.983372, 1.762121, +1.427402, 0.911763, 0.326823, 0.069619, -1.499763, -0.418223, -0.021037, 0.228425, +-1.008196, -0.664622, 0.558177, -1.188542, -0.775481, 0.271042, 1.534976, -1.052283, +0.625559, -0.797626, -0.313522, -0.602210, 1.259060, 0.858484, -2.105292, -0.360937, +0.553557, -1.556384, -0.206666, -0.425568, 0.493778, -0.870908, 0.079828, -0.521619, +-1.413861, -0.384293, -0.457922, -0.291471, -0.301224, -1.588594, 1.094287, 1.324167, +-0.126480, -0.737164, 0.213719, -0.400529, 0.064938, -1.757996, 1.686748, 0.327400, +0.715967, 1.598648, -2.064741, -0.743632, 0.176185, 0.527839, -0.553153, 0.298280, +-1.226607, -0.189676, -0.301713, 0.956956, -0.533366, -0.901082, -0.892552, 0.278717, +-0.745807, 1.603464, 0.574270, 0.320655, -0.151383, 0.315762, 1.343703, -2.237832, +1.292906, -0.378459, 0.002521, 0.884641, 0.582450, -1.614244, -1.503666, 0.573586, +-0.910537, -1.631277, -0.359138, -0.397616, -1.161307, -1.109838, 0.290672, -1.910239, +1.314768, 0.665319, -0.275115, -0.023022, -0.907976, -1.043657, 0.373516, 0.901532, +1.278539, -0.128456, 0.612821, 1.956518, 2.266326, -0.373959, 2.238039, -0.159580, +-0.703281, 0.563477, -0.050296, 1.163593, 0.658808, -1.550089, -3.029118, 0.540578, +-1.008998, 0.908047, 1.582303, -0.979088, 1.007902, 0.158491, -0.586927, 1.574082, +-0.516649, 1.227800, 1.583876, -2.088950, 2.949545, 1.356125, 1.050068, -0.767170, +-0.257653, -1.371845, -1.267656, -0.894948, 0.589089, 1.842629, 1.347967, -0.491253, +-2.177568, 0.237000, -0.735411, -1.779419, 0.448030, 0.581214, 0.856607, -0.266263, +-0.417470, -0.205806, -0.174323, 0.217577, 1.684295, 0.119528, 0.650667, 2.080061, +-0.339225, 0.730113, 0.293969, -0.849109, -2.533858, -2.378941, -0.346276, -0.610937, +-0.408192, -1.415611, 0.227122, 0.207974, -0.719718, 0.757762, -1.643135, -1.056813, +-0.251662, -1.298441, 1.233255, 1.494625, 0.235938, -1.404359, 0.658791, -2.556613, +-0.534945, 3.202525, 0.439198, -1.149901, 0.886765, -0.283386, 1.035336, -0.364878, +1.341987, 1.008872, 0.213874, -0.299264, 0.255849, -0.190826, -0.079060, 0.699851, +-0.796540, -0.801284, -0.007599, -0.726810, -1.490902, 0.870335, -0.265675, -1.566695, +-0.394636, -0.143855, -2.334247, -1.357539, -1.815689, 1.108422, -0.142115, 1.112757, +0.559264, 0.478370, -0.679385, 0.284967, -1.332935, -0.723980, -0.663600, 0.198443, +-1.794868, -1.387673, 0.197768, 1.469328, 0.366493, -0.442775, -0.048563, 0.077709, +1.957910, -0.072848, 0.938810, -0.079608, -0.800959, 0.309424, 1.051826, -1.664211, +-1.090792, -0.191731, 0.463401, -0.924147, -0.649657, 0.622893, -1.335107, 1.047689, +0.863327, -0.642411, 0.660010, 1.294116, 0.314579, 0.859573, 0.128670, 0.016568, +-0.072801, -0.994310, -0.747358, -0.030814, 0.988355, -0.599017, 1.476644, -0.813801, +0.645040, -1.309919, -0.867425, -0.474233, 0.222417, 1.871323, 0.110001, -0.411341, +0.511242, -1.199117, -0.096361, 0.445817, -0.295825, -0.167996, 0.179543, 0.421118, +1.677678, 1.996949, 0.696964, -1.366382, 0.363045, -0.567044, -1.044154, 0.697139, +0.484026, -0.193751, -0.378095, -0.886374, -1.840197, -1.628195, -1.173789, -0.415411, +0.175088, 0.229433, -1.240889, 0.700004, 0.426877, 1.454803, -0.510186, -0.006657, +-0.525496, 0.717698, 1.088374, 0.500552, 2.771790, -0.160309, 0.429489, -1.966817, +-0.546019, -1.888395, -0.107952, -1.316144, -0.672632, -0.902365, -0.154798, 0.947242, +1.550375, 0.429040, -0.560795, 0.179304, -0.771509, -0.943390, -1.407569, -1.906131, +-0.065293, 0.672149, 0.206147, -0.008124, 0.020042, -0.558447, 1.886079, -0.219975, +-1.414395, -0.302811, -0.569574, -0.121495, -0.390171, -0.844287, -1.737757, -0.449520, +-1.547933, -0.095776, 0.907714, 2.369602, 0.519768, 0.410525, 1.052585, 0.428784, +1.295088, -0.186053, 0.130733, -0.657627, -0.759267, -0.595170, 0.812400, 0.069541, +-1.833687, 1.827363, 0.654075, -1.544769, -0.375109, 0.207688, -0.765615, -0.106355, +0.338769, 1.033461, -1.404822, -1.030570, -0.643372, 0.170787, 1.344839, 1.936273, +0.741336, 0.811980, -0.142808, -0.099858, -0.800131, 0.493249, 1.237574, 1.295951, +-0.278196, 0.217127, 0.630728, -0.548549, 0.229632, 0.355311, 0.521284, -0.615971, +1.345803, 0.974922, -2.377934, -1.092319, -0.325710, -2.012228, 1.567660, 0.233337, +0.646420, -1.129412, 0.197038, 1.696870, 0.726034, 0.792526, 0.603357, -0.058405, +-1.108666, 2.144229, -1.352821, 0.457021, 0.391175, 2.073013, -0.323318, 1.468132, +-0.502399, 0.209593, 0.754800, -0.948189, 0.613157, 1.760503, 0.088762, 2.595570, +-0.675470, 2.786804, -0.016827, 0.271651, -0.914102, -1.951371, -0.317418, 0.588333, +0.828996, -1.674851, -1.922293, -0.436662, 0.044974, 2.416609, -0.309892, 0.187583, +0.947699, -0.525703, -1.115605, -1.592320, 1.174844, 0.485144, 1.645480, -0.454233, +1.008768, 2.049403, 0.602020, 0.017860, -1.610426, 1.238752, 0.683587, -0.780716, +0.530979, 2.134498, 0.354361, 0.231700, 1.287980, -0.013488, -1.333345, -0.556343, +0.755597, -0.911854, 1.371684, 0.245580, 0.118845, 0.384690, -0.070152, -0.578309, +0.469308, 1.299687, 1.634798, -0.702809, 0.807253, -1.027451, 1.294496, 0.014930, +0.218705, 1.713188, -2.078805, 0.112917, -1.086491, -1.558311, 0.637406, -0.404576, +-0.403325, 0.084076, -0.435349, -0.562623, 0.878062, -0.814650, -0.258363, 0.493299, +-0.802694, -0.008329, 0.627571, 0.154382, 2.580735, -1.306246, 1.023526, 0.777795, +-0.833884, -0.586663, 0.065664, -0.012342, -0.076987, -1.558587, 1.702607, -0.468984, +0.094619, 0.287071, 0.919354, 0.510136, 0.245440, -1.400519, 0.969571, 1.593698, +-1.437917, -1.534230, -0.074710, 0.081459, -0.843240, -0.564640, -0.028207, -1.243702, +0.733039, 0.059580, 0.149144, 1.595857, -0.777250, 1.550277, 1.055002, -0.166654, +0.314484, 1.419571, 0.327348, 0.475653, 0.398754, -0.072770, 1.314784, 0.978279, +1.722114, -0.412302, 0.565133, 0.739851, 0.220138, 1.312807, 0.629152, -1.107987, +-0.447001, -0.725993, 0.354045, -0.506772, -2.103747, -0.664684, 1.450110, -0.329805, +2.701872, -1.634939, -0.536325, 0.547223, 1.492603, -0.455243, -0.496416, 1.235260, +0.040926, 0.748467, 1.230764, 0.304903, 1.077771, 0.765151, -1.319580, -0.509191, +0.555116, -1.957625, -0.760453, -2.443886, -0.659366, -0.114779, 0.300079, -0.583996, +-3.073745, 1.551042, -0.407369, 1.428095, -1.353242, 0.903970, 0.541671, -0.465020 +}; + + + +/* ---------------------------------------------------------------------- +** Coefficients for 32-tap filter for Floating point LMS FIR filter +* FIR high pass filter with cutoff freq 9.6kHz (transition 9.6KHz to 11.52KHz) +** ------------------------------------------------------------------- */ +float32_t lmsNormCoeff_f32[32] = { +-0.004240, 0.002301, 0.008860, -0.000000, -0.019782, -0.010543, 0.032881, 0.034736, +-0.037374, -0.069586, 0.022397, 0.102169, 0.014185, -0.115908, -0.061648, 0.101018, +0.101018, -0.061648, -0.115908, 0.014185, 0.102169, 0.022397, -0.069586, -0.037374, +0.034736, 0.032881, -0.010543, -0.019782, -0.000000, 0.008860, 0.002301, -0.004240 + +}; + +/* ---------------------------------------------------------------------- +** Coefficients for 32-tap filter for Floating point FIR filter +* FIR low pass filter with cutoff freq 24Hz (transition 24Hz to 240Hz) +** ------------------------------------------------------------------- */ +const float32_t FIRCoeff_f32[32] = { +0.004502, 0.005074, 0.006707, 0.009356, 0.012933, 0.017303, 0.022298, 0.027717, +0.033338, 0.038930, 0.044258, 0.049098, 0.053243, 0.056519, 0.058784, 0.059941, +0.059941, 0.058784, 0.056519, 0.053243, 0.049098, 0.044258, 0.038930, 0.033338, +0.027717, 0.022298, 0.017303, 0.012933, 0.009356, 0.006707, 0.005074, 0.004502 + +}; + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/arm_signal_converge_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/arm_signal_converge_example_f32.c new file mode 100644 index 0000000..d984e2f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/arm_signal_converge_example_f32.c @@ -0,0 +1,259 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_signal_converge_example_f32.c +* +* Description: Example code demonstrating convergence of an adaptive +* filter. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. + * -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup SignalConvergence Signal Convergence Example + * + * \par Description: + * \par + * Demonstrates the ability of an adaptive filter to "learn" the transfer function of + * a FIR lowpass filter using the Normalized LMS Filter, Finite Impulse + * Response (FIR) Filter, and Basic Math Functions. + * + * \par Algorithm: + * \par + * The figure below illustrates the signal flow in this example. Uniformly distributed white + * noise is passed through an FIR lowpass filter. The output of the FIR filter serves as the + * reference input of the adaptive filter (normalized LMS filter). The white noise is input + * to the adaptive filter. The adaptive filter learns the transfer function of the FIR filter. + * The filter outputs two signals: (1) the output of the internal adaptive FIR filter, and + * (2) the error signal which is the difference between the adaptive filter and the reference + * output of the FIR filter. Over time as the adaptive filter learns the transfer function + * of the FIR filter, the first output approaches the reference output of the FIR filter, + * and the error signal approaches zero. + * \par + * The adaptive filter converges properly even if the input signal has a large dynamic + * range (i.e., varies from small to large values). The coefficients of the adaptive filter + * are initially zero, and then converge over 1536 samples. The internal function test_signal_converge() + * implements the stopping condition. The function checks if all of the values of the error signal have a + * magnitude below a threshold DELTA. + * + * \par Block Diagram: + * \par + * \image html SignalFlow.gif + * + * + * \par Variables Description: + * \par + * \li \c testInput_f32 points to the input data + * \li \c firStateF32 points to FIR state buffer + * \li \c lmsStateF32 points to Normalised Least mean square FIR filter state buffer + * \li \c FIRCoeff_f32 points to coefficient buffer + * \li \c lmsNormCoeff_f32 points to Normalised Least mean square FIR filter coefficient buffer + * \li \c wire1, wir2, wire3 temporary buffers + * \li \c errOutput, err_signal temporary error buffers + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_lms_norm_init_f32() + * - arm_fir_init_f32() + * - arm_fir_f32() + * - arm_lms_norm_f32() + * - arm_scale_f32() + * - arm_abs_f32() + * - arm_sub_f32() + * - arm_min_f32() + * - arm_copy_f32() + * + * Refer + * \link arm_signal_converge_example_f32.c \endlink + * + */ + + +/** \example arm_signal_converge_example_f32.c + */ + +#include "arm_math.h" +#include "math_helper.h" + +/* ---------------------------------------------------------------------- +** Global defines for the simulation +* ------------------------------------------------------------------- */ + +#define TEST_LENGTH_SAMPLES 1536 +#define NUMTAPS 32 +#define BLOCKSIZE 32 +#define DELTA_ERROR 0.000001f +#define DELTA_COEFF 0.0001f +#define MU 0.5f + +#define NUMFRAMES (TEST_LENGTH_SAMPLES / BLOCKSIZE) + +/* ---------------------------------------------------------------------- +* Declare FIR state buffers and structure +* ------------------------------------------------------------------- */ + +float32_t firStateF32[NUMTAPS + BLOCKSIZE]; +arm_fir_instance_f32 LPF_instance; + +/* ---------------------------------------------------------------------- +* Declare LMSNorm state buffers and structure +* ------------------------------------------------------------------- */ + +float32_t lmsStateF32[NUMTAPS + BLOCKSIZE]; +float32_t errOutput[TEST_LENGTH_SAMPLES]; +arm_lms_norm_instance_f32 lmsNorm_instance; + + +/* ---------------------------------------------------------------------- +* Function Declarations for Signal Convergence Example +* ------------------------------------------------------------------- */ + +arm_status test_signal_converge_example( void ); + + +/* ---------------------------------------------------------------------- +* Internal functions +* ------------------------------------------------------------------- */ +arm_status test_signal_converge(float32_t* err_signal, + uint32_t blockSize); + +void getinput(float32_t* input, + uint32_t fr_cnt, + uint32_t blockSize); + +/* ---------------------------------------------------------------------- +* External Declarations for FIR F32 module Test +* ------------------------------------------------------------------- */ +extern float32_t testInput_f32[TEST_LENGTH_SAMPLES]; +extern float32_t lmsNormCoeff_f32[32]; +extern const float32_t FIRCoeff_f32[32]; +extern arm_lms_norm_instance_f32 lmsNorm_instance; + +/* ---------------------------------------------------------------------- +* Declare I/O buffers +* ------------------------------------------------------------------- */ + +float32_t wire1[BLOCKSIZE]; +float32_t wire2[BLOCKSIZE]; +float32_t wire3[BLOCKSIZE]; +float32_t err_signal[BLOCKSIZE]; + +/* ---------------------------------------------------------------------- +* Signal converge test +* ------------------------------------------------------------------- */ + +int32_t main(void) +{ + uint32_t i; + arm_status status; + uint32_t index; + float32_t minValue; + + /* Initialize the LMSNorm data structure */ + arm_lms_norm_init_f32(&lmsNorm_instance, NUMTAPS, lmsNormCoeff_f32, lmsStateF32, MU, BLOCKSIZE); + + /* Initialize the FIR data structure */ + arm_fir_init_f32(&LPF_instance, NUMTAPS, (float32_t *)FIRCoeff_f32, firStateF32, BLOCKSIZE); + + /* ---------------------------------------------------------------------- + * Loop over the frames of data and execute each of the processing + * functions in the system. + * ------------------------------------------------------------------- */ + + for(i=0; i < NUMFRAMES; i++) + { + /* Read the input data - uniformly distributed random noise - into wire1 */ + arm_copy_f32(testInput_f32 + (i * BLOCKSIZE), wire1, BLOCKSIZE); + + /* Execute the FIR processing function. Input wire1 and output wire2 */ + arm_fir_f32(&LPF_instance, wire1, wire2, BLOCKSIZE); + + /* Execute the LMS Norm processing function*/ + + arm_lms_norm_f32(&lmsNorm_instance, /* LMSNorm instance */ + wire1, /* Input signal */ + wire2, /* Reference Signal */ + wire3, /* Converged Signal */ + err_signal, /* Error Signal, this will become small as the signal converges */ + BLOCKSIZE); /* BlockSize */ + + /* apply overall gain */ + arm_scale_f32(wire3, 5, wire3, BLOCKSIZE); /* in-place buffer */ + } + + status = ARM_MATH_SUCCESS; + + /* ------------------------------------------------------------------------------- + * Test whether the error signal has reached towards 0. + * ----------------------------------------------------------------------------- */ + + arm_abs_f32(err_signal, err_signal, BLOCKSIZE); + arm_min_f32(err_signal, BLOCKSIZE, &minValue, &index); + + if (minValue > DELTA_ERROR) + { + status = ARM_MATH_TEST_FAILURE; + } + + /* ---------------------------------------------------------------------- + * Test whether the filter coefficients have converged. + * ------------------------------------------------------------------- */ + + arm_sub_f32((float32_t *)FIRCoeff_f32, lmsNormCoeff_f32, lmsNormCoeff_f32, NUMTAPS); + + arm_abs_f32(lmsNormCoeff_f32, lmsNormCoeff_f32, NUMTAPS); + arm_min_f32(lmsNormCoeff_f32, NUMTAPS, &minValue, &index); + + if (minValue > DELTA_COEFF) + { + status = ARM_MATH_TEST_FAILURE; + } + + /* ---------------------------------------------------------------------- + * Loop here if the signals did not pass the convergence check. + * This denotes a test failure + * ------------------------------------------------------------------- */ + + if ( status != ARM_MATH_SUCCESS) + { + while (1); + } + + while (1); /* main function does not return */ +} + + /** \endlink */ diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/math_helper.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/math_helper.c new file mode 100644 index 0000000..f615e6f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/math_helper.c @@ -0,0 +1,466 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 b +* +* Project: CMSIS DSP Library +* +* Title: math_helper.c +* +* Description: Definition of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- +* Include standard header files +* -------------------------------------------------------------------- */ +#include + +/* ---------------------------------------------------------------------- +* Include project header files +* -------------------------------------------------------------------- */ +#include "math_helper.h" + +/** + * @brief Caluclation of SNR + * @param[in] pRef Pointer to the reference buffer + * @param[in] pTest Pointer to the test buffer + * @param[in] buffSize total number of samples + * @return SNR + * The function Caluclates signal to noise ratio for the reference output + * and test output + */ + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) +{ + float EnergySignal = 0.0, EnergyError = 0.0; + uint32_t i; + float SNR; + int temp; + int *test; + + for (i = 0; i < buffSize; i++) + { + /* Checking for a NAN value in pRef array */ + test = (int *)(&pRef[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + /* Checking for a NAN value in pTest array */ + test = (int *)(&pTest[i]); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + EnergySignal += pRef[i] * pRef[i]; + EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); + } + + /* Checking for a NAN value in EnergyError */ + test = (int *)(&EnergyError); + temp = *test; + + if (temp == 0x7FC00000) + { + return(0); + } + + + SNR = 10 * log10 (EnergySignal / EnergyError); + + return (SNR); + +} + + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Converts float to fixed in q12.20 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to outputbuffer + * @param[in] numSamples number of samples in the input buffer + * @return none + * The function converts floating point values to fixed point(q12.20) values + */ + +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1048576.0f corresponds to pow(2, 20) */ + pOut[i] = (q31_t) (pIn[i] * 1048576.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 1.0) + { + pOut[i] = 0x000FFFFF; + } + } +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Compare MATLAB Reference Output and ARM Test output + * @param[in] pIn Pointer to Ref buffer + * @param[in] pOut Pointer to Test buffer + * @param[in] numSamples number of samples in the buffer + * @return maximum difference + */ + +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + int32_t diff, diffCrnt = 0; + uint32_t maxDiff = 0; + + for (i = 0; i < numSamples; i++) + { + diff = pIn[i] - pOut[i]; + diffCrnt = (diff > 0) ? diff : -diff; + + if (diffCrnt > maxDiff) + { + maxDiff = diffCrnt; + } + } + + return(maxDiff); +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q31 (q31_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + +/** + * @brief Provide guard bits for Input buffer + * @param[in,out] input_buf Pointer to input buffer + * @param[in] blockSize block Size + * @param[in] guard_bits guard bits + * @return none + * The function Provides the guard bits for the buffer + * to avoid overflow + */ + +void arm_provide_guard_bits_q7 (q7_t * input_buf, + uint32_t blockSize, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < blockSize; i++) + { + input_buf[i] = input_buf[i] >> guard_bits; + } +} + + + +/** + * @brief Caluclates number of guard bits + * @param[in] num_adds number of additions + * @return guard bits + * The function Caluclates the number of guard bits + * depending on the numtaps + */ + +uint32_t arm_calc_guard_bits (uint32_t num_adds) +{ + uint32_t i = 1, j = 0; + + if (num_adds == 1) + { + return (0); + } + + while (i < num_adds) + { + i = i * 2; + j++; + } + + return (j); +} + +/** + * @brief Apply guard bits to buffer + * @param[in,out] pIn pointer to input buffer + * @param[in] numSamples number of samples in the input buffer + * @param[in] guard_bits guard bits + * @return none + */ + +void arm_apply_guard_bits (float32_t *pIn, + uint32_t numSamples, + uint32_t guard_bits) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); + } +} + +/** + * @brief Calculates pow(2, numShifts) + * @param[in] numShifts number of shifts + * @return pow(2, numShifts) + */ +uint32_t arm_calc_2pow(uint32_t numShifts) +{ + + uint32_t i, val = 1; + + for (i = 0; i < numShifts; i++) + { + val = val * 2; + } + + return(val); +} + + + +/** + * @brief Converts float to fixed q14 + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q14 (float *pIn, q15_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 16384.0f corresponds to pow(2, 14) */ + pOut[i] = (q15_t) (pIn[i] * 16384.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFF; + } + + } + +} + + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q30 (float *pIn, q31_t * pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 2.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Converts float to fixed q30 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q29 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 1073741824.0f corresponds to pow(2, 30) */ + pOut[i] = (q31_t) (pIn[i] * 536870912.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 4.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + + +/** + * @brief Converts float to fixed q28 format + * @param[in] pIn pointer to input buffer + * @param[out] pOut pointer to output buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_float_to_q28 (float *pIn, q31_t *pOut, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + /* 268435456.0f corresponds to pow(2, 28) */ + pOut[i] = (q31_t) (pIn[i] * 268435456.0f); + + pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; + + if (pIn[i] == (float) 8.0) + { + pOut[i] = 0x7FFFFFFF; + } + } +} + +/** + * @brief Clip the float values to +/- 1 + * @param[in,out] pIn input buffer + * @param[in] numSamples number of samples in the buffer + * @return none + * The function converts floating point values to fixed point values + */ + +void arm_clip_f32 (float *pIn, uint32_t numSamples) +{ + uint32_t i; + + for (i = 0; i < numSamples; i++) + { + if (pIn[i] > 1.0f) + { + pIn[i] = 1.0; + } + else if ( pIn[i] < -1.0f) + { + pIn[i] = -1.0; + } + + } +} + + + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/math_helper.h b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/math_helper.h new file mode 100644 index 0000000..5a18734 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_signal_converge_example/math_helper.h @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2013 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* +* Title: math_helper.h +* +* Description: Prototypes of all helper functions required. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + + +#include "arm_math.h" + +#ifndef MATH_HELPER_H +#define MATH_HELPER_H + +float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); +void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); +void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); +void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); +void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); +void arm_clip_f32(float *pIn, uint32_t numSamples); +uint32_t arm_calc_guard_bits(uint32_t num_adds); +void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); +uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); +uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); +uint32_t arm_calc_2pow(uint32_t guard_bits); +#endif + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/Abstract.txt new file mode 100644 index 0000000..84bd3fd --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_sin_cos_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/arm_sin_cos_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/arm_sin_cos_example_f32.c new file mode 100644 index 0000000..7e2eb00 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_sin_cos_example/arm_sin_cos_example_f32.c @@ -0,0 +1,161 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 12. March 2014 +* $Revision: V1.4.3 +* +* Project: CMSIS DSP Library +* Title: arm_sin_cos_example_f32.c +* +* Description: Example code demonstrating sin and cos calculation of input signal. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup SinCosExample SineCosine Example + * + * \par Description: + * \par + * Demonstrates the Pythagorean trignometric identity with the use of Cosine, Sine, Vector + * Multiplication, and Vector Addition functions. + * + * \par Algorithm: + * \par + * Mathematically, the Pythagorean trignometric identity is defined by the following equation: + *
sin(x) * sin(x) + cos(x) * cos(x) = 1
+ * where \c x is the angle in radians. + * + * \par Block Diagram: + * \par + * \image html sinCos.gif + * + * \par Variables Description: + * \par + * \li \c testInput_f32 array of input angle in radians + * \li \c testOutput stores sum of the squares of sine and cosine values of input angle + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_cos_f32() + * - arm_sin_f32() + * - arm_mult_f32() + * - arm_add_f32() + * + * Refer + * \link arm_sin_cos_example_f32.c \endlink + * + */ + + +/** \example arm_sin_cos_example_f32.c + */ + +#include +#include "arm_math.h" + +/* ---------------------------------------------------------------------- +* Defines each of the tests performed +* ------------------------------------------------------------------- */ +#define MAX_BLOCKSIZE 32 +#define DELTA (0.0001f) + + +/* ---------------------------------------------------------------------- +* Test input data for Floating point sin_cos example for 32-blockSize +* Generated by the MATLAB randn() function +* ------------------------------------------------------------------- */ + +const float32_t testInput_f32[MAX_BLOCKSIZE] = +{ + -1.244916875853235400, -4.793533929171324800, 0.360705030233248850, 0.827929644170887320, -3.299532218312426900, 3.427441903227623800, 3.422401784294607700, -0.108308165334010680, + 0.941943896490312180, 0.502609575000365850, -0.537345278736373500, 2.088817392965764500, -1.693168684143455700, 6.283185307179590700, -0.392545884746175080, 0.327893095115825040, + 3.070147440456292300, 0.170611405884662230, -0.275275082396073010, -2.395492805446796300, 0.847311163536506600, -3.845517018083148800, 2.055818378415868300, 4.672594161978930800, + -1.990923030266425800, 2.469305197656249500, 3.609002606064021000, -4.586736582331667500, -4.147080139136136300, 1.643756718868359500, -1.150866392366494800, 1.985805026477433800 + + +}; + +const float32_t testRefOutput_f32 = 1.000000000; + +/* ---------------------------------------------------------------------- +* Declare Global variables +* ------------------------------------------------------------------- */ +uint32_t blockSize = 32; +float32_t testOutput; +float32_t cosOutput; +float32_t sinOutput; +float32_t cosSquareOutput; +float32_t sinSquareOutput; + +/* ---------------------------------------------------------------------- +* Max magnitude FFT Bin test +* ------------------------------------------------------------------- */ + +arm_status status; + +int32_t main(void) +{ + float32_t diff; + uint32_t i; + + for(i=0; i< blockSize; i++) + { + cosOutput = arm_cos_f32(testInput_f32[i]); + sinOutput = arm_sin_f32(testInput_f32[i]); + + arm_mult_f32(&cosOutput, &cosOutput, &cosSquareOutput, 1); + arm_mult_f32(&sinOutput, &sinOutput, &sinSquareOutput, 1); + + arm_add_f32(&cosSquareOutput, &sinSquareOutput, &testOutput, 1); + + /* absolute value of difference between ref and test */ + diff = fabsf(testRefOutput_f32 - testOutput); + + /* Comparison of sin_cos value with reference */ + if (diff > DELTA) + { + status = ARM_MATH_TEST_FAILURE; + } + + if ( status == ARM_MATH_TEST_FAILURE) + { + while (1); + } + + } + + while (1); /* main function does not return */ +} + + /** \endlink */ diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/Abstract.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/Abstract.txt new file mode 100644 index 0000000..4dc03b8 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/Abstract.txt @@ -0,0 +1,4 @@ +CMSIS DSP_Lib example arm_variance_example for + Cortex-M0, Cortex-M3, Cortex-M4 with FPU and Cortex-M7 with single precision FPU. + +The example is configured for uVision Simulator. diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/CMakeLists.txt b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/CMakeLists.txt new file mode 100644 index 0000000..60f2341 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required (VERSION 3.6) +project (arm_variance_example VERSION 0.1) + +# Needed to include the configBoot module +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../..) + +################################### +# +# LIBRARIES +# +################################### + +########### +# +# CMSIS DSP +# + +add_subdirectory(../../../Source bin_dsp) + + +################################### +# +# TEST APPLICATION +# +################################### + + +add_executable(arm_variance_example) + +set(ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../../../..) + +include(configBoot) + +target_sources(arm_variance_example PRIVATE arm_variance_example_f32.c) + +### Sources and libs + +target_link_libraries(arm_variance_example PRIVATE CMSISDSP) + +################################### +# +# INSTALLATION +# +################################### + +install (TARGETS arm_variance_example DESTINATION "${PROJECT_SOURCE_DIR}/varianceExampleBuild.axf") \ No newline at end of file diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/startup_ARMCM0.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/startup_ARMCM0.s new file mode 100644 index 0000000..bdb4be7 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/startup_ARMCM0.s @@ -0,0 +1,159 @@ +;/**************************************************************************//** +; * @file startup_ARMCM0.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE ( 22 * 4) ; Interrupts 10 .. 31 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/system_ARMCM0.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/system_ARMCM0.c new file mode 100644 index 0000000..d735adf --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/system_ARMCM0.c @@ -0,0 +1,56 @@ +/**************************************************************************//** + * @file system_ARMCM0.c + * @brief CMSIS Device System Source File for + * ARMCM0 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM0.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/startup_ARMCM3.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/startup_ARMCM3.s new file mode 100644 index 0000000..81a33d9 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/startup_ARMCM3.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM3.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM3 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/system_ARMCM3.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/system_ARMCM3.c new file mode 100644 index 0000000..5578e23 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/system_ARMCM3.c @@ -0,0 +1,68 @@ +/**************************************************************************//** + * @file system_ARMCM3.c + * @brief CMSIS Device System Source File for + * ARMCM3 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#include "ARMCM3.h" + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s new file mode 100644 index 0000000..93f7f27 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/startup_ARMCM4.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c new file mode 100644 index 0000000..cfac6b2 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/system_ARMCM4.c @@ -0,0 +1,83 @@ +/**************************************************************************//** + * @file system_ARMCM4.c + * @brief CMSIS Device System Source File for + * ARMCM4 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM4) + #include "ARMCM4.h" +#elif defined (ARMCM4_FP) + #include "ARMCM4_FP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s new file mode 100644 index 0000000..f9d954a --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/startup_ARMCM7.s @@ -0,0 +1,163 @@ +;/**************************************************************************//** +; * @file startup_ARMCM7.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM7 Device +; * @version V5.3.1 +; * @date 09. July 2018 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2018 Arm Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * 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 +; * +; * 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. +; */ + +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +__stack_limit +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000C00 + + IF Heap_Size != 0 ; Heap is provided + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + ENDIF + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; -14 NMI Handler + DCD HardFault_Handler ; -13 Hard Fault Handler + DCD MemManage_Handler ; -12 MPU Fault Handler + DCD BusFault_Handler ; -11 Bus Fault Handler + DCD UsageFault_Handler ; -10 Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; -5 SVCall Handler + DCD DebugMon_Handler ; -4 Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; -2 PendSV Handler + DCD SysTick_Handler ; -1 SysTick Handler + + ; Interrupts + DCD Interrupt0_Handler ; 0 Interrupt 0 + DCD Interrupt1_Handler ; 1 Interrupt 1 + DCD Interrupt2_Handler ; 2 Interrupt 2 + DCD Interrupt3_Handler ; 3 Interrupt 3 + DCD Interrupt4_Handler ; 4 Interrupt 4 + DCD Interrupt5_Handler ; 5 Interrupt 5 + DCD Interrupt6_Handler ; 6 Interrupt 6 + DCD Interrupt7_Handler ; 7 Interrupt 7 + DCD Interrupt8_Handler ; 8 Interrupt 8 + DCD Interrupt9_Handler ; 9 Interrupt 9 + + SPACE (214 * 4) ; Interrupts 10 .. 224 are left out +__Vectors_End +__Vectors_Size EQU __Vectors_End - __Vectors + + + AREA |.text|, CODE, READONLY + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Macro to define default exception/interrupt handlers. +; Default handler are weak symbols with an endless loop. +; They can be overwritten by real handlers. + MACRO + Set_Default_Handler $Handler_Name +$Handler_Name PROC + EXPORT $Handler_Name [WEAK] + B . + ENDP + MEND + + +; Default exception/interrupt handler + + Set_Default_Handler NMI_Handler + Set_Default_Handler HardFault_Handler + Set_Default_Handler MemManage_Handler + Set_Default_Handler BusFault_Handler + Set_Default_Handler UsageFault_Handler + Set_Default_Handler SVC_Handler + Set_Default_Handler DebugMon_Handler + Set_Default_Handler PendSV_Handler + Set_Default_Handler SysTick_Handler + + Set_Default_Handler Interrupt0_Handler + Set_Default_Handler Interrupt1_Handler + Set_Default_Handler Interrupt2_Handler + Set_Default_Handler Interrupt3_Handler + Set_Default_Handler Interrupt4_Handler + Set_Default_Handler Interrupt5_Handler + Set_Default_Handler Interrupt6_Handler + Set_Default_Handler Interrupt7_Handler + Set_Default_Handler Interrupt8_Handler + Set_Default_Handler Interrupt9_Handler + + ALIGN + + +; User setup Stack & Heap + + EXPORT __stack_limit + EXPORT __initial_sp + IF Heap_Size != 0 ; Heap is provided + EXPORT __heap_base + EXPORT __heap_limit + ENDIF + + END diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c new file mode 100644 index 0000000..affc835 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/system_ARMCM7.c @@ -0,0 +1,85 @@ +/**************************************************************************//** + * @file system_ARMCM7.c + * @brief CMSIS Device System Source File for + * ARMCM7 Device + * @version V5.3.1 + * @date 09. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +#if defined (ARMCM7) + #include "ARMCM7.h" +#elif defined (ARMCM7_SP) + #include "ARMCM7_SP.h" +#elif defined (ARMCM7_DP) + #include "ARMCM7_DP.h" +#else + #error device not specified! +#endif + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#define XTAL (50000000UL) /* Oscillator frequency */ + +#define SYSTEM_CLOCK (XTAL / 2U) + + +/*---------------------------------------------------------------------------- + Externals + *----------------------------------------------------------------------------*/ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + extern uint32_t __Vectors; +#endif + +/*---------------------------------------------------------------------------- + System Core Clock Variable + *----------------------------------------------------------------------------*/ +uint32_t SystemCoreClock = SYSTEM_CLOCK; /* System Core Clock Frequency */ + + +/*---------------------------------------------------------------------------- + System Core Clock update function + *----------------------------------------------------------------------------*/ +void SystemCoreClockUpdate (void) +{ + SystemCoreClock = SYSTEM_CLOCK; +} + +/*---------------------------------------------------------------------------- + System initialization function + *----------------------------------------------------------------------------*/ +void SystemInit (void) +{ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + SCB->VTOR = (uint32_t) &__Vectors; +#endif + +#if defined (__FPU_USED) && (__FPU_USED == 1U) + SCB->CPACR |= ((3U << 10U*2U) | /* enable CP10 Full Access */ + (3U << 11U*2U) ); /* enable CP11 Full Access */ +#endif + +#ifdef UNALIGNED_SUPPORT_DISABLE + SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk; +#endif + + SystemCoreClock = SYSTEM_CLOCK; +} diff --git a/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/arm_variance_example_f32.c b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/arm_variance_example_f32.c new file mode 100644 index 0000000..b980309 --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/arm_variance_example/arm_variance_example_f32.c @@ -0,0 +1,225 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010-2012 ARM Limited. All rights reserved. +* +* $Date: 17. January 2013 +* $Revision: V1.4.0 +* +* Project: CMSIS DSP Library +* Title: arm_variance_example_f32.c +* +* Description: Example code demonstrating variance calculation of input sequence. +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* - Neither the name of ARM LIMITED nor the names of its contributors +* may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* -------------------------------------------------------------------- */ + +/** + * @ingroup groupExamples + */ + +/** + * @defgroup VarianceExample Variance Example + * + * \par Description: + * \par + * Demonstrates the use of Basic Math and Support Functions to calculate the variance of an + * input sequence with N samples. Uniformly distributed white noise is taken as input. + * + * \par Algorithm: + * \par + * The variance of a sequence is the mean of the squared deviation of the sequence from its mean. + * \par + * This is denoted by the following equation: + *
 variance = ((x[0] - x') * (x[0] - x') + (x[1] - x') * (x[1] - x') + ... + * (x[n-1] - x') * (x[n-1] - x')) / (N-1)
+ * where, x[n] is the input sequence, N is the number of input samples, and + * x' is the mean value of the input sequence, x[n]. + * \par + * The mean value x' is defined as: + *
 x' = (x[0] + x[1] + ... + x[n-1]) / N
+ * + * \par Block Diagram: + * \par + * \image html Variance.gif + * + * + * \par Variables Description: + * \par + * \li \c testInput_f32 points to the input data + * \li \c wire1, \c wir2, \c wire3 temporary buffers + * \li \c blockSize number of samples processed at a time + * \li \c refVarianceOut reference variance value + * + * \par CMSIS DSP Software Library Functions Used: + * \par + * - arm_dot_prod_f32() + * - arm_mult_f32() + * - arm_sub_f32() + * - arm_fill_f32() + * - arm_copy_f32() + * + * Refer + * \link arm_variance_example_f32.c \endlink + * + */ + + +/** \example arm_variance_example_f32.c + */ + +#include +#include "arm_math.h" + +/* ---------------------------------------------------------------------- +* Defines each of the tests performed +* ------------------------------------------------------------------- */ +#define MAX_BLOCKSIZE 32 +#define DELTA (0.000001f) + + +/* ---------------------------------------------------------------------- +* Declare I/O buffers +* ------------------------------------------------------------------- */ +float32_t wire1[MAX_BLOCKSIZE]; +float32_t wire2[MAX_BLOCKSIZE]; +float32_t wire3[MAX_BLOCKSIZE]; + +/* ---------------------------------------------------------------------- +* Test input data for Floating point Variance example for 32-blockSize +* Generated by the MATLAB randn() function +* ------------------------------------------------------------------- */ + +float32_t testInput_f32[32] = +{ + -0.432564811528221, -1.665584378238097, 0.125332306474831, 0.287676420358549, + -1.146471350681464, 1.190915465642999, 1.189164201652103, -0.037633276593318, + 0.327292361408654, 0.174639142820925, -0.186708577681439, 0.725790548293303, + -0.588316543014189, 2.183185818197101, -0.136395883086596, 0.113931313520810, + 1.066768211359189, 0.059281460523605, -0.095648405483669, -0.832349463650022, + 0.294410816392640, -1.336181857937804, 0.714324551818952, 1.623562064446271, + -0.691775701702287, 0.857996672828263, 1.254001421602532, -1.593729576447477, + -1.440964431901020, 0.571147623658178, -0.399885577715363, 0.689997375464345 + +}; + +/* ---------------------------------------------------------------------- +* Declare Global variables +* ------------------------------------------------------------------- */ +uint32_t blockSize = 32; +float32_t refVarianceOut = 0.903941793931839; + +/* ---------------------------------------------------------------------- +* Variance calculation test +* ------------------------------------------------------------------- */ + +int32_t main(void) +{ + arm_status status; + float32_t mean, oneByBlockSize; + float32_t variance; + float32_t diff; + + status = ARM_MATH_SUCCESS; + +#if defined(FILEIO) + printf("START\n"); +#endif + + + /* Calculation of mean value of input */ + + /* x' = 1/blockSize * (x(0)* 1 + x(1) * 1 + ... + x(n-1) * 1) */ + + /* Fill wire1 buffer with 1.0 value */ + arm_fill_f32(1.0, wire1, blockSize); + + /* Calculate the dot product of wire1 and wire2 */ + /* (x(0)* 1 + x(1) * 1 + ...+ x(n-1) * 1) */ + arm_dot_prod_f32(testInput_f32, wire1, blockSize, &mean); + + /* Calculation of 1/blockSize */ + oneByBlockSize = 1.0 / (blockSize); + + /* 1/blockSize * (x(0)* 1 + x(1) * 1 + ... + x(n-1) * 1) */ + arm_mult_f32(&mean, &oneByBlockSize, &mean, 1); + + + /* Calculation of variance value of input */ + + /* (1/blockSize) * (x(0) - x') * (x(0) - x') + (x(1) - x') * (x(1) - x') + ... + (x(n-1) - x') * (x(n-1) - x') */ + + /* Fill wire2 with mean value x' */ + arm_fill_f32(mean, wire2, blockSize); + + /* wire3 contains (x-x') */ + arm_sub_f32(testInput_f32, wire2, wire3, blockSize); + + /* wire2 contains (x-x') */ + arm_copy_f32(wire3, wire2, blockSize); + + /* (x(0) - x') * (x(0) - x') + (x(1) - x') * (x(1) - x') + ... + (x(n-1) - x') * (x(n-1) - x') */ + arm_dot_prod_f32(wire2, wire3, blockSize, &variance); + + /* Calculation of 1/blockSize */ + oneByBlockSize = 1.0 / (blockSize - 1); + + /* Calculation of variance */ + arm_mult_f32(&variance, &oneByBlockSize, &variance, 1); + + /* absolute value of difference between ref and test */ + diff = fabsf(refVarianceOut - variance); + + /* Comparison of variance value with reference */ + + if (diff > DELTA) + { + status = ARM_MATH_TEST_FAILURE; + } + + +#if !defined(FILEIO) + if ( status != ARM_MATH_SUCCESS) + { + while (1); + } + + while (1); /* main function does not return */ +#else + if (status == ARM_MATH_SUCCESS) + { + printf("SUCCESS\n"); + } + else + { + printf("FAILURE\n"); + } +#endif +} + + /** \endlink */ + + diff --git a/Drivers/CMSIS/DSP/Examples/ARM/boot/RTE_Components.h b/Drivers/CMSIS/DSP/Examples/ARM/boot/RTE_Components.h new file mode 100644 index 0000000..ef3633f --- /dev/null +++ b/Drivers/CMSIS/DSP/Examples/ARM/boot/RTE_Components.h @@ -0,0 +1,5 @@ +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +#endif /* RTE_COMPONENTS_H */ \ No newline at end of file diff --git a/Drivers/CMSIS/DSP/Include/arm_common_tables.h b/Drivers/CMSIS/DSP/Include/arm_common_tables.h new file mode 100644 index 0000000..cf6586f --- /dev/null +++ b/Drivers/CMSIS/DSP/Include/arm_common_tables.h @@ -0,0 +1,378 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_common_tables.h + * Description: Extern declaration for common tables + * + * $Date: 27. January 2017 + * $Revision: V.1.5.1 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math.h" + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREV_1024) + extern const uint16_t armBitRevTable[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16) + extern const float32_t twiddleCoef_16[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_32) + extern const float32_t twiddleCoef_32[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64) + extern const float32_t twiddleCoef_64[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_128) + extern const float32_t twiddleCoef_128[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256) + extern const float32_t twiddleCoef_256[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_512) + extern const float32_t twiddleCoef_512[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) + extern const float32_t twiddleCoef_1024[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048) + extern const float32_t twiddleCoef_2048[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096) + extern const float32_t twiddleCoef_4096[8192]; + #define twiddleCoef twiddleCoef_4096 + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_16) + extern const q31_t twiddleCoef_16_q31[24]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_32) + extern const q31_t twiddleCoef_32_q31[48]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_64) + extern const q31_t twiddleCoef_64_q31[96]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_128) + extern const q31_t twiddleCoef_128_q31[192]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_256) + extern const q31_t twiddleCoef_256_q31[384]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_512) + extern const q31_t twiddleCoef_512_q31[768]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) + extern const q31_t twiddleCoef_1024_q31[1536]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) + extern const q31_t twiddleCoef_2048_q31[3072]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) + extern const q31_t twiddleCoef_4096_q31[6144]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_16) + extern const q15_t twiddleCoef_16_q15[24]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_32) + extern const q15_t twiddleCoef_32_q15[48]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_64) + extern const q15_t twiddleCoef_64_q15[96]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_128) + extern const q15_t twiddleCoef_128_q15[192]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_256) + extern const q15_t twiddleCoef_256_q15[384]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_512) + extern const q15_t twiddleCoef_512_q15[768]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) + extern const q15_t twiddleCoef_1024_q15[1536]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) + extern const q15_t twiddleCoef_2048_q15[3072]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) + extern const q15_t twiddleCoef_4096_q15[6144]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32) + extern const float32_t twiddleCoef_rfft_32[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64) + extern const float32_t twiddleCoef_rfft_64[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128) + extern const float32_t twiddleCoef_rfft_128[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256) + extern const float32_t twiddleCoef_rfft_256[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512) + extern const float32_t twiddleCoef_rfft_512[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024) + extern const float32_t twiddleCoef_rfft_1024[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048) + extern const float32_t twiddleCoef_rfft_2048[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096) + extern const float32_t twiddleCoef_rfft_4096[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + /* floating-point bit reversal tables */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_16) + #define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20) + extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_32) + #define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48) + extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_64) + #define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56) + extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_128) + #define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208) + extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_256) + #define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440) + extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_512) + #define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448) + extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_1024) + #define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) + extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_2048) + #define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) + extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_4096) + #define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) + extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + + /* fixed-point bit reversal tables */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_16) + #define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12) + extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_32) + #define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24) + extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_64) + #define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56) + extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_128) + #define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112) + extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_256) + #define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240) + extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_512) + #define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480) + extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_1024) + #define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992) + extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_2048) + #define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) + extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_4096) + #define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) + extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_F32) + extern const float32_t realCoefA[8192]; + extern const float32_t realCoefB[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q31) + extern const q31_t realCoefAQ31[8192]; + extern const q31_t realCoefBQ31[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q15) + extern const q15_t realCoefAQ15[8192]; + extern const q15_t realCoefBQ15[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_128) + extern const float32_t Weights_128[256]; + extern const float32_t cos_factors_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_512) + extern const float32_t Weights_512[1024]; + extern const float32_t cos_factors_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_2048) + extern const float32_t Weights_2048[4096]; + extern const float32_t cos_factors_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_8192) + extern const float32_t Weights_8192[16384]; + extern const float32_t cos_factors_8192[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_128) + extern const q15_t WeightsQ15_128[256]; + extern const q15_t cos_factorsQ15_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_512) + extern const q15_t WeightsQ15_512[1024]; + extern const q15_t cos_factorsQ15_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_2048) + extern const q15_t WeightsQ15_2048[4096]; + extern const q15_t cos_factorsQ15_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_8192) + extern const q15_t WeightsQ15_8192[16384]; + extern const q15_t cos_factorsQ15_8192[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_128) + extern const q31_t WeightsQ31_128[256]; + extern const q31_t cos_factorsQ31_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_512) + extern const q31_t WeightsQ31_512[1024]; + extern const q31_t cos_factorsQ31_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_2048) + extern const q31_t WeightsQ31_2048[4096]; + extern const q31_t cos_factorsQ31_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_8192) + extern const q31_t WeightsQ31_8192[16384]; + extern const q31_t cos_factorsQ31_8192[8192]; + #endif + +#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_ALLOW_TABLES) + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q15) + extern const q15_t armRecipTableQ15[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q31) + extern const q31_t armRecipTableQ31[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + /* Tables for Fast Math Sine and Cosine */ + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_F32) + extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q31) + extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q15) + extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + +#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_TABLES) */ + +#endif /* ARM_COMMON_TABLES_H */ diff --git a/Drivers/CMSIS/DSP/Include/arm_const_structs.h b/Drivers/CMSIS/DSP/Include/arm_const_structs.h new file mode 100644 index 0000000..677073e --- /dev/null +++ b/Drivers/CMSIS/DSP/Include/arm_const_structs.h @@ -0,0 +1,66 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_const_structs.h + * Description: Constant structs that are initialized for user convenience. + * For example, some can be given as arguments to the arm_cfft_f32() function. + * + * $Date: 27. January 2017 + * $Revision: V.1.5.1 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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 _ARM_CONST_STRUCTS_H +#define _ARM_CONST_STRUCTS_H + +#include "arm_math.h" +#include "arm_common_tables.h" + + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; + + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; + + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; + +#endif diff --git a/Drivers/CMSIS/DSP/Include/arm_math.h b/Drivers/CMSIS/DSP/Include/arm_math.h new file mode 100644 index 0000000..fb2bce5 --- /dev/null +++ b/Drivers/CMSIS/DSP/Include/arm_math.h @@ -0,0 +1,7361 @@ +/****************************************************************************** + * @file arm_math.h + * @brief Public header file for CMSIS DSP Library + * @version V1.6.0 + * @date 18. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2010-2019 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + */ + +/** + \mainpage CMSIS DSP Software Library + * + * Introduction + * ------------ + * + * This user manual describes the CMSIS DSP software library, + * a suite of common signal processing functions for use on Cortex-M processor based devices. + * + * The library is divided into a number of functions each covering a specific category: + * - Basic math functions + * - Fast math functions + * - Complex math functions + * - Filters + * - Matrix functions + * - Transform functions + * - Motor control functions + * - Statistical functions + * - Support functions + * - Interpolation functions + * + * The library has separate functions for operating on 8-bit integers, 16-bit integers, + * 32-bit integer and 32-bit floating-point values. + * + * Using the Library + * ------------ + * + * The library installer contains prebuilt versions of the libraries in the Lib folder. + * - arm_cortexM7lfdp_math.lib (Cortex-M7, Little endian, Double Precision Floating Point Unit) + * - arm_cortexM7bfdp_math.lib (Cortex-M7, Big endian, Double Precision Floating Point Unit) + * - arm_cortexM7lfsp_math.lib (Cortex-M7, Little endian, Single Precision Floating Point Unit) + * - arm_cortexM7bfsp_math.lib (Cortex-M7, Big endian and Single Precision Floating Point Unit on) + * - arm_cortexM7l_math.lib (Cortex-M7, Little endian) + * - arm_cortexM7b_math.lib (Cortex-M7, Big endian) + * - arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit) + * - arm_cortexM4bf_math.lib (Cortex-M4, Big endian, Floating Point Unit) + * - arm_cortexM4l_math.lib (Cortex-M4, Little endian) + * - arm_cortexM4b_math.lib (Cortex-M4, Big endian) + * - arm_cortexM3l_math.lib (Cortex-M3, Little endian) + * - arm_cortexM3b_math.lib (Cortex-M3, Big endian) + * - arm_cortexM0l_math.lib (Cortex-M0 / Cortex-M0+, Little endian) + * - arm_cortexM0b_math.lib (Cortex-M0 / Cortex-M0+, Big endian) + * - arm_ARMv8MBLl_math.lib (Armv8-M Baseline, Little endian) + * - arm_ARMv8MMLl_math.lib (Armv8-M Mainline, Little endian) + * - arm_ARMv8MMLlfsp_math.lib (Armv8-M Mainline, Little endian, Single Precision Floating Point Unit) + * - arm_ARMv8MMLld_math.lib (Armv8-M Mainline, Little endian, DSP instructions) + * - arm_ARMv8MMLldfsp_math.lib (Armv8-M Mainline, Little endian, DSP instructions, Single Precision Floating Point Unit) + * + * The library functions are declared in the public file arm_math.h which is placed in the Include folder. + * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single + * public header file arm_math.h for Cortex-M cores with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. + * + * + * Examples + * -------- + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Toolchain Support + * ------------ + * + * The library has been developed and tested with MDK version 5.14.0.0 + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Building the Library + * ------------ + * + * The library installer contains a project file to rebuild libraries on MDK toolchain in the CMSIS\\DSP\\Projects\\ARM folder. + * - arm_cortexM_math.uvprojx + * + * + * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional preprocessor macros detailed above. + * + * Preprocessor Macros + * ------------ + * + * Each library project have different preprocessor macros. + * + * - ARM_MATH_BIG_ENDIAN: + * + * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. + * + * - ARM_MATH_MATRIX_CHECK: + * + * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices + * + * - ARM_MATH_ROUNDING: + * + * Define macro ARM_MATH_ROUNDING for rounding on support functions + * + * - ARM_MATH_LOOPUNROLL: + * + * Define macro ARM_MATH_LOOPUNROLL to enable manual loop unrolling in DSP functions + * + * - ARM_MATH_NEON: + * + * Define macro ARM_MATH_NEON to enable Neon versions of the DSP functions. + * It is not enabled by default when Neon is available because performances are + * dependent on the compiler and target architecture. + * + * - ARM_MATH_NEON_EXPERIMENTAL: + * + * Define macro ARM_MATH_NEON_EXPERIMENTAL to enable experimental Neon versions of + * of some DSP functions. Experimental Neon versions currently do not have better + * performances than the scalar versions. + * + *
+ * CMSIS-DSP in ARM::CMSIS Pack + * ----------------------------- + * + * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: + * |File/Folder |Content | + * |---------------------------------|------------------------------------------------------------------------| + * |\b CMSIS\\Documentation\\DSP | This documentation | + * |\b CMSIS\\DSP\\DSP_Lib_TestSuite | DSP_Lib test suite | + * |\b CMSIS\\DSP\\Examples | Example projects demonstrating the usage of the library functions | + * |\b CMSIS\\DSP\\Include | DSP_Lib include files | + * |\b CMSIS\\DSP\\Lib | DSP_Lib binaries | + * |\b CMSIS\\DSP\\Projects | Projects to rebuild DSP_Lib binaries | + * |\b CMSIS\\DSP\\Source | DSP_Lib source files | + * + *
+ * Revision History of CMSIS-DSP + * ------------ + * Please refer to \ref ChangeLog_pg. + */ + + +/** + * @defgroup groupMath Basic Math Functions + */ + +/** + * @defgroup groupFastMath Fast Math Functions + * This set of functions provides a fast approximation to sine, cosine, and square root. + * As compared to most of the other functions in the CMSIS math library, the fast math functions + * operate on individual values and not arrays. + * There are separate functions for Q15, Q31, and floating-point data. + * + */ + +/** + * @defgroup groupCmplxMath Complex Math Functions + * This set of functions operates on complex data vectors. + * The data in the complex arrays is stored in an interleaved fashion + * (real, imag, real, imag, ...). + * In the API functions, the number of samples in a complex array refers + * to the number of complex values; the array contains twice this number of + * real values. + */ + +/** + * @defgroup groupFilters Filtering Functions + */ + +/** + * @defgroup groupMatrix Matrix Functions + * + * This set of functions provides basic matrix math operations. + * The functions operate on matrix data structures. For example, + * the type + * definition for the floating-point matrix structure is shown + * below: + *
+ *     typedef struct
+ *     {
+ *       uint16_t numRows;     // number of rows of the matrix.
+ *       uint16_t numCols;     // number of columns of the matrix.
+ *       float32_t *pData;     // points to the data of the matrix.
+ *     } arm_matrix_instance_f32;
+ * 
+ * There are similar definitions for Q15 and Q31 data types. + * + * The structure specifies the size of the matrix and then points to + * an array of data. The array is of size numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
+ *     pData[i*numCols + j]
+ * 
+ * + * \par Init Functions + * There is an associated initialization function for each type of matrix + * data structure. + * The initialization function sets the values of the internal structure fields. + * Refer to \ref arm_mat_init_f32(), \ref arm_mat_init_q31() and \ref arm_mat_init_q15() + * for floating-point, Q31 and Q15 types, respectively. + * + * \par + * Use of the initialization function is optional. However, if initialization function is used + * then the instance structure cannot be placed into a const data section. + * To place the instance structure in a const data + * section, manually initialize the data structure. For example: + *
+ * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
+ * 
+ * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData points to the + * data array. + * + * \par Size Checking + * By default all of the matrix functions perform size checking on the input and + * output matrices. For example, the matrix addition function verifies that the + * two input matrices and the output matrix all have the same number of rows and + * columns. If the size check fails the functions return: + *
+ *     ARM_MATH_SIZE_MISMATCH
+ * 
+ * Otherwise the functions return + *
+ *     ARM_MATH_SUCCESS
+ * 
+ * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the \#define + *
+ *     ARM_MATH_MATRIX_CHECK
+ * 
+ * within the library project settings. By default this macro is defined + * and size checking is enabled. By changing the project settings and + * undefining this macro size checking is eliminated and the functions + * run a bit faster. With size checking disabled the functions always + * return ARM_MATH_SUCCESS. + */ + +/** + * @defgroup groupTransforms Transform Functions + */ + +/** + * @defgroup groupController Controller Functions + */ + +/** + * @defgroup groupStats Statistics Functions + */ + +/** + * @defgroup groupSupport Support Functions + */ + +/** + * @defgroup groupInterpolation Interpolation Functions + * These functions perform 1- and 2-dimensional interpolation of data. + * Linear interpolation is used for 1-dimensional data and + * bilinear interpolation is used for 2-dimensional data. + */ + +/** + * @defgroup groupExamples Examples + */ + + +#ifndef _ARM_MATH_H +#define _ARM_MATH_H + +/* Compiler specific diagnostic adjustment */ +#if defined ( __CC_ARM ) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + #pragma GCC diagnostic ignored "-Wconversion" + #pragma GCC diagnostic ignored "-Wunused-parameter" + +#elif defined ( __ICCARM__ ) + +#elif defined ( __TI_ARM__ ) + +#elif defined ( __CSMC__ ) + +#elif defined ( __TASKING__ ) + +#elif defined ( _MSC_VER ) + +#else + #error Unknown compiler +#endif + + +/* Included for instrinsics definitions */ +#if !defined ( _MSC_VER ) +#include "cmsis_compiler.h" +#else +#include +#define __STATIC_FORCEINLINE static __forceinline +#define __ALIGNED(x) __declspec(align(x)) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT +#endif + +#include "string.h" +#include "math.h" +#include "float.h" + +/* evaluate ARM DSP feature */ +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + #define ARM_MATH_DSP 1 +#endif + +#if defined(__ARM_NEON) +#include +#endif + + +#ifdef __cplusplus +extern "C" +{ +#endif + + + /** + * @brief Macros required for reciprocal calculation in Normalized LMS + */ + +#define DELTA_Q31 (0x100) +#define DELTA_Q15 0x5 +#define INDEX_MASK 0x0000003F +#ifndef PI + #define PI 3.14159265358979f +#endif + + /** + * @brief Macros required for SINE and COSINE Fast math approximations + */ + +#define FAST_MATH_TABLE_SIZE 512 +#define FAST_MATH_Q31_SHIFT (32 - 10) +#define FAST_MATH_Q15_SHIFT (16 - 10) +#define CONTROLLER_Q31_SHIFT (32 - 9) +#define TABLE_SPACING_Q31 0x400000 +#define TABLE_SPACING_Q15 0x80 + + /** + * @brief Macros required for SINE and COSINE Controller functions + */ + /* 1.31(q31) Fixed value of 2/360 */ + /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ +#define INPUT_SPACING 0xB60B61 + + + /** + * @brief Error status returned by some functions in the library. + */ + + typedef enum + { + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */ + ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ + } arm_status; + + /** + * @brief 8-bit fractional data type in 1.7 format. + */ + typedef int8_t q7_t; + + /** + * @brief 16-bit fractional data type in 1.15 format. + */ + typedef int16_t q15_t; + + /** + * @brief 32-bit fractional data type in 1.31 format. + */ + typedef int32_t q31_t; + + /** + * @brief 64-bit fractional data type in 1.63 format. + */ + typedef int64_t q63_t; + + /** + * @brief 32-bit floating-point type definition. + */ + typedef float float32_t; + + /** + * @brief 64-bit floating-point type definition. + */ + typedef double float64_t; + + +/** + @brief definition to read/write two 16 bit values. + @deprecated + */ +#if defined ( __CC_ARM ) + #define __SIMD32_TYPE int32_t __packed +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define __SIMD32_TYPE int32_t +#elif defined ( __GNUC__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __ICCARM__ ) + #define __SIMD32_TYPE int32_t __packed +#elif defined ( __TI_ARM__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __CSMC__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __TASKING__ ) + #define __SIMD32_TYPE __un(aligned) int32_t +#elif defined(_MSC_VER ) + #define __SIMD32_TYPE int32_t +#else + #error Unknown compiler +#endif + +#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) +#define __SIMD32_CONST(addr) ( (__SIMD32_TYPE * ) (addr)) +#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE * ) (addr)) +#define __SIMD64(addr) (*( int64_t **) & (addr)) + +/* SIMD replacement */ + + +/** + @brief Read 2 Q15 from Q15 pointer. + @param[in] pQ15 points to input value + @return Q31 value + */ +__STATIC_FORCEINLINE q31_t read_q15x2 ( + q15_t * pQ15) +{ + q31_t val; + + memcpy (&val, pQ15, 4); + + return (val); +} + +/** + @brief Read 2 Q15 from Q15 pointer and increment pointer afterwards. + @param[in] pQ15 points to input value + @return Q31 value + */ +__STATIC_FORCEINLINE q31_t read_q15x2_ia ( + q15_t ** pQ15) +{ + q31_t val; + + memcpy (&val, *pQ15, 4); + *pQ15 += 2; + + return (val); +} + +/** + @brief Read 2 Q15 from Q15 pointer and decrement pointer afterwards. + @param[in] pQ15 points to input value + @return Q31 value + */ +__STATIC_FORCEINLINE q31_t read_q15x2_da ( + q15_t ** pQ15) +{ + q31_t val; + + memcpy (&val, *pQ15, 4); + *pQ15 -= 2; + + return (val); +} + +/** + @brief Write 2 Q15 to Q15 pointer and increment pointer afterwards. + @param[in] pQ15 points to input value + @param[in] value Q31 value + @return none + */ +__STATIC_FORCEINLINE void write_q15x2_ia ( + q15_t ** pQ15, + q31_t value) +{ + q31_t val = value; + + memcpy (*pQ15, &val, 4); + *pQ15 += 2; +} + +/** + @brief Write 2 Q15 to Q15 pointer. + @param[in] pQ15 points to input value + @param[in] value Q31 value + @return none + */ +__STATIC_FORCEINLINE void write_q15x2 ( + q15_t * pQ15, + q31_t value) +{ + q31_t val = value; + + memcpy (pQ15, &val, 4); +} + + +/** + @brief Read 4 Q7 from Q7 pointer and increment pointer afterwards. + @param[in] pQ7 points to input value + @return Q31 value + */ +__STATIC_FORCEINLINE q31_t read_q7x4_ia ( + q7_t ** pQ7) +{ + q31_t val; + + memcpy (&val, *pQ7, 4); + *pQ7 += 4; + + return (val); +} + +/** + @brief Read 4 Q7 from Q7 pointer and decrement pointer afterwards. + @param[in] pQ7 points to input value + @return Q31 value + */ +__STATIC_FORCEINLINE q31_t read_q7x4_da ( + q7_t ** pQ7) +{ + q31_t val; + + memcpy (&val, *pQ7, 4); + *pQ7 -= 4; + + return (val); +} + +/** + @brief Write 4 Q7 to Q7 pointer and increment pointer afterwards. + @param[in] pQ7 points to input value + @param[in] value Q31 value + @return none + */ +__STATIC_FORCEINLINE void write_q7x4_ia ( + q7_t ** pQ7, + q31_t value) +{ + q31_t val = value; + + memcpy (*pQ7, &val, 4); + *pQ7 += 4; +} + +/* + +Normally those kind of definitions are in a compiler file +in Core or Core_A. + +But for MSVC compiler it is a bit special. The goal is very specific +to CMSIS-DSP and only to allow the use of this library from other +systems like Python or Matlab. + +MSVC is not going to be used to cross-compile to ARM. So, having a MSVC +compiler file in Core or Core_A would not make sense. + +*/ +#if defined ( _MSC_VER ) + __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#ifndef ARM_MATH_DSP + /** + * @brief definition to pack two 16 bit values. + */ + #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ + (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) + #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ + (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) +#endif + + /** + * @brief definition to pack four 8 bit values. + */ +#ifndef ARM_MATH_BIG_ENDIAN + #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) +#else + #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) +#endif + + + /** + * @brief Clips Q63 to Q31 values. + */ + __STATIC_FORCEINLINE q31_t clip_q63_to_q31( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; + } + + /** + * @brief Clips Q63 to Q15 values. + */ + __STATIC_FORCEINLINE q15_t clip_q63_to_q15( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); + } + + /** + * @brief Clips Q31 to Q7 values. + */ + __STATIC_FORCEINLINE q7_t clip_q31_to_q7( + q31_t x) + { + return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? + ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; + } + + /** + * @brief Clips Q31 to Q15 values. + */ + __STATIC_FORCEINLINE q15_t clip_q31_to_q15( + q31_t x) + { + return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? + ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; + } + + /** + * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. + */ + __STATIC_FORCEINLINE q63_t mult32x64( + q63_t x, + q31_t y) + { + return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + + (((q63_t) (x >> 32) * y) ) ); + } + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. + */ + __STATIC_FORCEINLINE uint32_t arm_recip_q31( + q31_t in, + q31_t * dst, + const q31_t * pRecipTable) + { + q31_t out; + uint32_t tempVal; + uint32_t index, i; + uint32_t signBits; + + if (in > 0) + { + signBits = ((uint32_t) (__CLZ( in) - 1)); + } + else + { + signBits = ((uint32_t) (__CLZ(-in) - 1)); + } + + /* Convert input sample to 1.31 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 24); + index = (index & INDEX_MASK); + + /* 1.31 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0U; i < 2U; i++) + { + tempVal = (uint32_t) (((q63_t) in * out) >> 31); + tempVal = 0x7FFFFFFFu - tempVal; + /* 1.31 with exp 1 */ + /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ + out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1U); + } + + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. + */ + __STATIC_FORCEINLINE uint32_t arm_recip_q15( + q15_t in, + q15_t * dst, + const q15_t * pRecipTable) + { + q15_t out = 0; + uint32_t tempVal = 0; + uint32_t index = 0, i = 0; + uint32_t signBits = 0; + + if (in > 0) + { + signBits = ((uint32_t)(__CLZ( in) - 17)); + } + else + { + signBits = ((uint32_t)(__CLZ(-in) - 17)); + } + + /* Convert input sample to 1.15 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 8); + index = (index & INDEX_MASK); + + /* 1.15 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0U; i < 2U; i++) + { + tempVal = (uint32_t) (((q31_t) in * out) >> 15); + tempVal = 0x7FFFu - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t) (((q31_t) out * tempVal) >> 14); + /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1); + } + +#if defined(ARM_MATH_NEON) + +static inline float32x4_t __arm_vec_sqrt_f32_neon(float32x4_t x) +{ + float32x4_t x1 = vmaxq_f32(x, vdupq_n_f32(FLT_MIN)); + float32x4_t e = vrsqrteq_f32(x1); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e); + return vmulq_f32(x, e); +} + +static inline int16x8_t __arm_vec_sqrt_q15_neon(int16x8_t vec) +{ + float32x4_t tempF; + int32x4_t tempHI,tempLO; + + tempLO = vmovl_s16(vget_low_s16(vec)); + tempF = vcvtq_n_f32_s32(tempLO,15); + tempF = __arm_vec_sqrt_f32_neon(tempF); + tempLO = vcvtq_n_s32_f32(tempF,15); + + tempHI = vmovl_s16(vget_high_s16(vec)); + tempF = vcvtq_n_f32_s32(tempHI,15); + tempF = __arm_vec_sqrt_f32_neon(tempF); + tempHI = vcvtq_n_s32_f32(tempF,15); + + return(vcombine_s16(vqmovn_s32(tempLO),vqmovn_s32(tempHI))); +} + +static inline int32x4_t __arm_vec_sqrt_q31_neon(int32x4_t vec) +{ + float32x4_t temp; + + temp = vcvtq_n_f32_s32(vec,31); + temp = __arm_vec_sqrt_f32_neon(temp); + return(vcvtq_n_s32_f32(temp,31)); +} + +#endif + +/* + * @brief C custom defined intrinsic functions + */ +#if !defined (ARM_MATH_DSP) + + /* + * @brief C custom defined QADD8 + */ + __STATIC_FORCEINLINE uint32_t __QADD8( + uint32_t x, + uint32_t y) + { + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); + } + + + /* + * @brief C custom defined QSUB8 + */ + __STATIC_FORCEINLINE uint32_t __QSUB8( + uint32_t x, + uint32_t y) + { + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); + } + + + /* + * @brief C custom defined QADD16 + */ + __STATIC_FORCEINLINE uint32_t __QADD16( + uint32_t x, + uint32_t y) + { +/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ + q31_t r = 0, s = 0; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHADD16 + */ + __STATIC_FORCEINLINE uint32_t __SHADD16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QSUB16 + */ + __STATIC_FORCEINLINE uint32_t __QSUB16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHSUB16 + */ + __STATIC_FORCEINLINE uint32_t __SHSUB16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QASX + */ + __STATIC_FORCEINLINE uint32_t __QASX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHASX + */ + __STATIC_FORCEINLINE uint32_t __SHASX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QSAX + */ + __STATIC_FORCEINLINE uint32_t __QSAX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHSAX + */ + __STATIC_FORCEINLINE uint32_t __SHSAX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SMUSDX + */ + __STATIC_FORCEINLINE uint32_t __SMUSDX( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); + } + + /* + * @brief C custom defined SMUADX + */ + __STATIC_FORCEINLINE uint32_t __SMUADX( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); + } + + + /* + * @brief C custom defined QADD + */ + __STATIC_FORCEINLINE int32_t __QADD( + int32_t x, + int32_t y) + { + return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); + } + + + /* + * @brief C custom defined QSUB + */ + __STATIC_FORCEINLINE int32_t __QSUB( + int32_t x, + int32_t y) + { + return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); + } + + + /* + * @brief C custom defined SMLAD + */ + __STATIC_FORCEINLINE uint32_t __SMLAD( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLADX + */ + __STATIC_FORCEINLINE uint32_t __SMLADX( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLSDX + */ + __STATIC_FORCEINLINE uint32_t __SMLSDX( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLALD + */ + __STATIC_FORCEINLINE uint64_t __SMLALD( + uint32_t x, + uint32_t y, + uint64_t sum) + { +/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + + ( ((q63_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLALDX + */ + __STATIC_FORCEINLINE uint64_t __SMLALDX( + uint32_t x, + uint32_t y, + uint64_t sum) + { +/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q63_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMUAD + */ + __STATIC_FORCEINLINE uint32_t __SMUAD( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); + } + + + /* + * @brief C custom defined SMUSD + */ + __STATIC_FORCEINLINE uint32_t __SMUSD( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); + } + + + /* + * @brief C custom defined SXTB16 + */ + __STATIC_FORCEINLINE uint32_t __SXTB16( + uint32_t x) + { + return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | + ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); + } + + /* + * @brief C custom defined SMMLA + */ + __STATIC_FORCEINLINE int32_t __SMMLA( + int32_t x, + int32_t y, + int32_t sum) + { + return (sum + (int32_t) (((int64_t) x * y) >> 32)); + } + +#endif /* !defined (ARM_MATH_DSP) */ + + + /** + * @brief Instance structure for the Q7 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q7; + + /** + * @brief Instance structure for the Q15 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_f32; + + /** + * @brief Processing function for the Q7 FIR filter. + * @param[in] S points to an instance of the Q7 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q7( + const arm_fir_instance_q7 * S, + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q7 FIR filter. + * @param[in,out] S points to an instance of the Q7 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed. + */ + void arm_fir_init_q7( + arm_fir_instance_q7 * S, + uint16_t numTaps, + const q7_t * pCoeffs, + q7_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q15 FIR filter. + * @param[in] S points to an instance of the Q15 FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q15( + const arm_fir_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the fast Q15 FIR filter (fast version). + * @param[in] S points to an instance of the Q15 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_fast_q15( + const arm_fir_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q15 FIR filter. + * @param[in,out] S points to an instance of the Q15 FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return The function returns either + * ARM_MATH_SUCCESS if initialization was successful or + * ARM_MATH_ARGUMENT_ERROR if numTaps is not a supported value. + */ + arm_status arm_fir_init_q15( + arm_fir_instance_q15 * S, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR filter. + * @param[in] S points to an instance of the Q31 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q31( + const arm_fir_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the fast Q31 FIR filter (fast version). + * @param[in] S points to an instance of the Q31 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_fast_q31( + const arm_fir_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 FIR filter. + * @param[in,out] S points to an instance of the Q31 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_q31( + arm_fir_instance_q31 * S, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the floating-point FIR filter. + * @param[in] S points to an instance of the floating-point FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_f32( + const arm_fir_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_f32( + arm_fir_instance_f32 * S, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + /** + * @brief Instance structure for the Q15 Biquad cascade filter. + */ + typedef struct + { + int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + } arm_biquad_casd_df1_inst_q15; + + /** + * @brief Instance structure for the Q31 Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + } arm_biquad_casd_df1_inst_q31; + + /** + * @brief Instance structure for the floating-point Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_casd_df1_inst_f32; + + /** + * @brief Processing function for the Q15 Biquad cascade filter. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q15 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cascade_df1_init_q15( + arm_biquad_casd_df1_inst_q15 * S, + uint8_t numStages, + const q15_t * pCoeffs, + q15_t * pState, + int8_t postShift); + + /** + * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 Biquad cascade filter + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cascade_df1_init_q31( + arm_biquad_casd_df1_inst_q31 * S, + uint8_t numStages, + const q31_t * pCoeffs, + q31_t * pState, + int8_t postShift); + + /** + * @brief Processing function for the floating-point Biquad cascade filter. + * @param[in] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point Biquad cascade filter. + * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState); + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float32_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f32; + + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float64_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f64; + + /** + * @brief Instance structure for the Q15 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q15_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q15; + + /** + * @brief Instance structure for the Q31 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q31_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q31; + + /** + * @brief Floating-point matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pScratch); + + /** + * @brief Q31, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @brief Q31 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix scaling. + * @param[in] pSrc points to the input matrix + * @param[in] scale scale factor + * @param[out] pDst points to the output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scaleFract, + int32_t shift, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scaleFract, + int32_t shift, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Q31 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_q31( + arm_matrix_instance_q31 * S, + uint16_t nRows, + uint16_t nColumns, + q31_t * pData); + + /** + * @brief Q15 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_q15( + arm_matrix_instance_q15 * S, + uint16_t nRows, + uint16_t nColumns, + q15_t * pData); + + /** + * @brief Floating-point matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_f32( + arm_matrix_instance_f32 * S, + uint16_t nRows, + uint16_t nColumns, + float32_t * pData); + + + /** + * @brief Instance structure for the Q15 PID Control. + */ + typedef struct + { + q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ +#if !defined (ARM_MATH_DSP) + q15_t A1; + q15_t A2; +#else + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ +#endif + q15_t state[3]; /**< The state array of length 3. */ + q15_t Kp; /**< The proportional gain. */ + q15_t Ki; /**< The integral gain. */ + q15_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q15; + + /** + * @brief Instance structure for the Q31 PID Control. + */ + typedef struct + { + q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + q31_t A2; /**< The derived gain, A2 = Kd . */ + q31_t state[3]; /**< The state array of length 3. */ + q31_t Kp; /**< The proportional gain. */ + q31_t Ki; /**< The integral gain. */ + q31_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q31; + + /** + * @brief Instance structure for the floating-point PID Control. + */ + typedef struct + { + float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + float32_t A2; /**< The derived gain, A2 = Kd . */ + float32_t state[3]; /**< The state array of length 3. */ + float32_t Kp; /**< The proportional gain. */ + float32_t Ki; /**< The integral gain. */ + float32_t Kd; /**< The derivative gain. */ + } arm_pid_instance_f32; + + + + /** + * @brief Initialization function for the floating-point PID Control. + * @param[in,out] S points to an instance of the PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_f32( + arm_pid_instance_f32 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + */ + void arm_pid_reset_f32( + arm_pid_instance_f32 * S); + + + /** + * @brief Initialization function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_q31( + arm_pid_instance_q31 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q31 PID Control structure + */ + + void arm_pid_reset_q31( + arm_pid_instance_q31 * S); + + + /** + * @brief Initialization function for the Q15 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_q15( + arm_pid_instance_q15 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q15 PID Control. + * @param[in,out] S points to an instance of the q15 PID Control structure + */ + void arm_pid_reset_q15( + arm_pid_instance_q15 * S); + + + /** + * @brief Instance structure for the floating-point Linear Interpolate function. + */ + typedef struct + { + uint32_t nValues; /**< nValues */ + float32_t x1; /**< x1 */ + float32_t xSpacing; /**< xSpacing */ + float32_t *pYData; /**< pointer to the table of Y values */ + } arm_linear_interp_instance_f32; + + /** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + float32_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_f32; + + /** + * @brief Instance structure for the Q31 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q31_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q31; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q15_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q15; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q7_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q7; + + + /** + * @brief Q7 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix2_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q15( + arm_cfft_radix2_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 * S, + q15_t * pSrc); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q15_t *pTwiddle; /**< points to the twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix2_instance_q31; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q31( + arm_cfft_radix2_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 * S, + q31_t * pSrc); + + /** + * @brief Instance structure for the Q31 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q31_t *pTwiddle; /**< points to the twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q31; + +/* Deprecated */ + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix2_instance_f32; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_f32( + arm_cfft_radix2_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_f32( + const arm_cfft_radix2_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix4_instance_f32; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_q15; + +void arm_cfft_q15( + const arm_cfft_instance_q15 * S, + q15_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_q31; + +void arm_cfft_q31( + const arm_cfft_instance_q31 * S, + q31_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_f32; + + void arm_cfft_f32( + const arm_cfft_instance_f32 * S, + float32_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the Q15 RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q15; + + arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + + /** + * @brief Instance structure for the Q31 RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q31; + + arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint16_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_f32; + + arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 * S, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ +typedef struct + { + arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + const float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ + } arm_rfft_fast_instance_f32 ; + +arm_status arm_rfft_fast_init_f32 ( + arm_rfft_fast_instance_f32 * S, + uint16_t fftLen); + +arm_status arm_rfft_32_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_64_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_128_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_256_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_512_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_1024_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_2048_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_4096_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + + + void arm_rfft_fast_f32( + arm_rfft_fast_instance_f32 * S, + float32_t * p, float32_t * pOut, + uint8_t ifftFlag); + + /** + * @brief Instance structure for the floating-point DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + float32_t normalize; /**< normalizing factor. */ + const float32_t *pTwiddle; /**< points to the twiddle factor table. */ + const float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_f32; + + + /** + * @brief Initialization function for the floating-point DCT4/IDCT4. + * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. + */ + arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 * S, + arm_rfft_instance_f32 * S_RFFT, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint16_t N, + uint16_t Nby2, + float32_t normalize); + + + /** + * @brief Processing function for the floating-point DCT4/IDCT4. + * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer); + + + /** + * @brief Instance structure for the Q31 DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q31_t normalize; /**< normalizing factor. */ + const q31_t *pTwiddle; /**< points to the twiddle factor table. */ + const q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q31; + + + /** + * @brief Initialization function for the Q31 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure + * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 * S, + arm_rfft_instance_q31 * S_RFFT, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q31_t normalize); + + + /** + * @brief Processing function for the Q31 DCT4/IDCT4. + * @param[in] S points to an instance of the Q31 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer); + + + /** + * @brief Instance structure for the Q15 DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q15_t normalize; /**< normalizing factor. */ + const q15_t *pTwiddle; /**< points to the twiddle factor table. */ + const q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q15; + + + /** + * @brief Initialization function for the Q15 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 * S, + arm_rfft_instance_q15 * S_RFFT, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q15_t normalize); + + + /** + * @brief Processing function for the Q15 DCT4/IDCT4. + * @param[in] S points to an instance of the Q15 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer); + + + /** + * @brief Floating-point vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_f32( + const float32_t * pSrc, + float32_t scale, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q7 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q7( + const q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q15 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q15( + const q15_t * pSrc, + q15_t scaleFract, + int8_t shift, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q31 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q31( + const q31_t * pSrc, + q31_t scaleFract, + int8_t shift, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Dot product of floating-point vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + uint32_t blockSize, + float32_t * result); + + + /** + * @brief Dot product of Q7 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + uint32_t blockSize, + q31_t * result); + + + /** + * @brief Dot product of Q15 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + + /** + * @brief Dot product of Q31 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + + /** + * @brief Shifts the elements of a Q7 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q7( + const q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Shifts the elements of a Q15 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q15( + const q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Shifts the elements of a Q31 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q31( + const q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_f32( + const float32_t * pSrc, + float32_t offset, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q7( + const q7_t * pSrc, + q7_t offset, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q15( + const q15_t * pSrc, + q15_t offset, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q31( + const q31_t * pSrc, + q31_t offset, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a floating-point vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q7 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q7 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q7( + q7_t value, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q15 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q15( + q15_t value, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q31 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q31( + q31_t value, + q31_t * pDst, + uint32_t blockSize); + + +/** + * @brief Convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ + void arm_conv_f32( + const float32_t * pSrcA, + uint32_t srcALen, + const float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + + /** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ + void arm_conv_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + +/** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ + void arm_conv_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_fast_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ + void arm_conv_fast_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_fast_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ + void arm_conv_opt_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + + /** + * @brief Partial convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_f32( + const float32_t * pSrcA, + uint32_t srcALen, + const float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Partial convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q7 sequences + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_opt_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + +/** + * @brief Partial convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Instance structure for the Q15 FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q31; + +/** + @brief Instance structure for floating-point FIR decimator. + */ +typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_f32; + + +/** + @brief Processing function for floating-point FIR decimator. + @param[in] S points to an instance of the floating-point FIR decimator structure + @param[in] pSrc points to the block of input data + @param[out] pDst points to the block of output data + @param[in] blockSize number of samples to process + */ +void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + +/** + @brief Initialization function for the floating-point FIR decimator. + @param[in,out] S points to an instance of the floating-point FIR decimator structure + @param[in] numTaps number of coefficients in the filter + @param[in] M decimation factor + @param[in] pCoeffs points to the filter coefficients + @param[in] pState points to the state buffer + @param[in] blockSize number of input samples to process per call + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M + */ +arm_status arm_fir_decimate_init_f32( + arm_fir_decimate_instance_f32 * S, + uint16_t numTaps, + uint8_t M, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR decimator. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR decimator. + * @param[in,out] S points to an instance of the Q15 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q15( + arm_fir_decimate_instance_q15 * S, + uint16_t numTaps, + uint8_t M, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR decimator. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_fast_q31( + const arm_fir_decimate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR decimator. + * @param[in,out] S points to an instance of the Q31 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 * S, + uint16_t numTaps, + uint8_t M, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ + } arm_fir_interpolate_instance_f32; + + + /** + * @brief Processing function for the Q15 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR interpolator. + * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q15( + arm_fir_interpolate_instance_q15 * S, + uint8_t L, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR interpolator. + * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q31( + arm_fir_interpolate_instance_q31 * S, + uint8_t L, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point FIR interpolator. + * @param[in] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR interpolator. + * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 * S, + uint8_t L, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the high precision Q31 Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + const q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ + } arm_biquad_cas_df1_32x64_ins_q31; + + + /** + * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 * S, + uint8_t numStages, + const q31_t * pCoeffs, + q63_t * pState, + uint8_t postShift); + + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f32; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_stereo_df2T_instance_f32; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f64; + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_stereo_df2T_f32( + const arm_biquad_cascade_stereo_df2T_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 * S, + float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + +#if defined(ARM_MATH_NEON) +void arm_biquad_cascade_df2T_compute_coefs_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + float32_t * pCoeffs); +#endif + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_stereo_df2T_init_f32( + arm_biquad_cascade_stereo_df2T_instance_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f64( + arm_biquad_cascade_df2T_instance_f64 * S, + uint8_t numStages, + float64_t * pCoeffs, + float64_t * pState); + + + /** + * @brief Instance structure for the Q15 FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_f32; + + + /** + * @brief Initialization function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_q15( + arm_fir_lattice_instance_q15 * S, + uint16_t numStages, + const q15_t * pCoeffs, + q15_t * pState); + + + /** + * @brief Processing function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_q31( + arm_fir_lattice_instance_q31 * S, + uint16_t numStages, + const q31_t * pCoeffs, + q31_t * pState); + + + /** + * @brief Processing function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_f32( + arm_fir_lattice_instance_f32 * S, + uint16_t numStages, + const float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Processing function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_f32; + + + /** + * @brief Processing function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_init_f32( + arm_iir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pkCoeffs, + float32_t * pvCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_init_q31( + arm_iir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pkCoeffs, + q31_t * pvCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the Q15 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process per call. + */ + void arm_iir_lattice_init_q15( + arm_iir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pkCoeffs, + q15_t * pvCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the floating-point LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that controls filter coefficient updates. */ + } arm_lms_instance_f32; + + + /** + * @brief Processing function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_f32( + const arm_lms_instance_f32 * S, + const float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_init_f32( + arm_lms_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q15; + + + /** + * @brief Initialization function for the Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_init_q15( + arm_lms_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint32_t postShift); + + + /** + * @brief Processing function for Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_q15( + const arm_lms_instance_q15 * S, + const q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q31; + + + /** + * @brief Processing function for Q31 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_q31( + const arm_lms_instance_q31 * S, + const q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q31 LMS filter. + * @param[in] S points to an instance of the Q31 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_init_q31( + arm_lms_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint32_t postShift); + + + /** + * @brief Instance structure for the floating-point normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that control filter coefficient updates. */ + float32_t energy; /**< saves previous frame energy. */ + float32_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_f32; + + + /** + * @brief Processing function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + const float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_init_f32( + arm_lms_norm_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + const q31_t *recipTable; /**< points to the reciprocal initial value table. */ + q31_t energy; /**< saves previous frame energy. */ + q31_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q31; + + + /** + * @brief Processing function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + const q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_norm_init_q31( + arm_lms_norm_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint8_t postShift); + + + /** + * @brief Instance structure for the Q15 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< Number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + const q15_t *recipTable; /**< Points to the reciprocal initial value table. */ + q15_t energy; /**< saves previous frame energy. */ + q15_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q15; + + + /** + * @brief Processing function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + const q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_norm_init_q15( + arm_lms_norm_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint8_t postShift); + + + /** + * @brief Correlation of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_f32( + const float32_t * pSrcA, + uint32_t srcALen, + const float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + +/** + @brief Correlation of Q15 sequences + @param[in] pSrcA points to the first input sequence + @param[in] srcALen length of the first input sequence + @param[in] pSrcB points to the second input sequence + @param[in] srcBLen length of the second input sequence + @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. +*/ +void arm_correlate_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + + +/** + @brief Correlation of Q15 sequences. + @param[in] pSrcA points to the first input sequence + @param[in] srcALen length of the first input sequence + @param[in] pSrcB points to the second input sequence + @param[in] srcBLen length of the second input sequence + @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + +/** + @brief Correlation of Q15 sequences (fast version). + @param[in] pSrcA points to the first input sequence + @param[in] srcALen length of the first input sequence + @param[in] pSrcB points to the second input sequence + @param[in] srcBLen length of the second input sequence + @param[out] pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. + @return none + */ +void arm_correlate_fast_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + +/** + @brief Correlation of Q15 sequences (fast version). + @param[in] pSrcA points to the first input sequence. + @param[in] srcALen length of the first input sequence. + @param[in] pSrcB points to the second input sequence. + @param[in] srcBLen length of the second input sequence. + @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + */ +void arm_correlate_fast_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + + + /** + * @brief Correlation of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + +/** + @brief Correlation of Q31 sequences (fast version). + @param[in] pSrcA points to the first input sequence + @param[in] srcALen length of the first input sequence + @param[in] pSrcB points to the second input sequence + @param[in] srcBLen length of the second input sequence + @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ +void arm_correlate_fast_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ + void arm_correlate_opt_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + + /** + * @brief Instance structure for the floating-point sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_f32; + + /** + * @brief Instance structure for the Q31 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q31; + + /** + * @brief Instance structure for the Q15 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q15; + + /** + * @brief Instance structure for the Q7 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q7; + + + /** + * @brief Processing function for the floating-point sparse FIR filter. + * @param[in] S points to an instance of the floating-point sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point sparse FIR filter. + * @param[in,out] S points to an instance of the floating-point sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_f32( + arm_fir_sparse_instance_f32 * S, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 sparse FIR filter. + * @param[in] S points to an instance of the Q31 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 sparse FIR filter. + * @param[in,out] S points to an instance of the Q31 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q31( + arm_fir_sparse_instance_q31 * S, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 sparse FIR filter. + * @param[in] S points to an instance of the Q15 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 sparse FIR filter. + * @param[in,out] S points to an instance of the Q15 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q15( + arm_fir_sparse_instance_q15 * S, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q7 sparse FIR filter. + * @param[in] S points to an instance of the Q7 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + const q7_t * pSrc, + q7_t * pDst, + q7_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q7 sparse FIR filter. + * @param[in,out] S points to an instance of the Q7 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q7( + arm_fir_sparse_instance_q7 * S, + uint16_t numTaps, + const q7_t * pCoeffs, + q7_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Floating-point sin_cos function. + * @param[in] theta input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cos output. + */ + void arm_sin_cos_f32( + float32_t theta, + float32_t * pSinVal, + float32_t * pCosVal); + + + /** + * @brief Q31 sin_cos function. + * @param[in] theta scaled input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cosine output. + */ + void arm_sin_cos_q31( + q31_t theta, + q31_t * pSinVal, + q31_t * pCosVal); + + + /** + * @brief Floating-point complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup PID PID Motor Control + * + * A Proportional Integral Derivative (PID) controller is a generic feedback control + * loop mechanism widely used in industrial control systems. + * A PID controller is the most commonly used type of feedback controller. + * + * This set of functions implements (PID) controllers + * for Q15, Q31, and floating-point data types. The functions operate on a single sample + * of data and each call to the function returns a single processed value. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
+   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
+   *    A0 = Kp + Ki + Kd
+   *    A1 = (-Kp ) - (2 * Kd )
+   *    A2 = Kd
+   * 
+ * + * \par + * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant + * + * \par + * \image html PID.gif "Proportional Integral Derivative Controller" + * + * \par + * The PID controller calculates an "error" value as the difference between + * the measured output and the reference input. + * The controller attempts to minimize the error by adjusting the process control inputs. + * The proportional value determines the reaction to the current error, + * the integral value determines the reaction based on the sum of recent errors, + * and the derivative value determines the reaction based on the rate at which the error has been changing. + * + * \par Instance Structure + * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. + * A separate instance structure must be defined for each PID Controller. + * There are separate instance structure declarations for each of the 3 supported data types. + * + * \par Reset Functions + * There is also an associated reset function for each data type which clears the state array. + * + * \par Initialization Functions + * There is also an associated initialization function for each data type. + * The initialization function performs the following operations: + * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. + * - Zeros out the values in the state buffer. + * + * \par + * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. + * + * \par Fixed-Point Behavior + * Care must be taken when using the fixed-point versions of the PID Controller functions. + * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup PID + * @{ + */ + + /** + * @brief Process function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + * @param[in] in input sample to process + * @return processed output sample. + */ + __STATIC_FORCEINLINE float32_t arm_pid_f32( + arm_pid_instance_f32 * S, + float32_t in) + { + float32_t out; + + /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ + out = (S->A0 * in) + + (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + +/** + @brief Process function for the Q31 PID Control. + @param[in,out] S points to an instance of the Q31 PID Control structure + @param[in] in input sample to process + @return processed output sample. + + \par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. + Thus, if the accumulator result overflows it wraps around rather than clip. + In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. + After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + */ +__STATIC_FORCEINLINE q31_t arm_pid_q31( + arm_pid_instance_q31 * S, + q31_t in) + { + q63_t acc; + q31_t out; + + /* acc = A0 * x[n] */ + acc = (q63_t) S->A0 * in; + + /* acc += A1 * x[n-1] */ + acc += (q63_t) S->A1 * S->state[0]; + + /* acc += A2 * x[n-2] */ + acc += (q63_t) S->A2 * S->state[1]; + + /* convert output to 1.31 format to add y[n-1] */ + out = (q31_t) (acc >> 31U); + + /* out += y[n-1] */ + out += S->state[2]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + } + + +/** + @brief Process function for the Q15 PID Control. + @param[in,out] S points to an instance of the Q15 PID Control structure + @param[in] in input sample to process + @return processed output sample. + + \par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. + The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. + There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. + Lastly, the accumulator is saturated to yield a result in 1.15 format. + */ +__STATIC_FORCEINLINE q15_t arm_pid_q15( + arm_pid_instance_q15 * S, + q15_t in) + { + q63_t acc; + q15_t out; + +#if defined (ARM_MATH_DSP) + /* Implementation of PID controller */ + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)read_q15x2 (S->state), (uint64_t)acc); +#else + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0) * in; + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc += (q31_t) S->A1 * S->state[0]; + acc += (q31_t) S->A2 * S->state[1]; +#endif + + /* acc += y[n-1] */ + acc += (q31_t) S->state[2] << 15; + + /* saturate the output */ + out = (q15_t) (__SSAT((acc >> 15), 16)); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + } + + /** + * @} end of PID group + */ + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * src, + arm_matrix_instance_f32 * dst); + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f64( + const arm_matrix_instance_f64 * src, + arm_matrix_instance_f64 * dst); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup clarke Vector Clarke Transform + * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. + * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeFormula.gif + * where Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup clarke + * @{ + */ + + /** + * + * @brief Floating-point Clarke transform + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @return none + */ + __STATIC_FORCEINLINE void arm_clarke_f32( + float32_t Ia, + float32_t Ib, + float32_t * pIalpha, + float32_t * pIbeta) + { + /* Calculate pIalpha using the equation, pIalpha = Ia */ + *pIalpha = Ia; + + /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ + *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); + } + + +/** + @brief Clarke transform for Q31 version + @param[in] Ia input three-phase coordinate a + @param[in] Ib input three-phase coordinate b + @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + @param[out] pIbeta points to output two-phase orthogonal vector axis beta + @return none + + \par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + There is saturation on the addition, hence there is no risk of overflow. + */ +__STATIC_FORCEINLINE void arm_clarke_q31( + q31_t Ia, + q31_t Ib, + q31_t * pIalpha, + q31_t * pIbeta) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIalpha from Ia by equation pIalpha = Ia */ + *pIalpha = Ia; + + /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); + + /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ + product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); + + /* pIbeta is calculated by adding the intermediate products */ + *pIbeta = __QADD(product1, product2); + } + + /** + * @} end of clarke group + */ + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_clarke Vector Inverse Clarke Transform + * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeInvFormula.gif + * where pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_clarke + * @{ + */ + + /** + * @brief Floating-point Inverse Clarke transform + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] pIa points to output three-phase coordinate a + * @param[out] pIb points to output three-phase coordinate b + * @return none + */ + __STATIC_FORCEINLINE void arm_inv_clarke_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pIa, + float32_t * pIb) + { + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ + *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; + } + + +/** + @brief Inverse Clarke transform for Q31 version + @param[in] Ialpha input two-phase orthogonal vector axis alpha + @param[in] Ibeta input two-phase orthogonal vector axis beta + @param[out] pIa points to output three-phase coordinate a + @param[out] pIb points to output three-phase coordinate b + @return none + + \par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + There is saturation on the subtraction, hence there is no risk of overflow. + */ +__STATIC_FORCEINLINE void arm_inv_clarke_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pIa, + q31_t * pIb) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); + + /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); + + /* pIb is calculated by subtracting the products */ + *pIb = __QSUB(product2, product1); + } + + /** + * @} end of inv_clarke group + */ + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup park Vector Park Transform + * + * Forward Park transform converts the input two-coordinate vector to flux and torque components. + * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents + * from the stationary to the moving reference frame and control the spatial relationship between + * the stator vector current and rotor flux vector. + * If we consider the d axis aligned with the rotor flux, the diagram below shows the + * current vector and the relationship from the two reference frames: + * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkFormula.gif + * where Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup park + * @{ + */ + + /** + * @brief Floating-point Park transform + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] pId points to output rotor reference frame d + * @param[out] pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none + * + * The function implements the forward Park transform. + * + */ + __STATIC_FORCEINLINE void arm_park_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pId, + float32_t * pIq, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ + *pId = Ialpha * cosVal + Ibeta * sinVal; + + /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ + *pIq = -Ialpha * sinVal + Ibeta * cosVal; + } + + +/** + @brief Park transform for Q31 version + @param[in] Ialpha input two-phase vector coordinate alpha + @param[in] Ibeta input two-phase vector coordinate beta + @param[out] pId points to output rotor reference frame d + @param[out] pIq points to output rotor reference frame q + @param[in] sinVal sine value of rotation angle theta + @param[in] cosVal cosine value of rotation angle theta + @return none + + \par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + There is saturation on the addition and subtraction, hence there is no risk of overflow. + */ +__STATIC_FORCEINLINE void arm_park_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pId, + q31_t * pIq, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Ialpha * cosVal) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * sinVal) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Ialpha * sinVal) */ + product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * cosVal) */ + product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); + + /* Calculate pId by adding the two intermediate products 1 and 2 */ + *pId = __QADD(product1, product2); + + /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ + *pIq = __QSUB(product4, product3); + } + + /** + * @} end of park group + */ + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_park Vector Inverse Park transform + * Inverse Park transform converts the input flux and torque components to two-coordinate vector. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkInvFormula.gif + * where pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_park + * @{ + */ + + /** + * @brief Floating-point Inverse Park transform + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none + */ + __STATIC_FORCEINLINE void arm_inv_park_f32( + float32_t Id, + float32_t Iq, + float32_t * pIalpha, + float32_t * pIbeta, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ + *pIalpha = Id * cosVal - Iq * sinVal; + + /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ + *pIbeta = Id * sinVal + Iq * cosVal; + } + + +/** + @brief Inverse Park transform for Q31 version + @param[in] Id input coordinate of rotor reference frame d + @param[in] Iq input coordinate of rotor reference frame q + @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + @param[out] pIbeta points to output two-phase orthogonal vector axis beta + @param[in] sinVal sine value of rotation angle theta + @param[in] cosVal cosine value of rotation angle theta + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + There is saturation on the addition, hence there is no risk of overflow. + */ +__STATIC_FORCEINLINE void arm_inv_park_q31( + q31_t Id, + q31_t Iq, + q31_t * pIalpha, + q31_t * pIbeta, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Id * cosVal) */ + product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Iq * sinVal) */ + product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Id * sinVal) */ + product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Iq * cosVal) */ + product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); + + /* Calculate pIalpha by using the two intermediate products 1 and 2 */ + *pIalpha = __QSUB(product1, product2); + + /* Calculate pIbeta by using the two intermediate products 3 and 4 */ + *pIbeta = __QADD(product4, product3); + } + + /** + * @} end of Inverse park group + */ + + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup LinearInterpolate Linear Interpolation + * + * Linear interpolation is a method of curve fitting using linear polynomials. + * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line + * + * \par + * \image html LinearInterp.gif "Linear interpolation" + * + * \par + * A Linear Interpolate function calculates an output value(y), for the input(x) + * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) + * + * \par Algorithm: + *
+   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
+   *       where x0, x1 are nearest values of input x
+   *             y0, y1 are nearest values to output y
+   * 
+ * + * \par + * This set of functions implements Linear interpolation process + * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single + * sample of data and each call to the function returns a single processed value. + * S points to an instance of the Linear Interpolate function data structure. + * x is the input sample value. The functions returns the output value. + * + * \par + * if x is outside of the table boundary, Linear interpolation returns first value of the table + * if x is below input range and returns last value of table if x is above range. + */ + + /** + * @addtogroup LinearInterpolate + * @{ + */ + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + __STATIC_FORCEINLINE float32_t arm_linear_interp_f32( + arm_linear_interp_instance_f32 * S, + float32_t x) + { + float32_t y; + float32_t x0, x1; /* Nearest input values */ + float32_t y0, y1; /* Nearest output values */ + float32_t xSpacing = S->xSpacing; /* spacing between input values */ + int32_t i; /* Index variable */ + float32_t *pYData = S->pYData; /* pointer to output table */ + + /* Calculation of index */ + i = (int32_t) ((x - S->x1) / xSpacing); + + if (i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if ((uint32_t)i >= S->nValues) + { + /* Iniatilize output for above specified range as last output value of table */ + y = pYData[S->nValues - 1]; + } + else + { + /* Calculation of nearest input values */ + x0 = S->x1 + i * xSpacing; + x1 = S->x1 + (i + 1) * xSpacing; + + /* Read of nearest output values */ + y0 = pYData[i]; + y1 = pYData[i + 1]; + + /* Calculation of output */ + y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); + + } + + /* returns output value */ + return (y); + } + + + /** + * + * @brief Process function for the Q31 Linear Interpolation Function. + * @param[in] pYData pointer to Q31 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + __STATIC_FORCEINLINE q31_t arm_linear_interp_q31( + q31_t * pYData, + q31_t x, + uint32_t nValues) + { + q31_t y; /* output */ + q31_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & (q31_t)0xFFF00000) >> 20); + + if (index >= (int32_t)(nValues - 1)) + { + return (pYData[nValues - 1]); + } + else if (index < 0) + { + return (pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* shift left by 11 to keep fract in 1.31 format */ + fract = (x & 0x000FFFFF) << 11; + + /* Read two nearest output values from the index in 1.31(q31) format */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract) and y is in 2.30 format */ + y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); + + /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ + y += ((q31_t) (((q63_t) y1 * fract) >> 32)); + + /* Convert y to 1.31 format */ + return (y << 1U); + } + } + + + /** + * + * @brief Process function for the Q15 Linear Interpolation Function. + * @param[in] pYData pointer to Q15 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + __STATIC_FORCEINLINE q15_t arm_linear_interp_q15( + q15_t * pYData, + q31_t x, + uint32_t nValues) + { + q63_t y; /* output */ + q15_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & (int32_t)0xFFF00000) >> 20); + + if (index >= (int32_t)(nValues - 1)) + { + return (pYData[nValues - 1]); + } + else if (index < 0) + { + return (pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract) and y is in 13.35 format */ + y = ((q63_t) y0 * (0xFFFFF - fract)); + + /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ + y += ((q63_t) y1 * (fract)); + + /* convert y to 1.15 format */ + return (q15_t) (y >> 20); + } + } + + + /** + * + * @brief Process function for the Q7 Linear Interpolation Function. + * @param[in] pYData pointer to Q7 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + */ + __STATIC_FORCEINLINE q7_t arm_linear_interp_q7( + q7_t * pYData, + q31_t x, + uint32_t nValues) + { + q31_t y; /* output */ + q7_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + uint32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + if (x < 0) + { + return (pYData[0]); + } + index = (x >> 20) & 0xfff; + + if (index >= (nValues - 1)) + { + return (pYData[nValues - 1]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index and are in 1.7(q7) format */ + y0 = pYData[index]; + y1 = pYData[index + 1]; + + /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ + y = ((y0 * (0xFFFFF - fract))); + + /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ + y += (y1 * fract); + + /* convert y to 1.7(q7) format */ + return (q7_t) (y >> 20); + } + } + + /** + * @} end of LinearInterpolate group + */ + + /** + * @brief Fast approximation to the trigonometric sine function for floating-point data. + * @param[in] x input value in radians. + * @return sin(x). + */ + float32_t arm_sin_f32( + float32_t x); + + + /** + * @brief Fast approximation to the trigonometric sine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + q31_t arm_sin_q31( + q31_t x); + + + /** + * @brief Fast approximation to the trigonometric sine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + q15_t arm_sin_q15( + q15_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for floating-point data. + * @param[in] x input value in radians. + * @return cos(x). + */ + float32_t arm_cos_f32( + float32_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + q31_t arm_cos_q31( + q31_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + q15_t arm_cos_q15( + q15_t x); + + + /** + * @ingroup groupFastMath + */ + + + /** + * @defgroup SQRT Square Root + * + * Computes the square root of a number. + * There are separate functions for Q15, Q31, and floating-point data types. + * The square root function is computed using the Newton-Raphson algorithm. + * This is an iterative algorithm of the form: + *
+   *      x1 = x0 - f(x0)/f'(x0)
+   * 
+ * where x1 is the current estimate, + * x0 is the previous estimate, and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
+   *     x0 = in/2                         [initial guess]
+   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
+   * 
+ */ + + + /** + * @addtogroup SQRT + * @{ + */ + +/** + @brief Floating-point square root function. + @param[in] in input value + @param[out] pOut square root of input value + @return execution status + - \ref ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +__STATIC_FORCEINLINE arm_status arm_sqrt_f32( + float32_t in, + float32_t * pOut) + { + if (in >= 0.0f) + { +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + *pOut = __sqrtf(in); + #else + *pOut = sqrtf(in); + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); + #else + *pOut = sqrtf(in); + #endif + +#else + *pOut = sqrtf(in); +#endif + + return (ARM_MATH_SUCCESS); + } + else + { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); + } + } + + +/** + @brief Q31 square root function. + @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF + @param[out] pOut points to square root of input value + @return execution status + - \ref ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +arm_status arm_sqrt_q31( + q31_t in, + q31_t * pOut); + + +/** + @brief Q15 square root function. + @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF + @param[out] pOut points to square root of input value + @return execution status + - \ref ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +arm_status arm_sqrt_q15( + q15_t in, + q15_t * pOut); + + /** + * @brief Vector Floating-point square root function. + * @param[in] pIn input vector. + * @param[out] pOut vector of square roots of input elements. + * @param[in] len length of input vector. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + void arm_vsqrt_f32( + float32_t * pIn, + float32_t * pOut, + uint16_t len); + + void arm_vsqrt_q31( + q31_t * pIn, + q31_t * pOut, + uint16_t len); + + void arm_vsqrt_q15( + q15_t * pIn, + q15_t * pOut, + uint16_t len); + + /** + * @} end of SQRT group + */ + + + /** + * @brief floating-point Circular write function. + */ + __STATIC_FORCEINLINE void arm_circularWrite_f32( + int32_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const int32_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + + /** + * @brief floating-point Circular Read function. + */ + __STATIC_FORCEINLINE void arm_circularRead_f32( + int32_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + int32_t * dst, + int32_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t rOffset; + int32_t* dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + dst_end = dst_base + dst_length; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q15 Circular write function. + */ + __STATIC_FORCEINLINE void arm_circularWrite_q15( + q15_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q15_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + /** + * @brief Q15 Circular Read function. + */ + __STATIC_FORCEINLINE void arm_circularRead_q15( + q15_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q15_t * dst, + q15_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset; + q15_t* dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = dst_base + dst_length; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == dst_end) + { + dst = dst_base; + } + + /* Circularly update wOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q7 Circular write function. + */ + __STATIC_FORCEINLINE void arm_circularWrite_q7( + q7_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q7_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + /** + * @brief Q7 Circular Read function. + */ + __STATIC_FORCEINLINE void arm_circularRead_q7( + q7_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q7_t * dst, + q7_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset; + q7_t* dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = dst_base + dst_length; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Sum of the squares of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q31( + const q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q15( + const q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q7( + const q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Mean value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + + + /** + * @brief Mean value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Mean value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Mean value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Variance of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Variance of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Variance of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Standard deviation of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Standard deviation of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Floating-point complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult); + + + /** + * @brief Q31 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult); + + + /** + * @brief Floating-point complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + uint32_t numSamples, + float32_t * realResult, + float32_t * imagResult); + + + /** + * @brief Q15 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_q15( + const q15_t * pSrcCmplx, + const q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_q31( + const q31_t * pSrcCmplx, + const q31_t * pSrcReal, + q31_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_f32( + const float32_t * pSrcCmplx, + const float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Minimum value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] result is output pointer + * @param[in] index is the array index of the minimum value in the input buffer. + */ + void arm_min_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * result, + uint32_t * index); + + + /** + * @brief Minimum value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[in] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Minimum value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Minimum value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q7 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q15 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a Q31 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + + /** + * @brief Q15 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q31 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q31( + const float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the floating-point vector to Q15 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q15 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q15( + const float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the floating-point vector to Q7 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q7 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q7( + const float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_float( + const q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q15 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_q15( + const q31_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_q7( + const q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_float( + const q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q31 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_q31( + const q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_q7( + const q15_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q7 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q7_to_float( + const q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q7 vector to Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_q7_to_q31( + const q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q7 vector to Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_q7_to_q15( + const q7_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup BilinearInterpolate Bilinear Interpolation + * + * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. + * The underlying function f(x, y) is sampled on a regular grid and the interpolation process + * determines values between the grid points. + * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. + * Bilinear interpolation is often used in image processing to rescale images. + * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. + * + * Algorithm + * \par + * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. + * For floating-point, the instance structure is defined as: + *
+   *   typedef struct
+   *   {
+   *     uint16_t numRows;
+   *     uint16_t numCols;
+   *     float32_t *pData;
+   * } arm_bilinear_interp_instance_f32;
+   * 
+ * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
+   *     XF = floor(x)
+   *     YF = floor(y)
+   * 
+ * \par + * The interpolated output point is computed as: + *
+   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
+   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
+   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
+   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
+   * 
+ * Note that the coordinates (x, y) contain integer and fractional components. + * The integer components specify which portion of the table to use while the + * fractional components control the interpolation processor. + * + * \par + * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. + */ + + + /** + * @addtogroup BilinearInterpolate + * @{ + */ + + /** + * @brief Floating-point bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + __STATIC_FORCEINLINE float32_t arm_bilinear_interp_f32( + const arm_bilinear_interp_instance_f32 * S, + float32_t X, + float32_t Y) + { + float32_t out; + float32_t f00, f01, f10, f11; + float32_t *pData = S->pData; + int32_t xIndex, yIndex, index; + float32_t xdiff, ydiff; + float32_t b1, b2, b3, b4; + + xIndex = (int32_t) X; + yIndex = (int32_t) Y; + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1)) + { + return (0); + } + + /* Calculation of index for two nearest points in X-direction */ + index = (xIndex - 1) + (yIndex - 1) * S->numCols; + + + /* Read two nearest points in X-direction */ + f00 = pData[index]; + f01 = pData[index + 1]; + + /* Calculation of index for two nearest points in Y-direction */ + index = (xIndex - 1) + (yIndex) * S->numCols; + + + /* Read two nearest points in Y-direction */ + f10 = pData[index]; + f11 = pData[index + 1]; + + /* Calculation of intermediate values */ + b1 = f00; + b2 = f01 - f00; + b3 = f10 - f00; + b4 = f00 - f01 - f10 + f11; + + /* Calculation of fractional part in X */ + xdiff = X - xIndex; + + /* Calculation of fractional part in Y */ + ydiff = Y - yIndex; + + /* Calculation of bi-linear interpolated output */ + out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; + + /* return to application */ + return (out); + } + + + /** + * @brief Q31 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + __STATIC_FORCEINLINE q31_t arm_bilinear_interp_q31( + arm_bilinear_interp_instance_q31 * S, + q31_t X, + q31_t Y) + { + q31_t out; /* Temporary output */ + q31_t acc = 0; /* output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q31_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q31_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* shift left xfract by 11 to keep 1.31 format */ + xfract = (X & 0x000FFFFF) << 11U; + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; + x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; + + /* 20 bits for the fractional part */ + /* shift left yfract by 11 to keep 1.31 format */ + yfract = (Y & 0x000FFFFF) << 11U; + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; + y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ + out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); + acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); + + /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); + + /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* Convert acc to 1.31(q31) format */ + return ((q31_t)(acc << 2)); + } + + + /** + * @brief Q15 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + __STATIC_FORCEINLINE q15_t arm_bilinear_interp_q15( + arm_bilinear_interp_instance_q15 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q15_t x1, x2, y1, y2; /* Nearest output values */ + q31_t xfract, yfract; /* X, Y fractional parts */ + int32_t rI, cI; /* Row and column indices */ + q15_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & 0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; + x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; + y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ + + /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ + /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ + out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4U); + acc = ((q63_t) out * (0xFFFFF - yfract)); + + /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4U); + acc += ((q63_t) out * (xfract)); + + /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4U); + acc += ((q63_t) out * (yfract)); + + /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y2 * (xfract)) >> 4U); + acc += ((q63_t) out * (yfract)); + + /* acc is in 13.51 format and down shift acc by 36 times */ + /* Convert out to 1.15 format */ + return ((q15_t)(acc >> 36)); + } + + + /** + * @brief Q7 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + __STATIC_FORCEINLINE q7_t arm_bilinear_interp_q7( + arm_bilinear_interp_instance_q7 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q7_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q7_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & (q31_t)0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & (q31_t)0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) + { + return (0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & (q31_t)0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; + x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & (q31_t)0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; + y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ + out = ((x1 * (0xFFFFF - xfract))); + acc = (((q63_t) out * (0xFFFFF - yfract))); + + /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ + out = ((x2 * (0xFFFFF - yfract))); + acc += (((q63_t) out * (xfract))); + + /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y1 * (0xFFFFF - xfract))); + acc += (((q63_t) out * (yfract))); + + /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y2 * (yfract))); + acc += (((q63_t) out * (xfract))); + + /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ + return ((q7_t)(acc >> 40)); + } + + /** + * @} end of BilinearInterpolate group + */ + + +/* SMMLAR */ +#define multAcc_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMLSR */ +#define multSub_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMULR */ +#define mult_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) + +/* SMMLA */ +#define multAcc_32x32_keep32(a, x, y) \ + a += (q31_t) (((q63_t) x * y) >> 32) + +/* SMMLS */ +#define multSub_32x32_keep32(a, x, y) \ + a -= (q31_t) (((q63_t) x * y) >> 32) + +/* SMMUL */ +#define mult_32x32_keep32(a, x, y) \ + a = (q31_t) (((q63_t) x * y ) >> 32) + + +#if defined ( __CC_ARM ) + /* Enter low optimization region - place directly above function definition */ + #if defined( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("push") \ + _Pragma ("O1") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_EXIT \ + _Pragma ("pop") + #else + #define LOW_OPTIMIZATION_EXIT + #endif + + /* Enter low optimization region - place directly above function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __GNUC__ ) + #define LOW_OPTIMIZATION_ENTER \ + __attribute__(( optimize("-O1") )) + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __ICCARM__ ) + /* Enter low optimization region - place directly above function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define LOW_OPTIMIZATION_EXIT + + /* Enter low optimization region - place directly above function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TI_ARM__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __CSMC__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TASKING__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#endif + + +#ifdef __cplusplus +} +#endif + +/* Compiler specific diagnostic adjustment */ +#if defined ( __CC_ARM ) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + +#elif defined ( __GNUC__ ) +#pragma GCC diagnostic pop + +#elif defined ( __ICCARM__ ) + +#elif defined ( __TI_ARM__ ) + +#elif defined ( __CSMC__ ) + +#elif defined ( __TASKING__ ) + +#elif defined ( _MSC_VER ) + +#else + #error Unknown compiler +#endif + +#endif /* _ARM_MATH_H */ + +/** + * + * End of file. + */ diff --git a/Drivers/CMSIS/DSP/Lib/ARM/arm_cortexM0b_math.lib b/Drivers/CMSIS/DSP/Lib/ARM/arm_cortexM0b_math.lib new file mode 100644 index 0000000000000000000000000000000000000000..0240992ffef813716656a33cd03210d04b961a34 GIT binary patch literal 2399752 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 z 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 TWOp8vjn?cQi)6(%nT}BfUFL<8w7e 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
j)Rusba%QCNQs`huo(Xi9;evFQYi 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

@udhyb_X|oXE-Oi1B6!CR_bOOeYx{+4b+u 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

PjV(XQ7Q`U)iAX&1#=Woe$K%#BZzS(7sdSujzd% z>R!Sh(6WL%HQt3AAnCE*mVN0TwCv#C%1D=$abUoBQD=qi{1+y#f7$&{E#2< zj$?<#c6pD~8+3-B;*IKy@LL*Md@X}8bA z$5-C&EN2!jW1I3`4L?7>7U12uj4@%Kfrp>p5McHf^7HRqc^+!|BAk&609g+58H|hR za_>6+xc06UV~%6*8hxD|^9Xy_|27#se17o#?ORh9a>t|5;84v8hu;u_@6k4dtY8@5 zPVoOHDZHaUER*{+Ysg69P4r9QO+tWA3U4x?PYUm2fWC)iIPLaJ;bDQ<#lx~6@nP8` zShR`3!?GW6#U=()csuq~jOI z9aokPYLzH?V&!5IG!=<9`OJOVvYyTAkcR&6k^_6J%e!G6TfRbbRgF2av$`` z=l$RFGSmsy5Gl{gurI>?<-P7Zbi5D$0a=%?`=matI|eyDtO*Xg@j%e=Zalt%`tlWO9tAQwccyMzA+Km1BDPH(r5-;wqm z^H5&yMU3IPlh=*f*8cVlaIDgR7HMbfUbO-hwLN~_{!8YZ% z#^;7Jl#joz_8qI??zs7FyP+d*kx`z0mJmhyORk5qn1rRy*huWA*|k8#_i5ijpJLFx1J{L;uh7EKJTt4<8tR2UZ>iwLbEuS99G z#N#?jxQC%R(QqB1eTI2FjnB}!&&R7gUgDb=g_ug4qMbB!!#52}rHY5+=cE$OY@<2~Z(@$Sh!Xuq-c}U1bDDB5Ne+MJ z$<2e3Wwj%crKjJO?AYKMl% zR~{LYwIw<}tF>E27O7*U$t-AA%t}TERVN~wGIqPKtdI9$@7@?~>^96zrd5|G(neSt z^3gXpCoS~;5v+k$dv(uE{iCg(ZQvJ646Cke=|815F?8c#>!DHy5{d`?1{?g|5ZHBdo@5P0`(T1@@MLw!)^;xRV?%W1(bYQParX zr6|^2uPH5lz;MpWO2^4x?0u3re<@#|H%jHwszsS&+iux<=mh1 z`Q)gvSHL+8KFC)aQ<&m``>CC8 zA&Ri^6xf$L=JN=kDf!<&f7O=i+hxBHu%~&P10i!;|)9 z3#CZb^0_M(TFa+hzVfK2G0TPH)GJn4CSQnh@l??|xpMw;I+m|oQGthLP%~N1zY6}1 z=HD1=b%jMWl%p*KLEj|85CVTh8EsvD1wMSHjaEU)WlOa@vlnH6wTC{w2O*v+%lhU9 zJjovdH}<0L6y=6ZHG-m=@*Fs8wRbJt(8-3Fuq=0n_TB+ERJf6$-yn@MfSH-6l$~WWYuRg~^Kd${BM=Dec3NEm% z(A^RhmKEBjNMNgmVO<(i4F_8FOtCEML6DZijVggg6;>J*t4Ocf51YNpEmAbFEw@Tl zEc%9fyK>$R=Y1&c&1gtCsFYM#!nRy=NH+gITqG(`S=v>mTnHtR$To_^O z>b1BoP<3{JW!a;_;YoN&|8CI0MNe}T3s{y5U5O|gER`$dU*&4QrkC!1o&onFeRN3F zIeGzmfH+@<^A&L-wleI`x2mk%3g=y5u#X{k;rf~)MJE$1DeRvSPQ9aBNqP|18_NF;lsKmSrNmps-`R?E*a1i{`b#nNSnU{kP+6+{ zCH+Fh2OPz)2BQdn81Y2(BUb}q-X<+v=5{yL9|Zo z0@$W@>y%;Zo+`tZ?w4W9=u|?0NUZK_(+f zW%F}@&MCxSRQOfkI$(b5jNv%mbuPg$vQJd_0K|3VaIa zMFtKSomluezfj=@yQ@=iC{tm);voD(cPRX(jvq!HlKtCeRZi&~0zn@0j$XlAGdmZsv7ir~+_ut8nLNxXZY54nX6n}qW zkek`3TZWt2qdNhJhP#28<;+2v&RIy)nNLqBevrTrh6?-{N1DW`R&kK;kM#Rk`7DGop@RY4ozG!9 zfx&FSp1$>ieJ`tX^Pn`mAgvGRk<%YtJ6zEHws3yw*ziy{y)2vqJ(T~(XL9j@)6a+S z`PzTt?XOtnve zHc4>o?cM^CaAaJ>{lnFwB=hT`=-o3Hh12i}*`Hm#gG}xVMOTJ1r-%Digfk-@k%n;J zN^!VXt#k1)RY6cDx?r6fgJ#cJ;l4`|EHOX5&bXil6miK-Tsx?%@*b$k%yfTXEyjmi zbMgIEUz|=#pDVHkguO^8p2EB{SQ1psnZ-FIi@2YmF49lVg09Y4D9$YR9@N^;P*AAd zd@Uqj;%!ld{Cg-mIhsz2TPOfsxdW^gyDg~7 z0cfaj*(s-lGcSZ&)Q^4<-~5fbZ&U5+pRdB-Enz4SEyfptzi=%yc>dw)bzvw}Z4L9= zzXza!G~I2sXTkj^xS>Y$9|%Y5Zw;ez_gy8e|J5+!{o*QUM*V7dmT|Coqo0Ym&t6sL z-W@KZjdnFIXhFS~v7WqY9ZUUK7`5`iRePvM^zraIw8N}$4vNE%+TIb)bMJs!(O&NJ z$VU$P4ZYVv_h~P2fMVg)UQkt{1#TmFxa6)vzX^lobj65#=7}vFI1MRw^wC z%AP1Db9W=$lG9nJuphI+KF11s3lYQa4yvqmuiz(wU*LzT-@a0muda(A;=kd>ut3G& zv&4U}P<^L`2bQC9;osNYh+Oq%{RF$e!ab2KYE)Gp=KUk0;KRXRj!A*>u114nB-S!KhFBZkEUW1!_wg??@WT;x-39{cL47U z;2#C>t^nQ>z`qXQR|DApOqcoBYYvlNE+)m8@?{0^fB-HC;3)w-J%CRQ;IjjGVE``; zV86^S^Dk=|(3t$*5TI`eU|C!E=vxBe8v?jJfVT$l9Rd8c0KO-Hw*~OG1NgoGejtFk z@1QZ|eM~{Y!?c?g@0Okc2x2TAIt>DS&xwTCw7U=?yf+-CZbTRkc%I>)h(+E2BPn!H z%N)OfZ+Nml{Tn*uVY6=$+u$X5h{h!v&(L^|#^-8$fyT=;UZwFmjc?L;tHyU}yj|lR z8e?op`cG=SM`Mf`$fR`3fNzpC*;h1~-RyI43gy%5@r^dVHY;9QMSkAllJuG07-jaMkl)+#N+AIigT zz;-43&2PW@Wxq>_3lWd@aBUZByMpUc_(LSCjP^-bvC=+8(%~d5wQ# ziC$RB`3k?kh>W&ny{+-PN@kpkZid@EEu|NBpvEUyBI9irYdi{7L%K;CpQQD|o}%%` zwO-gyX?(uc3wyD~ms(2y>(!`Q^7*_a`ddA{v0E(B_iKM$$*kMo)$#rdBb4+Q`;yNm zl>S%y6)m%ljTdF}@e}>NP7hU24*D(YmwIE0*IS3 z9Q}tf@XnQ5)}*f`-wd{5x*uSUL;v`YWKN7w$l^<`SZW=&q9`x+{0lBHIrM)g6wez1 zk3x=5`aLCfm$E3S6vr!)V(mgB`sVJum(lLU@H57&T+ml7x-quJRBGE;A?3iS(IIpp z%r~AvJJX1I58pi@2Xi7GvSUEwVt&Yvyk1zY_^pE*COiUv^f!6d>GJf~e~%e>ou(r{ z?y(I&%%xHe%w;rT*xq;G>A^Dcx=q`#Xd>@mF1kRu<=@ncq1Qo~wQzh{16qdeRG%Bp zp73|-;V{O~&47omUIyL_x@!2b9GIKEas*^jdVLmQh6kLUJ0O$Ni}i^4+cS*AYmv5f zKrh_WQjFmpkVz4`IX+55cO(3a8_wPt_^b5MnRdG#e!lYNJqetJi{+(l+6{9<3cqRu zEr6dfCao*r;pc~YUzai|yWy|~FVwuhx1@-v|dCX|My4@-7-#G=Fnvg*KV)lRU zgKG0p#m<)obhg;_U^3L{JBKF@+Rqff&Od~nE<_S~c4vUN5PF6V9U_PHDd7m6t3$yV z&umjnH6E*BeVJnDhkL$fCc|~2@998S$M8pev)q4V9!WX0PamG4UNgrbtY0xOzIWw^ z-8>E$uHDtKeR}5+ec-!SzBkLiq;672c(Z&8XQ21-X8BT9l~XNqX&Mh_#Y|Dh`)&>A zve&5rM;Sibx4Ds1@0z<)0Z$=hJzMTHz)urmc?Nhg;H88&3ycHaOt@O$bo|ffeR!+D znfQNQ=G|e$c=a6jDm#pcSSeMqGy9}x*qJ@p%@}@)jZW8i~%s&>U z1kR{ACjKg&>5jvkPn-A8J2ep>{_O~vn=YBZvaSqIXy4m`^x`Ee&iAiu&9sLXsATQt zns?D3Lnj#29UpwcvFeH)I9kM)rEsXb*TPX|aX70uJg72!Qbo8B=Voyn-SL2LN!a~3 zcEmP2Zx`lP#|H2z0X#2&=LhiG0KPF5J1CbJT|WDZ0o)$IT>H`(`fn=e;fDhFu>gKL zfPWsqzX{+#{W&?laISNWVc+r$KoE02@(cno6?7V4t|vVM+#BE-XNLe-X7e@9NBBC}(->jm`V+1;mAFuWyy>GmUY`F8whVi~i&( zY7cE;KOo=GnSGe|-4~-+jCYAXt5~V|Vw#q8&^P3LcZ?C9B~XvE=v!{nxC7&b{$JJj z9(|^Azs3*h_u0|L68{N(#<54^y=Vr;|DDEv(C@|nQ=J9yOpfoX+u14|dx(C|9cMdK zTFGa}@-3Y?`n~s0s52aUfqq|piGDvG<&bai+@Q~3us;~WbTKzdIqwzQY{#!ya>0^S zW@#)p_nZ5vB& z(ID>+561D+O)*5U+14;T+x3s@ZqEX9sP@Ih{E#2#f!{4x{MNxugYnSixxsJY@0%yO zy{zfT56cXXAI7ER593u#J+hRqobu1S^V+Cw@dV9QIKHg`Ez;2N9%bBcx?C#XjmsDl z#>JR%!|A>Y*kp)&VQ0hbFUM=3LlqoyZZO>!2hMO~D)!PEto?O)!%VXZmodx}FU&t) z95};|k>(V~SbFFzO4_taBsW>2^N*PI(1qEYUH5O7y=?^vw+)y;`W z`e6<*a6CXEcV_1Q&JL`ZecVi_txLyD^dCJtXjPNt|DLmhjcJ&&coVi<-hz(j?4ZZL zaCXq+9~q2{iS`t`$3J~%2R+{MogMUe+dDhhX!m&MeViRo+qpcDfK(mlbnIxcl>NvZ zBOIc`j`vGr{%4*es2hT;NKzjc<0`V)13}fiuQPAL&a|F=aT%*xwdfR`Fz;ORL0`WXW?$OT=VC=EP z7=AaVVtyYqCES0GK>q%71mfEQ^!{@MhCdVte=LCg=Ln?tpCb_eDnS2I0Kb}w9qvVF zSU&$+mVM1L073j-&K0H`hFpxon02N;gb-c$^z)r7jKBoLRh^tKz*$&?zlh%FV)hGh z-HElR=y}9`iQjhhpDW1zyio7M%Rl&Y1>uh=Tx|3ebFMI$`S6`92=2i6q5oI)xrpyv zLBb#GJXa8ma|O|Bw@1_a&J`s550=s==sQ=SKE5NJE6BOSoTHyB$oa!f`g{TVp@Gad z*8OsB6Vv6rS8TH%e}Cr-hKt(Oo0EqRS1Cqd)2}Ak;Bmu|RmdO8;wSx;N|6t-#WNyFfO`0U)TqKAHVJIVg(a!{La1|lvt~|3Bb#MrIXG{ba-9vgi34YNEB<`ga}U=3<*;GG zU&ddRIMpBH@VY|V%GV12Qag-gcn8lHNH@n2!8UZQJ~y0^68z~rz@^GTdp#~+dDE{0 z&cem=(l+J25pKg9&d9m=`#UaUOxX4C@bhZ{?&^HuIr!_oNET^l0&azae1_vhhabW4hKaUwK^Lw90sn9rJyhFHncyN9TOu{p$7m-*dhIl|>X<_(0_nC=y{LBA_mb z-}yS0(*3=4|GdOsL@mhh@2zOu&uVFPShE&?lKN4bUfB23TVfE?4M9%0| z_@gMK5Y*L}%baTSKlE%tZU$UeVxc4ZD9im(Kt|y^N=D(AAFhl-FI|u5^eO9FgU1KL z{bvhY2m8+!h`$%0_n$2={FOlXJE=J3YytEsXA8t*1N8p01%}THgwGFP|JefRxo)D- z<>hxH#Ay54lX%0h9eKZfxN$}ZdrzhgODI16-l<1)t7UqE(&53{;FTi}_2Z{F*U zI_UCjVLIpxZ#cs^WAtOsJy`qe@`mxAQojj@JZ^}CZ9Bdn%w(8T%E)`Gkn8=-%*F{dru8fhGm$ZjoYXh;lgn30&&&@I^; zItK?f^@o1Lw})BD9!(|jp&KeURBaf$VZw%S@yZPo+a_%px^ZaJq{cBVqc@CSKO&Le zQF7ja>_?%o&`p$WDacuq@0>Ss{gB3r>|KdreCs1o+&D5h;=D=C<=K0iMm3agw;Kl| ztVrGn2_-9`KXGEssjVZSH*sRJxMo^@=)94Q!?S;~J})^rHagE$#C!hDJ=0eboRJt!?mo-+_)PdvB?QZi>_zy`IZ5ga} zV1|-oW0}dSnrUAzeWIu2BOF@=p2e*tZNu6tRLO0>d4`hXk;BoNUtas9KrT%RX~^ZJn@1!^widQ^rm?E#n)b=b6Jige zCzT}gTL*2wrFHoBn_4Tj-nd-3M+*?YZ^ zu?QL4T7{6RWCiQP3mJ!yajg>&qHD^8v`=aqwP|$DX|3g`tI4t6x!302m@L~~Kg#N; zc;>sI+Vnrf(vuTH)ve>we~i*p!8I1HZpn$E>P?mDFURs(@_kvM8LgG@kG58YX10w@ z|7q;>&{gf@(w~pDg%)la54xA8d^=wGf^+J-Q*PU9#Ru0HPuU(H^MZ5AyHnbL2eeN< zry&N<_&Q?|t`Hs!wH%zSrB1N@?`{j8a1)Fu10^@mQ<0nn5= zpf!8Y%w$e(bs{JCp2qBvR%>jx{mNL5<kJ4mMXwL0P4VqgD#z!|6P=_Y8 zm!>y$YmBu+U+6yEldpX@o?YN3qt(#_+85*ZmzY&Xw`Ik$+MLz>H}#F)X6?;wnz|xZ zpD2NL(gv$~V*&K~mNynvXSDQ%hSE_RO0CP1S+Q!&E5*$fm}$!5>C8v-WXvI$QIe%< z4%wG1w6|cSG>(ghk`*#vjNMq-GG_N|=qN3VL$_^PLF0tP#PyTT`)Bs9oU`No3Z3)5 zoxPVmI8oI&J~`>U;_ST*Rom_CU8+|nC&Z#Pi(1EH2AF_Rc{18@GRA#D_O8OvdEbts zhp5p6I#ARs%a5Fg(Fdxbpc<*Tv`qQfN2S(2Ip?(a$jy^#rp5k*K6T$H z>zP09vziLfqtHt>51jdK+t@9Yo5oCO=xp8k5y{cefI1HCI&RPfxo70wQzGs8`-@qR zxlQPq<+=43J<&ncn+kGoZz*6~VJyy0x~)ZMM=R+2;cQig}N_9g{eXrbVq|lD=H@AK4dk5kVvroMH zZar?BV*ZnQQq=>w_aO$i^wMP)=F6Wxk{wsc?~9Hbga59C!2Acd=bt}!Zq1q2s`*Q; z%je@2w=UmzyJY@q>yjnQtQCvqUqJD&)uYc}GT+i?zNh0U-)B}Vfx=fW1l+FZT9YbB zJ|Ok2$8^?=)VfmF`T;3srB>E*s$`{N)`}x4X2rW~pTO$w8eD4+eP0erQ%^^?<0}3J z%U!dNU9bhDb2Na%3at<#SXOAY@h87M24IgHdQK5Nhb3sf_J_lYOcwu0HJnqlKNIl` za&QI!a{%p&Sk*f_aY0iaoFQzGkfb=7AQTVM_YGWBB={QQz#;Ey!9TnS*PTKV!HPC= zlQ_ME=*U&C2j(K)YP|QC4;y?V4a)72-XP)bn(MI0Mky`iUV+GJfEyGOLmh*InplU3 zEt*(aAY{hsP-VlGAv9Z2z_vom#T%B&1tLoG?9n8w%@-BPi%5>2z6A+v=7W_5iPhMX$&3?8Cf(<^_2-WP^D@cnz3@=>~P`?P^84_2jw;?M*Q;S4dd9}Fk zA{RSH9WK@-y-}C!Wc0oc7b=QQ*5=Ki$QPRxs;F7cSG4~tC=vCjf(vXbGFqa-vLaQA z1h#4@ka*@qxR4KYa9EagFG$P9wk&)*b<1yL@g>axT<<8gjqkw8&iEv0{*63lC>q#SBqlVltjGYJH)e^Z z8rQk%<=1oJtW}+=7S30|Z6|C!5EPIs&e9>!6KRF+lNhk9(ETba_ruBT?nY#0H%x7s zsm`6+-b zXSUUS%`QaHv4Ab-3@a*r!WqbNF6iU~x8xO&8d5SL<}aT9D;#6Fv&>fZq##J}9v=snuft8?0Yuk)D%^0H*9zRQ!-jL6*~3 zSS#EYe#5K?%B%1&;7VUOGUrsOq!mvf%b93J=Xj|AvDhgoW3Fdkih`-m3lIyDLS;&U zUgB?E`)-i!V=ow++RhpR^1Rh5o!gKmkB|cW2AMZQ1*L;roDJR>jafUxv>s zsu|r%RScbOlP-qjMe#MQak>}JYYktHy@H`4tXE|u!r}

uYv$8u=0~%w%W7QoUI5N=fTAb>n&sT+cu} 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 z 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

2r0A9<(XuxSv?#QiVL*|^Y} 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Ϧ?(|<>h4C{GMq8 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

aHTT=ck<)7CSN3z{ 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

?m$LwoqR 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

    -}!udWMT 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 x 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%0AuRU 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

    5L`}Uf; z#goZX3}X%v<<$zR{-nz{JjWWw8ir>|yTMhvV+`X;hJ$Y*nubA{NWP1hg|+;|UWT!k zn1gToh=_lZScGqIiRjdyiMR#+l8AiqIA6@ygO~%|II$1bsu+y+p)TsIhZAvkOIb)=>=Ys%8crrAV$ClR{Wyb|fX!uy@%Sc? z2n7n4Ydd=ytL&8}5z!j{_sI<~MVI+EN`%;8Ql(n&@*$#5qb<|IYoc8n?<&E4iA?N9-1 zusp`vI+6~T=gUehXR7d8`RF*^w-JTW6_PvpR%rB{mtW`%Dc}bJyvRH0b|RhWNc&O% z_qiCu+G#IDi;}arG?W`Ir~#L_ayK9Y^ElHrN*qC_`w0?Z7>8Y7$S|gZC{pcVIt*{) ze7n4`e)$0j*KOA2t#Ori8_HvTmIra6>Lte|tJC=-ZEHmCW9>Q_J^?@Hak-oQK>OGaT>jyH@G+TnYxfh#5+~Pw zi1eub?m#+BQ(>puKU31_h?kJg>2!GzojgBFbsW=GXadyf&T;q|Js1aHA9Hej-d4iz z?C%4C_VvpPkxrM*{IgKrr}T)^adqI%@}5C?NP38Vc{jowr(M|u*oQ{3oKpPQK4gV{ z`S8NgIT81@`sGmtoz^ec*_x23HPyRsx3$Yw+uDYhwvq;u+U4?%TDzQE>D@%_a{0lD z&@SgrGog3h_Y}gQT}BwR%lHrNGXDRl`aWovja&~j%e~cF=(;_-??IQ8`;XBnpI$iP z{|}uqI{Gbj%J!mZy=EHaU={PfpjZAkE|88|2yHLC#xm|xSJbH^p}yq`YkBqYiPi`+ zR5#eY%v!J94lmrcYmkNG>OO+6Zsm)&Ln@LPSJqgwq7IeJ$K#rDDVc47IaMwv1(eS& zB{Rhcl+1)`<(-cI%2Bvf;0Gl$p;~!o;J-m+aZP{ASUaD=sLdkrwCyBR7bmnLdHLU53 zzYHO^zWGY{;&{JB=lQE2ZGG3)#XgzJ`k0yA|LuKJc-~;GUm^szg2Dh zNc6XgeC)SX%v^Tj`HLTI?E)WNM8(`&hlEwkRFWhY;a}V_66d+spAhie;ZPIbB~4S+ z{8E~>63IPxJGII8AWQrjmdCRhe-R7as0%%sg${QVI?~zS!$oZh$kvJDRpZ=m`R}s$9*aL_@fR)r zp2ee9`{i5Qlu@%ham#;_#VNOuMwZuQ{IChuo)>I$0vrp%i4KVbGI$^Gr3PnT;=ECZ z&jjauQ}YL4Z!kElzWF?4)^GZ$wJftffbwX=*F4IowIN>$PN(bfqs)4!<^Qn`3}pEK zvG_qN{P!$QSpj9yeTgS4+4U*dr-l4fCA)@d#Ew2q_+RN#WM0hPI!)_o#hD|d7vfKzTRDJ}Rb)_Y*SLSlmBhFuvj)G}fqR;gS%as@tiiuV|E@=nS;Jq*tcM+=%(}OdSwmJW zWY&F;F0IwScl~j!Bdii~XVcK_8rafa5$ygv@$B5dyH6iI7>pMMUFr?4Zm# zBLwV^K1VE8`ox299mogb+Ye$E);Nfe$xkGr+%t*2@Jt~>hJ7;;7rU8=aCZ?gIr

    + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL_MSP HAL MSP module driver + * @brief HAL MSP module. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup HAL_MSP_Private_Functions + * @{ + */ + +/** + * @brief Initialize the Global MSP. + * @retval None + */ +void HAL_MspInit(void) +{ + /* NOTE : This function is generated automatically by STM32CubeMX and eventually + modified by the user + */ +} + +/** + * @brief DeInitialize the Global MSP. + * @retval None + */ +void HAL_MspDeInit(void) +{ + /* NOTE : This function is generated automatically by STM32CubeMX and eventually + modified by the user + */ +} + +/** + * @brief Initialize the PPP MSP. + * @retval None + */ +void HAL_PPP_MspInit(void) +{ + /* NOTE : This function is generated automatically by STM32CubeMX and eventually + modified by the user + */ +} + +/** + * @brief DeInitialize the PPP MSP. + * @retval None + */ +void HAL_PPP_MspDeInit(void) +{ + /* NOTE : This function is generated automatically by STM32CubeMX and eventually + modified by the user + */ +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pcd.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pcd.c new file mode 100644 index 0000000..9ec8078 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pcd.c @@ -0,0 +1,2263 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_pcd.c + * @author MCD Application Team + * @brief PCD HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The PCD HAL driver can be used as follows: + + (#) Declare a PCD_HandleTypeDef handle structure, for example: + PCD_HandleTypeDef hpcd; + + (#) Fill parameters of Init structure in HCD handle + + (#) Call HAL_PCD_Init() API to initialize the PCD peripheral (Core, Device core, ...) + + (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API: + (##) Enable the PCD/USB Low Level interface clock using + (+++) __HAL_RCC_USB_CLK_ENABLE(); For USB Device only FS peripheral + + (##) Initialize the related GPIO clocks + (##) Configure PCD pin-out + (##) Configure PCD NVIC interrupt + + (#)Associate the Upper USB device stack to the HAL PCD Driver: + (##) hpcd.pData = pdev; + + (#)Enable PCD transmission and reception: + (##) HAL_PCD_Start(); + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup PCD PCD + * @brief PCD HAL module driver + * @{ + */ + +#ifdef HAL_PCD_MODULE_ENABLED + +#if defined (USB_DRD_FS) + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PCD_Private_Macros PCD Private Macros + * @{ + */ +#define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b)) +/** + * @} + */ + +/* Private functions prototypes ----------------------------------------------*/ +/** @defgroup PCD_Private_Functions PCD Private Functions + * @{ + */ + +static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd); +#if (USE_USB_DOUBLE_BUFFER == 1U) +static HAL_StatusTypeDef HAL_PCD_EP_DB_Transmit(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep, uint16_t wEPVal); +static uint16_t HAL_PCD_EP_DB_Receive(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep, uint16_t wEPVal); +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup PCD_Exported_Functions PCD Exported Functions + * @{ + */ + +/** @defgroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This section provides functions allowing to: + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the PCD according to the specified + * parameters in the PCD_InitTypeDef and initialize the associated handle. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) +{ + uint8_t i; + + /* Check the PCD handle allocation */ + if (hpcd == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); + + if (hpcd->State == HAL_PCD_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hpcd->Lock = HAL_UNLOCKED; + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SOFCallback = HAL_PCD_SOFCallback; + hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; + hpcd->ResetCallback = HAL_PCD_ResetCallback; + hpcd->SuspendCallback = HAL_PCD_SuspendCallback; + hpcd->ResumeCallback = HAL_PCD_ResumeCallback; + hpcd->ConnectCallback = HAL_PCD_ConnectCallback; + hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; + hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; + hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; + hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; + hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; + hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; + hpcd->BCDCallback = HAL_PCDEx_BCD_Callback; + + if (hpcd->MspInitCallback == NULL) + { + hpcd->MspInitCallback = HAL_PCD_MspInit; + } + + /* Init the low level hardware */ + hpcd->MspInitCallback(hpcd); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + HAL_PCD_MspInit(hpcd); +#endif /* (USE_HAL_PCD_REGISTER_CALLBACKS) */ + } + + hpcd->State = HAL_PCD_STATE_BUSY; + + /* DMA Not supported for FS instance, Force to Zero */ + hpcd->Init.dma_enable = 0U; + + /* Disable the Interrupts */ + __HAL_PCD_DISABLE(hpcd); + + /* Init endpoints structures */ + for (i = 0U; i < hpcd->Init.dev_endpoints; i++) + { + /* Init ep structure */ + hpcd->IN_ep[i].is_in = 1U; + hpcd->IN_ep[i].num = i; + hpcd->IN_ep[i].tx_fifo_num = i; + /* Control until ep is activated */ + hpcd->IN_ep[i].type = EP_TYPE_CTRL; + hpcd->IN_ep[i].maxpacket = 0U; + hpcd->IN_ep[i].xfer_buff = 0U; + hpcd->IN_ep[i].xfer_len = 0U; + } + + for (i = 0U; i < hpcd->Init.dev_endpoints; i++) + { + hpcd->OUT_ep[i].is_in = 0U; + hpcd->OUT_ep[i].num = i; + /* Control until ep is activated */ + hpcd->OUT_ep[i].type = EP_TYPE_CTRL; + hpcd->OUT_ep[i].maxpacket = 0U; + hpcd->OUT_ep[i].xfer_buff = 0U; + hpcd->OUT_ep[i].xfer_len = 0U; + } + + /* Init Device */ + (void)USB_DevInit(hpcd->Instance, hpcd->Init); + + hpcd->USB_Address = 0U; + hpcd->State = HAL_PCD_STATE_READY; + + /* Activate LPM */ + if (hpcd->Init.lpm_enable == 1U) + { + (void)HAL_PCDEx_ActivateLPM(hpcd); + } + + return HAL_OK; +} + +/** + * @brief DeInitializes the PCD peripheral. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd) +{ + /* Check the PCD handle allocation */ + if (hpcd == NULL) + { + return HAL_ERROR; + } + + hpcd->State = HAL_PCD_STATE_BUSY; + + /* Stop Device */ + if (USB_StopDevice(hpcd->Instance) != HAL_OK) + { + return HAL_ERROR; + } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + if (hpcd->MspDeInitCallback == NULL) + { + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware */ + hpcd->MspDeInitCallback(hpcd); +#else + /* DeInit the low level hardware: CLOCK, NVIC.*/ + HAL_PCD_MspDeInit(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + hpcd->State = HAL_PCD_STATE_RESET; + + return HAL_OK; +} + +/** + * @brief Initializes the PCD MSP. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes PCD MSP. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_MspDeInit could be implemented in the user file + */ +} + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +/** + * @brief Register a User USB PCD Callback + * To be used instead of the weak predefined callback + * @param hpcd USB PCD handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID + * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID + * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID + * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID + * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID + * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID + * @arg @ref HAL_PCD_DISCONNECT_CB_ID OTG PCD Disconnect callback ID + * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID + * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, + HAL_PCD_CallbackIDTypeDef CallbackID, + pPCD_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + switch (CallbackID) + { + case HAL_PCD_SOF_CB_ID : + hpcd->SOFCallback = pCallback; + break; + + case HAL_PCD_SETUPSTAGE_CB_ID : + hpcd->SetupStageCallback = pCallback; + break; + + case HAL_PCD_RESET_CB_ID : + hpcd->ResetCallback = pCallback; + break; + + case HAL_PCD_SUSPEND_CB_ID : + hpcd->SuspendCallback = pCallback; + break; + + case HAL_PCD_RESUME_CB_ID : + hpcd->ResumeCallback = pCallback; + break; + + case HAL_PCD_CONNECT_CB_ID : + hpcd->ConnectCallback = pCallback; + break; + + case HAL_PCD_DISCONNECT_CB_ID : + hpcd->DisconnectCallback = pCallback; + break; + + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = pCallback; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hpcd->State == HAL_PCD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = pCallback; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + return status; +} + +/** + * @brief Unregister an USB PCD Callback + * USB PCD callback is redirected to the weak predefined callback + * @param hpcd USB PCD handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID + * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID + * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID + * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID + * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID + * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID + * @arg @ref HAL_PCD_DISCONNECT_CB_ID OTG PCD Disconnect callback ID + * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID + * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + /* Setup Legacy weak Callbacks */ + if (hpcd->State == HAL_PCD_STATE_READY) + { + switch (CallbackID) + { + case HAL_PCD_SOF_CB_ID : + hpcd->SOFCallback = HAL_PCD_SOFCallback; + break; + + case HAL_PCD_SETUPSTAGE_CB_ID : + hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; + break; + + case HAL_PCD_RESET_CB_ID : + hpcd->ResetCallback = HAL_PCD_ResetCallback; + break; + + case HAL_PCD_SUSPEND_CB_ID : + hpcd->SuspendCallback = HAL_PCD_SuspendCallback; + break; + + case HAL_PCD_RESUME_CB_ID : + hpcd->ResumeCallback = HAL_PCD_ResumeCallback; + break; + + case HAL_PCD_CONNECT_CB_ID : + hpcd->ConnectCallback = HAL_PCD_ConnectCallback; + break; + + case HAL_PCD_DISCONNECT_CB_ID : + hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; + break; + + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = HAL_PCD_MspInit; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hpcd->State == HAL_PCD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = HAL_PCD_MspInit; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + return status; +} + +/** + * @brief Register USB PCD Data OUT Stage Callback + * To be used instead of the weak HAL_PCD_DataOutStageCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Data OUT Stage Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, + pPCD_DataOutStageCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataOutStageCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD Data OUT Stage Callback + * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataOutStageCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; /* Legacy weak DataOutStageCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Data IN Stage Callback + * To be used instead of the weak HAL_PCD_DataInStageCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Data IN Stage Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, + pPCD_DataInStageCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataInStageCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD Data IN Stage Callback + * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataInStageCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; /* Legacy weak DataInStageCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Iso OUT incomplete Callback + * To be used instead of the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Iso OUT incomplete Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, + pPCD_IsoOutIncpltCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOOUTIncompleteCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD Iso OUT incomplete Callback + * USB PCD Iso OUT incomplete Callback is redirected + * to the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; /* Legacy weak ISOOUTIncompleteCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Iso IN incomplete Callback + * To be used instead of the weak HAL_PCD_ISOINIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Iso IN incomplete Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, + pPCD_IsoInIncpltCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOINIncompleteCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD Iso IN incomplete Callback + * USB PCD Iso IN incomplete Callback is redirected + * to the weak HAL_PCD_ISOINIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; /* Legacy weak ISOINIncompleteCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD BCD Callback + * To be used instead of the weak HAL_PCDEx_BCD_Callback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD BCD Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->BCDCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD BCD Callback + * USB BCD Callback is redirected to the weak HAL_PCDEx_BCD_Callback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->BCDCallback = HAL_PCDEx_BCD_Callback; /* Legacy weak HAL_PCDEx_BCD_Callback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD LPM Callback + * To be used instead of the weak HAL_PCDEx_LPM_Callback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD LPM Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->LPMCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD LPM Callback + * USB LPM Callback is redirected to the weak HAL_PCDEx_LPM_Callback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; /* Legacy weak HAL_PCDEx_LPM_Callback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup PCD_Exported_Functions_Group2 Input and Output operation functions + * @brief Data transfers functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the PCD data + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Start the USB device + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + __HAL_PCD_ENABLE(hpcd); + (void)USB_DevConnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Stop the USB device. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + __HAL_PCD_DISABLE(hpcd); + (void)USB_DevDisconnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + + +/** + * @brief This function handles PCD interrupt request. + * @param hpcd PCD handle + * @retval HAL status + */ +void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) +{ + uint32_t wIstr = USB_ReadInterrupts(hpcd->Instance); + + /* check if this is an USB pending IT */ + if ((SYSCFG->IT_LINE_SR[8] & (0x1U << 2)) == 0U) + { + return; + } + + if ((wIstr & USB_ISTR_CTR) == USB_ISTR_CTR) + { + /* servicing of the endpoint correct transfer interrupt */ + /* clear of the CTR flag into the sub */ + (void)PCD_EP_ISR_Handler(hpcd); + + return; + } + + if ((wIstr & USB_ISTR_RESET) == USB_ISTR_RESET) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ResetCallback(hpcd); +#else + HAL_PCD_ResetCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + (void)HAL_PCD_SetAddress(hpcd, 0U); + + return; + } + + if ((wIstr & USB_ISTR_PMAOVR) == USB_ISTR_PMAOVR) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_PMAOVR); + + return; + } + + if ((wIstr & USB_ISTR_ERR) == USB_ISTR_ERR) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ERR); + + return; + } + + if ((wIstr & USB_ISTR_WKUP) == USB_ISTR_WKUP) + { + hpcd->Instance->CNTR &= ~(USB_CNTR_SUSPRDY); + hpcd->Instance->CNTR &= ~(USB_CNTR_SUSPEN); + + if (hpcd->LPM_State == LPM_L1) + { + hpcd->LPM_State = LPM_L0; +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->LPMCallback(hpcd, PCD_LPM_L0_ACTIVE); +#else + HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ResumeCallback(hpcd); +#else + HAL_PCD_ResumeCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_WKUP); + + return; + } + + if ((wIstr & USB_ISTR_SUSP) == USB_ISTR_SUSP) + { + /* Force low-power mode in the macrocell */ + hpcd->Instance->CNTR |= USB_CNTR_SUSPEN; + + /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SUSP); + + hpcd->Instance->CNTR |= USB_CNTR_SUSPRDY; + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SuspendCallback(hpcd); +#else + HAL_PCD_SuspendCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + return; + } + + /* Handle LPM Interrupt */ + if ((wIstr & USB_ISTR_L1REQ) == USB_ISTR_L1REQ) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_L1REQ); + if (hpcd->LPM_State == LPM_L0) + { + /* Force suspend and low-power mode before going to L1 state*/ + hpcd->Instance->CNTR |= USB_CNTR_SUSPRDY; + hpcd->Instance->CNTR |= USB_CNTR_SUSPEN; + + hpcd->LPM_State = LPM_L1; + hpcd->BESL = ((uint32_t)hpcd->Instance->LPMCSR & USB_LPMCSR_BESL) >> 2; +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->LPMCallback(hpcd, PCD_LPM_L1_ACTIVE); +#else + HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SuspendCallback(hpcd); +#else + HAL_PCD_SuspendCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + + return; + } + + if ((wIstr & USB_ISTR_SOF) == USB_ISTR_SOF) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SOF); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SOFCallback(hpcd); +#else + HAL_PCD_SOFCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + return; + } + + if ((wIstr & USB_ISTR_ESOF) == USB_ISTR_ESOF) + { + /* clear ESOF flag in ISTR */ + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ESOF); + + return; + } +} + + +/** + * @brief Data OUT stage callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DataOutStageCallback could be implemented in the user file + */ +} + +/** + * @brief Data IN stage callback + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DataInStageCallback could be implemented in the user file + */ +} +/** + * @brief Setup stage callback + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SetupStageCallback could be implemented in the user file + */ +} + +/** + * @brief USB Start Of Frame callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SOFCallback could be implemented in the user file + */ +} + +/** + * @brief USB Reset callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ResetCallback could be implemented in the user file + */ +} + +/** + * @brief Suspend event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SuspendCallback could be implemented in the user file + */ +} + +/** + * @brief Resume event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ResumeCallback could be implemented in the user file + */ +} + +/** + * @brief Incomplete ISO OUT callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file + */ +} + +/** + * @brief Incomplete ISO IN callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file + */ +} + +/** + * @brief Connection event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ConnectCallback could be implemented in the user file + */ +} + +/** + * @brief Disconnection event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DisconnectCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions + * @brief management functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the PCD data + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Connect the USB device + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + (void)USB_DevConnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Disconnect the USB device. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + (void)USB_DevDisconnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Set the USB Device address. + * @param hpcd PCD handle + * @param address new device address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address) +{ + __HAL_LOCK(hpcd); + hpcd->USB_Address = address; + (void)USB_SetDevAddress(hpcd->Instance, address); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} +/** + * @brief Open and configure an endpoint. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param ep_mps endpoint max packet size + * @param ep_type endpoint type + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, + uint16_t ep_mps, uint8_t ep_type) +{ + HAL_StatusTypeDef ret = HAL_OK; + PCD_EPTypeDef *ep; + + if ((ep_addr & 0x80U) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + + ep->num = ep_addr & EP_ADDR_MSK; + ep->maxpacket = ep_mps; + ep->type = ep_type; + + if (ep->is_in != 0U) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } + /* Set initial data PID. */ + if (ep_type == EP_TYPE_BULK) + { + ep->data_pid_start = 0U; + } + + __HAL_LOCK(hpcd); + (void)USB_ActivateEndpoint(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + + return ret; +} + +/** + * @brief Deactivate an endpoint. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if ((ep_addr & 0x80U) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + (void)USB_DeactivateEndpoint(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + return HAL_OK; +} + + +/** + * @brief Receive an amount of data. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param pBuf pointer to the reception buffer + * @param len amount of data to be received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) +{ + PCD_EPTypeDef *ep; + + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + + /*setup and start the Xfer */ + ep->xfer_buff = pBuf; + ep->xfer_len = len; + ep->xfer_count = 0U; + ep->is_in = 0U; + ep->num = ep_addr & EP_ADDR_MSK; + + if ((ep_addr & EP_ADDR_MSK) == 0U) + { + (void)USB_EP0StartXfer(hpcd->Instance, ep); + } + else + { + (void)USB_EPStartXfer(hpcd->Instance, ep); + } + + return HAL_OK; +} + +/** + * @brief Get Received Data Size + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval Data Size + */ +uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count; +} +/** + * @brief Send an amount of data + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param pBuf pointer to the transmission buffer + * @param len amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) +{ + PCD_EPTypeDef *ep; + + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + + /*setup and start the Xfer */ + ep->xfer_buff = pBuf; + ep->xfer_len = len; + ep->xfer_fill_db = 1U; + ep->xfer_len_db = len; + ep->xfer_count = 0U; + ep->is_in = 1U; + ep->num = ep_addr & EP_ADDR_MSK; + + if ((ep_addr & EP_ADDR_MSK) == 0U) + { + (void)USB_EP0StartXfer(hpcd->Instance, ep); + } + else + { + (void)USB_EPStartXfer(hpcd->Instance, ep); + } + + return HAL_OK; +} + +/** + * @brief Set a STALL condition over an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints) + { + return HAL_ERROR; + } + + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr]; + ep->is_in = 0U; + } + + ep->is_stall = 1U; + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + + (void)USB_EPSetStall(hpcd->Instance, ep); + + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Clear a STALL condition over in an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints) + { + return HAL_ERROR; + } + + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + + ep->is_stall = 0U; + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + (void)USB_EPClearStall(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Abort an USB EP transaction. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + HAL_StatusTypeDef ret; + PCD_EPTypeDef *ep; + + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + } + + /* Stop Xfer */ + ret = USB_EPStopXfer(hpcd->Instance, ep); + + return ret; +} + +/** + * @brief Flush an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(ep_addr); + + return HAL_OK; +} + +/** + * @brief Activate remote wakeup signalling + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) +{ + return (USB_ActivateRemoteWakeup(hpcd->Instance)); +} + +/** + * @brief De-activate remote wakeup signalling. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) +{ + return (USB_DeActivateRemoteWakeup(hpcd->Instance)); +} + +/** + * @} + */ + +/** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions + * @brief Peripheral State functions + * +@verbatim + =============================================================================== + ##### Peripheral State functions ##### + =============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the PCD handle state. + * @param hpcd PCD handle + * @retval HAL state + */ +PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd) +{ + return hpcd->State; +} + +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup PCD_Private_Functions + * @{ + */ + + +/** + * @brief This function handles PCD Endpoint interrupt request. + * @param hpcd PCD handle + * @retval HAL status + */ +static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd) +{ + PCD_EPTypeDef *ep; + uint16_t count; + uint16_t wIstr; + uint16_t wEPVal; + uint16_t TxPctSize; + uint8_t epindex; + +#if (USE_USB_DOUBLE_BUFFER != 1U) + count = 0U; +#endif /* USE_USB_DOUBLE_BUFFER */ + + /* stay in loop while pending interrupts */ + while ((hpcd->Instance->ISTR & USB_ISTR_CTR) != 0U) + { + wIstr = (uint16_t)hpcd->Instance->ISTR; + + /* extract highest priority endpoint number */ + epindex = (uint8_t)(wIstr & USB_ISTR_IDN); + + if (epindex == 0U) + { + /* Decode and service control endpoint interrupt */ + + /* DIR bit = origin of the interrupt */ + if ((wIstr & USB_ISTR_DIR) == 0U) + { + /* DIR = 0 */ + + /* DIR = 0 => IN int */ + /* DIR = 0 implies that (EP_CTR_TX = 1) always */ + PCD_CLEAR_TX_EP_CTR(hpcd->Instance, PCD_ENDP0); + ep = &hpcd->IN_ep[0]; + + ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num); + ep->xfer_buff += ep->xfer_count; + + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, 0U); +#else + HAL_PCD_DataInStageCallback(hpcd, 0U); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + if ((hpcd->USB_Address > 0U) && (ep->xfer_len == 0U)) + { + hpcd->Instance->DADDR = ((uint16_t)hpcd->USB_Address | USB_DADDR_EF); + hpcd->USB_Address = 0U; + } + } + else + { + /* DIR = 1 */ + + /* DIR = 1 & CTR_RX => SETUP or OUT int */ + /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ + ep = &hpcd->OUT_ep[0]; + wEPVal = (uint16_t)PCD_GET_ENDPOINT(hpcd->Instance, PCD_ENDP0); + + if ((wEPVal & USB_EP_SETUP) != 0U) + { + /* Get SETUP Packet */ + ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num); + + USB_ReadPMA(hpcd->Instance, (uint8_t *)hpcd->Setup, + ep->pmaadress, (uint16_t)ep->xfer_count); + + /* SETUP bit kept frozen while CTR_RX = 1 */ + PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0); + + /* Process SETUP Packet*/ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SetupStageCallback(hpcd); +#else + HAL_PCD_SetupStageCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else if ((wEPVal & USB_EP_VTRX) != 0U) + { + PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0); + + /* Get Control Data OUT Packet */ + ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num); + + if ((ep->xfer_count != 0U) && (ep->xfer_buff != 0U)) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, + ep->pmaadress, (uint16_t)ep->xfer_count); + + ep->xfer_buff += ep->xfer_count; + + /* Process Control Data OUT Packet */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, 0U); +#else + HAL_PCD_DataOutStageCallback(hpcd, 0U); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + + wEPVal = (uint16_t)PCD_GET_ENDPOINT(hpcd->Instance, PCD_ENDP0); + + if (((wEPVal & USB_EP_SETUP) == 0U) && ((wEPVal & USB_EP_RX_STRX) != USB_EP_RX_VALID)) + { + PCD_SET_EP_RX_CNT(hpcd->Instance, PCD_ENDP0, ep->maxpacket); + PCD_SET_EP_RX_STATUS(hpcd->Instance, PCD_ENDP0, USB_EP_RX_VALID); + } + } + } + } + else + { + /* Decode and service non control endpoints interrupt */ + /* process related endpoint register */ + wEPVal = (uint16_t)PCD_GET_ENDPOINT(hpcd->Instance, epindex); + + if ((wEPVal & USB_EP_VTRX) != 0U) + { + /* clear int flag */ + PCD_CLEAR_RX_EP_CTR(hpcd->Instance, epindex); + ep = &hpcd->OUT_ep[epindex]; + + /* OUT Single Buffering */ + if (ep->doublebuffer == 0U) + { + count = (uint16_t)PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num); + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, count); + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else + { + /* manage double buffer bulk out */ + if (ep->type == EP_TYPE_BULK) + { + count = HAL_PCD_EP_DB_Receive(hpcd, ep, wEPVal); + } + else /* manage double buffer iso out */ + { + /* free EP OUT Buffer */ + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U); + + if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num) & USB_EP_DTOG_RX) != 0U) + { + /* read from endpoint BUF0Addr buffer */ + count = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num); + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, count); + } + } + else + { + /* read from endpoint BUF1Addr buffer */ + count = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num); + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, count); + } + } + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + /* multi-packet on the NON control OUT endpoint */ + ep->xfer_count += count; + ep->xfer_buff += count; + + if ((ep->xfer_len == 0U) || (count < ep->maxpacket)) + { + /* RX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataOutStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { + (void) USB_EPStartXfer(hpcd->Instance, ep); + } + } + + if ((wEPVal & USB_EP_VTTX) != 0U) + { + ep = &hpcd->IN_ep[epindex]; + + /* clear int flag */ + PCD_CLEAR_TX_EP_CTR(hpcd->Instance, epindex); + + if (ep->type == EP_TYPE_ISOC) + { + ep->xfer_len = 0U; + +#if (USE_USB_DOUBLE_BUFFER == 1U) + if (ep->doublebuffer != 0U) + { + if ((wEPVal & USB_EP_DTOG_TX) != 0U) + { + PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + } + else + { + PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataInStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { + /* Manage Single Buffer Transaction */ + if ((wEPVal & USB_EP_KIND) == 0U) + { + /* multi-packet on the NON control IN endpoint */ + TxPctSize = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len > TxPctSize) + { + ep->xfer_len -= TxPctSize; + } + else + { + ep->xfer_len = 0U; + } + + /* Zero Length Packet? */ + if (ep->xfer_len == 0U) + { + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataInStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { + /* Transfer is not yet Done */ + ep->xfer_buff += TxPctSize; + ep->xfer_count += TxPctSize; + (void)USB_EPStartXfer(hpcd->Instance, ep); + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + /* Double Buffer bulk IN (bulk transfer Len > Ep_Mps) */ + else + { + (void)HAL_PCD_EP_DB_Transmit(hpcd, ep, wEPVal); + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + } + } + } + } + + return HAL_OK; +} + + +#if (USE_USB_DOUBLE_BUFFER == 1U) +/** + * @brief Manage double buffer bulk out transaction from ISR + * @param hpcd PCD handle + * @param ep current endpoint handle + * @param wEPVal Last snapshot of EPRx register value taken in ISR + * @retval HAL status + */ +static uint16_t HAL_PCD_EP_DB_Receive(PCD_HandleTypeDef *hpcd, + PCD_EPTypeDef *ep, uint16_t wEPVal) +{ + uint16_t count; + + /* Manage Buffer0 OUT */ + if ((wEPVal & USB_EP_DTOG_RX) != 0U) + { + /* Get count of received Data on buffer0 */ + count = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len >= count) + { + ep->xfer_len -= count; + } + else + { + ep->xfer_len = 0U; + } + + if (ep->xfer_len == 0U) + { + /* set NAK to OUT endpoint since double buffer is enabled */ + PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_NAK); + } + + /* Check if Buffer1 is in blocked state which requires to toggle */ + if ((wEPVal & USB_EP_DTOG_TX) != 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U); + } + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, count); + } + } + /* Manage Buffer 1 DTOG_RX=0 */ + else + { + /* Get count of received data */ + count = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len >= count) + { + ep->xfer_len -= count; + } + else + { + ep->xfer_len = 0U; + } + + if (ep->xfer_len == 0U) + { + /* set NAK on the current endpoint */ + PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_NAK); + } + + /*Need to FreeUser Buffer*/ + if ((wEPVal & USB_EP_DTOG_TX) == 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U); + } + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, count); + } + } + + return count; +} + + +/** + * @brief Manage double buffer bulk IN transaction from ISR + * @param hpcd PCD handle + * @param ep current endpoint handle + * @param wEPVal Last snapshot of EPRx register value taken in ISR + * @retval HAL status + */ +static HAL_StatusTypeDef HAL_PCD_EP_DB_Transmit(PCD_HandleTypeDef *hpcd, + PCD_EPTypeDef *ep, uint16_t wEPVal) +{ + uint32_t len; + uint16_t TxPctSize; + + /* Data Buffer0 ACK received */ + if ((wEPVal & USB_EP_DTOG_TX) != 0U) + { + /* multi-packet on the NON control IN endpoint */ + TxPctSize = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len > TxPctSize) + { + ep->xfer_len -= TxPctSize; + } + else + { + ep->xfer_len = 0U; + } + + /* Transfer is completed */ + if (ep->xfer_len == 0U) + { + PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataInStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + if ((wEPVal & USB_EP_DTOG_RX) != 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U); + } + } + else /* Transfer is not yet Done */ + { + /* need to Free USB Buff */ + if ((wEPVal & USB_EP_DTOG_RX) != 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U); + } + + /* Still there is data to Fill in the next Buffer */ + if (ep->xfer_fill_db == 1U) + { + ep->xfer_buff += TxPctSize; + ep->xfer_count += TxPctSize; + + /* Calculate the len of the new buffer to fill */ + if (ep->xfer_len_db >= ep->maxpacket) + { + len = ep->maxpacket; + ep->xfer_len_db -= len; + } + else if (ep->xfer_len_db == 0U) + { + len = TxPctSize; + ep->xfer_fill_db = 0U; + } + else + { + ep->xfer_fill_db = 0U; + len = ep->xfer_len_db; + ep->xfer_len_db = 0U; + } + + /* Write remaining Data to Buffer */ + /* Set the Double buffer counter for pma buffer1 */ + PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, len); + + /* Copy user buffer to USB PMA */ + USB_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, (uint16_t)len); + } + } + } + else /* Data Buffer1 ACK received */ + { + /* multi-packet on the NON control IN endpoint */ + TxPctSize = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len >= TxPctSize) + { + ep->xfer_len -= TxPctSize; + } + else + { + ep->xfer_len = 0U; + } + + /* Transfer is completed */ + if (ep->xfer_len == 0U) + { + PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataInStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + /* need to Free USB Buff */ + if ((wEPVal & USB_EP_DTOG_RX) == 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U); + } + } + else /* Transfer is not yet Done */ + { + /* need to Free USB Buff */ + if ((wEPVal & USB_EP_DTOG_RX) == 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U); + } + + /* Still there is data to Fill in the next Buffer */ + if (ep->xfer_fill_db == 1U) + { + ep->xfer_buff += TxPctSize; + ep->xfer_count += TxPctSize; + + /* Calculate the len of the new buffer to fill */ + if (ep->xfer_len_db >= ep->maxpacket) + { + len = ep->maxpacket; + ep->xfer_len_db -= len; + } + else if (ep->xfer_len_db == 0U) + { + len = TxPctSize; + ep->xfer_fill_db = 0U; + } + else + { + len = ep->xfer_len_db; + ep->xfer_len_db = 0U; + ep->xfer_fill_db = 0; + } + + /* Set the Double buffer counter for pmabuffer1 */ + PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, len); + + /* Copy the user buffer to USB PMA */ + USB_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, (uint16_t)len); + } + } + } + + /*enable endpoint IN*/ + PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_VALID); + + return HAL_OK; +} +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + + +/** + * @} + */ +#endif /* defined (USB_DRD_FS) */ +#endif /* HAL_PCD_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pcd_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pcd_ex.c new file mode 100644 index 0000000..61048c8 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pcd_ex.c @@ -0,0 +1,333 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_pcd_ex.c + * @author MCD Application Team + * @brief PCD Extended HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Extended features functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup PCDEx PCDEx + * @brief PCD Extended HAL module driver + * @{ + */ + +#ifdef HAL_PCD_MODULE_ENABLED + +#if defined (USB_DRD_FS) +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions + * @{ + */ + +/** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions + * @brief PCDEx control functions + * +@verbatim + =============================================================================== + ##### Extended features functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Update FIFO configuration + +@endverbatim + * @{ + */ + +/** + * @brief Configure PMA for EP + * @param hpcd Device instance + * @param ep_addr endpoint address + * @param ep_kind endpoint Kind + * USB_SNG_BUF: Single Buffer used + * USB_DBL_BUF: Double Buffer used + * @param pmaadress: EP address in The PMA: In case of single buffer endpoint + * this parameter is 16-bit value providing the address + * in PMA allocated to endpoint. + * In case of double buffer endpoint this parameter + * is a 32-bit value providing the endpoint buffer 0 address + * in the LSB part of 32-bit value and endpoint buffer 1 address + * in the MSB part of 32-bit value. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_PCDEx_PMAConfig(PCD_HandleTypeDef *hpcd, uint16_t ep_addr, + uint16_t ep_kind, uint32_t pmaadress) +{ + PCD_EPTypeDef *ep; + + /* initialize ep structure*/ + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + } + else + { + ep = &hpcd->OUT_ep[ep_addr]; + } + + /* Here we check if the endpoint is single or double Buffer*/ + if (ep_kind == PCD_SNG_BUF) + { + /* Single Buffer */ + ep->doublebuffer = 0U; + /* Configure the PMA */ + ep->pmaadress = (uint16_t)pmaadress; + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else /* USB_DBL_BUF */ + { + /* Double Buffer Endpoint */ + ep->doublebuffer = 1U; + /* Configure the PMA */ + ep->pmaaddr0 = (uint16_t)(pmaadress & 0xFFFFU); + ep->pmaaddr1 = (uint16_t)((pmaadress & 0xFFFF0000U) >> 16); + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + return HAL_OK; +} + +/** + * @brief Activate BatteryCharging feature. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd) +{ + USB_DRD_TypeDef *USBx = hpcd->Instance; + hpcd->battery_charging_active = 1U; + + /* Enable BCD feature */ + USBx->BCDR |= USB_BCDR_BCDEN; + + /* Enable DCD : Data Contact Detect */ + USBx->BCDR &= ~(USB_BCDR_PDEN); + USBx->BCDR &= ~(USB_BCDR_SDEN); + USBx->BCDR |= USB_BCDR_DCDEN; + + return HAL_OK; +} + +/** + * @brief Deactivate BatteryCharging feature. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd) +{ + USB_DRD_TypeDef *USBx = hpcd->Instance; + hpcd->battery_charging_active = 0U; + + /* Disable BCD feature */ + USBx->BCDR &= ~(USB_BCDR_BCDEN); + + return HAL_OK; +} + +/** + * @brief Handle BatteryCharging Process. + * @param hpcd PCD handle + * @retval HAL status + */ +void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd) +{ + USB_DRD_TypeDef *USBx = hpcd->Instance; + uint32_t tickstart = HAL_GetTick(); + + /* Wait for Min DCD Timeout */ + HAL_Delay(300U); + + /* Data Pin Contact ? Check Detect flag */ + if ((USBx->BCDR & USB_BCDR_DCDET) == USB_BCDR_DCDET) + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->BCDCallback(hpcd, PCD_BCD_CONTACT_DETECTION); +#else + HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CONTACT_DETECTION); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + /* Primary detection: checks if connected to Standard Downstream Port + (without charging capability) */ + USBx->BCDR &= ~(USB_BCDR_DCDEN); + HAL_Delay(50U); + USBx->BCDR |= (USB_BCDR_PDEN); + HAL_Delay(50U); + + /* If Charger detect ? */ + if ((USBx->BCDR & USB_BCDR_PDET) == USB_BCDR_PDET) + { + /* Start secondary detection to check connection to Charging Downstream + Port or Dedicated Charging Port */ + USBx->BCDR &= ~(USB_BCDR_PDEN); + HAL_Delay(50U); + USBx->BCDR |= (USB_BCDR_SDEN); + HAL_Delay(50U); + + /* If CDP ? */ + if ((USBx->BCDR & USB_BCDR_SDET) == USB_BCDR_SDET) + { + /* Dedicated Downstream Port DCP */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->BCDCallback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT); +#else + HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { + /* Charging Downstream Port CDP */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->BCDCallback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT); +#else + HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + } + else /* NO */ + { + /* Standard Downstream Port */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->BCDCallback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT); +#else + HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + + /* Battery Charging capability discovery finished Start Enumeration */ + (void)HAL_PCDEx_DeActivateBCD(hpcd); + + /* Check for the Timeout, else start USB Device */ + if ((HAL_GetTick() - tickstart) > 1000U) + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->BCDCallback(hpcd, PCD_BCD_ERROR); +#else + HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_ERROR); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->BCDCallback(hpcd, PCD_BCD_DISCOVERY_COMPLETED); +#else + HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DISCOVERY_COMPLETED); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } +} + + +/** + * @brief Activate LPM feature. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd) +{ + + USB_DRD_TypeDef *USBx = hpcd->Instance; + hpcd->lpm_active = 1U; + hpcd->LPM_State = LPM_L0; + + USBx->LPMCSR |= USB_LPMCSR_LMPEN; + USBx->LPMCSR |= USB_LPMCSR_LPMACK; + + return HAL_OK; +} + +/** + * @brief Deactivate LPM feature. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd) +{ + USB_DRD_TypeDef *USBx = hpcd->Instance; + + hpcd->lpm_active = 0U; + + USBx->LPMCSR &= ~(USB_LPMCSR_LMPEN); + USBx->LPMCSR &= ~(USB_LPMCSR_LPMACK); + + return HAL_OK; +} + + + +/** + * @brief Send LPM message to user layer callback. + * @param hpcd PCD handle + * @param msg LPM message + * @retval HAL status + */ +__weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(msg); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCDEx_LPM_Callback could be implemented in the user file + */ +} + +/** + * @brief Send BatteryCharging message to user layer callback. + * @param hpcd PCD handle + * @param msg LPM message + * @retval HAL status + */ +__weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(msg); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCDEx_BCD_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB_DRD_FS) */ +#endif /* HAL_PCD_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c new file mode 100644 index 0000000..c714a92 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c @@ -0,0 +1,542 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_pwr.c + * @author MCD Application Team + * @brief PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Power Controller (PWR) peripheral: + * + Initialization/de-initialization functions + * + Peripheral Control functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup PWR_Private_Defines PWR Private Defines + * @{ + */ + +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWR_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + +@endverbatim + * @{ + */ + +/** + * @brief Deinitialize the HAL PWR peripheral registers to their default reset + values. + * @retval None + */ +void HAL_PWR_DeInit(void) +{ + __HAL_RCC_PWR_FORCE_RESET(); + __HAL_RCC_PWR_RELEASE_RESET(); +} + +/** + * @} + */ + +/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions + * @brief Low Power modes configuration functions + * +@verbatim + + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + + [..] + *** WakeUp pin configuration *** + ================================ + [..] + (+) WakeUp pins are used to wakeup the system from Standby mode or + Shutdown mode. WakeUp pins polarity can be set to configure event + detection on high level (rising edge) or low level (falling edge). + + *** Low Power mode configuration *** + ===================================== + [..] + The devices feature 7 low-power modes: + (+) Low-power run mode: core and peripherals are running at low frequency. + Regulator is in low power mode. + (+) Sleep mode: Cortex-M0+ core stopped, peripherals kept running, + regulator is main mode. + (+) Low-power Sleep mode: Cortex-M0+ core stopped, peripherals kept running + and regulator in low power mode. + (+) Stop 0 mode: all clocks are stopped except LSI and LSE, regulator is + main mode. + (+) Stop 1 mode: all clocks are stopped except LSI and LSE, main regulator + off, low power regulator on. + (+) Standby mode: all clocks are stopped except LSI and LSE, regulator is + disable. + (+) Shutdown mode: all clocks are stopped except LSE, regulator is + disable. + + *** Low-power run mode *** + ========================== + [..] + (+) Entry: (from main run mode) + (++) set LPR bit with HAL_PWREx_EnableLowPowerRunMode() API after + having decreased the system clock below 2 MHz. + (+) Exit: + (++) clear LPR bit then wait for REGLPF bit to be reset with + HAL_PWREx_DisableLowPowerRunMode() API. Only then can the + system clock frequency be increased above 2 MHz. + + *** Sleep mode / Low-power sleep mode *** + ========================================= + [..] + (+) Entry: + The Sleep & Low-power Sleep modes are entered through + HAL_PWR_EnterSLEEPMode() API specifying whether or not the regulator + is forced to low-power mode and if exit is interrupt or event + triggered. + (++) PWR_MAINREGULATOR_ON: Sleep mode (regulator in main mode). + (++) PWR_LOWPOWERREGULATOR_ON: Low-power Sleep mode (regulator in low + power mode). In this case, the system clock frequency must have + been decreased below 2 MHz beforehand. + (++) PWR_SLEEPENTRY_WFI: Core enters sleep mode with WFI instruction + (++) PWR_SLEEPENTRY_WFE: Core enters sleep mode with WFE instruction + (+) WFI Exit: + (++) Any interrupt enabled in nested vectored interrupt controller (NVIC) + (+) WFE Exit: + (++) Any wakeup event if cortex is configured with SEVONPEND = 0 + (++) Interrupt even when disabled in NVIC if cortex is configured with + SEVONPEND = 1 + [..] When exiting the Low-power Sleep mode by issuing an interrupt or a wakeup event, + the MCU is in Low-power Run mode. + + *** Stop 0 & Stop 1 modes *** + ============================= + [..] + (+) Entry: + The Stop modes are entered through the following APIs: + (++) HAL_PWR_EnterSTOPMode() with following settings: + (+++) PWR_MAINREGULATOR_ON to enter STOP0 mode. + (+++) PWR_LOWPOWERREGULATOR_ON to enter STOP1 mode. + (+) Exit (interrupt or event-triggered, specified when entering STOP mode): + (++) PWR_STOPENTRY_WFI: enter Stop mode with WFI instruction + (++) PWR_STOPENTRY_WFE: enter Stop mode with WFE instruction + (+) WFI Exit: + (++) Any EXTI line (internal or external) configured in interrupt mode + with corresponding interrupt enable in NVIC + (+) WFE Exit: + (++) Any EXTI line (internal or external) configured in event mode if + cortex is configured with SEVONPEND = 0 + (++) Any EXTI line configured in interrupt mode (even if the + corresponding EXTI Interrupt vector is disabled in the NVIC) if + cortex is configured with SEVONPEND = 0. The interrupt source can + be external interrupts or peripherals with wakeup capability. + [..] When exiting Stop, the MCU is either in Run mode or in Low-power Run mode + depending on the LPR bit setting. + + *** Standby mode *** + ==================== + [..] In Standby mode, it is possible to keep backup SRAM content (defined as + full SRAM) keeping low power regulator on. This is achievable by setting + Ram retention bit calling HAL_PWREx_EnableSRAMRetention API. This increases + power consumption. + Its also possible to define I/O states using APIs: + HAL_PWREx_EnableGPIOPullUp, HAL_PWREx_EnableGPIOPullDown & + HAL_PWREx_EnablePullUpPullDownConfig + (+) Entry: + (++) The Standby mode is entered through HAL_PWR_EnterSTANDBYMode() API, by + setting SLEEPDEEP in Cortex control register. + (+) Exit: + (++) WKUP pin edge detection, RTC event (wakeup, alarm, timestamp), + tamper event (internal & external), LSE CSS detection, reset on + NRST pin, IWDG reset & BOR reset. + [..] Exiting Standby generates a power reset: Cortex is reset and execute + Reset handler vector, all registers in the Vcore domain are set to + their reset value. Registers outside the VCORE domain (RTC, WKUP, IWDG, + and Standby/Shutdown modes control) are not impacted. + + *** Shutdown mode *** + ====================== + [..] + In Shutdown mode, + voltage regulator is disabled, all clocks are off except LSE, RRS bit is + cleared. SRAM and registers contents are lost except for backup domain + registers. + (+) Entry: + (++) The Shutdown mode is entered through HAL_PWREx_EnterSHUTDOWNMode() API, + by setting SLEEPDEEP in Cortex control register. + (+) Exit: + (++) WKUP pin edge detection, RTC event (wakeup, alarm, timestamp), + tamper event (internal & external), LSE CSS detection, reset on + NRST pin. + [..] Exiting Shutdown generates a brown out reset: Cortex is reset and execute + Reset handler vector, all registers are set to their reset value but ones + in backup domain. + +@endverbatim + * @{ + */ + +/** + * @brief Enable access to the backup domain + * (RTC & TAMP registers, backup registers, RCC BDCR register). + * @note After reset, the backup domain is protected against + * possible unwanted write accesses. All RTC & TAMP registers (backup + * registers included) and RCC BDCR register are concerned. + * @retval None + */ +void HAL_PWR_EnableBkUpAccess(void) +{ + SET_BIT(PWR->CR1, PWR_CR1_DBP); +} + + +/** + * @brief Disable access to the backup domain + * @retval None + */ +void HAL_PWR_DisableBkUpAccess(void) +{ + CLEAR_BIT(PWR->CR1, PWR_CR1_DBP); +} + +/** + * @brief Enable the WakeUp PINx functionality. + * @param WakeUpPinPolarity Specifies which Wake-Up pin to enable. + * This parameter can be one of the following legacy values which set + * the default polarity i.e. detection on high level (rising edge): + * @arg @ref PWR_WAKEUP_PIN1, PWR_WAKEUP_PIN2, PWR_WAKEUP_PIN3(*), + * PWR_WAKEUP_PIN4, PWR_WAKEUP_PIN5(*),PWR_WAKEUP_PIN6 + * or one of the following value where the user can explicitly specify + * the enabled pin and the chosen polarity: + * @arg @ref PWR_WAKEUP_PIN1_HIGH or PWR_WAKEUP_PIN1_LOW + * @arg @ref PWR_WAKEUP_PIN2_HIGH or PWR_WAKEUP_PIN2_LOW + * @arg @ref PWR_WAKEUP_PIN3_HIGH or PWR_WAKEUP_PIN3_LOW (*) + * @arg @ref PWR_WAKEUP_PIN4_HIGH or PWR_WAKEUP_PIN4_LOW + * @arg @ref PWR_WAKEUP_PIN5_HIGH or PWR_WAKEUP_PIN5_LOW (*) + * @arg @ref PWR_WAKEUP_PIN6_HIGH or PWR_WAKEUP_PIN6_LOW + * @note PWR_WAKEUP_PINx and PWR_WAKEUP_PINx_HIGH are equivalent. + * @note (*) availability depends on devices + * @retval None + */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinPolarity) +{ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinPolarity)); + + /* Specifies the Wake-Up pin polarity for the event detection + (rising or falling edge) */ + MODIFY_REG(PWR->CR4, (PWR_CR4_WP & WakeUpPinPolarity), (WakeUpPinPolarity >> PWR_WUP_POLARITY_SHIFT)); + + /* Enable wake-up pin */ + SET_BIT(PWR->CR3, (PWR_CR3_EWUP & WakeUpPinPolarity)); +} + + +/** + * @brief Disable the WakeUp PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. + * This parameter can be one of the following values: + * @arg @ref PWR_WAKEUP_PIN1, PWR_WAKEUP_PIN2,PWR_WAKEUP_PIN3(*), + * PWR_WAKEUP_PIN4,PWR_WAKEUP_PIN5(*),PWR_WAKEUP_PIN6 + * @note (*) availability depends on devices + * @retval None + */ +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) +{ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + + CLEAR_BIT(PWR->CR3, (PWR_CR3_EWUP & WakeUpPinx)); +} + + +/** + * @brief Enter Sleep or Low-power Sleep mode. + * @note In Sleep/Low-power Sleep mode, all I/O pins keep the same state as + * in Run mode. + * @param Regulator Specifies the regulator state in Sleep/Low-power Sleep + * mode. This parameter can be one of the following values: + * @arg @ref PWR_MAINREGULATOR_ON Sleep mode (regulator in main mode) + * @arg @ref PWR_LOWPOWERREGULATOR_ON Low-power Sleep mode (regulator + * in low-power mode) + * @note Low-power Sleep mode is entered from Low-power Run mode only. In + * case Regulator parameter is set to Low Power but MCU is in Run mode, + * we will first enter in Low-power Run mode. Therefore, user should + * take care that HCLK frequency is less than 2 MHz. + * @note When exiting Low-power Sleep mode, the MCU is in Low-power Run mode. + * To switch back to Run mode, user must call + * HAL_PWREx_DisableLowPowerRunMode() API. + * @param SLEEPEntry Specifies if Sleep mode is entered with WFI or WFE + * instruction. This parameter can be one of the following values: + * @arg @ref PWR_SLEEPENTRY_WFI enter Sleep or Low-power Sleep + * mode with WFI instruction + * @arg @ref PWR_SLEEPENTRY_WFE enter Sleep or Low-power Sleep + * mode with WFE instruction + * @note When WFI entry is used, tick interrupt have to be disabled if not + * desired as the interrupt wake up source. + * @retval None + */ +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) +{ + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); + + /* Set Regulator parameter */ + if (Regulator != PWR_MAINREGULATOR_ON) + { + /* If in run mode, first move to low-power run mode. + The system clock frequency must be below 2 MHz at this point. */ + if ((PWR->SR2 & PWR_SR2_REGLPF) == 0x00u) + { + HAL_PWREx_EnableLowPowerRunMode(); + } + } + else + { + /* If in low-power run mode at this point, exit it */ + if ((PWR->SR2 & PWR_SR2_REGLPF) != 0x00u) + { + if (HAL_PWREx_DisableLowPowerRunMode() != HAL_OK) + { + return ; + } + } + } + + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* Select SLEEP mode entry -------------------------------------------------*/ + if (SLEEPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } +} + + +/** + * @brief Enter Stop mode + * @note This API is named HAL_PWR_EnterSTOPMode to ensure compatibility with + * legacy code running on devices where only "Stop mode" is mentioned + * with main or low power regulator ON. + * @note In Stop mode, all I/O pins keep the same state as in Run mode. + * @note All clocks in the VCORE domain are stopped; the PLL, the HSI and the + * HSE oscillators are disabled. Some peripherals with the wakeup + * capability can switch on the HSI to receive a frame, and switch off + * the HSI after receiving the frame if it is not a wakeup frame. + * SRAM and register contents are preserved. + * The BOR is available. + * The voltage regulator can be configured either in normal (Stop 0) or + * low-power mode (Stop 1). + * @note When exiting Stop 0 or Stop 1 mode by issuing an interrupt or a + * wakeup event, the HSI RC oscillator is selected as system clock + * @note When the voltage regulator operates in low power mode (Stop 1), + * an additional startup delay is incurred when waking up. By keeping + * the internal regulator ON during Stop mode (Stop 0), the consumption + * is higher although the startup time is reduced. + * @param Regulator Specifies the regulator state in Stop mode + * This parameter can be one of the following values: + * @arg @ref PWR_MAINREGULATOR_ON Stop 0 mode (main regulator ON) + * @arg @ref PWR_LOWPOWERREGULATOR_ON Stop 1 mode (low power + * regulator ON) + * @param STOPEntry Specifies Stop 0 or Stop 1 mode is entered with WFI or + * WFE instruction. This parameter can be one of the following values: + * @arg @ref PWR_STOPENTRY_WFI Enter Stop 0 or Stop 1 mode with WFI + * instruction. + * @arg @ref PWR_STOPENTRY_WFE Enter Stop 0 or Stop 1 mode with WFE + * instruction. + * @retval None + */ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) +{ + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + + if (Regulator != PWR_MAINREGULATOR_ON) + { + /* Stop mode with Low-Power Regulator */ + MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_LOWPOWERMODE_STOP1); + } + else + { + /* Stop mode with Main Regulator */ + MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_LOWPOWERMODE_STOP0); + } + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* Select Stop mode entry --------------------------------------------------*/ + if (STOPEntry == PWR_STOPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + + +/** + * @brief Enter Standby mode. + * @note In Standby mode, the PLL, the HSI and the HSE oscillators are + * switched off. The voltage regulator is disabled. SRAM and register + * contents are lost except for registers in the Backup domain and + * Standby circuitry. BOR is available. + * @note The I/Os can be configured either with a pull-up or pull-down or can + * be kept in analog state. + * HAL_PWREx_EnableGPIOPullUp() and HAL_PWREx_EnableGPIOPullDown() + * respectively enable Pull Up and PullDown state. + * HAL_PWREx_DisableGPIOPullUp() & HAL_PWREx_DisableGPIOPullDown() + * disable the same. These states are effective in Standby mode only if + * APC bit is set through HAL_PWREx_EnablePullUpPullDownConfig() API. + * @note Sram content can be kept setting RRS through HAL_PWREx_EnableSRAMRetention() + * @retval None + */ +void HAL_PWR_EnterSTANDBYMode(void) +{ + /* Set Stand-by mode */ + MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_LOWPOWERMODE_STANDBY); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM) + __force_stores(); +#endif /* __CC_ARM */ + + /* Request Wait For Interrupt */ + __WFI(); +} + + +/** + * @brief Enable Sleep-On-Exit Cortex feature + * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the + * processor enters SLEEP or DEEPSLEEP mode when an interruption + * handling is over returning to thread mode. Setting this bit is + * useful when the processor is expected to run only on interruptions + * handling. + * @retval None + */ +void HAL_PWR_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + + +/** + * @brief Disable Sleep-On-Exit Cortex feature + * @note Clear SLEEPONEXIT bit of SCR register. When this bit is set, the + * processor enters SLEEP or DEEPSLEEP mode when an interruption + * handling is over. + * @retval None + */ +void HAL_PWR_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + + +/** + * @brief Enable Cortex Sev On Pending feature. + * @note Set SEVONPEND bit of SCR register. When this bit is set, enabled + * events and all interrupts, including disabled ones can wakeup + * processor from WFE. + * @retval None + */ +void HAL_PWR_EnableSEVOnPend(void) +{ + /* Set SEVONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + + +/** + * @brief Disable Cortex Sev On Pending feature. + * @note Clear SEVONPEND bit of SCR register. When this bit is clear, only + * enable interrupts or events can wakeup processor from WFE + * @retval None + */ +void HAL_PWR_DisableSEVOnPend(void) +{ + /* Clear SEVONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c new file mode 100644 index 0000000..9f25d78 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c @@ -0,0 +1,1016 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_pwr_ex.c + * @author MCD Application Team + * @brief Extended PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Power Controller (PWR) peripheral: + * + Extended Initialization and de-initialization functions + * + Extended Peripheral Control functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWREx + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup PWR_Extended_Private_Defines PWR Extended Private Defines + * @{ + */ + +#if defined(PWR_PVD_SUPPORT) +/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask + * @{ + */ +#define PVD_MODE_IT 0x00010000U /*!< Mask for interruption yielded + by PVD threshold crossing */ +#define PVD_MODE_EVT 0x00020000U /*!< Mask for event yielded + by PVD threshold crossing */ +#define PVD_RISING_EDGE 0x00000001U /*!< Mask for rising edge set as + PVD trigger */ +#define PVD_FALLING_EDGE 0x00000002U /*!< Mask for falling edge set as + PVD trigger */ +/** + * @} + */ +#endif /* PWR_PVD_SUPPORT */ + +/** @defgroup PWREx_TimeOut_Value PWREx Flag Setting Time Out Value + * @{ + */ +#define PWR_REGLPF_SETTING_DELAY_6_US 6u /*!< REGLPF should rise in about 5 us plus + 2 APB clock. Taking in account max Sysclk at + 2 MHz, and rounded to upper value */ + +#define PWR_VOSF_SETTING_DELAY_6_US 6u /*!< VOSF should rise in about 5 us plus + 2 APB clock. Taking in account max Sysclk at + 16 MHz, and rounded to upper value */ +/** + * @} + */ + +/** @defgroup PWREx_Gpio_Pin_Number PWREx Gpio Pin Number + * @{ + */ +#define PWR_GPIO_PIN_NB 16u /*!< Number of gpio pin in bank */ +/** + * @} + */ + +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWREx_Exported_Functions PWR Extended Exported Functions + * @{ + */ + +/** @addtogroup PWREx_Exported_Functions_Group1 Extended Peripheral Control functions + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Extended Peripheral Initialization and de-initialization functions ##### + =============================================================================== + [..] + *** PVD configuration *** + ========================= + [..] + (+) The PVD is used to monitor the VDD power supply by comparing it to a + threshold selected by the PVD Level (PVDRT[2:0] & PVDFT[2:0] bits in + PWR CR2 register). + (+) PVDO flag is available to indicate if VDD/VDDA is higher or lower + than the PVD threshold. This event is internally connected to the EXTI + line 16 and can generate an interrupt if enabled. + (+) The PVD is stopped in Standby & Shutdown mode. + + *** PVM configuration *** + ========================= + [..] + +@endverbatim + * @{ + */ + +/** + * @brief Enable battery charging. + * @note When VDD is present, charge the external battery on VBAT through an + * internal resistor. + * @param ResistorSelection specifies the resistor impedance. + * This parameter can be one of the following values: + * @arg @ref PWR_BATTERY_CHARGING_RESISTOR_5 5 kOhms resistor + * @arg @ref PWR_BATTERY_CHARGING_RESISTOR_1_5 1.5 kOhms resistor + * @retval None + */ +void HAL_PWREx_EnableBatteryCharging(uint32_t ResistorSelection) +{ + uint32_t tmpreg; + assert_param(IS_PWR_BATTERY_RESISTOR_SELECT(ResistorSelection)); + + /* Specify resistor selection and enable battery charging */ + tmpreg = (PWR->CR4 & ~PWR_CR4_VBRS); + PWR->CR4 = (tmpreg | ResistorSelection | PWR_CR4_VBE); +} + + +/** + * @brief Disable battery charging. + * @retval None + */ +void HAL_PWREx_DisableBatteryCharging(void) +{ + CLEAR_BIT(PWR->CR4, PWR_CR4_VBE); +} + +#if defined(PWR_CR3_ENB_ULP) +/** + * @brief Enable POR Monitor sampling mode. + * @note When entering ultra low power modes (standby, shutdown) this feature + * can be enabled to reduce further consumption: Power On Reset monitor + * is then set in sampling mode, and no more in always on mode. + * @retval None + */ +void HAL_PWREx_EnablePORMonitorSampling(void) +{ + PWR->CR3 |= PWR_CR3_ENB_ULP; +} + + +/** + * @brief Disable POR Monitor sampling mode. + * @retval None + */ +void HAL_PWREx_DisablePORMonitorSampling(void) +{ + PWR->CR3 &= ~PWR_CR3_ENB_ULP; +} +#endif /* PWR_CR3_ENB_ULP */ + +#if defined(PWR_PVD_SUPPORT) +/** + * @brief Configure the Power Voltage Detector (PVD). + * @param sConfigPVD pointer to a PWR_PVDTypeDef structure that contains the + PVD configuration information: threshold levels, operating mode. + * @note Refer to the electrical characteristics of your device datasheet for + * more details about the voltage thresholds corresponding to each + * detection level. + * @note User should take care that rising threshold is higher than falling + * one in order to avoid having always PVDO output set. + * @retval HAL_OK + */ +HAL_StatusTypeDef HAL_PWREx_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) +{ + /* Check the parameters */ + assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); + assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); + + /* Set PVD level bits only according to PVDLevel value */ + MODIFY_REG(PWR->CR2, (PWR_CR2_PVDFT | PWR_CR2_PVDRT), sConfigPVD->PVDLevel); + + /* Clear any previous config, in case no event or IT mode is selected */ + __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); + __HAL_PWR_PVD_EXTI_DISABLE_IT(); + __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); + __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); + + /* Configure interrupt mode */ + if ((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) + { + __HAL_PWR_PVD_EXTI_ENABLE_IT(); + } + + /* Configure event mode */ + if ((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) + { + __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); + } + + /* Configure the edge */ + if ((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) + { + __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); + } + + if ((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) + { + __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); + } + + return HAL_OK; +} + + +/** + * @brief Enable the Power Voltage Detector (PVD). + * @retval None + */ +void HAL_PWREx_EnablePVD(void) +{ + SET_BIT(PWR->CR2, PWR_CR2_PVDE); +} + + +/** + * @brief Disable the Power Voltage Detector (PVD). + * @retval None + */ +void HAL_PWREx_DisablePVD(void) +{ + CLEAR_BIT(PWR->CR2, PWR_CR2_PVDE); +} +#endif /* PWR_PVD_SUPPORT */ + +#if defined(PWR_PVM_SUPPORT) +/** + * @brief Enable VDDUSB supply. + * @note Remove VDDUSB electrical and logical isolation, once VDDUSB supply is present. + * @retval None + */ +void HAL_PWREx_EnableVddUSB(void) +{ + SET_BIT(PWR->CR2, PWR_CR2_USV); +} + +/** + * @brief Disable VDDUSB supply. + * @retval None + */ +void HAL_PWREx_DisableVddUSB(void) +{ + CLEAR_BIT(PWR->CR2, PWR_CR2_USV); +} +#endif /* PWR_PVM_SUPPORT */ + +#if defined(PWR_CR2_IOSV) +/** + * @brief Enable VDDIO2 supply. + * @note Remove VDDIO2 electrical and logical isolation, once VDDIO2 supply is present. + * @retval None + */ +void HAL_PWREx_EnableVddIO2(void) +{ + SET_BIT(PWR->CR2, PWR_CR2_IOSV); +} + + +/** + * @brief Disable VDDIO2 supply. + * @retval None + */ +void HAL_PWREx_DisableVddIO2(void) +{ + CLEAR_BIT(PWR->CR2, PWR_CR2_IOSV); +} +#endif /* PWR_CR2_IOSV */ + +#if defined (PWR_PVM_SUPPORT) +/** + * @brief Enable the Power Voltage Monitoring for USB peripheral (power domain Vddio2) + * @retval None + */ +void HAL_PWREx_EnablePVMUSB(void) +{ + SET_BIT(PWR->CR2, PWR_PVM_USB); +} + +/** + * @brief Disable the Power Voltage Monitoring for USB peripheral (power domain Vddio2) + * @retval None + */ +void HAL_PWREx_DisablePVMUSB(void) +{ + CLEAR_BIT(PWR->CR2, PWR_PVM_USB); +} +#endif /* PWR_PVM_SUPPORT */ + +#if defined(PWR_PVM_SUPPORT) +/** + * @brief Configure the Peripheral Voltage Monitoring (PVM). + * @param sConfigPVM: pointer to a PWR_PVMTypeDef structure that contains the + * PVM configuration information. + * @note The API configures a single PVM according to the information contained + * in the input structure. To configure several PVMs, the API must be singly + * called for each PVM used. + * @note Refer to the electrical characteristics of your device datasheet for + * more details about the voltage thresholds corresponding to each + * detection level and to each monitored supply. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_ConfigPVM(PWR_PVMTypeDef *sConfigPVM) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_PWR_PVM_TYPE(sConfigPVM->PVMType)); + assert_param(IS_PWR_PVM_MODE(sConfigPVM->Mode)); + + /* Configure EXTI 34 interrupts if so required: + scan through PVMType to detect which PVMx is set and + configure the corresponding EXTI line accordingly. */ + switch (sConfigPVM->PVMType) + { + case PWR_PVM_USB: + /* Clear any previous config. Keep it clear if no event or IT mode is selected */ + __HAL_PWR_PVM_EXTI_DISABLE_EVENT(); + __HAL_PWR_PVM_EXTI_DISABLE_IT(); + __HAL_PWR_PVM_EXTI_DISABLE_FALLING_EDGE(); + __HAL_PWR_PVM_EXTI_DISABLE_RISING_EDGE(); + + /* Configure interrupt mode */ + if ((sConfigPVM->Mode & PVM_MODE_IT) == PVM_MODE_IT) + { + __HAL_PWR_PVM_EXTI_ENABLE_IT(); + } + + /* Configure event mode */ + if ((sConfigPVM->Mode & PVM_MODE_EVT) == PVM_MODE_EVT) + { + __HAL_PWR_PVM_EXTI_ENABLE_EVENT(); + } + + /* Configure the edge */ + if ((sConfigPVM->Mode & PVM_RISING_EDGE) == PVM_RISING_EDGE) + { + __HAL_PWR_PVM_EXTI_ENABLE_RISING_EDGE(); + } + + if ((sConfigPVM->Mode & PVM_FALLING_EDGE) == PVM_FALLING_EDGE) + { + __HAL_PWR_PVM_EXTI_ENABLE_FALLING_EDGE(); + } + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} +#endif /* PWR_PVM_SUPPORT */ +/** + * @brief Enable Internal Wake-up Line. + * @retval None + */ +void HAL_PWREx_EnableInternalWakeUpLine(void) +{ + SET_BIT(PWR->CR3, PWR_CR3_EIWUL); +} + +/** + * @brief Disable Internal Wake-up Line. + * @retval None + */ +void HAL_PWREx_DisableInternalWakeUpLine(void) +{ + CLEAR_BIT(PWR->CR3, PWR_CR3_EIWUL); +} + +/** + * @brief Enable GPIO pull-up state in Standby and Shutdown modes. + * @note Set the relevant PUy bit of PWR_PUCRx register to configure the I/O in + * pull-up state in Standby and Shutdown modes. + * @note This state is effective in Standby and Shutdown modes only if APC bit + * is set through HAL_PWREx_EnablePullUpPullDownConfig() API. + * @note The configuration is lost when exiting the Shutdown mode due to the + * power-on reset, maintained when exiting the Standby mode. + * @note To avoid any conflict at Standby and Shutdown modes exits, the corresponding + * PDy bit of PWR_PDCRx register is cleared unless it is reserved. + * @param GPIO Specify the IO port. This parameter can be PWR_GPIO_A, ..., PWR_GPIO_F + * to select the GPIO peripheral. + * @param GPIONumber Specify the I/O pins numbers. + * This parameter can be one of the following values: + * PWR_GPIO_BIT_0, ..., PWR_GPIO_BIT_15 (except for ports where less + * I/O pins are available) or the logical OR of several of them to set + * several bits for a given port in a single API call. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_EnableGPIOPullUp(uint32_t GPIO, uint32_t GPIONumber) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_PWR_GPIO(GPIO)); + assert_param(IS_PWR_GPIO_BIT_NUMBER(GPIONumber)); + + switch (GPIO) + { + case PWR_GPIO_A: + SET_BIT(PWR->PUCRA, (GPIONumber & ~PWR_GPIO_BIT_14)); + CLEAR_BIT(PWR->PDCRA, (GPIONumber & ~PWR_GPIO_BIT_13)); + break; + + case PWR_GPIO_B: + SET_BIT(PWR->PUCRB, GPIONumber); + CLEAR_BIT(PWR->PDCRB, GPIONumber); + break; + + case PWR_GPIO_C: + SET_BIT(PWR->PUCRC, GPIONumber); + CLEAR_BIT(PWR->PDCRC, GPIONumber); + break; + + case PWR_GPIO_D: + SET_BIT(PWR->PUCRD, GPIONumber); + CLEAR_BIT(PWR->PDCRD, GPIONumber); + break; + +#if defined(GPI0E) + case PWR_GPIO_E: + SET_BIT(PWR->PUCRE, GPIONumber); + CLEAR_BIT(PWR->PDCRE, GPIONumber); + break; +#endif /* GPI0E */ + case PWR_GPIO_F: + SET_BIT(PWR->PUCRF, GPIONumber); + CLEAR_BIT(PWR->PDCRF, GPIONumber); + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} + + +/** + * @brief Disable GPIO pull-up state in Standby mode and Shutdown modes. + * @note Reset the relevant PUy bit of PWR_PUCRx register used to configure the I/O + * in pull-up state in Standby and Shutdown modes. + * @param GPIO Specifies the IO port. This parameter can be PWR_GPIO_A, ..., PWR_GPIO_F + * to select the GPIO peripheral. + * @param GPIONumber Specify the I/O pins numbers. + * This parameter can be one of the following values: + * PWR_GPIO_BIT_0, ..., PWR_GPIO_BIT_15 (except for ports where less + * I/O pins are available) or the logical OR of several of them to reset + * several bits for a given port in a single API call. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_DisableGPIOPullUp(uint32_t GPIO, uint32_t GPIONumber) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_PWR_GPIO(GPIO)); + assert_param(IS_PWR_GPIO_BIT_NUMBER(GPIONumber)); + + switch (GPIO) + { + case PWR_GPIO_A: + CLEAR_BIT(PWR->PUCRA, (GPIONumber & ~PWR_GPIO_BIT_14)); + break; + + case PWR_GPIO_B: + CLEAR_BIT(PWR->PUCRB, GPIONumber); + break; + + case PWR_GPIO_C: + CLEAR_BIT(PWR->PUCRC, GPIONumber); + break; + + case PWR_GPIO_D: + CLEAR_BIT(PWR->PUCRD, GPIONumber); + break; + +#if defined(GPI0E) + case PWR_GPIO_E: + CLEAR_BIT(PWR->PUCRE, GPIONumber); + break; +#endif /* GPI0E */ + case PWR_GPIO_F: + CLEAR_BIT(PWR->PUCRF, GPIONumber); + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} + + +/** + * @brief Enable GPIO pull-down state in Standby and Shutdown modes. + * @note Set the relevant PDy bit of PWR_PDCRx register to configure the I/O in + * pull-down state in Standby and Shutdown modes. + * @note This state is effective in Standby and Shutdown modes only if APC bit + * is set through HAL_PWREx_EnablePullUpPullDownConfig() API. + * @note The configuration is lost when exiting the Shutdown mode due to the + * power-on reset, maintained when exiting the Standby mode. + * @note To avoid any conflict at Standby and Shutdown modes exits, the corresponding + * PUy bit of PWR_PUCRx register is cleared unless it is reserved. + * @param GPIO Specify the IO port. This parameter can be PWR_GPIO_A..PWR_GPIO_F + * to select the GPIO peripheral. + * @param GPIONumber Specify the I/O pins numbers. + * This parameter can be one of the following values: + * PWR_GPIO_BIT_0, ..., PWR_GPIO_BIT_15 (except for ports where less + * I/O pins are available) or the logical OR of several of them to set + * several bits for a given port in a single API call. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_EnableGPIOPullDown(uint32_t GPIO, uint32_t GPIONumber) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_PWR_GPIO(GPIO)); + assert_param(IS_PWR_GPIO_BIT_NUMBER(GPIONumber)); + + switch (GPIO) + { + case PWR_GPIO_A: + SET_BIT(PWR->PDCRA, (GPIONumber & ~PWR_GPIO_BIT_13)); + CLEAR_BIT(PWR->PUCRA, (GPIONumber & ~PWR_GPIO_BIT_14)); + break; + + case PWR_GPIO_B: + SET_BIT(PWR->PDCRB, GPIONumber); + CLEAR_BIT(PWR->PUCRB, GPIONumber); + break; + + case PWR_GPIO_C: + SET_BIT(PWR->PDCRC, GPIONumber); + CLEAR_BIT(PWR->PUCRC, GPIONumber); + break; + + case PWR_GPIO_D: + SET_BIT(PWR->PDCRD, GPIONumber); + CLEAR_BIT(PWR->PUCRD, GPIONumber); + break; + +#if defined(GPIOE) + case PWR_GPIO_E: + SET_BIT(PWR->PDCRE, GPIONumber); + CLEAR_BIT(PWR->PUCRE, GPIONumber); + break; +#endif /* GPI0E */ + case PWR_GPIO_F: + SET_BIT(PWR->PDCRF, GPIONumber); + CLEAR_BIT(PWR->PUCRF, GPIONumber); + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} + + +/** + * @brief Disable GPIO pull-down state in Standby and Shutdown modes. + * @note Reset the relevant PDy bit of PWR_PDCRx register used to configure the I/O + * in pull-down state in Standby and Shutdown modes. + * @param GPIO Specifies the IO port. This parameter can be PWR_GPIO_A..PWR_GPIO_F + * to select the GPIO peripheral. + * @param GPIONumber Specify the I/O pins numbers. + * This parameter can be one of the following values: + * PWR_GPIO_BIT_0, ..., PWR_GPIO_BIT_15 (except for ports where less + * I/O pins are available) or the logical OR of several of them to reset + * several bits for a given port in a single API call. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_DisableGPIOPullDown(uint32_t GPIO, uint32_t GPIONumber) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_PWR_GPIO(GPIO)); + assert_param(IS_PWR_GPIO_BIT_NUMBER(GPIONumber)); + + switch (GPIO) + { + case PWR_GPIO_A: + CLEAR_BIT(PWR->PDCRA, (GPIONumber & ~PWR_GPIO_BIT_13)); + break; + + case PWR_GPIO_B: + CLEAR_BIT(PWR->PDCRB, GPIONumber); + break; + + case PWR_GPIO_C: + CLEAR_BIT(PWR->PDCRC, GPIONumber); + break; + + case PWR_GPIO_D: + CLEAR_BIT(PWR->PDCRD, GPIONumber); + break; + +#if defined(GPIOE) + case PWR_GPIO_E: + CLEAR_BIT(PWR->PDCRE, GPIONumber); + break; +#endif /* GPI0E */ + case PWR_GPIO_F: + CLEAR_BIT(PWR->PDCRF, GPIONumber); + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} + + +/** + * @brief Enable pull-up and pull-down configuration. + * @note When APC bit is set, the I/O pull-up and pull-down configurations defined in + * PWR_PUCRx and PWR_PDCRx registers are applied in Standby and Shutdown modes. + * @note Pull-up set by PUy bit of PWR_PUCRx register is not activated if the corresponding + * PDy bit of PWR_PDCRx register is also set (pull-down configuration priority is higher). + * HAL_PWREx_EnableGPIOPullUp() and HAL_PWREx_EnableGPIOPullDown() APIs ensure there + * is no conflict when setting PUy or PDy bit. + * @retval None + */ +void HAL_PWREx_EnablePullUpPullDownConfig(void) +{ + SET_BIT(PWR->CR3, PWR_CR3_APC); +} + +/** + * @brief Disable pull-up and pull-down configuration. + * @note When APC bit is cleared, the I/O pull-up and pull-down configurations defined in + * PWR_PUCRx and PWR_PDCRx registers are not applied in Standby and Shutdown modes. + * @retval None + */ +void HAL_PWREx_DisablePullUpPullDownConfig(void) +{ + CLEAR_BIT(PWR->CR3, PWR_CR3_APC); +} + +#if defined(PWR_CR3_RRS) +/** + * @brief Enable SRAM content retention in Standby mode. + * @note When RRS bit is set, SRAM is powered by the low-power regulator in + * Standby mode and its content is kept. + * @retval None + */ +void HAL_PWREx_EnableSRAMRetention(void) +{ + SET_BIT(PWR->CR3, PWR_CR3_RRS); +} + + +/** + * @brief Disable SRAM content retention in Standby mode. + * @note When RRS bit is reset, SRAM is powered off in Standby mode + * and its content is lost. + * @retval None + */ +void HAL_PWREx_DisableSRAMRetention(void) +{ + CLEAR_BIT(PWR->CR3, PWR_CR3_RRS); +} +#endif /* PWR_CR3_RRS */ + +/** + * @brief Enable Flash Power Down. + * @note This API allows to enable flash power down capabilities in low power + * run, low power sleep and stop modes. + * @param PowerMode this can be a combination of following values: + * @arg @ref PWR_FLASHPD_LPRUN + * @arg @ref PWR_FLASHPD_LPSLEEP + * @arg @ref PWR_FLASHPD_STOP + * @retval None + */ +void HAL_PWREx_EnableFlashPowerDown(uint32_t PowerMode) +{ + assert_param(IS_PWR_FLASH_POWERDOWN(PowerMode)); + + PWR->CR1 |= PowerMode; +} + + +/** + * @brief Disable Flash Power Down. + * @note This API allows to disable flash power down capabilities in low power + * run, low power sleep and stop modes. + * @param PowerMode this can be a combination of following values: + * @arg @ref PWR_FLASHPD_LPRUN + * @arg @ref PWR_FLASHPD_LPSLEEP + * @arg @ref PWR_FLASHPD_STOP + * @retval None + */ +void HAL_PWREx_DisableFlashPowerDown(uint32_t PowerMode) +{ + assert_param(IS_PWR_FLASH_POWERDOWN(PowerMode)); + + PWR->CR1 &= ~PowerMode; +} + + +/** + * @brief Return Voltage Scaling Range. + * @retval VOS bit field: + * @arg @ref PWR_REGULATOR_VOLTAGE_SCALE1 + * @arg @ref PWR_REGULATOR_VOLTAGE_SCALE2 + */ +uint32_t HAL_PWREx_GetVoltageRange(void) +{ + return (PWR->CR1 & PWR_CR1_VOS); +} + + +/** + * @brief Configure the main regulator output voltage. + * @param VoltageScaling specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption. + * This parameter can be one of the following values: + * @arg @ref PWR_REGULATOR_VOLTAGE_SCALE1 Regulator voltage output range 1 mode, + * typical output voltage at 1.2 V, + * system frequency up to 64 MHz. + * @arg @ref PWR_REGULATOR_VOLTAGE_SCALE2 Regulator voltage output range 2 mode, + * typical output voltage at 1.0 V, + * system frequency up to 16 MHz. + * @note When moving from Range 1 to Range 2, the system frequency must be decreased to + * a value below 16 MHz before calling HAL_PWREx_ControlVoltageScaling() API. + * When moving from Range 2 to Range 1, the system frequency can be increased to + * a value up to 64 MHz after calling HAL_PWREx_ControlVoltageScaling() API. + * @note When moving from Range 2 to Range 1, the API waits for VOSF flag to be + * cleared before returning the status. If the flag is not cleared within + * 6 microseconds, HAL_TIMEOUT status is reported. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) +{ + uint32_t wait_loop_index; + + assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); + + /* Modify voltage scaling range */ + MODIFY_REG(PWR->CR1, PWR_CR1_VOS, VoltageScaling); + + /* In case of Range 1 selected, we need to ensure that main regulator reaches new value */ + if (VoltageScaling == PWR_REGULATOR_VOLTAGE_SCALE1) + { + /* Set timeout value */ + wait_loop_index = ((PWR_VOSF_SETTING_DELAY_6_US * SystemCoreClock) / 1000000U) + 1U; + + /* Wait until VOSF is reset */ + while (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_VOSF)) + { + if (wait_loop_index != 0U) + { + wait_loop_index--; + } + else + { + return HAL_TIMEOUT; + } + } + } + + return HAL_OK; +} + + + +/** + * @brief Enter Low-power Run mode + * @note System clock frequency has to be decreased below 2 MHz before entering + * low power run mode + * @note In Low-power Run mode, all I/O pins keep the same state as in Run mode. + * @retval None + */ +void HAL_PWREx_EnableLowPowerRunMode(void) +{ + /* Set Regulator parameter */ + SET_BIT(PWR->CR1, PWR_CR1_LPR); +} + + +/** + * @brief Exit Low-power Run mode. + * @note Before HAL_PWREx_DisableLowPowerRunMode() completion, the function checks that + * REGLPF has been properly reset (otherwise, HAL_PWREx_DisableLowPowerRunMode + * returns HAL_TIMEOUT status). The system clock frequency can then be + * increased above 2 MHz. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_DisableLowPowerRunMode(void) +{ + uint32_t wait_loop_index = ((PWR_REGLPF_SETTING_DELAY_6_US * SystemCoreClock) / 1000000U) + 1U; + + /* Clear LPR bit */ + CLEAR_BIT(PWR->CR1, PWR_CR1_LPR); + + /* Wait until REGLPF is reset */ + while (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_REGLPF)) + { + if (wait_loop_index != 0U) + { + wait_loop_index--; + } + else + { + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + + +#if defined(PWR_SHDW_SUPPORT) +/** + * @brief Enter Shutdown mode. + * @note In Shutdown mode, the PLL, the HSI, the LSI and the HSE oscillators are switched + * off. The voltage regulator is disabled and Vcore domain is powered off. + * SRAM and registers contents are lost except for registers in the Backup domain. + * The BOR is not available. + * @note The I/Os can be configured either with a pull-up or pull-down or can + * be kept in analog state. + * HAL_PWREx_EnableGPIOPullUp() and HAL_PWREx_EnableGPIOPullDown() + * respectively enable Pull Up and PullDown state. + * HAL_PWREx_DisableGPIOPullUp() & HAL_PWREx_DisableGPIOPullDown() + * disable the same. These states are effective in Standby mode only if + * APC bit is set through HAL_PWREx_EnablePullUpPullDownConfig() API. + * @retval None + + * @retval None + */ +void HAL_PWREx_EnterSHUTDOWNMode(void) +{ + /* Set Shutdown mode */ + MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_LOWPOWERMODE_SHUTDOWN); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM) + __force_stores(); +#endif /* __CC_ARM */ + + /* Request Wait For Interrupt */ + __WFI(); +} +#endif /* PWR_SHDW_SUPPORT */ + +#if defined(PWR_PVD_SUPPORT) && defined(PWR_PVM_SUPPORT) +/** + * @brief This function handles the PWR PVD interrupt request. + * @note This API should be called under the PVD_IRQHandler(). + * @retval None + */ +void HAL_PWREx_PVD_PVM_IRQHandler(void) +{ + /* Check PWR PVD exti Rising flag */ + if (__HAL_PWR_PVD_EXTI_GET_RISING_FLAG() != 0x0U) + { + /* Clear PVD exti pending bit */ + __HAL_PWR_PVD_EXTI_CLEAR_RISING_FLAG(); + + /* PWR PVD interrupt rising user callback */ + HAL_PWREx_PVD_PVM_Rising_Callback(); + } + + /* Check PWR exti fallling flag */ + if (__HAL_PWR_PVD_EXTI_GET_FALLING_FLAG() != 0x0U) + { + /* Clear PVD exti pending bit */ + __HAL_PWR_PVD_EXTI_CLEAR_FALLING_FLAG(); + + /* PWR PVD interrupt falling user callback */ + HAL_PWREx_PVD_PVM_Falling_Callback(); + } + + /* Check PWR PVM exti Rising flag */ + if (__HAL_PWR_PVM_EXTI_GET_RISING_FLAG() != 0x0U) + { + /* Clear PVM exti pending bit */ + __HAL_PWR_PVM_EXTI_CLEAR_RISING_FLAG(); + + /* PWR PVD PVM interrupt rising user callback */ + HAL_PWREx_PVD_PVM_Rising_Callback(); + } + + /* Check PWR PVM exti fallling flag */ + if (__HAL_PWR_PVM_EXTI_GET_FALLING_FLAG() != 0x0U) + { + /* Clear PVM exti pending bit */ + __HAL_PWR_PVM_EXTI_CLEAR_FALLING_FLAG(); + + /* PWR PVM interrupt falling user callback */ + HAL_PWREx_PVD_PVM_Falling_Callback(); + } +} + +/** + * @brief PWR PVD interrupt rising callback + * @retval None + */ +__weak void HAL_PWREx_PVD_PVM_Rising_Callback(void) +{ + /* NOTE : This function should not be modified; when the callback is needed, + the HAL_PWR_PVD_Rising_Callback can be implemented in the user file + */ +} + +/** + * @brief PWR PVD interrupt Falling callback + * @retval None + */ +__weak void HAL_PWREx_PVD_PVM_Falling_Callback(void) +{ + /* NOTE : This function should not be modified; when the callback is needed, + the HAL_PWR_PVD_Falling_Callback can be implemented in the user file + */ +} +#elif defined(PWR_PVD_SUPPORT) +/** + * @brief This function handles the PWR PVD interrupt request. + * @note This API should be called under the PVD_IRQHandler(). + * @retval None + */ +void HAL_PWREx_PVD_IRQHandler(void) +{ + /* Check PWR exti Rising flag */ + if (__HAL_PWR_PVD_EXTI_GET_RISING_FLAG() != 0x0U) + { + /* Clear PVD exti pending bit */ + __HAL_PWR_PVD_EXTI_CLEAR_RISING_FLAG(); + + /* PWR PVD interrupt rising user callback */ + HAL_PWREx_PVD_Rising_Callback(); + } + + /* Check PWR exti fallling flag */ + if (__HAL_PWR_PVD_EXTI_GET_FALLING_FLAG() != 0x0U) + { + /* Clear PVD exti pending bit */ + __HAL_PWR_PVD_EXTI_CLEAR_FALLING_FLAG(); + + /* PWR PVD interrupt falling user callback */ + HAL_PWREx_PVD_Falling_Callback(); + } +} + +/** + * @brief PWR PVD interrupt rising callback + * @retval None + */ +__weak void HAL_PWREx_PVD_Rising_Callback(void) +{ + /* NOTE : This function should not be modified; when the callback is needed, + the HAL_PWR_PVD_Rising_Callback can be implemented in the user file + */ +} + +/** + * @brief PWR PVD interrupt Falling callback + * @retval None + */ +__weak void HAL_PWREx_PVD_Falling_Callback(void) +{ + /* NOTE : This function should not be modified; when the callback is needed, + the HAL_PWR_PVD_Falling_Callback can be implemented in the user file + */ +} + +#endif /* PWR_PVD_SUPPORT && PWR_PVM_SUPPORT */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c new file mode 100644 index 0000000..4e97f0b --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c @@ -0,0 +1,1457 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_rcc.c + * @author MCD Application Team + * @brief RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Reset and Clock Control (RCC) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### RCC specific features ##### + ============================================================================== + [..] + After reset the device is running from High Speed Internal oscillator + (from 8 MHz to reach 16MHz) with Flash 0 wait state. Flash prefetch buffer, + D-Cache and I-Cache are disabled, and all peripherals are off except internal + SRAM, Flash and JTAG. + + (+) There is no prescaler on High speed (AHB) and Low speed (APB) buses: + all peripherals mapped on these buses are running at HSI speed. + (+) The clock for all peripherals is switched off, except the SRAM and FLASH. + (+) All GPIOs are in analog mode, except the JTAG pins which + are assigned to be used for debug purpose. + + [..] + Once the device started from reset, the user application has to: + (+) Configure the clock source to be used to drive the System clock + (if the application needs higher frequency/performance) + (+) Configure the System clock frequency and Flash settings + (+) Configure the AHB and APB buses prescalers + (+) Enable the clock for the peripheral(s) to be used + (+) Configure the clock source(s) for peripherals which clocks are not + derived from the System clock (RTC, ADC, RNG, HSTIM) + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup RCC RCC + * @brief RCC HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup RCC_Private_Constants RCC Private Constants + * @{ + */ +#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT +#define HSI_TIMEOUT_VALUE (2U) /* 2 ms (minimum Tick + 1) */ +#define LSI_TIMEOUT_VALUE (2U) /* 2 ms (minimum Tick + 1) */ +#define PLL_TIMEOUT_VALUE (2U) /* 2 ms (minimum Tick + 1) */ + +#if defined(RCC_HSI48_SUPPORT) +#define HSI48_TIMEOUT_VALUE (2U) /* 2 ms (minimum Tick + 1) */ +#endif /* RCC_HSI48_SUPPORT */ +#define CLOCKSWITCH_TIMEOUT_VALUE (5000U) /* 5 s */ + +#define PLLSOURCE_NONE (0U) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/** @defgroup RCC_Private_Macros RCC Private Macros + * @{ + */ +#define MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define MCO1_GPIO_PORT GPIOA +#define MCO1_PIN GPIO_PIN_8 + +#if defined(RCC_MCO2_SUPPORT) +#define MCO2_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define MCO2_GPIO_PORT GPIOA +#define MCO2_PIN GPIO_PIN_10 +#endif /* RCC_MCO2_SUPPORT */ + +#define RCC_PLL_OSCSOURCE_CONFIG(__HAL_RCC_PLLSOURCE__) \ + (MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (uint32_t)(__HAL_RCC_PLLSOURCE__))) +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Variables RCC Private Variables + * @{ + */ + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * + @verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to configure the internal and external oscillators + (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System buses clocks (SYSCLK, AHB, APB) + + [..] Internal/external clock and PLL configuration + (+) HSI (high-speed internal): 16 MHz factory-trimmed RC used directly or through + the PLL as System clock source. + + (+) LSI (low-speed internal): 32 KHz low consumption RC used as IWDG and/or RTC + clock source. + + (+) HSE (high-speed external): 4 to 48 MHz crystal oscillator used directly or + through the PLL as System clock source. Can be used also optionally as RTC clock source. + + (+) LSE (low-speed external): 32.768 KHz oscillator used optionally as RTC clock source. + + (+) PLL (clocked by HSI, HSE) providing up to three independent output clocks: + (++) The first output (R) is used to generate the high speed system clock (up to 64MHz). + (++) The second output(Q) is used to generate the clock for the random analog generator and HStim. + (++) The Third output (P) is used to generate the clock for the Analog to Digital Converter and I2S. + + (+) CSS (Clock security system): once enabled, if a HSE or LSE clock failure occurs + (HSE used directly or through PLL as System clock source), the System clock + is automatically switched respectively to HSI or LSI and an interrupt is generated + if enabled. The interrupt is linked to the Cortex-M0+ NMI (Non-Maskable Interrupt) + exception vector. + + (+) MCOx (microcontroller clock output): + (++) MCO1 used to output LSI, HSI48(*), HSI, LSE, HSE or main PLL clock (through a configurable prescaler) on PA8 pin. + (++) MCO2(*) used to output LSI, HSI48(*), HSI, LSE, HSE, main PLLR clock, PLLQ clock, PLLP clock, RTC clock or RTC_Wakeup (through a configurable prescaler) on PA10 pin. + (*) available on certain devices only + + [..] System, AHB and APB buses clocks configuration + (+) Several clock sources can be used to drive the System clock (SYSCLK): HSI, + HSE, LSI, LSE and main PLL. + The AHB clock (HCLK) is derived from System clock through configurable + prescaler and used to clock the CPU, memory and peripherals mapped + on AHB bus (DMA, GPIO...).and APB (PCLK1) clock is derived + from AHB clock through configurable prescalers and used to clock + the peripherals mapped on these buses. You can use + "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. + + -@- All the peripheral clocks are derived from the System clock (SYSCLK) except: + + (+@) RTC: the RTC clock can be derived either from the LSI, LSE or HSE clock + divided by 2 to 31. + You have to use __HAL_RCC_RTC_ENABLE() and HAL_RCCEx_PeriphCLKConfig() function + to configure this clock. + + (+@) RNG(*) requires a frequency equal or lower than 48 MHz. + This clock is derived from the main PLL or HSI or System clock. + (*) available on certain devices only + + (+@) IWDG clock which is always the LSI clock. + + + (+) The maximum frequency of the SYSCLK, HCLK, PCLK is 64 MHz. + Depending on the device voltage range, the maximum frequency should be + adapted accordingly. + + @endverbatim + + (++) Table 1. HCLK clock frequency. + (++) +-------------------------------------------------------+ + (++) | Latency | HCLK clock frequency (MHz) | + (++) | |-------------------------------------| + (++) | | voltage range 1 | voltage range 2 | + (++) | | 1.2 V | 1.0 V | + (++) |-----------------|------------------|------------------| + (++) |0WS(1 CPU cycles)| HCLK <= 24 | HCLK <= 8 | + (++) |-----------------|------------------|------------------| + (++) |1WS(2 CPU cycles)| HCLK <= 48 | HCLK <= 16 | + (++) |-----------------|------------------|------------------| + (++) |2WS(3 CPU cycles)| HCLK <= 64 | - | + (++) |-----------------|------------------|------------------| + * @{ + */ + +/** + * @brief Reset the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE, PLL OFF + * - AHB and APB prescaler set to 1. + * - CSS, MCO1 OFF + * - All interrupts disabled + * @note This function does not modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + uint32_t tickstart; + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Set HSION bit to the reset value */ + SET_BIT(RCC->CR, RCC_CR_HSION); + + /* Wait till HSI is ready */ + while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Set HSITRIM[6:0] bits to the reset value */ + RCC->ICSCR = RCC_ICSCR_HSITRIM_6; + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Reset CFGR register (HSI is selected as system clock source) */ + RCC->CFGR = 0x00000000u; + + /* Wait till HSI is ready */ + while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != 0U) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Clear CR register in 2 steps: first to clear HSEON in case bypass was enabled */ + RCC->CR = RCC_CR_HSION; + + /* Then again to HSEBYP in case bypass was enabled */ + RCC->CR = RCC_CR_HSION; + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* once PLL is OFF, reset PLLCFGR register to default value */ + RCC->PLLCFGR = RCC_PLLCFGR_PLLN_4; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000u; + + /* Clear all flags */ + RCC->CICR = 0xFFFFFFFFu; + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HSI_VALUE; + + /* Adapt Systick interrupt period */ + if (HAL_InitTick(uwTickPrio) != HAL_OK) + { + return HAL_ERROR; + } + else + { + return HAL_OK; + } +} + +/** + * @brief Initialize the RCC Oscillators according to the specified parameters in the + * @ref RCC_OscInitTypeDef. + * @param RCC_OscInitStruct pointer to a @ref RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC Oscillators. + * @note The PLL is not disabled when used as system clock. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this function. User should request a transition to HSE Off + * first and then to HSE On or HSE Bypass. + * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not + * supported by this function. User should request a transition to LSE Off + * first and then to LSE On or LSE Bypass. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + uint32_t tickstart; + uint32_t temp_sysclksrc; + uint32_t temp_pllckcfg; + + /* Check Null pointer */ + if (RCC_OscInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + + /*------------------------------- HSE Configuration ------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + + temp_sysclksrc = __HAL_RCC_GET_SYSCLK_SOURCE(); + temp_pllckcfg = __HAL_RCC_GET_PLL_OSCSOURCE(); + + /* When the HSE is used as system clock or clock source for PLL in these cases it is not allowed to be disabled */ + if (((temp_sysclksrc == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (temp_pllckcfg == RCC_PLLSOURCE_HSE)) + || (temp_sysclksrc == RCC_SYSCLKSOURCE_STATUS_HSE)) + { + if ((READ_BIT(RCC->CR, RCC_CR_HSERDY) != 0U) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + + /* Check the HSE State */ + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while (READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != 0U) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_HSI_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + assert_param(IS_RCC_HSIDIV(RCC_OscInitStruct->HSIDiv)); + + /* Check if HSI16 is used as system clock or as PLL source when PLL is selected as system clock */ + temp_sysclksrc = __HAL_RCC_GET_SYSCLK_SOURCE(); + temp_pllckcfg = __HAL_RCC_GET_PLL_OSCSOURCE(); + if (((temp_sysclksrc == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (temp_pllckcfg == RCC_PLLSOURCE_HSI)) + || (temp_sysclksrc == RCC_SYSCLKSOURCE_STATUS_HSI)) + { + /* When HSI is used as system clock or as PLL input clock it can not be disabled */ + if ((READ_BIT(RCC->CR, RCC_CR_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + + if (temp_sysclksrc == RCC_SYSCLKSOURCE_STATUS_HSI) + { + /* Adjust the HSI16 division factor */ + __HAL_RCC_HSI_CONFIG(RCC_OscInitStruct->HSIDiv); + + /* Update the SystemCoreClock global variable with HSISYS value */ + SystemCoreClock = (HSI_VALUE / (1UL << ((READ_BIT(RCC->CR, RCC_CR_HSIDIV)) >> RCC_CR_HSIDIV_Pos))); + } + + /* Adapt Systick interrupt period */ + if (HAL_InitTick(uwTickPrio) != HAL_OK) + { + return HAL_ERROR; + } + } + } + else + { + /* Check the HSI State */ + if (RCC_OscInitStruct->HSIState != RCC_HSI_OFF) + { + /* Configure the HSI16 division factor */ + __HAL_RCC_HSI_CONFIG(RCC_OscInitStruct->HSIDiv); + + /* Enable the Internal High Speed oscillator (HSI16). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI16). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) != 0U) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check if LSI is used as system clock */ + if (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_LSI) + { + /* When LSI is used as system clock it will not be disabled */ + if ((((RCC->CSR) & RCC_CSR_LSIRDY) != 0U) && (RCC_OscInitStruct->LSIState == RCC_LSI_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Check the LSI State */ + if (RCC_OscInitStruct->LSIState != RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == 0U) + { + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is disabled */ + while (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) != 0U) + { + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* When the LSE is used as system clock, it is not allowed disable it */ + if (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_LSE) + { + if ((((RCC->BDCR) & RCC_BDCR_LSERDY) != 0U) && (RCC_OscInitStruct->LSEState == RCC_LSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if (__HAL_RCC_PWR_IS_CLK_DISABLED() != 0U) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR1, PWR_CR1_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + + /* Check the LSE State */ + if (RCC_OscInitStruct->LSEState != RCC_LSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == 0U) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is disabled */ + while (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) != 0U) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Restore clock configuration if changed */ + if (pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + } +#if defined(RCC_HSI48_SUPPORT) + /*------------------------------ HSI48 Configuration -----------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI48) == RCC_OSCILLATORTYPE_HSI48) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI48(RCC_OscInitStruct->HSI48State)); + + /* Check the LSI State */ + if (RCC_OscInitStruct->HSI48State != RCC_HSI48_OFF) + { + /* Enable the Internal Low Speed oscillator (HSI48). */ + __HAL_RCC_HSI48_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI48 is ready */ + while (READ_BIT(RCC->CR, RCC_CR_HSI48RDY) == 0U) + { + if ((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (HSI48). */ + __HAL_RCC_HSI48_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI48 is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_HSI48RDY) != 0U) + { + if ((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } +#endif /* RCC_HSI48_SUPPORT */ + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + + if (RCC_OscInitStruct->PLL.PLLState != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + { + if (RCC_OscInitStruct->PLL.PLLState == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); + assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); + assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); +#if defined(RCC_PLLQ_SUPPORT) + assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); +#endif /* RCC_PLLQ_SUPPORT */ + assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ +#if defined(RCC_PLLQ_SUPPORT) + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + RCC_OscInitStruct->PLL.PLLM, + RCC_OscInitStruct->PLL.PLLN, + RCC_OscInitStruct->PLL.PLLP, + RCC_OscInitStruct->PLL.PLLQ, + RCC_OscInitStruct->PLL.PLLR); +#else /* !RCC_PLLQ_SUPPORT */ + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + RCC_OscInitStruct->PLL.PLLM, + RCC_OscInitStruct->PLL.PLLN, + RCC_OscInitStruct->PLL.PLLP, + RCC_OscInitStruct->PLL.PLLR); +#endif /* RCC_PLLQ_SUPPORT */ + + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Enable PLLR Clock output. */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLRCLK); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0U) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Unselect main PLL clock source and disable main PLL outputs to save power */ +#if defined(RCC_PLLQ_SUPPORT) + RCC->PLLCFGR &= ~(RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLPEN | RCC_PLLCFGR_PLLQEN | RCC_PLLCFGR_PLLREN); +#else + RCC->PLLCFGR &= ~(RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLPEN | RCC_PLLCFGR_PLLREN); +#endif /* RCC_PLLQ_SUPPORT */ + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + { + return HAL_ERROR; + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + temp_pllckcfg = RCC->PLLCFGR; + if ((READ_BIT(temp_pllckcfg, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(temp_pllckcfg, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(temp_pllckcfg, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(temp_pllckcfg, RCC_PLLCFGR_PLLP) != RCC_OscInitStruct->PLL.PLLP) || +#if defined (RCC_PLLQ_SUPPORT) + (READ_BIT(temp_pllckcfg, RCC_PLLCFGR_PLLQ) != RCC_OscInitStruct->PLL.PLLQ) || +#endif /* RCC_PLLQ_SUPPORT */ + (READ_BIT(temp_pllckcfg, RCC_PLLCFGR_PLLR) != RCC_OscInitStruct->PLL.PLLR)) + { + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief Initialize the CPU, AHB and APB buses clocks according to the specified + * parameters in the RCC_ClkInitStruct. + * @param RCC_ClkInitStruct pointer to a @ref RCC_ClkInitTypeDef structure that + * contains the configuration information for the RCC peripheral. + * @param FLatency FLASH Latency + * This parameter can be one of the following values: + * @arg FLASH_LATENCY_0 FLASH 0 Latency cycle + * @arg FLASH_LATENCY_1 FLASH 1 Latency cycle + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated by @ref HAL_RCC_GetHCLKFreq() function called within this function + * + * @note The HSI is used by default as system clock source after + * startup from Reset, wake-up from STANDBY mode. After restart from Reset, + * the HSI frequency is set to 8 Mhz, then it reaches its default value 16 MHz. + * + * @note The HSI can be selected as system clock source after + * from STOP modes or in case of failure of the HSE used directly or indirectly + * as system clock (if the Clock Security System CSS is enabled). + * + * @note The LSI can be selected as system clock source after + * in case of failure of the LSE used directly or indirectly + * as system clock (if the Clock Security System LSECSS is enabled). + * + * @note A switch from one clock source to another occurs only if the target + * clock source is ready (clock stable after startup delay or PLL locked). + * If a clock source which is not yet ready is selected, the switch will + * occur when the clock source is ready. + * + * @note You can use @ref HAL_RCC_GetClockConfig() function to know which clock is + * currently used as system clock source. + * + * @note Depending on the device voltage range, the software has to set correctly + * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency + * (for more details refer to section above "Initialization/de-initialization functions") + * @retval None + */ +HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) +{ + uint32_t tickstart; + + /* Check Null pointer */ + if (RCC_ClkInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); + assert_param(IS_FLASH_LATENCY(FLatency)); + + /* To correctly read data from FLASH memory, the number of wait states (LATENCY) + must be correctly programmed according to the frequency of the FLASH clock + (HCLK) and the supply voltage of the device. */ + + /* Increasing the number of wait states because of higher CPU frequency */ + if (FLatency > __HAL_FLASH_GET_LATENCY()) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by polling the FLASH_ACR register */ + tickstart = HAL_GetTick(); + + while ((FLASH->ACR & FLASH_ACR_LATENCY) != FLatency) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /*-------------------------- HCLK Configuration --------------------------*/ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + { + /* Set the highest APB divider in order to ensure that we do not go through + a non-spec phase whatever we decrease or increase HCLK. */ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE, RCC_HCLK_DIV16); + } + + /* Set the new HCLK clock divider */ + assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + } + + /*------------------------- SYSCLK Configuration ---------------------------*/ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + { + assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); + + /* HSE is selected as System Clock Source */ + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + { + /* Check the HSE ready flag */ + if (READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U) + { + return HAL_ERROR; + } + } + /* PLL is selected as System Clock Source */ + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + { + /* Check the PLL ready flag */ + if (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0U) + { + return HAL_ERROR; + } + } + /* HSI is selected as System Clock Source */ + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSI) + { + /* Check the HSI ready flag */ + if (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U) + { + return HAL_ERROR; + } + } + /* LSI is selected as System Clock Source */ + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_LSI) + { + /* Check the LSI ready flag */ + if (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == 0U) + { + return HAL_ERROR; + } + } + /* LSE is selected as System Clock Source */ + else + { + /* Check the LSE ready flag */ + if (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == 0U) + { + return HAL_ERROR; + } + } + MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_ClkInitStruct->SYSCLKSource); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Decreasing the number of wait states because of lower CPU frequency */ + if (FLatency < __HAL_FLASH_GET_LATENCY()) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by polling the FLASH_ACR register */ + tickstart = HAL_GetTick(); + + while ((FLASH->ACR & FLASH_ACR_LATENCY) != FLatency) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /*-------------------------- PCLK1 Configuration ---------------------------*/ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE, RCC_ClkInitStruct->APB1CLKDivider); + } + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = (HAL_RCC_GetSysClockFreq() >> ((AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]) & 0x1FU)); + + /* Configure the source of time base considering new system clocks settings*/ + return HAL_InitTick(uwTickPrio); +} + +/** + * @} + */ + +/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions + * @brief RCC clocks control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to: + + (+) Output clock to MCO pin. + (+) Retrieve current clock frequencies. + (+) Enable the Clock Security System. + +@endverbatim + * @{ + */ + +/** + * @brief Select the clock source to output on MCO1 pin(PA8) or MC02 pin (PA10)(*). + * @note PA8, PA10(*) should be configured in alternate function mode. + * @param RCC_MCOx specifies the output direction for the clock source. + * For STM32G0xx family this parameter can have only one value: + * @arg @ref RCC_MCO1 Clock source to output on MCO1 pin(PA8). + * @arg @ref RCC_MCO2 Clock source to output on MCO2 pin(PA10)(*). + * @param RCC_MCOSource specifies the clock source to output. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1SOURCE_NOCLOCK MCO output disabled, no clock on MCO + * @arg @ref RCC_MCO1SOURCE_SYSCLK system clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_HSI48 HSI48 clock selected as MCO source for devices with HSI48(*) + * @arg @ref RCC_MCO1SOURCE_HSI HSI clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_HSE HSE clock selected as MCO sourcee + * @arg @ref RCC_MCO1SOURCE_PLLCLK main PLLR clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_LSI LSI clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_LSE LSE clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_PLLPCLK PLLP clock selected as MCO1 source(*) + * @arg @ref RCC_MCO1SOURCE_PLLQCLK PLLQ clock selected as MCO1 source(*) + * @arg @ref RCC_MCO1SOURCE_RTCCLK RTC clock selected as MCO1 source(*) + * @arg @ref RCC_MCO1SOURCE_RTC_WKUP RTC_Wakeup selected as MCO1 source(*) + * @arg @ref RCC_MCO2SOURCE_NOCLOCK MCO2 output disabled, no clock on MCO2(*) + * @arg @ref RCC_MCO2SOURCE_SYSCLK system clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_HSI48 HSI48 clock selected as MCO2 source for devices with HSI48(*) + * @arg @ref RCC_MCO2SOURCE_HSI HSI clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_HSE HSE clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_PLLCLK main PLLR clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_LSI LSI clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_LSE LSE clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_PLLPCLK PLLP clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_PLLQCLK PLLQ clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_RTCCLK RTC clock selected as MCO2 source(*) + * @arg @ref RCC_MCO2SOURCE_RTC_WKUP RTC_Wakeup selected as MCO2 source(*) + * @param RCC_MCODiv specifies the MCO prescaler. + * This parameter can be one of the following values: + * @arg @ref RCC_MCODIV_1 no division applied to MCO clock + * @arg @ref RCC_MCODIV_2 division by 2 applied to MCO clock + * @arg @ref RCC_MCODIV_4 division by 4 applied to MCO clock + * @arg @ref RCC_MCODIV_8 division by 8 applied to MCO clock + * @arg @ref RCC_MCODIV_16 division by 16 applied to MCO clock + * @arg @ref RCC_MCODIV_32 division by 32 applied to MCO clock + * @arg @ref RCC_MCODIV_64 division by 64 applied to MCO clock + * @arg @ref RCC_MCODIV_128 division by 128 applied to MCO clock + * @arg @ref RCC_MCO2DIV_1 no division applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_2 division by 2 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_4 division by 4 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_8 division by 8 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_16 division by 16 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_32 division by 32 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_64 division by 64 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_128 division by 128 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_256 division by 256 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_512 division by 512 applied to MCO2 clock(*) + * @arg @ref RCC_MCO2DIV_1024 division by 1024 applied to MCO2 clock(*) + * + * (*) Feature not available on all devices of the family + * @retval None + */ +void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCOx)); + + /* Common GPIO init parameters */ + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + + if (RCC_MCOx == RCC_MCO1) + { + assert_param(IS_RCC_MCODIV(RCC_MCODiv)); + assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); + /* MCO1 Clock Enable */ + MCO1_CLK_ENABLE(); + /* Configure the MCO1 pin in alternate function mode */ + GPIO_InitStruct.Pin = MCO1_PIN; + GPIO_InitStruct.Alternate = GPIO_AF0_MCO; + HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); + /* Mask MCOSEL[] and MCOPRE[] bits then set MCO clock source and prescaler */ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCOSEL | RCC_CFGR_MCOPRE), (RCC_MCOSource | RCC_MCODiv)); + } +#if defined(RCC_MCO2_SUPPORT) + else if (RCC_MCOx == RCC_MCO2) + { + assert_param(IS_RCC_MCO2DIV(RCC_MCODiv)); + assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); + /* MCO2 Clock Enable */ + MCO2_CLK_ENABLE(); + /* Configure the MCO2 pin in alternate function mode */ + GPIO_InitStruct.Pin = MCO2_PIN; + GPIO_InitStruct.Alternate = GPIO_AF3_MCO2; + HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); + /* Mask MCOSEL[] and MCOPRE[] bits then set MCO clock source and prescaler */ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2SEL | RCC_CFGR_MCO2PRE), (RCC_MCOSource | RCC_MCODiv)); + } +#endif /* RCC_MCO2_SUPPORT */ +} + +/** + * @brief Return the SYSCLK frequency. + * + * @note The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE/HSIDIV(*) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) + * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**), + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * @note If SYSCLK source is LSI, function returns values based on LSI_VALUE(***) + * @note If SYSCLK source is LSE, function returns values based on LSE_VALUE(****) + * @note (*) HSI_VALUE is a constant defined in stm32g0xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32g0xx_hal_conf.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * @note (***) LSE_VALUE is a constant defined in stm32g0xx_hal_conf.h file (default value + * 32768 Hz). + * @note (****) LSI_VALUE is a constant defined in stm32g0xx_hal_conf.h file (default value + * 32000 Hz). + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baudrate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * + * @retval SYSCLK frequency + */ +uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t pllvco, pllsource, pllr, pllm, hsidiv; + uint32_t sysclockfreq; + + if (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + { + /* HSISYS can be derived for HSI16 */ + hsidiv = (1UL << ((READ_BIT(RCC->CR, RCC_CR_HSIDIV)) >> RCC_CR_HSIDIV_Pos)); + + /* HSI used as system clock source */ + sysclockfreq = (HSI_VALUE / hsidiv); + } + else if (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + { + /* HSE used as system clock source */ + sysclockfreq = HSE_VALUE; + } + else if (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) + { + /* PLL used as system clock source */ + + /* PLL_VCO = ((HSE_VALUE or HSI_VALUE)/ PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U ; + + switch (pllsource) + { + case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + break; + + case RCC_PLLSOURCE_HSI: /* HSI16 used as PLL clock source */ + default: /* HSI16 used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos) ; + break; + } + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U); + sysclockfreq = pllvco / pllr; + } + else if (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_LSE) + { + /* LSE used as system clock source */ + sysclockfreq = LSE_VALUE; + } + else if (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_LSI) + { + /* LSI used as system clock source */ + sysclockfreq = LSI_VALUE; + } + else + { + sysclockfreq = 0U; + } + + return sysclockfreq; +} + +/** + * @brief Return the HCLK frequency. + * @note Each time HCLK changes, this function must be called to update the + * right HCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency. + * @retval HCLK frequency in Hz + */ +uint32_t HAL_RCC_GetHCLKFreq(void) +{ + return SystemCoreClock; +} + +/** + * @brief Return the PCLK1 frequency. + * @note Each time PCLK1 changes, this function must be called to update the + * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. + * @retval PCLK1 frequency in Hz + */ +uint32_t HAL_RCC_GetPCLK1Freq(void) +{ + /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ + return ((uint32_t)(__LL_RCC_CALC_PCLK1_FREQ(HAL_RCC_GetHCLKFreq(), LL_RCC_GetAPB1Prescaler()))); +} + +/** + * @brief Configure the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Check the parameters */ + assert_param(RCC_OscInitStruct != (void *)NULL); + + /* Set all possible values for the Oscillator type parameter ---------------*/ +#if defined(RCC_HSI48_SUPPORT) + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | \ + RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSI48; +#else + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | \ + RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; +#endif /* RCC_HSI48_SUPPORT */ + + /* Get the HSE configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + { + RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + } + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) + { + RCC_OscInitStruct->HSEState = RCC_HSE_ON; + } + else + { + RCC_OscInitStruct->HSEState = RCC_HSE_OFF; + } + + /* Get the HSI configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) + { + RCC_OscInitStruct->HSIState = RCC_HSI_ON; + } + else + { + RCC_OscInitStruct->HSIState = RCC_HSI_OFF; + } + RCC_OscInitStruct->HSICalibrationValue = ((RCC->ICSCR & RCC_ICSCR_HSITRIM) >> RCC_ICSCR_HSITRIM_Pos); + RCC_OscInitStruct->HSIDiv = (RCC->CR & RCC_CR_HSIDIV); + + /* Get the LSE configuration -----------------------------------------------*/ + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + +#if defined(RCC_HSI48_SUPPORT) + /* Get the HSI48 configuration ---------------------------------------------*/ + if (READ_BIT(RCC->CR, RCC_CR_HSI48ON) == RCC_CR_HSI48ON) + { + RCC_OscInitStruct->HSI48State = RCC_HSI48_ON; + } + else + { + RCC_OscInitStruct->HSI48State = RCC_HSI48_OFF; + } +#endif /* RCC_HSI48_SUPPORT */ + + /* Get the PLL configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLM = (RCC->PLLCFGR & RCC_PLLCFGR_PLLM); + RCC_OscInitStruct->PLL.PLLN = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + RCC_OscInitStruct->PLL.PLLP = (RCC->PLLCFGR & RCC_PLLCFGR_PLLP); +#if defined(RCC_PLLQ_SUPPORT) + RCC_OscInitStruct->PLL.PLLQ = (RCC->PLLCFGR & RCC_PLLCFGR_PLLQ); +#endif /* RCC_PLLQ_SUPPORT */ + RCC_OscInitStruct->PLL.PLLR = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR); +} + +/** + * @brief Configure the RCC_ClkInitStruct according to the internal + * RCC configuration registers. + * @param RCC_ClkInitStruct Pointer to a @ref RCC_ClkInitTypeDef structure that + * will be configured. + * @param pFLatency Pointer on the Flash Latency. + * @retval None + */ +void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) +{ + /* Check the parameters */ + assert_param(RCC_ClkInitStruct != (void *)NULL); + assert_param(pFLatency != (void *)NULL); + + /* Set all possible values for the Clock type parameter --------------------*/ + RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1; + + /* Get the SYSCLK configuration --------------------------------------------*/ + RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); + + /* Get the HCLK configuration ----------------------------------------------*/ + RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); + + /* Get the APB1 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE); + + + /* Get the Flash Wait State (Latency) configuration ------------------------*/ + *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); +} + +/** + * @brief Enable the Clock Security System. + * @note If a failure is detected on the HSE oscillator clock, this oscillator + * is automatically disabled and an interrupt is generated to inform the + * software about the failure (Clock Security System Interrupt, CSSI), + * allowing the MCU to perform rescue operations. The CSSI is linked to + * the Cortex-M0+ NMI (Non-Maskable Interrupt) exception vector. + * @note The Clock Security System can only be cleared by reset. + * @retval None + */ +void HAL_RCC_EnableCSS(void) +{ + SET_BIT(RCC->CR, RCC_CR_CSSON) ; +} + +/** + * @brief Enable the LSE Clock Security System. + * @note If a failure is detected on the LSE oscillator clock, this oscillator + * is automatically disabled and an interrupt is generated to inform the + * software about the failure (Clock Security System Interrupt, CSSI), + * allowing the MCU to perform rescue operations. The CSSI is linked to + * the Cortex-M0+ NMI (Non-Maskable Interrupt) exception vector. + * @note The LSE Clock Security System Detection bit (LSECSSD in BDCR) can only be + * cleared by a backup domain reset. + * @retval None + */ +void HAL_RCC_EnableLSECSS(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ; +} + +/** + * @brief Disable the LSE Clock Security System. + * @note After LSE failure detection, the software must disable LSECSSON + * @note The Clock Security System can only be cleared by reset otherwise. + * @retval None + */ +void HAL_RCC_DisableLSECSS(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ; +} + +/** + * @brief Handle the RCC Clock Security System interrupt request. + * @note This API should be called under the NMI_Handler(). + * @retval None + */ +void HAL_RCC_NMI_IRQHandler(void) +{ + uint32_t itflag = RCC->CIFR; + + /* Clear interrupt flags related to CSS */ + RCC->CICR = (itflag & (RCC_CIFR_CSSF | RCC_CIFR_LSECSSF)); + + /* Check RCC CSSF interrupt flag */ + if ((itflag & RCC_CIFR_CSSF) != 0x00u) + { + /* RCC Clock Security System interrupt user callback */ + HAL_RCC_CSSCallback(); + } + + /* Check RCC LSECSSF interrupt flag */ + if ((itflag & RCC_CIFR_LSECSSF) != 0x00u) + { + /* RCC Clock Security System interrupt user callback */ + HAL_RCC_LSECSSCallback(); + } +} + +/** + * @brief Handle the RCC HSE Clock Security System interrupt callback. + * @retval none + */ +__weak void HAL_RCC_CSSCallback(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the @ref HAL_RCC_CSSCallback should be implemented in the user file + */ +} + +/** + * @brief RCC LSE Clock Security System interrupt callback. + * @retval none + */ +__weak void HAL_RCC_LSECSSCallback(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RCC_LSECSSCallback should be implemented in the user file + */ +} + +/** + * @brief Get and clear reset flags + * @note Once reset flags are retrieved, this API is clearing them in order + * to isolate next reset reason. + * @retval can be a combination of @ref RCC_Reset_Flag + */ +uint32_t HAL_RCC_GetResetSource(void) +{ + uint32_t reset; + + /* Get all reset flags */ + reset = RCC->CSR & RCC_RESET_FLAG_ALL; + + /* Clear Reset flags */ + RCC->CSR |= RCC_CSR_RMVF; + + return reset; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c new file mode 100644 index 0000000..9874128 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c @@ -0,0 +1,1678 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_rcc_ex.c + * @author MCD Application Team + * @brief Extended RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities RCC extended peripheral: + * + Extended Peripheral Control functions + * + Extended Clock management functions + * + Extended Clock Recovery System Control functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup RCCEx RCCEx + * @brief RCC Extended HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Constants RCCEx Private Constants + * @{ + */ +#define PLL_TIMEOUT_VALUE 100U /* 100 ms (minimum Tick + 1) */ + +#define LSCO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define LSCO_GPIO_PORT GPIOA +#define LSCO_PIN GPIO_PIN_2 +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions + * @{ + */ + +/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Extended Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the RCC Clocks + frequencies. + [..] + (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to + select the RTC clock source; in this case the Backup domain will be reset in + order to modify the RTC Clock source, as consequence RTC registers (including + the backup registers) and RCC_BDCR register are set to their reset values. + +@endverbatim + * @{ + */ +/** + * @brief Initialize the RCC extended peripherals clocks according to the specified + * parameters in the @ref RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to a @ref RCC_PeriphCLKInitTypeDef structure that + * contains a field PeriphClockSelection which can be a combination of the following values: + * @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC ADC peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C1 I2C1 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock (2) + * @arg @ref RCC_PERIPHCLK_I2S1 I2S1 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_USART1 USART1 peripheral clock + * @arg @ref RCC_PERIPHCLK_CEC CEC peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_LPTIM1 LPTIM1 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_LPTIM2 LPTIM2 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_LPUART1 LPUART1 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_LPUART2 LPUART2 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_RNG RNG peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock (1)(2) + * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock (1)(2) + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock (2) + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock (2) + * @arg @ref RCC_PERIPHCLK_FDCAN FDCAN peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock (1) + * + * @note (1) Peripherals are not available on all devices + * @note (2) Peripherals clock selection is not available on all devices + * @note Care must be taken when @ref HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source: in this case the access to Backup domain is enabled. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tmpregister; + uint32_t tickstart; + HAL_StatusTypeDef ret = HAL_OK; /* Intermediate status */ + HAL_StatusTypeDef status = HAL_OK; /* Final status */ + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*-------------------------- RTC clock source configuration ----------------------*/ + if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC) + { + FlagStatus pwrclkchanged = RESET; + + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock */ + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR1, PWR_CR1_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while ((PWR->CR1 & PWR_CR1_DBP) == 0U) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + ret = HAL_TIMEOUT; + break; + } + } + + if (ret == HAL_OK) + { + /* Reset the Backup domain only if the RTC Clock source selection is modified from default */ + tmpregister = READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL); + + /* Reset the Backup domain only if the RTC Clock source selection is modified */ + if ((tmpregister != RCC_RTCCLKSOURCE_NONE) && (tmpregister != PeriphClkInit->RTCClockSelection)) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpregister = READ_BIT(RCC->BDCR, ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpregister; + } + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if (HAL_IS_BIT_SET(tmpregister, RCC_BDCR_LSEON)) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == 0U) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + ret = HAL_TIMEOUT; + break; + } + } + } + + if (ret == HAL_OK) + { + /* Apply new RTC clock source selection */ + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + else + { + /* set overall return value */ + status = ret; + } + } + else + { + /* set overall return value */ + status = ret; + } + + /* Restore clock configuration if changed */ + if (pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + + /*-------------------------- USART1 clock source configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1) + { + /* Check the parameters */ + assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection)); + + /* Configure the USART1 clock source */ + __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection); + } + +#if defined(RCC_CCIPR_USART2SEL) + /*-------------------------- USART2 clock source configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2) + { + /* Check the parameters */ + assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection)); + + /* Configure the USART2 clock source */ + __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection); + } +#endif /* RCC_CCIPR_USART2SEL */ + +#if defined(RCC_CCIPR_USART3SEL) + /*-------------------------- USART3 clock source configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3) + { + /* Check the parameters */ + assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection)); + + /* Configure the USART3 clock source */ + __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection); + } +#endif /* RCC_CCIPR_USART3SEL */ + +#if defined(LPUART1) + /*-------------------------- LPUART1 clock source configuration ------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) + { + /* Check the parameters */ + assert_param(IS_RCC_LPUART1CLKSOURCE(PeriphClkInit->Lpuart1ClockSelection)); + + /* Configure the LPUART1 clock source */ + __HAL_RCC_LPUART1_CONFIG(PeriphClkInit->Lpuart1ClockSelection); + } +#endif /* LPUART1 */ + +#if defined(LPUART2) + /*-------------------------- LPUART2 clock source configuration ------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPUART2) == RCC_PERIPHCLK_LPUART2) + { + /* Check the parameters */ + assert_param(IS_RCC_LPUART2CLKSOURCE(PeriphClkInit->Lpuart2ClockSelection)); + + /* Configure the LPUART clock source */ + __HAL_RCC_LPUART2_CONFIG(PeriphClkInit->Lpuart2ClockSelection); + } +#endif /* LPUART2 */ + +#if defined(RCC_CCIPR_LPTIM1SEL) + /*-------------------------- LPTIM1 clock source configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == (RCC_PERIPHCLK_LPTIM1)) + { + assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); + __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); + } +#endif /* RCC_CCIPR_LPTIM1SEL */ + +#if defined(RCC_CCIPR_LPTIM2SEL) + /*-------------------------- LPTIM2 clock source configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM2) == (RCC_PERIPHCLK_LPTIM2)) + { + assert_param(IS_RCC_LPTIM2CLKSOURCE(PeriphClkInit->Lptim2ClockSelection)); + __HAL_RCC_LPTIM2_CONFIG(PeriphClkInit->Lptim2ClockSelection); + } +#endif /* RCC_CCIPR_LPTIM2SEL */ + + /*-------------------------- I2C1 clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection)); + + /* Configure the I2C1 clock source */ + __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection); + } + +#if defined(RCC_CCIPR_I2C2SEL) + /*-------------------------- I2C2 clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2) + { + /* Check the parameters */ + assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection)); + + /* Configure the I2C2 clock source */ + __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection); + } +#endif /* (RCC_CCIPR_I2C2SEL */ + +#if defined(RNG) + /*-------------------------- RNG clock source configuration ----------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RNG) == (RCC_PERIPHCLK_RNG)) + { + assert_param(IS_RCC_RNGCLKSOURCE(PeriphClkInit->RngClockSelection)); + __HAL_RCC_RNG_CONFIG(PeriphClkInit->RngClockSelection); + + if (PeriphClkInit->RngClockSelection == RCC_RNGCLKSOURCE_PLL) + { + /* Enable PLLQCLK output */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLQCLK); + } + } +#endif /* RNG */ + /*-------------------------- ADC clock source configuration ----------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC) + { + /* Check the parameters */ + assert_param(IS_RCC_ADCCLKSOURCE(PeriphClkInit->AdcClockSelection)); + + /* Configure the ADC interface clock source */ + __HAL_RCC_ADC_CONFIG(PeriphClkInit->AdcClockSelection); + + if (PeriphClkInit->AdcClockSelection == RCC_ADCCLKSOURCE_PLLADC) + { + /* Enable PLLPCLK output */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLPCLK); + } + } + +#if defined(CEC) + /*-------------------------- CEC clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) + { + /* Check the parameters */ + assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); + } +#endif /* CEC */ + +#if defined(RCC_CCIPR_TIM1SEL) + /*-------------------------- TIM1 clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM1) == RCC_PERIPHCLK_TIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM1CLKSOURCE(PeriphClkInit->Tim1ClockSelection)); + + /* Configure the TIM1 clock source */ + __HAL_RCC_TIM1_CONFIG(PeriphClkInit->Tim1ClockSelection); + + if (PeriphClkInit->Tim1ClockSelection == RCC_TIM1CLKSOURCE_PLL) + { + /* Enable PLLQCLK output */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLQCLK); + } + } +#endif /* RCC_CCIPR_TIM1SEL */ + +#if defined(RCC_CCIPR_TIM15SEL) + /*-------------------------- TIM15 clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM15) == RCC_PERIPHCLK_TIM15) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM15CLKSOURCE(PeriphClkInit->Tim15ClockSelection)); + + /* Configure the TIM15 clock source */ + __HAL_RCC_TIM15_CONFIG(PeriphClkInit->Tim15ClockSelection); + + if (PeriphClkInit->Tim15ClockSelection == RCC_TIM15CLKSOURCE_PLL) + { + /* Enable PLLQCLK output */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLQCLK); + } + } +#endif /* RCC_CCIPR_TIM15SEL */ + + /*-------------------------- I2S1 clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S1) == RCC_PERIPHCLK_I2S1) + { + /* Check the parameters */ + assert_param(IS_RCC_I2S1CLKSOURCE(PeriphClkInit->I2s1ClockSelection)); + + /* Configure the I2S1 clock source */ + __HAL_RCC_I2S1_CONFIG(PeriphClkInit->I2s1ClockSelection); + + if (PeriphClkInit->I2s1ClockSelection == RCC_I2S1CLKSOURCE_PLL) + { + /* Enable PLLPCLK output */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLPCLK); + } + } + +#if defined(RCC_CCIPR2_I2S2SEL) + /*-------------------------- I2S2 clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S2) == RCC_PERIPHCLK_I2S2) + { + /* Check the parameters */ + assert_param(IS_RCC_I2S2CLKSOURCE(PeriphClkInit->I2s2ClockSelection)); + + /* Configure the I2S2 clock source */ + __HAL_RCC_I2S2_CONFIG(PeriphClkInit->I2s2ClockSelection); + + if (PeriphClkInit->I2s2ClockSelection == RCC_I2S2CLKSOURCE_PLL) + { + /* Enable PLLPCLK output */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLPCLK); + } + } +#endif /* RCC_CCIPR2_I2S2SEL */ + +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) + /*-------------------------- USB clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB) + { + /* Check the parameters */ + assert_param(IS_RCC_USBCLKSOURCE(PeriphClkInit->UsbClockSelection)); + + /* Configure the USB clock source */ + __HAL_RCC_USB_CONFIG(PeriphClkInit->UsbClockSelection); + + if (PeriphClkInit->UsbClockSelection == RCC_USBCLKSOURCE_PLL) + { + /* Enable PLLQCLK output */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLQCLK); + } + } +#endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + +#if defined(FDCAN1) || defined(FDCAN2) + /*-------------------------- FDCAN clock source configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FDCAN) == RCC_PERIPHCLK_FDCAN) + { + /* Check the parameters */ + assert_param(IS_RCC_FDCANCLKSOURCE(PeriphClkInit->FdcanClockSelection)); + + /* Configure the FDCAN clock source */ + __HAL_RCC_FDCAN_CONFIG(PeriphClkInit->FdcanClockSelection); + + if (PeriphClkInit->FdcanClockSelection == RCC_FDCANCLKSOURCE_PLL) + { + /* Enable PLLQCLK output */ + __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLLQCLK); + } + } +#endif /* FDCAN1 || FDCAN2 */ + + return status; +} + +/** + * @brief Get the RCC_ClkInitStruct according to the internal RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * returns the configuration information for the Extended Peripherals + * clocks: I2C1, I2S1, USART1, RTC, ADC, + * LPTIM1 (1), LPTIM2 (1), TIM1 (2), TIM15 (1)(2), USART2 (2), LPUART1 (1), CEC (1) and RNG (1) + * @note (1) Peripheral is not available on all devices + * @note (2) Peripheral clock selection is not available on all devices + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2S1 | \ + RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_RTC ; + +#if defined(RCC_CCIPR_LPTIM1SEL) && defined(RCC_CCIPR_LPTIM2SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_LPTIM1; +#endif /* RCC_CCIPR_LPTIM1SEL && RCC_CCIPR_LPTIM2SEL */ +#if defined(RCC_CCIPR_RNGSEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_RNG; +#endif /* RCC_CCIPR_RNGSEL */ +#if defined(RCC_CCIPR_LPUART1SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_LPUART1; +#endif /* RCC_CCIPR_LPUART1SEL */ +#if defined(RCC_CCIPR_LPUART2SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_LPUART2; +#endif /* RCC_CCIPR_LPUART2SEL */ +#if defined(RCC_CCIPR_CECSEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_CEC; +#endif /* RCC_CCIPR_CECSEL */ +#if defined(RCC_CCIPR_TIM1SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM1; +#endif /* RCC_CCIPR_TIM1SEL */ +#if defined(RCC_CCIPR_TIM15SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM15; +#endif /* RCC_CCIPR_TIM15SEL */ +#if defined(RCC_CCIPR_USART2SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_USART2; +#endif /* RCC_CCIPR_USART2SEL */ +#if defined(RCC_CCIPR_USART3SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_USART3; +#endif /* RCC_CCIPR_USART3SEL */ +#if defined(RCC_CCIPR_I2C2SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2C2; +#endif /* RCC_CCIPR_I2C2SEL */ +#if defined(RCC_CCIPR2_I2S2SEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S2; +#endif /* RCC_CCIPR2_I2S2SEL */ +#if defined(RCC_CCIPR2_USBSEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_USB; +#endif /* RCC_CCIPR2_USBSEL */ +#if defined(RCC_CCIPR2_FDCANSEL) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_FDCAN; +#endif /* RCC_CCIPR_FDCANSEL */ + /* Get the USART1 clock source ---------------------------------------------*/ + PeriphClkInit->Usart1ClockSelection = __HAL_RCC_GET_USART1_SOURCE(); +#if defined(RCC_CCIPR_USART2SEL) + /* Get the USART2 clock source ---------------------------------------------*/ + PeriphClkInit->Usart2ClockSelection = __HAL_RCC_GET_USART2_SOURCE(); +#endif /* RCC_CCIPR_USART2SEL */ +#if defined(RCC_CCIPR_USART3SEL) + /* Get the USART3 clock source ---------------------------------------------*/ + PeriphClkInit->Usart3ClockSelection = __HAL_RCC_GET_USART3_SOURCE(); +#endif /* RCC_CCIPR_USART3SEL */ +#if defined(RCC_CCIPR_LPUART1SEL) + /* Get the LPUART1 clock source --------------------------------------------*/ + PeriphClkInit->Lpuart1ClockSelection = __HAL_RCC_GET_LPUART1_SOURCE(); +#endif /* RCC_CCIPR_LPUART1SEL */ +#if defined(RCC_CCIPR_LPUART2SEL) + /* Get the LPUART2 clock source --------------------------------------------*/ + PeriphClkInit->Lpuart2ClockSelection = __HAL_RCC_GET_LPUART2_SOURCE(); +#endif /* RCC_CCIPR_LPUART2SEL */ + /* Get the I2C1 clock source -----------------------------------------------*/ + PeriphClkInit->I2c1ClockSelection = __HAL_RCC_GET_I2C1_SOURCE(); +#if defined(RCC_CCIPR_I2C2SEL) + /* Get the I2C2 clock source -----------------------------------------------*/ + PeriphClkInit->I2c2ClockSelection = __HAL_RCC_GET_I2C2_SOURCE(); +#endif /* RCC_CCIPR_I2C2SEL */ +#if defined(RCC_CCIPR_LPTIM1SEL) + /* Get the LPTIM1 clock source ---------------------------------------------*/ + PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); +#endif /* RCC_CCIPR_LPTIM1SEL */ +#if defined(RCC_CCIPR_LPTIM2SEL) + /* Get the LPTIM2 clock source ---------------------------------------------*/ + PeriphClkInit->Lptim2ClockSelection = __HAL_RCC_GET_LPTIM2_SOURCE(); +#endif /* RCC_CCIPR_LPTIM2SEL */ +#if defined(RCC_CCIPR_TIM1SEL) + /* Get the TIM1 clock source ---------------------------------------------*/ + PeriphClkInit->Tim1ClockSelection = __HAL_RCC_GET_TIM1_SOURCE(); +#endif /* RCC_CCIPR_TIM1SEL */ +#if defined(RCC_CCIPR_TIM15SEL) + /* Get the TIM15 clock source ---------------------------------------------*/ + PeriphClkInit->Tim15ClockSelection = __HAL_RCC_GET_TIM15_SOURCE(); +#endif /* RCC_CCIPR_TIM15SEL */ + /* Get the RTC clock source ------------------------------------------------*/ + PeriphClkInit->RTCClockSelection = __HAL_RCC_GET_RTC_SOURCE(); +#if defined(RCC_CCIPR_RNGSEL) + /* Get the RNG clock source ------------------------------------------------*/ + PeriphClkInit->RngClockSelection = __HAL_RCC_GET_RNG_SOURCE(); +#endif /* RCC_CCIPR_RNGSEL */ + /* Get the ADC clock source -----------------------------------------------*/ + PeriphClkInit->AdcClockSelection = __HAL_RCC_GET_ADC_SOURCE(); +#if defined(RCC_CCIPR_CECSEL) + /* Get the CEC clock source -----------------------------------------------*/ + PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); +#endif /* RCC_CCIPR_CECSEL */ +#if defined(RCC_CCIPR2_USBSEL) + /* Get the USB clock source -----------------------------------------------*/ + PeriphClkInit->UsbClockSelection = __HAL_RCC_GET_USB_SOURCE(); +#endif /* RCC_CCIPR2_USBSEL */ +#if defined(RCC_CCIPR2_FDCANSEL) + /* Get the FDCAN clock source -----------------------------------------------*/ + PeriphClkInit->FdcanClockSelection = __HAL_RCC_GET_FDCAN_SOURCE(); +#endif /* RCC_CCIPR2_FDCANSEL */ + /* Get the I2S1 clock source -----------------------------------------------*/ + PeriphClkInit->I2s1ClockSelection = __HAL_RCC_GET_I2S1_SOURCE(); +#if defined(RCC_CCIPR2_I2S2SEL) + /* Get the I2S2 clock source -----------------------------------------------*/ + PeriphClkInit->I2s2ClockSelection = __HAL_RCC_GET_I2S2_SOURCE(); +#endif /* RCC_CCIPR2_I2S2SEL */ +} + +/** + * @brief Return the peripheral clock frequency for peripherals with clock source from PLL + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC ADC peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C1 I2C1 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_I2S1 I2S1 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_USART1 USART1 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock (1)(2) + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_RNG RNG peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock (1)(2) + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock (1)(2) + * @arg @ref RCC_PERIPHCLK_LPTIM1 LPTIM1 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_LPTIM2 LPTIM2 peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_LPUART1 LPUART1 peripheral clock(1) + * @arg @ref RCC_PERIPHCLK_LPUART2 LPUART2 peripheral clock(1) + * @arg @ref RCC_PERIPHCLK_CEC CEC peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_FDCAN FDCAN peripheral clock (1) + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock (1) + * @note (1) Peripheral not available on all devices + * @note (2) Peripheral Clock configuration not available on all devices + * @retval Frequency in Hz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + uint32_t frequency = 0U; + uint32_t srcclk; + uint32_t pllvco; + uint32_t plln; +#if defined(RCC_CCIPR_RNGSEL) + uint32_t rngclk; + uint32_t rngdiv; +#endif /* RCC_CCIPR_RNGSEL */ + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClk)); + + if (PeriphClk == RCC_PERIPHCLK_RTC) + { + /* Get the current RTC source */ + srcclk = __HAL_RCC_GET_RTC_SOURCE(); + + /* Check if LSE is ready and if RTC clock selection is LSE */ + if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_RTCCLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Check if LSI is ready and if RTC clock selection is LSI */ + else if ((HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY)) && (srcclk == RCC_RTCCLKSOURCE_LSI)) + { + frequency = LSI_VALUE; + } + /* Check if HSE is ready and if RTC clock selection is HSI_DIV32*/ + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) && (srcclk == RCC_RTCCLKSOURCE_HSE_DIV32)) + { + frequency = HSE_VALUE / 32U; + } + /* Clock not enabled for RTC*/ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + } + else + { + /* Other external peripheral clock source than RTC */ + + /* Compute PLL clock input */ + if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSI) /* HSI ? */ + { + pllvco = HSI_VALUE; + } + else if (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE) /* HSE ? */ + { + pllvco = HSE_VALUE; + } + else /* No source */ + { + pllvco = 0U; + } + + /* f(PLL Source) / PLLM */ + pllvco = (pllvco / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U)); + + switch (PeriphClk) + { +#if defined(RCC_CCIPR_RNGSEL) + case RCC_PERIPHCLK_RNG: + + srcclk = READ_BIT(RCC->CCIPR, RCC_CCIPR_RNGSEL); + if (srcclk == RCC_RNGCLKSOURCE_HSI_DIV8) /* HSI_DIV8 ? */ + { + rngclk = HSI_VALUE / 8U; + } + else if (srcclk == RCC_RNGCLKSOURCE_PLL) /* PLL ? */ + { + /* f(PLLQ) = f(VCO input) * PLLN / PLLQ */ + plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos; + rngclk = (pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U); + } + else if (srcclk == RCC_RNGCLKSOURCE_SYSCLK) /* SYSCLK ? */ + { + rngclk = HAL_RCC_GetSysClockFreq(); + } + else /* No clock source */ + { + rngclk = 0U; + } + + rngdiv = (1UL << ((READ_BIT(RCC->CCIPR, RCC_CCIPR_RNGDIV)) >> RCC_CCIPR_RNGDIV_Pos)); + frequency = (rngclk / rngdiv); + + break; +#endif /* RCC_CCIPR_RNGSEL */ + case RCC_PERIPHCLK_USART1: + /* Get the current USART1 source */ + srcclk = __HAL_RCC_GET_USART1_SOURCE(); + + if (srcclk == RCC_USART1CLKSOURCE_PCLK1) /* PCLK1 ? */ + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if (srcclk == RCC_USART1CLKSOURCE_SYSCLK) /* SYSCLK ? */ + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_USART1CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_USART1CLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Clock not enabled for USART1 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#if defined(RCC_CCIPR_USART2SEL) + case RCC_PERIPHCLK_USART2: + /* Get the current USART2 source */ + srcclk = __HAL_RCC_GET_USART2_SOURCE(); + + if (srcclk == RCC_USART2CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if (srcclk == RCC_USART2CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_USART2CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_USART2CLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Clock not enabled for USART2 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_USART2SEL */ + +#if defined(RCC_CCIPR_USART3SEL) + case RCC_PERIPHCLK_USART3: + /* Get the current USART3 source */ + srcclk = __HAL_RCC_GET_USART3_SOURCE(); + + if (srcclk == RCC_USART3CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if (srcclk == RCC_USART3CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_USART3CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_USART3CLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Clock not enabled for USART3 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_USART3SEL */ + +#if defined(RCC_CCIPR_CECSEL) + case RCC_PERIPHCLK_CEC: + /* Get the current CEC source */ + srcclk = __HAL_RCC_GET_CEC_SOURCE(); + + if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_CECCLKSOURCE_HSI_DIV488)) + { + frequency = (HSI_VALUE / 488U); + } + else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_CECCLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Clock not enabled for CEC */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_CECSEL */ + +#if defined(RCC_CCIPR_LPUART1SEL) + case RCC_PERIPHCLK_LPUART1: + /* Get the current LPUART1 source */ + srcclk = __HAL_RCC_GET_LPUART1_SOURCE(); + + if (srcclk == RCC_LPUART1CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if (srcclk == RCC_LPUART1CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_LPUART1CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_LPUART1CLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Clock not enabled for LPUART1 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_LPUART1SEL */ + +#if defined(RCC_CCIPR_LPUART2SEL) + case RCC_PERIPHCLK_LPUART2: + /* Get the current LPUART2 source */ + srcclk = __HAL_RCC_GET_LPUART2_SOURCE(); + + if (srcclk == RCC_LPUART2CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if (srcclk == RCC_LPUART2CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_LPUART2CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_LPUART2CLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Clock not enabled for LPUART2 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_LPUART2SEL */ + + case RCC_PERIPHCLK_ADC: + + srcclk = __HAL_RCC_GET_ADC_SOURCE(); + + if (srcclk == RCC_ADCCLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if (srcclk == RCC_ADCCLKSOURCE_HSI) + { + frequency = HSI_VALUE; + } + else if (srcclk == RCC_ADCCLKSOURCE_PLLADC) + { + if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLLPCLK) != 0U) + { + /* f(PLLP) = f(VCO input) * PLLN / PLLP */ + plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos; + frequency = (pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U); + } + } + /* Clock not enabled for ADC */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; + + case RCC_PERIPHCLK_I2C1: + /* Get the current I2C1 source */ + srcclk = __HAL_RCC_GET_I2C1_SOURCE(); + + if (srcclk == RCC_I2C1CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if (srcclk == RCC_I2C1CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2C1CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + /* Clock not enabled for I2C1 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; + +#if defined(RCC_CCIPR_I2C2SEL) + case RCC_PERIPHCLK_I2C2: + /* Get the current I2C2 source */ + srcclk = __HAL_RCC_GET_I2C2_SOURCE(); + + if (srcclk == RCC_I2C2CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if (srcclk == RCC_I2C2CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2C2CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + /* Clock not enabled for I2C2 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_I2C2SEL */ + + case RCC_PERIPHCLK_I2S1: + /* Get the current I2S1 source */ + srcclk = __HAL_RCC_GET_I2S1_SOURCE(); + + if (srcclk == RCC_I2S1CLKSOURCE_PLL) + { + if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLLPCLK) != 0U) + { + /* f(PLLP) = f(VCO input) * PLLN / PLLP */ + plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos; + frequency = (pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U); + } + } + else if (srcclk == RCC_I2S1CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2S1CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if (srcclk == RCC_I2S1CLKSOURCE_EXT) + { + /* External clock used.*/ + frequency = EXTERNAL_I2S1_CLOCK_VALUE; + } + /* Clock not enabled for I2S1 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; + +#if defined(RCC_CCIPR2_I2S2SEL) + case RCC_PERIPHCLK_I2S2: + /* Get the current I2S2 source */ + srcclk = __HAL_RCC_GET_I2S2_SOURCE(); + + if (srcclk == RCC_I2S2CLKSOURCE_PLL) + { + if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLLPCLK) != 0U) + { + /* f(PLLP) = f(VCO input) * PLLN / PLLP */ + plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos; + frequency = (pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U); + } + } + else if (srcclk == RCC_I2S2CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_I2S2CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if (srcclk == RCC_I2S2CLKSOURCE_EXT) + { + /* External clock used.*/ + frequency = EXTERNAL_I2S2_CLOCK_VALUE; + } + /* Clock not enabled for I2S2 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR2_I2S2SEL */ + +#if defined(RCC_CCIPR_LPTIM1SEL) + case RCC_PERIPHCLK_LPTIM1: + /* Get the current LPTIM1 source */ + srcclk = __HAL_RCC_GET_LPTIM1_SOURCE(); + + if (srcclk == RCC_LPTIM1CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if ((HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY)) && (srcclk == RCC_LPTIM1CLKSOURCE_LSI)) + { + frequency = LSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_LPTIM1CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_LPTIM1CLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Clock not enabled for LPTIM1 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_LPTIM1SEL */ + +#if defined(RCC_CCIPR_LPTIM2SEL) + case RCC_PERIPHCLK_LPTIM2: + /* Get the current LPTIM2 source */ + srcclk = __HAL_RCC_GET_LPTIM2_SOURCE(); + + if (srcclk == RCC_LPTIM2CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if ((HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY)) && (srcclk == RCC_LPTIM2CLKSOURCE_LSI)) + { + frequency = LSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY)) && (srcclk == RCC_LPTIM2CLKSOURCE_HSI)) + { + frequency = HSI_VALUE; + } + else if ((HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY)) && (srcclk == RCC_LPTIM2CLKSOURCE_LSE)) + { + frequency = LSE_VALUE; + } + /* Clock not enabled for LPTIM2 */ + else + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_LPTIM2SEL */ + +#if defined(RCC_CCIPR_TIM1SEL) + case RCC_PERIPHCLK_TIM1: + + srcclk = READ_BIT(RCC->CCIPR, RCC_CCIPR_TIM1SEL); + + if (srcclk == RCC_TIM1CLKSOURCE_PLL) /* PLL ? */ + { + if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLLQCLK) != 0U) + { + /* f(PLLQ) = f(VCO input) * PLLN / PLLQ */ + plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos; + frequency = (pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U); + } + } + else if (srcclk == RCC_TIM1CLKSOURCE_PCLK1) /* PCLK1 ? */ + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else /* No clock source */ + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_TIM1SEL */ + +#if defined(RCC_CCIPR_TIM15SEL) + case RCC_PERIPHCLK_TIM15: + + srcclk = READ_BIT(RCC->CCIPR, RCC_CCIPR_TIM15SEL); + + if (srcclk == RCC_TIM15CLKSOURCE_PLL) /* PLL ? */ + { + if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLLQCLK) != 0U) + { + /* f(PLLQ) = f(VCO input) * PLLN / PLLQ */ + plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos; + frequency = (pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U); + } + } + else if (srcclk == RCC_TIM15CLKSOURCE_PCLK1) /* PCLK1 ? */ + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else /* No clock source */ + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR_TIM15SEL */ + +#if defined(RCC_CCIPR2_USBSEL) + case RCC_PERIPHCLK_USB: + + srcclk = READ_BIT(RCC->CCIPR2, RCC_CCIPR2_USBSEL); + + if (srcclk == RCC_USBCLKSOURCE_PLL) /* PLL ? */ + { + if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLLQCLK) != 0U) + { + /* f(PLLQ) = f(VCO input) * PLLN / PLLQ */ + plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos; + frequency = (pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U); + } + } +#if defined(RCC_HSI48_SUPPORT) + else if (srcclk == RCC_USBCLKSOURCE_HSI48) /* HSI48 ? */ + { + if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSI48RDY)) && (srcclk == RCC_USBCLKSOURCE_HSI48)) + { + frequency = HSI48_VALUE; + } + } +#endif /* RCC_HSI48_SUPPORT */ + else if (srcclk == RCC_USBCLKSOURCE_HSE) + { + if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) && (srcclk == RCC_USBCLKSOURCE_HSE)) + { + frequency = HSE_VALUE; + } + } + else /* No clock source */ + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR2_USBSEL */ + +#if defined(RCC_CCIPR2_FDCANSEL) + case RCC_PERIPHCLK_FDCAN: + + srcclk = READ_BIT(RCC->CCIPR2, RCC_CCIPR2_FDCANSEL); + + if (srcclk == RCC_FDCANCLKSOURCE_PLL) /* PLL ? */ + { + if (__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLLQCLK) != 0U) + { + /* f(PLLQ) = f(VCO input) * PLLN / PLLQ */ + plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos; + frequency = (pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U); + } + } + else if (srcclk == RCC_FDCANCLKSOURCE_PCLK1) /* PCLK1 ? */ + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + else if ((HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY)) && (srcclk == RCC_FDCANCLKSOURCE_HSE)) + { + frequency = HSE_VALUE; + } + else /* No clock source */ + { + /* Nothing to do as frequency already initialized to 0U */ + } + break; +#endif /* RCC_CCIPR2_FDCANSEL */ + + default: + break; + } + } + + return (frequency); +} + +/** + * @} + */ + +/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions + * @brief Extended Clock management functions + * +@verbatim + =============================================================================== + ##### Extended clock management functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the + activation or deactivation of LSE CSS, Low speed clock output and + clock after wake-up from STOP mode. +@endverbatim + * @{ + */ + +/** + * @brief Select the Low Speed clock source to output on LSCO pin (PA2). + * @param LSCOSource specifies the Low Speed clock source to output. + * This parameter can be one of the following values: + * @arg @ref RCC_LSCOSOURCE_LSI LSI clock selected as LSCO source + * @arg @ref RCC_LSCOSOURCE_LSE LSE clock selected as LSCO source + * @retval None + */ +void HAL_RCCEx_EnableLSCO(uint32_t LSCOSource) +{ + GPIO_InitTypeDef GPIO_InitStruct; + FlagStatus pwrclkchanged = RESET; + FlagStatus backupchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSCOSOURCE(LSCOSource)); + + /* LSCO Pin Clock Enable */ + LSCO_CLK_ENABLE(); + + /* Configure the LSCO pin in analog mode */ + GPIO_InitStruct.Pin = LSCO_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(LSCO_GPIO_PORT, &GPIO_InitStruct); + + /* Update LSCOSEL clock source in Backup Domain control register */ + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + { + HAL_PWR_EnableBkUpAccess(); + backupchanged = SET; + } + + MODIFY_REG(RCC->BDCR, RCC_BDCR_LSCOSEL | RCC_BDCR_LSCOEN, LSCOSource | RCC_BDCR_LSCOEN); + + if (backupchanged == SET) + { + HAL_PWR_DisableBkUpAccess(); + } + if (pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } +} + +/** + * @brief Disable the Low Speed clock output. + * @retval None + */ +void HAL_RCCEx_DisableLSCO(void) +{ + FlagStatus pwrclkchanged = RESET; + FlagStatus backupchanged = RESET; + + /* Update LSCOEN bit in Backup Domain control register */ + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + { + /* Enable access to the backup domain */ + HAL_PWR_EnableBkUpAccess(); + backupchanged = SET; + } + + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSCOEN); + + /* Restore previous configuration */ + if (backupchanged == SET) + { + /* Disable access to the backup domain */ + HAL_PWR_DisableBkUpAccess(); + } + if (pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } +} + +/** + * @} + */ + +#if defined(CRS) + +/** @defgroup RCCEx_Exported_Functions_Group3 Extended Clock Recovery System Control functions + * @brief Extended Clock Recovery System Control functions + * +@verbatim + =============================================================================== + ##### Extended Clock Recovery System Control functions ##### + =============================================================================== + [..] + For devices with Clock Recovery System feature (CRS), RCC Extension HAL driver can be used as follows: + + (#) In System clock config, HSI48 needs to be enabled + + (#) Enable CRS clock in IP MSP init which will use CRS functions + + (#) Call CRS functions as follows: + (##) Prepare synchronization configuration necessary for HSI48 calibration + (+++) Default values can be set for frequency Error Measurement (reload and error limit) + and also HSI48 oscillator smooth trimming. + (+++) Macro __HAL_RCC_CRS_RELOADVALUE_CALCULATE can be also used to calculate + directly reload value with target and synchronization frequencies values + (##) Call function HAL_RCCEx_CRSConfig which + (+++) Resets CRS registers to their default values. + (+++) Configures CRS registers with synchronization configuration + (+++) Enables automatic calibration and frequency error counter feature + Note: When using USB LPM (Link Power Management) and the device is in Sleep mode, the + periodic USB SOF will not be generated by the host. No SYNC signal will therefore be + provided to the CRS to calibrate the HSI48 on the run. To guarantee the required clock + precision after waking up from Sleep mode, the LSE or reference clock on the GPIOs + should be used as SYNC signal. + + (##) A polling function is provided to wait for complete synchronization + (+++) Call function HAL_RCCEx_CRSWaitSynchronization() + (+++) According to CRS status, user can decide to adjust again the calibration or continue + application if synchronization is OK + + (#) User can retrieve information related to synchronization in calling function + HAL_RCCEx_CRSGetSynchronizationInfo() + + (#) Regarding synchronization status and synchronization information, user can try a new calibration + in changing synchronization configuration and call again HAL_RCCEx_CRSConfig. + Note: When the SYNC event is detected during the downcounting phase (before reaching the zero value), + it means that the actual frequency is lower than the target (and so, that the TRIM value should be + incremented), while when it is detected during the upcounting phase it means that the actual frequency + is higher (and that the TRIM value should be decremented). + + (#) In interrupt mode, user can resort to the available macros (__HAL_RCC_CRS_XXX_IT). Interrupts will go + through CRS Handler (CRS_IRQn/CRS_IRQHandler) + (++) Call function HAL_RCCEx_CRSConfig() + (++) Enable CRS_IRQn (thanks to NVIC functions) + (++) Enable CRS interrupt (__HAL_RCC_CRS_ENABLE_IT) + (++) Implement CRS status management in the following user callbacks called from + HAL_RCCEx_CRS_IRQHandler(): + (+++) HAL_RCCEx_CRS_SyncOkCallback() + (+++) HAL_RCCEx_CRS_SyncWarnCallback() + (+++) HAL_RCCEx_CRS_ExpectedSyncCallback() + (+++) HAL_RCCEx_CRS_ErrorCallback() + + (#) To force a SYNC EVENT, user can use the function HAL_RCCEx_CRSSoftwareSynchronizationGenerate(). + This function can be called before calling HAL_RCCEx_CRSConfig (for instance in Systick handler) + +@endverbatim + * @{ + */ + +/** + * @brief Start automatic synchronization for polling mode + * @param pInit Pointer on RCC_CRSInitTypeDef structure + * @retval None + */ +void HAL_RCCEx_CRSConfig(RCC_CRSInitTypeDef *pInit) +{ + uint32_t value; /* no init needed */ + + /* Check the parameters */ + assert_param(IS_RCC_CRS_SYNC_DIV(pInit->Prescaler)); + assert_param(IS_RCC_CRS_SYNC_SOURCE(pInit->Source)); + assert_param(IS_RCC_CRS_SYNC_POLARITY(pInit->Polarity)); + assert_param(IS_RCC_CRS_RELOADVALUE(pInit->ReloadValue)); + assert_param(IS_RCC_CRS_ERRORLIMIT(pInit->ErrorLimitValue)); + assert_param(IS_RCC_CRS_HSI48CALIBRATION(pInit->HSI48CalibrationValue)); + + /* CONFIGURATION */ + + /* Before configuration, reset CRS registers to their default values*/ + __HAL_RCC_CRS_FORCE_RESET(); + __HAL_RCC_CRS_RELEASE_RESET(); + + /* Set the SYNCDIV[2:0] bits according to Prescaler value */ + /* Set the SYNCSRC[1:0] bits according to Source value */ + /* Set the SYNCSPOL bit according to Polarity value */ + value = (pInit->Prescaler | pInit->Source | pInit->Polarity); + /* Set the RELOAD[15:0] bits according to ReloadValue value */ + value |= pInit->ReloadValue; + /* Set the FELIM[7:0] bits according to ErrorLimitValue value */ + value |= (pInit->ErrorLimitValue << CRS_CFGR_FELIM_Pos); + WRITE_REG(CRS->CFGR, value); + + /* Adjust HSI48 oscillator smooth trimming */ + /* Set the TRIM[6:0] bits according to RCC_CRS_HSI48CalibrationValue value */ + MODIFY_REG(CRS->CR, CRS_CR_TRIM, (pInit->HSI48CalibrationValue << CRS_CR_TRIM_Pos)); + + /* START AUTOMATIC SYNCHRONIZATION*/ + + /* Enable Automatic trimming & Frequency error counter */ + SET_BIT(CRS->CR, CRS_CR_AUTOTRIMEN | CRS_CR_CEN); +} + +/** + * @brief Generate the software synchronization event + * @retval None + */ +void HAL_RCCEx_CRSSoftwareSynchronizationGenerate(void) +{ + SET_BIT(CRS->CR, CRS_CR_SWSYNC); +} + +/** + * @brief Return synchronization info + * @param pSynchroInfo Pointer on RCC_CRSSynchroInfoTypeDef structure + * @retval None + */ +void HAL_RCCEx_CRSGetSynchronizationInfo(RCC_CRSSynchroInfoTypeDef *pSynchroInfo) +{ + /* Check the parameter */ + assert_param(pSynchroInfo != (void *)NULL); + + /* Get the reload value */ + pSynchroInfo->ReloadValue = (READ_BIT(CRS->CFGR, CRS_CFGR_RELOAD)); + + /* Get HSI48 oscillator smooth trimming */ + pSynchroInfo->HSI48CalibrationValue = (READ_BIT(CRS->CR, CRS_CR_TRIM) >> CRS_CR_TRIM_Pos); + + /* Get Frequency error capture */ + pSynchroInfo->FreqErrorCapture = (READ_BIT(CRS->ISR, CRS_ISR_FECAP) >> CRS_ISR_FECAP_Pos); + + /* Get Frequency error direction */ + pSynchroInfo->FreqErrorDirection = (READ_BIT(CRS->ISR, CRS_ISR_FEDIR)); +} + +/** + * @brief Wait for CRS Synchronization status. + * @param Timeout Duration of the timeout + * @note Timeout is based on the maximum time to receive a SYNC event based on synchronization + * frequency. + * @note If Timeout set to HAL_MAX_DELAY, HAL_TIMEOUT will be never returned. + * @retval Combination of Synchronization status + * This parameter can be a combination of the following values: + * @arg @ref RCC_CRS_TIMEOUT + * @arg @ref RCC_CRS_SYNCOK + * @arg @ref RCC_CRS_SYNCWARN + * @arg @ref RCC_CRS_SYNCERR + * @arg @ref RCC_CRS_SYNCMISS + * @arg @ref RCC_CRS_TRIMOVF + */ +uint32_t HAL_RCCEx_CRSWaitSynchronization(uint32_t Timeout) +{ + uint32_t crsstatus = RCC_CRS_NONE; + uint32_t tickstart; + + /* Get timeout */ + tickstart = HAL_GetTick(); + + /* Wait for CRS flag or timeout detection */ + do + { + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) + { + crsstatus = RCC_CRS_TIMEOUT; + } + } + /* Check CRS SYNCOK flag */ + if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCOK)) + { + /* CRS SYNC event OK */ + crsstatus |= RCC_CRS_SYNCOK; + + /* Clear CRS SYNC event OK bit */ + __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCOK); + } + + /* Check CRS SYNCWARN flag */ + if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCWARN)) + { + /* CRS SYNC warning */ + crsstatus |= RCC_CRS_SYNCWARN; + + /* Clear CRS SYNCWARN bit */ + __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCWARN); + } + + /* Check CRS TRIM overflow flag */ + if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_TRIMOVF)) + { + /* CRS SYNC Error */ + crsstatus |= RCC_CRS_TRIMOVF; + + /* Clear CRS Error bit */ + __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_TRIMOVF); + } + + /* Check CRS Error flag */ + if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCERR)) + { + /* CRS SYNC Error */ + crsstatus |= RCC_CRS_SYNCERR; + + /* Clear CRS Error bit */ + __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCERR); + } + + /* Check CRS SYNC Missed flag */ + if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCMISS)) + { + /* CRS SYNC Missed */ + crsstatus |= RCC_CRS_SYNCMISS; + + /* Clear CRS SYNC Missed bit */ + __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCMISS); + } + + /* Check CRS Expected SYNC flag */ + if (__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_ESYNC)) + { + /* frequency error counter reached a zero value */ + __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_ESYNC); + } + } while (RCC_CRS_NONE == crsstatus); + + return crsstatus; +} + +/** + * @brief Handle the Clock Recovery System interrupt request. + * @retval None + */ +void HAL_RCCEx_CRS_IRQHandler(void) +{ + uint32_t crserror = RCC_CRS_NONE; + /* Get current IT flags and IT sources values */ + uint32_t itflags = READ_REG(CRS->ISR); + uint32_t itsources = READ_REG(CRS->CR); + + /* Check CRS SYNCOK flag */ + if (((itflags & RCC_CRS_FLAG_SYNCOK) != 0U) && ((itsources & RCC_CRS_IT_SYNCOK) != 0U)) + { + /* Clear CRS SYNC event OK flag */ + WRITE_REG(CRS->ICR, CRS_ICR_SYNCOKC); + + /* user callback */ + HAL_RCCEx_CRS_SyncOkCallback(); + } + /* Check CRS SYNCWARN flag */ + else if (((itflags & RCC_CRS_FLAG_SYNCWARN) != 0U) && ((itsources & RCC_CRS_IT_SYNCWARN) != 0U)) + { + /* Clear CRS SYNCWARN flag */ + WRITE_REG(CRS->ICR, CRS_ICR_SYNCWARNC); + + /* user callback */ + HAL_RCCEx_CRS_SyncWarnCallback(); + } + /* Check CRS Expected SYNC flag */ + else if (((itflags & RCC_CRS_FLAG_ESYNC) != 0U) && ((itsources & RCC_CRS_IT_ESYNC) != 0U)) + { + /* frequency error counter reached a zero value */ + WRITE_REG(CRS->ICR, CRS_ICR_ESYNCC); + + /* user callback */ + HAL_RCCEx_CRS_ExpectedSyncCallback(); + } + /* Check CRS Error flags */ + else + { + if (((itflags & RCC_CRS_FLAG_ERR) != 0U) && ((itsources & RCC_CRS_IT_ERR) != 0U)) + { + if ((itflags & RCC_CRS_FLAG_SYNCERR) != 0U) + { + crserror |= RCC_CRS_SYNCERR; + } + if ((itflags & RCC_CRS_FLAG_SYNCMISS) != 0U) + { + crserror |= RCC_CRS_SYNCMISS; + } + if ((itflags & RCC_CRS_FLAG_TRIMOVF) != 0U) + { + crserror |= RCC_CRS_TRIMOVF; + } + + /* Clear CRS Error flags */ + WRITE_REG(CRS->ICR, CRS_ICR_ERRC); + + /* user error callback */ + HAL_RCCEx_CRS_ErrorCallback(crserror); + } + } +} + +/** + * @brief RCCEx Clock Recovery System SYNCOK interrupt callback. + * @retval none + */ +__weak void HAL_RCCEx_CRS_SyncOkCallback(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the @ref HAL_RCCEx_CRS_SyncOkCallback should be implemented in the user file + */ +} + +/** + * @brief RCCEx Clock Recovery System SYNCWARN interrupt callback. + * @retval none + */ +__weak void HAL_RCCEx_CRS_SyncWarnCallback(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the @ref HAL_RCCEx_CRS_SyncWarnCallback should be implemented in the user file + */ +} + +/** + * @brief RCCEx Clock Recovery System Expected SYNC interrupt callback. + * @retval none + */ +__weak void HAL_RCCEx_CRS_ExpectedSyncCallback(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the @ref HAL_RCCEx_CRS_ExpectedSyncCallback should be implemented in the user file + */ +} + +/** + * @brief RCCEx Clock Recovery System Error interrupt callback. + * @param Error Combination of Error status. + * This parameter can be a combination of the following values: + * @arg @ref RCC_CRS_SYNCERR + * @arg @ref RCC_CRS_SYNCMISS + * @arg @ref RCC_CRS_TRIMOVF + * @retval none + */ +__weak void HAL_RCCEx_CRS_ErrorCallback(uint32_t Error) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(Error); + + /* NOTE : This function should not be modified, when the callback is needed, + the @ref HAL_RCCEx_CRS_ErrorCallback should be implemented in the user file + */ +} + +/** + * @} + */ + +#endif /* CRS */ + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rng.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rng.c new file mode 100644 index 0000000..c61168a --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rng.c @@ -0,0 +1,839 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_rng.c + * @author MCD Application Team + * @brief RNG HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Random Number Generator (RNG) peripheral: + * + Initialization and configuration functions + * + Peripheral Control functions + * + Peripheral State functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The RNG HAL driver can be used as follows: + + (#) Enable the RNG controller clock using __HAL_RCC_RNG_CLK_ENABLE() macro + in HAL_RNG_MspInit(). + (#) Activate the RNG peripheral using HAL_RNG_Init() function. + (#) Wait until the 32 bit Random Number Generator contains a valid + random data using (polling/interrupt) mode. + (#) Get the 32 bit random number using HAL_RNG_GenerateRandomNumber() function. + + ##### Callback registration ##### + ================================== + + [..] + The compilation define USE_HAL_RNG_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_RNG_RegisterCallback() to register a user callback. + Function HAL_RNG_RegisterCallback() allows to register following callbacks: + (+) ErrorCallback : RNG Error Callback. + (+) MspInitCallback : RNG MspInit. + (+) MspDeInitCallback : RNG MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + [..] + Use function HAL_RNG_UnRegisterCallback() to reset a callback to the default + weak (surcharged) function. + HAL_RNG_UnRegisterCallback() takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) ErrorCallback : RNG Error Callback. + (+) MspInitCallback : RNG MspInit. + (+) MspDeInitCallback : RNG MspDeInit. + + [..] + For specific callback ReadyDataCallback, use dedicated register callbacks: + respectively HAL_RNG_RegisterReadyDataCallback() , HAL_RNG_UnRegisterReadyDataCallback(). + + [..] + By default, after the HAL_RNG_Init() and when the state is HAL_RNG_STATE_RESET + all callbacks are set to the corresponding weak (surcharged) functions: + example HAL_RNG_ErrorCallback(). + Exception done for MspInit and MspDeInit functions that are respectively + reset to the legacy weak (surcharged) functions in the HAL_RNG_Init() + and HAL_RNG_DeInit() only when these callbacks are null (not registered beforehand). + If not, MspInit or MspDeInit are not null, the HAL_RNG_Init() and HAL_RNG_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand). + + [..] + Callbacks can be registered/unregistered in HAL_RNG_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_RNG_STATE_READY or HAL_RNG_STATE_RESET state, thus registered (user) + MspInit/DeInit callbacks can be used during the Init/DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_RNG_RegisterCallback() before calling HAL_RNG_DeInit() + or HAL_RNG_Init() function. + + [..] + When The compilation define USE_HAL_RNG_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available + and weak (surcharged) callbacks are used. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +#if defined (RNG) + +/** @addtogroup RNG + * @brief RNG HAL module driver. + * @{ + */ + +#ifdef HAL_RNG_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RNG_Private_Constants RNG Private Constants + * @{ + */ +#define RNG_TIMEOUT_VALUE 2U +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/* Private functions prototypes ----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup RNG_Exported_Functions + * @{ + */ + +/** @addtogroup RNG_Exported_Functions_Group1 + * @brief Initialization and configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Initialize the RNG according to the specified parameters + in the RNG_InitTypeDef and create the associated handle + (+) DeInitialize the RNG peripheral + (+) Initialize the RNG MSP + (+) DeInitialize RNG MSP + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the RNG peripheral and creates the associated handle. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RNG_Init(RNG_HandleTypeDef *hrng) +{ + /* Check the RNG handle allocation */ + if (hrng == NULL) + { + return HAL_ERROR; + } + /* Check the parameters */ + assert_param(IS_RNG_ALL_INSTANCE(hrng->Instance)); + assert_param(IS_RNG_CED(hrng->Init.ClockErrorDetection)); + +#if (USE_HAL_RNG_REGISTER_CALLBACKS == 1) + if (hrng->State == HAL_RNG_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hrng->Lock = HAL_UNLOCKED; + + hrng->ReadyDataCallback = HAL_RNG_ReadyDataCallback; /* Legacy weak ReadyDataCallback */ + hrng->ErrorCallback = HAL_RNG_ErrorCallback; /* Legacy weak ErrorCallback */ + + if (hrng->MspInitCallback == NULL) + { + hrng->MspInitCallback = HAL_RNG_MspInit; /* Legacy weak MspInit */ + } + + /* Init the low level hardware */ + hrng->MspInitCallback(hrng); + } +#else + if (hrng->State == HAL_RNG_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hrng->Lock = HAL_UNLOCKED; + + /* Init the low level hardware */ + HAL_RNG_MspInit(hrng); + } +#endif /* USE_HAL_RNG_REGISTER_CALLBACKS */ + + /* Change RNG peripheral state */ + hrng->State = HAL_RNG_STATE_BUSY; + + /* Clock Error Detection Configuration */ + MODIFY_REG(hrng->Instance->CR, RNG_CR_CED, hrng->Init.ClockErrorDetection); + + /* Enable the RNG Peripheral */ + __HAL_RNG_ENABLE(hrng); + + /* Initialize the RNG state */ + hrng->State = HAL_RNG_STATE_READY; + + /* Initialise the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_NONE; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief DeInitializes the RNG peripheral. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RNG_DeInit(RNG_HandleTypeDef *hrng) +{ + /* Check the RNG handle allocation */ + if (hrng == NULL) + { + return HAL_ERROR; + } + + /* Clear Clock Error Detection bit */ + CLEAR_BIT(hrng->Instance->CR, RNG_CR_CED); + /* Disable the RNG Peripheral */ + CLEAR_BIT(hrng->Instance->CR, RNG_CR_IE | RNG_CR_RNGEN); + + /* Clear RNG interrupt status flags */ + CLEAR_BIT(hrng->Instance->SR, RNG_SR_CEIS | RNG_SR_SEIS); + +#if (USE_HAL_RNG_REGISTER_CALLBACKS == 1) + if (hrng->MspDeInitCallback == NULL) + { + hrng->MspDeInitCallback = HAL_RNG_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware */ + hrng->MspDeInitCallback(hrng); +#else + /* DeInit the low level hardware */ + HAL_RNG_MspDeInit(hrng); +#endif /* USE_HAL_RNG_REGISTER_CALLBACKS */ + + /* Update the RNG state */ + hrng->State = HAL_RNG_STATE_RESET; + + /* Initialise the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_NONE; + + /* Release Lock */ + __HAL_UNLOCK(hrng); + + /* Return the function status */ + return HAL_OK; +} + +/** + * @brief Initializes the RNG MSP. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval None + */ +__weak void HAL_RNG_MspInit(RNG_HandleTypeDef *hrng) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrng); + /* NOTE : This function should not be modified. When the callback is needed, + function HAL_RNG_MspInit must be implemented in the user file. + */ +} + +/** + * @brief DeInitializes the RNG MSP. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval None + */ +__weak void HAL_RNG_MspDeInit(RNG_HandleTypeDef *hrng) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrng); + /* NOTE : This function should not be modified. When the callback is needed, + function HAL_RNG_MspDeInit must be implemented in the user file. + */ +} + +#if (USE_HAL_RNG_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User RNG Callback + * To be used instead of the weak predefined callback + * @param hrng RNG handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_RNG_ERROR_CB_ID Error callback ID + * @arg @ref HAL_RNG_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_RNG_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RNG_RegisterCallback(RNG_HandleTypeDef *hrng, HAL_RNG_CallbackIDTypeDef CallbackID, + pRNG_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hrng); + + if (HAL_RNG_STATE_READY == hrng->State) + { + switch (CallbackID) + { + case HAL_RNG_ERROR_CB_ID : + hrng->ErrorCallback = pCallback; + break; + + case HAL_RNG_MSPINIT_CB_ID : + hrng->MspInitCallback = pCallback; + break; + + case HAL_RNG_MSPDEINIT_CB_ID : + hrng->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_RNG_STATE_RESET == hrng->State) + { + switch (CallbackID) + { + case HAL_RNG_MSPINIT_CB_ID : + hrng->MspInitCallback = pCallback; + break; + + case HAL_RNG_MSPDEINIT_CB_ID : + hrng->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hrng); + return status; +} + +/** + * @brief Unregister an RNG Callback + * RNG callback is redirected to the weak predefined callback + * @param hrng RNG handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_RNG_ERROR_CB_ID Error callback ID + * @arg @ref HAL_RNG_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_RNG_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RNG_UnRegisterCallback(RNG_HandleTypeDef *hrng, HAL_RNG_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hrng); + + if (HAL_RNG_STATE_READY == hrng->State) + { + switch (CallbackID) + { + case HAL_RNG_ERROR_CB_ID : + hrng->ErrorCallback = HAL_RNG_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_RNG_MSPINIT_CB_ID : + hrng->MspInitCallback = HAL_RNG_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_RNG_MSPDEINIT_CB_ID : + hrng->MspDeInitCallback = HAL_RNG_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_RNG_STATE_RESET == hrng->State) + { + switch (CallbackID) + { + case HAL_RNG_MSPINIT_CB_ID : + hrng->MspInitCallback = HAL_RNG_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_RNG_MSPDEINIT_CB_ID : + hrng->MspDeInitCallback = HAL_RNG_MspDeInit; /* Legacy weak MspInit */ + break; + + default : + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hrng); + return status; +} + +/** + * @brief Register Data Ready RNG Callback + * To be used instead of the weak HAL_RNG_ReadyDataCallback() predefined callback + * @param hrng RNG handle + * @param pCallback pointer to the Data Ready Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RNG_RegisterReadyDataCallback(RNG_HandleTypeDef *hrng, pRNG_ReadyDataCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hrng); + + if (HAL_RNG_STATE_READY == hrng->State) + { + hrng->ReadyDataCallback = pCallback; + } + else + { + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hrng); + return status; +} + +/** + * @brief UnRegister the Data Ready RNG Callback + * Data Ready RNG Callback is redirected to the weak HAL_RNG_ReadyDataCallback() predefined callback + * @param hrng RNG handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RNG_UnRegisterReadyDataCallback(RNG_HandleTypeDef *hrng) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hrng); + + if (HAL_RNG_STATE_READY == hrng->State) + { + hrng->ReadyDataCallback = HAL_RNG_ReadyDataCallback; /* Legacy weak ReadyDataCallback */ + } + else + { + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hrng); + return status; +} + +#endif /* USE_HAL_RNG_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @addtogroup RNG_Exported_Functions_Group2 + * @brief Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Get the 32 bit Random number + (+) Get the 32 bit Random number with interrupt enabled + (+) Handle RNG interrupt request + +@endverbatim + * @{ + */ + +/** + * @brief Generates a 32-bit random number. + * @note This function checks value of RNG_FLAG_DRDY flag to know if valid + * random number is available in the DR register (RNG_FLAG_DRDY flag set + * whenever a random number is available through the RNG_DR register). + * After transitioning from 0 to 1 (random number available), + * RNG_FLAG_DRDY flag remains high until output buffer becomes empty after reading + * four words from the RNG_DR register, i.e. further function calls + * will immediately return a new u32 random number (additional words are + * available and can be read by the application, till RNG_FLAG_DRDY flag remains high). + * @note When no more random number data is available in DR register, RNG_FLAG_DRDY + * flag is automatically cleared. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @param random32bit pointer to generated random number variable if successful. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber(RNG_HandleTypeDef *hrng, uint32_t *random32bit) +{ + uint32_t tickstart; + HAL_StatusTypeDef status = HAL_OK; + + /* Process Locked */ + __HAL_LOCK(hrng); + + /* Check RNG peripheral state */ + if (hrng->State == HAL_RNG_STATE_READY) + { + /* Change RNG peripheral state */ + hrng->State = HAL_RNG_STATE_BUSY; + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Check if data register contains valid random data */ + while (__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_DRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RNG_TIMEOUT_VALUE) + { + /* New check to avoid false timeout detection in case of preemption */ + if (__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_DRDY) == RESET) + { + hrng->State = HAL_RNG_STATE_READY; + hrng->ErrorCode = HAL_RNG_ERROR_TIMEOUT; + /* Process Unlocked */ + __HAL_UNLOCK(hrng); + return HAL_ERROR; + } + } + } + + /* Get a 32bit Random number */ + hrng->RandomNumber = hrng->Instance->DR; + *random32bit = hrng->RandomNumber; + + hrng->State = HAL_RNG_STATE_READY; + } + else + { + hrng->ErrorCode = HAL_RNG_ERROR_BUSY; + status = HAL_ERROR; + } + + /* Process Unlocked */ + __HAL_UNLOCK(hrng); + + return status; +} + +/** + * @brief Generates a 32-bit random number in interrupt mode. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber_IT(RNG_HandleTypeDef *hrng) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process Locked */ + __HAL_LOCK(hrng); + + /* Check RNG peripheral state */ + if (hrng->State == HAL_RNG_STATE_READY) + { + /* Change RNG peripheral state */ + hrng->State = HAL_RNG_STATE_BUSY; + + /* Enable the RNG Interrupts: Data Ready, Clock error, Seed error */ + __HAL_RNG_ENABLE_IT(hrng); + } + else + { + /* Process Unlocked */ + __HAL_UNLOCK(hrng); + + hrng->ErrorCode = HAL_RNG_ERROR_BUSY; + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief Handles RNG interrupt request. + * @note In the case of a clock error, the RNG is no more able to generate + * random numbers because the PLL48CLK clock is not correct. User has + * to check that the clock controller is correctly configured to provide + * the RNG clock and clear the CEIS bit using __HAL_RNG_CLEAR_IT(). + * The clock error has no impact on the previously generated + * random numbers, and the RNG_DR register contents can be used. + * @note In the case of a seed error, the generation of random numbers is + * interrupted as long as the SECS bit is '1'. If a number is + * available in the RNG_DR register, it must not be used because it may + * not have enough entropy. In this case, it is recommended to clear the + * SEIS bit using __HAL_RNG_CLEAR_IT(), then disable and enable + * the RNG peripheral to reinitialize and restart the RNG. + * @note User-written HAL_RNG_ErrorCallback() API is called once whether SEIS + * or CEIS are set. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval None + + */ +void HAL_RNG_IRQHandler(RNG_HandleTypeDef *hrng) +{ + uint32_t rngclockerror = 0U; + + /* RNG clock error interrupt occurred */ + if (__HAL_RNG_GET_IT(hrng, RNG_IT_CEI) != RESET) + { + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_CLOCK; + rngclockerror = 1U; + } + else if (__HAL_RNG_GET_IT(hrng, RNG_IT_SEI) != RESET) + { + /* Update the error code */ + hrng->ErrorCode = HAL_RNG_ERROR_SEED; + rngclockerror = 1U; + } + else + { + /* Nothing to do */ + } + + if (rngclockerror == 1U) + { + /* Change RNG peripheral state */ + hrng->State = HAL_RNG_STATE_ERROR; + +#if (USE_HAL_RNG_REGISTER_CALLBACKS == 1) + /* Call registered Error callback */ + hrng->ErrorCallback(hrng); +#else + /* Call legacy weak Error callback */ + HAL_RNG_ErrorCallback(hrng); +#endif /* USE_HAL_RNG_REGISTER_CALLBACKS */ + + /* Clear the clock error flag */ + __HAL_RNG_CLEAR_IT(hrng, RNG_IT_CEI | RNG_IT_SEI); + + return; + } + + /* Check RNG data ready interrupt occurred */ + if (__HAL_RNG_GET_IT(hrng, RNG_IT_DRDY) != RESET) + { + /* Generate random number once, so disable the IT */ + __HAL_RNG_DISABLE_IT(hrng); + + /* Get the 32bit Random number (DRDY flag automatically cleared) */ + hrng->RandomNumber = hrng->Instance->DR; + + if (hrng->State != HAL_RNG_STATE_ERROR) + { + /* Change RNG peripheral state */ + hrng->State = HAL_RNG_STATE_READY; + /* Process Unlocked */ + __HAL_UNLOCK(hrng); + +#if (USE_HAL_RNG_REGISTER_CALLBACKS == 1) + /* Call registered Data Ready callback */ + hrng->ReadyDataCallback(hrng, hrng->RandomNumber); +#else + /* Call legacy weak Data Ready callback */ + HAL_RNG_ReadyDataCallback(hrng, hrng->RandomNumber); +#endif /* USE_HAL_RNG_REGISTER_CALLBACKS */ + } + } +} + +/** + * @brief Read latest generated random number. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval random value + */ +uint32_t HAL_RNG_ReadLastRandomNumber(RNG_HandleTypeDef *hrng) +{ + return (hrng->RandomNumber); +} + +/** + * @brief Data Ready callback in non-blocking mode. + * @note When RNG_FLAG_DRDY flag value is set, first random number has been read + * from DR register in IRQ Handler and is provided as callback parameter. + * Depending on valid data available in the conditioning output buffer, + * additional words can be read by the application from DR register till + * DRDY bit remains high. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @param random32bit generated random number. + * @retval None + */ +__weak void HAL_RNG_ReadyDataCallback(RNG_HandleTypeDef *hrng, uint32_t random32bit) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrng); + UNUSED(random32bit); + /* NOTE : This function should not be modified. When the callback is needed, + function HAL_RNG_ReadyDataCallback must be implemented in the user file. + */ +} + +/** + * @brief RNG error callbacks. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval None + */ +__weak void HAL_RNG_ErrorCallback(RNG_HandleTypeDef *hrng) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrng); + /* NOTE : This function should not be modified. When the callback is needed, + function HAL_RNG_ErrorCallback must be implemented in the user file. + */ +} +/** + * @} + */ + + +/** @addtogroup RNG_Exported_Functions_Group3 + * @brief Peripheral State functions + * +@verbatim + =============================================================================== + ##### Peripheral State functions ##### + =============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Returns the RNG state. + * @param hrng pointer to a RNG_HandleTypeDef structure that contains + * the configuration information for RNG. + * @retval HAL state + */ +HAL_RNG_StateTypeDef HAL_RNG_GetState(RNG_HandleTypeDef *hrng) +{ + return hrng->State; +} + +/** + * @brief Return the RNG handle error code. + * @param hrng: pointer to a RNG_HandleTypeDef structure. + * @retval RNG Error Code + */ +uint32_t HAL_RNG_GetError(RNG_HandleTypeDef *hrng) +{ + /* Return RNG Error Code */ + return hrng->ErrorCode; +} +/** + * @} + */ + +/** + * @} + */ + + +#endif /* HAL_RNG_MODULE_ENABLED */ +/** + * @} + */ + +#endif /* RNG */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc.c new file mode 100644 index 0000000..eb864ee --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc.c @@ -0,0 +1,1922 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_rtc.c + * @author MCD Application Team + * @brief RTC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Real-Time Clock (RTC) peripheral: + * + Initialization/de-initialization functions + * + Calendar (Time and Date) configuration + * + Alarms (Alarm A and Alarm B) configuration + * + WakeUp Timer configuration + * + TimeStamp configuration + * + Tampers configuration + * + Backup Data Registers configuration + * + RTC Tamper and TimeStamp Pins Selection + * + Interrupts and flags management + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + =============================================================================== + ##### RTC Operating Condition ##### + =============================================================================== + [..] The real-time clock (RTC) and the RTC backup registers can be powered + from the VBAT voltage when the main VDD supply is powered off. + To retain the content of the RTC backup registers and supply the RTC + when VDD is turned off, VBAT pin can be connected to an optional + standby voltage supplied by a battery or by another source. + + ##### Backup Domain Reset ##### + =============================================================================== + [..] The backup domain reset sets all RTC registers and the RCC_BDCR register + to their reset values. + A backup domain reset is generated when one of the following events occurs: + (+) Software reset, triggered by setting the BDRST bit in the + RCC Backup domain control register (RCC_BDCR). + (+) VDD or VBAT power on, if both supplies have previously been powered off. + (+) Tamper detection event resets all data backup registers. + + ##### Backup Domain Access ##### + ============================================================================= + [..] After reset, the backup domain (RTC registers and RTC backup data registers) + is protected against possible unwanted write accesses. + [..] To enable access to the RTC Domain and RTC registers, proceed as follows: + (+) Enable the Power Controller (PWR) APB1 interface clock using the + __HAL_RCC_PWR_CLK_ENABLE() function. + (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. + (+) Select the RTC clock source using the __HAL_RCC_RTC_CONFIG() function. + (+) Enable RTC Clock using the __HAL_RCC_RTC_ENABLE() function. + + [..] To enable access to the RTC Domain and RTC registers, proceed as follows: + (+) Call the function HAL_RCCEx_PeriphCLKConfig with RCC_PERIPHCLK_RTC for + PeriphClockSelection and select RTCClockSelection (LSE, LSI or HSEdiv32) + (+) Enable RTC Clock using the __HAL_RCC_RTC_ENABLE() macro. + + ##### How to use RTC Driver ##### + =================================================================== + [..] + (+) Enable the RTC domain access (see description in the section above). + (+) Configure the RTC Prescaler (Asynchronous and Synchronous) and RTC hour + format using the HAL_RTC_Init() function. + + *** Time and Date configuration *** + =================================== + [..] + (+) To configure the RTC Calendar (Time and Date) use the HAL_RTC_SetTime() + and HAL_RTC_SetDate() functions. + (+) To read the RTC Calendar, use the HAL_RTC_GetTime() and HAL_RTC_GetDate() functions. + + *** Alarm configuration *** + =========================== + [..] + (+) To configure the RTC Alarm use the HAL_RTC_SetAlarm() function. + You can also configure the RTC Alarm with interrupt mode using the + HAL_RTC_SetAlarm_IT() function. + (+) To read the RTC Alarm, use the HAL_RTC_GetAlarm() function. + + ##### RTC and low power modes ##### + ================================================================== + [..] The MCU can be woken up from a low power mode by an RTC alternate + function. + [..] The RTC alternate functions are the RTC alarms (Alarm A and Alarm B), + RTC wakeup, RTC tamper event detection and RTC time stamp event detection. + These RTC alternate functions can wake up the system from the Stop and + Standby low power modes. + [..] The system can also wake up from low power modes without depending + on an external interrupt (Auto-wakeup mode), by using the RTC alarm + or the RTC wakeup events. + [..] The RTC provides a programmable time base for waking up from the + Stop or Standby mode at regular intervals. + Wakeup from STOP and STANDBY modes is possible only when the RTC clock source + is LSE or LSI. + + *** Callback registration *** + ============================================= + + [..] + The compilation define USE_RTC_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + Use Function HAL_RTC_RegisterCallback() to register an interrupt callback. + + [..] + Function HAL_RTC_RegisterCallback() allows to register following callbacks: + (+) AlarmAEventCallback : RTC Alarm A Event callback. + (+) AlarmBEventCallback : RTC Alarm B Event callback. + (+) TimeStampEventCallback : RTC TimeStamp Event callback. + (+) WakeUpTimerEventCallback : RTC WakeUpTimer Event callback. + (+) Tamper1EventCallback : RTC Tamper1Event callback. + (+) Tamper2EventCallback : RTC Tamper2Event callback. + (+) Tamper3EventCallback : RTC Tamper3Event callback. (*) + (+) InternalTamper3EventCallback : RTC Internal Tamper 3 Event callback. + (+) InternalTamper4EventCallback : RTC Internal Tamper 4 Event callback. + (+) InternalTamper5EventCallback : RTC Internal Tamper 5 Event callback. + (+) InternalTamper6EventCallback : RTC Internal Tamper 6 Event callback. + (+) MspInitCallback : RTC MspInit. + (+) MspDeInitCallback : RTC MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + Use function HAL_RTC_UnRegisterCallback() to reset a callback to the default + weak function. + HAL_RTC_UnRegisterCallback() takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) AlarmAEventCallback : RTC Alarm A Event callback. + (+) AlarmBEventCallback : RTC Alarm B Event callback. + (+) TimeStampEventCallback : RTC TimeStamp Event callback. + (+) WakeUpTimerEventCallback : RTC WakeUpTimer Event callback. + (+) Tamper1EventCallback : RTC Tamper 1 Event callback. + (+) Tamper2EventCallback : RTC Tamper 2 Event callback. + (+) Tamper3EventCallback : RTC Tamper 3 Event callback.(*) + (+) InternalTamper3EventCallback : RTC Internal Tamper 3 Event callback. + (+) InternalTamper4EventCallback : RTC Internal Tamper 4 Event callback. + (+) InternalTamper5EventCallback : RTC Internal Tamper 5 Event callback. + (+) InternalTamper6EventCallback : RTC Internal Tamper 6 Event callback. + (+) MspInitCallback : RTC MspInit callback. + (+) MspDeInitCallback : RTC MspDeInit callback. + + [..] + By default, after the HAL_RTC_Init() and when the state is HAL_RTC_STATE_RESET, + all callbacks are set to the corresponding weak functions : + examples AlarmAEventCallback(), WakeUpTimerEventCallback(). + Exception done for MspInit and MspDeInit callbacks that are reset to the legacy weak function + in the HAL_RTC_Init()/HAL_RTC_DeInit() only when these callbacks are null + (not registered beforehand). + If not, MspInit or MspDeInit are not null, HAL_RTC_Init()/HAL_RTC_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand) + + [..] + Callbacks can be registered/unregistered in HAL_RTC_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_RTC_STATE_READY or HAL_RTC_STATE_RESET state, + thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_RTC_RegisterCallback() before calling HAL_RTC_DeInit() + or HAL_RTC_Init() function. + + [..] + When The compilation define USE_HAL_RTC_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + @endverbatim + + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + + +/** @addtogroup RTC + * @brief RTC HAL module driver + * @{ + */ + +#ifdef HAL_RTC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup RTC_Exported_Functions + * @{ + */ + +/** @addtogroup RTC_Exported_Functions_Group1 + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This section provides functions allowing to initialize and configure the + RTC Prescaler (Synchronous and Asynchronous), RTC Hour format, disable + RTC registers Write protection, enter and exit the RTC initialization mode, + RTC registers synchronization check and reference clock detection enable. + (#) The RTC Prescaler is programmed to generate the RTC 1Hz time base. + It is split into 2 programmable prescalers to minimize power consumption. + (++) A 7-bit asynchronous prescaler and a 15-bit synchronous prescaler. + (++) When both prescalers are used, it is recommended to configure the + asynchronous prescaler to a high value to minimize power consumption. + (#) All RTC registers are Write protected. Writing to the RTC registers + is enabled by writing a key into the Write Protection register, RTC_WPR. + (#) To configure the RTC Calendar, user application should enter + initialization mode. In this mode, the calendar counter is stopped + and its value can be updated. When the initialization sequence is + complete, the calendar restarts counting after 4 RTCCLK cycles. + (#) To read the calendar through the shadow registers after Calendar + initialization, calendar update or after wakeup from low power modes + the software must first clear the RSF flag. The software must then + wait until it is set again before reading the calendar, which means + that the calendar registers have been correctly copied into the + RTC_TR and RTC_DR shadow registers.The HAL_RTC_WaitForSynchro() function + implements the above software sequence (RSF clear and RSF check). + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the RTC peripheral + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Check the RTC peripheral state */ + if(hrtc != NULL) + { + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance)); + assert_param(IS_RTC_HOUR_FORMAT(hrtc->Init.HourFormat)); + assert_param(IS_RTC_ASYNCH_PREDIV(hrtc->Init.AsynchPrediv)); + assert_param(IS_RTC_SYNCH_PREDIV(hrtc->Init.SynchPrediv)); + assert_param(IS_RTC_OUTPUT(hrtc->Init.OutPut)); + assert_param(IS_RTC_OUTPUT_REMAP(hrtc->Init.OutPutRemap)); + assert_param(IS_RTC_OUTPUT_POL(hrtc->Init.OutPutPolarity)); + assert_param(IS_RTC_OUTPUT_TYPE(hrtc->Init.OutPutType)); + assert_param(IS_RTC_OUTPUT_PULLUP(hrtc->Init.OutPutPullUp)); + + if(hrtc->State == HAL_RTC_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hrtc->Lock = HAL_UNLOCKED; + + /* Process TAMP peripheral offset from RTC one */ + hrtc->TampOffset = (TAMP_BASE - RTC_BASE); + +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + hrtc->AlarmAEventCallback = HAL_RTC_AlarmAEventCallback; /* Legacy weak AlarmAEventCallback */ + hrtc->AlarmBEventCallback = HAL_RTCEx_AlarmBEventCallback; /* Legacy weak AlarmBEventCallback */ + hrtc->TimeStampEventCallback = HAL_RTCEx_TimeStampEventCallback; /* Legacy weak TimeStampEventCallback */ + hrtc->WakeUpTimerEventCallback = HAL_RTCEx_WakeUpTimerEventCallback; /* Legacy weak WakeUpTimerEventCallback */ + hrtc->Tamper1EventCallback = HAL_RTCEx_Tamper1EventCallback; /* Legacy weak Tamper1EventCallback */ + hrtc->Tamper2EventCallback = HAL_RTCEx_Tamper2EventCallback; /* Legacy weak Tamper2EventCallback */ +#if defined(TAMP_CR1_TAMP3E) + hrtc->Tamper3EventCallback = HAL_RTCEx_Tamper3EventCallback; /* Legacy weak Tamper3EventCallback */ +#endif /* TAMP_CR1_TAMP3E */ + hrtc->InternalTamper3EventCallback = HAL_RTCEx_InternalTamper3EventCallback; /*!< Legacy weak InternalTamper3EventCallback */ + hrtc->InternalTamper4EventCallback = HAL_RTCEx_InternalTamper4EventCallback; /*!< Legacy weak InternalTamper4EventCallback */ + hrtc->InternalTamper5EventCallback = HAL_RTCEx_InternalTamper5EventCallback; /*!< Legacy weak InternalTamper5EventCallback */ + hrtc->InternalTamper6EventCallback = HAL_RTCEx_InternalTamper6EventCallback; /*!< Legacy weak InternalTamper6EventCallback */ + + if(hrtc->MspInitCallback == NULL) + { + hrtc->MspInitCallback = HAL_RTC_MspInit; + } + + /* Init the low level hardware */ + hrtc->MspInitCallback(hrtc); + + if(hrtc->MspDeInitCallback == NULL) + { + hrtc->MspDeInitCallback = HAL_RTC_MspDeInit; + } +#else + /* Initialize RTC MSP */ + HAL_RTC_MspInit(hrtc); +#endif /* (USE_HAL_RTC_REGISTER_CALLBACKS) */ + } + + /* Set RTC state */ + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Check whether the calendar needs to be initialized */ + if (__HAL_RTC_IS_CALENDAR_INITIALIZED(hrtc) == 0U) + { + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Enter Initialization mode */ + status = RTC_EnterInitMode(hrtc); + + if(status == HAL_OK) + { + /* Clear RTC_CR FMT, OSEL and POL Bits */ + hrtc->Instance->CR &= ~(RTC_CR_FMT | RTC_CR_POL | RTC_CR_OSEL | RTC_CR_TAMPOE); + /* Set RTC_CR register */ + hrtc->Instance->CR |= (hrtc->Init.HourFormat | hrtc->Init.OutPut | hrtc->Init.OutPutPolarity); + + /* Configure the RTC PRER */ + hrtc->Instance->PRER = (hrtc->Init.SynchPrediv); + hrtc->Instance->PRER |= (hrtc->Init.AsynchPrediv << RTC_PRER_PREDIV_A_Pos); + + /* Exit Initialization mode */ + status = RTC_ExitInitMode(hrtc); + } + + if (status == HAL_OK) + { + hrtc->Instance->CR &= ~(RTC_CR_TAMPALRM_PU |RTC_CR_TAMPALRM_TYPE | RTC_CR_OUT2EN); + hrtc->Instance->CR |= (hrtc->Init.OutPutPullUp | hrtc->Init.OutPutType | hrtc->Init.OutPutRemap); + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + } + else + { + /* The calendar is already initialized */ + status = HAL_OK; + } + + if (status == HAL_OK) + { + hrtc->State = HAL_RTC_STATE_READY; + } + } + + return status; +} + +/** + * @brief DeInitialize the RTC peripheral. + * @note This function does not reset the RTC Backup Data registers. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc) +{ + HAL_StatusTypeDef status; + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance)); + + /* Set RTC state */ + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Enter Initialization mode */ + status = RTC_EnterInitMode(hrtc); + if(status == HAL_OK) + { + /* Reset TR, DR and CR registers */ + hrtc->Instance->TR = 0x00000000U; + hrtc->Instance->DR = ((uint32_t)(RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0)); + /* Reset All CR bits except CR[2:0] */ + hrtc->Instance->CR &= RTC_CR_WUCKSEL; + + tickstart = HAL_GetTick(); + + /* Wait till WUTWF flag is set and if Time out is reached exit */ + while(((hrtc->Instance->ICSR) & RTC_ICSR_WUTWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Set RTC state */ + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + return HAL_TIMEOUT; + } + } + + /* Reset all RTC CR register bits */ + hrtc->Instance->CR &= 0x00000000U; + hrtc->Instance->WUTR = RTC_WUTR_WUT; + hrtc->Instance->PRER = ((uint32_t)(RTC_PRER_PREDIV_A | 0x000000FFU)); + hrtc->Instance->ALRMAR = 0x00000000U; + hrtc->Instance->ALRMBR = 0x00000000U; + hrtc->Instance->SHIFTR = 0x00000000U; + hrtc->Instance->CALR = 0x00000000U; + hrtc->Instance->ALRMASSR = 0x00000000U; + hrtc->Instance->ALRMBSSR = 0x00000000U; + + /* Exit initialization mode */ + status = RTC_ExitInitMode(hrtc); + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + if (status == HAL_OK) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + if(hrtc->MspDeInitCallback == NULL) + { + hrtc->MspDeInitCallback = HAL_RTC_MspDeInit; + } + + /* DeInit the low level hardware: CLOCK, NVIC.*/ + hrtc->MspDeInitCallback(hrtc); + +#else + /* De-Initialize RTC MSP */ + HAL_RTC_MspDeInit(hrtc); +#endif /* (USE_HAL_RTC_REGISTER_CALLBACKS) */ + + hrtc->State = HAL_RTC_STATE_RESET; + } + + /* Release Lock */ + __HAL_UNLOCK(hrtc); + + return status; +} + +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User RTC Callback + * To be used instead of the weak predefined callback + * @param hrtc RTC handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_RTC_ALARM_A_EVENT_CB_ID Alarm A Event Callback ID + * @arg @ref HAL_RTC_ALARM_B_EVENT_CB_ID Alarm B Event Callback ID + * @arg @ref HAL_RTC_TIMESTAMP_EVENT_CB_ID TimeStamp Event Callback ID + * @arg @ref HAL_RTC_WAKEUPTIMER_EVENT_CB_ID WakeUp Timer Event Callback ID + * @arg @ref HAL_RTC_TAMPER1_EVENT_CB_ID Tamper 1 Callback ID + * @arg @ref HAL_RTC_TAMPER2_EVENT_CB_ID Tamper 2 Callback ID + * @arg @ref HAL_RTC_TAMPER3_EVENT_CB_ID Tamper 3 Callback ID (*) + * @arg @ref HAL_RTC_INTERNAL_TAMPER3_EVENT_CB_ID Internal Tamper 3 Callback ID + * @arg @ref HAL_RTC_INTERNAL_TAMPER4_EVENT_CB_ID Internal Tamper 4 Callback ID + * @arg @ref HAL_RTC_INTERNAL_TAMPER5_EVENT_CB_ID Internal Tamper 5 Callback ID + * @arg @ref HAL_RTC_INTERNAL_TAMPER6_EVENT_CB_ID Internal Tamper 6 Callback ID + * @arg @ref HAL_RTC_MSPINIT_CB_ID Msp Init callback ID + * @arg @ref HAL_RTC_MSPDEINIT_CB_ID Msp DeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_RegisterCallback(RTC_HandleTypeDef *hrtc, HAL_RTC_CallbackIDTypeDef CallbackID, pRTC_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if(pCallback == NULL) + { + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hrtc); + + if(HAL_RTC_STATE_READY == hrtc->State) + { + switch (CallbackID) + { + case HAL_RTC_ALARM_A_EVENT_CB_ID : + hrtc->AlarmAEventCallback = pCallback; + break; + + case HAL_RTC_ALARM_B_EVENT_CB_ID : + hrtc->AlarmBEventCallback = pCallback; + break; + + case HAL_RTC_TIMESTAMP_EVENT_CB_ID : + hrtc->TimeStampEventCallback = pCallback; + break; + + case HAL_RTC_WAKEUPTIMER_EVENT_CB_ID : + hrtc->WakeUpTimerEventCallback = pCallback; + break; + + case HAL_RTC_TAMPER1_EVENT_CB_ID : + hrtc->Tamper1EventCallback = pCallback; + break; + + case HAL_RTC_TAMPER2_EVENT_CB_ID : + hrtc->Tamper2EventCallback = pCallback; + break; + +#if defined(TAMP_CR1_TAMP3E) + case HAL_RTC_TAMPER3_EVENT_CB_ID : + hrtc->Tamper3EventCallback = pCallback; + break; +#endif /* TAMP_CR1_TAMP3E */ + + case HAL_RTC_INTERNAL_TAMPER3_EVENT_CB_ID : + hrtc->InternalTamper3EventCallback = pCallback; + break; + + case HAL_RTC_INTERNAL_TAMPER4_EVENT_CB_ID : + hrtc->InternalTamper4EventCallback = pCallback; + break; + + case HAL_RTC_INTERNAL_TAMPER5_EVENT_CB_ID : + hrtc->InternalTamper5EventCallback = pCallback; + break; + + case HAL_RTC_INTERNAL_TAMPER6_EVENT_CB_ID : + hrtc->InternalTamper6EventCallback = pCallback; + break; + + case HAL_RTC_MSPINIT_CB_ID : + hrtc->MspInitCallback = pCallback; + break; + + case HAL_RTC_MSPDEINIT_CB_ID : + hrtc->MspDeInitCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if(HAL_RTC_STATE_RESET == hrtc->State) + { + switch (CallbackID) + { + case HAL_RTC_MSPINIT_CB_ID : + hrtc->MspInitCallback = pCallback; + break; + + case HAL_RTC_MSPDEINIT_CB_ID : + hrtc->MspDeInitCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hrtc); + + return status; +} + +/** + * @brief Unregister an RTC Callback + * RTC callback is redirected to the weak predefined callback + * @param hrtc RTC handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_RTC_ALARM_A_EVENT_CB_ID Alarm A Event Callback ID + * @arg @ref HAL_RTC_ALARM_B_EVENT_CB_ID Alarm B Event Callback ID + * @arg @ref HAL_RTC_TIMESTAMP_EVENT_CB_ID TimeStamp Event Callback ID + * @arg @ref HAL_RTC_WAKEUPTIMER_EVENT_CB_ID WakeUp Timer Event Callback ID + * @arg @ref HAL_RTC_TAMPER1_EVENT_CB_ID Tamper 1 Callback ID + * @arg @ref HAL_RTC_TAMPER2_EVENT_CB_ID Tamper 2 Callback ID + * @arg @ref HAL_RTC_TAMPER3_EVENT_CB_ID Tamper 3 Callback ID (*) + * @arg @ref HAL_RTC_INTERNAL_TAMPER3_EVENT_CB_ID Internal Tamper 3 Callback ID + * @arg @ref HAL_RTC_INTERNAL_TAMPER4_EVENT_CB_ID Internal Tamper 4 Callback ID + * @arg @ref HAL_RTC_INTERNAL_TAMPER5_EVENT_CB_ID Internal Tamper 5 Callback ID + * @arg @ref HAL_RTC_INTERNAL_TAMPER6_EVENT_CB_ID Internal Tamper 6 Callback ID + * @arg @ref HAL_RTC_MSPINIT_CB_ID Msp Init callback ID + * @arg @ref HAL_RTC_MSPDEINIT_CB_ID Msp DeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_UnRegisterCallback(RTC_HandleTypeDef *hrtc, HAL_RTC_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hrtc); + + if(HAL_RTC_STATE_READY == hrtc->State) + { + switch (CallbackID) + { + case HAL_RTC_ALARM_A_EVENT_CB_ID : + hrtc->AlarmAEventCallback = HAL_RTC_AlarmAEventCallback; /* Legacy weak AlarmAEventCallback */ + break; + + case HAL_RTC_ALARM_B_EVENT_CB_ID : + hrtc->AlarmBEventCallback = HAL_RTCEx_AlarmBEventCallback; /* Legacy weak AlarmBEventCallback */ + break; + + case HAL_RTC_TIMESTAMP_EVENT_CB_ID : + hrtc->TimeStampEventCallback = HAL_RTCEx_TimeStampEventCallback; /* Legacy weak TimeStampEventCallback */ + break; + + case HAL_RTC_WAKEUPTIMER_EVENT_CB_ID : + hrtc->WakeUpTimerEventCallback = HAL_RTCEx_WakeUpTimerEventCallback; /* Legacy weak WakeUpTimerEventCallback */ + break; + + case HAL_RTC_TAMPER1_EVENT_CB_ID : + hrtc->Tamper1EventCallback = HAL_RTCEx_Tamper1EventCallback; /* Legacy weak Tamper1EventCallback */ + break; + + case HAL_RTC_TAMPER2_EVENT_CB_ID : + hrtc->Tamper2EventCallback = HAL_RTCEx_Tamper2EventCallback; /* Legacy weak Tamper2EventCallback */ + break; + +#if defined(TAMP_CR1_TAMP3E) + case HAL_RTC_TAMPER3_EVENT_CB_ID : + hrtc->Tamper3EventCallback = HAL_RTCEx_Tamper3EventCallback; /* Legacy weak Tamper3EventCallback */ + break; +#endif /* TAMP_CR1_TAMP3E */ + + case HAL_RTC_INTERNAL_TAMPER3_EVENT_CB_ID : + hrtc->InternalTamper3EventCallback = HAL_RTCEx_InternalTamper3EventCallback; /* Legacy weak InternalTamper3EventCallback */ + break; + + case HAL_RTC_INTERNAL_TAMPER4_EVENT_CB_ID : + hrtc->InternalTamper4EventCallback = HAL_RTCEx_InternalTamper4EventCallback; /* Legacy weak InternalTamper4EventCallback */ + break; + + case HAL_RTC_INTERNAL_TAMPER5_EVENT_CB_ID : + hrtc->InternalTamper5EventCallback = HAL_RTCEx_InternalTamper5EventCallback; /* Legacy weak InternalTamper5EventCallback */ + break; + + case HAL_RTC_INTERNAL_TAMPER6_EVENT_CB_ID : + hrtc->InternalTamper6EventCallback = HAL_RTCEx_InternalTamper6EventCallback; /* Legacy weak InternalTamper6EventCallback */ + break; + + + case HAL_RTC_MSPINIT_CB_ID : + hrtc->MspInitCallback = HAL_RTC_MspInit; + break; + + case HAL_RTC_MSPDEINIT_CB_ID : + hrtc->MspDeInitCallback = HAL_RTC_MspDeInit; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if(HAL_RTC_STATE_RESET == hrtc->State) + { + switch (CallbackID) + { + case HAL_RTC_MSPINIT_CB_ID : + hrtc->MspInitCallback = HAL_RTC_MspInit; + break; + + case HAL_RTC_MSPDEINIT_CB_ID : + hrtc->MspDeInitCallback = HAL_RTC_MspDeInit; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hrtc); + + return status; +} +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + +/** + * @brief Initialize the RTC MSP. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitialize the RTC MSP. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTC_MspDeInit could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @addtogroup RTC_Exported_Functions_Group2 + * @brief RTC Time and Date functions + * +@verbatim + =============================================================================== + ##### RTC Time and Date functions ##### + =============================================================================== + + [..] This section provides functions allowing to configure Time and Date features + +@endverbatim + * @{ + */ + +/** + * @brief Set RTC current time. + * @param hrtc RTC handle + * @param sTime Pointer to Time structure + * @param Format Specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_FORMAT_BIN: Binary data format + * @arg RTC_FORMAT_BCD: BCD data format + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) +{ + uint32_t tmpreg; + HAL_StatusTypeDef status; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(Format)); + assert_param(IS_RTC_DAYLIGHT_SAVING(sTime->DayLightSaving)); + assert_param(IS_RTC_STORE_OPERATION(sTime->StoreOperation)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Enter Initialization mode */ + status = RTC_EnterInitMode(hrtc); + if(status == HAL_OK) + { + if(Format == RTC_FORMAT_BIN) + { + if((hrtc->Instance->CR & RTC_CR_FMT) != 0U) + { + assert_param(IS_RTC_HOUR12(sTime->Hours)); + assert_param(IS_RTC_HOURFORMAT12(sTime->TimeFormat)); + } + else + { + sTime->TimeFormat = 0x00U; + assert_param(IS_RTC_HOUR24(sTime->Hours)); + } + assert_param(IS_RTC_MINUTES(sTime->Minutes)); + assert_param(IS_RTC_SECONDS(sTime->Seconds)); + + tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(sTime->Hours) << RTC_TR_HU_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sTime->Minutes) << RTC_TR_MNU_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sTime->Seconds) << RTC_TR_SU_Pos) | \ + (((uint32_t)sTime->TimeFormat) << RTC_TR_PM_Pos)); + } + else + { + if((hrtc->Instance->CR & RTC_CR_FMT) != 0U) + { + assert_param(IS_RTC_HOUR12(RTC_Bcd2ToByte(sTime->Hours))); + assert_param(IS_RTC_HOURFORMAT12(sTime->TimeFormat)); + } + else + { + sTime->TimeFormat = 0x00U; + assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sTime->Hours))); + } + assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sTime->Minutes))); + assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sTime->Seconds))); + tmpreg = (((uint32_t)(sTime->Hours) << RTC_TR_HU_Pos) | \ + ((uint32_t)(sTime->Minutes) << RTC_TR_MNU_Pos) | \ + ((uint32_t)(sTime->Seconds) << RTC_TR_SU_Pos) | \ + ((uint32_t)(sTime->TimeFormat) << RTC_TR_PM_Pos)); + } + + /* Set the RTC_TR register */ + hrtc->Instance->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK); + + /* This interface is deprecated. To manage Daylight Saving Time, please use HAL_RTC_DST_xxx functions */ + hrtc->Instance->CR &= ((uint32_t)~RTC_CR_BKP); + + /* This interface is deprecated. To manage Daylight Saving Time, please use HAL_RTC_DST_xxx functions */ + hrtc->Instance->CR |= (uint32_t)(sTime->DayLightSaving | sTime->StoreOperation); + + /* Exit Initialization mode */ + status = RTC_ExitInitMode(hrtc); + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + if (status == HAL_OK) + { + hrtc->State = HAL_RTC_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return status; +} + +/** + * @brief Get RTC current time. + * @note You can use SubSeconds and SecondFraction (sTime structure fields returned) to convert SubSeconds + * value in second fraction ratio with time unit following generic formula: + * Second fraction ratio * time_unit= [(SecondFraction-SubSeconds)/(SecondFraction+1)] * time_unit + * This conversion can be performed only if no shift operation is pending (ie. SHFP=0) when PREDIV_S >= SS + * @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values + * in the higher-order calendar shadow registers to ensure consistency between the time and date values. + * Reading RTC current time locks the values in calendar shadow registers until Current date is read + * to ensure consistency between the time and date values. + * @param hrtc RTC handle + * @param sTime Pointer to Time structure with Hours, Minutes and Seconds fields returned + * with input format (BIN or BCD), also SubSeconds field returning the + * RTC_SSR register content and SecondFraction field the Synchronous pre-scaler + * factor to be used for second fraction ratio computation. + * @param Format Specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_FORMAT_BIN: Binary data format + * @arg RTC_FORMAT_BCD: BCD data format + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) +{ + uint32_t tmpreg; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(Format)); + + /* Get subseconds structure field from the corresponding register*/ + sTime->SubSeconds = (uint32_t)(hrtc->Instance->SSR); + + /* Get SecondFraction structure field from the corresponding register field*/ + sTime->SecondFraction = (uint32_t)(hrtc->Instance->PRER & RTC_PRER_PREDIV_S); + + /* Get the TR register */ + tmpreg = (uint32_t)(hrtc->Instance->TR & RTC_TR_RESERVED_MASK); + + /* Fill the structure fields with the read parameters */ + sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> RTC_TR_HU_Pos); + sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >> RTC_TR_MNU_Pos); + sTime->Seconds = (uint8_t)((tmpreg & (RTC_TR_ST | RTC_TR_SU)) >> RTC_TR_SU_Pos); + sTime->TimeFormat = (uint8_t)((tmpreg & (RTC_TR_PM)) >> RTC_TR_PM_Pos); + + /* Check the input parameters format */ + if(Format == RTC_FORMAT_BIN) + { + /* Convert the time structure parameters to Binary format */ + sTime->Hours = (uint8_t)RTC_Bcd2ToByte(sTime->Hours); + sTime->Minutes = (uint8_t)RTC_Bcd2ToByte(sTime->Minutes); + sTime->Seconds = (uint8_t)RTC_Bcd2ToByte(sTime->Seconds); + } + + return HAL_OK; +} + +/** + * @brief Set RTC current date. + * @param hrtc RTC handle + * @param sDate Pointer to date structure + * @param Format specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_FORMAT_BIN: Binary data format + * @arg RTC_FORMAT_BCD: BCD data format + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format) +{ + uint32_t datetmpreg; + HAL_StatusTypeDef status; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(Format)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + if((Format == RTC_FORMAT_BIN) && ((sDate->Month & 0x10U) == 0x10U)) + { + sDate->Month = (uint8_t)((sDate->Month & (uint8_t)~(0x10U)) + (uint8_t)0x0AU); + } + + assert_param(IS_RTC_WEEKDAY(sDate->WeekDay)); + + if(Format == RTC_FORMAT_BIN) + { + assert_param(IS_RTC_YEAR(sDate->Year)); + assert_param(IS_RTC_MONTH(sDate->Month)); + assert_param(IS_RTC_DATE(sDate->Date)); + + datetmpreg = (((uint32_t)RTC_ByteToBcd2(sDate->Year) << RTC_DR_YU_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sDate->Month) << RTC_DR_MU_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sDate->Date) << RTC_DR_DU_Pos) | \ + ((uint32_t)sDate->WeekDay << RTC_DR_WDU_Pos)); + } + else + { + assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(sDate->Year))); + assert_param(IS_RTC_MONTH(RTC_Bcd2ToByte(sDate->Month))); + assert_param(IS_RTC_DATE(RTC_Bcd2ToByte(sDate->Date))); + + datetmpreg = ((((uint32_t)sDate->Year) << RTC_DR_YU_Pos) | \ + (((uint32_t)sDate->Month) << RTC_DR_MU_Pos) | \ + (((uint32_t)sDate->Date) << RTC_DR_DU_Pos)| \ + (((uint32_t)sDate->WeekDay) << RTC_DR_WDU_Pos)); + } + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Enter Initialization mode */ + status = RTC_EnterInitMode(hrtc); + if(status == HAL_OK) + { + /* Set the RTC_DR register */ + hrtc->Instance->DR = (uint32_t)(datetmpreg & RTC_DR_RESERVED_MASK); + + /* Exit Initialization mode */ + status = RTC_ExitInitMode(hrtc); + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + if (status == HAL_OK) + { + hrtc->State = HAL_RTC_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return status; +} + +/** + * @brief Get RTC current date. + * @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values + * in the higher-order calendar shadow registers to ensure consistency between the time and date values. + * Reading RTC current time locks the values in calendar shadow registers until Current date is read. + * @param hrtc RTC handle + * @param sDate Pointer to Date structure + * @param Format Specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_FORMAT_BIN: Binary data format + * @arg RTC_FORMAT_BCD: BCD data format + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format) +{ + uint32_t datetmpreg; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(Format)); + + /* Get the DR register */ + datetmpreg = (uint32_t)(hrtc->Instance->DR & RTC_DR_RESERVED_MASK); + + /* Fill the structure fields with the read parameters */ + sDate->Year = (uint8_t)((datetmpreg & (RTC_DR_YT | RTC_DR_YU)) >> RTC_DR_YU_Pos); + sDate->Month = (uint8_t)((datetmpreg & (RTC_DR_MT | RTC_DR_MU)) >> RTC_DR_MU_Pos); + sDate->Date = (uint8_t)((datetmpreg & (RTC_DR_DT | RTC_DR_DU)) >> RTC_DR_DU_Pos); + sDate->WeekDay = (uint8_t)((datetmpreg & (RTC_DR_WDU)) >> RTC_DR_WDU_Pos); + + /* Check the input parameters format */ + if(Format == RTC_FORMAT_BIN) + { + /* Convert the date structure parameters to Binary format */ + sDate->Year = (uint8_t)RTC_Bcd2ToByte(sDate->Year); + sDate->Month = (uint8_t)RTC_Bcd2ToByte(sDate->Month); + sDate->Date = (uint8_t)RTC_Bcd2ToByte(sDate->Date); + } + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup RTC_Exported_Functions_Group3 + * @brief RTC Alarm functions + * +@verbatim + =============================================================================== + ##### RTC Alarm functions ##### + =============================================================================== + + [..] This section provides functions allowing to configure Alarm feature + +@endverbatim + * @{ + */ +/** + * @brief Set the specified RTC Alarm. + * @param hrtc RTC handle + * @param sAlarm Pointer to Alarm structure + * @param Format Specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_FORMAT_BIN: Binary data format + * @arg RTC_FORMAT_BCD: BCD data format + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format) +{ + uint32_t tickstart; + uint32_t tmpreg; + uint32_t subsecondtmpreg; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(Format)); + assert_param(IS_RTC_ALARM(sAlarm->Alarm)); + assert_param(IS_RTC_ALARM_MASK(sAlarm->AlarmMask)); + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_SEL(sAlarm->AlarmDateWeekDaySel)); + assert_param(IS_RTC_ALARM_SUB_SECOND_VALUE(sAlarm->AlarmTime.SubSeconds)); + assert_param(IS_RTC_ALARM_SUB_SECOND_MASK(sAlarm->AlarmSubSecondMask)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + if(Format == RTC_FORMAT_BIN) + { + if((hrtc->Instance->CR & RTC_CR_FMT) != 0U) + { + assert_param(IS_RTC_HOUR12(sAlarm->AlarmTime.Hours)); + assert_param(IS_RTC_HOURFORMAT12(sAlarm->AlarmTime.TimeFormat)); + } + else + { + sAlarm->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_RTC_HOUR24(sAlarm->AlarmTime.Hours)); + } + assert_param(IS_RTC_MINUTES(sAlarm->AlarmTime.Minutes)); + assert_param(IS_RTC_SECONDS(sAlarm->AlarmTime.Seconds)); + + if(sAlarm->AlarmDateWeekDaySel == RTC_ALARMDATEWEEKDAYSEL_DATE) + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(sAlarm->AlarmDateWeekDay)); + } + else + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(sAlarm->AlarmDateWeekDay)); + } + + tmpreg = (((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Hours) << RTC_ALRMAR_HU_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Minutes) << RTC_ALRMAR_MNU_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Seconds) << RTC_ALRMAR_SU_Pos) | \ + ((uint32_t)(sAlarm->AlarmTime.TimeFormat) << RTC_ALRMAR_PM_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmDateWeekDay) << RTC_ALRMAR_DU_Pos) | \ + ((uint32_t)sAlarm->AlarmDateWeekDaySel) | \ + ((uint32_t)sAlarm->AlarmMask)); + } + else + { + if((hrtc->Instance->CR & RTC_CR_FMT) != 0U) + { + assert_param(IS_RTC_HOUR12(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours))); + assert_param(IS_RTC_HOURFORMAT12(sAlarm->AlarmTime.TimeFormat)); + } + else + { + sAlarm->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours))); + } + + assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes))); + assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds))); + + if(sAlarm->AlarmDateWeekDaySel == RTC_ALARMDATEWEEKDAYSEL_DATE) + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay))); + } + else + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay))); + } + + tmpreg = (((uint32_t)(sAlarm->AlarmTime.Hours) << RTC_ALRMAR_HU_Pos) | \ + ((uint32_t)(sAlarm->AlarmTime.Minutes) << RTC_ALRMAR_MNU_Pos) | \ + ((uint32_t)(sAlarm->AlarmTime.Seconds) << RTC_ALRMAR_SU_Pos) | \ + ((uint32_t)(sAlarm->AlarmTime.TimeFormat) << RTC_ALRMAR_PM_Pos) | \ + ((uint32_t)(sAlarm->AlarmDateWeekDay) << RTC_ALRMAR_DU_Pos) | \ + ((uint32_t)sAlarm->AlarmDateWeekDaySel) | \ + ((uint32_t)sAlarm->AlarmMask)); + } + + /* Configure the Alarm A or Alarm B Sub Second registers */ + subsecondtmpreg = (uint32_t)((uint32_t)(sAlarm->AlarmTime.SubSeconds) | (uint32_t)(sAlarm->AlarmSubSecondMask)); + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Configure the Alarm register */ + if(sAlarm->Alarm == RTC_ALARM_A) + { + /* Disable the Alarm A interrupt */ + __HAL_RTC_ALARMA_DISABLE(hrtc); + + /* In case of interrupt mode is used, the interrupt source must disabled */ + __HAL_RTC_ALARM_DISABLE_IT(hrtc, RTC_IT_ALRA); + + tickstart = HAL_GetTick(); + /* Wait till RTC ALRAWF flag is set and if Time out is reached exit */ + while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + + hrtc->Instance->ALRMAR = (uint32_t)tmpreg; + /* Configure the Alarm A Sub Second register */ + hrtc->Instance->ALRMASSR = subsecondtmpreg; + /* Configure the Alarm state: Enable Alarm */ + __HAL_RTC_ALARMA_ENABLE(hrtc); + } + else + { + /* Disable the Alarm B interrupt */ + __HAL_RTC_ALARMB_DISABLE(hrtc); + + /* In case of interrupt mode is used, the interrupt source must disabled */ + __HAL_RTC_ALARM_DISABLE_IT(hrtc, RTC_IT_ALRB); + + tickstart = HAL_GetTick(); + /* Wait till RTC ALRBWF flag is set and if Time out is reached exit */ + while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + + hrtc->Instance->ALRMBR = (uint32_t)tmpreg; + /* Configure the Alarm B Sub Second register */ + hrtc->Instance->ALRMBSSR = subsecondtmpreg; + /* Configure the Alarm state: Enable Alarm */ + __HAL_RTC_ALARMB_ENABLE(hrtc); + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Set the specified RTC Alarm with Interrupt. + * @note The Alarm register can only be written when the corresponding Alarm + * is disabled (Use the HAL_RTC_DeactivateAlarm()). + * @note The HAL_RTC_SetTime() must be called before enabling the Alarm feature. + * @param hrtc RTC handle + * @param sAlarm Pointer to Alarm structure + * @param Format Specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_FORMAT_BIN: Binary data format + * @arg RTC_FORMAT_BCD: BCD data format + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format) +{ + uint32_t tickstart; + uint32_t tmpreg; + uint32_t subsecondtmpreg; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(Format)); + assert_param(IS_RTC_ALARM(sAlarm->Alarm)); + assert_param(IS_RTC_ALARM_MASK(sAlarm->AlarmMask)); + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_SEL(sAlarm->AlarmDateWeekDaySel)); + assert_param(IS_RTC_ALARM_SUB_SECOND_VALUE(sAlarm->AlarmTime.SubSeconds)); + assert_param(IS_RTC_ALARM_SUB_SECOND_MASK(sAlarm->AlarmSubSecondMask)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + if(Format == RTC_FORMAT_BIN) + { + if((hrtc->Instance->CR & RTC_CR_FMT) != 0U) + { + assert_param(IS_RTC_HOUR12(sAlarm->AlarmTime.Hours)); + assert_param(IS_RTC_HOURFORMAT12(sAlarm->AlarmTime.TimeFormat)); + } + else + { + sAlarm->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_RTC_HOUR24(sAlarm->AlarmTime.Hours)); + } + assert_param(IS_RTC_MINUTES(sAlarm->AlarmTime.Minutes)); + assert_param(IS_RTC_SECONDS(sAlarm->AlarmTime.Seconds)); + + if(sAlarm->AlarmDateWeekDaySel == RTC_ALARMDATEWEEKDAYSEL_DATE) + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(sAlarm->AlarmDateWeekDay)); + } + else + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(sAlarm->AlarmDateWeekDay)); + } + tmpreg = (((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Hours) << RTC_ALRMAR_HU_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Minutes) << RTC_ALRMAR_MNU_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Seconds) << RTC_ALRMAR_SU_Pos) | \ + ((uint32_t)(sAlarm->AlarmTime.TimeFormat) << RTC_ALRMAR_PM_Pos) | \ + ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmDateWeekDay) << RTC_ALRMAR_DU_Pos) | \ + ((uint32_t)sAlarm->AlarmDateWeekDaySel) | \ + ((uint32_t)sAlarm->AlarmMask)); + } + else + { + if((hrtc->Instance->CR & RTC_CR_FMT) != 0U) + { + assert_param(IS_RTC_HOUR12(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours))); + assert_param(IS_RTC_HOURFORMAT12(sAlarm->AlarmTime.TimeFormat)); + } + else + { + sAlarm->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours))); + } + + assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes))); + assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds))); + + if(sAlarm->AlarmDateWeekDaySel == RTC_ALARMDATEWEEKDAYSEL_DATE) + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay))); + } + else + { + assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay))); + } + tmpreg = (((uint32_t)(sAlarm->AlarmTime.Hours) << RTC_ALRMAR_HU_Pos) | \ + ((uint32_t)(sAlarm->AlarmTime.Minutes) << RTC_ALRMAR_MNU_Pos) | \ + ((uint32_t)(sAlarm->AlarmTime.Seconds) << RTC_ALRMAR_SU_Pos) | \ + ((uint32_t)(sAlarm->AlarmTime.TimeFormat) << RTC_ALRMAR_PM_Pos) | \ + ((uint32_t)(sAlarm->AlarmDateWeekDay) << RTC_ALRMAR_DU_Pos) | \ + ((uint32_t)sAlarm->AlarmDateWeekDaySel) | \ + ((uint32_t)sAlarm->AlarmMask)); + } + /* Configure the Alarm A or Alarm B Sub Second registers */ + subsecondtmpreg = (uint32_t)((uint32_t)(sAlarm->AlarmTime.SubSeconds) | (uint32_t)(sAlarm->AlarmSubSecondMask)); + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Configure the Alarm register */ + if(sAlarm->Alarm == RTC_ALARM_A) + { + /* Disable the Alarm A interrupt */ + __HAL_RTC_ALARMA_DISABLE(hrtc); + + /* Clear flag alarm A */ + __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF); + + tickstart = HAL_GetTick(); + /* Wait till RTC ALRAWF flag is set and if Time out is reached exit */ + while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + + hrtc->Instance->ALRMAR = (uint32_t)tmpreg; + /* Configure the Alarm A Sub Second register */ + hrtc->Instance->ALRMASSR = subsecondtmpreg; + /* Configure the Alarm state: Enable Alarm */ + __HAL_RTC_ALARMA_ENABLE(hrtc); + /* Configure the Alarm interrupt */ + __HAL_RTC_ALARM_ENABLE_IT(hrtc,RTC_IT_ALRA); + } + else + { + /* Disable the Alarm B interrupt */ + __HAL_RTC_ALARMB_DISABLE(hrtc); + + /* Clear flag alarm B */ + __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_CLEAR_ALRBF); + + tickstart = HAL_GetTick(); + /* Wait till RTC ALRBWF flag is set and if Time out is reached exit */ + while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + + hrtc->Instance->ALRMBR = (uint32_t)tmpreg; + /* Configure the Alarm B Sub Second register */ + hrtc->Instance->ALRMBSSR = subsecondtmpreg; + /* Configure the Alarm state: Enable Alarm */ + __HAL_RTC_ALARMB_ENABLE(hrtc); + /* Configure the Alarm interrupt */ + __HAL_RTC_ALARM_ENABLE_IT(hrtc, RTC_IT_ALRB); + } + + /* RTC Alarm Interrupt Configuration: EXTI configuration */ + __HAL_RTC_ALARM_EXTI_ENABLE_IT(); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Deactivate the specified RTC Alarm. + * @param hrtc RTC handle + * @param Alarm Specifies the Alarm. + * This parameter can be one of the following values: + * @arg RTC_ALARM_A: AlarmA + * @arg RTC_ALARM_B: AlarmB + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm) +{ + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_RTC_ALARM(Alarm)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + if(Alarm == RTC_ALARM_A) + { + /* AlarmA */ + __HAL_RTC_ALARMA_DISABLE(hrtc); + + /* In case of interrupt mode is used, the interrupt source must disabled */ + __HAL_RTC_ALARM_DISABLE_IT(hrtc, RTC_IT_ALRA); + + tickstart = HAL_GetTick(); + + /* Wait till RTC ALRxWF flag is set and if Time out is reached exit */ + while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAWF) == 0U) + { + if( (HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + } + else + { + /* AlarmB */ + __HAL_RTC_ALARMB_DISABLE(hrtc); + + /* In case of interrupt mode is used, the interrupt source must disabled */ + __HAL_RTC_ALARM_DISABLE_IT(hrtc,RTC_IT_ALRB); + + tickstart = HAL_GetTick(); + + /* Wait till RTC ALRxWF flag is set and if Time out is reached exit */ + while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + } + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Get the RTC Alarm value and masks. + * @param hrtc RTC handle + * @param sAlarm Pointer to Date structure + * @param Alarm Specifies the Alarm. + * This parameter can be one of the following values: + * @arg RTC_ALARM_A: AlarmA + * @arg RTC_ALARM_B: AlarmB + * @param Format Specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_FORMAT_BIN: Binary data format + * @arg RTC_FORMAT_BCD: BCD data format + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format) +{ + uint32_t tmpreg; + uint32_t subsecondtmpreg; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(Format)); + assert_param(IS_RTC_ALARM(Alarm)); + + if(Alarm == RTC_ALARM_A) + { + /* AlarmA */ + sAlarm->Alarm = RTC_ALARM_A; + + tmpreg = (uint32_t)(hrtc->Instance->ALRMAR); + subsecondtmpreg = (uint32_t)((hrtc->Instance->ALRMASSR ) & RTC_ALRMASSR_SS); + + /* Fill the structure with the read parameters */ + sAlarm->AlarmTime.Hours = (uint8_t)((tmpreg & (RTC_ALRMAR_HT | RTC_ALRMAR_HU)) >> RTC_ALRMAR_HU_Pos); + sAlarm->AlarmTime.Minutes = (uint8_t)((tmpreg & (RTC_ALRMAR_MNT | RTC_ALRMAR_MNU)) >> RTC_ALRMAR_MNU_Pos); + sAlarm->AlarmTime.Seconds = (uint8_t)((tmpreg & (RTC_ALRMAR_ST | RTC_ALRMAR_SU)) >> RTC_ALRMAR_SU_Pos); + sAlarm->AlarmTime.TimeFormat = (uint8_t)((tmpreg & RTC_ALRMAR_PM) >> RTC_ALRMAR_PM_Pos); + sAlarm->AlarmTime.SubSeconds = (uint32_t) subsecondtmpreg; + sAlarm->AlarmDateWeekDay = (uint8_t)((tmpreg & (RTC_ALRMAR_DT | RTC_ALRMAR_DU)) >> RTC_ALRMAR_DU_Pos); + sAlarm->AlarmDateWeekDaySel = (uint32_t)(tmpreg & RTC_ALRMAR_WDSEL); + sAlarm->AlarmMask = (uint32_t)(tmpreg & RTC_ALARMMASK_ALL); + } + else + { + sAlarm->Alarm = RTC_ALARM_B; + + tmpreg = (uint32_t)(hrtc->Instance->ALRMBR); + subsecondtmpreg = (uint32_t)((hrtc->Instance->ALRMBSSR) & RTC_ALRMBSSR_SS); + + /* Fill the structure with the read parameters */ + sAlarm->AlarmTime.Hours = (uint8_t)((tmpreg & (RTC_ALRMBR_HT | RTC_ALRMBR_HU)) >> RTC_ALRMBR_HU_Pos); + sAlarm->AlarmTime.Minutes = (uint8_t)((tmpreg & (RTC_ALRMBR_MNT | RTC_ALRMBR_MNU)) >> RTC_ALRMBR_MNU_Pos); + sAlarm->AlarmTime.Seconds = (uint8_t)((tmpreg & (RTC_ALRMBR_ST | RTC_ALRMBR_SU)) >> RTC_ALRMBR_SU_Pos); + sAlarm->AlarmTime.TimeFormat = (uint8_t)((tmpreg & RTC_ALRMBR_PM) >> RTC_ALRMBR_PM_Pos); + sAlarm->AlarmTime.SubSeconds = (uint32_t) subsecondtmpreg; + sAlarm->AlarmDateWeekDay = (uint8_t)((tmpreg & (RTC_ALRMBR_DT | RTC_ALRMBR_DU)) >> RTC_ALRMBR_DU_Pos); + sAlarm->AlarmDateWeekDaySel = (uint32_t)(tmpreg & RTC_ALRMBR_WDSEL); + sAlarm->AlarmMask = (uint32_t)(tmpreg & RTC_ALARMMASK_ALL); + } + + if(Format == RTC_FORMAT_BIN) + { + sAlarm->AlarmTime.Hours = RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours); + sAlarm->AlarmTime.Minutes = RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes); + sAlarm->AlarmTime.Seconds = RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds); + sAlarm->AlarmDateWeekDay = RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay); + } + + return HAL_OK; +} + +/** + * @brief Handle Alarm interrupt request. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef* hrtc) +{ + /* Get the AlarmA interrupt source enable status */ + if(__HAL_RTC_ALARM_GET_IT_SOURCE(hrtc, RTC_IT_ALRA) != 0U) + { + /* Get the pending status of the AlarmA Interrupt */ + if(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAF) != 0U) + { + /* Clear the AlarmA interrupt pending bit */ + __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF); + +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Compare Match registered Callback */ + hrtc->AlarmAEventCallback(hrtc); +#else + /* AlarmA callback */ + HAL_RTC_AlarmAEventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + } + + /* Get the AlarmB interrupt source enable status */ + if(__HAL_RTC_ALARM_GET_IT_SOURCE(hrtc, RTC_IT_ALRB) != 0U) + { + /* Get the pending status of the AlarmB Interrupt */ + if(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBF) != 0U) + { + /* Clear the AlarmB interrupt pending bit */ + __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_CLEAR_ALRBF); + +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Compare Match registered Callback */ + hrtc->AlarmBEventCallback(hrtc); +#else + /* AlarmB callback */ + HAL_RTCEx_AlarmBEventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + } + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; +} + +/** + * @brief Alarm A callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTC_AlarmAEventCallback could be implemented in the user file + */ +} + +/** + * @brief Handle AlarmA Polling request. + * @param hrtc RTC handle + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout) +{ + + uint32_t tickstart = HAL_GetTick(); + + while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAF) == 0U) + { + if(Timeout != HAL_MAX_DELAY) + { + if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U)) + { + hrtc->State = HAL_RTC_STATE_TIMEOUT; + return HAL_TIMEOUT; + } + } + } + + /* Clear the Alarm interrupt pending bit */ + __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup RTC_Exported_Functions_Group4 + * @brief Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to + (+) Wait for RTC Time and Date Synchronization + +@endverbatim + * @{ + */ + +/** + * @brief Wait until the RTC Time and Date registers (RTC_TR and RTC_DR) are + * synchronized with RTC APB clock. + * @note The RTC Resynchronization mode is write protected, use the + * __HAL_RTC_WRITEPROTECTION_DISABLE() before calling this function. + * @note To read the calendar through the shadow registers after Calendar + * initialization, calendar update or after wakeup from low power modes + * the software must first clear the RSF flag. + * The software must then wait until it is set again before reading + * the calendar, which means that the calendar registers have been + * correctly copied into the RTC_TR and RTC_DR shadow registers. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTC_WaitForSynchro(RTC_HandleTypeDef* hrtc) +{ + uint32_t tickstart; + + /* Clear RSF flag */ + hrtc->Instance->ICSR &= (uint32_t)RTC_RSF_MASK; + + tickstart = HAL_GetTick(); + + /* Wait the registers to be synchronised */ + while((hrtc->Instance->ICSR & RTC_ICSR_RSF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup RTC_Exported_Functions_Group5 + * @brief Peripheral State functions + * +@verbatim + =============================================================================== + ##### Peripheral State functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to + (+) Get RTC state + +@endverbatim + * @{ + */ +/** + * @brief Return the RTC handle state. + * @param hrtc RTC handle + * @retval HAL state + */ +HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef* hrtc) +{ + /* Return RTC handle state */ + return hrtc->State; +} + +/** + * @} + */ +/** + * @} + */ + +/** @addtogroup RTC_Private_Functions + * @{ + */ +/** + * @brief Enter the RTC Initialization mode. + * @note The RTC Initialization mode is write protected, use the + * __HAL_RTC_WRITEPROTECTION_DISABLE() before calling this function. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef* hrtc) +{ + uint32_t tickstart; + HAL_StatusTypeDef status = HAL_OK; + + /* Check if the Initialization mode is set */ + if((hrtc->Instance->ICSR & RTC_ICSR_INITF) == 0U) + { + /* Set the Initialization mode */ + SET_BIT(hrtc->Instance->ICSR, RTC_ICSR_INIT); + + tickstart = HAL_GetTick(); + /* Wait till RTC is in INIT state and if Time out is reached exit */ + while(((hrtc->Instance->ICSR & RTC_ICSR_INITF) == 0U) && (status != HAL_TIMEOUT)) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + status = HAL_TIMEOUT; + hrtc->State = HAL_RTC_STATE_TIMEOUT; + } + } + } + + return status; +} + +/** + * @brief Exit the RTC Initialization mode. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef RTC_ExitInitMode(RTC_HandleTypeDef *hrtc) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Exit Initialization mode */ + CLEAR_BIT(RTC->ICSR, RTC_ICSR_INIT); + + /* If CR_BYPSHAD bit = 0, wait for synchro */ + if (READ_BIT(RTC->CR, RTC_CR_BYPSHAD) == 0U) + { + if (HAL_RTC_WaitForSynchro(hrtc) != HAL_OK) + { + hrtc->State = HAL_RTC_STATE_TIMEOUT; + status = HAL_TIMEOUT; + } + } + else /* WA 2.7.1 Calendar initialization may fail in case of consecutive INIT mode entry. + Please look at STM32G0 Errata sheet on the internet for details. */ + { + /* Clear BYPSHAD bit */ + CLEAR_BIT(RTC->CR, RTC_CR_BYPSHAD); + if (HAL_RTC_WaitForSynchro(hrtc) != HAL_OK) + { + hrtc->State = HAL_RTC_STATE_TIMEOUT; + status = HAL_TIMEOUT; + } + /* Restore BYPSHAD bit */ + SET_BIT(RTC->CR, RTC_CR_BYPSHAD); + } + + return status; +} +/** + * @brief Convert a 2 digit decimal to BCD format. + * @param Value Byte to be converted + * @retval Converted byte + */ +uint8_t RTC_ByteToBcd2(uint8_t Value) +{ + uint32_t bcdhigh = 0U; + uint8_t Param = Value; + + while(Param >= 10U) + { + bcdhigh++; + Param -= 10U; + } + + return ((uint8_t)(bcdhigh << 4U) | Param); +} + +/** + * @brief Convert from 2 digit BCD to Binary. + * @param Value BCD value to be converted + * @retval Converted word + */ +uint8_t RTC_Bcd2ToByte(uint8_t Value) +{ + uint32_t tmp; + tmp = (((uint32_t)Value & 0xF0U) >> 4U) * 10U; + return (uint8_t)(tmp + ((uint32_t)Value & 0x0FU)); +} + +/** + * @brief Daylight Saving Time, Add one hour to the calendar in one single operation + * without going through the initialization procedure. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTC_DST_Add1Hour(RTC_HandleTypeDef *hrtc) +{ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + SET_BIT(hrtc->Instance->CR, RTC_CR_ADD1H); + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); +} + +/** + * @brief Daylight Saving Time, Subtract one hour from the calendar in one + * single operation without going through the initialization procedure. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTC_DST_Sub1Hour(RTC_HandleTypeDef *hrtc) +{ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + SET_BIT(hrtc->Instance->CR, RTC_CR_SUB1H); + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); +} + +/** + * @brief Daylight Saving Time, Set the store operation bit. + * @note It can be used by the software in order to memorize the DST status. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTC_DST_SetStoreOperation(RTC_HandleTypeDef *hrtc) +{ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + SET_BIT(hrtc->Instance->CR, RTC_CR_BKP); + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); +} + +/** + * @brief Daylight Saving Time, Clear the store operation bit. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTC_DST_ClearStoreOperation(RTC_HandleTypeDef *hrtc) +{ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + CLEAR_BIT(hrtc->Instance->CR, RTC_CR_BKP); + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); +} + +/** + * @brief Daylight Saving Time, Read the store operation bit. + * @param hrtc RTC handle + * @retval operation see RTC_StoreOperation_Definitions + */ +uint32_t HAL_RTC_DST_ReadStoreOperation(RTC_HandleTypeDef *hrtc) +{ + return READ_BIT(hrtc->Instance->CR, RTC_CR_BKP); +} + +/** + * @} + */ + +#endif /* HAL_RTC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc_ex.c new file mode 100644 index 0000000..26327b1 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc_ex.c @@ -0,0 +1,1982 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_rtc_ex.c + * @author MCD Application Team + * @brief Extended RTC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Real Time Clock (RTC) Extended peripheral: + * + RTC Time Stamp functions + * + RTC Tamper functions + * + RTC Wake-up functions + * + Extended Control functions + * + Extended RTC features functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (+) Enable the RTC domain access. + (+) Configure the RTC Prescaler (Asynchronous and Synchronous) and RTC hour + format using the HAL_RTC_Init() function. + + *** RTC Wakeup configuration *** + ================================ + [..] + (+) To configure the RTC Wakeup Clock source and Counter use the HAL_RTCEx_SetWakeUpTimer() + function. You can also configure the RTC Wakeup timer with interrupt mode + using the HAL_RTCEx_SetWakeUpTimer_IT() function. + (+) To read the RTC WakeUp Counter register, use the HAL_RTCEx_GetWakeUpTimer() + function. + + *** Outputs configuration *** + ============================= + [..] The RTC has 2 different outputs: + (+) RTC_ALARM: this output is used to manage the RTC Alarm A, Alarm B + and WaKeUp signals. + To output the selected RTC signal, use the HAL_RTC_Init() function. + (+) RTC_CALIB: this output is 512Hz signal or 1Hz. + To enable the RTC_CALIB, use the HAL_RTCEx_SetCalibrationOutPut() function. + (+) Two pins can be used as RTC_ALARM or RTC_CALIB (PC13, PB2) managed on + the RTC_OR register. + (+) When the RTC_CALIB or RTC_ALARM output is selected, the RTC_OUT pin is + automatically configured in output alternate function. + + *** Smooth digital Calibration configuration *** + ================================================ + [..] + (+) Configure the RTC Original Digital Calibration Value and the corresponding + calibration cycle period (32s,16s and 8s) using the HAL_RTCEx_SetSmoothCalib() + function. + + *** TimeStamp configuration *** + =============================== + [..] + (+) Enable the RTC TimeStamp using the HAL_RTCEx_SetTimeStamp() function. + You can also configure the RTC TimeStamp with interrupt mode using the + HAL_RTCEx_SetTimeStamp_IT() function. + (+) To read the RTC TimeStamp Time and Date register, use the HAL_RTCEx_GetTimeStamp() + function. + + *** Internal TimeStamp configuration *** + =============================== + [..] + (+) Enable the RTC internal TimeStamp using the HAL_RTCEx_SetInternalTimeStamp() function. + User has to check internal timestamp occurrence using __HAL_RTC_INTERNAL_TIMESTAMP_GET_FLAG. + (+) To read the RTC TimeStamp Time and Date register, use the HAL_RTCEx_GetTimeStamp() + function. + + *** Tamper configuration *** + ============================ + [..] + (+) Enable the RTC Tamper and configure the Tamper filter count, trigger Edge + or Level according to the Tamper filter (if equal to 0 Edge else Level) + value, sampling frequency, NoErase, MaskFlag, precharge or discharge and + Pull-UP using the HAL_RTCEx_SetTamper() function. You can configure RTC Tamper + with interrupt mode using HAL_RTCEx_SetTamper_IT() function. + (+) The default configuration of the Tamper erases the backup registers. To avoid + erase, enable the NoErase field on the RTC_TAMPCR register. + (+) With new RTC tamper configuration, you have to call HAL_RTC_Init() in order to + perform TAMP base address offset calculation. + (+) If you do not intend to have tamper using RTC clock, you can bypass its initialization + by setting ClockEnable inti field to RTC_CLOCK_DISABLE. + (+) Enable Internal tamper using HAL_RTCEx_SetInternalTamper. IT mode can be chosen using + setting Interrupt field. + + *** Backup Data Registers configuration *** + =========================================== + [..] + (+) To write to the RTC Backup Data registers, use the HAL_RTCEx_BKUPWrite() + function. + (+) To read the RTC Backup Data registers, use the HAL_RTCEx_BKUPRead() + function. + (+) Before calling those functions you have to call HAL_RTC_Init() in order to + perform TAMP base address offset calculation. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @addtogroup RTCEx + * @brief RTC Extended HAL module driver + * @{ + */ + +#ifdef HAL_RTC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup RTCEx_Exported_Functions + * @{ + */ + + +/** @addtogroup RTCEx_Exported_Functions_Group1 + * @brief RTC TimeStamp and Tamper functions + * +@verbatim + =============================================================================== + ##### RTC TimeStamp and Tamper functions ##### + =============================================================================== + + [..] This section provides functions allowing to configure TimeStamp feature + +@endverbatim + * @{ + */ + +/** + * @brief Set TimeStamp. + * @note This API must be called before enabling the TimeStamp feature. + * @param hrtc RTC handle + * @param TimeStampEdge Specifies the pin edge on which the TimeStamp is + * activated. + * This parameter can be one of the following values: + * @arg RTC_TIMESTAMPEDGE_RISING: the Time stamp event occurs on the + * rising edge of the related pin. + * @arg RTC_TIMESTAMPEDGE_FALLING: the Time stamp event occurs on the + * falling edge of the related pin. + * @param RTC_TimeStampPin specifies the RTC TimeStamp Pin. + * This parameter can be one of the following values: + * @arg RTC_TIMESTAMPPIN_DEFAULT: PC13 is selected as RTC TimeStamp Pin. + * The RTC TimeStamp Pin is per default PC13, but for reasons of + * compatibility, this parameter is required. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetTimeStamp(RTC_HandleTypeDef *hrtc, uint32_t TimeStampEdge, uint32_t RTC_TimeStampPin) +{ + uint32_t tmpreg; + + /* Check the parameters */ + assert_param(IS_TIMESTAMP_EDGE(TimeStampEdge)); + assert_param(IS_RTC_TIMESTAMP_PIN(RTC_TimeStampPin)); + + /* Prevent unused argument(s) compilation warning if no assert_param check */ + UNUSED(RTC_TimeStampPin); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Get the RTC_CR register and clear the bits to be configured */ + tmpreg = (uint32_t)(hrtc->Instance->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE)); + + tmpreg|= TimeStampEdge; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Configure the Time Stamp TSEDGE and Enable bits */ + hrtc->Instance->CR = (uint32_t)tmpreg; + + __HAL_RTC_TIMESTAMP_ENABLE(hrtc); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Set TimeStamp with Interrupt. + * @note This API must be called before enabling the TimeStamp feature. + * @param hrtc RTC handle + * @param TimeStampEdge Specifies the pin edge on which the TimeStamp is + * activated. + * This parameter can be one of the following values: + * @arg RTC_TIMESTAMPEDGE_RISING: the Time stamp event occurs on the + * rising edge of the related pin. + * @arg RTC_TIMESTAMPEDGE_FALLING: the Time stamp event occurs on the + * falling edge of the related pin. + * @param RTC_TimeStampPin Specifies the RTC TimeStamp Pin. + * This parameter can be one of the following values: + * @arg RTC_TIMESTAMPPIN_DEFAULT: PC13 is selected as RTC TimeStamp Pin. + * The RTC TimeStamp Pin is per default PC13, but for reasons of + * compatibility, this parameter is required. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetTimeStamp_IT(RTC_HandleTypeDef *hrtc, uint32_t TimeStampEdge, uint32_t RTC_TimeStampPin) +{ + uint32_t tmpreg; + + /* Check the parameters */ + assert_param(IS_TIMESTAMP_EDGE(TimeStampEdge)); + assert_param(IS_RTC_TIMESTAMP_PIN(RTC_TimeStampPin)); + + /* Prevent unused argument(s) compilation warning if no assert_param check */ + UNUSED(RTC_TimeStampPin); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Get the RTC_CR register and clear the bits to be configured */ + tmpreg = (uint32_t)(hrtc->Instance->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE)); + + tmpreg |= TimeStampEdge; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Configure the Time Stamp TSEDGE and Enable bits */ + hrtc->Instance->CR = (uint32_t)tmpreg; + + __HAL_RTC_TIMESTAMP_ENABLE(hrtc); + + /* Enable IT timestamp */ + __HAL_RTC_TIMESTAMP_ENABLE_IT(hrtc,RTC_IT_TS); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* RTC timestamp Interrupt Configuration: EXTI configuration */ + __HAL_RTC_TIMESTAMP_EXTI_ENABLE_IT(); + + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Deactivate TimeStamp. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_DeactivateTimeStamp(RTC_HandleTypeDef *hrtc) +{ + uint32_t tmpreg; + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* In case of interrupt mode is used, the interrupt source must disabled */ + __HAL_RTC_TIMESTAMP_DISABLE_IT(hrtc, RTC_IT_TS); + + /* Get the RTC_CR register and clear the bits to be configured */ + tmpreg = (uint32_t)(hrtc->Instance->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE)); + + /* Configure the Time Stamp TSEDGE and Enable bits */ + hrtc->Instance->CR = (uint32_t)tmpreg; + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Set Internal TimeStamp. + * @note This API must be called before enabling the internal TimeStamp feature. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetInternalTimeStamp(RTC_HandleTypeDef *hrtc) +{ + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Configure the internal Time Stamp Enable bits */ + __HAL_RTC_INTERNAL_TIMESTAMP_ENABLE(hrtc); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Deactivate Internal TimeStamp. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_DeactivateInternalTimeStamp(RTC_HandleTypeDef *hrtc) +{ + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Configure the internal Time Stamp Enable bits */ + __HAL_RTC_INTERNAL_TIMESTAMP_DISABLE(hrtc); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Get the RTC TimeStamp value. + * @param hrtc RTC handle + * @param sTimeStamp Pointer to Time structure + * @param sTimeStampDate Pointer to Date structure + * @param Format specifies the format of the entered parameters. + * This parameter can be one of the following values: + * @arg RTC_FORMAT_BIN: Binary data format + * @arg RTC_FORMAT_BCD: BCD data format + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_GetTimeStamp(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef* sTimeStamp, RTC_DateTypeDef* sTimeStampDate, uint32_t Format) +{ + uint32_t tmptime, tmpdate; + + /* Check the parameters */ + assert_param(IS_RTC_FORMAT(Format)); + + /* Get the TimeStamp time and date registers values */ + tmptime = (uint32_t)(hrtc->Instance->TSTR & RTC_TR_RESERVED_MASK); + tmpdate = (uint32_t)(hrtc->Instance->TSDR & RTC_DR_RESERVED_MASK); + + /* Fill the Time structure fields with the read parameters */ + sTimeStamp->Hours = (uint8_t)((tmptime & (RTC_TR_HT | RTC_TR_HU)) >> RTC_TSTR_HU_Pos); + sTimeStamp->Minutes = (uint8_t)((tmptime & (RTC_TR_MNT | RTC_TR_MNU)) >>RTC_TSTR_MNU_Pos); + sTimeStamp->Seconds = (uint8_t)((tmptime & (RTC_TR_ST | RTC_TR_SU)) >> RTC_TSTR_SU_Pos); + sTimeStamp->TimeFormat = (uint8_t)((tmptime & (RTC_TR_PM)) >> RTC_TSTR_PM_Pos); + sTimeStamp->SubSeconds = (uint32_t) hrtc->Instance->TSSSR; + + /* Fill the Date structure fields with the read parameters */ + sTimeStampDate->Year = 0U; + sTimeStampDate->Month = (uint8_t)((tmpdate & (RTC_DR_MT | RTC_DR_MU)) >> RTC_TSDR_MU_Pos); + sTimeStampDate->Date = (uint8_t)(tmpdate & (RTC_DR_DT | RTC_DR_DU)); + sTimeStampDate->WeekDay = (uint8_t)((tmpdate & (RTC_DR_WDU)) >> RTC_TSDR_WDU_Pos); + + /* Check the input parameters format */ + if(Format == RTC_FORMAT_BIN) + { + /* Convert the TimeStamp structure parameters to Binary format */ + sTimeStamp->Hours = (uint8_t)RTC_Bcd2ToByte(sTimeStamp->Hours); + sTimeStamp->Minutes = (uint8_t)RTC_Bcd2ToByte(sTimeStamp->Minutes); + sTimeStamp->Seconds = (uint8_t)RTC_Bcd2ToByte(sTimeStamp->Seconds); + + /* Convert the DateTimeStamp structure parameters to Binary format */ + sTimeStampDate->Month = (uint8_t)RTC_Bcd2ToByte(sTimeStampDate->Month); + sTimeStampDate->Date = (uint8_t)RTC_Bcd2ToByte(sTimeStampDate->Date); + sTimeStampDate->WeekDay = (uint8_t)RTC_Bcd2ToByte(sTimeStampDate->WeekDay); + } + + /* Clear the TIMESTAMP Flags */ + __HAL_RTC_INTERNAL_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_ITSF); + __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSF); + + return HAL_OK; +} + +/** + * @brief TimeStamp callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_TimeStampEventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_TimeStampEventCallback could be implemented in the user file + */ +} + + +/** + * @brief Handle TimeStamp interrupt request. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTCEx_TimeStampIRQHandler(RTC_HandleTypeDef *hrtc) +{ + /* Get the TimeStamp interrupt source enable status */ + if (READ_BIT(RTC->MISR, RTC_MISR_TSMF) != 0U) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call TimeStampEvent registered Callback */ + hrtc->TimeStampEventCallback(hrtc); +#else + /* TIMESTAMP callback */ + HAL_RTCEx_TimeStampEventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + + /* Clearing flags after the Callback because the content of RTC_TSTR and RTC_TSDR are cleared when TSF bit is reset.*/ + WRITE_REG(RTC->SCR, RTC_SCR_CITSF | RTC_SCR_CTSF); + } + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; +} + + +/** + * @brief Handle TimeStamp polling request. + * @param hrtc RTC handle + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_PollForTimeStampEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout) +{ + uint32_t tickstart = HAL_GetTick(); + + while(__HAL_RTC_TIMESTAMP_GET_FLAG(hrtc, RTC_FLAG_TSF) == 0U) + { + if(__HAL_RTC_TIMESTAMP_GET_FLAG(hrtc, RTC_FLAG_TSOVF) != 0U) + { + /* Clear the TIMESTAMP OverRun Flag */ + __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSOVF); + + /* Change TIMESTAMP state */ + hrtc->State = HAL_RTC_STATE_ERROR; + + return HAL_ERROR; + } + + if(Timeout != HAL_MAX_DELAY) + { + if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U)) + { + hrtc->State = HAL_RTC_STATE_TIMEOUT; + return HAL_TIMEOUT; + } + } + } + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup RTCEx_Exported_Functions_Group2 + * @brief RTC Wake-up functions + * +@verbatim + =============================================================================== + ##### RTC Wake-up functions ##### + =============================================================================== + + [..] This section provides functions allowing to configure Wake-up feature + +@endverbatim + * @{ + */ + +/** + * @brief Set wake up timer. + * @param hrtc RTC handle + * @param WakeUpCounter Wake up counter + * @param WakeUpClock Wake up clock + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock) +{ + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock)); + assert_param(IS_RTC_WAKEUP_COUNTER(WakeUpCounter)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Clear WUTE in RTC_CR to disable the wakeup timer */ + CLEAR_BIT(RTC->CR, RTC_CR_WUTE); + + /* Poll WUTWF until it is set in RTC_ICSR to make sure the access to wakeup autoreload + counter and to WUCKSEL[2:0] bits is allowed. This step must be skipped in + calendar initialization mode. */ + if (READ_BIT(RTC->ICSR, RTC_ICSR_INITF) == 0U) + { + tickstart = HAL_GetTick(); + while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + } + + /* Clear the Wakeup Timer clock source bits in CR register */ + hrtc->Instance->CR &= (uint32_t)~RTC_CR_WUCKSEL; + + /* Configure the clock source */ + hrtc->Instance->CR |= (uint32_t)WakeUpClock; + + /* Configure the Wakeup Timer counter */ + hrtc->Instance->WUTR = (uint32_t)WakeUpCounter; + + /* Enable the Wakeup Timer */ + __HAL_RTC_WAKEUPTIMER_ENABLE(hrtc); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Set wake up timer with interrupt. + * @param hrtc RTC handle + * @param WakeUpCounter Wake up counter + * @param WakeUpClock Wake up clock + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock) +{ + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock)); + assert_param(IS_RTC_WAKEUP_COUNTER(WakeUpCounter)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Disable the Wake-Up timer */ + __HAL_RTC_WAKEUPTIMER_DISABLE(hrtc); + + /* Clear flag Wake-Up */ + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(hrtc, RTC_FLAG_WUTF); + + /* Poll WUTWF until it is set in RTC_ICSR to make sure the access to wakeup autoreload + counter and to WUCKSEL[2:0] bits is allowed. This step must be skipped in + calendar initialization mode. */ + if (READ_BIT(RTC->ICSR, RTC_ICSR_INITF) == 0U) + { + tickstart = HAL_GetTick(); + while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + } + + /* Configure the Wakeup Timer counter */ + hrtc->Instance->WUTR = (uint32_t)WakeUpCounter; + + /* Clear the Wakeup Timer clock source bits in CR register */ + hrtc->Instance->CR &= (uint32_t)~RTC_CR_WUCKSEL; + + /* Configure the clock source */ + hrtc->Instance->CR |= (uint32_t)WakeUpClock; + + /* RTC WakeUpTimer Interrupt Configuration: EXTI configuration */ + __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT(); + + /* Configure the Interrupt in the RTC_CR register */ + __HAL_RTC_WAKEUPTIMER_ENABLE_IT(hrtc,RTC_IT_WUT); + + /* Enable the Wakeup Timer */ + __HAL_RTC_WAKEUPTIMER_ENABLE(hrtc); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Deactivate wake up timer counter. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_DeactivateWakeUpTimer(RTC_HandleTypeDef *hrtc) +{ + uint32_t tickstart; + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Disable the Wakeup Timer */ + __HAL_RTC_WAKEUPTIMER_DISABLE(hrtc); + + /* In case of interrupt mode is used, the interrupt source must disabled */ + __HAL_RTC_WAKEUPTIMER_DISABLE_IT(hrtc,RTC_IT_WUT); + + tickstart = HAL_GetTick(); + /* Wait till RTC WUTWF flag is set and if Time out is reached exit */ + while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) == 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Get wake up timer counter. + * @param hrtc RTC handle + * @retval Counter value + */ +uint32_t HAL_RTCEx_GetWakeUpTimer(RTC_HandleTypeDef *hrtc) +{ + /* Get the counter value */ + return ((uint32_t)(hrtc->Instance->WUTR & RTC_WUTR_WUT)); +} + +/** + * @brief Handle Wake Up Timer interrupt request. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTCEx_WakeUpTimerIRQHandler(RTC_HandleTypeDef *hrtc) +{ + /* Get the pending status of the WAKEUPTIMER Interrupt */ + if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTF) != 0U) + { + /* Clear the WAKEUPTIMER interrupt pending bit */ + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(hrtc, RTC_FLAG_WUTF); + +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call WakeUpTimerEvent registered Callback */ + hrtc->WakeUpTimerEventCallback(hrtc); +#else + /* WAKEUPTIMER callback */ + HAL_RTCEx_WakeUpTimerEventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; +} + +/** + * @brief Wake Up Timer callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_WakeUpTimerEventCallback could be implemented in the user file + */ +} + + +/** + * @brief Handle Wake Up Timer Polling. + * @param hrtc RTC handle + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_PollForWakeUpTimerEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout) +{ + uint32_t tickstart = HAL_GetTick(); + + while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTF) == 0U) + { + if(Timeout != HAL_MAX_DELAY) + { + if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U)) + { + hrtc->State = HAL_RTC_STATE_TIMEOUT; + return HAL_TIMEOUT; + } + } + } + + /* Clear the WAKEUPTIMER Flag */ + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(hrtc, RTC_FLAG_WUTF); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + return HAL_OK; +} + +/** + * @} + */ + + +/** @addtogroup RTCEx_Exported_Functions_Group3 + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Extended Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to + (+) Write a data in a specified RTC Backup data register + (+) Read a data in a specified RTC Backup data register + (+) Set the Coarse calibration parameters. + (+) Deactivate the Coarse calibration parameters + (+) Set the Smooth calibration parameters. + (+) Configure the Synchronization Shift Control Settings. + (+) Configure the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz). + (+) Deactivate the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz). + (+) Enable the RTC reference clock detection. + (+) Disable the RTC reference clock detection. + (+) Enable the Bypass Shadow feature. + (+) Disable the Bypass Shadow feature. + +@endverbatim + * @{ + */ + + + +/** + * @brief Set the Smooth calibration parameters. + * @note To deactivate the smooth calibration, the field SmoothCalibPlusPulses + * must be equal to SMOOTHCALIB_PLUSPULSES_RESET and the field + * SmoothCalibMinusPulsesValue must be equal to 0. + * @param hrtc RTC handle + * @param SmoothCalibPeriod Select the Smooth Calibration Period. + * This parameter can be can be one of the following values : + * @arg RTC_SMOOTHCALIB_PERIOD_32SEC: The smooth calibration period is 32s. + * @arg RTC_SMOOTHCALIB_PERIOD_16SEC: The smooth calibration period is 16s. + * @arg RTC_SMOOTHCALIB_PERIOD_8SEC: The smooth calibration period is 8s. + * @param SmoothCalibPlusPulses Select to Set or reset the CALP bit. + * This parameter can be one of the following values: + * @arg RTC_SMOOTHCALIB_PLUSPULSES_SET: Add one RTCCLK pulse every 2*11 pulses. + * @arg RTC_SMOOTHCALIB_PLUSPULSES_RESET: No RTCCLK pulses are added. + * @param SmoothCalibMinusPulsesValue Select the value of CALM[8:0] bits. + * This parameter can be one any value from 0 to 0x000001FF. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetSmoothCalib(RTC_HandleTypeDef* hrtc, uint32_t SmoothCalibPeriod, uint32_t SmoothCalibPlusPulses, uint32_t SmoothCalibMinusPulsesValue) +{ + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_RTC_SMOOTH_CALIB_PERIOD(SmoothCalibPeriod)); + assert_param(IS_RTC_SMOOTH_CALIB_PLUS(SmoothCalibPlusPulses)); + assert_param(IS_RTC_SMOOTH_CALIB_MINUS(SmoothCalibMinusPulsesValue)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* check if a calibration is pending*/ + if((hrtc->Instance->ICSR & RTC_ICSR_RECALPF) != 0U) + { + tickstart = HAL_GetTick(); + + /* check if a calibration is pending*/ + while((hrtc->Instance->ICSR & RTC_ICSR_RECALPF) != 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + } + + /* Configure the Smooth calibration settings */ + hrtc->Instance->CALR = (uint32_t)((uint32_t)SmoothCalibPeriod | (uint32_t)SmoothCalibPlusPulses | (uint32_t)SmoothCalibMinusPulsesValue); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Configure the Synchronization Shift Control Settings. + * @note When REFCKON is set, firmware must not write to Shift control register. + * @param hrtc RTC handle + * @param ShiftAdd1S Select to add or not 1 second to the time calendar. + * This parameter can be one of the following values: + * @arg RTC_SHIFTADD1S_SET: Add one second to the clock calendar. + * @arg RTC_SHIFTADD1S_RESET: No effect. + * @param ShiftSubFS Select the number of Second Fractions to substitute. + * This parameter can be one any value from 0 to 0x7FFF. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetSynchroShift(RTC_HandleTypeDef* hrtc, uint32_t ShiftAdd1S, uint32_t ShiftSubFS) +{ + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_RTC_SHIFT_ADD1S(ShiftAdd1S)); + assert_param(IS_RTC_SHIFT_SUBFS(ShiftSubFS)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + tickstart = HAL_GetTick(); + + /* Wait until the shift is completed*/ + while((hrtc->Instance->ICSR & RTC_ICSR_SHPF) != 0U) + { + if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_TIMEOUT; + } + } + + /* Check if the reference clock detection is disabled */ + if((hrtc->Instance->CR & RTC_CR_REFCKON) == 0U) + { + /* Configure the Shift settings */ + hrtc->Instance->SHIFTR = (uint32_t)(uint32_t)(ShiftSubFS) | (uint32_t)(ShiftAdd1S); + + /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ + if((hrtc->Instance->CR & RTC_CR_BYPSHAD) == 0U) + { + if(HAL_RTC_WaitForSynchro(hrtc) != HAL_OK) + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + hrtc->State = HAL_RTC_STATE_ERROR; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_ERROR; + } + } + } + else + { + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_ERROR; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_ERROR; + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Configure the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz). + * @param hrtc RTC handle + * @param CalibOutput Select the Calibration output Selection . + * This parameter can be one of the following values: + * @arg RTC_CALIBOUTPUT_512HZ: A signal has a regular waveform at 512Hz. + * @arg RTC_CALIBOUTPUT_1HZ: A signal has a regular waveform at 1Hz. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetCalibrationOutPut(RTC_HandleTypeDef* hrtc, uint32_t CalibOutput) +{ + /* Check the parameters */ + assert_param(IS_RTC_CALIB_OUTPUT(CalibOutput)); + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Clear flags before config */ + hrtc->Instance->CR &= (uint32_t)~RTC_CR_COSEL; + + /* Configure the RTC_CR register */ + hrtc->Instance->CR |= (uint32_t)CalibOutput; + + __HAL_RTC_CALIBRATION_OUTPUT_ENABLE(hrtc); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Deactivate the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz). + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_DeactivateCalibrationOutPut(RTC_HandleTypeDef* hrtc) +{ + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + __HAL_RTC_CALIBRATION_OUTPUT_DISABLE(hrtc); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Enable the RTC reference clock detection. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetRefClock(RTC_HandleTypeDef* hrtc) +{ + HAL_StatusTypeDef status; + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Enter Initialization mode */ + status = RTC_EnterInitMode(hrtc); + if(status == HAL_OK) + { + /* Enable clockref detection */ + __HAL_RTC_CLOCKREF_DETECTION_ENABLE(hrtc); + + /* Exit Initialization mode */ + status = RTC_ExitInitMode(hrtc); + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + if (status == HAL_OK) + { + hrtc->State = HAL_RTC_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return status; +} + +/** + * @brief Disable the RTC reference clock detection. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_DeactivateRefClock(RTC_HandleTypeDef* hrtc) +{ + HAL_StatusTypeDef status; + + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Enter Initialization mode */ + status = RTC_EnterInitMode(hrtc); + if (status == HAL_OK) + { + /* Disable clockref detection */ + __HAL_RTC_CLOCKREF_DETECTION_DISABLE(hrtc); + + /* Exit Initialization mode */ + status = RTC_ExitInitMode(hrtc); + } + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + if (status == HAL_OK) + { + hrtc->State = HAL_RTC_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return status; +} + +/** + * @brief Enable the Bypass Shadow feature. + * @note When the Bypass Shadow is enabled the calendar value are taken + * directly from the Calendar counter. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_EnableBypassShadow(RTC_HandleTypeDef* hrtc) +{ + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Set the BYPSHAD bit */ + hrtc->Instance->CR |= (uint8_t)RTC_CR_BYPSHAD; + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @brief Disable the Bypass Shadow feature. + * @note When the Bypass Shadow is enabled the calendar value are taken + * directly from the Calendar counter. + * @param hrtc RTC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_DisableBypassShadow(RTC_HandleTypeDef* hrtc) +{ + /* Process Locked */ + __HAL_LOCK(hrtc); + + hrtc->State = HAL_RTC_STATE_BUSY; + + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + + /* Reset the BYPSHAD bit */ + hrtc->Instance->CR &= ((uint8_t)~RTC_CR_BYPSHAD); + + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hrtc); + + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup RTCEx_Exported_Functions_Group4 + * @brief Extended features functions + * +@verbatim + =============================================================================== + ##### Extended features functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) RTC Alarm B callback + (+) RTC Poll for Alarm B request + +@endverbatim + * @{ + */ + +/** + * @brief Alarm B callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_AlarmBEventCallback could be implemented in the user file + */ +} + +/** + * @brief Handle Alarm B Polling request. + * @param hrtc RTC handle + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_PollForAlarmBEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout) +{ + uint32_t tickstart = HAL_GetTick(); + + while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBF) == 0U) + { + if(Timeout != HAL_MAX_DELAY) + { + if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U)) + { + hrtc->State = HAL_RTC_STATE_TIMEOUT; + return HAL_TIMEOUT; + } + } + } + + /* Clear the Alarm Flag */ + __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRBF); + + /* Change RTC state */ + hrtc->State = HAL_RTC_STATE_READY; + + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup RTCEx_Exported_Functions_Group5 + * @brief Extended RTC Tamper functions + * +@verbatim + ============================================================================== + ##### Tamper functions ##### + ============================================================================== + [..] + (+) Before calling any tamper or internal tamper function, you have to call first + HAL_RTC_Init() function. + (+) In that ine you can select to output tamper event on RTC pin. + [..] + (+) Enable the Tamper and configure the Tamper filter count, trigger Edge + or Level according to the Tamper filter (if equal to 0 Edge else Level) + value, sampling frequency, NoErase, MaskFlag, precharge or discharge and + Pull-UP, timestamp using the HAL_RTCEx_SetTamper() function. + You can configure Tamper with interrupt mode using HAL_RTCEx_SetTamper_IT() function. + (+) The default configuration of the Tamper erases the backup registers. To avoid + erase, enable the NoErase field on the TAMP_TAMPCR register. + [..] + (+) Enable Internal Tamper and configure it with interrupt, timestamp using + the HAL_RTCEx_SetInternalTamper() function. + +@endverbatim + * @{ + */ + + +/** + * @brief Set Tamper + * @param hrtc RTC handle + * @param sTamper Pointer to Tamper Structure. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetTamper(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef* sTamper) +{ + uint32_t tmpreg; + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + /* Check the parameters */ + assert_param(IS_RTC_TAMPER(sTamper->Tamper)); + assert_param(IS_RTC_TAMPER_TRIGGER(sTamper->Trigger)); + assert_param(IS_RTC_TAMPER_ERASE_MODE(sTamper->NoErase)); + assert_param(IS_RTC_TAMPER_MASKFLAG_STATE(sTamper->MaskFlag)); + assert_param(IS_RTC_TAMPER_FILTER(sTamper->Filter)); + assert_param(IS_RTC_TAMPER_SAMPLING_FREQ(sTamper->SamplingFrequency)); + assert_param(IS_RTC_TAMPER_PRECHARGE_DURATION(sTamper->PrechargeDuration)); + assert_param(IS_RTC_TAMPER_PULLUP_STATE(sTamper->TamperPullUp)); + assert_param(IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION(sTamper->TimeStampOnTamperDetection)); + + /* Configuration register 2 */ + tmpreg = tamp->CR2; + tmpreg &= ~((sTamper->Tamper << 24) | (sTamper->Tamper << 16) | (sTamper->Tamper)); + + if(sTamper->Trigger != RTC_TAMPERTRIGGER_RISINGEDGE) + { + tmpreg |= (sTamper->Tamper << 24); + } + + if(sTamper->MaskFlag != RTC_TAMPERMASK_FLAG_DISABLE) + { + tmpreg |= (sTamper->Tamper << 16); + } + + if(sTamper->NoErase != RTC_TAMPER_ERASE_BACKUP_ENABLE) + { + tmpreg |= sTamper->Tamper; + } + tamp->CR2 = tmpreg; + + /* Filter control register */ + tamp->FLTCR = (sTamper->Filter) | (sTamper->SamplingFrequency) | \ + (sTamper->PrechargeDuration) | (sTamper->TamperPullUp); + + /* timestamp on tamper */ + if((hrtc->Instance->CR & RTC_CR_TAMPTS) != (sTamper->TimeStampOnTamperDetection)) + { + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + tmpreg = (hrtc->Instance->CR & ~RTC_CR_TAMPTS); + hrtc->Instance->CR = (tmpreg | (sTamper->TimeStampOnTamperDetection)); + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + } + + /* Control register 1 */ + tamp->CR1 |= (sTamper->Tamper); + + return HAL_OK; +} + + +/** + * @brief Set Tamper in IT mode + * @param hrtc RTC handle + * @param sTamper Pointer to Tamper Structure. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetTamper_IT(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef* sTamper) +{ + uint32_t tmpreg; + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + /* Check the parameters */ + assert_param(IS_RTC_TAMPER(sTamper->Tamper)); + assert_param(IS_RTC_TAMPER_TRIGGER(sTamper->Trigger)); + assert_param(IS_RTC_TAMPER_ERASE_MODE(sTamper->NoErase)); + assert_param(IS_RTC_TAMPER_MASKFLAG_STATE(sTamper->MaskFlag)); + assert_param(IS_RTC_TAMPER_FILTER(sTamper->Filter)); + assert_param(IS_RTC_TAMPER_SAMPLING_FREQ(sTamper->SamplingFrequency)); + assert_param(IS_RTC_TAMPER_PRECHARGE_DURATION(sTamper->PrechargeDuration)); + assert_param(IS_RTC_TAMPER_PULLUP_STATE(sTamper->TamperPullUp)); + assert_param(IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION(sTamper->TimeStampOnTamperDetection)); + + /* Configuration register 2 */ + tmpreg = tamp->CR2; + tmpreg &= ~((sTamper->Tamper << 24) | (sTamper->Tamper << 16) | (sTamper->Tamper)); + + if(sTamper->Trigger != RTC_TAMPERTRIGGER_RISINGEDGE) + { + tmpreg |= (sTamper->Tamper << 24); + } + + if(sTamper->MaskFlag != RTC_TAMPERMASK_FLAG_DISABLE) + { + tmpreg |= (sTamper->Tamper << 16); + } + + if(sTamper->NoErase != RTC_TAMPER_ERASE_BACKUP_ENABLE) + { + tmpreg |= sTamper->Tamper; + } + tamp->CR2 = tmpreg; + + /* Filter control register */ + tamp->FLTCR = (sTamper->Filter) | (sTamper->SamplingFrequency) | \ + (sTamper->PrechargeDuration) | (sTamper->TamperPullUp); + + /* timestamp on tamper */ + if((hrtc->Instance->CR & RTC_CR_TAMPTS) != (sTamper->TimeStampOnTamperDetection)) + { + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + tmpreg = (hrtc->Instance->CR & ~RTC_CR_TAMPTS); + hrtc->Instance->CR = (tmpreg | (sTamper->TimeStampOnTamperDetection)); + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + } + + /* RTC Tamper Interrupt Configuration: EXTI configuration */ + __HAL_RTC_TAMPER_EXTI_ENABLE_IT(); + + /* Interrupt enable register */ + tamp->IER |= sTamper->Tamper; + + /* Control register 1 */ + tamp->CR1 |= (sTamper->Tamper); + + return HAL_OK; +} + + + +/** + * @brief Deactivate Tamper. + * @param hrtc RTC handle + * @param Tamper Selected tamper pin. + * This parameter can be a combination of the following values: + * @arg RTC_TAMPER_1 + * @arg RTC_TAMPER_2 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_DeactivateTamper(RTC_HandleTypeDef *hrtc, uint32_t Tamper) +{ + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + assert_param(IS_RTC_TAMPER(Tamper)); + + /* Disable the selected Tamper pin */ + tamp->CR1 &= ~Tamper; + + /* Clear tamper mask/noerase/trigger configuration */ + tamp->CR2 &= ~((Tamper << 24) | (Tamper << 16) | Tamper); + + /* Clear tamper interrupt mode configuration */ + tamp->IER &= ~Tamper; + + return HAL_OK; +} + + +/** + * @brief Tamper event polling. + * @param hrtc RTC handle + * @param Tamper Selected tamper pin. + * This parameter can be a combination of the following values: + * @arg RTC_TAMPER_1 + * @arg RTC_TAMPER_2 + * @arg RTC_TAMPER_3 (*) + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_PollForTamperEvent(RTC_HandleTypeDef *hrtc, uint32_t Tamper, uint32_t Timeout) +{ + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + assert_param(IS_RTC_TAMPER(Tamper)); + + uint32_t tickstart = HAL_GetTick(); + + /* Get the status of the Interrupt */ + while((tamp->SR & Tamper) != Tamper) + { + if(Timeout != HAL_MAX_DELAY) + { + if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U)) + { + return HAL_TIMEOUT; + } + } + } + + /* Clear the Tamper Flag */ + tamp->SCR = Tamper; + + return HAL_OK; +} + + +/** + * @brief Set Internal Tamper in interrupt mode + * @param hrtc RTC handle + * @param sIntTamper Pointer to Internal Tamper Structure. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetInternalTamper(RTC_HandleTypeDef *hrtc, RTC_InternalTamperTypeDef* sIntTamper) +{ + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + uint32_t tmpreg; + + /* Check the parameters */ + assert_param(IS_RTC_INTERNAL_TAMPER(sIntTamper->IntTamper)); + assert_param(IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION(sIntTamper->TimeStampOnTamperDetection)); + + /* timestamp on internal tamper */ + if((hrtc->Instance->CR & RTC_CR_TAMPTS) != (sIntTamper->TimeStampOnTamperDetection)) + { + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + tmpreg = (hrtc->Instance->CR & ~RTC_CR_TAMPTS); + hrtc->Instance->CR = (tmpreg | (sIntTamper->TimeStampOnTamperDetection)); + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + } + + /* Control register 1 */ + tamp->CR1 |= (sIntTamper->IntTamper); + + return HAL_OK; +} + + +/** + * @brief Set Internal Tamper + * @param hrtc RTC handle + * @param sIntTamper Pointer to Internal Tamper Structure. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_SetInternalTamper_IT(RTC_HandleTypeDef *hrtc, RTC_InternalTamperTypeDef* sIntTamper) +{ + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + uint32_t tmpreg; + + /* Check the parameters */ + assert_param(IS_RTC_INTERNAL_TAMPER(sIntTamper->IntTamper)); + assert_param(IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION(sIntTamper->TimeStampOnTamperDetection)); + + /* timestamp on internal tamper */ + if((hrtc->Instance->CR & RTC_CR_TAMPTS) != (sIntTamper->TimeStampOnTamperDetection)) + { + __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc); + tmpreg = (hrtc->Instance->CR & ~RTC_CR_TAMPTS); + hrtc->Instance->CR = (tmpreg | (sIntTamper->TimeStampOnTamperDetection)); + __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); + } + + /* RTC Tamper Interrupt Configuration: EXTI configuration */ + __HAL_RTC_TAMPER_EXTI_ENABLE_IT(); + + /* Interrupt enable register */ + tamp->IER |= sIntTamper->IntTamper; + + /* Control register 1 */ + tamp->CR1 |= (sIntTamper->IntTamper); + + return HAL_OK; +} + +/** + * @brief Deactivate Internal Tamper. + * @param hrtc RTC handle + * @param IntTamper Selected internal tamper event. + * This parameter can be any combination of existing internal tampers. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_DeactivateInternalTamper(RTC_HandleTypeDef *hrtc, uint32_t IntTamper) +{ + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + assert_param(IS_RTC_INTERNAL_TAMPER(IntTamper)); + + /* Disable the selected Tamper pin */ + tamp->CR1 &= ~IntTamper; + + /* Clear internal tamper interrupt mode configuration */ + tamp->IER &= ~IntTamper; + + return HAL_OK; +} + + +/** + * @brief Internal Tamper event polling. + * @param hrtc RTC handle + * @param IntTamper selected tamper. + * This parameter can be any combination of existing internal tampers. + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RTCEx_PollForInternalTamperEvent(RTC_HandleTypeDef *hrtc, uint32_t IntTamper, uint32_t Timeout) +{ + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + assert_param(IS_RTC_INTERNAL_TAMPER(IntTamper)); + + uint32_t tickstart = HAL_GetTick(); + + /* Get the status of the Interrupt */ + while((tamp->SR & IntTamper) != IntTamper) + { + if(Timeout != HAL_MAX_DELAY) + { + if(((HAL_GetTick() - tickstart ) > Timeout)||(Timeout == 0U)) + { + return HAL_TIMEOUT; + } + } + } + + /* Clear the Tamper Flag */ + tamp->SCR = IntTamper; + + return HAL_OK; +} + + +/** + * @brief Handle Tamper interrupt request. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTCEx_TamperIRQHandler(RTC_HandleTypeDef *hrtc) +{ + uint32_t tmp; + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + /* Get interrupt status */ + tmp = tamp->MISR; + + /* Immediately clear flags */ + tamp->SCR = tmp; + + /* Check Tamper1 status */ + if((tmp & RTC_TAMPER_1) == RTC_TAMPER_1) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Tamper 1 Event registered Callback */ + hrtc->Tamper1EventCallback(hrtc); +#else + /* Tamper1 callback */ + HAL_RTCEx_Tamper1EventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + + /* Check Tamper2 status */ + if((tmp & RTC_TAMPER_2) == RTC_TAMPER_2) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Tamper 2 Event registered Callback */ + hrtc->Tamper2EventCallback(hrtc); +#else + /* Tamper2 callback */ + HAL_RTCEx_Tamper2EventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + +#if defined(TAMP_CR1_TAMP3E) + /* Check Tamper3 status */ + if((tmp & RTC_TAMPER_3) == RTC_TAMPER_3) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Tamper 3 Event registered Callback */ + hrtc->Tamper3EventCallback(hrtc); +#else + /* Tamper3 callback */ + HAL_RTCEx_Tamper3EventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } +#endif /* TAMP_CR1_TAMP3E */ + + /* Check Internal Tamper3 status */ + if((tmp & RTC_INT_TAMPER_3) == RTC_INT_TAMPER_3) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Internal Tamper 3 Event registered Callback */ + hrtc->InternalTamper3EventCallback(hrtc); +#else + /* Internal Tamper3 callback */ + HAL_RTCEx_InternalTamper3EventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + + /* Check Internal Tamper4 status */ + if((tmp & RTC_INT_TAMPER_4) == RTC_INT_TAMPER_4) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Internal Tamper 4 Event registered Callback */ + hrtc->InternalTamper4EventCallback(hrtc); +#else + /* Internal Tamper4 callback */ + HAL_RTCEx_InternalTamper4EventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + + /* Check Internal Tamper5 status */ + if((tmp & RTC_INT_TAMPER_5) == RTC_INT_TAMPER_5) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Internal Tamper 5 Event registered Callback */ + hrtc->InternalTamper5EventCallback(hrtc); +#else + /* Internal Tamper5 callback */ + HAL_RTCEx_InternalTamper5EventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + + /* Check Internal Tamper6 status */ + if((tmp & RTC_INT_TAMPER_6) == RTC_INT_TAMPER_6) + { +#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) + /* Call Internal Tamper 6 Event registered Callback */ + hrtc->InternalTamper6EventCallback(hrtc); +#else + /* Internal Tamper6 callback */ + HAL_RTCEx_InternalTamper6EventCallback(hrtc); +#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ + } + +} + + +/** + * @brief Tamper 1 callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_Tamper1EventCallback could be implemented in the user file + */ +} + + +/** + * @brief Tamper 2 callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_Tamper2EventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_Tamper2EventCallback could be implemented in the user file + */ +} + +#if defined(TAMP_CR1_TAMP3E) +/** + * @brief Tamper 3 callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_Tamper3EventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_Tamper2EventCallback could be implemented in the user file + */ +} +#endif /* TAMP_CR1_TAMP3E */ + +/** + * @brief Internal Tamper 3 callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_InternalTamper3EventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_InternalTamper3EventCallback could be implemented in the user file + */ +} + + +/** + * @brief Internal Tamper 4 callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_InternalTamper4EventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_InternalTamper4EventCallback could be implemented in the user file + */ +} + + +/** + * @brief Internal Tamper 5 callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_InternalTamper5EventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_InternalTamper5EventCallback could be implemented in the user file + */ +} + + +/** + * @brief Internal Tamper 6 callback. + * @param hrtc RTC handle + * @retval None + */ +__weak void HAL_RTCEx_InternalTamper6EventCallback(RTC_HandleTypeDef *hrtc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hrtc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_RTCEx_InternalTamper6EventCallback could be implemented in the user file + */ +} + + + +/** + * @} + */ + + +/** @addtogroup RTCEx_Exported_Functions_Group6 + * @brief Extended RTC Backup register functions + * +@verbatim + =============================================================================== + ##### Extended RTC Backup register functions ##### + =============================================================================== + [..] + (+) Before calling any tamper or internal tamper function, you have to call first + HAL_RTC_Init() function. + (+) In that ine you can select to output tamper event on RTC pin. + [..] + This subsection provides functions allowing to + (+) Write a data in a specified RTC Backup data register + (+) Read a data in a specified RTC Backup data register +@endverbatim + * @{ + */ + + +/** + * @brief Write a data in a specified RTC Backup data register. + * @param hrtc RTC handle + * @param BackupRegister: RTC Backup data Register number. + * This parameter can be: RTC_BKP_DRx where x can be from 0 to 4 + * specify the register. + * @param Data Data to be written in the specified Backup data register. + * @retval None + */ +void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data) +{ + uint32_t tmp; + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + /* Check the parameters */ + assert_param(IS_RTC_BKP(BackupRegister)); + + tmp = (uint32_t)&(tamp->BKP0R); + tmp += (BackupRegister * 4U); + + /* Write the specified register */ + *(__IO uint32_t *)tmp = (uint32_t)Data; +} + + +/** + * @brief Reads data from the specified RTC Backup data Register. + * @param hrtc RTC handle + * @param BackupRegister RTC Backup data Register number. + * This parameter can be: RTC_BKP_DRx where x can be from 0 to 4 + * specify the register. + * @retval Read value + */ +uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister) +{ + uint32_t tmp ; + /* Process TAMP instance pointer */ + TAMP_TypeDef *tamp = (TAMP_TypeDef *)((uint32_t)hrtc->Instance + hrtc->TampOffset); + + /* Check the parameters */ + assert_param(IS_RTC_BKP(BackupRegister)); + + tmp = (uint32_t)&(tamp->BKP0R); + tmp += (BackupRegister * 4U); + + /* Read the specified register */ + return (*(__IO uint32_t *)tmp); +} + + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_RTC_MODULE_ENABLED */ +/** + * @} + */ + + +/** + * @} + */ + + + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smartcard.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smartcard.c new file mode 100644 index 0000000..a291e35 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smartcard.c @@ -0,0 +1,3182 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_smartcard.c + * @author MCD Application Team + * @brief SMARTCARD HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the SMARTCARD peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State and Error functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The SMARTCARD HAL driver can be used as follows: + + (#) Declare a SMARTCARD_HandleTypeDef handle structure (eg. SMARTCARD_HandleTypeDef hsmartcard). + (#) Associate a USART to the SMARTCARD handle hsmartcard. + (#) Initialize the SMARTCARD low level resources by implementing the HAL_SMARTCARD_MspInit() API: + (++) Enable the USARTx interface clock. + (++) USART pins configuration: + (+++) Enable the clock for the USART GPIOs. + (+++) Configure the USART pins (TX as alternate function pull-up, RX as alternate function Input). + (++) NVIC configuration if you need to use interrupt process (HAL_SMARTCARD_Transmit_IT() + and HAL_SMARTCARD_Receive_IT() APIs): + (+++) Configure the USARTx interrupt priority. + (+++) Enable the NVIC USART IRQ handle. + (++) DMA Configuration if you need to use DMA process (HAL_SMARTCARD_Transmit_DMA() + and HAL_SMARTCARD_Receive_DMA() APIs): + (+++) Declare a DMA handle structure for the Tx/Rx channel. + (+++) Enable the DMAx interface clock. + (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters. + (+++) Configure the DMA Tx/Rx channel. + (+++) Associate the initialized DMA handle to the SMARTCARD DMA Tx/Rx handle. + (+++) Configure the priority and enable the NVIC for the transfer complete + interrupt on the DMA Tx/Rx channel. + + (#) Program the Baud Rate, Parity, Mode(Receiver/Transmitter), clock enabling/disabling and accordingly, + the clock parameters (parity, phase, last bit), prescaler value, guard time and NACK on transmission + error enabling or disabling in the hsmartcard handle Init structure. + + (#) If required, program SMARTCARD advanced features (TX/RX pins swap, TimeOut, auto-retry counter,...) + in the hsmartcard handle AdvancedInit structure. + + (#) Initialize the SMARTCARD registers by calling the HAL_SMARTCARD_Init() API: + (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) + by calling the customized HAL_SMARTCARD_MspInit() API. + [..] + (@) The specific SMARTCARD interrupts (Transmission complete interrupt, + RXNE interrupt and Error Interrupts) will be managed using the macros + __HAL_SMARTCARD_ENABLE_IT() and __HAL_SMARTCARD_DISABLE_IT() inside the transmit and receive process. + + [..] + [..] Three operation modes are available within this driver : + + *** Polling mode IO operation *** + ================================= + [..] + (+) Send an amount of data in blocking mode using HAL_SMARTCARD_Transmit() + (+) Receive an amount of data in blocking mode using HAL_SMARTCARD_Receive() + + *** Interrupt mode IO operation *** + =================================== + [..] + (+) Send an amount of data in non-blocking mode using HAL_SMARTCARD_Transmit_IT() + (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback() + (+) Receive an amount of data in non-blocking mode using HAL_SMARTCARD_Receive_IT() + (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback() + (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback() + + *** DMA mode IO operation *** + ============================== + [..] + (+) Send an amount of data in non-blocking mode (DMA) using HAL_SMARTCARD_Transmit_DMA() + (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback() + (+) Receive an amount of data in non-blocking mode (DMA) using HAL_SMARTCARD_Receive_DMA() + (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback() + (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback() + + *** SMARTCARD HAL driver macros list *** + ======================================== + [..] + Below the list of most used macros in SMARTCARD HAL driver. + + (+) __HAL_SMARTCARD_GET_FLAG : Check whether or not the specified SMARTCARD flag is set + (+) __HAL_SMARTCARD_CLEAR_FLAG : Clear the specified SMARTCARD pending flag + (+) __HAL_SMARTCARD_ENABLE_IT: Enable the specified SMARTCARD interrupt + (+) __HAL_SMARTCARD_DISABLE_IT: Disable the specified SMARTCARD interrupt + (+) __HAL_SMARTCARD_GET_IT_SOURCE: Check whether or not the specified SMARTCARD interrupt is enabled + + [..] + (@) You can refer to the SMARTCARD HAL driver header file for more useful macros + + ##### Callback registration ##### + ================================== + + [..] + The compilation define USE_HAL_SMARTCARD_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_SMARTCARD_RegisterCallback() to register a user callback. + Function HAL_SMARTCARD_RegisterCallback() allows to register following callbacks: + (+) TxCpltCallback : Tx Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. + (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. + (+) RxFifoFullCallback : Rx Fifo Full Callback. + (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. + (+) MspInitCallback : SMARTCARD MspInit. + (+) MspDeInitCallback : SMARTCARD MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + [..] + Use function HAL_SMARTCARD_UnRegisterCallback() to reset a callback to the default + weak (surcharged) function. + HAL_SMARTCARD_UnRegisterCallback() takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) TxCpltCallback : Tx Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. + (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. + (+) RxFifoFullCallback : Rx Fifo Full Callback. + (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. + (+) MspInitCallback : SMARTCARD MspInit. + (+) MspDeInitCallback : SMARTCARD MspDeInit. + + [..] + By default, after the HAL_SMARTCARD_Init() and when the state is HAL_SMARTCARD_STATE_RESET + all callbacks are set to the corresponding weak (surcharged) functions: + examples HAL_SMARTCARD_TxCpltCallback(), HAL_SMARTCARD_RxCpltCallback(). + Exception done for MspInit and MspDeInit functions that are respectively + reset to the legacy weak (surcharged) functions in the HAL_SMARTCARD_Init() + and HAL_SMARTCARD_DeInit() only when these callbacks are null (not registered beforehand). + If not, MspInit or MspDeInit are not null, the HAL_SMARTCARD_Init() and HAL_SMARTCARD_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand). + + [..] + Callbacks can be registered/unregistered in HAL_SMARTCARD_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_SMARTCARD_STATE_READY or HAL_SMARTCARD_STATE_RESET state, thus registered (user) + MspInit/DeInit callbacks can be used during the Init/DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_SMARTCARD_RegisterCallback() before calling HAL_SMARTCARD_DeInit() + or HAL_SMARTCARD_Init() function. + + [..] + When The compilation define USE_HAL_SMARTCARD_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available + and weak (surcharged) callbacks are used. + + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup SMARTCARD SMARTCARD + * @brief HAL SMARTCARD module driver + * @{ + */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup SMARTCARD_Private_Constants SMARTCARD Private Constants + * @{ + */ +#define SMARTCARD_TEACK_REACK_TIMEOUT 1000U /*!< SMARTCARD TX or RX enable acknowledge time-out value */ + +#define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \ + USART_CR1_RE | USART_CR1_OVER8| \ + USART_CR1_FIFOEN)) /*!< USART CR1 fields of parameters set by SMARTCARD_SetConfig API */ + +#define USART_CR2_CLK_FIELDS ((uint32_t)(USART_CR2_CLKEN | USART_CR2_CPOL | \ + USART_CR2_CPHA | USART_CR2_LBCL)) /*!< SMARTCARD clock-related USART CR2 fields of parameters */ + +#define USART_CR2_FIELDS ((uint32_t)(USART_CR2_RTOEN | USART_CR2_CLK_FIELDS | \ + USART_CR2_STOP)) /*!< USART CR2 fields of parameters set by SMARTCARD_SetConfig API */ + +#define USART_CR3_FIELDS ((uint32_t)(USART_CR3_ONEBIT | USART_CR3_NACK | USART_CR3_SCARCNT | \ + USART_CR3_TXFTCFG | USART_CR3_RXFTCFG )) /*!< USART CR3 fields of parameters set by SMARTCARD_SetConfig API */ + +#define USART_BRR_MIN 0x10U /*!< USART BRR minimum authorized value */ + +#define USART_BRR_MAX 0x0000FFFFU /*!< USART BRR maximum authorized value */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup SMARTCARD_Private_Functions + * @{ + */ +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) +void SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef *hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */ +static HAL_StatusTypeDef SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsmartcard); +static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsmartcard); +static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsmartcard); +static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Flag, + FlagStatus Status, uint32_t Tickstart, uint32_t Timeout); +static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsmartcard); +static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsmartcard); +static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma); +static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma); +static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma); +static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma); +static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma); +static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma); +static void SMARTCARD_TxISR(SMARTCARD_HandleTypeDef *hsmartcard); +static void SMARTCARD_TxISR_FIFOEN(SMARTCARD_HandleTypeDef *hsmartcard); +static void SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard); +static void SMARTCARD_RxISR(SMARTCARD_HandleTypeDef *hsmartcard); +static void SMARTCARD_RxISR_FIFOEN(SMARTCARD_HandleTypeDef *hsmartcard); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup SMARTCARD_Exported_Functions SMARTCARD Exported Functions + * @{ + */ + +/** @defgroup SMARTCARD_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + ============================================================================== + ##### Initialization and Configuration functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to initialize the USARTx + associated to the SmartCard. + (+) These parameters can be configured: + (++) Baud Rate + (++) Parity: parity should be enabled, frame Length is fixed to 8 bits plus parity + (++) Receiver/transmitter modes + (++) Synchronous mode (and if enabled, phase, polarity and last bit parameters) + (++) Prescaler value + (++) Guard bit time + (++) NACK enabling or disabling on transmission error + + (+) The following advanced features can be configured as well: + (++) TX and/or RX pin level inversion + (++) data logical level inversion + (++) RX and TX pins swap + (++) RX overrun detection disabling + (++) DMA disabling on RX error + (++) MSB first on communication line + (++) Time out enabling (and if activated, timeout value) + (++) Block length + (++) Auto-retry counter + [..] + The HAL_SMARTCARD_Init() API follows the USART synchronous configuration procedures + (details for the procedures are available in reference manual). + +@endverbatim + + The USART frame format is given in the following table: + + Table 1. USART frame format. + +---------------------------------------------------------------+ + | M1M0 bits | PCE bit | USART frame | + |-----------------------|---------------------------------------| + | 01 | 1 | | SB | 8 bit data | PB | STB | | + +---------------------------------------------------------------+ + + + * @{ + */ + +/** + * @brief Initialize the SMARTCARD mode according to the specified + * parameters in the SMARTCARD_HandleTypeDef and initialize the associated handle. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Check the SMARTCARD handle allocation */ + if (hsmartcard == NULL) + { + return HAL_ERROR; + } + + /* Check the USART associated to the SMARTCARD handle */ + assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance)); + + if (hsmartcard->gState == HAL_SMARTCARD_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hsmartcard->Lock = HAL_UNLOCKED; + +#if USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1 + SMARTCARD_InitCallbacksToDefault(hsmartcard); + + if (hsmartcard->MspInitCallback == NULL) + { + hsmartcard->MspInitCallback = HAL_SMARTCARD_MspInit; + } + + /* Init the low level hardware */ + hsmartcard->MspInitCallback(hsmartcard); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_SMARTCARD_MspInit(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */ + } + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; + + /* Disable the Peripheral to set smartcard mode */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* In SmartCard mode, the following bits must be kept cleared: + - LINEN in the USART_CR2 register, + - HDSEL and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(hsmartcard->Instance->CR2, USART_CR2_LINEN); + CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN)); + + /* set the USART in SMARTCARD mode */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_SCEN); + + /* Set the SMARTCARD Communication parameters */ + if (SMARTCARD_SetConfig(hsmartcard) == HAL_ERROR) + { + return HAL_ERROR; + } + + /* Set the SMARTCARD transmission completion indication */ + SMARTCARD_TRANSMISSION_COMPLETION_SETTING(hsmartcard); + + if (hsmartcard->AdvancedInit.AdvFeatureInit != SMARTCARD_ADVFEATURE_NO_INIT) + { + SMARTCARD_AdvFeatureConfig(hsmartcard); + } + + /* Enable the Peripheral */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* TEACK and/or REACK to check before moving hsmartcard->gState and hsmartcard->RxState to Ready */ + return (SMARTCARD_CheckIdleState(hsmartcard)); +} + +/** + * @brief DeInitialize the SMARTCARD peripheral. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Check the SMARTCARD handle allocation */ + if (hsmartcard == NULL) + { + return HAL_ERROR; + } + + /* Check the USART/UART associated to the SMARTCARD handle */ + assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance)); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; + + /* Disable the Peripheral */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + WRITE_REG(hsmartcard->Instance->CR1, 0x0U); + WRITE_REG(hsmartcard->Instance->CR2, 0x0U); + WRITE_REG(hsmartcard->Instance->CR3, 0x0U); + WRITE_REG(hsmartcard->Instance->RTOR, 0x0U); + WRITE_REG(hsmartcard->Instance->GTPR, 0x0U); + + /* DeInit the low level hardware */ +#if USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1 + if (hsmartcard->MspDeInitCallback == NULL) + { + hsmartcard->MspDeInitCallback = HAL_SMARTCARD_MspDeInit; + } + /* DeInit the low level hardware */ + hsmartcard->MspDeInitCallback(hsmartcard); +#else + HAL_SMARTCARD_MspDeInit(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */ + + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + hsmartcard->gState = HAL_SMARTCARD_STATE_RESET; + hsmartcard->RxState = HAL_SMARTCARD_STATE_RESET; + + /* Process Unlock */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; +} + +/** + * @brief Initialize the SMARTCARD MSP. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARD_MspInit can be implemented in the user file + */ +} + +/** + * @brief DeInitialize the SMARTCARD MSP. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARD_MspDeInit can be implemented in the user file + */ +} + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User SMARTCARD Callback + * To be used instead of the weak predefined callback + * @param hsmartcard smartcard handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_SMARTCARD_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_SMARTCARD_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_SMARTCARD_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_SMARTCARD_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID + * @arg @ref HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID + * @arg @ref HAL_SMARTCARD_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID + * @arg @ref HAL_SMARTCARD_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID + * @arg @ref HAL_SMARTCARD_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_SMARTCARD_MSPDEINIT_CB_ID MspDeInit Callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_RegisterCallback(SMARTCARD_HandleTypeDef *hsmartcard, + HAL_SMARTCARD_CallbackIDTypeDef CallbackID, + pSMARTCARD_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hsmartcard); + + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + switch (CallbackID) + { + + case HAL_SMARTCARD_TX_COMPLETE_CB_ID : + hsmartcard->TxCpltCallback = pCallback; + break; + + case HAL_SMARTCARD_RX_COMPLETE_CB_ID : + hsmartcard->RxCpltCallback = pCallback; + break; + + case HAL_SMARTCARD_ERROR_CB_ID : + hsmartcard->ErrorCallback = pCallback; + break; + + case HAL_SMARTCARD_ABORT_COMPLETE_CB_ID : + hsmartcard->AbortCpltCallback = pCallback; + break; + + case HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID : + hsmartcard->AbortTransmitCpltCallback = pCallback; + break; + + case HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID : + hsmartcard->AbortReceiveCpltCallback = pCallback; + break; + + case HAL_SMARTCARD_RX_FIFO_FULL_CB_ID : + hsmartcard->RxFifoFullCallback = pCallback; + break; + + case HAL_SMARTCARD_TX_FIFO_EMPTY_CB_ID : + hsmartcard->TxFifoEmptyCallback = pCallback; + break; + + case HAL_SMARTCARD_MSPINIT_CB_ID : + hsmartcard->MspInitCallback = pCallback; + break; + + case HAL_SMARTCARD_MSPDEINIT_CB_ID : + hsmartcard->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hsmartcard->gState == HAL_SMARTCARD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_SMARTCARD_MSPINIT_CB_ID : + hsmartcard->MspInitCallback = pCallback; + break; + + case HAL_SMARTCARD_MSPDEINIT_CB_ID : + hsmartcard->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hsmartcard); + + return status; +} + +/** + * @brief Unregister an SMARTCARD callback + * SMARTCARD callback is redirected to the weak predefined callback + * @param hsmartcard smartcard handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_SMARTCARD_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_SMARTCARD_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_SMARTCARD_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_SMARTCARD_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID + * @arg @ref HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID + * @arg @ref HAL_SMARTCARD_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID + * @arg @ref HAL_SMARTCARD_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID + * @arg @ref HAL_SMARTCARD_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_SMARTCARD_MSPDEINIT_CB_ID MspDeInit Callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_UnRegisterCallback(SMARTCARD_HandleTypeDef *hsmartcard, + HAL_SMARTCARD_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hsmartcard); + + if (HAL_SMARTCARD_STATE_READY == hsmartcard->gState) + { + switch (CallbackID) + { + case HAL_SMARTCARD_TX_COMPLETE_CB_ID : + hsmartcard->TxCpltCallback = HAL_SMARTCARD_TxCpltCallback; /* Legacy weak TxCpltCallback */ + break; + + case HAL_SMARTCARD_RX_COMPLETE_CB_ID : + hsmartcard->RxCpltCallback = HAL_SMARTCARD_RxCpltCallback; /* Legacy weak RxCpltCallback */ + break; + + case HAL_SMARTCARD_ERROR_CB_ID : + hsmartcard->ErrorCallback = HAL_SMARTCARD_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_SMARTCARD_ABORT_COMPLETE_CB_ID : + hsmartcard->AbortCpltCallback = HAL_SMARTCARD_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + break; + + case HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID : + hsmartcard->AbortTransmitCpltCallback = HAL_SMARTCARD_AbortTransmitCpltCallback; /* Legacy weak + AbortTransmitCpltCallback*/ + break; + + case HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID : + hsmartcard->AbortReceiveCpltCallback = HAL_SMARTCARD_AbortReceiveCpltCallback; /* Legacy weak + AbortReceiveCpltCallback */ + break; + + case HAL_SMARTCARD_RX_FIFO_FULL_CB_ID : + hsmartcard->RxFifoFullCallback = HAL_SMARTCARDEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */ + break; + + case HAL_SMARTCARD_TX_FIFO_EMPTY_CB_ID : + hsmartcard->TxFifoEmptyCallback = HAL_SMARTCARDEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */ + break; + + case HAL_SMARTCARD_MSPINIT_CB_ID : + hsmartcard->MspInitCallback = HAL_SMARTCARD_MspInit; /* Legacy weak MspInitCallback */ + break; + + case HAL_SMARTCARD_MSPDEINIT_CB_ID : + hsmartcard->MspDeInitCallback = HAL_SMARTCARD_MspDeInit; /* Legacy weak MspDeInitCallback */ + break; + + default : + /* Update the error code */ + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_SMARTCARD_STATE_RESET == hsmartcard->gState) + { + switch (CallbackID) + { + case HAL_SMARTCARD_MSPINIT_CB_ID : + hsmartcard->MspInitCallback = HAL_SMARTCARD_MspInit; + break; + + case HAL_SMARTCARD_MSPDEINIT_CB_ID : + hsmartcard->MspDeInitCallback = HAL_SMARTCARD_MspDeInit; + break; + + default : + /* Update the error code */ + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hsmartcard); + + return status; +} +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup SMARTCARD_Exported_Functions_Group2 IO operation functions + * @brief SMARTCARD Transmit and Receive functions + * +@verbatim + ============================================================================== + ##### IO operation functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to manage the SMARTCARD data transfers. + + [..] + Smartcard is a single wire half duplex communication protocol. + The Smartcard interface is designed to support asynchronous protocol Smartcards as + defined in the ISO 7816-3 standard. The USART should be configured as: + (+) 8 bits plus parity: where M=1 and PCE=1 in the USART_CR1 register + (+) 1.5 stop bits when transmitting and receiving: where STOP=11 in the USART_CR2 register. + + [..] + (#) There are two modes of transfer: + (##) Blocking mode: The communication is performed in polling mode. + The HAL status of all data processing is returned by the same function + after finishing transfer. + (##) Non-Blocking mode: The communication is performed using Interrupts + or DMA, the relevant API's return the HAL status. + The end of the data processing will be indicated through the + dedicated SMARTCARD IRQ when using Interrupt mode or the DMA IRQ when + using DMA mode. + (##) The HAL_SMARTCARD_TxCpltCallback(), HAL_SMARTCARD_RxCpltCallback() user callbacks + will be executed respectively at the end of the Transmit or Receive process + The HAL_SMARTCARD_ErrorCallback() user callback will be executed when a communication + error is detected. + + (#) Blocking mode APIs are : + (##) HAL_SMARTCARD_Transmit() + (##) HAL_SMARTCARD_Receive() + + (#) Non Blocking mode APIs with Interrupt are : + (##) HAL_SMARTCARD_Transmit_IT() + (##) HAL_SMARTCARD_Receive_IT() + (##) HAL_SMARTCARD_IRQHandler() + + (#) Non Blocking mode functions with DMA are : + (##) HAL_SMARTCARD_Transmit_DMA() + (##) HAL_SMARTCARD_Receive_DMA() + + (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: + (##) HAL_SMARTCARD_TxCpltCallback() + (##) HAL_SMARTCARD_RxCpltCallback() + (##) HAL_SMARTCARD_ErrorCallback() + + [..] + (#) Non-Blocking mode transfers could be aborted using Abort API's : + (##) HAL_SMARTCARD_Abort() + (##) HAL_SMARTCARD_AbortTransmit() + (##) HAL_SMARTCARD_AbortReceive() + (##) HAL_SMARTCARD_Abort_IT() + (##) HAL_SMARTCARD_AbortTransmit_IT() + (##) HAL_SMARTCARD_AbortReceive_IT() + + (#) For Abort services based on interrupts (HAL_SMARTCARD_Abortxxx_IT), + a set of Abort Complete Callbacks are provided: + (##) HAL_SMARTCARD_AbortCpltCallback() + (##) HAL_SMARTCARD_AbortTransmitCpltCallback() + (##) HAL_SMARTCARD_AbortReceiveCpltCallback() + + (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. + Errors are handled as follows : + (##) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is + to be evaluated by user : this concerns Frame Error, + Parity Error or Noise Error in Interrupt mode reception . + Received character is then retrieved and stored in Rx buffer, + Error code is set to allow user to identify error type, + and HAL_SMARTCARD_ErrorCallback() user callback is executed. Transfer is kept ongoing on SMARTCARD side. + If user wants to abort it, Abort services should be called by user. + (##) Error is considered as Blocking : Transfer could not be completed properly and is aborted. + This concerns Frame Error in Interrupt mode transmission, Overrun Error in Interrupt + mode reception and all errors in DMA mode. + Error code is set to allow user to identify error type, + and HAL_SMARTCARD_ErrorCallback() user callback is executed. + +@endverbatim + * @{ + */ + +/** + * @brief Send an amount of data in blocking mode. + * @note When FIFO mode is enabled, writing a data in the TDR register adds one + * data to the TXFIFO. Write operations to the TDR register are performed + * when TXFNF flag is set. From hardware perspective, TXFNF flag and + * TXE are mapped on the same bit-field. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param pData pointer to data buffer. + * @param Size amount of data to be sent. + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsmartcard, const uint8_t *pData, uint16_t Size, + uint32_t Timeout) +{ + uint32_t tickstart; + const uint8_t *ptmpdata = pData; + + /* Check that a Tx process is not already ongoing */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + if ((ptmpdata == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + /* Disable the Peripheral first to update mode for TX master */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* In case of TX only mode, if NACK is enabled, the USART must be able to monitor + the bidirectional line to detect a NACK signal in case of parity error. + Therefore, the receiver block must be enabled as well (RE bit must be set). */ + if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX) + && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE)) + { + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RE); + } + /* Enable Tx */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE); + + /* Enable the Peripheral */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* Perform a TX/RX FIFO Flush */ + __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard); + + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + hsmartcard->TxXferSize = Size; + hsmartcard->TxXferCount = Size; + + while (hsmartcard->TxXferCount > 0U) + { + hsmartcard->TxXferCount--; + if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + hsmartcard->Instance->TDR = (uint8_t)(*ptmpdata & 0xFFU); + ptmpdata++; + } + if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_TRANSMISSION_COMPLETION_FLAG(hsmartcard), RESET, + tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + + /* Disable the Peripheral first to update mode */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX) + && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE)) + { + /* In case of TX only mode, if NACK is enabled, receiver block has been enabled + for Transmit phase. Disable this receiver block. */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RE); + } + if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX_RX) + || (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE)) + { + /* Perform a TX FIFO Flush at end of Tx phase, as all sent bytes are appearing in Rx Data register */ + __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard); + } + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* At end of Tx process, restore hsmartcard->gState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in blocking mode. + * @note When FIFO mode is enabled, the RXFNE flag is set as long as the RXFIFO + * is not empty. Read operations from the RDR register are performed when + * RXFNE flag is set. From hardware perspective, RXFNE flag and + * RXNE are mapped on the same bit-field. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param pData pointer to data buffer. + * @param Size amount of data to be received. + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size, + uint32_t Timeout) +{ + uint32_t tickstart; + uint8_t *ptmpdata = pData; + + /* Check that a Rx process is not already ongoing */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY) + { + if ((ptmpdata == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + hsmartcard->RxXferSize = Size; + hsmartcard->RxXferCount = Size; + + /* Check the remain data to be received */ + while (hsmartcard->RxXferCount > 0U) + { + hsmartcard->RxXferCount--; + + if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + *ptmpdata = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0x00FF); + ptmpdata++; + } + + /* At end of Rx process, restore hsmartcard->RxState to Ready */ + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Send an amount of data in interrupt mode. + * @note When FIFO mode is disabled, USART interrupt is generated whenever + * USART_TDR register is empty, i.e one interrupt per data to transmit. + * @note When FIFO mode is enabled, USART interrupt is generated whenever + * TXFIFO threshold reached. In that case the interrupt rate depends on + * TXFIFO threshold configuration. + * @note This function sets the hsmartcard->TxIsr function pointer according to + * the FIFO mode (data transmission processing depends on FIFO mode). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param pData pointer to data buffer. + * @param Size amount of data to be sent. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsmartcard, const uint8_t *pData, uint16_t Size) +{ + /* Check that a Tx process is not already ongoing */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX; + + hsmartcard->pTxBuffPtr = pData; + hsmartcard->TxXferSize = Size; + hsmartcard->TxXferCount = Size; + hsmartcard->TxISR = NULL; + + /* Disable the Peripheral first to update mode for TX master */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* In case of TX only mode, if NACK is enabled, the USART must be able to monitor + the bidirectional line to detect a NACK signal in case of parity error. + Therefore, the receiver block must be enabled as well (RE bit must be set). */ + if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX) + && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE)) + { + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RE); + } + /* Enable Tx */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE); + + /* Enable the Peripheral */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* Perform a TX/RX FIFO Flush */ + __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard); + + /* Configure Tx interrupt processing */ + if (hsmartcard->FifoMode == SMARTCARD_FIFOMODE_ENABLE) + { + /* Set the Tx ISR function pointer */ + hsmartcard->TxISR = SMARTCARD_TxISR_FIFOEN; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + /* Enable the SMARTCARD Error Interrupt: (Frame error) */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + /* Enable the TX FIFO threshold interrupt */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_TXFTIE); + } + else + { + /* Set the Tx ISR function pointer */ + hsmartcard->TxISR = SMARTCARD_TxISR; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + /* Enable the SMARTCARD Error Interrupt: (Frame error) */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + /* Enable the SMARTCARD Transmit Data Register Empty Interrupt */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in interrupt mode. + * @note When FIFO mode is disabled, USART interrupt is generated whenever + * USART_RDR register can be read, i.e one interrupt per data to receive. + * @note When FIFO mode is enabled, USART interrupt is generated whenever + * RXFIFO threshold reached. In that case the interrupt rate depends on + * RXFIFO threshold configuration. + * @note This function sets the hsmartcard->RxIsr function pointer according to + * the FIFO mode (data reception processing depends on FIFO mode). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param pData pointer to data buffer. + * @param Size amount of data to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size) +{ + /* Check that a Rx process is not already ongoing */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX; + + hsmartcard->pRxBuffPtr = pData; + hsmartcard->RxXferSize = Size; + hsmartcard->RxXferCount = Size; + + /* Configure Rx interrupt processing */ + if ((hsmartcard->FifoMode == SMARTCARD_FIFOMODE_ENABLE) && (Size >= hsmartcard->NbRxDataToProcess)) + { + /* Set the Rx ISR function pointer */ + hsmartcard->RxISR = SMARTCARD_RxISR_FIFOEN; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + /* Enable the SMARTCART Parity Error interrupt and RX FIFO Threshold interrupt */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE); + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_RXFTIE); + } + else + { + /* Set the Rx ISR function pointer */ + hsmartcard->RxISR = SMARTCARD_RxISR; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + /* Enable the SMARTCARD Parity Error and Data Register not empty Interrupts */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE); + } + + /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Send an amount of data in DMA mode. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param pData pointer to data buffer. + * @param Size amount of data to be sent. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsmartcard, const uint8_t *pData, uint16_t Size) +{ + /* Check that a Tx process is not already ongoing */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX; + + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + hsmartcard->pTxBuffPtr = pData; + hsmartcard->TxXferSize = Size; + hsmartcard->TxXferCount = Size; + + /* Disable the Peripheral first to update mode for TX master */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* In case of TX only mode, if NACK is enabled, the USART must be able to monitor + the bidirectional line to detect a NACK signal in case of parity error. + Therefore, the receiver block must be enabled as well (RE bit must be set). */ + if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX) + && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE)) + { + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RE); + } + /* Enable Tx */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE); + + /* Enable the Peripheral */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* Perform a TX/RX FIFO Flush */ + __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard); + + /* Set the SMARTCARD DMA transfer complete callback */ + hsmartcard->hdmatx->XferCpltCallback = SMARTCARD_DMATransmitCplt; + + /* Set the SMARTCARD error callback */ + hsmartcard->hdmatx->XferErrorCallback = SMARTCARD_DMAError; + + /* Set the DMA abort callback */ + hsmartcard->hdmatx->XferAbortCallback = NULL; + + /* Enable the SMARTCARD transmit DMA channel */ + if (HAL_DMA_Start_IT(hsmartcard->hdmatx, (uint32_t)hsmartcard->pTxBuffPtr, (uint32_t)&hsmartcard->Instance->TDR, + Size) == HAL_OK) + { + /* Clear the TC flag in the ICR register */ + CLEAR_BIT(hsmartcard->Instance->ICR, USART_ICR_TCCF); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + /* Enable the UART Error Interrupt: (Frame error) */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + /* Enable the DMA transfer for transmit request by setting the DMAT bit + in the SMARTCARD associated USART CR3 register */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT); + + return HAL_OK; + } + else + { + /* Set error code to DMA */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + /* Restore hsmartcard->State to ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in DMA mode. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param pData pointer to data buffer. + * @param Size amount of data to be received. + * @note The SMARTCARD-associated USART parity is enabled (PCE = 1), + * the received data contain the parity bit (MSB position). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size) +{ + /* Check that a Rx process is not already ongoing */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX; + + hsmartcard->pRxBuffPtr = pData; + hsmartcard->RxXferSize = Size; + + /* Set the SMARTCARD DMA transfer complete callback */ + hsmartcard->hdmarx->XferCpltCallback = SMARTCARD_DMAReceiveCplt; + + /* Set the SMARTCARD DMA error callback */ + hsmartcard->hdmarx->XferErrorCallback = SMARTCARD_DMAError; + + /* Set the DMA abort callback */ + hsmartcard->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(hsmartcard->hdmarx, (uint32_t)&hsmartcard->Instance->RDR, (uint32_t)hsmartcard->pRxBuffPtr, + Size) == HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + /* Enable the SMARTCARD Parity Error Interrupt */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE); + + /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + /* Enable the DMA transfer for the receiver request by setting the DMAR bit + in the SMARTCARD associated USART CR3 register */ + SET_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR); + + return HAL_OK; + } + else + { + /* Set error code to DMA */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + /* Restore hsmartcard->State to ready */ + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Abort ongoing transfers (blocking mode). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SMARTCARD Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Abort(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Disable RTOIE, EOBIE, TXEIE, TCIE, RXNE, PE, RXFT, TXFT and + ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, + (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE | USART_CR1_RTOIE | + USART_CR1_EOBIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); + + /* Disable the SMARTCARD DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT); + + /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */ + if (hsmartcard->hdmatx != NULL) + { + /* Set the SMARTCARD DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + hsmartcard->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(hsmartcard->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(hsmartcard->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Disable the SMARTCARD DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR); + + /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */ + if (hsmartcard->hdmarx != NULL) + { + /* Set the SMARTCARD DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + hsmartcard->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(hsmartcard->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(hsmartcard->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx and Rx transfer counters */ + hsmartcard->TxXferCount = 0U; + hsmartcard->RxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, + SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | + SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF); + + /* Restore hsmartcard->gState and hsmartcard->RxState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* Reset Handle ErrorCode to No Error */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + + return HAL_OK; +} + +/** + * @brief Abort ongoing Transmit transfer (blocking mode). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SMARTCARD Interrupts (Tx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Disable TCIE, TXEIE and TXFTIE interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_TXFTIE); + + /* Check if a receive process is ongoing or not. If not disable ERR IT */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY) + { + /* Disable the SMARTCARD Error Interrupt: (Frame error) */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + } + + /* Disable the SMARTCARD DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT); + + /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */ + if (hsmartcard->hdmatx != NULL) + { + /* Set the SMARTCARD DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + hsmartcard->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(hsmartcard->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(hsmartcard->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx transfer counter */ + hsmartcard->TxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF); + + /* Restore hsmartcard->gState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Abort ongoing Receive transfer (blocking mode). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SMARTCARD Interrupts (Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Disable RTOIE, EOBIE, RXNE, PE, RXFT, TXFT and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_RTOIE | + USART_CR1_EOBIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* Check if a Transmit process is ongoing or not. If not disable ERR IT */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + /* Disable the SMARTCARD Error Interrupt: (Frame error) */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + } + + /* Disable the SMARTCARD DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR); + + /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */ + if (hsmartcard->hdmarx != NULL) + { + /* Set the SMARTCARD DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + hsmartcard->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(hsmartcard->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(hsmartcard->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Rx transfer counter */ + hsmartcard->RxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, + SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | + SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF); + + /* Restore hsmartcard->RxState to Ready */ + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfers (Interrupt mode). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SMARTCARD Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_Abort_IT(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint32_t abortcplt = 1U; + + /* Disable RTOIE, EOBIE, TXEIE, TCIE, RXNE, PE, RXFT, TXFT and + ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, + (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE | USART_CR1_RTOIE | + USART_CR1_EOBIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); + + /* If DMA Tx and/or DMA Rx Handles are associated to SMARTCARD Handle, + DMA Abort complete callbacks should be initialised before any call + to DMA Abort functions */ + /* DMA Tx Handle is valid */ + if (hsmartcard->hdmatx != NULL) + { + /* Set DMA Abort Complete callback if SMARTCARD DMA Tx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT)) + { + hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMATxAbortCallback; + } + else + { + hsmartcard->hdmatx->XferAbortCallback = NULL; + } + } + /* DMA Rx Handle is valid */ + if (hsmartcard->hdmarx != NULL) + { + /* Set DMA Abort Complete callback if SMARTCARD DMA Rx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) + { + hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMARxAbortCallback; + } + else + { + hsmartcard->hdmarx->XferAbortCallback = NULL; + } + } + + /* Disable the SMARTCARD DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable DMA Tx at UART level */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT); + + /* Abort the SMARTCARD DMA Tx channel : use non blocking DMA Abort API (callback) */ + if (hsmartcard->hdmatx != NULL) + { + /* SMARTCARD Tx DMA Abort callback has already been initialised : + will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK) + { + hsmartcard->hdmatx->XferAbortCallback = NULL; + } + else + { + abortcplt = 0U; + } + } + } + + /* Disable the SMARTCARD DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR); + + /* Abort the SMARTCARD DMA Rx channel : use non blocking DMA Abort API (callback) */ + if (hsmartcard->hdmarx != NULL) + { + /* SMARTCARD Rx DMA Abort callback has already been initialised : + will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK) + { + hsmartcard->hdmarx->XferAbortCallback = NULL; + abortcplt = 1U; + } + else + { + abortcplt = 0U; + } + } + } + + /* if no DMA abort complete callback execution is required => call user Abort Complete callback */ + if (abortcplt == 1U) + { + /* Reset Tx and Rx transfer counters */ + hsmartcard->TxXferCount = 0U; + hsmartcard->RxXferCount = 0U; + + /* Clear ISR function pointers */ + hsmartcard->RxISR = NULL; + hsmartcard->TxISR = NULL; + + /* Reset errorCode */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, + SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | + SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF); + + /* Restore hsmartcard->gState and hsmartcard->RxState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + hsmartcard->AbortCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort complete callback */ + HAL_SMARTCARD_AbortCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing Transmit transfer (Interrupt mode). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SMARTCARD Interrupts (Tx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Disable TCIE, TXEIE and TXFTIE interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_TXFTIE); + + /* Check if a receive process is ongoing or not. If not disable ERR IT */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY) + { + /* Disable the SMARTCARD Error Interrupt: (Frame error) */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + } + + /* Disable the SMARTCARD DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT); + + /* Abort the SMARTCARD DMA Tx channel : use non blocking DMA Abort API (callback) */ + if (hsmartcard->hdmatx != NULL) + { + /* Set the SMARTCARD DMA Abort callback : + will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */ + hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMATxOnlyAbortCallback; + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK) + { + /* Call Directly hsmartcard->hdmatx->XferAbortCallback function in case of error */ + hsmartcard->hdmatx->XferAbortCallback(hsmartcard->hdmatx); + } + } + else + { + /* Reset Tx transfer counter */ + hsmartcard->TxXferCount = 0U; + + /* Clear TxISR function pointers */ + hsmartcard->TxISR = NULL; + + /* Restore hsmartcard->gState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + hsmartcard->AbortTransmitCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + } + else + { + /* Reset Tx transfer counter */ + hsmartcard->TxXferCount = 0U; + + /* Clear TxISR function pointers */ + hsmartcard->TxISR = NULL; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF); + + /* Restore hsmartcard->gState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + hsmartcard->AbortTransmitCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing Receive transfer (Interrupt mode). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SMARTCARD Interrupts (Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive_IT(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Disable RTOIE, EOBIE, RXNE, PE, RXFT and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_RTOIE | + USART_CR1_EOBIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* Check if a Transmit process is ongoing or not. If not disable ERR IT */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + /* Disable the SMARTCARD Error Interrupt: (Frame error) */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + } + + /* Disable the SMARTCARD DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR); + + /* Abort the SMARTCARD DMA Rx channel : use non blocking DMA Abort API (callback) */ + if (hsmartcard->hdmarx != NULL) + { + /* Set the SMARTCARD DMA Abort callback : + will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */ + hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMARxOnlyAbortCallback; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK) + { + /* Call Directly hsmartcard->hdmarx->XferAbortCallback function in case of error */ + hsmartcard->hdmarx->XferAbortCallback(hsmartcard->hdmarx); + } + } + else + { + /* Reset Rx transfer counter */ + hsmartcard->RxXferCount = 0U; + + /* Clear RxISR function pointer */ + hsmartcard->RxISR = NULL; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, + SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | + SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF); + + /* Restore hsmartcard->RxState to Ready */ + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + hsmartcard->AbortReceiveCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + } + else + { + /* Reset Rx transfer counter */ + hsmartcard->RxXferCount = 0U; + + /* Clear RxISR function pointer */ + hsmartcard->RxISR = NULL; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, + SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | + SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF); + + /* Restore hsmartcard->RxState to Ready */ + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + hsmartcard->AbortReceiveCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + + return HAL_OK; +} + +/** + * @brief Handle SMARTCARD interrupt requests. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint32_t isrflags = READ_REG(hsmartcard->Instance->ISR); + uint32_t cr1its = READ_REG(hsmartcard->Instance->CR1); + uint32_t cr3its = READ_REG(hsmartcard->Instance->CR3); + uint32_t errorflags; + uint32_t errorcode; + + /* If no error occurs */ + errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF)); + if (errorflags == 0U) + { + /* SMARTCARD in mode Receiver ---------------------------------------------------*/ + if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) + || ((cr3its & USART_CR3_RXFTIE) != 0U))) + { + if (hsmartcard->RxISR != NULL) + { + hsmartcard->RxISR(hsmartcard); + } + return; + } + } + + /* If some errors occur */ + if ((errorflags != 0U) + && ((((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U) + || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U)))) + { + /* SMARTCARD parity error interrupt occurred -------------------------------------*/ + if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U)) + { + __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_PEF); + + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_PE; + } + + /* SMARTCARD frame error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_FEF); + + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_FE; + } + + /* SMARTCARD noise error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_NEF); + + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_NE; + } + + /* SMARTCARD Over-Run interrupt occurred -----------------------------------------*/ + if (((isrflags & USART_ISR_ORE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) + || ((cr3its & USART_CR3_RXFTIE) != 0U) + || ((cr3its & USART_CR3_EIE) != 0U))) + { + __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_OREF); + + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_ORE; + } + + /* SMARTCARD receiver timeout interrupt occurred -----------------------------------------*/ + if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) + { + __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_RTOF); + + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_RTO; + } + + /* Call SMARTCARD Error Call back function if need be --------------------------*/ + if (hsmartcard->ErrorCode != HAL_SMARTCARD_ERROR_NONE) + { + /* SMARTCARD in mode Receiver ---------------------------------------------------*/ + if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) + || ((cr3its & USART_CR3_RXFTIE) != 0U))) + { + if (hsmartcard->RxISR != NULL) + { + hsmartcard->RxISR(hsmartcard); + } + } + + /* If Error is to be considered as blocking : + - Receiver Timeout error in Reception + - Overrun error in Reception + - any error occurs in DMA mode reception + */ + errorcode = hsmartcard->ErrorCode; + if ((HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) + || ((errorcode & (HAL_SMARTCARD_ERROR_RTO | HAL_SMARTCARD_ERROR_ORE)) != 0U)) + { + /* Blocking error : transfer is aborted + Set the SMARTCARD state ready to be able to start again the process, + Disable Rx Interrupts, and disable Rx DMA request, if ongoing */ + SMARTCARD_EndRxTransfer(hsmartcard); + + /* Disable the SMARTCARD DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR); + + /* Abort the SMARTCARD DMA Rx channel */ + if (hsmartcard->hdmarx != NULL) + { + /* Set the SMARTCARD DMA Abort callback : + will lead to call HAL_SMARTCARD_ErrorCallback() at end of DMA abort procedure */ + hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMAAbortOnError; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK) + { + /* Call Directly hsmartcard->hdmarx->XferAbortCallback function in case of error */ + hsmartcard->hdmarx->XferAbortCallback(hsmartcard->hdmarx); + } + } + else + { +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered user error callback */ + hsmartcard->ErrorCallback(hsmartcard); +#else + /* Call legacy weak user error callback */ + HAL_SMARTCARD_ErrorCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + } + else + { +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered user error callback */ + hsmartcard->ErrorCallback(hsmartcard); +#else + /* Call legacy weak user error callback */ + HAL_SMARTCARD_ErrorCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + } + /* other error type to be considered as blocking : + - Frame error in Transmission + */ + else if ((hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX) + && ((errorcode & HAL_SMARTCARD_ERROR_FE) != 0U)) + { + /* Blocking error : transfer is aborted + Set the SMARTCARD state ready to be able to start again the process, + Disable Tx Interrupts, and disable Tx DMA request, if ongoing */ + SMARTCARD_EndTxTransfer(hsmartcard); + + /* Disable the SMARTCARD DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT)) + { + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT); + + /* Abort the SMARTCARD DMA Tx channel */ + if (hsmartcard->hdmatx != NULL) + { + /* Set the SMARTCARD DMA Abort callback : + will lead to call HAL_SMARTCARD_ErrorCallback() at end of DMA abort procedure */ + hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMAAbortOnError; + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK) + { + /* Call Directly hsmartcard->hdmatx->XferAbortCallback function in case of error */ + hsmartcard->hdmatx->XferAbortCallback(hsmartcard->hdmatx); + } + } + else + { +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered user error callback */ + hsmartcard->ErrorCallback(hsmartcard); +#else + /* Call legacy weak user error callback */ + HAL_SMARTCARD_ErrorCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + } + else + { +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered user error callback */ + hsmartcard->ErrorCallback(hsmartcard); +#else + /* Call legacy weak user error callback */ + HAL_SMARTCARD_ErrorCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + } + else + { + /* Non Blocking error : transfer could go on. + Error is notified to user through user error callback */ +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered user error callback */ + hsmartcard->ErrorCallback(hsmartcard); +#else + /* Call legacy weak user error callback */ + HAL_SMARTCARD_ErrorCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + } + } + return; + + } /* End if some error occurs */ + + /* SMARTCARD in mode Receiver, end of block interruption ------------------------*/ + if (((isrflags & USART_ISR_EOBF) != 0U) && ((cr1its & USART_CR1_EOBIE) != 0U)) + { + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + __HAL_UNLOCK(hsmartcard); +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Rx complete callback */ + hsmartcard->RxCpltCallback(hsmartcard); +#else + /* Call legacy weak Rx complete callback */ + HAL_SMARTCARD_RxCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + /* Clear EOBF interrupt after HAL_SMARTCARD_RxCpltCallback() call for the End of Block information + to be available during HAL_SMARTCARD_RxCpltCallback() processing */ + __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_EOBF); + return; + } + + /* SMARTCARD in mode Transmitter ------------------------------------------------*/ + if (((isrflags & USART_ISR_TXE_TXFNF) != 0U) + && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U) + || ((cr3its & USART_CR3_TXFTIE) != 0U))) + { + if (hsmartcard->TxISR != NULL) + { + hsmartcard->TxISR(hsmartcard); + } + return; + } + + /* SMARTCARD in mode Transmitter (transmission end) ------------------------*/ + if (__HAL_SMARTCARD_GET_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication) != RESET) + { + if (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication) != RESET) + { + SMARTCARD_EndTransmit_IT(hsmartcard); + return; + } + } + + /* SMARTCARD TX Fifo Empty occurred ----------------------------------------------*/ + if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U)) + { +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Tx Fifo Empty Callback */ + hsmartcard->TxFifoEmptyCallback(hsmartcard); +#else + /* Call legacy weak Tx Fifo Empty Callback */ + HAL_SMARTCARDEx_TxFifoEmptyCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + return; + } + + /* SMARTCARD RX Fifo Full occurred ----------------------------------------------*/ + if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U)) + { +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Rx Fifo Full Callback */ + hsmartcard->RxFifoFullCallback(hsmartcard); +#else + /* Call legacy weak Rx Fifo Full Callback */ + HAL_SMARTCARDEx_RxFifoFullCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + return; + } +} + +/** + * @brief Tx Transfer completed callback. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARD_TxCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Rx Transfer completed callback. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARD_RxCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief SMARTCARD error callback. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARD_ErrorCallback can be implemented in the user file. + */ +} + +/** + * @brief SMARTCARD Abort Complete callback. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARD_AbortCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARD_AbortCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief SMARTCARD Abort Complete callback. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARD_AbortTransmitCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARD_AbortTransmitCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief SMARTCARD Abort Receive Complete callback. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARD_AbortReceiveCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARD_AbortReceiveCpltCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup SMARTCARD_Exported_Functions_Group4 Peripheral State and Errors functions + * @brief SMARTCARD State and Errors functions + * +@verbatim + ============================================================================== + ##### Peripheral State and Errors functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to return the State of SmartCard + handle and also return Peripheral Errors occurred during communication process + (+) HAL_SMARTCARD_GetState() API can be helpful to check in run-time the state + of the SMARTCARD peripheral. + (+) HAL_SMARTCARD_GetError() checks in run-time errors that could occur during + communication. + +@endverbatim + * @{ + */ + +/** + * @brief Return the SMARTCARD handle state. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval SMARTCARD handle state + */ +HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(const SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Return SMARTCARD handle state */ + uint32_t temp1; + uint32_t temp2; + temp1 = (uint32_t)hsmartcard->gState; + temp2 = (uint32_t)hsmartcard->RxState; + + return (HAL_SMARTCARD_StateTypeDef)(temp1 | temp2); +} + +/** + * @brief Return the SMARTCARD handle error code. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval SMARTCARD handle Error Code + */ +uint32_t HAL_SMARTCARD_GetError(const SMARTCARD_HandleTypeDef *hsmartcard) +{ + return hsmartcard->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup SMARTCARD_Private_Functions SMARTCARD Private Functions + * @{ + */ + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) +/** + * @brief Initialize the callbacks to their default values. + * @param hsmartcard SMARTCARD handle. + * @retval none + */ +void SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Init the SMARTCARD Callback settings */ + hsmartcard->TxCpltCallback = HAL_SMARTCARD_TxCpltCallback; /* Legacy weak TxCpltCallback */ + hsmartcard->RxCpltCallback = HAL_SMARTCARD_RxCpltCallback; /* Legacy weak RxCpltCallback */ + hsmartcard->ErrorCallback = HAL_SMARTCARD_ErrorCallback; /* Legacy weak ErrorCallback */ + hsmartcard->AbortCpltCallback = HAL_SMARTCARD_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + hsmartcard->AbortTransmitCpltCallback = HAL_SMARTCARD_AbortTransmitCpltCallback; /* Legacy weak + AbortTransmitCpltCallback */ + hsmartcard->AbortReceiveCpltCallback = HAL_SMARTCARD_AbortReceiveCpltCallback; /* Legacy weak + AbortReceiveCpltCallback */ + hsmartcard->RxFifoFullCallback = HAL_SMARTCARDEx_RxFifoFullCallback; /* Legacy weak + RxFifoFullCallback */ + hsmartcard->TxFifoEmptyCallback = HAL_SMARTCARDEx_TxFifoEmptyCallback; /* Legacy weak + TxFifoEmptyCallback */ + +} +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */ + +/** + * @brief Configure the SMARTCARD associated USART peripheral. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval HAL status + */ +static HAL_StatusTypeDef SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint32_t tmpreg; + SMARTCARD_ClockSourceTypeDef clocksource; + HAL_StatusTypeDef ret = HAL_OK; + static const uint16_t SMARTCARDPrescTable[12] = {1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U}; + uint32_t pclk; + + /* Check the parameters */ + assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance)); + assert_param(IS_SMARTCARD_BAUDRATE(hsmartcard->Init.BaudRate)); + assert_param(IS_SMARTCARD_WORD_LENGTH(hsmartcard->Init.WordLength)); + assert_param(IS_SMARTCARD_STOPBITS(hsmartcard->Init.StopBits)); + assert_param(IS_SMARTCARD_PARITY(hsmartcard->Init.Parity)); + assert_param(IS_SMARTCARD_MODE(hsmartcard->Init.Mode)); + assert_param(IS_SMARTCARD_POLARITY(hsmartcard->Init.CLKPolarity)); + assert_param(IS_SMARTCARD_PHASE(hsmartcard->Init.CLKPhase)); + assert_param(IS_SMARTCARD_LASTBIT(hsmartcard->Init.CLKLastBit)); + assert_param(IS_SMARTCARD_ONE_BIT_SAMPLE(hsmartcard->Init.OneBitSampling)); + assert_param(IS_SMARTCARD_NACK(hsmartcard->Init.NACKEnable)); + assert_param(IS_SMARTCARD_TIMEOUT(hsmartcard->Init.TimeOutEnable)); + assert_param(IS_SMARTCARD_AUTORETRY_COUNT(hsmartcard->Init.AutoRetryCount)); + assert_param(IS_SMARTCARD_CLOCKPRESCALER(hsmartcard->Init.ClockPrescaler)); + + /*-------------------------- USART CR1 Configuration -----------------------*/ + /* In SmartCard mode, M and PCE are forced to 1 (8 bits + parity). + * Oversampling is forced to 16 (OVER8 = 0). + * Configure the Parity and Mode: + * set PS bit according to hsmartcard->Init.Parity value + * set TE and RE bits according to hsmartcard->Init.Mode value */ + tmpreg = (((uint32_t)hsmartcard->Init.Parity) | ((uint32_t)hsmartcard->Init.Mode) | + ((uint32_t)hsmartcard->Init.WordLength)); + MODIFY_REG(hsmartcard->Instance->CR1, USART_CR1_FIELDS, tmpreg); + + /*-------------------------- USART CR2 Configuration -----------------------*/ + tmpreg = hsmartcard->Init.StopBits; + /* Synchronous mode is activated by default */ + tmpreg |= (uint32_t) USART_CR2_CLKEN | hsmartcard->Init.CLKPolarity; + tmpreg |= (uint32_t) hsmartcard->Init.CLKPhase | hsmartcard->Init.CLKLastBit; + tmpreg |= (uint32_t) hsmartcard->Init.TimeOutEnable; + MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_FIELDS, tmpreg); + + /*-------------------------- USART CR3 Configuration -----------------------*/ + /* Configure + * - one-bit sampling method versus three samples' majority rule + * according to hsmartcard->Init.OneBitSampling + * - NACK transmission in case of parity error according + * to hsmartcard->Init.NACKEnable + * - autoretry counter according to hsmartcard->Init.AutoRetryCount */ + + tmpreg = (uint32_t) hsmartcard->Init.OneBitSampling | hsmartcard->Init.NACKEnable; + tmpreg |= ((uint32_t)hsmartcard->Init.AutoRetryCount << USART_CR3_SCARCNT_Pos); + MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_FIELDS, tmpreg); + + /*--------------------- SMARTCARD clock PRESC Configuration ----------------*/ + /* Configure + * - SMARTCARD Clock Prescaler: set PRESCALER according to hsmartcard->Init.ClockPrescaler value */ + MODIFY_REG(hsmartcard->Instance->PRESC, USART_PRESC_PRESCALER, hsmartcard->Init.ClockPrescaler); + + /*-------------------------- USART GTPR Configuration ----------------------*/ + tmpreg = (hsmartcard->Init.Prescaler | ((uint32_t)hsmartcard->Init.GuardTime << USART_GTPR_GT_Pos)); + MODIFY_REG(hsmartcard->Instance->GTPR, (uint16_t)(USART_GTPR_GT | USART_GTPR_PSC), (uint16_t)tmpreg); + + /*-------------------------- USART RTOR Configuration ----------------------*/ + tmpreg = ((uint32_t)hsmartcard->Init.BlockLength << USART_RTOR_BLEN_Pos); + if (hsmartcard->Init.TimeOutEnable == SMARTCARD_TIMEOUT_ENABLE) + { + assert_param(IS_SMARTCARD_TIMEOUT_VALUE(hsmartcard->Init.TimeOutValue)); + tmpreg |= (uint32_t) hsmartcard->Init.TimeOutValue; + } + MODIFY_REG(hsmartcard->Instance->RTOR, (USART_RTOR_RTO | USART_RTOR_BLEN), tmpreg); + + /*-------------------------- USART BRR Configuration -----------------------*/ + SMARTCARD_GETCLOCKSOURCE(hsmartcard, clocksource); + tmpreg = 0U; + switch (clocksource) + { + case SMARTCARD_CLOCKSOURCE_PCLK1: + pclk = HAL_RCC_GetPCLK1Freq(); + tmpreg = (uint32_t)(((pclk / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) + + (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate); + break; + case SMARTCARD_CLOCKSOURCE_HSI: + tmpreg = (uint32_t)(((HSI_VALUE / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) + + (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate); + break; + case SMARTCARD_CLOCKSOURCE_SYSCLK: + pclk = HAL_RCC_GetSysClockFreq(); + tmpreg = (uint32_t)(((pclk / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) + + (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate); + break; + case SMARTCARD_CLOCKSOURCE_LSE: + tmpreg = (uint32_t)(((uint16_t)(LSE_VALUE / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) + + (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate); + break; + default: + ret = HAL_ERROR; + break; + } + + /* USARTDIV must be greater than or equal to 0d16 */ + if ((tmpreg >= USART_BRR_MIN) && (tmpreg <= USART_BRR_MAX)) + { + hsmartcard->Instance->BRR = (uint16_t)tmpreg; + } + else + { + ret = HAL_ERROR; + } + + /* Initialize the number of data to process during RX/TX ISR execution */ + hsmartcard->NbTxDataToProcess = 1U; + hsmartcard->NbRxDataToProcess = 1U; + + /* Clear ISR function pointers */ + hsmartcard->RxISR = NULL; + hsmartcard->TxISR = NULL; + + return ret; +} + + +/** + * @brief Configure the SMARTCARD associated USART peripheral advanced features. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Check whether the set of advanced features to configure is properly set */ + assert_param(IS_SMARTCARD_ADVFEATURE_INIT(hsmartcard->AdvancedInit.AdvFeatureInit)); + + /* if required, configure TX pin active level inversion */ + if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_TXINVERT_INIT)) + { + assert_param(IS_SMARTCARD_ADVFEATURE_TXINV(hsmartcard->AdvancedInit.TxPinLevelInvert)); + MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_TXINV, hsmartcard->AdvancedInit.TxPinLevelInvert); + } + + /* if required, configure RX pin active level inversion */ + if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_RXINVERT_INIT)) + { + assert_param(IS_SMARTCARD_ADVFEATURE_RXINV(hsmartcard->AdvancedInit.RxPinLevelInvert)); + MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_RXINV, hsmartcard->AdvancedInit.RxPinLevelInvert); + } + + /* if required, configure data inversion */ + if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_DATAINVERT_INIT)) + { + assert_param(IS_SMARTCARD_ADVFEATURE_DATAINV(hsmartcard->AdvancedInit.DataInvert)); + MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_DATAINV, hsmartcard->AdvancedInit.DataInvert); + } + + /* if required, configure RX/TX pins swap */ + if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_SWAP_INIT)) + { + assert_param(IS_SMARTCARD_ADVFEATURE_SWAP(hsmartcard->AdvancedInit.Swap)); + MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_SWAP, hsmartcard->AdvancedInit.Swap); + } + + /* if required, configure RX overrun detection disabling */ + if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_RXOVERRUNDISABLE_INIT)) + { + assert_param(IS_SMARTCARD_OVERRUN(hsmartcard->AdvancedInit.OverrunDisable)); + MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_OVRDIS, hsmartcard->AdvancedInit.OverrunDisable); + } + + /* if required, configure DMA disabling on reception error */ + if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_DMADISABLEONERROR_INIT)) + { + assert_param(IS_SMARTCARD_ADVFEATURE_DMAONRXERROR(hsmartcard->AdvancedInit.DMADisableonRxError)); + MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_DDRE, hsmartcard->AdvancedInit.DMADisableonRxError); + } + + /* if required, configure MSB first on communication line */ + if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_MSBFIRST_INIT)) + { + assert_param(IS_SMARTCARD_ADVFEATURE_MSBFIRST(hsmartcard->AdvancedInit.MSBFirst)); + MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_MSBFIRST, hsmartcard->AdvancedInit.MSBFirst); + } + +} + +/** + * @brief Check the SMARTCARD Idle State. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval HAL status + */ +static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint32_t tickstart; + + /* Initialize the SMARTCARD ErrorCode */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + /* Check if the Transmitter is enabled */ + if ((hsmartcard->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE) + { + /* Wait until TEACK flag is set */ + if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, USART_ISR_TEACK, RESET, tickstart, + SMARTCARD_TEACK_REACK_TIMEOUT) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } + /* Check if the Receiver is enabled */ + if ((hsmartcard->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) + { + /* Wait until REACK flag is set */ + if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, USART_ISR_REACK, RESET, tickstart, + SMARTCARD_TEACK_REACK_TIMEOUT) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } + + /* Initialize the SMARTCARD states */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; +} + +/** + * @brief Handle SMARTCARD Communication Timeout. It waits + * until a flag is no longer in the specified status. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param Flag Specifies the SMARTCARD flag to check. + * @param Status The actual Flag status (SET or RESET). + * @param Tickstart Tick start value + * @param Timeout Timeout duration. + * @retval HAL status + */ +static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Flag, + FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) +{ + /* Wait until flag is set */ + while ((__HAL_SMARTCARD_GET_FLAG(hsmartcard, Flag) ? SET : RESET) == Status) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) + interrupts for the interrupt process */ + CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + return HAL_TIMEOUT; + } + } + } + return HAL_OK; +} + + +/** + * @brief End ongoing Tx transfer on SMARTCARD peripheral (following error detection or Transmit completion). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Disable TXEIE, TCIE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + /* At end of Tx process, restore hsmartcard->gState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; +} + + +/** + * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion). + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + /* At end of Rx process, restore hsmartcard->RxState to Ready */ + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; +} + + +/** + * @brief DMA SMARTCARD transmit process complete callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent); + hsmartcard->TxXferCount = 0U; + + /* Disable the DMA transfer for transmit request by resetting the DMAT bit + in the SMARTCARD associated USART CR3 register */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT); + + /* Enable the SMARTCARD Transmit Complete Interrupt */ + __HAL_SMARTCARD_ENABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication); +} + +/** + * @brief DMA SMARTCARD receive process complete callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent); + hsmartcard->RxXferCount = 0U; + + /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE); + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + + /* Disable the DMA transfer for the receiver request by resetting the DMAR bit + in the SMARTCARD associated USART CR3 register */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR); + + /* At end of Rx process, restore hsmartcard->RxState to Ready */ + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Rx complete callback */ + hsmartcard->RxCpltCallback(hsmartcard); +#else + /* Call legacy weak Rx complete callback */ + HAL_SMARTCARD_RxCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ +} + +/** + * @brief DMA SMARTCARD communication error callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma) +{ + SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent); + + /* Stop SMARTCARD DMA Tx request if ongoing */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX) + { + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT)) + { + hsmartcard->TxXferCount = 0U; + SMARTCARD_EndTxTransfer(hsmartcard); + } + } + + /* Stop SMARTCARD DMA Rx request if ongoing */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_BUSY_RX) + { + if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR)) + { + hsmartcard->RxXferCount = 0U; + SMARTCARD_EndRxTransfer(hsmartcard); + } + } + + hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_DMA; +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered user error callback */ + hsmartcard->ErrorCallback(hsmartcard); +#else + /* Call legacy weak user error callback */ + HAL_SMARTCARD_ErrorCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ +} + +/** + * @brief DMA SMARTCARD communication abort callback, when initiated by HAL services on Error + * (To be called at end of DMA Abort procedure following error occurrence). + * @param hdma DMA handle. + * @retval None + */ +static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma) +{ + SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent); + hsmartcard->RxXferCount = 0U; + hsmartcard->TxXferCount = 0U; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered user error callback */ + hsmartcard->ErrorCallback(hsmartcard); +#else + /* Call legacy weak user error callback */ + HAL_SMARTCARD_ErrorCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ +} + +/** + * @brief DMA SMARTCARD Tx communication abort callback, when initiated by user + * (To be called at end of DMA Tx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Rx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +{ + SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent); + + hsmartcard->hdmatx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (hsmartcard->hdmarx != NULL) + { + if (hsmartcard->hdmarx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + hsmartcard->TxXferCount = 0U; + hsmartcard->RxXferCount = 0U; + + /* Reset errorCode */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, + SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | + SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF); + + /* Restore hsmartcard->gState and hsmartcard->RxState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + hsmartcard->AbortCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort complete callback */ + HAL_SMARTCARD_AbortCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ +} + + +/** + * @brief DMA SMARTCARD Rx communication abort callback, when initiated by user + * (To be called at end of DMA Rx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Tx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +{ + SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent); + + hsmartcard->hdmarx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (hsmartcard->hdmatx != NULL) + { + if (hsmartcard->hdmatx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + hsmartcard->TxXferCount = 0U; + hsmartcard->RxXferCount = 0U; + + /* Reset errorCode */ + hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, + SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | + SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF); + + /* Restore hsmartcard->gState and hsmartcard->RxState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + hsmartcard->AbortCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort complete callback */ + HAL_SMARTCARD_AbortCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ +} + + +/** + * @brief DMA SMARTCARD Tx communication abort callback, when initiated by user by a call to + * HAL_SMARTCARD_AbortTransmit_IT API (Abort only Tx transfer) + * (This callback is executed at end of DMA Tx Abort procedure following user abort request, + * and leads to user Tx Abort Complete callback execution). + * @param hdma DMA handle. + * @retval None + */ +static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma) +{ + SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent); + + hsmartcard->TxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF); + + /* Restore hsmartcard->gState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + hsmartcard->AbortTransmitCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ +} + +/** + * @brief DMA SMARTCARD Rx communication abort callback, when initiated by user by a call to + * HAL_SMARTCARD_AbortReceive_IT API (Abort only Rx transfer) + * (This callback is executed at end of DMA Rx Abort procedure following user abort request, + * and leads to user Rx Abort Complete callback execution). + * @param hdma DMA handle. + * @retval None + */ +static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma) +{ + SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent); + + hsmartcard->RxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, + SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF | + SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF); + + /* Restore hsmartcard->RxState to Ready */ + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + hsmartcard->AbortReceiveCpltCallback(hsmartcard); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ +} + +/** + * @brief Send an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_SMARTCARD_Transmit_IT() + * and when the FIFO mode is disabled. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +static void SMARTCARD_TxISR(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Check that a Tx process is ongoing */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX) + { + if (hsmartcard->TxXferCount == 0U) + { + /* Disable the SMARTCARD Transmit Data Register Empty Interrupt */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); + + /* Enable the SMARTCARD Transmit Complete Interrupt */ + __HAL_SMARTCARD_ENABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication); + } + else + { + hsmartcard->Instance->TDR = (uint8_t)(*hsmartcard->pTxBuffPtr & 0xFFU); + hsmartcard->pTxBuffPtr++; + hsmartcard->TxXferCount--; + } + } +} + +/** + * @brief Send an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_SMARTCARD_Transmit_IT() + * and when the FIFO mode is enabled. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +static void SMARTCARD_TxISR_FIFOEN(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint16_t nb_tx_data; + + /* Check that a Tx process is ongoing */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX) + { + for (nb_tx_data = hsmartcard->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--) + { + if (hsmartcard->TxXferCount == 0U) + { + /* Disable the SMARTCARD Transmit Data Register Empty Interrupt */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); + + /* Enable the SMARTCARD Transmit Complete Interrupt */ + __HAL_SMARTCARD_ENABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication); + } + else if (READ_BIT(hsmartcard->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U) + { + hsmartcard->Instance->TDR = (uint8_t)(*hsmartcard->pTxBuffPtr & 0xFFU); + hsmartcard->pTxBuffPtr++; + hsmartcard->TxXferCount--; + } + else + { + /* Nothing to do */ + } + } + } +} + +/** + * @brief Wrap up transmission in non-blocking mode. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +static void SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Disable the SMARTCARD Transmit Complete Interrupt */ + __HAL_SMARTCARD_DISABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication); + + /* Check if a receive process is ongoing or not. If not disable ERR IT */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY) + { + /* Disable the SMARTCARD Error Interrupt: (Frame error) */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + } + + /* Disable the Peripheral first to update mode */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX) + && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE)) + { + /* In case of TX only mode, if NACK is enabled, receiver block has been enabled + for Transmit phase. Disable this receiver block. */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RE); + } + if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX_RX) + || (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE)) + { + /* Perform a TX FIFO Flush at end of Tx phase, as all sent bytes are appearing in Rx Data register */ + __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard); + } + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE); + + /* Tx process is ended, restore hsmartcard->gState to Ready */ + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* Clear TxISR function pointer */ + hsmartcard->TxISR = NULL; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Tx complete callback */ + hsmartcard->TxCpltCallback(hsmartcard); +#else + /* Call legacy weak Tx complete callback */ + HAL_SMARTCARD_TxCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ +} + +/** + * @brief Receive an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_SMARTCARD_Receive_IT() + * and when the FIFO mode is disabled. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +static void SMARTCARD_RxISR(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Check that a Rx process is ongoing */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_BUSY_RX) + { + *hsmartcard->pRxBuffPtr = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0xFF); + hsmartcard->pRxBuffPtr++; + + hsmartcard->RxXferCount--; + if (hsmartcard->RxXferCount == 0U) + { + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + + /* Check if a transmit process is ongoing or not. If not disable ERR IT */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + } + + /* Disable the SMARTCARD Parity Error Interrupt */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE); + + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* Clear RxISR function pointer */ + hsmartcard->RxISR = NULL; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Rx complete callback */ + hsmartcard->RxCpltCallback(hsmartcard); +#else + /* Call legacy weak Rx complete callback */ + HAL_SMARTCARD_RxCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + } + else + { + /* Clear RXNE interrupt flag */ + __HAL_SMARTCARD_SEND_REQ(hsmartcard, SMARTCARD_RXDATA_FLUSH_REQUEST); + } +} + +/** + * @brief Receive an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_SMARTCARD_Receive_IT() + * and when the FIFO mode is enabled. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +static void SMARTCARD_RxISR_FIFOEN(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint16_t nb_rx_data; + uint16_t rxdatacount; + + /* Check that a Rx process is ongoing */ + if (hsmartcard->RxState == HAL_SMARTCARD_STATE_BUSY_RX) + { + for (nb_rx_data = hsmartcard->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--) + { + *hsmartcard->pRxBuffPtr = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0xFF); + hsmartcard->pRxBuffPtr++; + + hsmartcard->RxXferCount--; + if (hsmartcard->RxXferCount == 0U) + { + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + + /* Check if a transmit process is ongoing or not. If not disable ERR IT */ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE); + } + + /* Disable the SMARTCARD Parity Error Interrupt */ + CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE); + + hsmartcard->RxState = HAL_SMARTCARD_STATE_READY; + + /* Clear RxISR function pointer */ + hsmartcard->RxISR = NULL; + +#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1) + /* Call registered Rx complete callback */ + hsmartcard->RxCpltCallback(hsmartcard); +#else + /* Call legacy weak Rx complete callback */ + HAL_SMARTCARD_RxCpltCallback(hsmartcard); +#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */ + } + } + + /* When remaining number of bytes to receive is less than the RX FIFO + threshold, next incoming frames are processed as if FIFO mode was + disabled (i.e. one interrupt per received frame). + */ + rxdatacount = hsmartcard->RxXferCount; + if (((rxdatacount != 0U)) && (rxdatacount < hsmartcard->NbRxDataToProcess)) + { + /* Disable the UART RXFT interrupt*/ + CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_RXFTIE); + + /* Update the RxISR function pointer */ + hsmartcard->RxISR = SMARTCARD_RxISR; + + /* Enable the UART Data Register Not Empty interrupt */ + SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + } + } + else + { + /* Clear RXNE interrupt flag */ + __HAL_SMARTCARD_SEND_REQ(hsmartcard, SMARTCARD_RXDATA_FLUSH_REQUEST); + } +} + +/** + * @} + */ + +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smartcard_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smartcard_ex.c new file mode 100644 index 0000000..e09db20 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smartcard_ex.c @@ -0,0 +1,495 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_smartcard_ex.c + * @author MCD Application Team + * @brief SMARTCARD HAL module driver. + * This file provides extended firmware functions to manage the following + * functionalities of the SmartCard. + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================= + ##### SMARTCARD peripheral extended features ##### + ============================================================================= + [..] + The Extended SMARTCARD HAL driver can be used as follows: + + (#) After having configured the SMARTCARD basic features with HAL_SMARTCARD_Init(), + then program SMARTCARD advanced features if required (TX/RX pins swap, TimeOut, + auto-retry counter,...) in the hsmartcard AdvancedInit structure. + + (#) FIFO mode enabling/disabling and RX/TX FIFO threshold programming. + + -@- When SMARTCARD operates in FIFO mode, FIFO mode must be enabled prior + starting RX/TX transfers. Also RX/TX FIFO thresholds must be + configured prior starting RX/TX transfers. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup SMARTCARDEx SMARTCARDEx + * @brief SMARTCARD Extended HAL module driver + * @{ + */ +#ifdef HAL_SMARTCARD_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup SMARTCARDEx_Private_Constants SMARTCARD Extended Private Constants + * @{ + */ +/* UART RX FIFO depth */ +#define RX_FIFO_DEPTH 8U + +/* UART TX FIFO depth */ +#define TX_FIFO_DEPTH 8U +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void SMARTCARDEx_SetNbDataToProcess(SMARTCARD_HandleTypeDef *hsmartcard); + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SMARTCARDEx_Exported_Functions SMARTCARD Extended Exported Functions + * @{ + */ + +/** @defgroup SMARTCARDEx_Exported_Functions_Group1 Extended Peripheral Control functions + * @brief Extended control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to initialize the SMARTCARD. + (+) HAL_SMARTCARDEx_BlockLength_Config() API allows to configure the Block Length on the fly + (+) HAL_SMARTCARDEx_TimeOut_Config() API allows to configure the receiver timeout value on the fly + (+) HAL_SMARTCARDEx_EnableReceiverTimeOut() API enables the receiver timeout feature + (+) HAL_SMARTCARDEx_DisableReceiverTimeOut() API disables the receiver timeout feature + +@endverbatim + * @{ + */ + +/** @brief Update on the fly the SMARTCARD block length in RTOR register. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param BlockLength SMARTCARD block length (8-bit long at most) + * @retval None + */ +void HAL_SMARTCARDEx_BlockLength_Config(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t BlockLength) +{ + MODIFY_REG(hsmartcard->Instance->RTOR, USART_RTOR_BLEN, ((uint32_t)BlockLength << USART_RTOR_BLEN_Pos)); +} + +/** @brief Update on the fly the receiver timeout value in RTOR register. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @param TimeOutValue receiver timeout value in number of baud blocks. The timeout + * value must be less or equal to 0x0FFFFFFFF. + * @retval None + */ +void HAL_SMARTCARDEx_TimeOut_Config(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t TimeOutValue) +{ + assert_param(IS_SMARTCARD_TIMEOUT_VALUE(hsmartcard->Init.TimeOutValue)); + MODIFY_REG(hsmartcard->Instance->RTOR, USART_RTOR_RTO, TimeOutValue); +} + +/** @brief Enable the SMARTCARD receiver timeout feature. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARDEx_EnableReceiverTimeOut(SMARTCARD_HandleTypeDef *hsmartcard) +{ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; + + /* Set the USART RTOEN bit */ + SET_BIT(hsmartcard->Instance->CR2, USART_CR2_RTOEN); + + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** @brief Disable the SMARTCARD receiver timeout feature. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARDEx_DisableReceiverTimeOut(SMARTCARD_HandleTypeDef *hsmartcard) +{ + if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; + + /* Clear the USART RTOEN bit */ + CLEAR_BIT(hsmartcard->Instance->CR2, USART_CR2_RTOEN); + + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @} + */ + +/** @defgroup SMARTCARDEx_Exported_Functions_Group2 Extended Peripheral IO operation functions + * @brief SMARTCARD Transmit and Receive functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of FIFO mode related callback functions. + + (#) TX/RX Fifos Callbacks: + (++) HAL_SMARTCARDEx_RxFifoFullCallback() + (++) HAL_SMARTCARDEx_TxFifoEmptyCallback() + +@endverbatim + * @{ + */ + +/** + * @brief SMARTCARD RX Fifo full callback. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARDEx_RxFifoFullCallback(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARDEx_RxFifoFullCallback can be implemented in the user file. + */ +} + +/** + * @brief SMARTCARD TX Fifo empty callback. + * @param hsmartcard Pointer to a SMARTCARD_HandleTypeDef structure that contains + * the configuration information for the specified SMARTCARD module. + * @retval None + */ +__weak void HAL_SMARTCARDEx_TxFifoEmptyCallback(SMARTCARD_HandleTypeDef *hsmartcard) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmartcard); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMARTCARDEx_TxFifoEmptyCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup SMARTCARDEx_Exported_Functions_Group3 Extended Peripheral FIFO Control functions + * @brief SMARTCARD control functions + * +@verbatim + =============================================================================== + ##### Peripheral FIFO Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the SMARTCARD + FIFO feature. + (+) HAL_SMARTCARDEx_EnableFifoMode() API enables the FIFO mode + (+) HAL_SMARTCARDEx_DisableFifoMode() API disables the FIFO mode + (+) HAL_SMARTCARDEx_SetTxFifoThreshold() API sets the TX FIFO threshold + (+) HAL_SMARTCARDEx_SetRxFifoThreshold() API sets the RX FIFO threshold +@endverbatim + * @{ + */ + +/** + * @brief Enable the FIFO mode. + * @param hsmartcard SMARTCARD handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARDEx_EnableFifoMode(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(hsmartcard->Instance)); + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; + + /* Save actual SMARTCARD configuration */ + tmpcr1 = READ_REG(hsmartcard->Instance->CR1); + + /* Disable SMARTCARD */ + __HAL_SMARTCARD_DISABLE(hsmartcard); + + /* Enable FIFO mode */ + SET_BIT(tmpcr1, USART_CR1_FIFOEN); + hsmartcard->FifoMode = SMARTCARD_FIFOMODE_ENABLE; + + /* Restore SMARTCARD configuration */ + WRITE_REG(hsmartcard->Instance->CR1, tmpcr1); + + /* Determine the number of data to process during RX/TX ISR execution */ + SMARTCARDEx_SetNbDataToProcess(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; +} + +/** + * @brief Disable the FIFO mode. + * @param hsmartcard SMARTCARD handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARDEx_DisableFifoMode(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(hsmartcard->Instance)); + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; + + /* Save actual SMARTCARD configuration */ + tmpcr1 = READ_REG(hsmartcard->Instance->CR1); + + /* Disable SMARTCARD */ + __HAL_SMARTCARD_DISABLE(hsmartcard); + + /* Enable FIFO mode */ + CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN); + hsmartcard->FifoMode = SMARTCARD_FIFOMODE_DISABLE; + + /* Restore SMARTCARD configuration */ + WRITE_REG(hsmartcard->Instance->CR1, tmpcr1); + + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; +} + +/** + * @brief Set the TXFIFO threshold. + * @param hsmartcard SMARTCARD handle. + * @param Threshold TX FIFO threshold value + * This parameter can be one of the following values: + * @arg @ref SMARTCARD_TXFIFO_THRESHOLD_1_8 + * @arg @ref SMARTCARD_TXFIFO_THRESHOLD_1_4 + * @arg @ref SMARTCARD_TXFIFO_THRESHOLD_1_2 + * @arg @ref SMARTCARD_TXFIFO_THRESHOLD_3_4 + * @arg @ref SMARTCARD_TXFIFO_THRESHOLD_7_8 + * @arg @ref SMARTCARD_TXFIFO_THRESHOLD_8_8 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARDEx_SetTxFifoThreshold(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Threshold) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(hsmartcard->Instance)); + assert_param(IS_SMARTCARD_TXFIFO_THRESHOLD(Threshold)); + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; + + /* Save actual SMARTCARD configuration */ + tmpcr1 = READ_REG(hsmartcard->Instance->CR1); + + /* Disable SMARTCARD */ + __HAL_SMARTCARD_DISABLE(hsmartcard); + + /* Update TX threshold configuration */ + MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_TXFTCFG, Threshold); + + /* Determine the number of data to process during RX/TX ISR execution */ + SMARTCARDEx_SetNbDataToProcess(hsmartcard); + + /* Restore SMARTCARD configuration */ + MODIFY_REG(hsmartcard->Instance->CR1, USART_CR1_UE, tmpcr1); + + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; +} + +/** + * @brief Set the RXFIFO threshold. + * @param hsmartcard SMARTCARD handle. + * @param Threshold RX FIFO threshold value + * This parameter can be one of the following values: + * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_1_8 + * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_1_4 + * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_1_2 + * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_3_4 + * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_7_8 + * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_8_8 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMARTCARDEx_SetRxFifoThreshold(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Threshold) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(hsmartcard->Instance)); + assert_param(IS_SMARTCARD_RXFIFO_THRESHOLD(Threshold)); + + /* Process Locked */ + __HAL_LOCK(hsmartcard); + + hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; + + /* Save actual SMARTCARD configuration */ + tmpcr1 = READ_REG(hsmartcard->Instance->CR1); + + /* Disable SMARTCARD */ + __HAL_SMARTCARD_DISABLE(hsmartcard); + + /* Update RX threshold configuration */ + MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_RXFTCFG, Threshold); + + /* Determine the number of data to process during RX/TX ISR execution */ + SMARTCARDEx_SetNbDataToProcess(hsmartcard); + + /* Restore SMARTCARD configuration */ + MODIFY_REG(hsmartcard->Instance->CR1, USART_CR1_UE, tmpcr1); + + hsmartcard->gState = HAL_SMARTCARD_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmartcard); + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup SMARTCARDEx_Private_Functions SMARTCARD Extended Private Functions + * @{ + */ + +/** + * @brief Calculate the number of data to process in RX/TX ISR. + * @note The RX FIFO depth and the TX FIFO depth is extracted from + * the USART configuration registers. + * @param hsmartcard SMARTCARD handle. + * @retval None + */ +static void SMARTCARDEx_SetNbDataToProcess(SMARTCARD_HandleTypeDef *hsmartcard) +{ + uint8_t rx_fifo_depth; + uint8_t tx_fifo_depth; + uint8_t rx_fifo_threshold; + uint8_t tx_fifo_threshold; + /* 2 0U/1U added for MISRAC2012-Rule-18.1_b and MISRAC2012-Rule-18.1_d */ + static const uint8_t numerator[] = {1U, 1U, 1U, 3U, 7U, 1U, 0U, 0U}; + static const uint8_t denominator[] = {8U, 4U, 2U, 4U, 8U, 1U, 1U, 1U}; + + if (hsmartcard->FifoMode == SMARTCARD_FIFOMODE_DISABLE) + { + hsmartcard->NbTxDataToProcess = 1U; + hsmartcard->NbRxDataToProcess = 1U; + } + else + { + rx_fifo_depth = RX_FIFO_DEPTH; + tx_fifo_depth = TX_FIFO_DEPTH; + rx_fifo_threshold = (uint8_t)(READ_BIT(hsmartcard->Instance->CR3, USART_CR3_RXFTCFG) >> USART_CR3_RXFTCFG_Pos); + tx_fifo_threshold = (uint8_t)(READ_BIT(hsmartcard->Instance->CR3, USART_CR3_TXFTCFG) >> USART_CR3_TXFTCFG_Pos); + hsmartcard->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) / \ + (uint16_t)denominator[tx_fifo_threshold]; + hsmartcard->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) / \ + (uint16_t)denominator[rx_fifo_threshold]; + } +} + +/** + * @} + */ + +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smbus.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smbus.c new file mode 100644 index 0000000..e7d3568 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smbus.c @@ -0,0 +1,2775 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_smbus.c + * @author MCD Application Team + * @brief SMBUS HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the System Management Bus (SMBus) peripheral, + * based on I2C principles of operation : + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral State and Errors functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The SMBUS HAL driver can be used as follows: + + (#) Declare a SMBUS_HandleTypeDef handle structure, for example: + SMBUS_HandleTypeDef hsmbus; + + (#)Initialize the SMBUS low level resources by implementing the HAL_SMBUS_MspInit() API: + (##) Enable the SMBUSx interface clock + (##) SMBUS pins configuration + (+++) Enable the clock for the SMBUS GPIOs + (+++) Configure SMBUS pins as alternate function open-drain + (##) NVIC configuration if you need to use interrupt process + (+++) Configure the SMBUSx interrupt priority + (+++) Enable the NVIC SMBUS IRQ Channel + + (#) Configure the Communication Clock Timing, Bus Timeout, Own Address1, Master Addressing mode, + Dual Addressing mode, Own Address2, Own Address2 Mask, General call, Nostretch mode, + Peripheral mode and Packet Error Check mode in the hsmbus Init structure. + + (#) Initialize the SMBUS registers by calling the HAL_SMBUS_Init() API: + (++) These API's configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) + by calling the customized HAL_SMBUS_MspInit(&hsmbus) API. + + (#) To check if target device is ready for communication, use the function HAL_SMBUS_IsDeviceReady() + + (#) For SMBUS IO operations, only one mode of operations is available within this driver + + *** Interrupt mode IO operation *** + =================================== + [..] + (+) Transmit in master/host SMBUS mode an amount of data in non-blocking mode + using HAL_SMBUS_Master_Transmit_IT() + (++) At transmission end of transfer HAL_SMBUS_MasterTxCpltCallback() is executed and users can + add their own code by customization of function pointer HAL_SMBUS_MasterTxCpltCallback() + (+) Receive in master/host SMBUS mode an amount of data in non-blocking mode + using HAL_SMBUS_Master_Receive_IT() + (++) At reception end of transfer HAL_SMBUS_MasterRxCpltCallback() is executed and users can + add their own code by customization of function pointer HAL_SMBUS_MasterRxCpltCallback() + (+) Abort a master/host SMBUS process communication with Interrupt using HAL_SMBUS_Master_Abort_IT() + (++) The associated previous transfer callback is called at the end of abort process + (++) mean HAL_SMBUS_MasterTxCpltCallback() in case of previous state was master transmit + (++) mean HAL_SMBUS_MasterRxCpltCallback() in case of previous state was master receive + (+) Enable/disable the Address listen mode in slave/device or host/slave SMBUS mode + using HAL_SMBUS_EnableListen_IT() HAL_SMBUS_DisableListen_IT() + (++) When address slave/device SMBUS match, HAL_SMBUS_AddrCallback() is executed and users can + add their own code to check the Address Match Code and the transmission direction + request by master/host (Write/Read). + (++) At Listen mode end HAL_SMBUS_ListenCpltCallback() is executed and users can + add their own code by customization of function pointer HAL_SMBUS_ListenCpltCallback() + (+) Transmit in slave/device SMBUS mode an amount of data in non-blocking mode + using HAL_SMBUS_Slave_Transmit_IT() + (++) At transmission end of transfer HAL_SMBUS_SlaveTxCpltCallback() is executed and users can + add their own code by customization of function pointer HAL_SMBUS_SlaveTxCpltCallback() + (+) Receive in slave/device SMBUS mode an amount of data in non-blocking mode + using HAL_SMBUS_Slave_Receive_IT() + (++) At reception end of transfer HAL_SMBUS_SlaveRxCpltCallback() is executed and users can + add their own code by customization of function pointer HAL_SMBUS_SlaveRxCpltCallback() + (+) Enable/Disable the SMBUS alert mode using + HAL_SMBUS_EnableAlert_IT() or HAL_SMBUS_DisableAlert_IT() + (++) When SMBUS Alert is generated HAL_SMBUS_ErrorCallback() is executed and users can + add their own code by customization of function pointer HAL_SMBUS_ErrorCallback() + to check the Alert Error Code using function HAL_SMBUS_GetError() + (+) Get HAL state machine or error values using HAL_SMBUS_GetState() or HAL_SMBUS_GetError() + (+) In case of transfer Error, HAL_SMBUS_ErrorCallback() function is executed and users can + add their own code by customization of function pointer HAL_SMBUS_ErrorCallback() + to check the Error Code using function HAL_SMBUS_GetError() + + *** SMBUS HAL driver macros list *** + ================================== + [..] + Below the list of most used macros in SMBUS HAL driver. + + (+) __HAL_SMBUS_ENABLE: Enable the SMBUS peripheral + (+) __HAL_SMBUS_DISABLE: Disable the SMBUS peripheral + (+) __HAL_SMBUS_GET_FLAG: Check whether the specified SMBUS flag is set or not + (+) __HAL_SMBUS_CLEAR_FLAG: Clear the specified SMBUS pending flag + (+) __HAL_SMBUS_ENABLE_IT: Enable the specified SMBUS interrupt + (+) __HAL_SMBUS_DISABLE_IT: Disable the specified SMBUS interrupt + + *** Callback registration *** + ============================================= + [..] + The compilation flag USE_HAL_SMBUS_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + Use Functions HAL_SMBUS_RegisterCallback() or HAL_SMBUS_RegisterAddrCallback() + to register an interrupt callback. + [..] + Function HAL_SMBUS_RegisterCallback() allows to register following callbacks: + (+) MasterTxCpltCallback : callback for Master transmission end of transfer. + (+) MasterRxCpltCallback : callback for Master reception end of transfer. + (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. + (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. + (+) ListenCpltCallback : callback for end of listen mode. + (+) ErrorCallback : callback for error detection. + (+) MspInitCallback : callback for Msp Init. + (+) MspDeInitCallback : callback for Msp DeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + [..] + For specific callback AddrCallback use dedicated register callbacks : HAL_SMBUS_RegisterAddrCallback. + [..] + Use function HAL_SMBUS_UnRegisterCallback to reset a callback to the default + weak function. + HAL_SMBUS_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) MasterTxCpltCallback : callback for Master transmission end of transfer. + (+) MasterRxCpltCallback : callback for Master reception end of transfer. + (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. + (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. + (+) ListenCpltCallback : callback for end of listen mode. + (+) ErrorCallback : callback for error detection. + (+) MspInitCallback : callback for Msp Init. + (+) MspDeInitCallback : callback for Msp DeInit. + [..] + For callback AddrCallback use dedicated register callbacks : HAL_SMBUS_UnRegisterAddrCallback. + [..] + By default, after the HAL_SMBUS_Init() and when the state is HAL_I2C_STATE_RESET + all callbacks are set to the corresponding weak functions: + examples HAL_SMBUS_MasterTxCpltCallback(), HAL_SMBUS_MasterRxCpltCallback(). + Exception done for MspInit and MspDeInit functions that are + reset to the legacy weak functions in the HAL_SMBUS_Init()/ HAL_SMBUS_DeInit() only when + these callbacks are null (not registered beforehand). + If MspInit or MspDeInit are not null, the HAL_SMBUS_Init()/ HAL_SMBUS_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. + [..] + Callbacks can be registered/unregistered in HAL_I2C_STATE_READY state only. + Exception done MspInit/MspDeInit functions that can be registered/unregistered + in HAL_I2C_STATE_READY or HAL_I2C_STATE_RESET state, + thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + Then, the user first registers the MspInit/MspDeInit user callbacks + using HAL_SMBUS_RegisterCallback() before calling HAL_SMBUS_DeInit() + or HAL_SMBUS_Init() function. + [..] + When the compilation flag USE_HAL_SMBUS_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + [..] + (@) You can refer to the SMBUS HAL driver header file for more useful macros + + @endverbatim + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup SMBUS SMBUS + * @brief SMBUS HAL module driver + * @{ + */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup SMBUS_Private_Define SMBUS Private Constants + * @{ + */ +#define TIMING_CLEAR_MASK (0xF0FFFFFFUL) /*!< SMBUS TIMING clear register Mask */ +#define HAL_TIMEOUT_ADDR (10000U) /*!< 10 s */ +#define HAL_TIMEOUT_BUSY (25U) /*!< 25 ms */ +#define HAL_TIMEOUT_DIR (25U) /*!< 25 ms */ +#define HAL_TIMEOUT_RXNE (25U) /*!< 25 ms */ +#define HAL_TIMEOUT_STOPF (25U) /*!< 25 ms */ +#define HAL_TIMEOUT_TC (25U) /*!< 25 ms */ +#define HAL_TIMEOUT_TCR (25U) /*!< 25 ms */ +#define HAL_TIMEOUT_TXIS (25U) /*!< 25 ms */ +#define MAX_NBYTE_SIZE 255U +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup SMBUS_Private_Functions SMBUS Private Functions + * @{ + */ +/* Private functions to handle flags during polling transfer */ +static HAL_StatusTypeDef SMBUS_WaitOnFlagUntilTimeout(SMBUS_HandleTypeDef *hsmbus, uint32_t Flag, + FlagStatus Status, uint32_t Timeout); + +/* Private functions for SMBUS transfer IRQ handler */ +static HAL_StatusTypeDef SMBUS_Master_ISR(SMBUS_HandleTypeDef *hsmbus, uint32_t StatusFlags); +static HAL_StatusTypeDef SMBUS_Slave_ISR(SMBUS_HandleTypeDef *hsmbus, uint32_t StatusFlags); +static void SMBUS_ITErrorHandler(SMBUS_HandleTypeDef *hsmbus); + +/* Private functions to centralize the enable/disable of Interrupts */ +static void SMBUS_Enable_IRQ(SMBUS_HandleTypeDef *hsmbus, uint32_t InterruptRequest); +static void SMBUS_Disable_IRQ(SMBUS_HandleTypeDef *hsmbus, uint32_t InterruptRequest); + +/* Private function to flush TXDR register */ +static void SMBUS_Flush_TXDR(SMBUS_HandleTypeDef *hsmbus); + +/* Private function to handle start, restart or stop a transfer */ +static void SMBUS_TransferConfig(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint8_t Size, + uint32_t Mode, uint32_t Request); + +/* Private function to Convert Specific options */ +static void SMBUS_ConvertOtherXferOptions(SMBUS_HandleTypeDef *hsmbus); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup SMBUS_Exported_Functions SMBUS Exported Functions + * @{ + */ + +/** @defgroup SMBUS_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to initialize and + deinitialize the SMBUSx peripheral: + + (+) User must Implement HAL_SMBUS_MspInit() function in which he configures + all related peripherals resources (CLOCK, GPIO, IT and NVIC ). + + (+) Call the function HAL_SMBUS_Init() to configure the selected device with + the selected configuration: + (++) Clock Timing + (++) Bus Timeout + (++) Analog Filer mode + (++) Own Address 1 + (++) Addressing mode (Master, Slave) + (++) Dual Addressing mode + (++) Own Address 2 + (++) Own Address 2 Mask + (++) General call mode + (++) Nostretch mode + (++) Packet Error Check mode + (++) Peripheral mode + + + (+) Call the function HAL_SMBUS_DeInit() to restore the default configuration + of the selected SMBUSx peripheral. + + (+) Enable/Disable Analog/Digital filters with HAL_SMBUS_ConfigAnalogFilter() and + HAL_SMBUS_ConfigDigitalFilter(). + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the SMBUS according to the specified parameters + * in the SMBUS_InitTypeDef and initialize the associated handle. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_Init(SMBUS_HandleTypeDef *hsmbus) +{ + /* Check the SMBUS handle allocation */ + if (hsmbus == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance)); + assert_param(IS_SMBUS_ANALOG_FILTER(hsmbus->Init.AnalogFilter)); + assert_param(IS_SMBUS_OWN_ADDRESS1(hsmbus->Init.OwnAddress1)); + assert_param(IS_SMBUS_ADDRESSING_MODE(hsmbus->Init.AddressingMode)); + assert_param(IS_SMBUS_DUAL_ADDRESS(hsmbus->Init.DualAddressMode)); + assert_param(IS_SMBUS_OWN_ADDRESS2(hsmbus->Init.OwnAddress2)); + assert_param(IS_SMBUS_OWN_ADDRESS2_MASK(hsmbus->Init.OwnAddress2Masks)); + assert_param(IS_SMBUS_GENERAL_CALL(hsmbus->Init.GeneralCallMode)); + assert_param(IS_SMBUS_NO_STRETCH(hsmbus->Init.NoStretchMode)); + assert_param(IS_SMBUS_PEC(hsmbus->Init.PacketErrorCheckMode)); + assert_param(IS_SMBUS_PERIPHERAL_MODE(hsmbus->Init.PeripheralMode)); + + if (hsmbus->State == HAL_SMBUS_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hsmbus->Lock = HAL_UNLOCKED; + +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->MasterTxCpltCallback = HAL_SMBUS_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ + hsmbus->MasterRxCpltCallback = HAL_SMBUS_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ + hsmbus->SlaveTxCpltCallback = HAL_SMBUS_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ + hsmbus->SlaveRxCpltCallback = HAL_SMBUS_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ + hsmbus->ListenCpltCallback = HAL_SMBUS_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ + hsmbus->ErrorCallback = HAL_SMBUS_ErrorCallback; /* Legacy weak ErrorCallback */ + hsmbus->AddrCallback = HAL_SMBUS_AddrCallback; /* Legacy weak AddrCallback */ + + if (hsmbus->MspInitCallback == NULL) + { + hsmbus->MspInitCallback = HAL_SMBUS_MspInit; /* Legacy weak MspInit */ + } + + /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + hsmbus->MspInitCallback(hsmbus); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_SMBUS_MspInit(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + + hsmbus->State = HAL_SMBUS_STATE_BUSY; + + /* Disable the selected SMBUS peripheral */ + __HAL_SMBUS_DISABLE(hsmbus); + + /*---------------------------- SMBUSx TIMINGR Configuration ------------------------*/ + /* Configure SMBUSx: Frequency range */ + hsmbus->Instance->TIMINGR = hsmbus->Init.Timing & TIMING_CLEAR_MASK; + + /*---------------------------- SMBUSx TIMEOUTR Configuration ------------------------*/ + /* Configure SMBUSx: Bus Timeout */ + hsmbus->Instance->TIMEOUTR &= ~I2C_TIMEOUTR_TIMOUTEN; + hsmbus->Instance->TIMEOUTR &= ~I2C_TIMEOUTR_TEXTEN; + hsmbus->Instance->TIMEOUTR = hsmbus->Init.SMBusTimeout; + + /*---------------------------- SMBUSx OAR1 Configuration -----------------------*/ + /* Configure SMBUSx: Own Address1 and ack own address1 mode */ + hsmbus->Instance->OAR1 &= ~I2C_OAR1_OA1EN; + + if (hsmbus->Init.OwnAddress1 != 0UL) + { + if (hsmbus->Init.AddressingMode == SMBUS_ADDRESSINGMODE_7BIT) + { + hsmbus->Instance->OAR1 = (I2C_OAR1_OA1EN | hsmbus->Init.OwnAddress1); + } + else /* SMBUS_ADDRESSINGMODE_10BIT */ + { + hsmbus->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hsmbus->Init.OwnAddress1); + } + } + + /*---------------------------- SMBUSx CR2 Configuration ------------------------*/ + /* Configure SMBUSx: Addressing Master mode */ + if (hsmbus->Init.AddressingMode == SMBUS_ADDRESSINGMODE_10BIT) + { + hsmbus->Instance->CR2 = (I2C_CR2_ADD10); + } + /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process) */ + /* AUTOEND and NACK bit will be manage during Transfer process */ + hsmbus->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK); + + /*---------------------------- SMBUSx OAR2 Configuration -----------------------*/ + /* Configure SMBUSx: Dual mode and Own Address2 */ + hsmbus->Instance->OAR2 = (hsmbus->Init.DualAddressMode | hsmbus->Init.OwnAddress2 | \ + (hsmbus->Init.OwnAddress2Masks << 8U)); + + /*---------------------------- SMBUSx CR1 Configuration ------------------------*/ + /* Configure SMBUSx: Generalcall and NoStretch mode */ + hsmbus->Instance->CR1 = (hsmbus->Init.GeneralCallMode | hsmbus->Init.NoStretchMode | \ + hsmbus->Init.PacketErrorCheckMode | hsmbus->Init.PeripheralMode | \ + hsmbus->Init.AnalogFilter); + + /* Enable Slave Byte Control only in case of Packet Error Check is enabled + and SMBUS Peripheral is set in Slave mode */ + if ((hsmbus->Init.PacketErrorCheckMode == SMBUS_PEC_ENABLE) && \ + ((hsmbus->Init.PeripheralMode == SMBUS_PERIPHERAL_MODE_SMBUS_SLAVE) || \ + (hsmbus->Init.PeripheralMode == SMBUS_PERIPHERAL_MODE_SMBUS_SLAVE_ARP))) + { + hsmbus->Instance->CR1 |= I2C_CR1_SBC; + } + + /* Enable the selected SMBUS peripheral */ + __HAL_SMBUS_ENABLE(hsmbus); + + hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE; + hsmbus->PreviousState = HAL_SMBUS_STATE_READY; + hsmbus->State = HAL_SMBUS_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitialize the SMBUS peripheral. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_DeInit(SMBUS_HandleTypeDef *hsmbus) +{ + /* Check the SMBUS handle allocation */ + if (hsmbus == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance)); + + hsmbus->State = HAL_SMBUS_STATE_BUSY; + + /* Disable the SMBUS Peripheral Clock */ + __HAL_SMBUS_DISABLE(hsmbus); + +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + if (hsmbus->MspDeInitCallback == NULL) + { + hsmbus->MspDeInitCallback = HAL_SMBUS_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + hsmbus->MspDeInitCallback(hsmbus); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_SMBUS_MspDeInit(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + + hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE; + hsmbus->PreviousState = HAL_SMBUS_STATE_RESET; + hsmbus->State = HAL_SMBUS_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hsmbus); + + return HAL_OK; +} + +/** + * @brief Initialize the SMBUS MSP. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +__weak void HAL_SMBUS_MspInit(SMBUS_HandleTypeDef *hsmbus) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitialize the SMBUS MSP. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +__weak void HAL_SMBUS_MspDeInit(SMBUS_HandleTypeDef *hsmbus) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Configure Analog noise filter. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param AnalogFilter This parameter can be one of the following values: + * @arg @ref SMBUS_ANALOGFILTER_ENABLE + * @arg @ref SMBUS_ANALOGFILTER_DISABLE + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_ConfigAnalogFilter(SMBUS_HandleTypeDef *hsmbus, uint32_t AnalogFilter) +{ + /* Check the parameters */ + assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance)); + assert_param(IS_SMBUS_ANALOG_FILTER(AnalogFilter)); + + if (hsmbus->State == HAL_SMBUS_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_BUSY; + + /* Disable the selected SMBUS peripheral */ + __HAL_SMBUS_DISABLE(hsmbus); + + /* Reset ANOFF bit */ + hsmbus->Instance->CR1 &= ~(I2C_CR1_ANFOFF); + + /* Set analog filter bit*/ + hsmbus->Instance->CR1 |= AnalogFilter; + + __HAL_SMBUS_ENABLE(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Configure Digital noise filter. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param DigitalFilter Coefficient of digital noise filter between Min_Data=0x00 and Max_Data=0x0F. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_ConfigDigitalFilter(SMBUS_HandleTypeDef *hsmbus, uint32_t DigitalFilter) +{ + uint32_t tmpreg; + + /* Check the parameters */ + assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance)); + assert_param(IS_SMBUS_DIGITAL_FILTER(DigitalFilter)); + + if (hsmbus->State == HAL_SMBUS_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_BUSY; + + /* Disable the selected SMBUS peripheral */ + __HAL_SMBUS_DISABLE(hsmbus); + + /* Get the old register value */ + tmpreg = hsmbus->Instance->CR1; + + /* Reset I2C DNF bits [11:8] */ + tmpreg &= ~(I2C_CR1_DNF); + + /* Set I2Cx DNF coefficient */ + tmpreg |= DigitalFilter << I2C_CR1_DNF_Pos; + + /* Store the new register value */ + hsmbus->Instance->CR1 = tmpreg; + + __HAL_SMBUS_ENABLE(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User SMBUS Callback + * To be used instead of the weak predefined callback + * @note The HAL_SMBUS_RegisterCallback() may be called before HAL_SMBUS_Init() in + * HAL_SMBUS_STATE_RESET to register callbacks for HAL_SMBUS_MSPINIT_CB_ID and + * HAL_SMBUS_MSPDEINIT_CB_ID. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_SMBUS_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID + * @arg @ref HAL_SMBUS_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID + * @arg @ref HAL_SMBUS_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID + * @arg @ref HAL_SMBUS_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID + * @arg @ref HAL_SMBUS_LISTEN_COMPLETE_CB_ID Listen Complete callback ID + * @arg @ref HAL_SMBUS_ERROR_CB_ID Error callback ID + * @arg @ref HAL_SMBUS_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_SMBUS_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_RegisterCallback(SMBUS_HandleTypeDef *hsmbus, + HAL_SMBUS_CallbackIDTypeDef CallbackID, + pSMBUS_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + if (HAL_SMBUS_STATE_READY == hsmbus->State) + { + switch (CallbackID) + { + case HAL_SMBUS_MASTER_TX_COMPLETE_CB_ID : + hsmbus->MasterTxCpltCallback = pCallback; + break; + + case HAL_SMBUS_MASTER_RX_COMPLETE_CB_ID : + hsmbus->MasterRxCpltCallback = pCallback; + break; + + case HAL_SMBUS_SLAVE_TX_COMPLETE_CB_ID : + hsmbus->SlaveTxCpltCallback = pCallback; + break; + + case HAL_SMBUS_SLAVE_RX_COMPLETE_CB_ID : + hsmbus->SlaveRxCpltCallback = pCallback; + break; + + case HAL_SMBUS_LISTEN_COMPLETE_CB_ID : + hsmbus->ListenCpltCallback = pCallback; + break; + + case HAL_SMBUS_ERROR_CB_ID : + hsmbus->ErrorCallback = pCallback; + break; + + case HAL_SMBUS_MSPINIT_CB_ID : + hsmbus->MspInitCallback = pCallback; + break; + + case HAL_SMBUS_MSPDEINIT_CB_ID : + hsmbus->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_SMBUS_STATE_RESET == hsmbus->State) + { + switch (CallbackID) + { + case HAL_SMBUS_MSPINIT_CB_ID : + hsmbus->MspInitCallback = pCallback; + break; + + case HAL_SMBUS_MSPDEINIT_CB_ID : + hsmbus->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief Unregister an SMBUS Callback + * SMBUS callback is redirected to the weak predefined callback + * @note The HAL_SMBUS_UnRegisterCallback() may be called before HAL_SMBUS_Init() in + * HAL_SMBUS_STATE_RESET to un-register callbacks for HAL_SMBUS_MSPINIT_CB_ID and + * HAL_SMBUS_MSPDEINIT_CB_ID + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * This parameter can be one of the following values: + * @arg @ref HAL_SMBUS_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID + * @arg @ref HAL_SMBUS_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID + * @arg @ref HAL_SMBUS_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID + * @arg @ref HAL_SMBUS_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID + * @arg @ref HAL_SMBUS_LISTEN_COMPLETE_CB_ID Listen Complete callback ID + * @arg @ref HAL_SMBUS_ERROR_CB_ID Error callback ID + * @arg @ref HAL_SMBUS_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_SMBUS_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_UnRegisterCallback(SMBUS_HandleTypeDef *hsmbus, + HAL_SMBUS_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (HAL_SMBUS_STATE_READY == hsmbus->State) + { + switch (CallbackID) + { + case HAL_SMBUS_MASTER_TX_COMPLETE_CB_ID : + hsmbus->MasterTxCpltCallback = HAL_SMBUS_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ + break; + + case HAL_SMBUS_MASTER_RX_COMPLETE_CB_ID : + hsmbus->MasterRxCpltCallback = HAL_SMBUS_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ + break; + + case HAL_SMBUS_SLAVE_TX_COMPLETE_CB_ID : + hsmbus->SlaveTxCpltCallback = HAL_SMBUS_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ + break; + + case HAL_SMBUS_SLAVE_RX_COMPLETE_CB_ID : + hsmbus->SlaveRxCpltCallback = HAL_SMBUS_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ + break; + + case HAL_SMBUS_LISTEN_COMPLETE_CB_ID : + hsmbus->ListenCpltCallback = HAL_SMBUS_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ + break; + + case HAL_SMBUS_ERROR_CB_ID : + hsmbus->ErrorCallback = HAL_SMBUS_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_SMBUS_MSPINIT_CB_ID : + hsmbus->MspInitCallback = HAL_SMBUS_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_SMBUS_MSPDEINIT_CB_ID : + hsmbus->MspDeInitCallback = HAL_SMBUS_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_SMBUS_STATE_RESET == hsmbus->State) + { + switch (CallbackID) + { + case HAL_SMBUS_MSPINIT_CB_ID : + hsmbus->MspInitCallback = HAL_SMBUS_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_SMBUS_MSPDEINIT_CB_ID : + hsmbus->MspDeInitCallback = HAL_SMBUS_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief Register the Slave Address Match SMBUS Callback + * To be used instead of the weak HAL_SMBUS_AddrCallback() predefined callback + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param pCallback pointer to the Address Match Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_RegisterAddrCallback(SMBUS_HandleTypeDef *hsmbus, + pSMBUS_AddrCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + if (HAL_SMBUS_STATE_READY == hsmbus->State) + { + hsmbus->AddrCallback = pCallback; + } + else + { + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief UnRegister the Slave Address Match SMBUS Callback + * Info Ready SMBUS Callback is redirected to the weak HAL_SMBUS_AddrCallback() predefined callback + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_UnRegisterAddrCallback(SMBUS_HandleTypeDef *hsmbus) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (HAL_SMBUS_STATE_READY == hsmbus->State) + { + hsmbus->AddrCallback = HAL_SMBUS_AddrCallback; /* Legacy weak AddrCallback */ + } + else + { + /* Update the error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup SMBUS_Exported_Functions_Group2 Input and Output operation functions + * @brief Data transfers functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the SMBUS data + transfers. + + (#) Blocking mode function to check if device is ready for usage is : + (++) HAL_SMBUS_IsDeviceReady() + + (#) There is only one mode of transfer: + (++) Non-Blocking mode : The communication is performed using Interrupts. + These functions return the status of the transfer startup. + The end of the data processing will be indicated through the + dedicated SMBUS IRQ when using Interrupt mode. + + (#) Non-Blocking mode functions with Interrupt are : + (++) HAL_SMBUS_Master_Transmit_IT() + (++) HAL_SMBUS_Master_Receive_IT() + (++) HAL_SMBUS_Slave_Transmit_IT() + (++) HAL_SMBUS_Slave_Receive_IT() + (++) HAL_SMBUS_EnableListen_IT() or alias HAL_SMBUS_EnableListen_IT() + (++) HAL_SMBUS_DisableListen_IT() + (++) HAL_SMBUS_EnableAlert_IT() + (++) HAL_SMBUS_DisableAlert_IT() + + (#) A set of Transfer Complete Callbacks are provided in non-Blocking mode: + (++) HAL_SMBUS_MasterTxCpltCallback() + (++) HAL_SMBUS_MasterRxCpltCallback() + (++) HAL_SMBUS_SlaveTxCpltCallback() + (++) HAL_SMBUS_SlaveRxCpltCallback() + (++) HAL_SMBUS_AddrCallback() + (++) HAL_SMBUS_ListenCpltCallback() + (++) HAL_SMBUS_ErrorCallback() + +@endverbatim + * @{ + */ + +/** + * @brief Transmit in master/host SMBUS mode an amount of data in non-blocking mode with Interrupt. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref SMBUS_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_Master_Transmit_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, + uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + uint32_t tmp; + + /* Check the parameters */ + assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hsmbus->State == HAL_SMBUS_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_MASTER_BUSY_TX; + hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE; + /* Prepare transfer parameters */ + hsmbus->pBuffPtr = pData; + hsmbus->XferCount = Size; + hsmbus->XferOptions = XferOptions; + + /* In case of Quick command, remove autoend mode */ + /* Manage the stop generation by software */ + if (hsmbus->pBuffPtr == NULL) + { + hsmbus->XferOptions &= ~SMBUS_AUTOEND_MODE; + } + + if (Size > MAX_NBYTE_SIZE) + { + hsmbus->XferSize = MAX_NBYTE_SIZE; + } + else + { + hsmbus->XferSize = Size; + } + + /* Send Slave Address */ + /* Set NBYTES to write and reload if size > MAX_NBYTE_SIZE and generate RESTART */ + if ((hsmbus->XferSize < hsmbus->XferCount) && (hsmbus->XferSize == MAX_NBYTE_SIZE)) + { + SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, + SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE), + SMBUS_GENERATE_START_WRITE); + } + else + { + /* If transfer direction not change, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + + /* Store current volatile XferOptions, misra rule */ + tmp = hsmbus->XferOptions; + + if ((hsmbus->PreviousState == HAL_SMBUS_STATE_MASTER_BUSY_TX) && \ + (IS_SMBUS_TRANSFER_OTHER_OPTIONS_REQUEST(tmp) == 0)) + { + SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions, + SMBUS_NO_STARTSTOP); + } + /* Else transfer direction change, so generate Restart with new transfer direction */ + else + { + /* Convert OTHER_xxx XferOptions if any */ + SMBUS_ConvertOtherXferOptions(hsmbus); + + /* Handle Transfer */ + SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, + hsmbus->XferOptions, + SMBUS_GENERATE_START_WRITE); + } + + /* If PEC mode is enable, size to transmit manage by SW part should be Size-1 byte, corresponding to PEC byte */ + /* PEC byte is automatically sent by HW block, no need to manage it in Transmit process */ + if (SMBUS_GET_PEC_MODE(hsmbus) != 0UL) + { + hsmbus->XferSize--; + hsmbus->XferCount--; + } + } + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Note : The SMBUS interrupts must be enabled after unlocking current process + to avoid the risk of SMBUS interrupt handle execution before current + process unlock */ + SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_TX); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive in master/host SMBUS mode an amount of data in non-blocking mode with Interrupt. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref SMBUS_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_Master_Receive_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint8_t *pData, + uint16_t Size, uint32_t XferOptions) +{ + uint32_t tmp; + + /* Check the parameters */ + assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hsmbus->State == HAL_SMBUS_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_MASTER_BUSY_RX; + hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE; + + /* Prepare transfer parameters */ + hsmbus->pBuffPtr = pData; + hsmbus->XferCount = Size; + hsmbus->XferOptions = XferOptions; + + /* In case of Quick command, remove autoend mode */ + /* Manage the stop generation by software */ + if (hsmbus->pBuffPtr == NULL) + { + hsmbus->XferOptions &= ~SMBUS_AUTOEND_MODE; + } + + if (Size > MAX_NBYTE_SIZE) + { + hsmbus->XferSize = MAX_NBYTE_SIZE; + } + else + { + hsmbus->XferSize = Size; + } + + /* Send Slave Address */ + /* Set NBYTES to write and reload if size > MAX_NBYTE_SIZE and generate RESTART */ + if ((hsmbus->XferSize < hsmbus->XferCount) && (hsmbus->XferSize == MAX_NBYTE_SIZE)) + { + SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, + SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE), + SMBUS_GENERATE_START_READ); + } + else + { + /* If transfer direction not change, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + + /* Store current volatile XferOptions, Misra rule */ + tmp = hsmbus->XferOptions; + + if ((hsmbus->PreviousState == HAL_SMBUS_STATE_MASTER_BUSY_RX) && \ + (IS_SMBUS_TRANSFER_OTHER_OPTIONS_REQUEST(tmp) == 0)) + { + SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions, + SMBUS_NO_STARTSTOP); + } + /* Else transfer direction change, so generate Restart with new transfer direction */ + else + { + /* Convert OTHER_xxx XferOptions if any */ + SMBUS_ConvertOtherXferOptions(hsmbus); + + /* Handle Transfer */ + SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, + hsmbus->XferOptions, + SMBUS_GENERATE_START_READ); + } + } + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Note : The SMBUS interrupts must be enabled after unlocking current process + to avoid the risk of SMBUS interrupt handle execution before current + process unlock */ + SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_RX); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Abort a master/host SMBUS process communication with Interrupt. + * @note This abort can be called only if state is ready + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_Master_Abort_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress) +{ + if (hsmbus->State == HAL_SMBUS_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmbus); + + /* Keep the same state as previous */ + /* to perform as well the call of the corresponding end of transfer callback */ + if (hsmbus->PreviousState == HAL_SMBUS_STATE_MASTER_BUSY_TX) + { + hsmbus->State = HAL_SMBUS_STATE_MASTER_BUSY_TX; + } + else if (hsmbus->PreviousState == HAL_SMBUS_STATE_MASTER_BUSY_RX) + { + hsmbus->State = HAL_SMBUS_STATE_MASTER_BUSY_RX; + } + else + { + /* Wrong usage of abort function */ + /* This function should be used only in case of abort monitored by master device */ + return HAL_ERROR; + } + hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE; + + /* Set NBYTES to 1 to generate a dummy read on SMBUS peripheral */ + /* Set AUTOEND mode, this will generate a NACK then STOP condition to abort the current transfer */ + SMBUS_TransferConfig(hsmbus, DevAddress, 1, SMBUS_AUTOEND_MODE, SMBUS_NO_STARTSTOP); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Note : The SMBUS interrupts must be enabled after unlocking current process + to avoid the risk of SMBUS interrupt handle execution before current + process unlock */ + if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_TX) + { + SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_TX); + } + else if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_RX) + { + SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_RX); + } + else + { + /* Nothing to do */ + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Transmit in slave/device SMBUS mode an amount of data in non-blocking mode with Interrupt. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref SMBUS_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_Slave_Transmit_IT(SMBUS_HandleTypeDef *hsmbus, uint8_t *pData, uint16_t Size, + uint32_t XferOptions) +{ + /* Check the parameters */ + assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if ((hsmbus->State & HAL_SMBUS_STATE_LISTEN) == HAL_SMBUS_STATE_LISTEN) + { + if ((pData == NULL) || (Size == 0UL)) + { + hsmbus->ErrorCode = HAL_SMBUS_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ADDR | SMBUS_IT_TX); + + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = (HAL_SMBUS_STATE_SLAVE_BUSY_TX | HAL_SMBUS_STATE_LISTEN); + hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE; + + /* Set SBC bit to manage Acknowledge at each bit */ + hsmbus->Instance->CR1 |= I2C_CR1_SBC; + + /* Enable Address Acknowledge */ + hsmbus->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Prepare transfer parameters */ + hsmbus->pBuffPtr = pData; + hsmbus->XferCount = Size; + hsmbus->XferOptions = XferOptions; + + /* Convert OTHER_xxx XferOptions if any */ + SMBUS_ConvertOtherXferOptions(hsmbus); + + if (Size > MAX_NBYTE_SIZE) + { + hsmbus->XferSize = MAX_NBYTE_SIZE; + } + else + { + hsmbus->XferSize = Size; + } + + /* Set NBYTES to write and reload if size > MAX_NBYTE_SIZE and generate RESTART */ + if ((hsmbus->XferSize < hsmbus->XferCount) && (hsmbus->XferSize == MAX_NBYTE_SIZE)) + { + SMBUS_TransferConfig(hsmbus, 0, (uint8_t)hsmbus->XferSize, + SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE), + SMBUS_NO_STARTSTOP); + } + else + { + /* Set NBYTE to transmit */ + SMBUS_TransferConfig(hsmbus, 0, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions, + SMBUS_NO_STARTSTOP); + + /* If PEC mode is enable, size to transmit should be Size-1 byte, corresponding to PEC byte */ + /* PEC byte is automatically sent by HW block, no need to manage it in Transmit process */ + if (SMBUS_GET_PEC_MODE(hsmbus) != 0UL) + { + hsmbus->XferSize--; + hsmbus->XferCount--; + } + } + + /* Clear ADDR flag after prepare the transfer parameters */ + /* This action will generate an acknowledge to the HOST */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ADDR); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Note : The SMBUS interrupts must be enabled after unlocking current process + to avoid the risk of SMBUS interrupt handle execution before current + process unlock */ + /* REnable ADDR interrupt */ + SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_TX | SMBUS_IT_ADDR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive in slave/device SMBUS mode an amount of data in non-blocking mode with Interrupt. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref SMBUS_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_Slave_Receive_IT(SMBUS_HandleTypeDef *hsmbus, uint8_t *pData, uint16_t Size, + uint32_t XferOptions) +{ + /* Check the parameters */ + assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if ((hsmbus->State & HAL_SMBUS_STATE_LISTEN) == HAL_SMBUS_STATE_LISTEN) + { + if ((pData == NULL) || (Size == 0UL)) + { + hsmbus->ErrorCode = HAL_SMBUS_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ADDR | SMBUS_IT_RX); + + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = (HAL_SMBUS_STATE_SLAVE_BUSY_RX | HAL_SMBUS_STATE_LISTEN); + hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE; + + /* Set SBC bit to manage Acknowledge at each bit */ + hsmbus->Instance->CR1 |= I2C_CR1_SBC; + + /* Enable Address Acknowledge */ + hsmbus->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Prepare transfer parameters */ + hsmbus->pBuffPtr = pData; + hsmbus->XferSize = Size; + hsmbus->XferCount = Size; + hsmbus->XferOptions = XferOptions; + + /* Convert OTHER_xxx XferOptions if any */ + SMBUS_ConvertOtherXferOptions(hsmbus); + + /* Set NBYTE to receive */ + /* If XferSize equal "1", or XferSize equal "2" with PEC requested (mean 1 data byte + 1 PEC byte */ + /* no need to set RELOAD bit mode, a ACK will be automatically generated in that case */ + /* else need to set RELOAD bit mode to generate an automatic ACK at each byte Received */ + /* This RELOAD bit will be reset for last BYTE to be receive in SMBUS_Slave_ISR */ + if (((SMBUS_GET_PEC_MODE(hsmbus) != 0UL) && (hsmbus->XferSize == 2U)) || (hsmbus->XferSize == 1U)) + { + SMBUS_TransferConfig(hsmbus, 0, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions, + SMBUS_NO_STARTSTOP); + } + else + { + SMBUS_TransferConfig(hsmbus, 0, 1, hsmbus->XferOptions | SMBUS_RELOAD_MODE, SMBUS_NO_STARTSTOP); + } + + /* Clear ADDR flag after prepare the transfer parameters */ + /* This action will generate an acknowledge to the HOST */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ADDR); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Note : The SMBUS interrupts must be enabled after unlocking current process + to avoid the risk of SMBUS interrupt handle execution before current + process unlock */ + /* REnable ADDR interrupt */ + SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_RX | SMBUS_IT_ADDR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Enable the Address listen mode with Interrupt. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_EnableListen_IT(SMBUS_HandleTypeDef *hsmbus) +{ + hsmbus->State = HAL_SMBUS_STATE_LISTEN; + + /* Enable the Address Match interrupt */ + SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_ADDR); + + return HAL_OK; +} + +/** + * @brief Disable the Address listen mode with Interrupt. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_DisableListen_IT(SMBUS_HandleTypeDef *hsmbus) +{ + /* Disable Address listen mode only if a transfer is not ongoing */ + if (hsmbus->State == HAL_SMBUS_STATE_LISTEN) + { + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Disable the Address Match interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ADDR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Enable the SMBUS alert mode with Interrupt. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUSx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_EnableAlert_IT(SMBUS_HandleTypeDef *hsmbus) +{ + /* Enable SMBus alert */ + hsmbus->Instance->CR1 |= I2C_CR1_ALERTEN; + + /* Clear ALERT flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ALERT); + + /* Enable Alert Interrupt */ + SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_ALERT); + + return HAL_OK; +} +/** + * @brief Disable the SMBUS alert mode with Interrupt. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUSx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_DisableAlert_IT(SMBUS_HandleTypeDef *hsmbus) +{ + /* Enable SMBus alert */ + hsmbus->Instance->CR1 &= ~I2C_CR1_ALERTEN; + + /* Disable Alert Interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ALERT); + + return HAL_OK; +} + +/** + * @brief Check if target device is ready for communication. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param Trials Number of trials + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUS_IsDeviceReady(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint32_t Trials, + uint32_t Timeout) +{ + uint32_t tickstart; + + __IO uint32_t SMBUS_Trials = 0UL; + + FlagStatus tmp1; + FlagStatus tmp2; + + if (hsmbus->State == HAL_SMBUS_STATE_READY) + { + if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_BUSY) != RESET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_BUSY; + hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE; + + do + { + /* Generate Start */ + hsmbus->Instance->CR2 = SMBUS_GENERATE_START(hsmbus->Init.AddressingMode, DevAddress); + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is set or a NACK flag is set*/ + tickstart = HAL_GetTick(); + + tmp1 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_STOPF); + tmp2 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_AF); + + while ((tmp1 == RESET) && (tmp2 == RESET)) + { + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL)) + { + /* Device is ready */ + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Update SMBUS error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_HALTIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + return HAL_ERROR; + } + } + + tmp1 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_STOPF); + tmp2 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_AF); + } + + /* Check if the NACKF flag has not been set */ + if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_AF) == RESET) + { + /* Wait until STOPF flag is reset */ + if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear STOP Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF); + + /* Device is ready */ + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_OK; + } + else + { + /* Wait until STOPF flag is reset */ + if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear NACK Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF); + + /* Clear STOP Flag, auto generated with autoend*/ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF); + } + + /* Check if the maximum allowed number of trials has been reached */ + if (SMBUS_Trials == Trials) + { + /* Generate Stop */ + hsmbus->Instance->CR2 |= I2C_CR2_STOP; + + /* Wait until STOPF flag is reset */ + if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear STOP Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF); + } + + /* Increment Trials */ + SMBUS_Trials++; + } while (SMBUS_Trials < Trials); + + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Update SMBUS error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_HALTIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_ERROR; + } + else + { + return HAL_BUSY; + } +} +/** + * @} + */ + +/** @defgroup SMBUS_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks + * @{ + */ + +/** + * @brief Handle SMBUS event interrupt request. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +void HAL_SMBUS_EV_IRQHandler(SMBUS_HandleTypeDef *hsmbus) +{ + /* Use a local variable to store the current ISR flags */ + /* This action will avoid a wrong treatment due to ISR flags change during interrupt handler */ + uint32_t tmpisrvalue = READ_REG(hsmbus->Instance->ISR); + uint32_t tmpcr1value = READ_REG(hsmbus->Instance->CR1); + + /* SMBUS in mode Transmitter ---------------------------------------------------*/ + if ((SMBUS_CHECK_IT_SOURCE(tmpcr1value, (SMBUS_IT_TCI | SMBUS_IT_STOPI | + SMBUS_IT_NACKI | SMBUS_IT_TXI)) != RESET) && + ((SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TXIS) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TCR) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TC) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_STOPF) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_AF) != RESET))) + { + /* Slave mode selected */ + if ((hsmbus->State & HAL_SMBUS_STATE_SLAVE_BUSY_TX) == HAL_SMBUS_STATE_SLAVE_BUSY_TX) + { + (void)SMBUS_Slave_ISR(hsmbus, tmpisrvalue); + } + /* Master mode selected */ + else if ((hsmbus->State & HAL_SMBUS_STATE_MASTER_BUSY_TX) == HAL_SMBUS_STATE_MASTER_BUSY_TX) + { + (void)SMBUS_Master_ISR(hsmbus, tmpisrvalue); + } + else + { + /* Nothing to do */ + } + } + + /* SMBUS in mode Receiver ----------------------------------------------------*/ + if ((SMBUS_CHECK_IT_SOURCE(tmpcr1value, (SMBUS_IT_TCI | SMBUS_IT_STOPI | + SMBUS_IT_NACKI | SMBUS_IT_RXI)) != RESET) && + ((SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_RXNE) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TCR) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TC) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_STOPF) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_AF) != RESET))) + { + /* Slave mode selected */ + if ((hsmbus->State & HAL_SMBUS_STATE_SLAVE_BUSY_RX) == HAL_SMBUS_STATE_SLAVE_BUSY_RX) + { + (void)SMBUS_Slave_ISR(hsmbus, tmpisrvalue); + } + /* Master mode selected */ + else if ((hsmbus->State & HAL_SMBUS_STATE_MASTER_BUSY_RX) == HAL_SMBUS_STATE_MASTER_BUSY_RX) + { + (void)SMBUS_Master_ISR(hsmbus, tmpisrvalue); + } + else + { + /* Nothing to do */ + } + } + + /* SMBUS in mode Listener Only --------------------------------------------------*/ + if (((SMBUS_CHECK_IT_SOURCE(tmpcr1value, SMBUS_IT_ADDRI) != RESET) || + (SMBUS_CHECK_IT_SOURCE(tmpcr1value, SMBUS_IT_STOPI) != RESET) || + (SMBUS_CHECK_IT_SOURCE(tmpcr1value, SMBUS_IT_NACKI) != RESET)) && + ((SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_ADDR) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_STOPF) != RESET) || + (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_AF) != RESET))) + { + if ((hsmbus->State & HAL_SMBUS_STATE_LISTEN) == HAL_SMBUS_STATE_LISTEN) + { + (void)SMBUS_Slave_ISR(hsmbus, tmpisrvalue); + } + } +} + +/** + * @brief Handle SMBUS error interrupt request. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +void HAL_SMBUS_ER_IRQHandler(SMBUS_HandleTypeDef *hsmbus) +{ + SMBUS_ITErrorHandler(hsmbus); +} + +/** + * @brief Master Tx Transfer completed callback. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +__weak void HAL_SMBUS_MasterTxCpltCallback(SMBUS_HandleTypeDef *hsmbus) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_MasterTxCpltCallback() could be implemented in the user file + */ +} + +/** + * @brief Master Rx Transfer completed callback. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +__weak void HAL_SMBUS_MasterRxCpltCallback(SMBUS_HandleTypeDef *hsmbus) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_MasterRxCpltCallback() could be implemented in the user file + */ +} + +/** @brief Slave Tx Transfer completed callback. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +__weak void HAL_SMBUS_SlaveTxCpltCallback(SMBUS_HandleTypeDef *hsmbus) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_SlaveTxCpltCallback() could be implemented in the user file + */ +} + +/** + * @brief Slave Rx Transfer completed callback. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +__weak void HAL_SMBUS_SlaveRxCpltCallback(SMBUS_HandleTypeDef *hsmbus) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_SlaveRxCpltCallback() could be implemented in the user file + */ +} + +/** + * @brief Slave Address Match callback. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param TransferDirection Master request Transfer Direction (Write/Read) + * @param AddrMatchCode Address Match Code + * @retval None + */ +__weak void HAL_SMBUS_AddrCallback(SMBUS_HandleTypeDef *hsmbus, uint8_t TransferDirection, + uint16_t AddrMatchCode) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + UNUSED(TransferDirection); + UNUSED(AddrMatchCode); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_AddrCallback() could be implemented in the user file + */ +} + +/** + * @brief Listen Complete callback. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +__weak void HAL_SMBUS_ListenCpltCallback(SMBUS_HandleTypeDef *hsmbus) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_ListenCpltCallback() could be implemented in the user file + */ +} + +/** + * @brief SMBUS error callback. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval None + */ +__weak void HAL_SMBUS_ErrorCallback(SMBUS_HandleTypeDef *hsmbus) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hsmbus); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SMBUS_ErrorCallback() could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup SMBUS_Exported_Functions_Group3 Peripheral State and Errors functions + * @brief Peripheral State and Errors functions + * +@verbatim + =============================================================================== + ##### Peripheral State and Errors functions ##### + =============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the SMBUS handle state. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval HAL state + */ +uint32_t HAL_SMBUS_GetState(SMBUS_HandleTypeDef *hsmbus) +{ + /* Return SMBUS handle state */ + return hsmbus->State; +} + +/** + * @brief Return the SMBUS error code. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @retval SMBUS Error Code + */ +uint32_t HAL_SMBUS_GetError(SMBUS_HandleTypeDef *hsmbus) +{ + return hsmbus->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup SMBUS_Private_Functions SMBUS Private Functions + * @brief Data transfers Private functions + * @{ + */ + +/** + * @brief Interrupt Sub-Routine which handle the Interrupt Flags Master Mode. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param StatusFlags Value of Interrupt Flags. + * @retval HAL status + */ +static HAL_StatusTypeDef SMBUS_Master_ISR(SMBUS_HandleTypeDef *hsmbus, uint32_t StatusFlags) +{ + uint16_t DevAddress; + + /* Process Locked */ + __HAL_LOCK(hsmbus); + + if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_AF) != RESET) + { + /* Clear NACK Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF); + + /* Set corresponding Error Code */ + /* No need to generate STOP, it is automatically done */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_ACKF; + + /* Flush TX register */ + SMBUS_Flush_TXDR(hsmbus); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the Error callback to inform upper layer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->ErrorCallback(hsmbus); +#else + HAL_SMBUS_ErrorCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_STOPF) != RESET) + { + /* Check and treat errors if errors occurs during STOP process */ + SMBUS_ITErrorHandler(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ + if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_TX) + { + /* Disable Interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_TX); + + /* Clear STOP Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF); + + /* Clear Configuration Register 2 */ + SMBUS_RESET_CR2(hsmbus); + + /* Flush remaining data in Fifo register in case of error occurs before TXEmpty */ + /* Disable the selected SMBUS peripheral */ + __HAL_SMBUS_DISABLE(hsmbus); + + hsmbus->PreviousState = HAL_SMBUS_STATE_READY; + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Re-enable the selected SMBUS peripheral */ + __HAL_SMBUS_ENABLE(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->MasterTxCpltCallback(hsmbus); +#else + HAL_SMBUS_MasterTxCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_RX) + { + /* Store Last receive data if any */ + if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_RXNE) != RESET) + { + /* Read data from RXDR */ + *hsmbus->pBuffPtr = (uint8_t)(hsmbus->Instance->RXDR); + + /* Increment Buffer pointer */ + hsmbus->pBuffPtr++; + + if ((hsmbus->XferSize > 0U)) + { + hsmbus->XferSize--; + hsmbus->XferCount--; + } + } + + /* Disable Interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX); + + /* Clear STOP Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF); + + /* Clear Configuration Register 2 */ + SMBUS_RESET_CR2(hsmbus); + + hsmbus->PreviousState = HAL_SMBUS_STATE_READY; + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->MasterRxCpltCallback(hsmbus); +#else + HAL_SMBUS_MasterRxCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else + { + /* Nothing to do */ + } + } + else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_RXNE) != RESET) + { + /* Read data from RXDR */ + *hsmbus->pBuffPtr = (uint8_t)(hsmbus->Instance->RXDR); + + /* Increment Buffer pointer */ + hsmbus->pBuffPtr++; + + /* Increment Size counter */ + hsmbus->XferSize--; + hsmbus->XferCount--; + } + else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TXIS) != RESET) + { + /* Write data to TXDR */ + hsmbus->Instance->TXDR = *hsmbus->pBuffPtr; + + /* Increment Buffer pointer */ + hsmbus->pBuffPtr++; + + /* Increment Size counter */ + hsmbus->XferSize--; + hsmbus->XferCount--; + } + else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TCR) != RESET) + { + if ((hsmbus->XferCount != 0U) && (hsmbus->XferSize == 0U)) + { + DevAddress = (uint16_t)(hsmbus->Instance->CR2 & I2C_CR2_SADD); + + if (hsmbus->XferCount > MAX_NBYTE_SIZE) + { + SMBUS_TransferConfig(hsmbus, DevAddress, MAX_NBYTE_SIZE, + (SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE)), + SMBUS_NO_STARTSTOP); + hsmbus->XferSize = MAX_NBYTE_SIZE; + } + else + { + hsmbus->XferSize = hsmbus->XferCount; + SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions, + SMBUS_NO_STARTSTOP); + /* If PEC mode is enable, size to transmit should be Size-1 byte, corresponding to PEC byte */ + /* PEC byte is automatically sent by HW block, no need to manage it in Transmit process */ + if (SMBUS_GET_PEC_MODE(hsmbus) != 0UL) + { + hsmbus->XferSize--; + hsmbus->XferCount--; + } + } + } + else if ((hsmbus->XferCount == 0U) && (hsmbus->XferSize == 0U)) + { + /* Call TxCpltCallback() if no stop mode is set */ + if (SMBUS_GET_STOP_MODE(hsmbus) != SMBUS_AUTOEND_MODE) + { + /* Call the corresponding callback to inform upper layer of End of Transfer */ + if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_TX) + { + /* Disable Interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_TX); + hsmbus->PreviousState = hsmbus->State; + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->MasterTxCpltCallback(hsmbus); +#else + HAL_SMBUS_MasterTxCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_RX) + { + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX); + hsmbus->PreviousState = hsmbus->State; + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->MasterRxCpltCallback(hsmbus); +#else + HAL_SMBUS_MasterRxCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else + { + /* Nothing to do */ + } + } + } + else + { + /* Nothing to do */ + } + } + else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TC) != RESET) + { + if (hsmbus->XferCount == 0U) + { + /* Specific use case for Quick command */ + if (hsmbus->pBuffPtr == NULL) + { + /* Generate a Stop command */ + hsmbus->Instance->CR2 |= I2C_CR2_STOP; + } + /* Call TxCpltCallback() if no stop mode is set */ + else if (SMBUS_GET_STOP_MODE(hsmbus) != SMBUS_AUTOEND_MODE) + { + /* No Generate Stop, to permit restart mode */ + /* The stop will be done at the end of transfer, when SMBUS_AUTOEND_MODE enable */ + + /* Call the corresponding callback to inform upper layer of End of Transfer */ + if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_TX) + { + /* Disable Interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_TX); + hsmbus->PreviousState = hsmbus->State; + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->MasterTxCpltCallback(hsmbus); +#else + HAL_SMBUS_MasterTxCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_RX) + { + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX); + hsmbus->PreviousState = hsmbus->State; + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->MasterRxCpltCallback(hsmbus); +#else + HAL_SMBUS_MasterRxCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else + { + /* Nothing to do */ + } + } + else + { + /* Nothing to do */ + } + } + } + else + { + /* Nothing to do */ + } + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_OK; +} +/** + * @brief Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param StatusFlags Value of Interrupt Flags. + * @retval HAL status + */ +static HAL_StatusTypeDef SMBUS_Slave_ISR(SMBUS_HandleTypeDef *hsmbus, uint32_t StatusFlags) +{ + uint8_t TransferDirection; + uint16_t SlaveAddrCode; + + /* Process Locked */ + __HAL_LOCK(hsmbus); + + if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_AF) != RESET) + { + /* Check that SMBUS transfer finished */ + /* if yes, normal usecase, a NACK is sent by the HOST when Transfer is finished */ + /* Mean XferCount == 0*/ + /* So clear Flag NACKF only */ + if (hsmbus->XferCount == 0U) + { + /* Clear NACK Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF); + + /* Flush TX register */ + SMBUS_Flush_TXDR(hsmbus); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + } + else + { + /* if no, error usecase, a Non-Acknowledge of last Data is generated by the HOST*/ + /* Clear NACK Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF); + + /* Set HAL State to "Idle" State, mean to LISTEN state */ + /* So reset Slave Busy state */ + hsmbus->PreviousState = hsmbus->State; + hsmbus->State &= ~((uint32_t)HAL_SMBUS_STATE_SLAVE_BUSY_TX); + hsmbus->State &= ~((uint32_t)HAL_SMBUS_STATE_SLAVE_BUSY_RX); + + /* Disable RX/TX Interrupts, keep only ADDR Interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX | SMBUS_IT_TX); + + /* Set ErrorCode corresponding to a Non-Acknowledge */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_ACKF; + + /* Flush TX register */ + SMBUS_Flush_TXDR(hsmbus); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the Error callback to inform upper layer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->ErrorCallback(hsmbus); +#else + HAL_SMBUS_ErrorCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + } + else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_ADDR) != RESET) + { + TransferDirection = (uint8_t)(SMBUS_GET_DIR(hsmbus)); + SlaveAddrCode = (uint16_t)(SMBUS_GET_ADDR_MATCH(hsmbus)); + + /* Disable ADDR interrupt to prevent multiple ADDRInterrupt*/ + /* Other ADDRInterrupt will be treat in next Listen usecase */ + __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_ADDRI); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call Slave Addr callback */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->AddrCallback(hsmbus, TransferDirection, SlaveAddrCode); +#else + HAL_SMBUS_AddrCallback(hsmbus, TransferDirection, SlaveAddrCode); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else if ((SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_RXNE) != RESET) || + (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TCR) != RESET)) + { + if ((hsmbus->State & HAL_SMBUS_STATE_SLAVE_BUSY_RX) == HAL_SMBUS_STATE_SLAVE_BUSY_RX) + { + /* Read data from RXDR */ + *hsmbus->pBuffPtr = (uint8_t)(hsmbus->Instance->RXDR); + + /* Increment Buffer pointer */ + hsmbus->pBuffPtr++; + + hsmbus->XferSize--; + hsmbus->XferCount--; + + if (hsmbus->XferCount == 1U) + { + /* Receive last Byte, can be PEC byte in case of PEC BYTE enabled */ + /* or only the last Byte of Transfer */ + /* So reset the RELOAD bit mode */ + hsmbus->XferOptions &= ~SMBUS_RELOAD_MODE; + SMBUS_TransferConfig(hsmbus, 0, 1, hsmbus->XferOptions, SMBUS_NO_STARTSTOP); + } + else if (hsmbus->XferCount == 0U) + { + /* Last Byte is received, disable Interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX); + + /* Remove HAL_SMBUS_STATE_SLAVE_BUSY_RX, keep only HAL_SMBUS_STATE_LISTEN */ + hsmbus->PreviousState = hsmbus->State; + hsmbus->State &= ~((uint32_t)HAL_SMBUS_STATE_SLAVE_BUSY_RX); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->SlaveRxCpltCallback(hsmbus); +#else + HAL_SMBUS_SlaveRxCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + else + { + /* Set Reload for next Bytes */ + SMBUS_TransferConfig(hsmbus, 0, 1, + SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE), + SMBUS_NO_STARTSTOP); + + /* Ack last Byte Read */ + hsmbus->Instance->CR2 &= ~I2C_CR2_NACK; + } + } + else if ((hsmbus->State & HAL_SMBUS_STATE_SLAVE_BUSY_TX) == HAL_SMBUS_STATE_SLAVE_BUSY_TX) + { + if ((hsmbus->XferCount != 0U) && (hsmbus->XferSize == 0U)) + { + if (hsmbus->XferCount > MAX_NBYTE_SIZE) + { + SMBUS_TransferConfig(hsmbus, 0, MAX_NBYTE_SIZE, + (SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE)), + SMBUS_NO_STARTSTOP); + hsmbus->XferSize = MAX_NBYTE_SIZE; + } + else + { + hsmbus->XferSize = hsmbus->XferCount; + SMBUS_TransferConfig(hsmbus, 0, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions, + SMBUS_NO_STARTSTOP); + /* If PEC mode is enable, size to transmit should be Size-1 byte, corresponding to PEC byte */ + /* PEC byte is automatically sent by HW block, no need to manage it in Transmit process */ + if (SMBUS_GET_PEC_MODE(hsmbus) != 0UL) + { + hsmbus->XferSize--; + hsmbus->XferCount--; + } + } + } + } + else + { + /* Nothing to do */ + } + } + else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TXIS) != RESET) + { + /* Write data to TXDR only if XferCount not reach "0" */ + /* A TXIS flag can be set, during STOP treatment */ + /* Check if all Data have already been sent */ + /* If it is the case, this last write in TXDR is not sent, correspond to a dummy TXIS event */ + if (hsmbus->XferCount > 0U) + { + /* Write data to TXDR */ + hsmbus->Instance->TXDR = *hsmbus->pBuffPtr; + + /* Increment Buffer pointer */ + hsmbus->pBuffPtr++; + + hsmbus->XferCount--; + hsmbus->XferSize--; + } + + if (hsmbus->XferCount == 0U) + { + /* Last Byte is Transmitted */ + /* Remove HAL_SMBUS_STATE_SLAVE_BUSY_TX, keep only HAL_SMBUS_STATE_LISTEN */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_TX); + hsmbus->PreviousState = hsmbus->State; + hsmbus->State &= ~((uint32_t)HAL_SMBUS_STATE_SLAVE_BUSY_TX); + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->SlaveTxCpltCallback(hsmbus); +#else + HAL_SMBUS_SlaveTxCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + } + else + { + /* Nothing to do */ + } + + /* Check if STOPF is set */ + if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_STOPF) != RESET) + { + if ((hsmbus->State & HAL_SMBUS_STATE_LISTEN) == HAL_SMBUS_STATE_LISTEN) + { + /* Store Last receive data if any */ + if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_RXNE) != RESET) + { + /* Read data from RXDR */ + *hsmbus->pBuffPtr = (uint8_t)(hsmbus->Instance->RXDR); + + /* Increment Buffer pointer */ + hsmbus->pBuffPtr++; + + if ((hsmbus->XferSize > 0U)) + { + hsmbus->XferSize--; + hsmbus->XferCount--; + } + } + + /* Disable RX and TX Interrupts */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX | SMBUS_IT_TX); + + /* Disable ADDR Interrupt */ + SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ADDR); + + /* Disable Address Acknowledge */ + hsmbus->Instance->CR2 |= I2C_CR2_NACK; + + /* Clear Configuration Register 2 */ + SMBUS_RESET_CR2(hsmbus); + + /* Clear STOP Flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF); + + /* Clear ADDR flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ADDR); + + hsmbus->XferOptions = 0; + hsmbus->PreviousState = hsmbus->State; + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->ListenCpltCallback(hsmbus); +#else + HAL_SMBUS_ListenCpltCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } + } + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_OK; +} +/** + * @brief Manage the enabling of Interrupts. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param InterruptRequest Value of @ref SMBUS_Interrupt_configuration_definition. + * @retval HAL status + */ +static void SMBUS_Enable_IRQ(SMBUS_HandleTypeDef *hsmbus, uint32_t InterruptRequest) +{ + uint32_t tmpisr = 0UL; + + if ((InterruptRequest & SMBUS_IT_ALERT) == SMBUS_IT_ALERT) + { + /* Enable ERR interrupt */ + tmpisr |= SMBUS_IT_ERRI; + } + + if ((InterruptRequest & SMBUS_IT_ADDR) == SMBUS_IT_ADDR) + { + /* Enable ADDR, STOP interrupt */ + tmpisr |= SMBUS_IT_ADDRI | SMBUS_IT_STOPI | SMBUS_IT_NACKI | SMBUS_IT_ERRI; + } + + if ((InterruptRequest & SMBUS_IT_TX) == SMBUS_IT_TX) + { + /* Enable ERR, TC, STOP, NACK, RXI interrupt */ + tmpisr |= SMBUS_IT_ERRI | SMBUS_IT_TCI | SMBUS_IT_STOPI | SMBUS_IT_NACKI | SMBUS_IT_TXI; + } + + if ((InterruptRequest & SMBUS_IT_RX) == SMBUS_IT_RX) + { + /* Enable ERR, TC, STOP, NACK, TXI interrupt */ + tmpisr |= SMBUS_IT_ERRI | SMBUS_IT_TCI | SMBUS_IT_STOPI | SMBUS_IT_NACKI | SMBUS_IT_RXI; + } + + /* Enable interrupts only at the end */ + /* to avoid the risk of SMBUS interrupt handle execution before */ + /* all interrupts requested done */ + __HAL_SMBUS_ENABLE_IT(hsmbus, tmpisr); +} +/** + * @brief Manage the disabling of Interrupts. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param InterruptRequest Value of @ref SMBUS_Interrupt_configuration_definition. + * @retval HAL status + */ +static void SMBUS_Disable_IRQ(SMBUS_HandleTypeDef *hsmbus, uint32_t InterruptRequest) +{ + uint32_t tmpisr = 0UL; + uint32_t tmpstate = hsmbus->State; + + if ((tmpstate == HAL_SMBUS_STATE_READY) && ((InterruptRequest & SMBUS_IT_ALERT) == SMBUS_IT_ALERT)) + { + /* Disable ERR interrupt */ + tmpisr |= SMBUS_IT_ERRI; + } + + if ((InterruptRequest & SMBUS_IT_TX) == SMBUS_IT_TX) + { + /* Disable TC, STOP, NACK and TXI interrupt */ + tmpisr |= SMBUS_IT_TCI | SMBUS_IT_TXI; + + if ((SMBUS_GET_ALERT_ENABLED(hsmbus) == 0UL) + && ((tmpstate & HAL_SMBUS_STATE_LISTEN) != HAL_SMBUS_STATE_LISTEN)) + { + /* Disable ERR interrupt */ + tmpisr |= SMBUS_IT_ERRI; + } + + if ((tmpstate & HAL_SMBUS_STATE_LISTEN) != HAL_SMBUS_STATE_LISTEN) + { + /* Disable STOP and NACK interrupt */ + tmpisr |= SMBUS_IT_STOPI | SMBUS_IT_NACKI; + } + } + + if ((InterruptRequest & SMBUS_IT_RX) == SMBUS_IT_RX) + { + /* Disable TC, STOP, NACK and RXI interrupt */ + tmpisr |= SMBUS_IT_TCI | SMBUS_IT_RXI; + + if ((SMBUS_GET_ALERT_ENABLED(hsmbus) == 0UL) + && ((tmpstate & HAL_SMBUS_STATE_LISTEN) != HAL_SMBUS_STATE_LISTEN)) + { + /* Disable ERR interrupt */ + tmpisr |= SMBUS_IT_ERRI; + } + + if ((tmpstate & HAL_SMBUS_STATE_LISTEN) != HAL_SMBUS_STATE_LISTEN) + { + /* Disable STOP and NACK interrupt */ + tmpisr |= SMBUS_IT_STOPI | SMBUS_IT_NACKI; + } + } + + if ((InterruptRequest & SMBUS_IT_ADDR) == SMBUS_IT_ADDR) + { + /* Disable ADDR, STOP and NACK interrupt */ + tmpisr |= SMBUS_IT_ADDRI | SMBUS_IT_STOPI | SMBUS_IT_NACKI; + + if (SMBUS_GET_ALERT_ENABLED(hsmbus) == 0UL) + { + /* Disable ERR interrupt */ + tmpisr |= SMBUS_IT_ERRI; + } + } + + /* Disable interrupts only at the end */ + /* to avoid a breaking situation like at "t" time */ + /* all disable interrupts request are not done */ + __HAL_SMBUS_DISABLE_IT(hsmbus, tmpisr); +} + +/** + * @brief SMBUS interrupts error handler. + * @param hsmbus SMBUS handle. + * @retval None + */ +static void SMBUS_ITErrorHandler(SMBUS_HandleTypeDef *hsmbus) +{ + uint32_t itflags = READ_REG(hsmbus->Instance->ISR); + uint32_t itsources = READ_REG(hsmbus->Instance->CR1); + uint32_t tmpstate; + uint32_t tmperror; + + /* SMBUS Bus error interrupt occurred ------------------------------------*/ + if (((itflags & SMBUS_FLAG_BERR) == SMBUS_FLAG_BERR) && \ + ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI)) + { + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_BERR; + + /* Clear BERR flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_BERR); + } + + /* SMBUS Over-Run/Under-Run interrupt occurred ----------------------------------------*/ + if (((itflags & SMBUS_FLAG_OVR) == SMBUS_FLAG_OVR) && \ + ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI)) + { + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_OVR; + + /* Clear OVR flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_OVR); + } + + /* SMBUS Arbitration Loss error interrupt occurred ------------------------------------*/ + if (((itflags & SMBUS_FLAG_ARLO) == SMBUS_FLAG_ARLO) && \ + ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI)) + { + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_ARLO; + + /* Clear ARLO flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ARLO); + } + + /* SMBUS Timeout error interrupt occurred ---------------------------------------------*/ + if (((itflags & SMBUS_FLAG_TIMEOUT) == SMBUS_FLAG_TIMEOUT) && \ + ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI)) + { + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_BUSTIMEOUT; + + /* Clear TIMEOUT flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_TIMEOUT); + } + + /* SMBUS Alert error interrupt occurred -----------------------------------------------*/ + if (((itflags & SMBUS_FLAG_ALERT) == SMBUS_FLAG_ALERT) && \ + ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI)) + { + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_ALERT; + + /* Clear ALERT flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ALERT); + } + + /* SMBUS Packet Error Check error interrupt occurred ----------------------------------*/ + if (((itflags & SMBUS_FLAG_PECERR) == SMBUS_FLAG_PECERR) && \ + ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI)) + { + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_PECERR; + + /* Clear PEC error flag */ + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_PECERR); + } + + /* Flush TX register */ + SMBUS_Flush_TXDR(hsmbus); + + /* Store current volatile hsmbus->ErrorCode, misra rule */ + tmperror = hsmbus->ErrorCode; + + /* Call the Error Callback in case of Error detected */ + if ((tmperror != HAL_SMBUS_ERROR_NONE) && (tmperror != HAL_SMBUS_ERROR_ACKF)) + { + /* Do not Reset the HAL state in case of ALERT error */ + if ((tmperror & HAL_SMBUS_ERROR_ALERT) != HAL_SMBUS_ERROR_ALERT) + { + /* Store current volatile hsmbus->State, misra rule */ + tmpstate = hsmbus->State; + + if (((tmpstate & HAL_SMBUS_STATE_SLAVE_BUSY_TX) == HAL_SMBUS_STATE_SLAVE_BUSY_TX) + || ((tmpstate & HAL_SMBUS_STATE_SLAVE_BUSY_RX) == HAL_SMBUS_STATE_SLAVE_BUSY_RX)) + { + /* Reset only HAL_SMBUS_STATE_SLAVE_BUSY_XX */ + /* keep HAL_SMBUS_STATE_LISTEN if set */ + hsmbus->PreviousState = HAL_SMBUS_STATE_READY; + hsmbus->State = HAL_SMBUS_STATE_LISTEN; + } + } + + /* Call the Error callback to inform upper layer */ +#if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1) + hsmbus->ErrorCallback(hsmbus); +#else + HAL_SMBUS_ErrorCallback(hsmbus); +#endif /* USE_HAL_SMBUS_REGISTER_CALLBACKS */ + } +} + +/** + * @brief Handle SMBUS Communication Timeout. + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUS. + * @param Flag Specifies the SMBUS flag to check. + * @param Status The new Flag status (SET or RESET). + * @param Timeout Timeout duration + * @retval HAL status + */ +static HAL_StatusTypeDef SMBUS_WaitOnFlagUntilTimeout(SMBUS_HandleTypeDef *hsmbus, uint32_t Flag, + FlagStatus Status, uint32_t Timeout) +{ + uint32_t tickstart = HAL_GetTick(); + + /* Wait until flag is set */ + while ((FlagStatus)(__HAL_SMBUS_GET_FLAG(hsmbus, Flag)) == Status) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL)) + { + hsmbus->PreviousState = hsmbus->State; + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Update SMBUS error code */ + hsmbus->ErrorCode |= HAL_SMBUS_ERROR_HALTIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_ERROR; + } + } + } + + return HAL_OK; +} + +/** + * @brief SMBUS Tx data register flush process. + * @param hsmbus SMBUS handle. + * @retval None + */ +static void SMBUS_Flush_TXDR(SMBUS_HandleTypeDef *hsmbus) +{ + /* If a pending TXIS flag is set */ + /* Write a dummy data in TXDR to clear it */ + if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_TXIS) != RESET) + { + hsmbus->Instance->TXDR = 0x00U; + } + + /* Flush TX register if not empty */ + if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_TXE) == RESET) + { + __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_TXE); + } +} + +/** + * @brief Handle SMBUSx communication when starting transfer or during transfer (TC or TCR flag are set). + * @param hsmbus SMBUS handle. + * @param DevAddress specifies the slave address to be programmed. + * @param Size specifies the number of bytes to be programmed. + * This parameter must be a value between 0 and 255. + * @param Mode New state of the SMBUS START condition generation. + * This parameter can be one or a combination of the following values: + * @arg @ref SMBUS_RELOAD_MODE Enable Reload mode. + * @arg @ref SMBUS_AUTOEND_MODE Enable Automatic end mode. + * @arg @ref SMBUS_SOFTEND_MODE Enable Software end mode and Reload mode. + * @arg @ref SMBUS_SENDPEC_MODE Enable Packet Error Calculation mode. + * @param Request New state of the SMBUS START condition generation. + * This parameter can be one of the following values: + * @arg @ref SMBUS_NO_STARTSTOP Don't Generate stop and start condition. + * @arg @ref SMBUS_GENERATE_STOP Generate stop condition (Size should be set to 0). + * @arg @ref SMBUS_GENERATE_START_READ Generate Restart for read request. + * @arg @ref SMBUS_GENERATE_START_WRITE Generate Restart for write request. + * @retval None + */ +static void SMBUS_TransferConfig(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint8_t Size, + uint32_t Mode, uint32_t Request) +{ + /* Check the parameters */ + assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance)); + assert_param(IS_SMBUS_TRANSFER_MODE(Mode)); + assert_param(IS_SMBUS_TRANSFER_REQUEST(Request)); + + /* update CR2 register */ + MODIFY_REG(hsmbus->Instance->CR2, + ((I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | \ + (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31UL - I2C_CR2_RD_WRN_Pos))) | \ + I2C_CR2_START | I2C_CR2_STOP | I2C_CR2_PECBYTE)), \ + (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | \ + (((uint32_t)Size << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | \ + (uint32_t)Mode | (uint32_t)Request)); +} + +/** + * @brief Convert SMBUSx OTHER_xxx XferOptions to functional XferOptions. + * @param hsmbus SMBUS handle. + * @retval None + */ +static void SMBUS_ConvertOtherXferOptions(SMBUS_HandleTypeDef *hsmbus) +{ + /* if user set XferOptions to SMBUS_OTHER_FRAME_NO_PEC */ + /* it request implicitly to generate a restart condition */ + /* set XferOptions to SMBUS_FIRST_FRAME */ + if (hsmbus->XferOptions == SMBUS_OTHER_FRAME_NO_PEC) + { + hsmbus->XferOptions = SMBUS_FIRST_FRAME; + } + /* else if user set XferOptions to SMBUS_OTHER_FRAME_WITH_PEC */ + /* it request implicitly to generate a restart condition */ + /* set XferOptions to SMBUS_FIRST_FRAME | SMBUS_SENDPEC_MODE */ + else if (hsmbus->XferOptions == SMBUS_OTHER_FRAME_WITH_PEC) + { + hsmbus->XferOptions = SMBUS_FIRST_FRAME | SMBUS_SENDPEC_MODE; + } + /* else if user set XferOptions to SMBUS_OTHER_AND_LAST_FRAME_NO_PEC */ + /* it request implicitly to generate a restart condition */ + /* then generate a stop condition at the end of transfer */ + /* set XferOptions to SMBUS_FIRST_AND_LAST_FRAME_NO_PEC */ + else if (hsmbus->XferOptions == SMBUS_OTHER_AND_LAST_FRAME_NO_PEC) + { + hsmbus->XferOptions = SMBUS_FIRST_AND_LAST_FRAME_NO_PEC; + } + /* else if user set XferOptions to SMBUS_OTHER_AND_LAST_FRAME_WITH_PEC */ + /* it request implicitly to generate a restart condition */ + /* then generate a stop condition at the end of transfer */ + /* set XferOptions to SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC */ + else if (hsmbus->XferOptions == SMBUS_OTHER_AND_LAST_FRAME_WITH_PEC) + { + hsmbus->XferOptions = SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC; + } + else + { + /* Nothing to do */ + } +} +/** + * @} + */ + +#endif /* HAL_SMBUS_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smbus_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smbus_ex.c new file mode 100644 index 0000000..e9cfb39 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_smbus_ex.c @@ -0,0 +1,250 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_smbus_ex.c + * @author MCD Application Team + * @brief SMBUS Extended HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of SMBUS Extended peripheral: + * + Extended features functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### SMBUS peripheral Extended features ##### + ============================================================================== + + [..] Comparing to other previous devices, the SMBUS interface for STM32G0xx + devices contains the following additional features + + (+) Disable or enable wakeup from Stop mode(s) + (+) Disable or enable Fast Mode Plus + + ##### How to use this driver ##### + ============================================================================== + (#) Configure the enable or disable of SMBUS Wake Up Mode using the functions : + (++) HAL_SMBUSEx_EnableWakeUp() + (++) HAL_SMBUSEx_DisableWakeUp() + (#) Configure the enable or disable of fast mode plus driving capability using the functions : + (++) HAL_SMBUSEx_EnableFastModePlus() + (++) HAL_SMBUSEx_DisableFastModePlus() + @endverbatim + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup SMBUSEx SMBUSEx + * @brief SMBUS Extended HAL module driver + * @{ + */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup SMBUSEx_Exported_Functions SMBUS Extended Exported Functions + * @{ + */ + +/** @defgroup SMBUSEx_Exported_Functions_Group2 WakeUp Mode Functions + * @brief WakeUp Mode Functions + * +@verbatim + =============================================================================== + ##### WakeUp Mode Functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure Wake Up Feature + +@endverbatim + * @{ + */ + +/** + * @brief Enable SMBUS wakeup from Stop mode(s). + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUSx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUSEx_EnableWakeUp(SMBUS_HandleTypeDef *hsmbus) +{ + /* Check the parameters */ + assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hsmbus->Instance)); + + if (hsmbus->State == HAL_SMBUS_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_BUSY; + + /* Disable the selected SMBUS peripheral */ + __HAL_SMBUS_DISABLE(hsmbus); + + /* Enable wakeup from stop mode */ + hsmbus->Instance->CR1 |= I2C_CR1_WUPEN; + + __HAL_SMBUS_ENABLE(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Disable SMBUS wakeup from Stop mode(s). + * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains + * the configuration information for the specified SMBUSx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SMBUSEx_DisableWakeUp(SMBUS_HandleTypeDef *hsmbus) +{ + /* Check the parameters */ + assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hsmbus->Instance)); + + if (hsmbus->State == HAL_SMBUS_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_BUSY; + + /* Disable the selected SMBUS peripheral */ + __HAL_SMBUS_DISABLE(hsmbus); + + /* Disable wakeup from stop mode */ + hsmbus->Instance->CR1 &= ~(I2C_CR1_WUPEN); + + __HAL_SMBUS_ENABLE(hsmbus); + + hsmbus->State = HAL_SMBUS_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hsmbus); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} +/** + * @} + */ + +/** @defgroup SMBUSEx_Exported_Functions_Group3 Fast Mode Plus Functions + * @brief Fast Mode Plus Functions + * +@verbatim + =============================================================================== + ##### Fast Mode Plus Functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure Fast Mode Plus + +@endverbatim + * @{ + */ + +/** + * @brief Enable the SMBUS fast mode plus driving capability. + * @param ConfigFastModePlus Selects the pin. + * This parameter can be one of the @ref SMBUSEx_FastModePlus values + * @note For I2C1, fast mode plus driving capability can be enabled on all selected + * I2C1 pins using SMBUS_FASTMODEPLUS_I2C1 parameter or independently + * on each one of the following pins PB6, PB7, PB8 and PB9. + * @note For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability + * can be enabled only by using SMBUS_FASTMODEPLUS_I2C1 parameter. + * @note For all I2C2 pins fast mode plus driving capability can be enabled + * only by using SMBUS_FASTMODEPLUS_I2C2 parameter. + * @note For all I2C3 pins fast mode plus driving capability can be enabled + * only by using SMBUS_FASTMODEPLUS_I2C3 parameter. + * @retval None + */ +void HAL_SMBUSEx_EnableFastModePlus(uint32_t ConfigFastModePlus) +{ + /* Check the parameter */ + assert_param(IS_SMBUS_FASTMODEPLUS(ConfigFastModePlus)); + + /* Enable SYSCFG clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + /* Enable fast mode plus driving capability for selected pin */ + SET_BIT(SYSCFG->CFGR1, (uint32_t)ConfigFastModePlus); +} + +/** + * @brief Disable the SMBUS fast mode plus driving capability. + * @param ConfigFastModePlus Selects the pin. + * This parameter can be one of the @ref SMBUSEx_FastModePlus values + * @note For I2C1, fast mode plus driving capability can be disabled on all selected + * I2C1 pins using SMBUS_FASTMODEPLUS_I2C1 parameter or independently + * on each one of the following pins PB6, PB7, PB8 and PB9. + * @note For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability + * can be disabled only by using SMBUS_FASTMODEPLUS_I2C1 parameter. + * @note For all I2C2 pins fast mode plus driving capability can be disabled + * only by using SMBUS_FASTMODEPLUS_I2C2 parameter. + * @note For all I2C3 pins fast mode plus driving capability can be disabled + * only by using SMBUS_FASTMODEPLUS_I2C3 parameter. + * @retval None + */ +void HAL_SMBUSEx_DisableFastModePlus(uint32_t ConfigFastModePlus) +{ + /* Check the parameter */ + assert_param(IS_SMBUS_FASTMODEPLUS(ConfigFastModePlus)); + + /* Enable SYSCFG clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + /* Disable fast mode plus driving capability for selected pin */ + CLEAR_BIT(SYSCFG->CFGR1, (uint32_t)ConfigFastModePlus); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_SMBUS_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c new file mode 100644 index 0000000..1e12df3 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c @@ -0,0 +1,4382 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_spi.c + * @author MCD Application Team + * @brief SPI HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Serial Peripheral Interface (SPI) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State functions + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The SPI HAL driver can be used as follows: + + (#) Declare a SPI_HandleTypeDef handle structure, for example: + SPI_HandleTypeDef hspi; + + (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API: + (##) Enable the SPIx interface clock + (##) SPI pins configuration + (+++) Enable the clock for the SPI GPIOs + (+++) Configure these SPI pins as alternate function push-pull + (##) NVIC configuration if you need to use interrupt process + (+++) Configure the SPIx interrupt priority + (+++) Enable the NVIC SPI IRQ handle + (##) DMA Configuration if you need to use DMA process + (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel + (+++) Enable the DMAx clock + (+++) Configure the DMA handle parameters + (+++) Configure the DMA Tx or Rx Stream/Channel + (+++) Associate the initialized hdma_tx(or _rx) handle to the hspi DMA Tx or Rx handle + (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel + + (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS + management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure. + + (#) Initialize the SPI registers by calling the HAL_SPI_Init() API: + (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) + by calling the customized HAL_SPI_MspInit() API. + [..] + Circular mode restriction: + (#) The DMA circular mode cannot be used when the SPI is configured in these modes: + (##) Master 2Lines RxOnly + (##) Master 1Line Rx + (#) The CRC feature is not managed when the DMA circular mode is enabled + (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs + the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks + [..] + Master Receive mode restriction: + (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or + bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI + does not initiate a new transfer the following procedure has to be respected: + (##) HAL_SPI_DeInit() + (##) HAL_SPI_Init() + [..] + Callback registration: + + (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U + allows the user to configure dynamically the driver callbacks. + Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback. + + Function HAL_SPI_RegisterCallback() allows to register following callbacks: + (++) TxCpltCallback : SPI Tx Completed callback + (++) RxCpltCallback : SPI Rx Completed callback + (++) TxRxCpltCallback : SPI TxRx Completed callback + (++) TxHalfCpltCallback : SPI Tx Half Completed callback + (++) RxHalfCpltCallback : SPI Rx Half Completed callback + (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback + (++) ErrorCallback : SPI Error callback + (++) AbortCpltCallback : SPI Abort callback + (++) MspInitCallback : SPI Msp Init callback + (++) MspDeInitCallback : SPI Msp DeInit callback + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + + (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default + weak function. + HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (++) TxCpltCallback : SPI Tx Completed callback + (++) RxCpltCallback : SPI Rx Completed callback + (++) TxRxCpltCallback : SPI TxRx Completed callback + (++) TxHalfCpltCallback : SPI Tx Half Completed callback + (++) RxHalfCpltCallback : SPI Rx Half Completed callback + (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback + (++) ErrorCallback : SPI Error callback + (++) AbortCpltCallback : SPI Abort callback + (++) MspInitCallback : SPI Msp Init callback + (++) MspDeInitCallback : SPI Msp DeInit callback + + [..] + By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET + all callbacks are set to the corresponding weak functions: + examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback(). + Exception done for MspInit and MspDeInit functions that are + reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when + these callbacks are null (not registered beforehand). + If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. + + [..] + Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only. + Exception done MspInit/MspDeInit functions that can be registered/unregistered + in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state, + thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + Then, the user first registers the MspInit/MspDeInit user callbacks + using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit() + or HAL_SPI_Init() function. + + [..] + When the compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registering feature is not available + and weak (surcharged) callbacks are used. + + [..] + Using the HAL it is not possible to reach all supported SPI frequency with the different SPI Modes, + the following table resume the max SPI frequency reached with data size 8bits/16bits, + according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance. + + @endverbatim + + Additional table : + + DataSize = SPI_DATASIZE_8BIT: + +----------------------------------------------------------------------------------------------+ + | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | + | Process | Transfer mode |---------------------|----------------------|----------------------| + | | | Master | Slave | Master | Slave | Master | Slave | + |==============================================================================================| + | T | Polling | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | / | Interrupt | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA | + | R |----------------|----------|----------|-----------|----------|-----------|----------| + | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | R | Interrupt | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/4 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/16 | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/8 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/8 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/16 | + +----------------------------------------------------------------------------------------------+ + + DataSize = SPI_DATASIZE_16BIT: + +----------------------------------------------------------------------------------------------+ + | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | + | Process | Transfer mode |---------------------|----------------------|----------------------| + | | | Master | Slave | Master | Slave | Master | Slave | + |==============================================================================================| + | T | Polling | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | / | Interrupt | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA | + | R |----------------|----------|----------|-----------|----------|-----------|----------| + | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | R | Interrupt | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/4 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/16 | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/8 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/8 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/16 | + +----------------------------------------------------------------------------------------------+ + @note The max SPI frequency depend on SPI data size (4bits, 5bits,..., 8bits,...15bits, 16bits), + SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). + @note + (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA() + (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() + (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() + + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup SPI SPI + * @brief SPI HAL module driver + * @{ + */ +#ifdef HAL_SPI_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup SPI_Private_Constants SPI Private Constants + * @{ + */ +#define SPI_DEFAULT_TIMEOUT 100U +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup SPI_Private_Functions SPI Private Functions + * @{ + */ +static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAError(DMA_HandleTypeDef *hdma); +static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma); +static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma); +static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, + uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State, + uint32_t Timeout, uint32_t Tickstart); +static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi); +#if (USE_SPI_CRC != 0U) +static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); +static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); +#endif /* USE_SPI_CRC */ +static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi); +static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SPI_Exported_Functions SPI Exported Functions + * @{ + */ + +/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to initialize and + de-initialize the SPIx peripheral: + + (+) User must implement HAL_SPI_MspInit() function in which he configures + all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). + + (+) Call the function HAL_SPI_Init() to configure the selected device with + the selected configuration: + (++) Mode + (++) Direction + (++) Data Size + (++) Clock Polarity and Phase + (++) NSS Management + (++) BaudRate Prescaler + (++) FirstBit + (++) TIMode + (++) CRC Calculation + (++) CRC Polynomial if CRC enabled + (++) CRC Length, used only with Data8 and Data16 + (++) FIFO reception threshold + + (+) Call the function HAL_SPI_DeInit() to restore the default configuration + of the selected SPIx peripheral. + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the SPI according to the specified parameters + * in the SPI_InitTypeDef and initialize the associated handle. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) +{ + uint32_t frxth; + + /* Check the SPI handle allocation */ + if (hspi == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); + assert_param(IS_SPI_MODE(hspi->Init.Mode)); + assert_param(IS_SPI_DIRECTION(hspi->Init.Direction)); + assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); + assert_param(IS_SPI_NSS(hspi->Init.NSS)); + assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode)); + assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); + assert_param(IS_SPI_TIMODE(hspi->Init.TIMode)); + if (hspi->Init.TIMode == SPI_TIMODE_DISABLE) + { + assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity)); + assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); + + if (hspi->Init.Mode == SPI_MODE_MASTER) + { + assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + } + else + { + /* Baudrate prescaler not use in Motoraola Slave mode. force to default value */ + hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + } + } + else + { + assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + + /* Force polarity and phase to TI protocaol requirements */ + hspi->Init.CLKPolarity = SPI_POLARITY_LOW; + hspi->Init.CLKPhase = SPI_PHASE_1EDGE; + } +#if (USE_SPI_CRC != 0U) + assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation)); + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial)); + assert_param(IS_SPI_CRC_LENGTH(hspi->Init.CRCLength)); + } +#else + hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; +#endif /* USE_SPI_CRC */ + + if (hspi->State == HAL_SPI_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hspi->Lock = HAL_UNLOCKED; + +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + /* Init the SPI Callback settings */ + hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ + hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ + hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ + hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ + hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ + hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + + if (hspi->MspInitCallback == NULL) + { + hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ + } + + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + hspi->MspInitCallback(hspi); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + HAL_SPI_MspInit(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + + hspi->State = HAL_SPI_STATE_BUSY; + + /* Disable the selected SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Align by default the rs fifo threshold on the data size */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + frxth = SPI_RXFIFO_THRESHOLD_HF; + } + else + { + frxth = SPI_RXFIFO_THRESHOLD_QF; + } + + /* CRC calculation is valid only for 16Bit and 8 Bit */ + if ((hspi->Init.DataSize != SPI_DATASIZE_16BIT) && (hspi->Init.DataSize != SPI_DATASIZE_8BIT)) + { + /* CRC must be disabled */ + hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + } + + /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ + /* Configure : SPI Mode, Communication Mode, Clock polarity and phase, NSS management, + Communication speed, First bit and CRC calculation state */ + WRITE_REG(hspi->Instance->CR1, ((hspi->Init.Mode & (SPI_CR1_MSTR | SPI_CR1_SSI)) | + (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) | + (hspi->Init.CLKPolarity & SPI_CR1_CPOL) | + (hspi->Init.CLKPhase & SPI_CR1_CPHA) | + (hspi->Init.NSS & SPI_CR1_SSM) | + (hspi->Init.BaudRatePrescaler & SPI_CR1_BR_Msk) | + (hspi->Init.FirstBit & SPI_CR1_LSBFIRST) | + (hspi->Init.CRCCalculation & SPI_CR1_CRCEN))); +#if (USE_SPI_CRC != 0U) + /*---------------------------- SPIx CRCL Configuration -------------------*/ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Align the CRC Length on the data size */ + if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE) + { + /* CRC Length aligned on the data size : value set by default */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + hspi->Init.CRCLength = SPI_CRC_LENGTH_16BIT; + } + else + { + hspi->Init.CRCLength = SPI_CRC_LENGTH_8BIT; + } + } + + /* Configure : CRC Length */ + if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCL); + } + } +#endif /* USE_SPI_CRC */ + + /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */ + WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | + (hspi->Init.TIMode & SPI_CR2_FRF) | + (hspi->Init.NSSPMode & SPI_CR2_NSSP) | + (hspi->Init.DataSize & SPI_CR2_DS_Msk) | + (frxth & SPI_CR2_FRXTH))); + +#if (USE_SPI_CRC != 0U) + /*---------------------------- SPIx CRCPOLY Configuration ------------------*/ + /* Configure : CRC Polynomial */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + WRITE_REG(hspi->Instance->CRCPR, (hspi->Init.CRCPolynomial & SPI_CRCPR_CRCPOLY_Msk)); + } +#endif /* USE_SPI_CRC */ + +#if defined(SPI_I2SCFGR_I2SMOD) + /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */ + CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD); +#endif /* SPI_I2SCFGR_I2SMOD */ + + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->State = HAL_SPI_STATE_READY; + + return HAL_OK; +} + +/** + * @brief De-Initialize the SPI peripheral. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi) +{ + /* Check the SPI handle allocation */ + if (hspi == NULL) + { + return HAL_ERROR; + } + + /* Check SPI Instance parameter */ + assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); + + hspi->State = HAL_SPI_STATE_BUSY; + + /* Disable the SPI Peripheral Clock */ + __HAL_SPI_DISABLE(hspi); + +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + if (hspi->MspDeInitCallback == NULL) + { + hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + hspi->MspDeInitCallback(hspi); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + HAL_SPI_MspDeInit(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->State = HAL_SPI_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hspi); + + return HAL_OK; +} + +/** + * @brief Initialize the SPI MSP. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_MspInit should be implemented in the user file + */ +} + +/** + * @brief De-Initialize the SPI MSP. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_MspDeInit should be implemented in the user file + */ +} + +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +/** + * @brief Register a User SPI Callback + * To be used instead of the weak predefined callback + * @param hspi Pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI. + * @param CallbackID ID of the callback to be registered + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, + pSPI_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hspi); + + if (HAL_SPI_STATE_READY == hspi->State) + { + switch (CallbackID) + { + case HAL_SPI_TX_COMPLETE_CB_ID : + hspi->TxCpltCallback = pCallback; + break; + + case HAL_SPI_RX_COMPLETE_CB_ID : + hspi->RxCpltCallback = pCallback; + break; + + case HAL_SPI_TX_RX_COMPLETE_CB_ID : + hspi->TxRxCpltCallback = pCallback; + break; + + case HAL_SPI_TX_HALF_COMPLETE_CB_ID : + hspi->TxHalfCpltCallback = pCallback; + break; + + case HAL_SPI_RX_HALF_COMPLETE_CB_ID : + hspi->RxHalfCpltCallback = pCallback; + break; + + case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : + hspi->TxRxHalfCpltCallback = pCallback; + break; + + case HAL_SPI_ERROR_CB_ID : + hspi->ErrorCallback = pCallback; + break; + + case HAL_SPI_ABORT_CB_ID : + hspi->AbortCpltCallback = pCallback; + break; + + case HAL_SPI_MSPINIT_CB_ID : + hspi->MspInitCallback = pCallback; + break; + + case HAL_SPI_MSPDEINIT_CB_ID : + hspi->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_SPI_STATE_RESET == hspi->State) + { + switch (CallbackID) + { + case HAL_SPI_MSPINIT_CB_ID : + hspi->MspInitCallback = pCallback; + break; + + case HAL_SPI_MSPDEINIT_CB_ID : + hspi->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hspi); + return status; +} + +/** + * @brief Unregister an SPI Callback + * SPI callback is redirected to the weak predefined callback + * @param hspi Pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI. + * @param CallbackID ID of the callback to be unregistered + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hspi); + + if (HAL_SPI_STATE_READY == hspi->State) + { + switch (CallbackID) + { + case HAL_SPI_TX_COMPLETE_CB_ID : + hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ + break; + + case HAL_SPI_RX_COMPLETE_CB_ID : + hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ + break; + + case HAL_SPI_TX_RX_COMPLETE_CB_ID : + hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ + break; + + case HAL_SPI_TX_HALF_COMPLETE_CB_ID : + hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + break; + + case HAL_SPI_RX_HALF_COMPLETE_CB_ID : + hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + break; + + case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : + hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ + break; + + case HAL_SPI_ERROR_CB_ID : + hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_SPI_ABORT_CB_ID : + hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + break; + + case HAL_SPI_MSPINIT_CB_ID : + hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_SPI_MSPDEINIT_CB_ID : + hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_SPI_STATE_RESET == hspi->State) + { + switch (CallbackID) + { + case HAL_SPI_MSPINIT_CB_ID : + hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_SPI_MSPDEINIT_CB_ID : + hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hspi); + return status; +} +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @defgroup SPI_Exported_Functions_Group2 IO operation functions + * @brief Data transfers functions + * +@verbatim + ============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the SPI + data transfers. + + [..] The SPI supports master and slave mode : + + (#) There are two modes of transfer: + (++) Blocking mode: The communication is performed in polling mode. + The HAL status of all data processing is returned by the same function + after finishing transfer. + (++) No-Blocking mode: The communication is performed using Interrupts + or DMA, These APIs return the HAL status. + The end of the data processing will be indicated through the + dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when + using DMA mode. + The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks + will be executed respectively at the end of the transmit or Receive process + The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected + + (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) + exist for 1Line (simplex) and 2Lines (full duplex) modes. + +@endverbatim + * @{ + */ + +/** + * @brief Transmit an amount of data in blocking mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer + * @param Size amount of data to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint32_t tickstart; + HAL_StatusTypeDef errorcode = HAL_OK; + uint16_t initial_TxXferCount; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + initial_TxXferCount = Size; + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (uint8_t *)pData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + + /*Init field not used in handle to zero */ + hspi->pRxBuffPtr = (uint8_t *)NULL; + hspi->RxXferSize = 0U; + hspi->RxXferCount = 0U; + hspi->TxISR = NULL; + hspi->RxISR = NULL; + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_TX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Transmit data in 16 Bit mode */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + } + /* Transmit data in 16 Bit mode */ + while (hspi->TxXferCount > 0U) + { + /* Wait until TXE flag is set to send data */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + } + /* Transmit data in 8 Bit mode */ + else + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint8_t); + hspi->TxXferCount--; + } + while (hspi->TxXferCount > 0U) + { + /* Wait until TXE flag is set to send data */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) + { + *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint8_t); + hspi->TxXferCount--; + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + } +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + } + + /* Clear overrun flag in 2 Lines communication mode because received is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + errorcode = HAL_ERROR; + } + +error: + hspi->State = HAL_SPI_STATE_READY; + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Receive an amount of data in blocking mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer + * @param Size amount of data to be received + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + uint32_t tickstart; + HAL_StatusTypeDef errorcode = HAL_OK; + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES)) + { + hspi->State = HAL_SPI_STATE_BUSY_RX; + /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ + return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout); + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_RX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)pData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /*Init field not used in handle to zero */ + hspi->pTxBuffPtr = (uint8_t *)NULL; + hspi->TxXferSize = 0U; + hspi->TxXferCount = 0U; + hspi->RxISR = NULL; + hspi->TxISR = NULL; + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + /* this is done to handle the CRCNEXT before the latest data */ + hspi->RxXferCount--; + } +#endif /* USE_SPI_CRC */ + + /* Set the Rx Fifo threshold */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set RX Fifo threshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set RX Fifo threshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + + /* Configure communication direction: 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_RX(hspi); + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Receive data in 8 Bit mode */ + if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT) + { + /* Transfer loop */ + while (hspi->RxXferCount > 0U) + { + /* Check the RXNE flag */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) + { + /* read the received data */ + (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; + hspi->pRxBuffPtr += sizeof(uint8_t); + hspi->RxXferCount--; + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + } + else + { + /* Transfer loop */ + while (hspi->RxXferCount > 0U) + { + /* Check the RXNE flag */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount--; + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + } + +#if (USE_SPI_CRC != 0U) + /* Handle the CRC Transmission */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* freeze the CRC before the latest data */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + + /* Read the latest data */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + { + /* the latest data has not been received */ + errorcode = HAL_TIMEOUT; + goto error; + } + + /* Receive last data in 16 Bit mode */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + } + /* Receive last data in 8 Bit mode */ + else + { + (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; + } + + /* Wait the CRC data */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + errorcode = HAL_TIMEOUT; + goto error; + } + + /* Read CRC to Flush DR and RXNE flag */ + if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) + { + /* Read 16bit CRC */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } + else + { + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)) + { + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + errorcode = HAL_TIMEOUT; + goto error; + } + /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + } + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + } + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + } +#endif /* USE_SPI_CRC */ + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + errorcode = HAL_ERROR; + } + +error : + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Transmit and Receive an amount of data in blocking mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pTxData pointer to transmission data buffer + * @param pRxData pointer to reception data buffer + * @param Size amount of data to be sent and received + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, + uint32_t Timeout) +{ + uint16_t initial_TxXferCount; + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; + uint32_t spi_cr1; + uint32_t spi_cr2; + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + + /* Variable used to alternate Rx and Tx during transfer */ + uint32_t txallowed = 1U; + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* Init temporary variables */ + tmp_state = hspi->State; + tmp_mode = hspi->Init.Mode; + initial_TxXferCount = Size; +#if (USE_SPI_CRC != 0U) + spi_cr1 = READ_REG(hspi->Instance->CR1); + spi_cr2 = READ_REG(hspi->Instance->CR2); +#endif /* USE_SPI_CRC */ + + if (!((tmp_state == HAL_SPI_STATE_READY) || \ + ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ + if (hspi->State != HAL_SPI_STATE_BUSY_RX) + { + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + } + + /* Set the transaction information */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)pRxData; + hspi->RxXferCount = Size; + hspi->RxXferSize = Size; + hspi->pTxBuffPtr = (uint8_t *)pTxData; + hspi->TxXferCount = Size; + hspi->TxXferSize = Size; + + /*Init field not used in handle to zero */ + hspi->RxISR = NULL; + hspi->TxISR = NULL; + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Set the Rx Fifo threshold */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set fiforxthreshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set fiforxthreshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Transmit and Receive data in 16 Bit mode */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + } + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + { + /* Check TXE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + /* Next Data is a reception (Rx). Tx not allowed */ + txallowed = 0U; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */ + if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM); + } + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + } + + /* Check RXNE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount--; + /* Next Data is a Transmission (Tx). Tx is allowed */ + txallowed = 1U; + } + if (((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + /* Transmit and Receive data in 8 Bit mode */ + else + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint8_t); + hspi->TxXferCount--; + } + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + { + /* Check TXE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) + { + *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxXferCount--; + /* Next Data is a reception (Rx). Tx not allowed */ + txallowed = 0U; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */ + if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM); + } + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + } + + /* Wait until RXNE flag is reset */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) + { + (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; + hspi->pRxBuffPtr++; + hspi->RxXferCount--; + /* Next Data is a Transmission (Tx). Tx is allowed */ + txallowed = 1U; + } + if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + +#if (USE_SPI_CRC != 0U) + /* Read CRC from DR to close CRC calculation process */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Wait until TXE flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + errorcode = HAL_TIMEOUT; + goto error; + } + /* Read CRC */ + if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) + { + /* Read 16bit CRC */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } + else + { + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) + { + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + errorcode = HAL_TIMEOUT; + goto error; + } + /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + } + } + + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + /* Clear CRC Flag */ + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + + errorcode = HAL_ERROR; + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) + { + errorcode = HAL_ERROR; + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + } + +error : + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Transmit an amount of data in non-blocking mode with Interrupt. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (uint8_t *)pData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + + /* Init field not used in handle to zero */ + hspi->pRxBuffPtr = (uint8_t *)NULL; + hspi->RxXferSize = 0U; + hspi->RxXferCount = 0U; + hspi->RxISR = NULL; + + /* Set the function for IT treatment */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + hspi->TxISR = SPI_TxISR_16BIT; + } + else + { + hspi->TxISR = SPI_TxISR_8BIT; + } + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_TX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Enable TXE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); + + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + +error : + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Receive an amount of data in non-blocking mode with Interrupt. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) + { + hspi->State = HAL_SPI_STATE_BUSY_RX; + /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ + return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size); + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_RX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)pData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /* Init field not used in handle to zero */ + hspi->pTxBuffPtr = (uint8_t *)NULL; + hspi->TxXferSize = 0U; + hspi->TxXferCount = 0U; + hspi->TxISR = NULL; + + /* Check the data size to adapt Rx threshold and the set the function for IT treatment */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set RX Fifo threshold according the reception data length: 16 bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + hspi->RxISR = SPI_RxISR_16BIT; + } + else + { + /* Set RX Fifo threshold according the reception data length: 8 bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + hspi->RxISR = SPI_RxISR_8BIT; + } + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_RX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->CRCSize = 1U; + if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)) + { + hspi->CRCSize = 2U; + } + SPI_RESET_CRC(hspi); + } + else + { + hspi->CRCSize = 0U; + } +#endif /* USE_SPI_CRC */ + + /* Enable TXE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + /* Note : The SPI must be enabled after unlocking current process + to avoid the risk of SPI interrupt handle execution before current + process unlock */ + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + +error : + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pTxData pointer to transmission data buffer + * @param pRxData pointer to reception data buffer + * @param Size amount of data to be sent and received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) +{ + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Process locked */ + __HAL_LOCK(hspi); + + /* Init temporary variables */ + tmp_state = hspi->State; + tmp_mode = hspi->Init.Mode; + + if (!((tmp_state == HAL_SPI_STATE_READY) || \ + ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ + if (hspi->State != HAL_SPI_STATE_BUSY_RX) + { + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + } + + /* Set the transaction information */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (uint8_t *)pTxData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + hspi->pRxBuffPtr = (uint8_t *)pRxData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /* Set the function for IT treatment */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + hspi->RxISR = SPI_2linesRxISR_16BIT; + hspi->TxISR = SPI_2linesTxISR_16BIT; + } + else + { + hspi->RxISR = SPI_2linesRxISR_8BIT; + hspi->TxISR = SPI_2linesTxISR_8BIT; + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->CRCSize = 1U; + if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)) + { + hspi->CRCSize = 2U; + } + SPI_RESET_CRC(hspi); + } + else + { + hspi->CRCSize = 0U; + } +#endif /* USE_SPI_CRC */ + + /* Check if packing mode is enabled and if there is more than 2 data to receive */ + if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (Size >= 2U)) + { + /* Set RX Fifo threshold according the reception data length: 16 bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set RX Fifo threshold according the reception data length: 8 bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + + /* Enable TXE, RXNE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + +error : + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Transmit an amount of data in non-blocking mode with DMA. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check tx dma handle */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (uint8_t *)pData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + + /* Init field not used in handle to zero */ + hspi->pRxBuffPtr = (uint8_t *)NULL; + hspi->TxISR = NULL; + hspi->RxISR = NULL; + hspi->RxXferSize = 0U; + hspi->RxXferCount = 0U; + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_TX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Set the SPI TxDMA Half transfer complete callback */ + hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt; + + /* Set the SPI TxDMA transfer complete callback */ + hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; + + /* Set the DMA error callback */ + hspi->hdmatx->XferErrorCallback = SPI_DMAError; + + /* Set the DMA AbortCpltCallback */ + hspi->hdmatx->XferAbortCallback = NULL; + + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + /* Packing mode is enabled only if the DMA setting is HALWORD */ + if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)) + { + /* Check the even/odd of the data size + crc if enabled */ + if ((hspi->TxXferCount & 0x1U) == 0U) + { + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + hspi->TxXferCount = (hspi->TxXferCount >> 1U); + } + else + { + SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U; + } + } + + /* Enable the Tx DMA Stream/Channel */ + if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, + hspi->TxXferCount)) + { + /* Update SPI error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + errorcode = HAL_ERROR; + + hspi->State = HAL_SPI_STATE_READY; + goto error; + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Enable the SPI Error Interrupt Bit */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); + + /* Enable Tx DMA Request */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + +error : + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Receive an amount of data in non-blocking mode with DMA. + * @note In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer + * @note When the CRC feature is enabled the pData Length must be Size + 1. + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check rx dma handle */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); + + if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) + { + hspi->State = HAL_SPI_STATE_BUSY_RX; + + /* Check tx dma handle */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); + + /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ + return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size); + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_RX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)pData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /*Init field not used in handle to zero */ + hspi->RxISR = NULL; + hspi->TxISR = NULL; + hspi->TxXferSize = 0U; + hspi->TxXferCount = 0U; + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_RX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set RX Fifo threshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set RX Fifo threshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + + if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + /* Set RX Fifo threshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + + if ((hspi->RxXferCount & 0x1U) == 0x0U) + { + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + hspi->RxXferCount = hspi->RxXferCount >> 1U; + } + else + { + SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; + } + } + } + + /* Set the SPI RxDMA Half transfer complete callback */ + hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; + + /* Set the SPI Rx DMA transfer complete callback */ + hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; + + /* Set the DMA error callback */ + hspi->hdmarx->XferErrorCallback = SPI_DMAError; + + /* Set the DMA AbortCpltCallback */ + hspi->hdmarx->XferAbortCallback = NULL; + + /* Enable the Rx DMA Stream/Channel */ + if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, + hspi->RxXferCount)) + { + /* Update SPI error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + errorcode = HAL_ERROR; + + hspi->State = HAL_SPI_STATE_READY; + goto error; + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Enable the SPI Error Interrupt Bit */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); + + /* Enable Rx DMA Request */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + +error: + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Transmit and Receive an amount of data in non-blocking mode with DMA. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pTxData pointer to transmission data buffer + * @param pRxData pointer to reception data buffer + * @note When the CRC feature is enabled the pRxData Length must be Size + 1 + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size) +{ + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check rx & tx dma handles */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Process locked */ + __HAL_LOCK(hspi); + + /* Init temporary variables */ + tmp_state = hspi->State; + tmp_mode = hspi->Init.Mode; + + if (!((tmp_state == HAL_SPI_STATE_READY) || + ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ + if (hspi->State != HAL_SPI_STATE_BUSY_RX) + { + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + } + + /* Set the transaction information */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (uint8_t *)pTxData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + hspi->pRxBuffPtr = (uint8_t *)pRxData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /* Init field not used in handle to zero */ + hspi->RxISR = NULL; + hspi->TxISR = NULL; + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Reset the threshold bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX | SPI_CR2_LDMARX); + + /* The packing mode management is enabled by the DMA settings according the spi data size */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set fiforxthreshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set RX Fifo threshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + + if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + if ((hspi->TxXferSize & 0x1U) == 0x0U) + { + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + hspi->TxXferCount = hspi->TxXferCount >> 1U; + } + else + { + SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U; + } + } + + if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + /* Set RX Fifo threshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + + if ((hspi->RxXferCount & 0x1U) == 0x0U) + { + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + hspi->RxXferCount = hspi->RxXferCount >> 1U; + } + else + { + SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; + } + } + } + + /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */ + if (hspi->State == HAL_SPI_STATE_BUSY_RX) + { + /* Set the SPI Rx DMA Half transfer complete callback */ + hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; + hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; + } + else + { + /* Set the SPI Tx/Rx DMA Half transfer complete callback */ + hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt; + hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; + } + + /* Set the DMA error callback */ + hspi->hdmarx->XferErrorCallback = SPI_DMAError; + + /* Set the DMA AbortCpltCallback */ + hspi->hdmarx->XferAbortCallback = NULL; + + /* Enable the Rx DMA Stream/Channel */ + if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, + hspi->RxXferCount)) + { + /* Update SPI error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + errorcode = HAL_ERROR; + + hspi->State = HAL_SPI_STATE_READY; + goto error; + } + + /* Enable Rx DMA Request */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + + /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing + is performed in DMA reception complete callback */ + hspi->hdmatx->XferHalfCpltCallback = NULL; + hspi->hdmatx->XferCpltCallback = NULL; + hspi->hdmatx->XferErrorCallback = NULL; + hspi->hdmatx->XferAbortCallback = NULL; + + /* Enable the Tx DMA Stream/Channel */ + if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, + hspi->TxXferCount)) + { + /* Update SPI error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + errorcode = HAL_ERROR; + + hspi->State = HAL_SPI_STATE_READY; + goto error; + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + /* Enable the SPI Error Interrupt Bit */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); + + /* Enable Tx DMA Request */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + +error : + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @brief Abort ongoing transfer (blocking mode). + * @param hspi SPI handle. + * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), + * started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SPI Interrupts (depending of transfer direction) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi) +{ + HAL_StatusTypeDef errorcode; + __IO uint32_t count; + __IO uint32_t resetcount; + + /* Initialized local variable */ + errorcode = HAL_OK; + resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + count = resetcount; + + /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); + + /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) + { + hspi->TxISR = SPI_AbortTx_ISR; + /* Wait HAL_SPI_STATE_ABORT state */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (hspi->State != HAL_SPI_STATE_ABORT); + /* Reset Timeout Counter */ + count = resetcount; + } + + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + { + hspi->RxISR = SPI_AbortRx_ISR; + /* Wait HAL_SPI_STATE_ABORT state */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (hspi->State != HAL_SPI_STATE_ABORT); + /* Reset Timeout Counter */ + count = resetcount; + } + + /* Disable the SPI DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) + { + /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */ + if (hspi->hdmatx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ + hspi->hdmatx->XferAbortCallback = NULL; + + /* Abort DMA Tx Handle linked to SPI Peripheral */ + if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN)); + + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + } + } + + /* Disable the SPI DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + { + /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */ + if (hspi->hdmarx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ + hspi->hdmarx->XferAbortCallback = NULL; + + /* Abort DMA Rx Handle linked to SPI Peripheral */ + if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable Rx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN)); + } + } + /* Reset Tx and Rx transfer counters */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Check error during Abort procedure */ + if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) + { + /* return HAL_Error in case of error during Abort procedure */ + errorcode = HAL_ERROR; + } + else + { + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + } + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->state to ready */ + hspi->State = HAL_SPI_STATE_READY; + + return errorcode; +} + +/** + * @brief Abort ongoing transfer (Interrupt mode). + * @param hspi SPI handle. + * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), + * started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SPI Interrupts (depending of transfer direction) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi) +{ + HAL_StatusTypeDef errorcode; + uint32_t abortcplt ; + __IO uint32_t count; + __IO uint32_t resetcount; + + /* Initialized local variable */ + errorcode = HAL_OK; + abortcplt = 1U; + resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + count = resetcount; + + /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); + + /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) + { + hspi->TxISR = SPI_AbortTx_ISR; + /* Wait HAL_SPI_STATE_ABORT state */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (hspi->State != HAL_SPI_STATE_ABORT); + /* Reset Timeout Counter */ + count = resetcount; + } + + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + { + hspi->RxISR = SPI_AbortRx_ISR; + /* Wait HAL_SPI_STATE_ABORT state */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (hspi->State != HAL_SPI_STATE_ABORT); + /* Reset Timeout Counter */ + count = resetcount; + } + + /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised + before any call to DMA Abort functions */ + /* DMA Tx Handle is valid */ + if (hspi->hdmatx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) + { + hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback; + } + else + { + hspi->hdmatx->XferAbortCallback = NULL; + } + } + /* DMA Rx Handle is valid */ + if (hspi->hdmarx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + { + hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback; + } + else + { + hspi->hdmarx->XferAbortCallback = NULL; + } + } + + /* Disable the SPI DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) + { + /* Abort the SPI DMA Tx Stream/Channel */ + if (hspi->hdmatx != NULL) + { + /* Abort DMA Tx Handle linked to SPI Peripheral */ + if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK) + { + hspi->hdmatx->XferAbortCallback = NULL; + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + else + { + abortcplt = 0U; + } + } + } + /* Disable the SPI DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + { + /* Abort the SPI DMA Rx Stream/Channel */ + if (hspi->hdmarx != NULL) + { + /* Abort DMA Rx Handle linked to SPI Peripheral */ + if (HAL_DMA_Abort_IT(hspi->hdmarx) != HAL_OK) + { + hspi->hdmarx->XferAbortCallback = NULL; + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + else + { + abortcplt = 0U; + } + } + } + + if (abortcplt == 1U) + { + /* Reset Tx and Rx transfer counters */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Check error during Abort procedure */ + if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) + { + /* return HAL_Error in case of error during Abort procedure */ + errorcode = HAL_ERROR; + } + else + { + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + } + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->AbortCpltCallback(hspi); +#else + HAL_SPI_AbortCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + + return errorcode; +} + +/** + * @brief Pause the DMA Transfer. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi) +{ + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Disable the SPI DMA Tx & Rx requests */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + return HAL_OK; +} + +/** + * @brief Resume the DMA Transfer. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi) +{ + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Enable the SPI DMA Tx & Rx requests */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + return HAL_OK; +} + +/** + * @brief Stop the DMA Transfer. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + /* The Lock is not implemented on this API to allow the user application + to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback(): + when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated + and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback() + */ + + /* Abort the SPI DMA tx Stream/Channel */ + if (hspi->hdmatx != NULL) + { + if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + errorcode = HAL_ERROR; + } + } + /* Abort the SPI DMA rx Stream/Channel */ + if (hspi->hdmarx != NULL) + { + if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + errorcode = HAL_ERROR; + } + } + + /* Disable the SPI DMA Tx & Rx requests */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + hspi->State = HAL_SPI_STATE_READY; + return errorcode; +} + +/** + * @brief Handle SPI interrupt request. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval None + */ +void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi) +{ + uint32_t itsource = hspi->Instance->CR2; + uint32_t itflag = hspi->Instance->SR; + + /* SPI in mode Receiver ----------------------------------------------------*/ + if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) && + (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXNE) != RESET)) + { + hspi->RxISR(hspi); + return; + } + + /* SPI in mode Transmitter -------------------------------------------------*/ + if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) != RESET)) + { + hspi->TxISR(hspi); + return; + } + + /* SPI in Error Treatment --------------------------------------------------*/ + if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) + || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_ERR) != RESET)) + { + /* SPI Overrun error interrupt occurred ----------------------------------*/ + if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) + { + if (hspi->State != HAL_SPI_STATE_BUSY_TX) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR); + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + else + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + return; + } + } + + /* SPI Mode Fault error interrupt occurred -------------------------------*/ + if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF); + __HAL_SPI_CLEAR_MODFFLAG(hspi); + } + + /* SPI Frame error interrupt occurred ------------------------------------*/ + if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE); + __HAL_SPI_CLEAR_FREFLAG(hspi); + } + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Disable all interrupts */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR); + + hspi->State = HAL_SPI_STATE_READY; + /* Disable the SPI DMA requests if enabled */ + if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN))) + { + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN)); + + /* Abort the SPI DMA Rx channel */ + if (hspi->hdmarx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ + hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError; + if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + } + } + /* Abort the SPI DMA Tx channel */ + if (hspi->hdmatx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ + hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError; + if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + } + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + } + return; + } +} + +/** + * @brief Tx Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_TxCpltCallback should be implemented in the user file + */ +} + +/** + * @brief Rx Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_RxCpltCallback should be implemented in the user file + */ +} + +/** + * @brief Tx and Rx Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_TxRxCpltCallback should be implemented in the user file + */ +} + +/** + * @brief Tx Half Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_TxHalfCpltCallback should be implemented in the user file + */ +} + +/** + * @brief Rx Half Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file + */ +} + +/** + * @brief Tx and Rx Half Transfer callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file + */ +} + +/** + * @brief SPI error callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_ErrorCallback should be implemented in the user file + */ + /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes + and user can use HAL_SPI_GetError() API to check the latest error occurred + */ +} + +/** + * @brief SPI Abort Complete callback. + * @param hspi SPI handle. + * @retval None + */ +__weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_AbortCpltCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions + * @brief SPI control functions + * +@verbatim + =============================================================================== + ##### Peripheral State and Errors functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the SPI. + (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral + (+) HAL_SPI_GetError() check in run-time Errors occurring during communication +@endverbatim + * @{ + */ + +/** + * @brief Return the SPI handle state. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval SPI state + */ +HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi) +{ + /* Return SPI handle state */ + return hspi->State; +} + +/** + * @brief Return the SPI error code. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval SPI error code in bitmap format + */ +uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi) +{ + /* Return SPI ErrorCode */ + return hspi->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup SPI_Private_Functions + * @brief Private functions + * @{ + */ + +/** + * @brief DMA SPI transmit process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + uint32_t tickstart; + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC) + { + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + /* Clear overrun flag in 2 Lines communication mode because received data is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + + hspi->TxXferCount = 0U; + hspi->State = HAL_SPI_STATE_READY; + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + return; + } + } + /* Call user Tx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxCpltCallback(hspi); +#else + HAL_SPI_TxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI receive process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC) + { + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); + +#if (USE_SPI_CRC != 0U) + /* CRC handling */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Wait until RXNE flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + } + /* Read CRC */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Read 16bit CRC */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } + else + { + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) + { + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + } + /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + } + } +#endif /* USE_SPI_CRC */ + + /* Check if we are in Master RX 2 line mode */ + if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) + { + /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + } + else + { + /* Normal case */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + } + + /* Check the end of the transaction */ + if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + } + + hspi->RxXferCount = 0U; + hspi->State = HAL_SPI_STATE_READY; + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + } +#endif /* USE_SPI_CRC */ + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + return; + } + } + /* Call user Rx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->RxCpltCallback(hspi); +#else + HAL_SPI_RxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI transmit receive process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC) + { + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); + +#if (USE_SPI_CRC != 0U) + /* CRC handling */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_8BIT)) + { + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_QUARTER_FULL, SPI_DEFAULT_TIMEOUT, + tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + } + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + else + { + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_HALF_FULL, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + } + /* Read CRC to Flush DR and RXNE flag */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + /* Disable Rx/Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + + hspi->TxXferCount = 0U; + hspi->RxXferCount = 0U; + hspi->State = HAL_SPI_STATE_READY; + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + } +#endif /* USE_SPI_CRC */ + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + return; + } + } + /* Call user TxRx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxRxCpltCallback(hspi); +#else + HAL_SPI_TxRxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI half transmit process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + + /* Call user Tx half complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxHalfCpltCallback(hspi); +#else + HAL_SPI_TxHalfCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI half receive process complete callback + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + + /* Call user Rx half complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->RxHalfCpltCallback(hspi); +#else + HAL_SPI_RxHalfCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI half transmit receive process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + + /* Call user TxRx half complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxRxHalfCpltCallback(hspi); +#else + HAL_SPI_TxRxHalfCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI communication error callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAError(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + + /* Stop the disable DMA transfer on SPI side */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + hspi->State = HAL_SPI_STATE_READY; + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI communication abort callback, when initiated by HAL services on Error + * (To be called at end of DMA Abort procedure following error occurrence). + * @param hdma DMA handle. + * @retval None + */ +static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI Tx communication abort callback, when initiated by user + * (To be called at end of DMA Tx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Rx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + + hspi->hdmatx->XferAbortCallback = NULL; + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Check if an Abort process is still ongoing */ + if (hspi->hdmarx != NULL) + { + if (hspi->hdmarx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Check no error during Abort procedure */ + if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) + { + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + } + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->AbortCpltCallback(hspi); +#else + HAL_SPI_AbortCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI Rx communication abort callback, when initiated by user + * (To be called at end of DMA Rx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Tx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */ + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + hspi->hdmarx->XferAbortCallback = NULL; + + /* Disable Rx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Check if an Abort process is still ongoing */ + if (hspi->hdmatx != NULL) + { + if (hspi->hdmatx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Check no error during Abort procedure */ + if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) + { + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + } + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->AbortCpltCallback(hspi); +#else + HAL_SPI_AbortCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Receive data in packing mode */ + if (hspi->RxXferCount > 1U) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount -= 2U; + if (hspi->RxXferCount == 1U) + { + /* Set RX Fifo threshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + } + /* Receive data in 8 Bit mode */ + else + { + *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR); + hspi->pRxBuffPtr++; + hspi->RxXferCount--; + } + + /* Check end of the reception */ + if (hspi->RxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + hspi->RxISR = SPI_2linesRxISR_8BITCRC; + return; + } +#endif /* USE_SPI_CRC */ + + /* Disable RXNE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + if (hspi->TxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} + +#if (USE_SPI_CRC != 0U) +/** + * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) +{ + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; + + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC to flush Data Register */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + hspi->CRCSize--; + + /* Check end of the reception */ + if (hspi->CRCSize == 0U) + { + /* Disable RXNE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + if (hspi->TxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} +#endif /* USE_SPI_CRC */ + +/** + * @brief Tx 8-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Transmit data in packing Bit mode */ + if (hspi->TxXferCount >= 2U) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount -= 2U; + } + /* Transmit data in 8 Bit mode */ + else + { + *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxXferCount--; + } + + /* Check the end of the transmission */ + if (hspi->TxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Set CRC Next Bit to send CRC */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + /* Disable TXE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); + return; + } +#endif /* USE_SPI_CRC */ + + /* Disable TXE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); + + if (hspi->RxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} + +/** + * @brief Rx 16-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Receive data in 16 Bit mode */ + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount--; + + if (hspi->RxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->RxISR = SPI_2linesRxISR_16BITCRC; + return; + } +#endif /* USE_SPI_CRC */ + + /* Disable RXNE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); + + if (hspi->TxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} + +#if (USE_SPI_CRC != 0U) +/** + * @brief Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) +{ + __IO uint32_t tmpreg = 0U; + + /* Read 16bit CRC to flush Data Register */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + + /* Disable RXNE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); + + SPI_CloseRxTx_ISR(hspi); +} +#endif /* USE_SPI_CRC */ + +/** + * @brief Tx 16-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Transmit data in 16 Bit mode */ + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + + /* Enable CRC Transmission */ + if (hspi->TxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Set CRC Next Bit to send CRC */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + /* Disable TXE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); + return; + } +#endif /* USE_SPI_CRC */ + + /* Disable TXE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); + + if (hspi->RxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} + +#if (USE_SPI_CRC != 0U) +/** + * @brief Manage the CRC 8-bit receive in Interrupt context. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) +{ + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; + + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC to flush Data Register */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + hspi->CRCSize--; + + if (hspi->CRCSize == 0U) + { + SPI_CloseRx_ISR(hspi); + } +} +#endif /* USE_SPI_CRC */ + +/** + * @brief Manage the receive 8-bit in Interrupt context. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +{ + *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR); + hspi->pRxBuffPtr++; + hspi->RxXferCount--; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + + if (hspi->RxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->RxISR = SPI_RxISR_8BITCRC; + return; + } +#endif /* USE_SPI_CRC */ + SPI_CloseRx_ISR(hspi); + } +} + +#if (USE_SPI_CRC != 0U) +/** + * @brief Manage the CRC 16-bit receive in Interrupt context. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) +{ + __IO uint32_t tmpreg = 0U; + + /* Read 16bit CRC to flush Data Register */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + + /* Disable RXNE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + SPI_CloseRx_ISR(hspi); +} +#endif /* USE_SPI_CRC */ + +/** + * @brief Manage the 16-bit receive in Interrupt context. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +{ + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount--; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + + if (hspi->RxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->RxISR = SPI_RxISR_16BITCRC; + return; + } +#endif /* USE_SPI_CRC */ + SPI_CloseRx_ISR(hspi); + } +} + +/** + * @brief Handle the data 8-bit transmit in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +{ + *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxXferCount--; + + if (hspi->TxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Enable CRC Transmission */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + SPI_CloseTx_ISR(hspi); + } +} + +/** + * @brief Handle the data 16-bit transmit in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Transmit data in 16 Bit mode */ + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + + if (hspi->TxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Enable CRC Transmission */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + SPI_CloseTx_ISR(hspi); + } +} + +/** + * @brief Handle SPI Communication Timeout. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param Flag SPI flag to check + * @param State flag state to check + * @param Timeout Timeout duration + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, + uint32_t Timeout, uint32_t Tickstart) +{ + __IO uint32_t count; + uint32_t tmp_timeout; + uint32_t tmp_tickstart; + + /* Adjust Timeout value in case of end of transfer */ + tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); + tmp_tickstart = HAL_GetTick(); + + /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ + count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U); + + while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State) + { + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) + { + /* Disable the SPI and reset the CRC: the CRC value should be cleared + on both master and slave sides in order to resynchronize the master + and slave for their respective CRC calculation */ + + /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + { + /* Disable SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + } + + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } + + hspi->State = HAL_SPI_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + return HAL_TIMEOUT; + } + /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */ + if (count == 0U) + { + tmp_timeout = 0U; + } + count--; + } + } + + return HAL_OK; +} + +/** + * @brief Handle SPI FIFO Communication Timeout. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param Fifo Fifo to check + * @param State Fifo state to check + * @param Timeout Timeout duration + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State, + uint32_t Timeout, uint32_t Tickstart) +{ + __IO uint32_t count; + uint32_t tmp_timeout; + uint32_t tmp_tickstart; + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; + + /* Adjust Timeout value in case of end of transfer */ + tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); + tmp_tickstart = HAL_GetTick(); + + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + + /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ + count = tmp_timeout * ((SystemCoreClock * 35U) >> 20U); + + while ((hspi->Instance->SR & Fifo) != State) + { + if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY)) + { + /* Flush Data Register by a blank read */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) + { + /* Disable the SPI and reset the CRC: the CRC value should be cleared + on both master and slave sides in order to resynchronize the master + and slave for their respective CRC calculation */ + + /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + { + /* Disable SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + } + + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } + + hspi->State = HAL_SPI_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + return HAL_TIMEOUT; + } + /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */ + if (count == 0U) + { + tmp_timeout = 0U; + } + count--; + } + } + + return HAL_OK; +} + +/** + * @brief Handle the check of the RX transaction complete. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param Timeout Timeout duration + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) +{ + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + { + /* Disable SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + } + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + { + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Handle the check of the RXTX or TX transaction complete. + * @param hspi SPI handle + * @param Timeout Timeout duration + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) +{ + /* Control if the TX fifo is empty */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FTLVL, SPI_FTLVL_EMPTY, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + + /* Control if the RX fifo is empty */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + + return HAL_OK; +} + +/** + * @brief Handle the end of the RXTX transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi) +{ + uint32_t tickstart; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) + { + hspi->State = HAL_SPI_STATE_READY; + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { +#endif /* USE_SPI_CRC */ + if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) + { + if (hspi->State == HAL_SPI_STATE_BUSY_RX) + { + hspi->State = HAL_SPI_STATE_READY; + /* Call user Rx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->RxCpltCallback(hspi); +#else + HAL_SPI_RxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { + hspi->State = HAL_SPI_STATE_READY; + /* Call user TxRx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxRxCpltCallback(hspi); +#else + HAL_SPI_TxRxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + } + else + { + hspi->State = HAL_SPI_STATE_READY; + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } +#if (USE_SPI_CRC != 0U) + } +#endif /* USE_SPI_CRC */ +} + +/** + * @brief Handle the end of the RX transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi) +{ + /* Disable RXNE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + /* Check the end of the transaction */ + if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + hspi->State = HAL_SPI_STATE_READY; + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { +#endif /* USE_SPI_CRC */ + if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) + { + /* Call user Rx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->RxCpltCallback(hspi); +#else + HAL_SPI_RxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } +#if (USE_SPI_CRC != 0U) + } +#endif /* USE_SPI_CRC */ +} + +/** + * @brief Handle the end of the TX transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) +{ + uint32_t tickstart; + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* Disable TXE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + /* Clear overrun flag in 2 Lines communication mode because received is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + + hspi->State = HAL_SPI_STATE_READY; + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { + /* Call user Rx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxCpltCallback(hspi); +#else + HAL_SPI_TxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } +} + +/** + * @brief Handle abort a Rx transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi) +{ + __IO uint32_t count; + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Disable RXNEIE interrupt */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE)); + + /* Check RXNEIE is disabled */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)); + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + hspi->State = HAL_SPI_STATE_ABORT; +} + +/** + * @brief Handle abort a Tx or Rx/Tx transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi) +{ + __IO uint32_t count; + + count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Disable TXEIE interrupt */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE)); + + /* Check TXEIE is disabled */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)); + + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Check case of Full-Duplex Mode and disable directly RXNEIE interrupt */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + { + /* Disable RXNEIE interrupt */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE)); + + /* Check RXNEIE is disabled */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)); + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + } + hspi->State = HAL_SPI_STATE_ABORT; +} + +/** + * @} + */ + +#endif /* HAL_SPI_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c new file mode 100644 index 0000000..db9aa71 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c @@ -0,0 +1,112 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_spi_ex.c + * @author MCD Application Team + * @brief Extended SPI HAL module driver. + * This file provides firmware functions to manage the following + * SPI peripheral extended functionalities : + * + IO operation functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup SPIEx SPIEx + * @brief SPI Extended HAL module driver + * @{ + */ +#ifdef HAL_SPI_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup SPIEx_Private_Constants SPIEx Private Constants + * @{ + */ +#define SPI_FIFO_SIZE 4UL +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup SPIEx_Exported_Functions SPIEx Exported Functions + * @{ + */ + +/** @defgroup SPIEx_Exported_Functions_Group1 IO operation functions + * @brief Data transfers functions + * +@verbatim + ============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of extended functions to manage the SPI + data transfers. + + (#) Rx data flush function: + (++) HAL_SPIEx_FlushRxFifo() + +@endverbatim + * @{ + */ + +/** + * @brief Flush the RX fifo. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPIEx_FlushRxFifo(SPI_HandleTypeDef *hspi) +{ + __IO uint32_t tmpreg; + uint8_t count = 0U; + while ((hspi->Instance->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY) + { + count++; + tmpreg = hspi->Instance->DR; + UNUSED(tmpreg); /* To avoid GCC warning */ + if (count == SPI_FIFO_SIZE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_SPI_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c new file mode 100644 index 0000000..ae44bb9 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c @@ -0,0 +1,7925 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_tim.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer (TIM) peripheral: + * + TIM Time Base Initialization + * + TIM Time Base Start + * + TIM Time Base Start Interruption + * + TIM Time Base Start DMA + * + TIM Output Compare/PWM Initialization + * + TIM Output Compare/PWM Channel Configuration + * + TIM Output Compare/PWM Start + * + TIM Output Compare/PWM Start Interruption + * + TIM Output Compare/PWM Start DMA + * + TIM Input Capture Initialization + * + TIM Input Capture Channel Configuration + * + TIM Input Capture Start + * + TIM Input Capture Start Interruption + * + TIM Input Capture Start DMA + * + TIM One Pulse Initialization + * + TIM One Pulse Channel Configuration + * + TIM One Pulse Start + * + TIM Encoder Interface Initialization + * + TIM Encoder Interface Start + * + TIM Encoder Interface Start Interruption + * + TIM Encoder Interface Start DMA + * + Commutation Event configuration with Interruption and DMA + * + TIM OCRef clear configuration + * + TIM External Clock configuration + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### TIMER Generic features ##### + ============================================================================== + [..] The Timer features include: + (#) 16-bit up, down, up/down auto-reload counter. + (#) 16-bit programmable prescaler allowing dividing (also on the fly) the + counter clock frequency either by any factor between 1 and 65536. + (#) Up to 4 independent channels for: + (++) Input Capture + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to interconnect + several timers together. + (#) Supports incremental encoder for positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Time Base : HAL_TIM_Base_MspInit() + (++) Input Capture : HAL_TIM_IC_MspInit() + (++) Output Compare : HAL_TIM_OC_MspInit() + (++) PWM generation : HAL_TIM_PWM_MspInit() + (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() + (++) Encoder mode output : HAL_TIM_Encoder_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + Initialization function of this driver: + (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base + (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an + Output Compare signal. + (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a + PWM signal. + (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an + external signal. + (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer + in One Pulse Mode. + (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. + + (#) Activate the TIM peripheral using one of the start functions depending from the feature used: + (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() + (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() + (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() + (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() + (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() + (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). + + (#) The DMA Burst is managed with the two following functions: + HAL_TIM_DMABurst_WriteStart() + HAL_TIM_DMABurst_ReadStart() + + *** Callback registration *** + ============================================= + + [..] + The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_TIM_RegisterCallback() to register a callback. + HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, + the Callback ID and a pointer to the user callback function. + + [..] + Use function HAL_TIM_UnRegisterCallback() to reset a callback to the default + weak function. + HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + + [..] + These functions allow to register/unregister following callbacks: + (+) Base_MspInitCallback : TIM Base Msp Init Callback. + (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. + (+) IC_MspInitCallback : TIM IC Msp Init Callback. + (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. + (+) OC_MspInitCallback : TIM OC Msp Init Callback. + (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. + (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. + (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. + (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. + (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. + (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. + (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. + (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. + (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. + (+) PeriodElapsedCallback : TIM Period Elapsed Callback. + (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. + (+) TriggerCallback : TIM Trigger Callback. + (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. + (+) IC_CaptureCallback : TIM Input Capture Callback. + (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. + (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. + (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. + (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. + (+) ErrorCallback : TIM Error Callback. + (+) CommutationCallback : TIM Commutation Callback. + (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. + (+) BreakCallback : TIM Break Callback. + (+) Break2Callback : TIM Break2 Callback. + + [..] +By default, after the Init and when the state is HAL_TIM_STATE_RESET +all interrupt callbacks are set to the corresponding weak functions: + examples HAL_TIM_TriggerCallback(), HAL_TIM_ErrorCallback(). + + [..] + Exception done for MspInit and MspDeInit functions that are reset to the legacy weak + functionalities in the Init / DeInit only when these callbacks are null + (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit + keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + + [..] + Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. + Exception done MspInit / MspDeInit that can be registered / unregistered + in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, + thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_TIM_RegisterCallback() before calling DeInit or Init function. + + [..] + When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup TIM TIM + * @brief TIM HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup TIM_Private_Constants + * @{ + */ +#define TIMx_OR1_OCREF_CLR 0x00000001U +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup TIM_Private_Functions + * @{ + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC5_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + const TIM_SlaveConfigTypeDef *sSlaveConfig); +/** + * @} + */ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * +@verbatim + ============================================================================== + ##### Time Base functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM base. + (+) De-initialize the TIM base. + (+) Start the Time Base. + (+) Stop the Time Base. + (+) Start the Time Base and enable interrupt. + (+) Stop the Time Base and disable interrupt. + (+) Start the Time Base and enable DMA transfer. + (+) Stop the Time Base and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Time base Unit according to the specified + * parameters in the TIM_HandleTypeDef and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Base_MspInitCallback == NULL) + { + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Base_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the Time Base configuration */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Base peripheral + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Base_MspDeInitCallback == NULL) + { + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Base_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspDeInit could be implemented in the user file + */ +} + + +/** + * @brief Starts the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Check the TIM state */ + if (htim->State != HAL_TIM_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Check the TIM state */ + if (htim->State != HAL_TIM_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Enable the TIM Update interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Disable the TIM Update interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + /* Set the TIM state */ + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + return HAL_ERROR; + } + + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Update DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * +@verbatim + ============================================================================== + ##### TIM Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Output Compare. + (+) De-initialize the TIM Output Compare. + (+) Start the TIM Output Compare. + (+) Stop the TIM Output Compare. + (+) Start the TIM Output Compare and enable interrupt. + (+) Stop the TIM Output Compare and disable interrupt. + (+) Start the TIM Output Compare and enable DMA transfer. + (+) Stop the TIM Output Compare and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Output Compare according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OC_MspInitCallback == NULL) + { + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the Output Compare */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OC_MspDeInitCallback == NULL) + { + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * +@verbatim + ============================================================================== + ##### TIM PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM PWM. + (+) De-initialize the TIM PWM. + (+) Start the TIM PWM. + (+) Stop the TIM PWM. + (+) Start the TIM PWM and enable interrupt. + (+) Stop the TIM PWM and disable interrupt. + (+) Start the TIM PWM and enable DMA transfer. + (+) Stop the TIM PWM and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM PWM Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->PWM_MspInitCallback == NULL) + { + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->PWM_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the PWM */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->PWM_MspDeInitCallback == NULL) + { + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + } + /* DeInit the low level hardware */ + htim->PWM_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the PWM signal generation. + * @param htim TIM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Capture/Compare 3 request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * +@verbatim + ============================================================================== + ##### TIM Input Capture functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Input Capture. + (+) De-initialize the TIM Input Capture. + (+) Start the TIM Input Capture. + (+) Stop the TIM Input Capture. + (+) Start the TIM Input Capture and enable interrupt. + (+) Stop the TIM Input Capture and disable interrupt. + (+) Start the TIM Input Capture and enable DMA transfer. + (+) Stop the TIM Input Capture and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Input Capture Time base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->IC_MspInitCallback == NULL) + { + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->IC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the input capture */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->IC_MspDeInitCallback == NULL) + { + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->IC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Input Capture MSP. + * @param htim TIM Input Capture handle + * @retval None + */ +__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Input Capture MSP. + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + /* Set the TIM channel state */ + if ((channel_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * +@verbatim + ============================================================================== + ##### TIM One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM One Pulse. + (+) De-initialize the TIM One Pulse. + (+) Start the TIM One Pulse. + (+) Stop the TIM One Pulse. + (+) Start the TIM One Pulse and enable interrupt. + (+) Stop the TIM One Pulse and disable interrupt. + (+) Start the TIM One Pulse and enable DMA transfer. + (+) Stop the TIM One Pulse and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM One Pulse Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() + * @note When the timer instance is initialized in One Pulse mode, timer + * channels 1 and channel 2 are reserved and cannot be used for other + * purpose. + * @param htim TIM One Pulse handle + * @param OnePulseMode Select the One pulse mode. + * This parameter can be one of the following values: + * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. + * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_OPM_MODE(OnePulseMode)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OnePulse_MspInitCallback == NULL) + { + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OnePulse_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OnePulse_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the One Pulse Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Reset the OPM Bit */ + htim->Instance->CR1 &= ~TIM_CR1_OPM; + + /* Configure the OPM Mode */ + htim->Instance->CR1 |= OnePulseMode; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM One Pulse + * @param htim TIM One Pulse handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OnePulse_MspDeInitCallback == NULL) + { + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OnePulse_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_OnePulse_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM One Pulse signal generation. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * +@verbatim + ============================================================================== + ##### TIM Encoder functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Encoder. + (+) De-initialize the TIM Encoder. + (+) Start the TIM Encoder. + (+) Stop the TIM Encoder. + (+) Start the TIM Encoder and enable interrupt. + (+) Stop the TIM Encoder and disable interrupt. + (+) Start the TIM Encoder and enable DMA transfer. + (+) Stop the TIM Encoder and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Encoder Interface and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() + * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together + * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource + * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa + * @note When the timer instance is initialized in Encoder mode, timer + * channels 1 and channel 2 are reserved and cannot be used for other + * purpose. + * @param htim TIM Encoder Interface handle + * @param sConfig TIM Encoder Interface configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig) +{ + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Encoder_MspInitCallback == NULL) + { + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Encoder_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_Encoder_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Reset the SMS and ECE bits */ + htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = htim->Instance->CCMR1; + + /* Get the TIMx CCER register value */ + tmpccer = htim->Instance->CCER; + + /* Set the encoder Mode */ + tmpsmcr |= sConfig->EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); + tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); + + /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ + tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); + tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); + tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); + tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); + + /* Set the TI1 and the TI2 Polarities */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); + tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); + tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Write to TIMx CCMR1 */ + htim->Instance->CCMR1 = tmpccmr1; + + /* Write to TIMx CCER */ + htim->Instance->CCER = tmpccer; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + + +/** + * @brief DeInitializes the TIM Encoder interface + * @param htim TIM Encoder Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Encoder_MspDeInitCallback == NULL) + { + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Encoder_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Encoder_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + + /* Enable the encoder interface channels */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + } + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + + /* Enable the encoder interface channels */ + /* Enable the capture compare Interrupts 1 and/or 2 */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + } + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 and 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @param pData1 The destination Buffer address for IC1. + * @param pData2 The destination Buffer address for IC2. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData1 == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_2_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData2 == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + else + { + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (channel_2_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((((pData1 == NULL) || (pData2 == NULL))) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + + default: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 and 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ +/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief TIM IRQ handler management + * +@verbatim + ============================================================================== + ##### IRQ handler management ##### + ============================================================================== + [..] + This section provides Timer IRQ handler function. + +@endverbatim + * @{ + */ +/** + * @brief This function handles TIM interrupts requests. + * @param htim TIM handle + * @retval None + */ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) +{ + /* Capture compare 1 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) != RESET) + { + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + /* Input capture event */ + if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + } + /* Capture compare 2 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + /* Input capture event */ + if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 3 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + /* Input capture event */ + if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 4 event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + /* Input capture event */ + if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* TIM Update event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Break input event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->BreakCallback(htim); +#else + HAL_TIMEx_BreakCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Break2 input event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK2) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET) + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK2); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->Break2Callback(htim); +#else + HAL_TIMEx_Break2Callback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Trigger detection event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM commutation event */ + if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET) + { + if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) != RESET) + { + __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions + * @brief TIM Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. + (+) Configure External Clock source. + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master and the Slave synchronization. + (+) Configure the DMA Burst Mode. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the TIM Output Compare Channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM Output Compare handle + * @param sConfig TIM Output Compare configuration structure + * @param Channel TIM Channels to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, + const TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + + /* Process Locked */ + __HAL_LOCK(htim); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 1 in Output Compare */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 2 in Output Compare */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 3 in Output Compare */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 4 in Output Compare */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_5: + { + /* Check the parameters */ + assert_param(IS_TIM_CC5_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 5 in Output Compare */ + TIM_OC5_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_6: + { + /* Check the parameters */ + assert_param(IS_TIM_CC6_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 6 in Output Compare */ + TIM_OC6_SetConfig(htim->Instance, sConfig); + break; + } + + default: + status = HAL_ERROR; + break; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM Input Capture Channels according to the specified + * parameters in the TIM_IC_InitTypeDef. + * @param htim TIM IC handle + * @param sConfig TIM Input Capture configuration structure + * @param Channel TIM Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); + assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); + + /* Process Locked */ + __HAL_LOCK(htim); + + if (Channel == TIM_CHANNEL_1) + { + /* TI1 Configuration */ + TIM_TI1_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->ICPrescaler; + } + else if (Channel == TIM_CHANNEL_2) + { + /* TI2 Configuration */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Set the IC2PSC value */ + htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); + } + else if (Channel == TIM_CHANNEL_3) + { + /* TI3 Configuration */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + TIM_TI3_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC3PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; + + /* Set the IC3PSC value */ + htim->Instance->CCMR2 |= sConfig->ICPrescaler; + } + else if (Channel == TIM_CHANNEL_4) + { + /* TI4 Configuration */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + TIM_TI4_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC4PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; + + /* Set the IC4PSC value */ + htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); + } + else + { + status = HAL_ERROR; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM PWM channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM PWM handle + * @param sConfig TIM PWM configuration structure + * @param Channel TIM Channels to be configured + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, + const TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); + + /* Process Locked */ + __HAL_LOCK(htim); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the Channel 1 in PWM mode */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel1 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the Channel 2 in PWM mode */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel2 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the Channel 3 in PWM mode */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel3 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the Channel 4 in PWM mode */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel4 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; + break; + } + + case TIM_CHANNEL_5: + { + /* Check the parameters */ + assert_param(IS_TIM_CC5_INSTANCE(htim->Instance)); + + /* Configure the Channel 5 in PWM mode */ + TIM_OC5_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel5*/ + htim->Instance->CCMR3 |= TIM_CCMR3_OC5PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE; + htim->Instance->CCMR3 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_6: + { + /* Check the parameters */ + assert_param(IS_TIM_CC6_INSTANCE(htim->Instance)); + + /* Configure the Channel 6 in PWM mode */ + TIM_OC6_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel6 */ + htim->Instance->CCMR3 |= TIM_CCMR3_OC6PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE; + htim->Instance->CCMR3 |= sConfig->OCFastMode << 8U; + break; + } + + default: + status = HAL_ERROR; + break; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM One Pulse Channels according to the specified + * parameters in the TIM_OnePulse_InitTypeDef. + * @param htim TIM One Pulse handle + * @param sConfig TIM One Pulse configuration structure + * @param OutputChannel TIM output channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @param InputChannel TIM input Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) +{ + HAL_StatusTypeDef status = HAL_OK; + TIM_OC_InitTypeDef temp1; + + /* Check the parameters */ + assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); + assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); + + if (OutputChannel != InputChannel) + { + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Extract the Output compare configuration from sConfig structure */ + temp1.OCMode = sConfig->OCMode; + temp1.Pulse = sConfig->Pulse; + temp1.OCPolarity = sConfig->OCPolarity; + temp1.OCNPolarity = sConfig->OCNPolarity; + temp1.OCIdleState = sConfig->OCIdleState; + temp1.OCNIdleState = sConfig->OCNIdleState; + + switch (OutputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_OC1_SetConfig(htim->Instance, &temp1); + break; + } + + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_OC2_SetConfig(htim->Instance, &temp1); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + switch (InputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1FP1; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI2FP2; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + + default: + status = HAL_ERROR; + break; + } + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @arg TIM_DMABASE_OR1 + * @arg TIM_DMABASE_CCMR3 + * @arg TIM_DMABASE_CCR5 + * @arg TIM_DMABASE_CCR6 + * @arg TIM_DMABASE_AF1 + * @arg TIM_DMABASE_AF2 + * @arg TIM_DMABASE_TISEL + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, uint32_t BurstLength) +{ + HAL_StatusTypeDef status; + + status = HAL_TIM_DMABurst_MultiWriteStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, + ((BurstLength) >> 8U) + 1U); + + + + return status; +} + +/** + * @brief Configure the DMA Burst to transfer multiple Data from the memory to the TIM peripheral + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @arg TIM_DMABASE_OR1 + * @arg TIM_DMABASE_CCMR3 + * @arg TIM_DMABASE_CCR5 + * @arg TIM_DMABASE_CCR6 + * @arg TIM_DMABASE_AF1 + * @arg TIM_DMABASE_AF2 + * @arg TIM_DMABASE_TISEL + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @param DataLength Data length. This parameter can be one value + * between 1 and 0xFFFF. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); + + if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM DMA Burst mode + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA channel) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + } + + /* Return function status */ + return status; +} + +/** + * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @arg TIM_DMABASE_OR1 + * @arg TIM_DMABASE_CCMR3 + * @arg TIM_DMABASE_CCR5 + * @arg TIM_DMABASE_CCR6 + * @arg TIM_DMABASE_AF1 + * @arg TIM_DMABASE_AF2 + * @arg TIM_DMABASE_TISEL + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) +{ + HAL_StatusTypeDef status; + + status = HAL_TIM_DMABurst_MultiReadStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, + ((BurstLength) >> 8U) + 1U); + + + return status; +} + +/** + * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @arg TIM_DMABASE_OR1 + * @arg TIM_DMABASE_CCMR3 + * @arg TIM_DMABASE_CCR5 + * @arg TIM_DMABASE_CCR6 + * @arg TIM_DMABASE_AF1 + * @arg TIM_DMABASE_AF2 + * @arg TIM_DMABASE_TISEL + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @param DataLength Data length. This parameter can be one value + * between 1 and 0xFFFF. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); + + if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stop the DMA burst reading + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA channel) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + } + + /* Return function status */ + return status; +} + +/** + * @brief Generate a software event + * @param htim TIM handle + * @param EventSource specifies the event source. + * This parameter can be one of the following values: + * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source + * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source + * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source + * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source + * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source + * @arg TIM_EVENTSOURCE_COM: Timer COM event source + * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source + * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source + * @arg TIM_EVENTSOURCE_BREAK2: Timer Break2 event source + * @note Basic timers can only generate an update event. + * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. + * @note TIM_EVENTSOURCE_BREAK and TIM_EVENTSOURCE_BREAK2 are relevant + * only for timer instances supporting break input(s). + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_EVENT_SOURCE(EventSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the event sources */ + htim->Instance->EGR = EventSource; + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Configures the OCRef clear feature + * @param htim TIM handle + * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that + * contains the OCREF clear feature and parameters for the TIM peripheral. + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @arg TIM_CHANNEL_5: TIM Channel 5 + * @arg TIM_CHANNEL_6: TIM Channel 6 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, + const TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (sClearInputConfig->ClearInputSource) + { + case TIM_CLEARINPUTSOURCE_NONE: + { + /* Clear the OCREF clear selection bit and the the ETR Bits */ + CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_OCCS | TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); + + /* Clear TIMx_OR1_OCREF_CLR (reset value) */ + CLEAR_BIT(htim->Instance->OR1, TIMx_OR1_OCREF_CLR); + break; + } +#if defined(COMP1) || defined(COMP2) || defined(COMP3) +#if defined(COMP1) && defined(COMP2) + case TIM_CLEARINPUTSOURCE_COMP1: + case TIM_CLEARINPUTSOURCE_COMP2: +#endif /* COMP1 && COMP2 */ +#if defined(COMP3) + case TIM_CLEARINPUTSOURCE_COMP3: +#endif /* COMP3 */ + { + /* Clear the OCREF clear selection bit */ + CLEAR_BIT(htim->Instance->SMCR, TIM_SMCR_OCCS); + + /* OCREF_CLR_INT is connected to COMPx output */ + MODIFY_REG(htim->Instance->OR1, TIMx_OR1_OCREF_CLR, sClearInputConfig->ClearInputSource); + break; + } +#endif /* COMP1 || COMP2 || COMP3 */ + + case TIM_CLEARINPUTSOURCE_ETR: + { + /* Check the parameters */ + assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); + assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); + assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); + + /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ + if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + TIM_ETR_SetConfig(htim->Instance, + sClearInputConfig->ClearInputPrescaler, + sClearInputConfig->ClearInputPolarity, + sClearInputConfig->ClearInputFilter); + + /* Set the OCREF clear selection bit */ + SET_BIT(htim->Instance->SMCR, TIM_SMCR_OCCS); + + /* Clear TIMx_OR1_OCREF_CLR (reset value) */ + CLEAR_BIT(htim->Instance->OR1, TIMx_OR1_OCREF_CLR); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + switch (Channel) + { + case TIM_CHANNEL_1: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 1 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + else + { + /* Disable the OCREF clear feature for Channel 1 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + break; + } + case TIM_CHANNEL_2: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 2 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + else + { + /* Disable the OCREF clear feature for Channel 2 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + break; + } + case TIM_CHANNEL_3: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 3 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + else + { + /* Disable the OCREF clear feature for Channel 3 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + break; + } + case TIM_CHANNEL_4: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 4 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + else + { + /* Disable the OCREF clear feature for Channel 4 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + break; + } + case TIM_CHANNEL_5: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 5 */ + SET_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC5CE); + } + else + { + /* Disable the OCREF clear feature for Channel 5 */ + CLEAR_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC5CE); + } + break; + } + case TIM_CHANNEL_6: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 6 */ + SET_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC6CE); + } + else + { + /* Disable the OCREF clear feature for Channel 6 */ + CLEAR_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC6CE); + } + break; + } + default: + break; + } + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Configures the clock source to be used + * @param htim TIM handle + * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that + * contains the clock source information for the TIM peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); + + /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + htim->Instance->SMCR = tmpsmcr; + + switch (sClockSourceConfig->ClockSource) + { + case TIM_CLOCKSOURCE_INTERNAL: + { + assert_param(IS_TIM_INSTANCE(htim->Instance)); + break; + } + + case TIM_CLOCKSOURCE_ETRMODE1: + { + /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + + /* Select the External clock mode1 and the ETRF trigger */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + break; + } + + case TIM_CLOCKSOURCE_ETRMODE2: + { + /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + /* Enable the External clock mode2 */ + htim->Instance->SMCR |= TIM_SMCR_ECE; + break; + } + + case TIM_CLOCKSOURCE_TI1: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); + break; + } + + case TIM_CLOCKSOURCE_TI2: + { + /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI2 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI2_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); + break; + } + + case TIM_CLOCKSOURCE_TI1ED: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); + break; + } + + case TIM_CLOCKSOURCE_ITR0: + case TIM_CLOCKSOURCE_ITR1: + case TIM_CLOCKSOURCE_ITR2: + case TIM_CLOCKSOURCE_ITR3: + { + /* Check whether or not the timer instance supports internal trigger input */ + assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); + + TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); + break; + } + + default: + status = HAL_ERROR; + break; + } + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Selects the signal connected to the TI1 input: direct from CH1_input + * or a XOR combination between CH1_input, CH2_input & CH3_input + * @param htim TIM handle. + * @param TI1_Selection Indicate whether or not channel 1 is connected to the + * output of a XOR gate. + * This parameter can be one of the following values: + * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input + * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 + * pins are connected to the TI1 input (XOR combination) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) +{ + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Reset the TI1 selection */ + tmpcr2 &= ~TIM_CR2_TI1S; + + /* Set the TI1 selection */ + tmpcr2 |= TI1_Selection; + + /* Write to TIMxCR2 */ + htim->Instance->CR2 = tmpcr2; + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /* Check the parameters */ + assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); + assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); + + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + /* Disable Trigger Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); + + /* Disable Trigger DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode in interrupt mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, + const TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /* Check the parameters */ + assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); + assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); + + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + /* Enable Trigger Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); + + /* Disable Trigger DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Read the captured value from Capture Compare unit + * @param htim TIM handle. + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval Captured value + */ +uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpreg = 0U; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Return the capture 1 value */ + tmpreg = htim->Instance->CCR1; + + break; + } + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Return the capture 2 value */ + tmpreg = htim->Instance->CCR2; + + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Return the capture 3 value */ + tmpreg = htim->Instance->CCR3; + + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Return the capture 4 value */ + tmpreg = htim->Instance->CCR4; + + break; + } + + default: + break; + } + + return tmpreg; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions + * @brief TIM Callbacks functions + * +@verbatim + ============================================================================== + ##### TIM Callbacks functions ##### + ============================================================================== + [..] + This section provides TIM callback functions: + (+) TIM Period elapsed callback + (+) TIM Output Compare callback + (+) TIM Input capture callback + (+) TIM Trigger callback + (+) TIM Error callback + +@endverbatim + * @{ + */ + +/** + * @brief Period elapsed callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief Period elapsed half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Output Compare callback in non-blocking mode + * @param htim TIM OC handle + * @retval None + */ +__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief Input Capture callback in non-blocking mode + * @param htim TIM IC handle + * @retval None + */ +__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureCallback could be implemented in the user file + */ +} + +/** + * @brief Input Capture half complete callback in non-blocking mode + * @param htim TIM IC handle + * @retval None + */ +__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Trigger detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_TriggerCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Trigger detection half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Timer error callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_ErrorCallback could be implemented in the user file + */ +} + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User TIM callback to be used instead of the weak predefined callback + * @param htim tim handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID + * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID + * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID + * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID + * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID + * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID + * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID + * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID + * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID + * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID + * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID + * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID + * @arg @ref HAL_TIM_BREAK2_CB_ID Break2 Callback ID + * @param pCallback pointer to the callback function + * @retval status + */ +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(htim); + + if (htim->State == HAL_TIM_STATE_READY) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = pCallback; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + htim->PeriodElapsedCallback = pCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + htim->PeriodElapsedHalfCpltCallback = pCallback; + break; + + case HAL_TIM_TRIGGER_CB_ID : + htim->TriggerCallback = pCallback; + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + htim->TriggerHalfCpltCallback = pCallback; + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + htim->IC_CaptureCallback = pCallback; + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + htim->IC_CaptureHalfCpltCallback = pCallback; + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + htim->OC_DelayElapsedCallback = pCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + htim->PWM_PulseFinishedCallback = pCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + htim->PWM_PulseFinishedHalfCpltCallback = pCallback; + break; + + case HAL_TIM_ERROR_CB_ID : + htim->ErrorCallback = pCallback; + break; + + case HAL_TIM_COMMUTATION_CB_ID : + htim->CommutationCallback = pCallback; + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + htim->CommutationHalfCpltCallback = pCallback; + break; + + case HAL_TIM_BREAK_CB_ID : + htim->BreakCallback = pCallback; + break; + + case HAL_TIM_BREAK2_CB_ID : + htim->Break2Callback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = pCallback; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Unregister a TIM callback + * TIM callback is redirected to the weak predefined callback + * @param htim tim handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID + * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID + * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID + * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID + * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID + * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID + * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID + * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID + * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID + * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID + * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID + * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID + * @arg @ref HAL_TIM_BREAK2_CB_ID Break2 Callback ID + * @retval status + */ +HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(htim); + + if (htim->State == HAL_TIM_STATE_READY) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + /* Legacy weak Base MspInit Callback */ + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + /* Legacy weak Base Msp DeInit Callback */ + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + /* Legacy weak IC Msp Init Callback */ + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + /* Legacy weak IC Msp DeInit Callback */ + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + /* Legacy weak OC Msp Init Callback */ + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + /* Legacy weak OC Msp DeInit Callback */ + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + /* Legacy weak PWM Msp Init Callback */ + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + /* Legacy weak PWM Msp DeInit Callback */ + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + /* Legacy weak One Pulse Msp Init Callback */ + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + /* Legacy weak One Pulse Msp DeInit Callback */ + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + /* Legacy weak Encoder Msp Init Callback */ + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + /* Legacy weak Encoder Msp DeInit Callback */ + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + /* Legacy weak Hall Sensor Msp Init Callback */ + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + /* Legacy weak Hall Sensor Msp DeInit Callback */ + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + /* Legacy weak Period Elapsed Callback */ + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + /* Legacy weak Period Elapsed half complete Callback */ + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; + break; + + case HAL_TIM_TRIGGER_CB_ID : + /* Legacy weak Trigger Callback */ + htim->TriggerCallback = HAL_TIM_TriggerCallback; + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + /* Legacy weak Trigger half complete Callback */ + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + /* Legacy weak IC Capture Callback */ + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + /* Legacy weak IC Capture half complete Callback */ + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + /* Legacy weak OC Delay Elapsed Callback */ + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + /* Legacy weak PWM Pulse Finished Callback */ + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + /* Legacy weak PWM Pulse Finished half complete Callback */ + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; + break; + + case HAL_TIM_ERROR_CB_ID : + /* Legacy weak Error Callback */ + htim->ErrorCallback = HAL_TIM_ErrorCallback; + break; + + case HAL_TIM_COMMUTATION_CB_ID : + /* Legacy weak Commutation Callback */ + htim->CommutationCallback = HAL_TIMEx_CommutCallback; + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + /* Legacy weak Commutation half complete Callback */ + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; + break; + + case HAL_TIM_BREAK_CB_ID : + /* Legacy weak Break Callback */ + htim->BreakCallback = HAL_TIMEx_BreakCallback; + break; + + case HAL_TIM_BREAK2_CB_ID : + /* Legacy weak Break2 Callback */ + htim->Break2Callback = HAL_TIMEx_Break2Callback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + /* Legacy weak Base MspInit Callback */ + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + /* Legacy weak Base Msp DeInit Callback */ + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + /* Legacy weak IC Msp Init Callback */ + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + /* Legacy weak IC Msp DeInit Callback */ + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + /* Legacy weak OC Msp Init Callback */ + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + /* Legacy weak OC Msp DeInit Callback */ + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + /* Legacy weak PWM Msp Init Callback */ + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + /* Legacy weak PWM Msp DeInit Callback */ + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + /* Legacy weak One Pulse Msp Init Callback */ + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + /* Legacy weak One Pulse Msp DeInit Callback */ + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + /* Legacy weak Encoder Msp Init Callback */ + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + /* Legacy weak Encoder Msp DeInit Callback */ + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + /* Legacy weak Hall Sensor Msp Init Callback */ + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + /* Legacy weak Hall Sensor Msp DeInit Callback */ + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return status; +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions + * @brief TIM Peripheral State functions + * +@verbatim + ============================================================================== + ##### Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Base handle state. + * @param htim TIM Base handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM OC handle state. + * @param htim TIM Output Compare handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM PWM handle state. + * @param htim TIM handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Input Capture handle state. + * @param htim TIM IC handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM One Pulse Mode handle state. + * @param htim TIM OPM handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Encoder Mode handle state. + * @param htim TIM Encoder Interface handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Encoder Mode handle state. + * @param htim TIM handle + * @retval Active channel + */ +HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim) +{ + return htim->Channel; +} + +/** + * @brief Return actual state of the TIM channel. + * @param htim TIM handle + * @param Channel TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @arg TIM_CHANNEL_5: TIM Channel 5 + * @arg TIM_CHANNEL_6: TIM Channel 6 + * @retval TIM Channel state + */ +HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_state; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + + return channel_state; +} + +/** + * @brief Return actual state of a DMA burst operation. + * @param htim TIM handle + * @retval DMA burst state + */ +HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + + return htim->DMABurstState; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ + +/** + * @brief TIM DMA error callback + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMAError(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Delay Pulse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Delay Pulse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedHalfCpltCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureHalfCpltCallback(htim); +#else + HAL_TIM_IC_CaptureHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Period Elapse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (htim->hdma[TIM_DMA_ID_UPDATE]->Init.Mode == DMA_NORMAL) + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Period Elapse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedHalfCpltCallback(htim); +#else + HAL_TIM_PeriodElapsedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (htim->hdma[TIM_DMA_ID_TRIGGER]->Init.Mode == DMA_NORMAL) + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerHalfCpltCallback(htim); +#else + HAL_TIM_TriggerHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief Time Base configuration + * @param TIMx TIM peripheral + * @param Structure TIM Base configuration structure + * @retval None + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure) +{ + uint32_t tmpcr1; + tmpcr1 = TIMx->CR1; + + /* Set TIM Time Base Unit parameters ---------------------------------------*/ + if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) + { + /* Select the Counter Mode */ + tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); + tmpcr1 |= Structure->CounterMode; + } + + if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) + { + /* Set the clock division */ + tmpcr1 &= ~TIM_CR1_CKD; + tmpcr1 |= (uint32_t)Structure->ClockDivision; + } + + /* Set the auto-reload preload */ + MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); + + TIMx->CR1 = tmpcr1; + + /* Set the Autoreload value */ + TIMx->ARR = (uint32_t)Structure->Period ; + + /* Set the Prescaler value */ + TIMx->PSC = Structure->Prescaler; + + if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) + { + /* Set the Repetition Counter value */ + TIMx->RCR = Structure->RepetitionCounter; + } + + /* Generate an update event to reload the Prescaler + and the repetition counter (only for advanced timer) value immediately */ + TIMx->EGR = TIM_EGR_UG; +} + +/** + * @brief Timer Output Compare 1 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= ~TIM_CCER_CC1E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= ~TIM_CCMR1_OC1M; + tmpccmrx &= ~TIM_CCMR1_CC1S; + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC1P; + /* Set the Output Compare Polarity */ + tmpccer |= OC_Config->OCPolarity; + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) + { + /* Check parameters */ + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC1NP; + /* Set the Output N Polarity */ + tmpccer |= OC_Config->OCNPolarity; + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC1NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS1; + tmpcr2 &= ~TIM_CR2_OIS1N; + /* Set the Output Idle state */ + tmpcr2 |= OC_Config->OCIdleState; + /* Set the Output N Idle state */ + tmpcr2 |= OC_Config->OCNIdleState; + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR1 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 2 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR1_OC2M; + tmpccmrx &= ~TIM_CCMR1_CC2S; + + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC2P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 4U); + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) + { + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC2NP; + /* Set the Output N Polarity */ + tmpccer |= (OC_Config->OCNPolarity << 4U); + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC2NE; + + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS2; + tmpcr2 &= ~TIM_CR2_OIS2N; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 2U); + /* Set the Output N Idle state */ + tmpcr2 |= (OC_Config->OCNIdleState << 2U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR2 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 3 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 3: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC3E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR2_OC3M; + tmpccmrx &= ~TIM_CCMR2_CC3S; + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC3P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 8U); + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) + { + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC3NP; + /* Set the Output N Polarity */ + tmpccer |= (OC_Config->OCNPolarity << 8U); + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC3NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS3; + tmpcr2 &= ~TIM_CR2_OIS3N; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 4U); + /* Set the Output N Idle state */ + tmpcr2 |= (OC_Config->OCNIdleState << 4U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR3 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 4 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= ~TIM_CCER_CC4E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR2_OC4M; + tmpccmrx &= ~TIM_CCMR2_CC4S; + + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC4P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 12U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS4; + + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 6U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR4 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 5 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +static void TIM_OC5_SetConfig(TIM_TypeDef *TIMx, + const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the output: Reset the CCxE Bit */ + TIMx->CCER &= ~TIM_CCER_CC5E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR3; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= ~(TIM_CCMR3_OC5M); + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC5P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 16U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Reset the Output Compare IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS5; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 8U); + } + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR3 */ + TIMx->CCMR3 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR5 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 6 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, + const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Disable the output: Reset the CCxE Bit */ + TIMx->CCER &= ~TIM_CCER_CC6E; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR3; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= ~(TIM_CCMR3_OC6M); + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= (uint32_t)~TIM_CCER_CC6P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 20U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Reset the Output Compare IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS6; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 10U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR3 */ + TIMx->CCMR3 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR6 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Slave Timer configuration function + * @param htim TIM handle + * @param sSlaveConfig Slave timer configuration + * @retval None + */ +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + const TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Reset the Trigger Selection Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source */ + tmpsmcr |= sSlaveConfig->InputTrigger; + + /* Reset the slave mode Bits */ + tmpsmcr &= ~TIM_SMCR_SMS; + /* Set the slave mode */ + tmpsmcr |= sSlaveConfig->SlaveMode; + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Configure the trigger prescaler, filter, and polarity */ + switch (sSlaveConfig->InputTrigger) + { + case TIM_TS_ETRF: + { + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + /* Configure the ETR Trigger source */ + TIM_ETR_SetConfig(htim->Instance, + sSlaveConfig->TriggerPrescaler, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI1F_ED: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + if (sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) + { + return HAL_ERROR; + } + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = htim->Instance->CCER; + htim->Instance->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = htim->Instance->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + htim->Instance->CCMR1 = tmpccmr1; + htim->Instance->CCER = tmpccer; + break; + } + + case TIM_TS_TI1FP1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI1 Filter and Polarity */ + TIM_TI1_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI2FP2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI2 Filter and Polarity */ + TIM_TI2_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_ITR0: + case TIM_TS_ITR1: + case TIM_TS_ITR2: + case TIM_TS_ITR3: + { + /* Check the parameter */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + break; + } + + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/** + * @brief Configure the TI1 as Input. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 + * (on channel2 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Select the Input */ + if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) + { + tmpccmr1 &= ~TIM_CCMR1_CC1S; + tmpccmr1 |= TIM_ICSelection; + } + else + { + tmpccmr1 |= TIM_CCMR1_CC1S_0; + } + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); + + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); + tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the Polarity and Filter for TI1. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = TIMx->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= (TIM_ICFilter << 4U); + + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); + tmpccer |= TIM_ICPolarity; + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 + * (on channel1 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr1 &= ~TIM_CCMR1_CC2S; + tmpccmr1 |= (TIM_ICSelection << 8U); + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC2F; + tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); + + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the Polarity and Filter for TI2. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + tmpccmr1 = TIMx->CCMR1; + tmpccer = TIMx->CCER; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC2F; + tmpccmr1 |= (TIM_ICFilter << 12U); + + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= (TIM_ICPolarity << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. + * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 + * (on channel1 path) is used as the input signal. Therefore CCMR2 must be + * protected against un-initialized filter and polarity values. + */ +static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCER &= ~TIM_CCER_CC3E; + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr2 &= ~TIM_CCMR2_CC3S; + tmpccmr2 |= TIM_ICSelection; + + /* Set the filter */ + tmpccmr2 &= ~TIM_CCMR2_IC3F; + tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); + + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); + tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI4 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. + * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 + * (on channel1 path) is used as the input signal. Therefore CCMR2 must be + * protected against un-initialized filter and polarity values. + * @retval None + */ +static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= ~TIM_CCER_CC4E; + tmpccmr2 = TIMx->CCMR2; + tmpccer = TIMx->CCER; + + /* Select the Input */ + tmpccmr2 &= ~TIM_CCMR2_CC4S; + tmpccmr2 |= (TIM_ICSelection << 8U); + + /* Set the filter */ + tmpccmr2 &= ~TIM_CCMR2_IC4F; + tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); + + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); + tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer ; +} + +/** + * @brief Selects the Input Trigger source + * @param TIMx to select the TIM peripheral + * @param InputTriggerSource The Input Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal Trigger 0 + * @arg TIM_TS_ITR1: Internal Trigger 1 + * @arg TIM_TS_ITR2: Internal Trigger 2 + * @arg TIM_TS_ITR3: Internal Trigger 3 + * @arg TIM_TS_TI1F_ED: TI1 Edge Detector + * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 + * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 + * @arg TIM_TS_ETRF: External Trigger input + * @retval None + */ +static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) +{ + uint32_t tmpsmcr; + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the TS Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source and the slave mode*/ + tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} +/** + * @brief Configures the TIMx External Trigger (ETR). + * @param TIMx to select the TIM peripheral + * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. + * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. + * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. + * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. + * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. + * @param ExtTRGFilter External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) +{ + uint32_t tmpsmcr; + + tmpsmcr = TIMx->SMCR; + + /* Reset the ETR Bits */ + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + + /* Set the Prescaler, the Filter value and the Polarity */ + tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); + + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel x. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @param ChannelState specifies the TIM Channel CCxE bit new state. + * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. + * @retval None + */ +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) +{ + uint32_t tmp; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(TIMx)); + assert_param(IS_TIM_CHANNELS(Channel)); + + tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ + + /* Reset the CCxE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxE Bit */ + TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ +} + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief Reset interrupt callbacks to the legacy weak callbacks. + * @param htim pointer to a TIM_HandleTypeDef structure that contains + * the configuration information for TIM module. + * @retval None + */ +void TIM_ResetCallback(TIM_HandleTypeDef *htim) +{ + /* Reset the TIM callback to the legacy weak callbacks */ + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; + htim->TriggerCallback = HAL_TIM_TriggerCallback; + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; + htim->ErrorCallback = HAL_TIM_ErrorCallback; + htim->CommutationCallback = HAL_TIMEx_CommutCallback; + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; + htim->BreakCallback = HAL_TIMEx_BreakCallback; + htim->Break2Callback = HAL_TIMEx_Break2Callback; +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c new file mode 100644 index 0000000..b55e2e1 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c @@ -0,0 +1,2893 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_tim_ex.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer Extended peripheral: + * + Time Hall Sensor Interface Initialization + * + Time Hall Sensor Interface Start + * + Time Complementary signal break and dead time configuration + * + Time Master and Slave synchronization configuration + * + Time Output Compare/PWM Channel Configuration (for channels 5 and 6) + * + Time OCRef clear configuration + * + Timer remapping capabilities configuration + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### TIMER Extended features ##### + ============================================================================== + [..] + The Timer Extended features include: + (#) Complementary outputs with programmable dead-time for : + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to + interconnect several timers together. + (#) Break input to put the timer output signals in reset state or in a known state. + (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for + positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + initialization function of this driver: + (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the + Timer Hall Sensor Interface and the commutation event with the corresponding + Interrupt and DMA request if needed (Note that One Timer is used to interface + with the Hall sensor Interface and another Timer should be used to use + the commutation event). + + (#) Activate the TIM peripheral using one of the start functions: + (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), + HAL_TIMEx_OCN_Start_IT() + (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), + HAL_TIMEx_PWMN_Start_IT() + (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() + (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), + HAL_TIMEx_HallSensor_Start_IT(). + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup TIMEx TIMEx + * @brief TIM Extended HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Constants TIM Extended Private Constants + * @{ + */ +/* Timeout for break input rearm */ +#define TIM_BREAKINPUT_REARM_TIMEOUT 5UL /* 5 milliseconds */ +/** + * @} + */ +/* End of private constants --------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma); +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * +@verbatim + ============================================================================== + ##### Timer Hall Sensor functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure TIM HAL Sensor. + (+) De-initialize TIM HAL Sensor. + (+) Start the Hall Sensor Interface. + (+) Stop the Hall Sensor Interface. + (+) Start the Hall Sensor Interface and enable interrupts. + (+) Stop the Hall Sensor Interface and disable interrupts. + (+) Start the Hall Sensor Interface and enable DMA transfers. + (+) Stop the Hall Sensor Interface and disable DMA transfers. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. + * @note When the timer instance is initialized in Hall Sensor Interface mode, + * timer channels 1 and channel 2 are reserved and cannot be used for + * other purpose. + * @param htim TIM Hall Sensor Interface handle + * @param sConfig TIM Hall Sensor configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig) +{ + TIM_OC_InitTypeDef OC_Config; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy week callbacks */ + TIM_ResetCallback(htim); + + if (htim->HallSensor_MspInitCallback == NULL) + { + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->HallSensor_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIMEx_HallSensor_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ + TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->IC1Prescaler; + + /* Enable the Hall sensor interface (XOR function of the three inputs) */ + htim->Instance->CR2 |= TIM_CR2_TI1S; + + /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1F_ED; + + /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; + + /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ + OC_Config.OCFastMode = TIM_OCFAST_DISABLE; + OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; + OC_Config.OCMode = TIM_OCMODE_PWM2; + OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; + OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; + OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; + OC_Config.Pulse = sConfig->Commutation_Delay; + + TIM_OC2_SetConfig(htim->Instance, &OC_Config); + + /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 + register to 101 */ + htim->Instance->CR2 &= ~TIM_CR2_MMS; + htim->Instance->CR2 |= TIM_TRGO_OC2REF; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Hall Sensor interface + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->HallSensor_MspDeInitCallback == NULL) + { + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + } + /* DeInit the low level hardware */ + htim->HallSensor_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIMEx_HallSensor_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Hall Sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1, 2 and 3 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the capture compare Interrupts 1 event */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts event */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel state */ + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Set the DMA Input Capture 1 Callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel for Capture 1*/ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the capture compare 1 Interrupt */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + + /* Disable the capture compare Interrupts 1 event */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * +@verbatim + ============================================================================== + ##### Timer Complementary Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary Output Compare/PWM. + (+) Stop the Complementary Output Compare/PWM. + (+) Start the Complementary Output Compare/PWM and enable interrupts. + (+) Stop the Complementary Output Compare/PWM and disable interrupts. + (+) Start the Complementary Output Compare/PWM and enable DMA transfers. + (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM OC handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * +@verbatim + ============================================================================== + ##### Timer Complementary PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary PWM. + (+) Stop the Complementary PWM. + (+) Start the Complementary PWM and enable interrupts. + (+) Stop the Complementary PWM and disable interrupts. + (+) Start the Complementary PWM and enable DMA transfers. + (+) Stop the Complementary PWM and disable DMA transfers. + (+) Start the Complementary Input Capture measurement. + (+) Stop the Complementary Input Capture. + (+) Start the Complementary Input Capture and enable interrupts. + (+) Stop the Complementary Input Capture and disable interrupts. + (+) Start the Complementary Input Capture and enable DMA transfers. + (+) Stop the Complementary Input Capture and disable DMA transfers. + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode on the + * complementary output + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode on the complementary + * output + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * +@verbatim + ============================================================================== + ##### Timer Complementary One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM One Pulse signal generation on the complementary + * output. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to enable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation on the complementary + * output. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to disable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to enable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + /* Enable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to disable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure the commutation event in case of use of the Hall sensor interface. + (+) Configure Output channels for OC and PWM mode. + + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master synchronization. + (+) Configure timer remapping capabilities. + (+) Select timer input source. + (+) Enable or disable channel grouping. + +@endverbatim + * @{ + */ + +/** + * @brief Configure the TIM commutation event sequence. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with interrupt. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + /* Enable the Commutation Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with DMA. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Enable the Commutation DMA Request */ + /* Set the DMA Commutation Callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Enable the Commutation DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in master mode. + * @param htim TIM handle. + * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that + * contains the selected trigger output (TRGO) and the Master/Slave + * mode. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + const TIM_MasterConfigTypeDef *sMasterConfig) +{ + uint32_t tmpcr2; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); + assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Change the handler state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* If the timer supports ADC synchronization through TRGO2, set the master mode selection 2 */ + if (IS_TIM_TRGO2_INSTANCE(htim->Instance)) + { + /* Check the parameters */ + assert_param(IS_TIM_TRGO2_SOURCE(sMasterConfig->MasterOutputTrigger2)); + + /* Clear the MMS2 bits */ + tmpcr2 &= ~TIM_CR2_MMS2; + /* Select the TRGO2 source*/ + tmpcr2 |= sMasterConfig->MasterOutputTrigger2; + } + + /* Reset the MMS Bits */ + tmpcr2 &= ~TIM_CR2_MMS; + /* Select the TRGO source */ + tmpcr2 |= sMasterConfig->MasterOutputTrigger; + + /* Update TIMx CR2 */ + htim->Instance->CR2 = tmpcr2; + + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State + * and the AOE(automatic output enable). + * @param htim TIM handle + * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that + * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) +{ + /* Keep this variable initialized to 0 as it is used to configure BDTR register */ + uint32_t tmpbdtr = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); + assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); + assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); + assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); + assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); + assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); + assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); + assert_param(IS_TIM_BREAK_FILTER(sBreakDeadTimeConfig->BreakFilter)); + assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, + the OSSI State, the dead time value and the Automatic Output Enable Bit */ + + /* Set the BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); + MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); + MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKF, (sBreakDeadTimeConfig->BreakFilter << TIM_BDTR_BKF_Pos)); + + if (IS_TIM_ADVANCED_INSTANCE(htim->Instance)) + { + /* Check the parameters */ + assert_param(IS_TIM_BREAK_AFMODE(sBreakDeadTimeConfig->BreakAFMode)); + + /* Set BREAK AF mode */ + MODIFY_REG(tmpbdtr, TIM_BDTR_BKBID, sBreakDeadTimeConfig->BreakAFMode); + } + + if (IS_TIM_BKIN2_INSTANCE(htim->Instance)) + { + /* Check the parameters */ + assert_param(IS_TIM_BREAK2_STATE(sBreakDeadTimeConfig->Break2State)); + assert_param(IS_TIM_BREAK2_POLARITY(sBreakDeadTimeConfig->Break2Polarity)); + assert_param(IS_TIM_BREAK_FILTER(sBreakDeadTimeConfig->Break2Filter)); + + /* Set the BREAK2 input related BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2F, (sBreakDeadTimeConfig->Break2Filter << TIM_BDTR_BK2F_Pos)); + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2E, sBreakDeadTimeConfig->Break2State); + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2P, sBreakDeadTimeConfig->Break2Polarity); + + if (IS_TIM_ADVANCED_INSTANCE(htim->Instance)) + { + /* Check the parameters */ + assert_param(IS_TIM_BREAK2_AFMODE(sBreakDeadTimeConfig->Break2AFMode)); + + /* Set BREAK2 AF mode */ + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2BID, sBreakDeadTimeConfig->Break2AFMode); + } + } + + /* Set TIMx_BDTR */ + htim->Instance->BDTR = tmpbdtr; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the break input source. + * @param htim TIM handle. + * @param BreakInput Break input to configure + * This parameter can be one of the following values: + * @arg TIM_BREAKINPUT_BRK: Timer break input + * @arg TIM_BREAKINPUT_BRK2: Timer break 2 input + * @param sBreakInputConfig Break input source configuration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, + uint32_t BreakInput, + const TIMEx_BreakInputConfigTypeDef *sBreakInputConfig) + +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmporx; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; + + /* Check the parameters */ + assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); + assert_param(IS_TIM_BREAKINPUT(BreakInput)); + assert_param(IS_TIM_BREAKINPUTSOURCE(sBreakInputConfig->Source)); + assert_param(IS_TIM_BREAKINPUTSOURCE_STATE(sBreakInputConfig->Enable)); + assert_param(IS_TIM_BREAKINPUTSOURCE_POLARITY(sBreakInputConfig->Polarity)); + + /* Check input state */ + __HAL_LOCK(htim); + + switch (sBreakInputConfig->Source) + { + case TIM_BREAKINPUTSOURCE_BKIN: + { + bkin_enable_mask = TIM1_AF1_BKINE; + bkin_enable_bitpos = TIM1_AF1_BKINE_Pos; + bkin_polarity_mask = TIM1_AF1_BKINP; + bkin_polarity_bitpos = TIM1_AF1_BKINP_Pos; + break; + } +#if defined(COMP1) && defined(COMP2) + case TIM_BREAKINPUTSOURCE_COMP1: + { + bkin_enable_mask = TIM1_AF1_BKCMP1E; + bkin_enable_bitpos = TIM1_AF1_BKCMP1E_Pos; + bkin_polarity_mask = TIM1_AF1_BKCMP1P; + bkin_polarity_bitpos = TIM1_AF1_BKCMP1P_Pos; + break; + } + case TIM_BREAKINPUTSOURCE_COMP2: + { + bkin_enable_mask = TIM1_AF1_BKCMP2E; + bkin_enable_bitpos = TIM1_AF1_BKCMP2E_Pos; + bkin_polarity_mask = TIM1_AF1_BKCMP2P; + bkin_polarity_bitpos = TIM1_AF1_BKCMP2P_Pos; + break; + } +#endif /* COMP1 && COMP2 */ +#if defined(COMP3) + case TIM_BREAKINPUTSOURCE_COMP3: + { + bkin_enable_mask = TIM1_AF1_BKCMP3E; + bkin_enable_bitpos = TIM1_AF1_BKCMP3E_Pos; + bkin_polarity_mask = TIM1_AF1_BKCMP3P; + bkin_polarity_bitpos = TIM1_AF1_BKCMP3P_Pos; + break; + } +#endif /* COMP3 */ + + default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; + break; + } + } + + switch (BreakInput) + { + case TIM_BREAKINPUT_BRK: + { + /* Get the TIMx_AF1 register value */ + tmporx = htim->Instance->AF1; + + /* Enable the break input */ + tmporx &= ~bkin_enable_mask; + tmporx |= (sBreakInputConfig->Enable << bkin_enable_bitpos) & bkin_enable_mask; + + /* Set the break input polarity */ + tmporx &= ~bkin_polarity_mask; + tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask; + + /* Set TIMx_AF1 */ + htim->Instance->AF1 = tmporx; + break; + } + case TIM_BREAKINPUT_BRK2: + { + /* Get the TIMx_AF2 register value */ + tmporx = htim->Instance->AF2; + + /* Enable the break input */ + tmporx &= ~bkin_enable_mask; + tmporx |= (sBreakInputConfig->Enable << bkin_enable_bitpos) & bkin_enable_mask; + + /* Set the break input polarity */ + tmporx &= ~bkin_polarity_mask; + tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask; + + /* Set TIMx_AF2 */ + htim->Instance->AF2 = tmporx; + break; + } + default: + status = HAL_ERROR; + break; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Configures the TIMx Remapping input capabilities. + * @param htim TIM handle. + * @param Remap specifies the TIM remapping source. + * For TIM1, the parameter can take one of the following values: + * @arg TIM_TIM1_ETR_GPIO: TIM1 ETR is is connected to GPIO + * @arg TIM_TIM1_ETR_COMP1: TIM1 ETR is connected to COMP1 output + * @arg TIM_TIM1_ETR_COMP2: TIM1 ETR is connected to COMP2 output + * @arg TIM_TIM1_ETR_COMP3: TIM1 ETR is connected to COMP3 output (**) + * @arg TIM_TIM1_ETR_ADC1_AWD1: TIM1 ETR is connected to ADC1 AWD1 + * @arg TIM_TIM1_ETR_ADC1_AWD2: TIM1 ETR is connected to ADC1 AWD2 + * @arg TIM_TIM1_ETR_ADC1_AWD3: TIM1 ETR is connected to ADC1 AWD3 + * + * For TIM2, the parameter can take one of the following values: (*) + * @arg TIM_TIM2_ETR_GPIO: TIM2_ETR is connected to GPIO + * @arg TIM_TIM2_ETR_COMP1: TIM2_ETR is connected to COMP1 output + * @arg TIM_TIM2_ETR_COMP2: TIM2_ETR is connected to COMP2 output + * @arg TIM_TIM2_ETR_COMP3: TIM2_ETR is connected to COMP3 output (**) + * @arg TIM_TIM2_ETR_LSE: TIM2_ETR is connected to LSE + * @arg TIM_TIM2_ETR_MCO: TIM2_ETR is connected to MCO (**) + * @arg TIM_TIM2_ETR_MCO2: TIM2_ETR is connected to MCO2 (**) + * + * For TIM3, the parameter can take one of the following values: + * @arg TIM_TIM3_ETR_GPIO TIM3_ETR is connected to GPIO + * @arg TIM_TIM3_ETR_COMP1 TIM3_ETR is connected to COMP1 output + * @arg TIM_TIM3_ETR_COMP2 TIM3_ETR is connected to COMP2 output + * @arg TIM_TIM3_ETR_COMP3 TIM3_ETR is connected to COMP3 output (**) + * + * For TIM4, the parameter can take one of the following values:(*) + * @arg TIM_TIM4_ETR_GPIO TIM4_ETR is connected to GPIO + * @arg TIM_TIM4_ETR_COMP1 TIM4_ETR is connected to COMP1 output + * @arg TIM_TIM4_ETR_COMP2 TIM4_ETR is connected to COMP2 output + * @arg TIM_TIM4_ETR_COMP3 TIM4_ETR is connected to COMP3 output (**) + * + * (*) Timer instance not available on all devices \n + * (**) Value not defined in all devices. \n + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) +{ + /* Check parameters */ + assert_param(IS_TIM_REMAP_INSTANCE(htim->Instance)); + assert_param(IS_TIM_REMAP(Remap)); + + __HAL_LOCK(htim); + + MODIFY_REG(htim->Instance->AF1, TIM1_AF1_ETRSEL_Msk, Remap); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Select the timer input source + * @param htim TIM handle. + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TI1 input channel + * @arg TIM_CHANNEL_2: TI2 input channel + * @arg TIM_CHANNEL_3: TI3 input channel + * @param TISelection specifies the timer input source + * + * For TIM1 this parameter can be one of the following values: + * @arg TIM_TIM1_TI1_GPIO: TIM1 TI1 is connected to GPIO + * @arg TIM_TIM1_TI1_COMP1: TIM1 TI1 is connected to COMP1 output + * @arg TIM_TIM1_TI2_GPIO: TIM1 TI2 is connected to GPIO + * @arg TIM_TIM1_TI2_COMP2: TIM1 TI2 is connected to COMP2 output + * @arg TIM_TIM1_TI3_GPIO: TIM1 TI3 is connected to GPIO + * @arg TIM_TIM1_TI3_COMP3: TIM1 TI3 is connected to COMP3 output (**) + * + * For TIM2, the parameter is one of the following values: (*) + * @arg TIM_TIM2_TI1_GPIO: TIM2 TI1 is connected to GPIO + * @arg TIM_TIM2_TI1_COMP1: TIM2 TI1 is connected to COMP1 output + * @arg TIM_TIM2_TI2_GPIO: TIM2 TI2 is connected to GPIO + * @arg TIM_TIM2_TI2_COMP2: TIM2 TI2 is connected to COMP2 output + * @arg TIM_TIM2_TI3_GPIO: TIM2 TI3 is connected to GPIO + * @arg TIM_TIM2_TI3_COMP3: TIM2 TI3 is connected to COMP3 output (**) + * + * For TIM3, the parameter is one of the following values: + * @arg TIM_TIM3_TI1_GPIO: TIM3 TI1 is connected to GPIO + * @arg TIM_TIM3_TI1_COMP1: TIM3 TI1 is connected to COMP1 output + * @arg TIM_TIM3_TI2_GPIO: TIM3 TI2 is connected to GPIO + * @arg TIM_TIM3_TI2_COMP2: TIM3 TI2 is connected to COMP2 output + * @arg TIM_TIM3_TI3_GPIO: TIM3 TI3 is connected to GPIO + * @arg TIM_TIM3_TI3_COMP3: TIM3 TI3 is connected to COMP3 output (**) + * + * For TIM4, the parameter is one of the following values: (*) + * @arg TIM_TIM4_TI1_GPIO: TIM4 TI1 is connected to GPIO + * @arg TIM_TIM4_TI1_COMP1: TIM4 TI1 is connected to COMP1 output + * @arg TIM_TIM4_TI2_GPIO: TIM4 TI2 is connected to GPIO + * @arg TIM_TIM4_TI2_COMP2: TIM4 TI2 is connected to COMP2 output + * @arg TIM_TIM4_TI3_GPIO: TIM4 TI3 is connected to GPIO + * @arg TIM_TIM4_TI3_COMP3: TIM4 TI3 is connected to COMP3 output + * + * For TIM14, the parameter is one of the following values: + * @arg TIM_TIM14_TI1_GPIO: TIM14 TI1 is connected to GPIO + * @arg TIM_TIM14_TI1_RTC: TIM14 TI1 is connected to RTC clock + * @arg TIM_TIM14_TI1_HSE_32: TIM14 TI1 is connected to HSE div 32 + * @arg TIM_TIM14_TI1_MCO: TIM14 TI1 is connected to MCO + * @arg TIM_TIM14_TI1_MCO2: TIM14 TI1 is connected to MCO2 (**) + * + * For TIM15, the parameter is one of the following values: + * @arg TIM_TIM15_TI1_GPIO: TIM15 TI1 is connected to GPIO + * @arg TIM_TIM15_TI1_TIM2_CH1: TIM15 TI1 is connected to TIM2 CH1 + * @arg TIM_TIM15_TI1_TIM3_CH1: TIM15 TI1 is connected to TIM3 CH1 + * @arg TIM_TIM15_TI2_GPIO: TIM15 TI2 is connected to GPIO + * @arg TIM_TIM15_TI2_TIM2_CH2: TIM15 TI2 is connected to TIM2 CH2 + * @arg TIM_TIM15_TI2_TIM3_CH2: TIM15 TI2 is connected to TIM3 CH2 + * + * For TIM16, the parameter can have the following values: + * @arg TIM_TIM16_TI1_GPIO: TIM16 TI1 is connected to GPIO + * @arg TIM_TIM16_TI1_LSI: TIM16 TI1 is connected to LSI + * @arg TIM_TIM16_TI1_LSE: TIM16 TI1 is connected to LSE + * @arg TIM_TIM16_TI1_RTC_WAKEUP: TIM16 TI1 is connected to TRC wakeup interrupt + * @arg TIM_TIM16_TI1_MCO2: TIM16 TI1 is connected to MCO2 (**) + * + * For TIM17, the parameter can have the following values: + * @arg TIM_TIM17_TI1_GPIO: TIM17 TI1 is connected to GPIO + * @arg TIM_TIM14_TI1_HSI: TIM17 TI1 is connected to HSI (**) + * @arg TIM_TIM17_TI1_HSE_32: TIM17 TI1 is connected to HSE div 32 + * @arg TIM_TIM17_TI1_MCO: TIM17 TI1 is connected to MCO + * @arg TIM_TIM17_TI1_MCO2: TIM17 TI1 is connected to MCO2 (**) + * + * (*) Timer instance not available on all devices \n + * (**) Value not defined in all devices. \n + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_TISelection(TIM_HandleTypeDef *htim, uint32_t TISelection, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check parameters */ + assert_param(IS_TIM_TISEL_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TISEL(TISelection)); + + __HAL_LOCK(htim); + + switch (Channel) + { + case TIM_CHANNEL_1: + MODIFY_REG(htim->Instance->TISEL, TIM_TISEL_TI1SEL, TISelection); + break; + case TIM_CHANNEL_2: + MODIFY_REG(htim->Instance->TISEL, TIM_TISEL_TI2SEL, TISelection); + break; + case TIM_CHANNEL_3: + MODIFY_REG(htim->Instance->TISEL, TIM_TISEL_TI3SEL, TISelection); + break; + default: + status = HAL_ERROR; + break; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Group channel 5 and channel 1, 2 or 3 + * @param htim TIM handle. + * @param Channels specifies the reference signal(s) the OC5REF is combined with. + * This parameter can be any combination of the following values: + * TIM_GROUPCH5_NONE: No effect of OC5REF on OC1REFC, OC2REFC and OC3REFC + * TIM_GROUPCH5_OC1REFC: OC1REFC is the logical AND of OC1REFC and OC5REF + * TIM_GROUPCH5_OC2REFC: OC2REFC is the logical AND of OC2REFC and OC5REF + * TIM_GROUPCH5_OC3REFC: OC3REFC is the logical AND of OC3REFC and OC5REF + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels) +{ + /* Check parameters */ + assert_param(IS_TIM_COMBINED3PHASEPWM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_GROUPCH5(Channels)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Clear GC5Cx bit fields */ + htim->Instance->CCR5 &= ~(TIM_CCR5_GC5C3 | TIM_CCR5_GC5C2 | TIM_CCR5_GC5C1); + + /* Set GC5Cx bit fields */ + htim->Instance->CCR5 |= Channels; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Disarm the designated break input (when it operates in bidirectional mode). + * @param htim TIM handle. + * @param BreakInput Break input to disarm + * This parameter can be one of the following values: + * @arg TIM_BREAKINPUT_BRK: Timer break input + * @arg TIM_BREAKINPUT_BRK2: Timer break 2 input + * @note The break input can be disarmed only when it is configured in + * bidirectional mode and when when MOE is reset. + * @note Purpose is to be able to have the input voltage back to high-state, + * whatever the time constant on the output . + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_DisarmBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpbdtr; + + /* Check the parameters */ + assert_param(IS_TIM_ADVANCED_INSTANCE(htim->Instance)); + assert_param(IS_TIM_BREAKINPUT(BreakInput)); + + switch (BreakInput) + { + case TIM_BREAKINPUT_BRK: + { + /* Check initial conditions */ + tmpbdtr = READ_REG(htim->Instance->BDTR); + if ((READ_BIT(tmpbdtr, TIM_BDTR_BKBID) == TIM_BDTR_BKBID) && + (READ_BIT(tmpbdtr, TIM_BDTR_MOE) == 0U)) + { + /* Break input BRK is disarmed */ + SET_BIT(htim->Instance->BDTR, TIM_BDTR_BKDSRM); + } + break; + } + + case TIM_BREAKINPUT_BRK2: + { + /* Check initial conditions */ + tmpbdtr = READ_REG(htim->Instance->BDTR); + if ((READ_BIT(tmpbdtr, TIM_BDTR_BK2BID) == TIM_BDTR_BK2BID) && + (READ_BIT(tmpbdtr, TIM_BDTR_MOE) == 0U)) + { + /* Break input BRK is disarmed */ + SET_BIT(htim->Instance->BDTR, TIM_BDTR_BK2DSRM); + } + break; + } + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/** + * @brief Arm the designated break input (when it operates in bidirectional mode). + * @param htim TIM handle. + * @param BreakInput Break input to arm + * This parameter can be one of the following values: + * @arg TIM_BREAKINPUT_BRK: Timer break input + * @arg TIM_BREAKINPUT_BRK2: Timer break 2 input + * @note Arming is possible at anytime, even if fault is present. + * @note Break input is automatically armed as soon as MOE bit is set. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ReArmBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_TIM_ADVANCED_INSTANCE(htim->Instance)); + assert_param(IS_TIM_BREAKINPUT(BreakInput)); + + switch (BreakInput) + { + case TIM_BREAKINPUT_BRK: + { + /* Check initial conditions */ + if (READ_BIT(htim->Instance->BDTR, TIM_BDTR_BKBID) == TIM_BDTR_BKBID) + { + /* Break input BRK is re-armed automatically by hardware. Poll to check whether fault condition disappeared */ + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + while (READ_BIT(htim->Instance->BDTR, TIM_BDTR_BKDSRM) != 0UL) + { + if ((HAL_GetTick() - tickstart) > TIM_BREAKINPUT_REARM_TIMEOUT) + { + /* New check to avoid false timeout detection in case of preemption */ + if (READ_BIT(htim->Instance->BDTR, TIM_BDTR_BKDSRM) != 0UL) + { + return HAL_TIMEOUT; + } + } + } + } + break; + } + + case TIM_BREAKINPUT_BRK2: + { + /* Check initial conditions */ + if (READ_BIT(htim->Instance->BDTR, TIM_BDTR_BK2BID) == TIM_BDTR_BK2BID) + { + /* Break input BRK2 is re-armed automatically by hardware. Poll to check whether fault condition disappeared */ + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + while (READ_BIT(htim->Instance->BDTR, TIM_BDTR_BK2DSRM) != 0UL) + { + if ((HAL_GetTick() - tickstart) > TIM_BREAKINPUT_REARM_TIMEOUT) + { + /* New check to avoid false timeout detection in case of preemption */ + if (READ_BIT(htim->Instance->BDTR, TIM_BDTR_BK2DSRM) != 0UL) + { + return HAL_TIMEOUT; + } + } + } + } + break; + } + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * +@verbatim + ============================================================================== + ##### Extended Callbacks functions ##### + ============================================================================== + [..] + This section provides Extended TIM callback functions: + (+) Timer Commutation callback + (+) Timer Break callback + +@endverbatim + * @{ + */ + +/** + * @brief Hall commutation changed callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutCallback could be implemented in the user file + */ +} +/** + * @brief Hall commutation changed half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Break detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_BreakCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Break2 detection callback in non blocking mode + * @param htim: TIM handle + * @retval None + */ +__weak void HAL_TIMEx_Break2Callback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_TIMEx_Break2Callback could be implemented in the user file + */ +} +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * +@verbatim + ============================================================================== + ##### Extended Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Hall Sensor interface handle state. + * @param htim TIM Hall Sensor handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return actual state of the TIM complementary channel. + * @param htim TIM handle + * @param ChannelN TIM Complementary channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @retval TIM Complementary channel state + */ +HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN) +{ + HAL_TIM_ChannelStateTypeDef channel_state; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, ChannelN)); + + channel_state = TIM_CHANNEL_N_STATE_GET(htim, ChannelN); + + return channel_state; +} +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions + * @{ + */ + +/** + * @brief TIM DMA Commutation callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Commutation half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationHalfCpltCallback(htim); +#else + HAL_TIMEx_CommutHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + + +/** + * @brief TIM DMA Delay Pulse complete callback (complementary channel). + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA error callback (complementary channel) + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel xN. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @param ChannelNState specifies the TIM Channel CCxNE bit new state. + * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. + * @retval None + */ +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) +{ + uint32_t tmp; + + tmp = TIM_CCER_CC1NE << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ + + /* Reset the CCxNE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxNE Bit */ + TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ +} +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_rtc_alarm_template.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_rtc_alarm_template.c new file mode 100644 index 0000000..feeffd5 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_rtc_alarm_template.c @@ -0,0 +1,349 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_timebase_rtc_alarm_template.c + * @author MCD Application Team + * @brief HAL time base based on the hardware RTC_ALARM Template. + * + * This file override the native HAL time base functions (defined as weak) + * to use the RTC ALARM for time base generation: + * + Initializes the RTC peripheral to increment the seconds registers each 1ms + * + The alarm is configured to assert an interrupt when the RTC reaches 1ms + * + HAL_IncTick is called at each Alarm event and the time is reset to 00:00:00 + * + HSE (default), LSE or LSI can be selected as RTC clock source + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + This file must be copied to the application folder and modified as follows: + (#) Rename it to 'stm32g0xx_hal_timebase_rtc_alarm.c' + (#) Add this file and the RTC HAL drivers to your project and uncomment + HAL_RTC_MODULE_ENABLED define in stm32g0xx_hal_conf.h + + [..] + (@) HAL RTC alarm and HAL RTC wakeup drivers cant be used with low power modes: + The wake up capability of the RTC may be intrusive in case of prior low power mode + configuration requiring different wake up sources. + Application/Example behavior is no more guaranteed + (@) The stm32g0xx_hal_timebase_tim use is recommended for the Applications/Examples + requiring low power modes + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL_TimeBase_RTC_Alarm_Template HAL TimeBase RTC Alarm Template + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* Uncomment the line below to select the appropriate RTC Clock source for your application: + + RTC_CLOCK_SOURCE_HSE: can be selected for applications requiring timing precision. + + RTC_CLOCK_SOURCE_LSE: can be selected for applications with low constraint on timing + precision. + + RTC_CLOCK_SOURCE_LSI: can be selected for applications with low constraint on timing + precision. + */ +/* #define RTC_CLOCK_SOURCE_HSE */ +/* #define RTC_CLOCK_SOURCE_LSE */ +#define RTC_CLOCK_SOURCE_LSI + +/* Minimize Asynchronous prescaler for power consumption : + ck_apre = RTCCLK / (ASYNC prediv + 1) + ck_spre = ck_apre/(SYNC prediv + 1) = 1 Hz */ +#if defined (RTC_CLOCK_SOURCE_LSE) +/* LSE Freq = 32.768 kHz RC */ +#define RTC_ASYNCH_PREDIV 0u +#define RTC_SYNCH_PREDIV 0x3FFFu /* (16384 - 1) */ +#elif defined (RTC_CLOCK_SOURCE_LSI) +/* LSI Freq = 32 kHz RC */ +#define RTC_ASYNCH_PREDIV 0u +#define RTC_SYNCH_PREDIV 0x3E7Fu /* (16000 - 1) */ +#elif defined (RTC_CLOCK_SOURCE_HSE) +/* HSE Freq as RTCCLK = 8 MHz / 32 = 250 kHz */ +#define RTC_ASYNCH_PREDIV 0x07u /* (8 - 1) */ +#define RTC_SYNCH_PREDIV 0x7A11u /* (31250 -1) */ +#endif /* RTC_CLOCK_SOURCE_LSE */ + + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +RTC_HandleTypeDef hRTC_Handle = {.Init = {0}}; + +/* Private function prototypes -----------------------------------------------*/ +void RTC_TAMP_IRQHandler(void); +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief This function configures the RTC ALARM A as a time base source. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * Calendar time base is = ((RTC_ASYNCH_PREDIV + 1) * (RTC_SYNCH_PREDIV + 1)) / RTC_CLOCK + * = 1s + * Alarm interrupt timebase is = (RTC_SYNCH_PREDIV / (1000 / uwTickFreq)) + * = 1 ms when uwTickFreq is set to 1 kHz + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). + * @param TickPriority Tick interrupt priority. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + HAL_StatusTypeDef status = HAL_OK; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + RTC_TimeTypeDef time; + RTC_DateTypeDef date; + RTC_AlarmTypeDef alarm; + + + /* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that don't take the value zero)*/ + if ((uint32_t)uwTickFreq != 0U) + { + /* Disable backup domeain protection */ + HAL_PWR_EnableBkUpAccess(); + + /* Enable RTC APB clock gating */ + __HAL_RCC_RTCAPB_CLK_ENABLE(); + + /* Disable the Alarm A */ + __HAL_RTC_ALARMA_DISABLE(&hRTC_Handle); + /* In case of interrupt mode is used, the interrupt source must disabled */ + __HAL_RTC_ALARM_DISABLE_IT(&hRTC_Handle, RTC_IT_ALRA); + __HAL_RTC_ALARM_CLEAR_FLAG(&hRTC_Handle, RTC_FLAG_ALRAF); + + /* Get RTC clock configuration */ + HAL_RCCEx_GetPeriphCLKConfig(&PeriphClkInitStruct); + + /*In case of RTC clock already enable, make sure it's the good one */ +#if defined (RTC_CLOCK_SOURCE_LSE) + if ((PeriphClkInitStruct.RTCClockSelection == RCC_RTCCLKSOURCE_LSE) && (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0x00u)) +#elif defined (RTC_CLOCK_SOURCE_LSI) + if ((PeriphClkInitStruct.RTCClockSelection == RCC_RTCCLKSOURCE_LSI) && (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != 0x00u)) +#elif defined (RTC_CLOCK_SOURCE_HSE) + if ((PeriphClkInitStruct.RTCClockSelection == RCC_RTCCLKSOURCE_HSE_DIV32) && (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0x00u)) +#else +#error Please select the RTC Clock source +#endif /* RTC_CLOCK_SOURCE_LSE */ + { + /* Do nothing */ + } + else + { +#ifdef RTC_CLOCK_SOURCE_LSE + /* Configure LSE as RTC clock source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; +#elif defined (RTC_CLOCK_SOURCE_LSI) + /* Configure LSI as RTC clock source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; +#elif defined (RTC_CLOCK_SOURCE_HSE) + /* Configure HSE as RTC clock source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV32; +#endif /* RTC_CLOCK_SOURCE_LSE */ + + /* Configure oscillator */ + status = HAL_RCC_OscConfig(&RCC_OscInitStruct); + if (status == HAL_OK) + { + /* Configure RTC clock source */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + status = HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); + + /* Enable RTC Clock */ + if(status == HAL_OK) + { + __HAL_RCC_RTC_ENABLE(); + } + } + } + + /* If RTC Clock configuration is ok */ + if (status == HAL_OK) + { + /* The time base is defined to have highest synchronous prescaler but keeping + a 1Hz RTC frequency. */ + hRTC_Handle.Instance = RTC; + hRTC_Handle.Init.HourFormat = RTC_HOURFORMAT_24; + hRTC_Handle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV; + hRTC_Handle.Init.SynchPrediv = RTC_SYNCH_PREDIV; + hRTC_Handle.Init.OutPut = RTC_OUTPUT_DISABLE; + hRTC_Handle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hRTC_Handle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + status = HAL_RTC_Init(&hRTC_Handle); + } + + /* HAL RTC Init is ok & calendar has never been initialized */ + if((status == HAL_OK) && (__HAL_RTC_GET_FLAG(&hRTC_Handle, RTC_FLAG_INITS) == 0x00u)) + { + time.Hours = 0x00u; + time.Minutes = 0x00u; + time.Seconds = 0x00u; + time.TimeFormat = RTC_HOURFORMAT12_PM; + time.SubSeconds = 0x00u; + time.SecondFraction = 0x00u; + time.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + time.StoreOperation = RTC_STOREOPERATION_RESET; + status = HAL_RTC_SetTime(&hRTC_Handle, &time, RTC_FORMAT_BCD); + if(status == HAL_OK) + { + date.WeekDay = RTC_WEEKDAY_MONDAY; + date.Date = 0x01u; + date.Month = RTC_MONTH_JANUARY; + date.Year = 0x01u; + status = HAL_RTC_SetDate(&hRTC_Handle, &date, RTC_FORMAT_BCD); + } + } + + /* If RTC calendar is initialized */ + if (status == HAL_OK) + { + alarm.AlarmTime.Hours = 0x00u; + alarm.AlarmTime.Minutes = 0x00u; + alarm.AlarmTime.Seconds = 0x00u; + alarm.AlarmTime.TimeFormat = RTC_HOURFORMAT12_PM; + alarm.AlarmTime.SubSeconds = (RTC_SYNCH_PREDIV / (1000 / (uint32_t)uwTickFreq)); + alarm.AlarmTime.SecondFraction = 0x00u; + alarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + alarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; + alarm.AlarmMask = RTC_ALARMMASK_ALL; + + /* Depending on input frequency select Subsecond mask */ + if (uwTickFreq == HAL_TICK_FREQ_1KHZ) + { + alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14_5; + } + else if (uwTickFreq == HAL_TICK_FREQ_100HZ) + { + alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14_9; + } + else + { +#if defined (RTC_CLOCK_SOURCE_HSE) + /* When RTCCLK = 1 MHz, need to mask Subsecond register bit 12 to 14 + to have 10 Hhz interrupt */ + alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14_12; +#else + /* When RTCCLK is around 32 kHz, need to mask Subsecond register bit 12 to 11 + to have 10 Hhz interrupt */ + alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14_11; +#endif /* RTC_CLOCK_SOURCE_HSE */ + } + alarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; + alarm.AlarmDateWeekDay = RTC_WEEKDAY_MONDAY; + alarm.Alarm = RTC_ALARM_A; + status = HAL_RTC_SetAlarm_IT(&hRTC_Handle, &alarm, RTC_FORMAT_BCD); + if(status == HAL_OK) + { + /* Enable the RTC global Interrupt */ + HAL_NVIC_EnableIRQ(RTC_TAMP_IRQn); + + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + { + HAL_NVIC_SetPriority(RTC_TAMP_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } + else + { + status = HAL_ERROR; + } + } + } + } + else + { + status = HAL_ERROR; + } + return status; +} + +/** + * @brief Suspend Tick increment. + * @note Disable the tick increment by disabling RTC_ALRA interrupt. + * @retval None + */ +void HAL_SuspendTick(void) +{ + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(&hRTC_Handle); + /* Disable ALARM A Interrupt */ + __HAL_RTC_ALARM_DISABLE_IT(&hRTC_Handle, RTC_IT_ALRA); + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(&hRTC_Handle); +} + +/** + * @brief Resume Tick increment. + * @note Enable the tick increment by Enabling RTC ALARM interrupt. + * @retval None + */ +void HAL_ResumeTick(void) +{ + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(&hRTC_Handle); + /* Enable ALARM A interrupt */ + __HAL_RTC_ALARM_ENABLE_IT(&hRTC_Handle, RTC_IT_ALRA); + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(&hRTC_Handle); +} + +/** + * @brief Alarm Timer Event Callback in non blocking mode + * @note This function is called when RTC Alarm takes place, inside + * HAL_RTC_AlarmIRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param hrtc RTC handle + * @retval None + */ +void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) +{ + HAL_IncTick(); +} + +/** + * @brief This function handles RTC ALARM interrupt request. + * @retval None + */ +void RTC_TAMP_IRQHandler(void) +{ + HAL_RTC_AlarmIRQHandler(&hRTC_Handle); +} + +/** + * @} + */ + +/** + * @} + */ + + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_rtc_wakeup_template.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_rtc_wakeup_template.c new file mode 100644 index 0000000..4f27fba --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_rtc_wakeup_template.c @@ -0,0 +1,303 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_timebase_rtc_wakeup_template.c + * @author MCD Application Team + * @brief HAL time base based on the hardware RTC_WAKEUP Template. + * + * This file overrides the native HAL time base functions (defined as weak) + * to use the RTC WAKEUP for the time base generation: + * + Initializes the RTC peripheral and configures the wakeup timer to be + * incremented each 1ms + * + The wakeup feature is configured to assert an interrupt each 1ms + * + HAL_IncTick is called inside the HAL_RTCEx_WakeUpTimerEventCallback + * + HSE (default), LSE or LSI can be selected as RTC clock source + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + This file must be copied to the application folder and modified as follows: + (#) Rename it to 'stm32g0xx_hal_timebase_rtc_wakeup.c' + (#) Add this file and the RTC HAL drivers to your project and uncomment + HAL_RTC_MODULE_ENABLED define in stm32g0xx_hal_conf.h + + [..] + (@) HAL RTC alarm and HAL RTC wakeup drivers cant be used with low power modes: + The wake up capability of the RTC may be intrusive in case of prior low power mode + configuration requiring different wake up sources. + Application/Example behavior is no more guaranteed + (@) The stm32g0xx_hal_timebase_tim use is recommended for the Applications/Examples + requiring low power modes + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL_TimeBase_RTC_WakeUp_Template HAL TimeBase RTC WakeUp Template + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* Uncomment the line below to select the appropriate RTC Clock source for your application: + + RTC_CLOCK_SOURCE_HSE: can be selected for applications requiring timing precision. + + RTC_CLOCK_SOURCE_LSE: can be selected for applications with low constraint on timing + precision. + + RTC_CLOCK_SOURCE_LSI: can be selected for applications with low constraint on timing + precision. + */ +/* #define RTC_CLOCK_SOURCE_HSE */ +/* #define RTC_CLOCK_SOURCE_LSE */ +#define RTC_CLOCK_SOURCE_LSI + +#if defined (RTC_CLOCK_SOURCE_LSE) +/* LSE Freq = 32.768 kHz RC */ +#define RTC_ASYNCH_PREDIV 0x7Fu +#define RTC_SYNCH_PREDIV 0x00FFu +#elif defined (RTC_CLOCK_SOURCE_LSI) +/* LSI Freq = 32 kHz RC */ +#define RTC_ASYNCH_PREDIV 0x7Fu +#define RTC_SYNCH_PREDIV 0x00FEu +#elif defined (RTC_CLOCK_SOURCE_HSE) +/* HSE Freq as RTCCLK = 8 MHz / 32 = 250 kHz */ +#define RTC_ASYNCH_PREDIV 0x07u /* (8 - 1) */ +#define RTC_SYNCH_PREDIV 0x7A11u /* (31250 -1) */ +#endif /* RTC_CLOCK_SOURCE_LSE */ + + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +RTC_HandleTypeDef hRTC_Handle = {.Init = {0}}; + +/* Private function prototypes -----------------------------------------------*/ +void RTC_TAMP_IRQHandler(void); + +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief This function configures the RTC_TAMP as a time base source. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * Wakeup Time base = ((RTC_ASYNCH_PREDIV + 1) * (RTC_SYNCH_PREDIV + 1)) / RTC_CLOCK + = 1ms + * Wakeup Time = WakeupTimebase * WakeUpCounter (0 + 1) + = 1 ms + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). + * @param TickPriority: Tick interrupt priority. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t wucounter; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that don't take the value zero)*/ + if ((uint32_t)uwTickFreq != 0U) + { + /* Disable backup domain protection */ + HAL_PWR_EnableBkUpAccess(); + + /* Enable RTC APB clock gating */ + __HAL_RCC_RTCAPB_CLK_ENABLE(); + + /* Disable the Wake-up Timer */ + __HAL_RTC_WAKEUPTIMER_DISABLE(&hRTC_Handle); + /* In case of interrupt mode is used, the interrupt source must disabled */ + __HAL_RTC_WAKEUPTIMER_DISABLE_IT(&hRTC_Handle,RTC_IT_WUT); + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hRTC_Handle,RTC_FLAG_WUTF); + + /* Get RTC clock configuration */ + HAL_RCCEx_GetPeriphCLKConfig(&PeriphClkInitStruct); + + /*In case of RTC clock already enable, make sure it's the good one */ +#ifdef RTC_CLOCK_SOURCE_LSE + if ((PeriphClkInitStruct.RTCClockSelection == RCC_RTCCLKSOURCE_LSE) && (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0x00u)) +#elif defined (RTC_CLOCK_SOURCE_LSI) + if ((PeriphClkInitStruct.RTCClockSelection == RCC_RTCCLKSOURCE_LSI) && (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != 0x00u)) +#elif defined (RTC_CLOCK_SOURCE_HSE) + if ((PeriphClkInitStruct.RTCClockSelection == RCC_RTCCLKSOURCE_HSE_DIV32) && (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0x00u)) +#else +#error Please select the RTC Clock source +#endif /* RTC_CLOCK_SOURCE_LSE */ + { + /* Do nothing */ + } + else + { +#ifdef RTC_CLOCK_SOURCE_LSE + /* Configure LSE as RTC clock source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; +#elif defined (RTC_CLOCK_SOURCE_LSI) + /* Configure LSI as RTC clock source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; +#elif defined (RTC_CLOCK_SOURCE_HSE) + /* Configure HSE as RTC clock source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV32; +#endif /* RTC_CLOCK_SOURCE_LSE */ + + /* COnfigure oscillator */ + status = HAL_RCC_OscConfig(&RCC_OscInitStruct); + if(status == HAL_OK) + { + /* Configure RTC clock source */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + status = HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); + + /* Enable RTC Clock */ + if(status == HAL_OK) + { + __HAL_RCC_RTC_ENABLE(); + } + } + } + + /* If RTC Clock configuration is ok */ + if(status == HAL_OK) + { + /* No care of RTC init parameter here. Only needed if RTC is being used + for other features in same time: calendar, alarm, timestamp, etc... */ + hRTC_Handle.Instance = RTC; + hRTC_Handle.Init.HourFormat = RTC_HOURFORMAT_24; + hRTC_Handle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV; + hRTC_Handle.Init.SynchPrediv = RTC_SYNCH_PREDIV; + hRTC_Handle.Init.OutPut = RTC_OUTPUT_DISABLE; + hRTC_Handle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hRTC_Handle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + status = HAL_RTC_Init(&hRTC_Handle); + + if(status == HAL_OK) + { + /* The time base should be of (uint32_t)uwTickFreq) ms. Tick counter + is incremented eachtime wakeup time reaches zero. Wakeup timer is + clocked on RTCCLK divided by 2. So downcounting counter has to be + set to (RTCCLK / 2) / (1000 / (uint32_t)uwTickFreq)) minus 1 */ +#ifdef RTC_CLOCK_SOURCE_LSE + wucounter = LSE_VALUE; +#elif defined (RTC_CLOCK_SOURCE_LSI) + wucounter = LSI_VALUE; +#elif defined (RTC_CLOCK_SOURCE_HSE) + /* HSE input clock to RTC is divided by 32 */ + wucounter = (HSE_VALUE >> 5); +#endif /* RTC_CLOCK_SOURCE_LSE */ + wucounter = ((wucounter >> 1) / (1000U / (uint32_t)uwTickFreq)) -1u; + status = HAL_RTCEx_SetWakeUpTimer_IT(&hRTC_Handle, wucounter, RTC_WAKEUPCLOCK_RTCCLK_DIV2); + + if(status == HAL_OK) + { + /* Enable the RTC global Interrupt */ + + HAL_NVIC_EnableIRQ(RTC_TAMP_IRQn); + + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + { + HAL_NVIC_SetPriority(RTC_TAMP_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } + else + { + status = HAL_ERROR; + } + } + } + } + } + else + { + status = HAL_ERROR; + } + return status; +} + +/** + * @brief Suspend Tick increment. + * @note Disable the tick increment by disabling RTC_TAMP interrupt. + * @retval None + */ +void HAL_SuspendTick(void) +{ + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(&hRTC_Handle); + /* Disable WAKE UP TIMER Interrupt */ + __HAL_RTC_WAKEUPTIMER_DISABLE_IT(&hRTC_Handle, RTC_IT_WUT); + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(&hRTC_Handle); +} + +/** + * @brief Resume Tick increment. + * @note Enable the tick increment by Enabling RTC_TAMP interrupt. + * @retval None + */ +void HAL_ResumeTick(void) +{ + /* Disable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_DISABLE(&hRTC_Handle); + /* Enable WAKE UP TIMER interrupt */ + __HAL_RTC_WAKEUPTIMER_ENABLE_IT(&hRTC_Handle, RTC_IT_WUT); + /* Enable the write protection for RTC registers */ + __HAL_RTC_WRITEPROTECTION_ENABLE(&hRTC_Handle); +} + +/** + * @brief Wake Up Timer Event Callback in non blocking mode + * @note This function is called when RTC_TAMP interrupt took place, inside + * RTC_TAMP_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param hrtc : RTC handle + * @retval None + */ +void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) +{ + HAL_IncTick(); +} + +/** + * @brief This function handles RTC WAKE UP TIMER interrupt request. + * @retval None + */ +void RTC_TAMP_IRQHandler(void) +{ + HAL_RTCEx_WakeUpTimerIRQHandler(&hRTC_Handle); +} + +/** + * @} + */ + +/** + * @} + */ + + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_tim_template.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_tim_template.c new file mode 100644 index 0000000..86b3fa0 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_timebase_tim_template.c @@ -0,0 +1,211 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_timebase_tim_template.c + * @author MCD Application Team + * @brief HAL time base based on the hardware TIM Template. + * + * This file overrides the native HAL time base functions (defined as weak) + * the TIM time base: + * + Initializes the TIM peripheral to generate a Period elapsed Event each 1ms + * + HAL_IncTick is called inside HAL_TIM_PeriodElapsedCallback ie each 1ms + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + This file must be copied to the application folder and modified as follows: + (#) Rename it to 'stm32g0xx_hal_timebase_tim.c' + (#) Add this file and the TIM HAL driver files to your project and make sure + HAL_TIM_MODULE_ENABLED is defined in stm32g0xx_hal_conf.h + + [..] + (@) The application needs to ensure that the time base is always set to 1 millisecond + to have correct HAL operation. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @addtogroup HAL_TimeBase_TIM + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +TIM_HandleTypeDef TimHandle = {.Init = {0}}; + +/* Private function prototypes -----------------------------------------------*/ +void TIM14_IRQHandler(void); +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief This function configures the TIM14 as a time base source. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program + * after reset by HAL_Init() or at any time when clock is configured, + * by HAL_RCC_ClockConfig(). + * @param TickPriority Tick interrupt priority. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + RCC_ClkInitTypeDef clkconfig; + uint32_t uwTimclock; + uint32_t uwAPB1Prescaler; + uint32_t uwPrescalerValue; + uint32_t pFLatency; + HAL_StatusTypeDef status = HAL_OK; + + /* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that don't take the value zero)*/ + if ((uint32_t)uwTickFreq != 0U) + { + /* Enable TIM14 clock */ + __HAL_RCC_TIM14_CLK_ENABLE(); + + /* Get clock configuration */ + HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); + + /* Get APB1 prescaler */ + uwAPB1Prescaler = clkconfig.APB1CLKDivider; + + /* Compute TIM14 clock */ + if (uwAPB1Prescaler == RCC_HCLK_DIV1) + { + uwTimclock = HAL_RCC_GetPCLK1Freq(); + } + else + { + uwTimclock = 2U*HAL_RCC_GetPCLK1Freq(); + } + + /* Compute the prescaler value to have TIM14 counter clock equal to 1MHz */ + uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U); + + /* Initialize TIM14 */ + TimHandle.Instance = TIM14; + + /* Initialize TIMx peripheral as follow: + + Period = [(TIM14CLK/uwTickFreq) - 1]. to have a (1/uwTickFreq) s time base. + + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. + + ClockDivision = 0 + + Counter direction = Up + */ + TimHandle.Init.Period = (1000000U / (1000U / (uint32_t)uwTickFreq)) - 1U; + TimHandle.Init.Prescaler = uwPrescalerValue; + TimHandle.Init.ClockDivision = 0U; + TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; + TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&TimHandle) == HAL_OK) + { + /* Start the TIM time Base generation in interrupt mode */ + if (HAL_TIM_Base_Start_IT(&TimHandle) == HAL_OK) + { + /* Enable the TIM14 global Interrupt */ + HAL_NVIC_EnableIRQ(TIM14_IRQn); + + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + { + /*Configure the TIM14 IRQ priority */ + HAL_NVIC_SetPriority(TIM14_IRQn, TickPriority,0U); + uwTickPrio = TickPriority; + } + else + { + status = HAL_ERROR; + } + } + else + { + status = HAL_ERROR; + } + } + else + { + status = HAL_ERROR; + } + } + else + { + status = HAL_ERROR; + } + + /* Return function status */ + return status; +} + +/** + * @brief Suspend Tick increment. + * @note Disable the tick increment by disabling TIM14 update interrupt. + * @retval None + */ +void HAL_SuspendTick(void) +{ + /* Disable TIM14 update interrupt */ + __HAL_TIM_DISABLE_IT(&TimHandle, TIM_IT_UPDATE); +} + +/** + * @brief Resume Tick increment. + * @note Enable the tick increment by enabling TIM14 update interrupt. + * @retval None + */ +void HAL_ResumeTick(void) +{ + /* Enable TIM14 update interrupt */ + __HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE); +} + +/** + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM14 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + HAL_IncTick(); +} + +/** + * @brief This function handles TIM interrupt request. + * @retval None + */ +void TIM14_IRQHandler(void) +{ + HAL_TIM_IRQHandler(&TimHandle); +} + +/** + * @} + */ + +/** + * @} + */ + + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c new file mode 100644 index 0000000..e3e9e2d --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c @@ -0,0 +1,4700 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_uart.c + * @author MCD Application Team + * @brief UART HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + =============================================================================== + ##### How to use this driver ##### + =============================================================================== + [..] + The UART HAL driver can be used as follows: + + (#) Declare a UART_HandleTypeDef handle structure (eg. UART_HandleTypeDef huart). + (#) Initialize the UART low level resources by implementing the HAL_UART_MspInit() API: + (++) Enable the USARTx interface clock. + (++) UART pins configuration: + (+++) Enable the clock for the UART GPIOs. + (+++) Configure these UART pins as alternate function pull-up. + (++) NVIC configuration if you need to use interrupt process (HAL_UART_Transmit_IT() + and HAL_UART_Receive_IT() APIs): + (+++) Configure the USARTx interrupt priority. + (+++) Enable the NVIC USART IRQ handle. + (++) UART interrupts handling: + -@@- The specific UART interrupts (Transmission complete interrupt, + RXNE interrupt, RX/TX FIFOs related interrupts and Error Interrupts) + are managed using the macros __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT() + inside the transmit and receive processes. + (++) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA() + and HAL_UART_Receive_DMA() APIs): + (+++) Declare a DMA handle structure for the Tx/Rx channel. + (+++) Enable the DMAx interface clock. + (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters. + (+++) Configure the DMA Tx/Rx channel. + (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle. + (+++) Configure the priority and enable the NVIC for the transfer complete + interrupt on the DMA Tx/Rx channel. + + (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Prescaler value , Hardware + flow control and Mode (Receiver/Transmitter) in the huart handle Init structure. + + (#) If required, program UART advanced features (TX/RX pins swap, auto Baud rate detection,...) + in the huart handle AdvancedInit structure. + + (#) For the UART asynchronous mode, initialize the UART registers by calling + the HAL_UART_Init() API. + + (#) For the UART Half duplex mode, initialize the UART registers by calling + the HAL_HalfDuplex_Init() API. + + (#) For the UART LIN (Local Interconnection Network) mode, initialize the UART registers + by calling the HAL_LIN_Init() API. + + (#) For the UART Multiprocessor mode, initialize the UART registers + by calling the HAL_MultiProcessor_Init() API. + + (#) For the UART RS485 Driver Enabled mode, initialize the UART registers + by calling the HAL_RS485Ex_Init() API. + + [..] + (@) These API's (HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init(), HAL_MultiProcessor_Init(), + also configure the low level Hardware GPIO, CLOCK, CORTEX...etc) by + calling the customized HAL_UART_MspInit() API. + + ##### Callback registration ##### + ================================== + + [..] + The compilation define USE_HAL_UART_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_UART_RegisterCallback() to register a user callback. + Function HAL_UART_RegisterCallback() allows to register following callbacks: + (+) TxHalfCpltCallback : Tx Half Complete Callback. + (+) TxCpltCallback : Tx Complete Callback. + (+) RxHalfCpltCallback : Rx Half Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. + (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. + (+) WakeupCallback : Wakeup Callback. + (+) RxFifoFullCallback : Rx Fifo Full Callback. + (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. + (+) MspInitCallback : UART MspInit. + (+) MspDeInitCallback : UART MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + [..] + Use function HAL_UART_UnRegisterCallback() to reset a callback to the default + weak (surcharged) function. + HAL_UART_UnRegisterCallback() takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) TxHalfCpltCallback : Tx Half Complete Callback. + (+) TxCpltCallback : Tx Complete Callback. + (+) RxHalfCpltCallback : Rx Half Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. + (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. + (+) WakeupCallback : Wakeup Callback. + (+) RxFifoFullCallback : Rx Fifo Full Callback. + (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. + (+) MspInitCallback : UART MspInit. + (+) MspDeInitCallback : UART MspDeInit. + + [..] + For specific callback RxEventCallback, use dedicated registration/reset functions: + respectively HAL_UART_RegisterRxEventCallback() , HAL_UART_UnRegisterRxEventCallback(). + + [..] + By default, after the HAL_UART_Init() and when the state is HAL_UART_STATE_RESET + all callbacks are set to the corresponding weak (surcharged) functions: + examples HAL_UART_TxCpltCallback(), HAL_UART_RxHalfCpltCallback(). + Exception done for MspInit and MspDeInit functions that are respectively + reset to the legacy weak (surcharged) functions in the HAL_UART_Init() + and HAL_UART_DeInit() only when these callbacks are null (not registered beforehand). + If not, MspInit or MspDeInit are not null, the HAL_UART_Init() and HAL_UART_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand). + + [..] + Callbacks can be registered/unregistered in HAL_UART_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_UART_STATE_READY or HAL_UART_STATE_RESET state, thus registered (user) + MspInit/DeInit callbacks can be used during the Init/DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_UART_RegisterCallback() before calling HAL_UART_DeInit() + or HAL_UART_Init() function. + + [..] + When The compilation define USE_HAL_UART_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available + and weak (surcharged) callbacks are used. + + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup UART UART + * @brief HAL UART module driver + * @{ + */ + +#ifdef HAL_UART_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup UART_Private_Constants UART Private Constants + * @{ + */ +#define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | \ + USART_CR1_OVER8 | USART_CR1_FIFOEN)) /*!< UART or USART CR1 fields of parameters set by UART_SetConfig API */ + +#define USART_CR3_FIELDS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT | USART_CR3_TXFTCFG | \ + USART_CR3_RXFTCFG)) /*!< UART or USART CR3 fields of parameters set by UART_SetConfig API */ + +#define LPUART_BRR_MIN 0x00000300U /* LPUART BRR minimum authorized value */ +#define LPUART_BRR_MAX 0x000FFFFFU /* LPUART BRR maximum authorized value */ + +#define UART_BRR_MIN 0x10U /* UART BRR minimum authorized value */ +#define UART_BRR_MAX 0x0000FFFFU /* UART BRR maximum authorized value */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup UART_Private_Functions + * @{ + */ +static void UART_EndTxTransfer(UART_HandleTypeDef *huart); +static void UART_EndRxTransfer(UART_HandleTypeDef *huart); +static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); +static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); +static void UART_DMAError(DMA_HandleTypeDef *hdma); +static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma); +static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_TxISR_8BIT(UART_HandleTypeDef *huart); +static void UART_TxISR_16BIT(UART_HandleTypeDef *huart); +static void UART_TxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart); +static void UART_TxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart); +static void UART_EndTransmit_IT(UART_HandleTypeDef *huart); +static void UART_RxISR_8BIT(UART_HandleTypeDef *huart); +static void UART_RxISR_16BIT(UART_HandleTypeDef *huart); +static void UART_RxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart); +static void UART_RxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart); +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup UART_Private_variables + * @{ + */ +const uint16_t UARTPrescTable[12] = {1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U}; +/** + * @} + */ + +/* Exported Constants --------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup UART_Exported_Functions UART Exported Functions + * @{ + */ + +/** @defgroup UART_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim +=============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to initialize the USARTx or the UARTy + in asynchronous mode. + (+) For the asynchronous mode the parameters below can be configured: + (++) Baud Rate + (++) Word Length + (++) Stop Bit + (++) Parity: If the parity is enabled, then the MSB bit of the data written + in the data register is transmitted but is changed by the parity bit. + (++) Hardware flow control + (++) Receiver/transmitter modes + (++) Over Sampling Method + (++) One-Bit Sampling Method + (+) For the asynchronous mode, the following advanced features can be configured as well: + (++) TX and/or RX pin level inversion + (++) data logical level inversion + (++) RX and TX pins swap + (++) RX overrun detection disabling + (++) DMA disabling on RX error + (++) MSB first on communication line + (++) auto Baud rate detection + [..] + The HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init()and HAL_MultiProcessor_Init()API + follow respectively the UART asynchronous, UART Half duplex, UART LIN mode + and UART multiprocessor mode configuration procedures (details for the procedures + are available in reference manual). + +@endverbatim + + Depending on the frame length defined by the M1 and M0 bits (7-bit, + 8-bit or 9-bit), the possible UART formats are listed in the + following table. + + Table 1. UART frame format. + +-----------------------------------------------------------------------+ + | M1 bit | M0 bit | PCE bit | UART frame | + |---------|---------|-----------|---------------------------------------| + | 0 | 0 | 0 | | SB | 8 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 1 | 0 | | SB | 9 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | | + |---------|---------|-----------|---------------------------------------| + | 1 | 0 | 0 | | SB | 7 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | | + +-----------------------------------------------------------------------+ + + * @{ + */ + +/** + * @brief Initialize the UART mode according to the specified + * parameters in the UART_InitTypeDef and initialize the associated handle. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE) + { + /* Check the parameters */ + assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance)); + } + else + { + /* Check the parameters */ + assert_param((IS_UART_INSTANCE(huart->Instance)) || (IS_LPUART_INSTANCE(huart->Instance))); + } + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + if (UART_SetConfig(huart) == HAL_ERROR) + { + return HAL_ERROR; + } + + if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT) + { + UART_AdvFeatureConfig(huart); + } + + /* In asynchronous mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); + + __HAL_UART_ENABLE(huart); + + /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ + return (UART_CheckIdleState(huart)); +} + +/** + * @brief Initialize the half-duplex mode according to the specified + * parameters in the UART_InitTypeDef and creates the associated handle. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check UART instance */ + assert_param(IS_UART_HALFDUPLEX_INSTANCE(huart->Instance)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + if (UART_SetConfig(huart) == HAL_ERROR) + { + return HAL_ERROR; + } + + if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT) + { + UART_AdvFeatureConfig(huart); + } + + /* In half-duplex mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_IREN | USART_CR3_SCEN)); + + /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ + SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL); + + __HAL_UART_ENABLE(huart); + + /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ + return (UART_CheckIdleState(huart)); +} + + +/** + * @brief Initialize the LIN mode according to the specified + * parameters in the UART_InitTypeDef and creates the associated handle. + * @param huart UART handle. + * @param BreakDetectLength Specifies the LIN break detection length. + * This parameter can be one of the following values: + * @arg @ref UART_LINBREAKDETECTLENGTH_10B 10-bit break detection + * @arg @ref UART_LINBREAKDETECTLENGTH_11B 11-bit break detection + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the LIN UART instance */ + assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); + /* Check the Break detection length parameter */ + assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength)); + + /* LIN mode limited to 16-bit oversampling only */ + if (huart->Init.OverSampling == UART_OVERSAMPLING_8) + { + return HAL_ERROR; + } + /* LIN mode limited to 8-bit data length */ + if (huart->Init.WordLength != UART_WORDLENGTH_8B) + { + return HAL_ERROR; + } + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + if (UART_SetConfig(huart) == HAL_ERROR) + { + return HAL_ERROR; + } + + if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT) + { + UART_AdvFeatureConfig(huart); + } + + /* In LIN mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_CLKEN); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN)); + + /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ + SET_BIT(huart->Instance->CR2, USART_CR2_LINEN); + + /* Set the USART LIN Break detection length. */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength); + + __HAL_UART_ENABLE(huart); + + /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ + return (UART_CheckIdleState(huart)); +} + + +/** + * @brief Initialize the multiprocessor mode according to the specified + * parameters in the UART_InitTypeDef and initialize the associated handle. + * @param huart UART handle. + * @param Address UART node address (4-, 6-, 7- or 8-bit long). + * @param WakeUpMethod Specifies the UART wakeup method. + * This parameter can be one of the following values: + * @arg @ref UART_WAKEUPMETHOD_IDLELINE WakeUp by an idle line detection + * @arg @ref UART_WAKEUPMETHOD_ADDRESSMARK WakeUp by an address mark + * @note If the user resorts to idle line detection wake up, the Address parameter + * is useless and ignored by the initialization function. + * @note If the user resorts to address mark wake up, the address length detection + * is configured by default to 4 bits only. For the UART to be able to + * manage 6-, 7- or 8-bit long addresses detection, the API + * HAL_MultiProcessorEx_AddressLength_Set() must be called after + * HAL_MultiProcessor_Init(). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the wake up method parameter */ + assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + if (UART_SetConfig(huart) == HAL_ERROR) + { + return HAL_ERROR; + } + + if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT) + { + UART_AdvFeatureConfig(huart); + } + + /* In multiprocessor mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN, HDSEL and IREN bits in the USART_CR3 register. */ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); + + if (WakeUpMethod == UART_WAKEUPMETHOD_ADDRESSMARK) + { + /* If address mark wake up method is chosen, set the USART address node */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)Address << UART_CR2_ADDRESS_LSB_POS)); + } + + /* Set the wake up method by setting the WAKE bit in the CR1 register */ + MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod); + + __HAL_UART_ENABLE(huart); + + /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ + return (UART_CheckIdleState(huart)); +} + + +/** + * @brief DeInitialize the UART peripheral. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param((IS_UART_INSTANCE(huart->Instance)) || (IS_LPUART_INSTANCE(huart->Instance))); + + huart->gState = HAL_UART_STATE_BUSY; + + __HAL_UART_DISABLE(huart); + + huart->Instance->CR1 = 0x0U; + huart->Instance->CR2 = 0x0U; + huart->Instance->CR3 = 0x0U; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + if (huart->MspDeInitCallback == NULL) + { + huart->MspDeInitCallback = HAL_UART_MspDeInit; + } + /* DeInit the low level hardware */ + huart->MspDeInitCallback(huart); +#else + /* DeInit the low level hardware */ + HAL_UART_MspDeInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_RESET; + huart->RxState = HAL_UART_STATE_RESET; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Initialize the UART MSP. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_MspInit can be implemented in the user file + */ +} + +/** + * @brief DeInitialize the UART MSP. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_MspDeInit can be implemented in the user file + */ +} + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User UART Callback + * To be used instead of the weak predefined callback + * @param huart uart handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID + * @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID + * @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID + * @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID + * @arg @ref HAL_UART_WAKEUP_CB_ID Wakeup Callback ID + * @arg @ref HAL_UART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID + * @arg @ref HAL_UART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID + * @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_READY) + { + switch (CallbackID) + { + case HAL_UART_TX_HALFCOMPLETE_CB_ID : + huart->TxHalfCpltCallback = pCallback; + break; + + case HAL_UART_TX_COMPLETE_CB_ID : + huart->TxCpltCallback = pCallback; + break; + + case HAL_UART_RX_HALFCOMPLETE_CB_ID : + huart->RxHalfCpltCallback = pCallback; + break; + + case HAL_UART_RX_COMPLETE_CB_ID : + huart->RxCpltCallback = pCallback; + break; + + case HAL_UART_ERROR_CB_ID : + huart->ErrorCallback = pCallback; + break; + + case HAL_UART_ABORT_COMPLETE_CB_ID : + huart->AbortCpltCallback = pCallback; + break; + + case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID : + huart->AbortTransmitCpltCallback = pCallback; + break; + + case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID : + huart->AbortReceiveCpltCallback = pCallback; + break; + + case HAL_UART_WAKEUP_CB_ID : + huart->WakeupCallback = pCallback; + break; + + case HAL_UART_RX_FIFO_FULL_CB_ID : + huart->RxFifoFullCallback = pCallback; + break; + + case HAL_UART_TX_FIFO_EMPTY_CB_ID : + huart->TxFifoEmptyCallback = pCallback; + break; + + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = pCallback; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = pCallback; + break; + + default : + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + break; + } + } + else if (huart->gState == HAL_UART_STATE_RESET) + { + switch (CallbackID) + { + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = pCallback; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = pCallback; + break; + + default : + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + break; + } + } + else + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + } + + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Unregister an UART Callback + * UART callaback is redirected to the weak predefined callback + * @param huart uart handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID + * @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID + * @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID + * @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID + * @arg @ref HAL_UART_WAKEUP_CB_ID Wakeup Callback ID + * @arg @ref HAL_UART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID + * @arg @ref HAL_UART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID + * @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + __HAL_LOCK(huart); + + if (HAL_UART_STATE_READY == huart->gState) + { + switch (CallbackID) + { + case HAL_UART_TX_HALFCOMPLETE_CB_ID : + huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + break; + + case HAL_UART_TX_COMPLETE_CB_ID : + huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */ + break; + + case HAL_UART_RX_HALFCOMPLETE_CB_ID : + huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + break; + + case HAL_UART_RX_COMPLETE_CB_ID : + huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */ + break; + + case HAL_UART_ERROR_CB_ID : + huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_UART_ABORT_COMPLETE_CB_ID : + huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + break; + + case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID : + huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak + AbortTransmitCpltCallback */ + break; + + case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID : + huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak + AbortReceiveCpltCallback */ + break; + + case HAL_UART_WAKEUP_CB_ID : + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ + break; + + case HAL_UART_RX_FIFO_FULL_CB_ID : + huart->RxFifoFullCallback = HAL_UARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */ + break; + + case HAL_UART_TX_FIFO_EMPTY_CB_ID : + huart->TxFifoEmptyCallback = HAL_UARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */ + break; + + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */ + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = HAL_UART_MspDeInit; /* Legacy weak MspDeInitCallback */ + break; + + default : + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + break; + } + } + else if (HAL_UART_STATE_RESET == huart->gState) + { + switch (CallbackID) + { + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = HAL_UART_MspInit; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = HAL_UART_MspDeInit; + break; + + default : + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + break; + } + } + else + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + } + + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Register a User UART Rx Event Callback + * To be used instead of the weak predefined callback + * @param huart Uart handle + * @param pCallback Pointer to the Rx Event Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_READY) + { + huart->RxEventCallback = pCallback; + } + else + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief UnRegister the UART Rx Event Callback + * UART Rx Event Callback is redirected to the weak HAL_UARTEx_RxEventCallback() predefined callback + * @param huart Uart handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_READY) + { + huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak UART Rx Event Callback */ + } + else + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(huart); + return status; +} + +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group2 IO operation functions + * @brief UART Transmit/Receive functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + This subsection provides a set of functions allowing to manage the UART asynchronous + and Half duplex data transfers. + + (#) There are two mode of transfer: + (+) Blocking mode: The communication is performed in polling mode. + The HAL status of all data processing is returned by the same function + after finishing transfer. + (+) Non-Blocking mode: The communication is performed using Interrupts + or DMA, These API's return the HAL status. + The end of the data processing will be indicated through the + dedicated UART IRQ when using Interrupt mode or the DMA IRQ when + using DMA mode. + The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks + will be executed respectively at the end of the transmit or Receive process + The HAL_UART_ErrorCallback()user callback will be executed when a communication error is detected + + (#) Blocking mode API's are : + (+) HAL_UART_Transmit() + (+) HAL_UART_Receive() + + (#) Non-Blocking mode API's with Interrupt are : + (+) HAL_UART_Transmit_IT() + (+) HAL_UART_Receive_IT() + (+) HAL_UART_IRQHandler() + + (#) Non-Blocking mode API's with DMA are : + (+) HAL_UART_Transmit_DMA() + (+) HAL_UART_Receive_DMA() + (+) HAL_UART_DMAPause() + (+) HAL_UART_DMAResume() + (+) HAL_UART_DMAStop() + + (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode: + (+) HAL_UART_TxHalfCpltCallback() + (+) HAL_UART_TxCpltCallback() + (+) HAL_UART_RxHalfCpltCallback() + (+) HAL_UART_RxCpltCallback() + (+) HAL_UART_ErrorCallback() + + (#) Non-Blocking mode transfers could be aborted using Abort API's : + (+) HAL_UART_Abort() + (+) HAL_UART_AbortTransmit() + (+) HAL_UART_AbortReceive() + (+) HAL_UART_Abort_IT() + (+) HAL_UART_AbortTransmit_IT() + (+) HAL_UART_AbortReceive_IT() + + (#) For Abort services based on interrupts (HAL_UART_Abortxxx_IT), a set of Abort Complete Callbacks are provided: + (+) HAL_UART_AbortCpltCallback() + (+) HAL_UART_AbortTransmitCpltCallback() + (+) HAL_UART_AbortReceiveCpltCallback() + + (#) A Rx Event Reception Callback (Rx event notification) is available for Non_Blocking modes of enhanced + reception services: + (+) HAL_UARTEx_RxEventCallback() + + (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. + Errors are handled as follows : + (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is + to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error + in Interrupt mode reception . + Received character is then retrieved and stored in Rx buffer, Error code is set to allow user + to identify error type, and HAL_UART_ErrorCallback() user callback is executed. + Transfer is kept ongoing on UART side. + If user wants to abort it, Abort services should be called by user. + (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted. + This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode. + Error code is set to allow user to identify error type, and HAL_UART_ErrorCallback() + user callback is executed. + + -@- In the Half duplex communication, it is forbidden to run the transmit + and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful. + +@endverbatim + * @{ + */ + +/** + * @brief Send an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @note When FIFO mode is enabled, writing a data in the TDR register adds one + * data to the TXFIFO. Write operations to the TDR register are performed + * when TXFNF flag is set. From hardware perspective, TXFNF flag and + * TXE are mapped on the same bit-field. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits) + * (as sent data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + const uint8_t *pdata8bits; + const uint16_t *pdata16bits; + uint32_t tickstart; + + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a u16 frontier, as data to be filled into TDR will be + handled through a u16 cast. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->TxXferSize = Size; + huart->TxXferCount = Size; + + /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (const uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + while (huart->TxXferCount > 0U) + { + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + if (pdata8bits == NULL) + { + huart->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU); + pdata16bits++; + } + else + { + huart->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU); + pdata8bits++; + } + huart->TxXferCount--; + } + + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + + /* At end of Tx process, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @note When FIFO mode is enabled, the RXFNE flag is set as long as the RXFIFO + * is not empty. Read operations from the RDR register are performed when + * RXFNE flag is set. From hardware perspective, RXFNE flag and + * RXNE are mapped on the same bit-field. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on a half word frontier + * (16 bits) (as received data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint8_t *pdata8bits; + uint16_t *pdata16bits; + uint16_t uhMask; + uint32_t tickstart; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a u16 frontier, as data to be received from RDR will be + handled through a u16 cast. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->RxXferSize = Size; + huart->RxXferCount = Size; + + /* Computation of UART mask to apply to RDR register */ + UART_MASK_COMPUTATION(huart); + uhMask = huart->Mask; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + /* as long as data have to be received */ + while (huart->RxXferCount > 0U) + { + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + if (pdata8bits == NULL) + { + *pdata16bits = (uint16_t)(huart->Instance->RDR & uhMask); + pdata16bits++; + } + else + { + *pdata8bits = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask); + pdata8bits++; + } + huart->RxXferCount--; + } + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Send an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits) + * (as sent data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) +{ + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a u16 frontier, as data to be filled into TDR will be + handled through a u16 cast. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + huart->pTxBuffPtr = pData; + huart->TxXferSize = Size; + huart->TxXferCount = Size; + huart->TxISR = NULL; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + /* Configure Tx interrupt processing */ + if (huart->FifoMode == UART_FIFOMODE_ENABLE) + { + /* Set the Tx ISR function pointer according to the data word length */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + huart->TxISR = UART_TxISR_16BIT_FIFOEN; + } + else + { + huart->TxISR = UART_TxISR_8BIT_FIFOEN; + } + + /* Enable the TX FIFO threshold interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_TXFTIE); + } + else + { + /* Set the Tx ISR function pointer according to the data word length */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + huart->TxISR = UART_TxISR_16BIT; + } + else + { + huart->TxISR = UART_TxISR_8BIT; + } + + /* Enable the Transmit Data Register Empty interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on a half word frontier + * (16 bits) (as received data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a u16 frontier, as data to be received from RDR will be + handled through a u16 cast. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Set Reception type to Standard reception */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + if (!(IS_LPUART_INSTANCE(huart->Instance))) + { + /* Check that USART RTOEN bit is set */ + if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U) + { + /* Enable the UART Receiver Timeout Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RTOIE); + } + } + + return (UART_Start_Receive_IT(huart, pData, Size)); + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Send an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits) + * (as sent data will be handled by DMA from halfword frontier). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) +{ + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a u16 frontier, as data copy into TDR will be + handled by DMA from a u16 frontier. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + huart->pTxBuffPtr = pData; + huart->TxXferSize = Size; + huart->TxXferCount = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + if (huart->hdmatx != NULL) + { + /* Set the UART DMA transfer complete callback */ + huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt; + + /* Set the UART DMA Half transfer complete callback */ + huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt; + + /* Set the DMA error callback */ + huart->hdmatx->XferErrorCallback = UART_DMAError; + + /* Set the DMA abort callback */ + huart->hdmatx->XferAbortCallback = NULL; + + /* Enable the UART transmit DMA channel */ + if (HAL_DMA_Start_IT(huart->hdmatx, (uint32_t)huart->pTxBuffPtr, (uint32_t)&huart->Instance->TDR, Size) != HAL_OK) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + /* Restore huart->gState to ready */ + huart->gState = HAL_UART_STATE_READY; + + return HAL_ERROR; + } + } + /* Clear the TC flag in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF); + + /* Enable the DMA transfer for transmit request by setting the DMAT bit + in the UART CR3 register */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in DMA mode. + * @note When the UART parity is enabled (PCE = 1), the received data contain + * the parity bit (MSB position). + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on a half word frontier + * (16 bits) (as received data will be handled by DMA from halfword frontier). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a u16 frontier, as data copy from RDR will be + handled by DMA from a u16 frontier. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Set Reception type to Standard reception */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + if (!(IS_LPUART_INSTANCE(huart->Instance))) + { + /* Check that USART RTOEN bit is set */ + if (READ_BIT(huart->Instance->CR2, USART_CR2_RTOEN) != 0U) + { + /* Enable the UART Receiver Timeout Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RTOIE); + } + } + + return (UART_Start_Receive_DMA(huart, pData, Size)); + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Pause the DMA Transfer. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) +{ + const HAL_UART_StateTypeDef gstate = huart->gState; + const HAL_UART_StateTypeDef rxstate = huart->RxState; + + if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) && + (gstate == HAL_UART_STATE_BUSY_TX)) + { + /* Disable the UART DMA Tx request */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + } + if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) && + (rxstate == HAL_UART_STATE_BUSY_RX)) + { + /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the UART DMA Rx request */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + } + + return HAL_OK; +} + +/** + * @brief Resume the DMA Transfer. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + /* Enable the UART DMA Tx request */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT); + } + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + /* Clear the Overrun flag before resuming the Rx transfer */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF); + + /* Re-enable PE and ERR (Frame error, noise error, overrun error) interrupts */ + if (huart->Init.Parity != UART_PARITY_NONE) + { + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); + } + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Enable the UART DMA Rx request */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); + } + + return HAL_OK; +} + +/** + * @brief Stop the DMA Transfer. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) +{ + /* The Lock is not implemented on this API to allow the user application + to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() / + HAL_UART_TxHalfCpltCallback / HAL_UART_RxHalfCpltCallback: + indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete + interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of + the stream and the corresponding call back is executed. */ + + const HAL_UART_StateTypeDef gstate = huart->gState; + const HAL_UART_StateTypeDef rxstate = huart->RxState; + + /* Stop UART DMA Tx request if ongoing */ + if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) && + (gstate == HAL_UART_STATE_BUSY_TX)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx channel */ + if (huart->hdmatx != NULL) + { + if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + + UART_EndTxTransfer(huart); + } + + /* Stop UART DMA Rx request if ongoing */ + if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) && + (rxstate == HAL_UART_STATE_BUSY_RX)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx channel */ + if (huart->hdmarx != NULL) + { + if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + + UART_EndRxTransfer(huart); + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfers (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) +{ + /* Disable TXE, TC, RXNE, PE, RXFT, TXFT and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | + USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Abort the UART DMA Tx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable the UART DMA Tx request if enabled */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Abort the UART DMA Rx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable the UART DMA Rx request if enabled */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx and Rx transfer counters */ + huart->TxXferCount = 0U; + huart->RxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF); + + /* Flush the whole TX FIFO (if needed) */ + if (huart->FifoMode == UART_FIFOMODE_ENABLE) + { + __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST); + } + + /* Discard the received data */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + + return HAL_OK; +} + +/** + * @brief Abort ongoing Transmit transfer (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) +{ + /* Disable TCIE, TXEIE and TXFTIE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TCIE | USART_CR1_TXEIE_TXFNFIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE); + + /* Abort the UART DMA Tx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable the UART DMA Tx request if enabled */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx transfer counter */ + huart->TxXferCount = 0U; + + /* Flush the whole TX FIFO (if needed) */ + if (huart->FifoMode == UART_FIFOMODE_ENABLE) + { + __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST); + } + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Abort ongoing Receive transfer (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) +{ + /* Disable PEIE, EIE, RXNEIE and RXFTIE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE | USART_CR3_RXFTIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Abort the UART DMA Rx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable the UART DMA Rx request if enabled */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Rx transfer counter */ + huart->RxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF); + + /* Discard the received data */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfers (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) +{ + uint32_t abortcplt = 1U; + + /* Disable interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_TCIE | USART_CR1_RXNEIE_RXFNEIE | + USART_CR1_TXEIE_TXFNFIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised + before any call to DMA Abort functions */ + /* DMA Tx Handle is valid */ + if (huart->hdmatx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + huart->hdmatx->XferAbortCallback = UART_DMATxAbortCallback; + } + else + { + huart->hdmatx->XferAbortCallback = NULL; + } + } + /* DMA Rx Handle is valid */ + if (huart->hdmarx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + huart->hdmarx->XferAbortCallback = UART_DMARxAbortCallback; + } + else + { + huart->hdmarx->XferAbortCallback = NULL; + } + } + + /* Abort the UART DMA Tx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable DMA Tx at UART level */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */ + if (huart->hdmatx != NULL) + { + /* UART Tx DMA Abort callback has already been initialised : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK) + { + huart->hdmatx->XferAbortCallback = NULL; + } + else + { + abortcplt = 0U; + } + } + } + + /* Abort the UART DMA Rx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable the UART DMA Rx request if enabled */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx channel : use non blocking DMA Abort API (callback) */ + if (huart->hdmarx != NULL) + { + /* UART Rx DMA Abort callback has already been initialised : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + huart->hdmarx->XferAbortCallback = NULL; + abortcplt = 1U; + } + else + { + abortcplt = 0U; + } + } + } + + /* if no DMA abort complete callback execution is required => call user Abort Complete callback */ + if (abortcplt == 1U) + { + /* Reset Tx and Rx transfer counters */ + huart->TxXferCount = 0U; + huart->RxXferCount = 0U; + + /* Clear ISR function pointers */ + huart->RxISR = NULL; + huart->TxISR = NULL; + + /* Reset errorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF); + + /* Flush the whole TX FIFO (if needed) */ + if (huart->FifoMode == UART_FIFOMODE_ENABLE) + { + __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST); + } + + /* Discard the received data */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing Transmit transfer (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) +{ + /* Disable interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TCIE | USART_CR1_TXEIE_TXFNFIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE); + + /* Abort the UART DMA Tx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable the UART DMA Tx request if enabled */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = UART_DMATxOnlyAbortCallback; + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK) + { + /* Call Directly huart->hdmatx->XferAbortCallback function in case of error */ + huart->hdmatx->XferAbortCallback(huart->hdmatx); + } + } + else + { + /* Reset Tx transfer counter */ + huart->TxXferCount = 0U; + + /* Clear TxISR function pointers */ + huart->TxISR = NULL; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Reset Tx transfer counter */ + huart->TxXferCount = 0U; + + /* Clear TxISR function pointers */ + huart->TxISR = NULL; + + /* Flush the whole TX FIFO (if needed) */ + if (huart->FifoMode == UART_FIFOMODE_ENABLE) + { + __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST); + } + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing Receive transfer (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Abort the UART DMA Rx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable the UART DMA Rx request if enabled */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx channel : use non blocking DMA Abort API (callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = UART_DMARxOnlyAbortCallback; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */ + huart->hdmarx->XferAbortCallback(huart->hdmarx); + } + } + else + { + /* Reset Rx transfer counter */ + huart->RxXferCount = 0U; + + /* Clear RxISR function pointer */ + huart->pRxBuffPtr = NULL; + + /* Clear the Error flags in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF); + + /* Discard the received data */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Reset Rx transfer counter */ + huart->RxXferCount = 0U; + + /* Clear RxISR function pointer */ + huart->pRxBuffPtr = NULL; + + /* Clear the Error flags in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF); + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief Handle UART interrupt request. + * @param huart UART handle. + * @retval None + */ +void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) +{ + uint32_t isrflags = READ_REG(huart->Instance->ISR); + uint32_t cr1its = READ_REG(huart->Instance->CR1); + uint32_t cr3its = READ_REG(huart->Instance->CR3); + + uint32_t errorflags; + uint32_t errorcode; + + /* If no error occurs */ + errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF)); + if (errorflags == 0U) + { + /* UART in mode Receiver ---------------------------------------------------*/ + if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) + || ((cr3its & USART_CR3_RXFTIE) != 0U))) + { + if (huart->RxISR != NULL) + { + huart->RxISR(huart); + } + return; + } + } + + /* If some errors occur */ + if ((errorflags != 0U) + && ((((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U) + || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_RTOIE)) != 0U)))) + { + /* UART parity error interrupt occurred -------------------------------------*/ + if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF); + + huart->ErrorCode |= HAL_UART_ERROR_PE; + } + + /* UART frame error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF); + + huart->ErrorCode |= HAL_UART_ERROR_FE; + } + + /* UART noise error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF); + + huart->ErrorCode |= HAL_UART_ERROR_NE; + } + + /* UART Over-Run interrupt occurred -----------------------------------------*/ + if (((isrflags & USART_ISR_ORE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || + ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U))) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF); + + huart->ErrorCode |= HAL_UART_ERROR_ORE; + } + + /* UART Receiver Timeout interrupt occurred ---------------------------------*/ + if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + huart->ErrorCode |= HAL_UART_ERROR_RTO; + } + + /* Call UART Error Call back function if need be ----------------------------*/ + if (huart->ErrorCode != HAL_UART_ERROR_NONE) + { + /* UART in mode Receiver --------------------------------------------------*/ + if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) + || ((cr3its & USART_CR3_RXFTIE) != 0U))) + { + if (huart->RxISR != NULL) + { + huart->RxISR(huart); + } + } + + /* If Error is to be considered as blocking : + - Receiver Timeout error in Reception + - Overrun error in Reception + - any error occurs in DMA mode reception + */ + errorcode = huart->ErrorCode; + if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) || + ((errorcode & (HAL_UART_ERROR_RTO | HAL_UART_ERROR_ORE)) != 0U)) + { + /* Blocking error : transfer is aborted + Set the UART state ready to be able to start again the process, + Disable Rx Interrupts, and disable Rx DMA request, if ongoing */ + UART_EndRxTransfer(huart); + + /* Abort the UART DMA Rx channel if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable the UART DMA Rx request if enabled */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx channel */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */ + huart->hdmarx->XferAbortCallback(huart->hdmarx); + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Non Blocking error : transfer could go on. + Error is notified to user through user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + } + } + return; + + } /* End if some error occurs */ + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if ((huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + && ((isrflags & USART_ISR_IDLE) != 0U) + && ((cr1its & USART_ISR_IDLE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); + + /* Check if DMA mode is enabled in UART */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + /* DMA mode enabled */ + /* Check received length : If all expected data are received, do nothing, + (DMA cplt callback will be called). + Otherwise, if at least one data has already been received, IDLE event is to be notified to user */ + uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx); + if ((nb_remaining_rx_data > 0U) + && (nb_remaining_rx_data < huart->RxXferSize)) + { + /* Reception is not complete */ + huart->RxXferCount = nb_remaining_rx_data; + + /* In Normal mode, end DMA xfer and HAL UART Rx process*/ + if (HAL_IS_BIT_CLR(huart->hdmarx->Instance->CCR, DMA_CCR_CIRC)) + { + /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the DMA transfer for the receiver request by resetting the DMAR bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + /* Last bytes received, so no need as the abort is immediate */ + (void)HAL_DMA_Abort(huart->hdmarx); + } + + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Idle Event */ + huart->RxEventType = HAL_UART_RXEVENT_IDLE; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount)); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount)); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + return; + } + else + { + /* DMA mode not enabled */ + /* Check received length : If all expected data are received, do nothing. + Otherwise, if at least one data has already been received, IDLE event is to be notified to user */ + uint16_t nb_rx_data = huart->RxXferSize - huart->RxXferCount; + if ((huart->RxXferCount > 0U) + && (nb_rx_data > 0U)) + { + /* Disable the UART Parity Error Interrupt and RXNE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); + + /* Disable the UART Error Interrupt:(Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Clear RxISR function pointer */ + huart->RxISR = NULL; + + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Idle Event */ + huart->RxEventType = HAL_UART_RXEVENT_IDLE; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxEventCallback(huart, nb_rx_data); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, nb_rx_data); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + return; + } + } + + /* UART wakeup from Stop mode interrupt occurred ---------------------------*/ + if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF); + + /* UART Rx state is not reset as a reception process might be ongoing. + If UART handle state fields need to be reset to READY, this could be done in Wakeup callback */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Wakeup Callback */ + huart->WakeupCallback(huart); +#else + /* Call legacy weak Wakeup Callback */ + HAL_UARTEx_WakeupCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + return; + } + + /* UART in mode Transmitter ------------------------------------------------*/ + if (((isrflags & USART_ISR_TXE_TXFNF) != 0U) + && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U) + || ((cr3its & USART_CR3_TXFTIE) != 0U))) + { + if (huart->TxISR != NULL) + { + huart->TxISR(huart); + } + return; + } + + /* UART in mode Transmitter (transmission end) -----------------------------*/ + if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U)) + { + UART_EndTransmit_IT(huart); + return; + } + + /* UART TX Fifo Empty occurred ----------------------------------------------*/ + if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U)) + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Fifo Empty Callback */ + huart->TxFifoEmptyCallback(huart); +#else + /* Call legacy weak Tx Fifo Empty Callback */ + HAL_UARTEx_TxFifoEmptyCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + return; + } + + /* UART RX Fifo Full occurred ----------------------------------------------*/ + if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U)) + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Fifo Full Callback */ + huart->RxFifoFullCallback(huart); +#else + /* Call legacy weak Rx Fifo Full Callback */ + HAL_UARTEx_RxFifoFullCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + return; + } +} + +/** + * @brief Tx Transfer completed callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_TxCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Tx Half Transfer completed callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_TxHalfCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Rx Transfer completed callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_RxCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Rx Half Transfer completed callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_RxHalfCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief UART error callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_ErrorCallback can be implemented in the user file. + */ +} + +/** + * @brief UART Abort Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief UART Abort Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief UART Abort Receive Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Reception Event Callback (Rx event notification called after use of advanced reception service). + * @param huart UART handle + * @param Size Number of data available in application reception buffer (indicates a position in + * reception buffer until which, data are available) + * @retval None + */ +__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + UNUSED(Size); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_RxEventCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group3 Peripheral Control functions + * @brief UART control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the UART. + (+) HAL_UART_ReceiverTimeout_Config() API allows to configure the receiver timeout value on the fly + (+) HAL_UART_EnableReceiverTimeout() API enables the receiver timeout feature + (+) HAL_UART_DisableReceiverTimeout() API disables the receiver timeout feature + (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode + (+) HAL_MultiProcessor_DisableMuteMode() API disables mute mode + (+) HAL_MultiProcessor_EnterMuteMode() API enters mute mode + (+) UART_SetConfig() API configures the UART peripheral + (+) UART_AdvFeatureConfig() API optionally configures the UART advanced features + (+) UART_CheckIdleState() API ensures that TEACK and/or REACK are set after initialization + (+) HAL_HalfDuplex_EnableTransmitter() API disables receiver and enables transmitter + (+) HAL_HalfDuplex_EnableReceiver() API disables transmitter and enables receiver + (+) HAL_LIN_SendBreak() API transmits the break characters +@endverbatim + * @{ + */ + +/** + * @brief Update on the fly the receiver timeout value in RTOR register. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param TimeoutValue receiver timeout value in number of baud blocks. The timeout + * value must be less or equal to 0x0FFFFFFFF. + * @retval None + */ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue) +{ + if (!(IS_LPUART_INSTANCE(huart->Instance))) + { + assert_param(IS_UART_RECEIVER_TIMEOUT_VALUE(TimeoutValue)); + MODIFY_REG(huart->Instance->RTOR, USART_RTOR_RTO, TimeoutValue); + } +} + +/** + * @brief Enable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (!(IS_LPUART_INSTANCE(huart->Instance))) + { + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Set the USART RTOEN bit */ + SET_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Disable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (!(IS_LPUART_INSTANCE(huart->Instance))) + { + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Clear the USART RTOEN bit */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Enable UART in mute mode (does not mean UART enters mute mode; + * to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called). + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) +{ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Enable USART mute mode by setting the MME bit in the CR1 register */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_MME); + + huart->gState = HAL_UART_STATE_READY; + + return (UART_CheckIdleState(huart)); +} + +/** + * @brief Disable UART mute mode (does not mean the UART actually exits mute mode + * as it may not have been in mute mode at this very moment). + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart) +{ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable USART mute mode by clearing the MME bit in the CR1 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_MME); + + huart->gState = HAL_UART_STATE_READY; + + return (UART_CheckIdleState(huart)); +} + +/** + * @brief Enter UART mute mode (means UART actually enters mute mode). + * @note To exit from mute mode, HAL_MultiProcessor_DisableMuteMode() API must be called. + * @param huart UART handle. + * @retval None + */ +void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) +{ + __HAL_UART_SEND_REQ(huart, UART_MUTE_MODE_REQUEST); +} + +/** + * @brief Enable the UART transmitter and disable the UART receiver. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) +{ + __HAL_LOCK(huart); + huart->gState = HAL_UART_STATE_BUSY; + + /* Clear TE and RE bits */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE)); + + /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TE); + + huart->gState = HAL_UART_STATE_READY; + + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Enable the UART receiver and disable the UART transmitter. + * @param huart UART handle. + * @retval HAL status. + */ +HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) +{ + __HAL_LOCK(huart); + huart->gState = HAL_UART_STATE_BUSY; + + /* Clear TE and RE bits */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE)); + + /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RE); + + huart->gState = HAL_UART_STATE_READY; + + __HAL_UNLOCK(huart); + + return HAL_OK; +} + + +/** + * @brief Transmit break characters. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) +{ + /* Check the parameters */ + assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); + + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Send break characters */ + __HAL_UART_SEND_REQ(huart, UART_SENDBREAK_REQUEST); + + huart->gState = HAL_UART_STATE_READY; + + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group4 Peripheral State and Error functions + * @brief UART Peripheral State functions + * +@verbatim + ============================================================================== + ##### Peripheral State and Error functions ##### + ============================================================================== + [..] + This subsection provides functions allowing to : + (+) Return the UART handle state. + (+) Return the UART handle error code + +@endverbatim + * @{ + */ + +/** + * @brief Return the UART handle state. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART. + * @retval HAL state + */ +HAL_UART_StateTypeDef HAL_UART_GetState(const UART_HandleTypeDef *huart) +{ + uint32_t temp1; + uint32_t temp2; + temp1 = huart->gState; + temp2 = huart->RxState; + + return (HAL_UART_StateTypeDef)(temp1 | temp2); +} + +/** + * @brief Return the UART handle error code. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART. + * @retval UART Error Code + */ +uint32_t HAL_UART_GetError(const UART_HandleTypeDef *huart) +{ + return huart->ErrorCode; +} +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup UART_Private_Functions UART Private Functions + * @{ + */ + +/** + * @brief Initialize the callbacks to their default values. + * @param huart UART handle. + * @retval none + */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart) +{ + /* Init the UART Callback settings */ + huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */ + huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */ + huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */ + huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ + huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ + huart->RxFifoFullCallback = HAL_UARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */ + huart->TxFifoEmptyCallback = HAL_UARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */ + huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak RxEventCallback */ + +} +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @brief Configure the UART peripheral. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) +{ + uint32_t tmpreg; + uint16_t brrtemp; + UART_ClockSourceTypeDef clocksource; + uint32_t usartdiv; + HAL_StatusTypeDef ret = HAL_OK; + uint32_t lpuart_ker_ck_pres; + uint32_t pclk; + + /* Check the parameters */ + assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); + assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); + if (UART_INSTANCE_LOWPOWER(huart)) + { + assert_param(IS_LPUART_STOPBITS(huart->Init.StopBits)); + } + else + { + assert_param(IS_UART_STOPBITS(huart->Init.StopBits)); + assert_param(IS_UART_ONE_BIT_SAMPLE(huart->Init.OneBitSampling)); + } + + assert_param(IS_UART_PARITY(huart->Init.Parity)); + assert_param(IS_UART_MODE(huart->Init.Mode)); + assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); + assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); + assert_param(IS_UART_PRESCALER(huart->Init.ClockPrescaler)); + + /*-------------------------- USART CR1 Configuration -----------------------*/ + /* Clear M, PCE, PS, TE, RE and OVER8 bits and configure + * the UART Word Length, Parity, Mode and oversampling: + * set the M bits according to huart->Init.WordLength value + * set PCE and PS bits according to huart->Init.Parity value + * set TE and RE bits according to huart->Init.Mode value + * set OVER8 bit according to huart->Init.OverSampling value */ + tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ; + MODIFY_REG(huart->Instance->CR1, USART_CR1_FIELDS, tmpreg); + + /*-------------------------- USART CR2 Configuration -----------------------*/ + /* Configure the UART Stop Bits: Set STOP[13:12] bits according + * to huart->Init.StopBits value */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits); + + /*-------------------------- USART CR3 Configuration -----------------------*/ + /* Configure + * - UART HardWare Flow Control: set CTSE and RTSE bits according + * to huart->Init.HwFlowCtl value + * - one-bit sampling method versus three samples' majority rule according + * to huart->Init.OneBitSampling (not applicable to LPUART) */ + tmpreg = (uint32_t)huart->Init.HwFlowCtl; + + if (!(UART_INSTANCE_LOWPOWER(huart))) + { + tmpreg |= huart->Init.OneBitSampling; + } + MODIFY_REG(huart->Instance->CR3, USART_CR3_FIELDS, tmpreg); + + /*-------------------------- USART PRESC Configuration -----------------------*/ + /* Configure + * - UART Clock Prescaler : set PRESCALER according to huart->Init.ClockPrescaler value */ + MODIFY_REG(huart->Instance->PRESC, USART_PRESC_PRESCALER, huart->Init.ClockPrescaler); + + /*-------------------------- USART BRR Configuration -----------------------*/ + UART_GETCLOCKSOURCE(huart, clocksource); + + /* Check LPUART instance */ + if (UART_INSTANCE_LOWPOWER(huart)) + { + /* Retrieve frequency clock */ + switch (clocksource) + { + case UART_CLOCKSOURCE_PCLK1: + pclk = HAL_RCC_GetPCLK1Freq(); + break; + case UART_CLOCKSOURCE_HSI: + pclk = (uint32_t) HSI_VALUE; + break; + case UART_CLOCKSOURCE_SYSCLK: + pclk = HAL_RCC_GetSysClockFreq(); + break; + case UART_CLOCKSOURCE_LSE: + pclk = (uint32_t) LSE_VALUE; + break; + default: + pclk = 0U; + ret = HAL_ERROR; + break; + } + + /* If proper clock source reported */ + if (pclk != 0U) + { + /* Compute clock after Prescaler */ + lpuart_ker_ck_pres = (pclk / UARTPrescTable[huart->Init.ClockPrescaler]); + + /* Ensure that Frequency clock is in the range [3 * baudrate, 4096 * baudrate] */ + if ((lpuart_ker_ck_pres < (3U * huart->Init.BaudRate)) || + (lpuart_ker_ck_pres > (4096U * huart->Init.BaudRate))) + { + ret = HAL_ERROR; + } + else + { + /* Check computed UsartDiv value is in allocated range + (it is forbidden to write values lower than 0x300 in the LPUART_BRR register) */ + usartdiv = (uint32_t)(UART_DIV_LPUART(pclk, huart->Init.BaudRate, huart->Init.ClockPrescaler)); + if ((usartdiv >= LPUART_BRR_MIN) && (usartdiv <= LPUART_BRR_MAX)) + { + huart->Instance->BRR = usartdiv; + } + else + { + ret = HAL_ERROR; + } + } /* if ( (lpuart_ker_ck_pres < (3 * huart->Init.BaudRate) ) || + (lpuart_ker_ck_pres > (4096 * huart->Init.BaudRate) )) */ + } /* if (pclk != 0) */ + } + /* Check UART Over Sampling to set Baud Rate Register */ + else if (huart->Init.OverSampling == UART_OVERSAMPLING_8) + { + switch (clocksource) + { + case UART_CLOCKSOURCE_PCLK1: + pclk = HAL_RCC_GetPCLK1Freq(); + break; + case UART_CLOCKSOURCE_HSI: + pclk = (uint32_t) HSI_VALUE; + break; + case UART_CLOCKSOURCE_SYSCLK: + pclk = HAL_RCC_GetSysClockFreq(); + break; + case UART_CLOCKSOURCE_LSE: + pclk = (uint32_t) LSE_VALUE; + break; + default: + pclk = 0U; + ret = HAL_ERROR; + break; + } + + /* USARTDIV must be greater than or equal to 0d16 */ + if (pclk != 0U) + { + usartdiv = (uint32_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate, huart->Init.ClockPrescaler)); + if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX)) + { + brrtemp = (uint16_t)(usartdiv & 0xFFF0U); + brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U); + huart->Instance->BRR = brrtemp; + } + else + { + ret = HAL_ERROR; + } + } + } + else + { + switch (clocksource) + { + case UART_CLOCKSOURCE_PCLK1: + pclk = HAL_RCC_GetPCLK1Freq(); + break; + case UART_CLOCKSOURCE_HSI: + pclk = (uint32_t) HSI_VALUE; + break; + case UART_CLOCKSOURCE_SYSCLK: + pclk = HAL_RCC_GetSysClockFreq(); + break; + case UART_CLOCKSOURCE_LSE: + pclk = (uint32_t) LSE_VALUE; + break; + default: + pclk = 0U; + ret = HAL_ERROR; + break; + } + + if (pclk != 0U) + { + /* USARTDIV must be greater than or equal to 0d16 */ + usartdiv = (uint32_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate, huart->Init.ClockPrescaler)); + if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX)) + { + huart->Instance->BRR = (uint16_t)usartdiv; + } + else + { + ret = HAL_ERROR; + } + } + } + + /* Initialize the number of data to process during RX/TX ISR execution */ + huart->NbTxDataToProcess = 1; + huart->NbRxDataToProcess = 1; + + /* Clear ISR function pointers */ + huart->RxISR = NULL; + huart->TxISR = NULL; + + return ret; +} + +/** + * @brief Configure the UART peripheral advanced features. + * @param huart UART handle. + * @retval None + */ +void UART_AdvFeatureConfig(UART_HandleTypeDef *huart) +{ + /* Check whether the set of advanced features to configure is properly set */ + assert_param(IS_UART_ADVFEATURE_INIT(huart->AdvancedInit.AdvFeatureInit)); + + /* if required, configure TX pin active level inversion */ + if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_TXINVERT_INIT)) + { + assert_param(IS_UART_ADVFEATURE_TXINV(huart->AdvancedInit.TxPinLevelInvert)); + MODIFY_REG(huart->Instance->CR2, USART_CR2_TXINV, huart->AdvancedInit.TxPinLevelInvert); + } + + /* if required, configure RX pin active level inversion */ + if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXINVERT_INIT)) + { + assert_param(IS_UART_ADVFEATURE_RXINV(huart->AdvancedInit.RxPinLevelInvert)); + MODIFY_REG(huart->Instance->CR2, USART_CR2_RXINV, huart->AdvancedInit.RxPinLevelInvert); + } + + /* if required, configure data inversion */ + if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DATAINVERT_INIT)) + { + assert_param(IS_UART_ADVFEATURE_DATAINV(huart->AdvancedInit.DataInvert)); + MODIFY_REG(huart->Instance->CR2, USART_CR2_DATAINV, huart->AdvancedInit.DataInvert); + } + + /* if required, configure RX/TX pins swap */ + if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_SWAP_INIT)) + { + assert_param(IS_UART_ADVFEATURE_SWAP(huart->AdvancedInit.Swap)); + MODIFY_REG(huart->Instance->CR2, USART_CR2_SWAP, huart->AdvancedInit.Swap); + } + + /* if required, configure RX overrun detection disabling */ + if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXOVERRUNDISABLE_INIT)) + { + assert_param(IS_UART_OVERRUN(huart->AdvancedInit.OverrunDisable)); + MODIFY_REG(huart->Instance->CR3, USART_CR3_OVRDIS, huart->AdvancedInit.OverrunDisable); + } + + /* if required, configure DMA disabling on reception error */ + if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DMADISABLEONERROR_INIT)) + { + assert_param(IS_UART_ADVFEATURE_DMAONRXERROR(huart->AdvancedInit.DMADisableonRxError)); + MODIFY_REG(huart->Instance->CR3, USART_CR3_DDRE, huart->AdvancedInit.DMADisableonRxError); + } + + /* if required, configure auto Baud rate detection scheme */ + if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT)) + { + assert_param(IS_USART_AUTOBAUDRATE_DETECTION_INSTANCE(huart->Instance)); + assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable)); + MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable); + /* set auto Baudrate detection parameters if detection is enabled */ + if (huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE) + { + assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode)); + MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode); + } + } + + /* if required, configure MSB first on communication line */ + if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_MSBFIRST_INIT)) + { + assert_param(IS_UART_ADVFEATURE_MSBFIRST(huart->AdvancedInit.MSBFirst)); + MODIFY_REG(huart->Instance->CR2, USART_CR2_MSBFIRST, huart->AdvancedInit.MSBFirst); + } +} + +/** + * @brief Check the UART Idle State. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) +{ + uint32_t tickstart; + + /* Initialize the UART ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + /* Check if the Transmitter is enabled */ + if ((huart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE) + { + /* Wait until TEACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_TEACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } + + /* Check if the Receiver is enabled */ + if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) + { + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } + + /* Initialize the UART State */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief This function handles UART Communication Timeout. It waits + * until a flag is no longer in the specified status. + * @param huart UART handle. + * @param Flag Specifies the UART flag to check + * @param Status The actual Flag status (SET or RESET) + * @param Tickstart Tick start value + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) +{ + /* Wait until flag is set */ + while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) + interrupts for the interrupt process */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | + USART_CR1_TXEIE_TXFNFIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + + __HAL_UNLOCK(huart); + + return HAL_TIMEOUT; + } + + if (READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) + { + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF) == SET) + { + /* Clear Receiver Timeout flag*/ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) + interrupts for the interrupt process */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | + USART_CR1_TXEIE_TXFNFIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ErrorCode = HAL_UART_ERROR_RTO; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_TIMEOUT; + } + } + } + } + return HAL_OK; +} + +/** + * @brief Start Receive operation in interrupt mode. + * @note This function could be called by all HAL UART API providing reception in Interrupt mode. + * @note When calling this function, parameters validity is considered as already checked, + * i.e. Rx State, buffer address, ... + * UART Handle is assumed as Locked. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + huart->pRxBuffPtr = pData; + huart->RxXferSize = Size; + huart->RxXferCount = Size; + huart->RxISR = NULL; + + /* Computation of UART mask to apply to RDR register */ + UART_MASK_COMPUTATION(huart); + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + + /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Configure Rx interrupt processing */ + if ((huart->FifoMode == UART_FIFOMODE_ENABLE) && (Size >= huart->NbRxDataToProcess)) + { + /* Set the Rx ISR function pointer according to the data word length */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + huart->RxISR = UART_RxISR_16BIT_FIFOEN; + } + else + { + huart->RxISR = UART_RxISR_8BIT_FIFOEN; + } + + /* Enable the UART Parity Error interrupt and RX FIFO Threshold interrupt */ + if (huart->Init.Parity != UART_PARITY_NONE) + { + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); + } + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_RXFTIE); + } + else + { + /* Set the Rx ISR function pointer according to the data word length */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + huart->RxISR = UART_RxISR_16BIT; + } + else + { + huart->RxISR = UART_RxISR_8BIT; + } + + /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */ + if (huart->Init.Parity != UART_PARITY_NONE) + { + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE); + } + else + { + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + } + } + return HAL_OK; +} + +/** + * @brief Start Receive operation in DMA mode. + * @note This function could be called by all HAL UART API providing reception in DMA mode. + * @note When calling this function, parameters validity is considered as already checked, + * i.e. Rx State, buffer address, ... + * UART Handle is assumed as Locked. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + huart->pRxBuffPtr = pData; + huart->RxXferSize = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + + if (huart->hdmarx != NULL) + { + /* Set the UART DMA transfer complete callback */ + huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt; + + /* Set the UART DMA Half transfer complete callback */ + huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt; + + /* Set the DMA error callback */ + huart->hdmarx->XferErrorCallback = UART_DMAError; + + /* Set the DMA abort callback */ + huart->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, (uint32_t)huart->pRxBuffPtr, Size) != HAL_OK) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + /* Restore huart->RxState to ready */ + huart->RxState = HAL_UART_STATE_READY; + + return HAL_ERROR; + } + } + + /* Enable the UART Parity Error Interrupt */ + if (huart->Init.Parity != UART_PARITY_NONE) + { + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); + } + + /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Enable the DMA transfer for the receiver request by setting the DMAR bit + in the UART CR3 register */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + return HAL_OK; +} + + +/** + * @brief End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion). + * @param huart UART handle. + * @retval None + */ +static void UART_EndTxTransfer(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE, TCIE, TXFT interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_TXFTIE)); + + /* At end of Tx process, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; +} + + +/** + * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion). + * @param huart UART handle. + * @retval None + */ +static void UART_EndRxTransfer(UART_HandleTypeDef *huart) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* In case of reception waiting for IDLE event, disable also the IDLE IE interrupt source */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Reset RxIsr function pointer */ + huart->RxISR = NULL; +} + + +/** + * @brief DMA UART transmit process complete callback. + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + + /* DMA Normal mode */ + if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC)) + { + huart->TxXferCount = 0U; + + /* Disable the DMA transfer for transmit request by resetting the DMAT bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Enable the UART Transmit Complete Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); + } + /* DMA Circular mode */ + else + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx complete callback*/ + huart->TxCpltCallback(huart); +#else + /*Call legacy weak Tx complete callback*/ + HAL_UART_TxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART transmit process half complete callback. + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx Half complete callback*/ + huart->TxHalfCpltCallback(huart); +#else + /*Call legacy weak Tx Half complete callback*/ + HAL_UART_TxHalfCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART receive process complete callback. + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + + /* DMA Normal mode */ + if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC)) + { + huart->RxXferCount = 0U; + + /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the DMA transfer for the receiver request by resetting the DMAR bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* If Reception till IDLE event has been selected, Disable IDLE Interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + } + + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Transfer Complete */ + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : use Rx Event callback */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* In other cases : use Rx Complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART receive process half complete callback. + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Half Transfer */ + huart->RxEventType = HAL_UART_RXEVENT_HT; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : use Rx Event callback */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize / 2U); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize / 2U); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* In other cases : use Rx Half Complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Half complete callback*/ + huart->RxHalfCpltCallback(huart); +#else + /*Call legacy weak Rx Half complete callback*/ + HAL_UART_RxHalfCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART communication error callback. + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMAError(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + + const HAL_UART_StateTypeDef gstate = huart->gState; + const HAL_UART_StateTypeDef rxstate = huart->RxState; + + /* Stop UART DMA Tx request if ongoing */ + if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) && + (gstate == HAL_UART_STATE_BUSY_TX)) + { + huart->TxXferCount = 0U; + UART_EndTxTransfer(huart); + } + + /* Stop UART DMA Rx request if ongoing */ + if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) && + (rxstate == HAL_UART_STATE_BUSY_RX)) + { + huart->RxXferCount = 0U; + UART_EndRxTransfer(huart); + } + + huart->ErrorCode |= HAL_UART_ERROR_DMA; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART communication abort callback, when initiated by HAL services on Error + * (To be called at end of DMA Abort procedure following error occurrence). + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + huart->RxXferCount = 0U; + huart->TxXferCount = 0U; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Tx communication abort callback, when initiated by user + * (To be called at end of DMA Tx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Rx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + + huart->hdmatx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (huart->hdmarx != NULL) + { + if (huart->hdmarx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + huart->TxXferCount = 0U; + huart->RxXferCount = 0U; + + /* Reset errorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF); + + /* Flush the whole TX FIFO (if needed) */ + if (huart->FifoMode == UART_FIFOMODE_ENABLE) + { + __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST); + } + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + + +/** + * @brief DMA UART Rx communication abort callback, when initiated by user + * (To be called at end of DMA Rx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Tx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + + huart->hdmarx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (huart->hdmatx != NULL) + { + if (huart->hdmatx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + huart->TxXferCount = 0U; + huart->RxXferCount = 0U; + + /* Reset errorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF); + + /* Discard the received data */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + + +/** + * @brief DMA UART Tx communication abort callback, when initiated by user by a call to + * HAL_UART_AbortTransmit_IT API (Abort only Tx transfer) + * (This callback is executed at end of DMA Tx Abort procedure following user abort request, + * and leads to user Tx Abort Complete callback execution). + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent); + + huart->TxXferCount = 0U; + + /* Flush the whole TX FIFO (if needed) */ + if (huart->FifoMode == UART_FIFOMODE_ENABLE) + { + __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST); + } + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Rx communication abort callback, when initiated by user by a call to + * HAL_UART_AbortReceive_IT API (Abort only Rx transfer) + * (This callback is executed at end of DMA Rx Abort procedure following user abort request, + * and leads to user Rx Abort Complete callback execution). + * @param hdma DMA handle. + * @retval None + */ +static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->RxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF); + + /* Discard the received data */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief TX interrupt handler for 7 or 8 bits data word length . + * @note Function is called under interruption only, once + * interruptions have been enabled by HAL_UART_Transmit_IT(). + * @param huart UART handle. + * @retval None + */ +static void UART_TxISR_8BIT(UART_HandleTypeDef *huart) +{ + /* Check that a Tx process is ongoing */ + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + if (huart->TxXferCount == 0U) + { + /* Disable the UART Transmit Data Register Empty Interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); + + /* Enable the UART Transmit Complete Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); + } + else + { + huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF); + huart->pTxBuffPtr++; + huart->TxXferCount--; + } + } +} + +/** + * @brief TX interrupt handler for 9 bits data word length. + * @note Function is called under interruption only, once + * interruptions have been enabled by HAL_UART_Transmit_IT(). + * @param huart UART handle. + * @retval None + */ +static void UART_TxISR_16BIT(UART_HandleTypeDef *huart) +{ + const uint16_t *tmp; + + /* Check that a Tx process is ongoing */ + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + if (huart->TxXferCount == 0U) + { + /* Disable the UART Transmit Data Register Empty Interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); + + /* Enable the UART Transmit Complete Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); + } + else + { + tmp = (const uint16_t *) huart->pTxBuffPtr; + huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL); + huart->pTxBuffPtr += 2U; + huart->TxXferCount--; + } + } +} + +/** + * @brief TX interrupt handler for 7 or 8 bits data word length and FIFO mode is enabled. + * @note Function is called under interruption only, once + * interruptions have been enabled by HAL_UART_Transmit_IT(). + * @param huart UART handle. + * @retval None + */ +static void UART_TxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart) +{ + uint16_t nb_tx_data; + + /* Check that a Tx process is ongoing */ + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--) + { + if (huart->TxXferCount == 0U) + { + /* Disable the TX FIFO threshold interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE); + + /* Enable the UART Transmit Complete Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); + + break; /* force exit loop */ + } + else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U) + { + huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF); + huart->pTxBuffPtr++; + huart->TxXferCount--; + } + else + { + /* Nothing to do */ + } + } + } +} + +/** + * @brief TX interrupt handler for 9 bits data word length and FIFO mode is enabled. + * @note Function is called under interruption only, once + * interruptions have been enabled by HAL_UART_Transmit_IT(). + * @param huart UART handle. + * @retval None + */ +static void UART_TxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart) +{ + const uint16_t *tmp; + uint16_t nb_tx_data; + + /* Check that a Tx process is ongoing */ + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--) + { + if (huart->TxXferCount == 0U) + { + /* Disable the TX FIFO threshold interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE); + + /* Enable the UART Transmit Complete Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); + + break; /* force exit loop */ + } + else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U) + { + tmp = (const uint16_t *) huart->pTxBuffPtr; + huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL); + huart->pTxBuffPtr += 2U; + huart->TxXferCount--; + } + else + { + /* Nothing to do */ + } + } + } +} + +/** + * @brief Wrap up transmission in non-blocking mode. + * @param huart pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +static void UART_EndTransmit_IT(UART_HandleTypeDef *huart) +{ + /* Disable the UART Transmit Complete Interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_TCIE); + + /* Tx process is ended, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* Cleat TxISR function pointer */ + huart->TxISR = NULL; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx complete callback*/ + huart->TxCpltCallback(huart); +#else + /*Call legacy weak Tx complete callback*/ + HAL_UART_TxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief RX interrupt handler for 7 or 8 bits data word length . + * @param huart UART handle. + * @retval None + */ +static void UART_RxISR_8BIT(UART_HandleTypeDef *huart) +{ + uint16_t uhMask = huart->Mask; + uint16_t uhdata; + + /* Check that a Rx process is ongoing */ + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + uhdata = (uint16_t) READ_REG(huart->Instance->RDR); + *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask); + huart->pRxBuffPtr++; + huart->RxXferCount--; + + if (huart->RxXferCount == 0U) + { + /* Disable the UART Parity Error Interrupt and RXNE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); + + /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* Clear RxISR function pointer */ + huart->RxISR = NULL; + + /* Initialize type of RxEvent to Transfer Complete */ + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + /* Set reception type to Standard */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Disable IDLE interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET) + { + /* Clear IDLE Flag */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); + } + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + else + { + /* Standard reception API called */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + } + else + { + /* Clear RXNE interrupt flag */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + } +} + +/** + * @brief RX interrupt handler for 9 bits data word length . + * @note Function is called under interruption only, once + * interruptions have been enabled by HAL_UART_Receive_IT() + * @param huart UART handle. + * @retval None + */ +static void UART_RxISR_16BIT(UART_HandleTypeDef *huart) +{ + uint16_t *tmp; + uint16_t uhMask = huart->Mask; + uint16_t uhdata; + + /* Check that a Rx process is ongoing */ + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + uhdata = (uint16_t) READ_REG(huart->Instance->RDR); + tmp = (uint16_t *) huart->pRxBuffPtr ; + *tmp = (uint16_t)(uhdata & uhMask); + huart->pRxBuffPtr += 2U; + huart->RxXferCount--; + + if (huart->RxXferCount == 0U) + { + /* Disable the UART Parity Error Interrupt and RXNE interrupt*/ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); + + /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* Clear RxISR function pointer */ + huart->RxISR = NULL; + + /* Initialize type of RxEvent to Transfer Complete */ + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + /* Set reception type to Standard */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Disable IDLE interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET) + { + /* Clear IDLE Flag */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); + } + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + else + { + /* Standard reception API called */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + } + else + { + /* Clear RXNE interrupt flag */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + } +} + +/** + * @brief RX interrupt handler for 7 or 8 bits data word length and FIFO mode is enabled. + * @note Function is called under interruption only, once + * interruptions have been enabled by HAL_UART_Receive_IT() + * @param huart UART handle. + * @retval None + */ +static void UART_RxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart) +{ + uint16_t uhMask = huart->Mask; + uint16_t uhdata; + uint16_t nb_rx_data; + uint16_t rxdatacount; + uint32_t isrflags = READ_REG(huart->Instance->ISR); + uint32_t cr1its = READ_REG(huart->Instance->CR1); + uint32_t cr3its = READ_REG(huart->Instance->CR3); + + /* Check that a Rx process is ongoing */ + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + nb_rx_data = huart->NbRxDataToProcess; + while ((nb_rx_data > 0U) && ((isrflags & USART_ISR_RXNE_RXFNE) != 0U)) + { + uhdata = (uint16_t) READ_REG(huart->Instance->RDR); + *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask); + huart->pRxBuffPtr++; + huart->RxXferCount--; + isrflags = READ_REG(huart->Instance->ISR); + + /* If some non blocking errors occurred */ + if ((isrflags & (USART_ISR_PE | USART_ISR_FE | USART_ISR_NE)) != 0U) + { + /* UART parity error interrupt occurred -------------------------------------*/ + if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF); + + huart->ErrorCode |= HAL_UART_ERROR_PE; + } + + /* UART frame error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF); + + huart->ErrorCode |= HAL_UART_ERROR_FE; + } + + /* UART noise error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF); + + huart->ErrorCode |= HAL_UART_ERROR_NE; + } + + /* Call UART Error Call back function if need be ----------------------------*/ + if (huart->ErrorCode != HAL_UART_ERROR_NONE) + { + /* Non Blocking error : transfer could go on. + Error is notified to user through user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + } + } + + if (huart->RxXferCount == 0U) + { + /* Disable the UART Parity Error Interrupt and RXFT interrupt*/ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + + /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) + and RX FIFO Threshold interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* Clear RxISR function pointer */ + huart->RxISR = NULL; + + /* Initialize type of RxEvent to Transfer Complete */ + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + /* Set reception type to Standard */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Disable IDLE interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET) + { + /* Clear IDLE Flag */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); + } + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + else + { + /* Standard reception API called */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + } + + /* When remaining number of bytes to receive is less than the RX FIFO + threshold, next incoming frames are processed as if FIFO mode was + disabled (i.e. one interrupt per received frame). + */ + rxdatacount = huart->RxXferCount; + if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess)) + { + /* Disable the UART RXFT interrupt*/ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE); + + /* Update the RxISR function pointer */ + huart->RxISR = UART_RxISR_8BIT; + + /* Enable the UART Data Register Not Empty interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + } + } + else + { + /* Clear RXNE interrupt flag */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + } +} + +/** + * @brief RX interrupt handler for 9 bits data word length and FIFO mode is enabled. + * @note Function is called under interruption only, once + * interruptions have been enabled by HAL_UART_Receive_IT() + * @param huart UART handle. + * @retval None + */ +static void UART_RxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart) +{ + uint16_t *tmp; + uint16_t uhMask = huart->Mask; + uint16_t uhdata; + uint16_t nb_rx_data; + uint16_t rxdatacount; + uint32_t isrflags = READ_REG(huart->Instance->ISR); + uint32_t cr1its = READ_REG(huart->Instance->CR1); + uint32_t cr3its = READ_REG(huart->Instance->CR3); + + /* Check that a Rx process is ongoing */ + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + nb_rx_data = huart->NbRxDataToProcess; + while ((nb_rx_data > 0U) && ((isrflags & USART_ISR_RXNE_RXFNE) != 0U)) + { + uhdata = (uint16_t) READ_REG(huart->Instance->RDR); + tmp = (uint16_t *) huart->pRxBuffPtr ; + *tmp = (uint16_t)(uhdata & uhMask); + huart->pRxBuffPtr += 2U; + huart->RxXferCount--; + isrflags = READ_REG(huart->Instance->ISR); + + /* If some non blocking errors occurred */ + if ((isrflags & (USART_ISR_PE | USART_ISR_FE | USART_ISR_NE)) != 0U) + { + /* UART parity error interrupt occurred -------------------------------------*/ + if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF); + + huart->ErrorCode |= HAL_UART_ERROR_PE; + } + + /* UART frame error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF); + + huart->ErrorCode |= HAL_UART_ERROR_FE; + } + + /* UART noise error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF); + + huart->ErrorCode |= HAL_UART_ERROR_NE; + } + + /* Call UART Error Call back function if need be ----------------------------*/ + if (huart->ErrorCode != HAL_UART_ERROR_NONE) + { + /* Non Blocking error : transfer could go on. + Error is notified to user through user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + } + } + + if (huart->RxXferCount == 0U) + { + /* Disable the UART Parity Error Interrupt and RXFT interrupt*/ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + + /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) + and RX FIFO Threshold interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* Clear RxISR function pointer */ + huart->RxISR = NULL; + + /* Initialize type of RxEvent to Transfer Complete */ + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + /* Set reception type to Standard */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Disable IDLE interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET) + { + /* Clear IDLE Flag */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); + } + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + else + { + /* Standard reception API called */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + } + + /* When remaining number of bytes to receive is less than the RX FIFO + threshold, next incoming frames are processed as if FIFO mode was + disabled (i.e. one interrupt per received frame). + */ + rxdatacount = huart->RxXferCount; + if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess)) + { + /* Disable the UART RXFT interrupt*/ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE); + + /* Update the RxISR function pointer */ + huart->RxISR = UART_RxISR_16BIT; + + /* Enable the UART Data Register Not Empty interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + } + } + else + { + /* Clear RXNE interrupt flag */ + __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST); + } +} + +/** + * @} + */ + +#endif /* HAL_UART_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c new file mode 100644 index 0000000..a56cf9a --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c @@ -0,0 +1,1092 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_uart_ex.c + * @author MCD Application Team + * @brief Extended UART HAL module driver. + * This file provides firmware functions to manage the following extended + * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### UART peripheral extended features ##### + ============================================================================== + + (#) Declare a UART_HandleTypeDef handle structure. + + (#) For the UART RS485 Driver Enable mode, initialize the UART registers + by calling the HAL_RS485Ex_Init() API. + + (#) FIFO mode enabling/disabling and RX/TX FIFO threshold programming. + + -@- When UART operates in FIFO mode, FIFO mode must be enabled prior + starting RX/TX transfers. Also RX/TX FIFO thresholds must be + configured prior starting RX/TX transfers. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup UARTEx UARTEx + * @brief UART Extended HAL module driver + * @{ + */ + +#ifdef HAL_UART_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup UARTEX_Private_Constants UARTEx Private Constants + * @{ + */ +/* UART RX FIFO depth */ +#define RX_FIFO_DEPTH 8U + +/* UART TX FIFO depth */ +#define TX_FIFO_DEPTH 8U +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup UARTEx_Private_Functions UARTEx Private Functions + * @{ + */ +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +static void UARTEx_SetNbDataToProcess(UART_HandleTypeDef *huart); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup UARTEx_Exported_Functions UARTEx Exported Functions + * @{ + */ + +/** @defgroup UARTEx_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Extended Initialization and Configuration Functions + * +@verbatim +=============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to initialize the USARTx or the UARTy + in asynchronous mode. + (+) For the asynchronous mode the parameters below can be configured: + (++) Baud Rate + (++) Word Length + (++) Stop Bit + (++) Parity: If the parity is enabled, then the MSB bit of the data written + in the data register is transmitted but is changed by the parity bit. + (++) Hardware flow control + (++) Receiver/transmitter modes + (++) Over Sampling Method + (++) One-Bit Sampling Method + (+) For the asynchronous mode, the following advanced features can be configured as well: + (++) TX and/or RX pin level inversion + (++) data logical level inversion + (++) RX and TX pins swap + (++) RX overrun detection disabling + (++) DMA disabling on RX error + (++) MSB first on communication line + (++) auto Baud rate detection + [..] + The HAL_RS485Ex_Init() API follows the UART RS485 mode configuration + procedures (details for the procedures are available in reference manual). + +@endverbatim + + Depending on the frame length defined by the M1 and M0 bits (7-bit, + 8-bit or 9-bit), the possible UART formats are listed in the + following table. + + Table 1. UART frame format. + +-----------------------------------------------------------------------+ + | M1 bit | M0 bit | PCE bit | UART frame | + |---------|---------|-----------|---------------------------------------| + | 0 | 0 | 0 | | SB | 8 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 1 | 0 | | SB | 9 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | | + |---------|---------|-----------|---------------------------------------| + | 1 | 0 | 0 | | SB | 7 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | | + +-----------------------------------------------------------------------+ + + * @{ + */ + +/** + * @brief Initialize the RS485 Driver enable feature according to the specified + * parameters in the UART_InitTypeDef and creates the associated handle. + * @param huart UART handle. + * @param Polarity Select the driver enable polarity. + * This parameter can be one of the following values: + * @arg @ref UART_DE_POLARITY_HIGH DE signal is active high + * @arg @ref UART_DE_POLARITY_LOW DE signal is active low + * @param AssertionTime Driver Enable assertion time: + * 5-bit value defining the time between the activation of the DE (Driver Enable) + * signal and the beginning of the start bit. It is expressed in sample time + * units (1/8 or 1/16 bit time, depending on the oversampling rate) + * @param DeassertionTime Driver Enable deassertion time: + * 5-bit value defining the time between the end of the last stop bit, in a + * transmitted message, and the de-activation of the DE (Driver Enable) signal. + * It is expressed in sample time units (1/8 or 1/16 bit time, depending on the + * oversampling rate). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime) +{ + uint32_t temp; + + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + /* Check the Driver Enable UART instance */ + assert_param(IS_UART_DRIVER_ENABLE_INSTANCE(huart->Instance)); + + /* Check the Driver Enable polarity */ + assert_param(IS_UART_DE_POLARITY(Polarity)); + + /* Check the Driver Enable assertion time */ + assert_param(IS_UART_ASSERTIONTIME(AssertionTime)); + + /* Check the Driver Enable deassertion time */ + assert_param(IS_UART_DEASSERTIONTIME(DeassertionTime)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK, CORTEX */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + if (UART_SetConfig(huart) == HAL_ERROR) + { + return HAL_ERROR; + } + + if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT) + { + UART_AdvFeatureConfig(huart); + } + + /* Enable the Driver Enable mode by setting the DEM bit in the CR3 register */ + SET_BIT(huart->Instance->CR3, USART_CR3_DEM); + + /* Set the Driver Enable polarity */ + MODIFY_REG(huart->Instance->CR3, USART_CR3_DEP, Polarity); + + /* Set the Driver Enable assertion and deassertion times */ + temp = (AssertionTime << UART_CR1_DEAT_ADDRESS_LSB_POS); + temp |= (DeassertionTime << UART_CR1_DEDT_ADDRESS_LSB_POS); + MODIFY_REG(huart->Instance->CR1, (USART_CR1_DEDT | USART_CR1_DEAT), temp); + + /* Enable the Peripheral */ + __HAL_UART_ENABLE(huart); + + /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ + return (UART_CheckIdleState(huart)); +} + +/** + * @} + */ + +/** @defgroup UARTEx_Exported_Functions_Group2 IO operation functions + * @brief Extended functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + This subsection provides a set of Wakeup and FIFO mode related callback functions. + + (#) Wakeup from Stop mode Callback: + (+) HAL_UARTEx_WakeupCallback() + + (#) TX/RX Fifos Callbacks: + (+) HAL_UARTEx_RxFifoFullCallback() + (+) HAL_UARTEx_TxFifoEmptyCallback() + +@endverbatim + * @{ + */ + +/** + * @brief UART wakeup from Stop mode callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_WakeupCallback can be implemented in the user file. + */ +} + +/** + * @brief UART RX Fifo full callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_RxFifoFullCallback can be implemented in the user file. + */ +} + +/** + * @brief UART TX Fifo empty callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_TxFifoEmptyCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup UARTEx_Exported_Functions_Group3 Peripheral Control functions + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] This section provides the following functions: + (+) HAL_MultiProcessorEx_AddressLength_Set() API optionally sets the UART node address + detection length to more than 4 bits for multiprocessor address mark wake up. + (+) HAL_UARTEx_StopModeWakeUpSourceConfig() API defines the wake-up from stop mode + trigger: address match, Start Bit detection or RXNE bit status. + (+) HAL_UARTEx_EnableStopMode() API enables the UART to wake up the MCU from stop mode + (+) HAL_UARTEx_DisableStopMode() API disables the above functionality + (+) HAL_UARTEx_EnableFifoMode() API enables the FIFO mode + (+) HAL_UARTEx_DisableFifoMode() API disables the FIFO mode + (+) HAL_UARTEx_SetTxFifoThreshold() API sets the TX FIFO threshold + (+) HAL_UARTEx_SetRxFifoThreshold() API sets the RX FIFO threshold + + [..] This subsection also provides a set of additional functions providing enhanced reception + services to user. (For example, these functions allow application to handle use cases + where number of data to be received is unknown). + + (#) Compared to standard reception services which only consider number of received + data elements as reception completion criteria, these functions also consider additional events + as triggers for updating reception status to caller : + (+) Detection of inactivity period (RX line has not been active for a given period). + (++) RX inactivity detected by IDLE event, i.e. RX line has been in idle state (normally high state) + for 1 frame time, after last received byte. + (++) RX inactivity detected by RTO, i.e. line has been in idle state + for a programmable time, after last received byte. + (+) Detection that a specific character has been received. + + (#) There are two mode of transfer: + (+) Blocking mode: The reception is performed in polling mode, until either expected number of data is received, + or till IDLE event occurs. Reception is handled only during function execution. + When function exits, no data reception could occur. HAL status and number of actually received data elements, + are returned by function after finishing transfer. + (+) Non-Blocking mode: The reception is performed using Interrupts or DMA. + These API's return the HAL status. + The end of the data processing will be indicated through the + dedicated UART IRQ when using Interrupt mode or the DMA IRQ when using DMA mode. + The HAL_UARTEx_RxEventCallback() user callback will be executed during Receive process + The HAL_UART_ErrorCallback()user callback will be executed when a reception error is detected. + + (#) Blocking mode API: + (+) HAL_UARTEx_ReceiveToIdle() + + (#) Non-Blocking mode API with Interrupt: + (+) HAL_UARTEx_ReceiveToIdle_IT() + + (#) Non-Blocking mode API with DMA: + (+) HAL_UARTEx_ReceiveToIdle_DMA() + +@endverbatim + * @{ + */ + +/** + * @brief By default in multiprocessor mode, when the wake up method is set + * to address mark, the UART handles only 4-bit long addresses detection; + * this API allows to enable longer addresses detection (6-, 7- or 8-bit + * long). + * @note Addresses detection lengths are: 6-bit address detection in 7-bit data mode, + * 7-bit address detection in 8-bit data mode, 8-bit address detection in 9-bit data mode. + * @param huart UART handle. + * @param AddressLength This parameter can be one of the following values: + * @arg @ref UART_ADDRESS_DETECT_4B 4-bit long address + * @arg @ref UART_ADDRESS_DETECT_7B 6-, 7- or 8-bit long address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the address length parameter */ + assert_param(IS_UART_ADDRESSLENGTH_DETECT(AddressLength)); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the address length */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, AddressLength); + + /* Enable the Peripheral */ + __HAL_UART_ENABLE(huart); + + /* TEACK and/or REACK to check before moving huart->gState to Ready */ + return (UART_CheckIdleState(huart)); +} + +/** + * @brief Set Wakeup from Stop mode interrupt flag selection. + * @note It is the application responsibility to enable the interrupt used as + * usart_wkup interrupt source before entering low-power mode. + * @param huart UART handle. + * @param WakeUpSelection Address match, Start Bit detection or RXNE/RXFNE bit status. + * This parameter can be one of the following values: + * @arg @ref UART_WAKEUP_ON_ADDRESS + * @arg @ref UART_WAKEUP_ON_STARTBIT + * @arg @ref UART_WAKEUP_ON_READDATA_NONEMPTY + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tickstart; + + /* check the wake-up from stop mode UART instance */ + assert_param(IS_UART_WAKEUP_FROMSTOP_INSTANCE(huart->Instance)); + /* check the wake-up selection parameter */ + assert_param(IS_UART_WAKEUP_SELECTION(WakeUpSelection.WakeUpEvent)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the wake-up selection scheme */ + MODIFY_REG(huart->Instance->CR3, USART_CR3_WUS, WakeUpSelection.WakeUpEvent); + + if (WakeUpSelection.WakeUpEvent == UART_WAKEUP_ON_ADDRESS) + { + UARTEx_Wakeup_AddressConfig(huart, WakeUpSelection); + } + + /* Enable the Peripheral */ + __HAL_UART_ENABLE(huart); + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + status = HAL_TIMEOUT; + } + else + { + /* Initialize the UART State */ + huart->gState = HAL_UART_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Enable UART Stop Mode. + * @note The UART is able to wake up the MCU from Stop 1 mode as long as UART clock is HSI or LSE. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Set UESM bit */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Disable UART Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UESM bit */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Enable the FIFO mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableFifoMode(UART_HandleTypeDef *huart) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(huart->Instance)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Save actual UART configuration */ + tmpcr1 = READ_REG(huart->Instance->CR1); + + /* Disable UART */ + __HAL_UART_DISABLE(huart); + + /* Enable FIFO mode */ + SET_BIT(tmpcr1, USART_CR1_FIFOEN); + huart->FifoMode = UART_FIFOMODE_ENABLE; + + /* Restore UART configuration */ + WRITE_REG(huart->Instance->CR1, tmpcr1); + + /* Determine the number of data to process during RX/TX ISR execution */ + UARTEx_SetNbDataToProcess(huart); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Disable the FIFO mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableFifoMode(UART_HandleTypeDef *huart) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(huart->Instance)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Save actual UART configuration */ + tmpcr1 = READ_REG(huart->Instance->CR1); + + /* Disable UART */ + __HAL_UART_DISABLE(huart); + + /* Enable FIFO mode */ + CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN); + huart->FifoMode = UART_FIFOMODE_DISABLE; + + /* Restore UART configuration */ + WRITE_REG(huart->Instance->CR1, tmpcr1); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Set the TXFIFO threshold. + * @param huart UART handle. + * @param Threshold TX FIFO threshold value + * This parameter can be one of the following values: + * @arg @ref UART_TXFIFO_THRESHOLD_1_8 + * @arg @ref UART_TXFIFO_THRESHOLD_1_4 + * @arg @ref UART_TXFIFO_THRESHOLD_1_2 + * @arg @ref UART_TXFIFO_THRESHOLD_3_4 + * @arg @ref UART_TXFIFO_THRESHOLD_7_8 + * @arg @ref UART_TXFIFO_THRESHOLD_8_8 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(huart->Instance)); + assert_param(IS_UART_TXFIFO_THRESHOLD(Threshold)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Save actual UART configuration */ + tmpcr1 = READ_REG(huart->Instance->CR1); + + /* Disable UART */ + __HAL_UART_DISABLE(huart); + + /* Update TX threshold configuration */ + MODIFY_REG(huart->Instance->CR3, USART_CR3_TXFTCFG, Threshold); + + /* Determine the number of data to process during RX/TX ISR execution */ + UARTEx_SetNbDataToProcess(huart); + + /* Restore UART configuration */ + WRITE_REG(huart->Instance->CR1, tmpcr1); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Set the RXFIFO threshold. + * @param huart UART handle. + * @param Threshold RX FIFO threshold value + * This parameter can be one of the following values: + * @arg @ref UART_RXFIFO_THRESHOLD_1_8 + * @arg @ref UART_RXFIFO_THRESHOLD_1_4 + * @arg @ref UART_RXFIFO_THRESHOLD_1_2 + * @arg @ref UART_RXFIFO_THRESHOLD_3_4 + * @arg @ref UART_RXFIFO_THRESHOLD_7_8 + * @arg @ref UART_RXFIFO_THRESHOLD_8_8 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold) +{ + uint32_t tmpcr1; + + /* Check the parameters */ + assert_param(IS_UART_FIFO_INSTANCE(huart->Instance)); + assert_param(IS_UART_RXFIFO_THRESHOLD(Threshold)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Save actual UART configuration */ + tmpcr1 = READ_REG(huart->Instance->CR1); + + /* Disable UART */ + __HAL_UART_DISABLE(huart); + + /* Update RX threshold configuration */ + MODIFY_REG(huart->Instance->CR3, USART_CR3_RXFTCFG, Threshold); + + /* Determine the number of data to process during RX/TX ISR execution */ + UARTEx_SetNbDataToProcess(huart); + + /* Restore UART configuration */ + WRITE_REG(huart->Instance->CR1, tmpcr1); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Receive an amount of data in blocking mode till either the expected number of data + * is received or an IDLE event occurs. + * @note HAL_OK is returned if reception is completed (expected number of data has been received) + * or if reception is stopped after IDLE event (less than the expected number of data has been received) + * In this case, RxLen output parameter indicates number of data available in reception buffer. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @note When FIFO mode is enabled, the RXFNE flag is set as long as the RXFIFO + * is not empty. Read operations from the RDR register are performed when + * RXFNE flag is set. From hardware perspective, RXFNE flag and + * RXNE are mapped on the same bit-field. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on a half word frontier + * (16 bits) (as received data will be handled using uint16_t pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required to ensure proper + * alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @param RxLen Number of data elements finally received + * (could be lower than Size, in case reception ends on IDLE event) + * @param Timeout Timeout duration expressed in ms (covers the whole reception sequence). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, + uint32_t Timeout) +{ + uint8_t *pdata8bits; + uint16_t *pdata16bits; + uint16_t uhMask; + uint32_t tickstart; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a uint16_t frontier, as data to be received from RDR will be + handled through a uint16_t cast. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->RxXferSize = Size; + huart->RxXferCount = Size; + + /* Computation of UART mask to apply to RDR register */ + UART_MASK_COMPUTATION(huart); + uhMask = huart->Mask; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + /* Initialize output number of received elements */ + *RxLen = 0U; + + /* as long as data have to be received */ + while (huart->RxXferCount > 0U) + { + /* Check if IDLE flag is set */ + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) + { + /* Clear IDLE flag in ISR */ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); + + /* If Set, but no data ever received, clear flag without exiting loop */ + /* If Set, and data has already been received, this means Idle Event is valid : End reception */ + if (*RxLen > 0U) + { + huart->RxEventType = HAL_UART_RXEVENT_IDLE; + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + } + + /* Check if RXNE flag is set */ + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE)) + { + if (pdata8bits == NULL) + { + *pdata16bits = (uint16_t)(huart->Instance->RDR & uhMask); + pdata16bits++; + } + else + { + *pdata8bits = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask); + pdata8bits++; + } + /* Increment number of received elements */ + *RxLen += 1U; + huart->RxXferCount--; + } + + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) + { + huart->RxState = HAL_UART_STATE_READY; + + return HAL_TIMEOUT; + } + } + } + + /* Set number of received elements in output parameter : RxLen */ + *RxLen = huart->RxXferSize - huart->RxXferCount; + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in interrupt mode till either the expected number of data + * is received or an IDLE event occurs. + * @note Reception is initiated by this function call. Further progress of reception is achieved thanks + * to UART interrupts raised by RXNE and IDLE events. Callback is called at end of reception indicating + * number of received data elements. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on a half word frontier + * (16 bits) (as received data will be handled using uint16_t pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef status; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a uint16_t frontier, as data to be received from RDR will be + handled through a uint16_t cast. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Set Reception type to reception till IDLE Event*/ + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + status = UART_Start_Receive_IT(huart, pData, Size); + + /* Check Rx process has been successfully started */ + if (status == HAL_OK) + { + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + else + { + /* In case of errors already pending when reception is started, + Interrupts may have already been raised and lead to reception abortion. + (Overrun error for instance). + In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ + status = HAL_ERROR; + } + } + + return status; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in DMA mode till either the expected number + * of data is received or an IDLE event occurs. + * @note Reception is initiated by this function call. Further progress of reception is achieved thanks + * to DMA services, transferring automatically received data elements in user reception buffer and + * calling registered callbacks at half/end of reception. UART IDLE events are also used to consider + * reception phase as ended. In all cases, callback execution will indicate number of received data elements. + * @note When the UART parity is enabled (PCE = 1), the received data contain + * the parity bit (MSB position). + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on a half word frontier + * (16 bits) (as received data will be handled by DMA from halfword frontier). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef status; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter + should be aligned on a uint16_t frontier, as data copy from RDR will be + handled by DMA from a uint16_t frontier. */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + if ((((uint32_t)pData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Set Reception type to reception till IDLE Event*/ + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + status = UART_Start_Receive_DMA(huart, pData, Size); + + /* Check Rx process has been successfully started */ + if (status == HAL_OK) + { + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + else + { + /* In case of errors already pending when reception is started, + Interrupts may have already been raised and lead to reception abortion. + (Overrun error for instance). + In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ + status = HAL_ERROR; + } + } + + return status; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Provide Rx Event type that has lead to RxEvent callback execution. + * @note When HAL_UARTEx_ReceiveToIdle_IT() or HAL_UARTEx_ReceiveToIdle_DMA() API are called, progress + * of reception process is provided to application through calls of Rx Event callback (either default one + * HAL_UARTEx_RxEventCallback() or user registered one). As several types of events could occur (IDLE event, + * Half Transfer, or Transfer Complete), this function allows to retrieve the Rx Event type that has lead + * to Rx Event callback execution. + * @note This function is expected to be called within the user implementation of Rx Event Callback, + * in order to provide the accurate value : + * In Interrupt Mode : + * - HAL_UART_RXEVENT_TC : when Reception has been completed (expected nb of data has been received) + * - HAL_UART_RXEVENT_IDLE : when Idle event occurred prior reception has been completed (nb of + * received data is lower than expected one) + * In DMA Mode : + * - HAL_UART_RXEVENT_TC : when Reception has been completed (expected nb of data has been received) + * - HAL_UART_RXEVENT_HT : when half of expected nb of data has been received + * - HAL_UART_RXEVENT_IDLE : when Idle event occurred prior reception has been completed (nb of + * received data is lower than expected one). + * In DMA mode, RxEvent callback could be called several times; + * When DMA is configured in Normal Mode, HT event does not stop Reception process; + * When DMA is configured in Circular Mode, HT, TC or IDLE events don't stop Reception process; + * @param huart UART handle. + * @retval Rx Event Type (return vale will be a value of @ref UART_RxEvent_Type_Values) + */ +HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart) +{ + /* Return Rx Event type value, as stored in UART handle */ + return(huart->RxEventType); +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup UARTEx_Private_Functions + * @{ + */ + +/** + * @brief Initialize the UART wake-up from stop mode parameters when triggered by address detection. + * @param huart UART handle. + * @param WakeUpSelection UART wake up from stop mode parameters. + * @retval None + */ +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + assert_param(IS_UART_ADDRESSLENGTH_DETECT(WakeUpSelection.AddressLength)); + + /* Set the USART address length */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, WakeUpSelection.AddressLength); + + /* Set the USART address node */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)WakeUpSelection.Address << UART_CR2_ADDRESS_LSB_POS)); +} + +/** + * @brief Calculate the number of data to process in RX/TX ISR. + * @note The RX FIFO depth and the TX FIFO depth is extracted from + * the UART configuration registers. + * @param huart UART handle. + * @retval None + */ +static void UARTEx_SetNbDataToProcess(UART_HandleTypeDef *huart) +{ + uint8_t rx_fifo_depth; + uint8_t tx_fifo_depth; + uint8_t rx_fifo_threshold; + uint8_t tx_fifo_threshold; + static const uint8_t numerator[] = {1U, 1U, 1U, 3U, 7U, 1U, 0U, 0U}; + static const uint8_t denominator[] = {8U, 4U, 2U, 4U, 8U, 1U, 1U, 1U}; + + if (huart->FifoMode == UART_FIFOMODE_DISABLE) + { + huart->NbTxDataToProcess = 1U; + huart->NbRxDataToProcess = 1U; + } + else + { + rx_fifo_depth = RX_FIFO_DEPTH; + tx_fifo_depth = TX_FIFO_DEPTH; + rx_fifo_threshold = (uint8_t)(READ_BIT(huart->Instance->CR3, USART_CR3_RXFTCFG) >> USART_CR3_RXFTCFG_Pos); + tx_fifo_threshold = (uint8_t)(READ_BIT(huart->Instance->CR3, USART_CR3_TXFTCFG) >> USART_CR3_TXFTCFG_Pos); + huart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) / + (uint16_t)denominator[tx_fifo_threshold]; + huart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) / + (uint16_t)denominator[rx_fifo_threshold]; + } +} +/** + * @} + */ + +#endif /* HAL_UART_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_usart.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_usart.c new file mode 100644 index 0000000..c93217d --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_usart.c @@ -0,0 +1,3849 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_usart.c + * @author MCD Application Team + * @brief USART HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Universal Synchronous/Asynchronous Receiver Transmitter + * Peripheral (USART). + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State and Error functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + =============================================================================== + ##### How to use this driver ##### + =============================================================================== + [..] + The USART HAL driver can be used as follows: + + (#) Declare a USART_HandleTypeDef handle structure (eg. USART_HandleTypeDef husart). + (#) Initialize the USART low level resources by implementing the HAL_USART_MspInit() API: + (++) Enable the USARTx interface clock. + (++) USART pins configuration: + (+++) Enable the clock for the USART GPIOs. + (+++) Configure these USART pins as alternate function pull-up. + (++) NVIC configuration if you need to use interrupt process (HAL_USART_Transmit_IT(), + HAL_USART_Receive_IT() and HAL_USART_TransmitReceive_IT() APIs): + (+++) Configure the USARTx interrupt priority. + (+++) Enable the NVIC USART IRQ handle. + (++) USART interrupts handling: + -@@- The specific USART interrupts (Transmission complete interrupt, + RXNE interrupt and Error Interrupts) will be managed using the macros + __HAL_USART_ENABLE_IT() and __HAL_USART_DISABLE_IT() inside the transmit and receive process. + (++) DMA Configuration if you need to use DMA process (HAL_USART_Transmit_DMA() + HAL_USART_Receive_DMA() and HAL_USART_TransmitReceive_DMA() APIs): + (+++) Declare a DMA handle structure for the Tx/Rx channel. + (+++) Enable the DMAx interface clock. + (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters. + (+++) Configure the DMA Tx/Rx channel. + (+++) Associate the initialized DMA handle to the USART DMA Tx/Rx handle. + (+++) Configure the priority and enable the NVIC for the transfer + complete interrupt on the DMA Tx/Rx channel. + + (#) Program the Baud Rate, Word Length, Stop Bit, Parity, and Mode + (Receiver/Transmitter) in the husart handle Init structure. + + (#) Initialize the USART registers by calling the HAL_USART_Init() API: + (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) + by calling the customized HAL_USART_MspInit(&husart) API. + + [..] + (@) To configure and enable/disable the USART to wake up the MCU from stop mode, resort to UART API's + HAL_UARTEx_StopModeWakeUpSourceConfig(), HAL_UARTEx_EnableStopMode() and + HAL_UARTEx_DisableStopMode() in casting the USART handle to UART type UART_HandleTypeDef. + + ##### Callback registration ##### + ================================== + + [..] + The compilation define USE_HAL_USART_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_USART_RegisterCallback() to register a user callback. + Function HAL_USART_RegisterCallback() allows to register following callbacks: + (+) TxHalfCpltCallback : Tx Half Complete Callback. + (+) TxCpltCallback : Tx Complete Callback. + (+) RxHalfCpltCallback : Rx Half Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) TxRxCpltCallback : Tx Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) RxFifoFullCallback : Rx Fifo Full Callback. + (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. + (+) MspInitCallback : USART MspInit. + (+) MspDeInitCallback : USART MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + [..] + Use function HAL_USART_UnRegisterCallback() to reset a callback to the default + weak (surcharged) function. + HAL_USART_UnRegisterCallback() takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) TxHalfCpltCallback : Tx Half Complete Callback. + (+) TxCpltCallback : Tx Complete Callback. + (+) RxHalfCpltCallback : Rx Half Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) TxRxCpltCallback : Tx Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) RxFifoFullCallback : Rx Fifo Full Callback. + (+) TxFifoEmptyCallback : Tx Fifo Empty Callback. + (+) MspInitCallback : USART MspInit. + (+) MspDeInitCallback : USART MspDeInit. + + [..] + By default, after the HAL_USART_Init() and when the state is HAL_USART_STATE_RESET + all callbacks are set to the corresponding weak (surcharged) functions: + examples HAL_USART_TxCpltCallback(), HAL_USART_RxHalfCpltCallback(). + Exception done for MspInit and MspDeInit functions that are respectively + reset to the legacy weak (surcharged) functions in the HAL_USART_Init() + and HAL_USART_DeInit() only when these callbacks are null (not registered beforehand). + If not, MspInit or MspDeInit are not null, the HAL_USART_Init() and HAL_USART_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand). + + [..] + Callbacks can be registered/unregistered in HAL_USART_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_USART_STATE_READY or HAL_USART_STATE_RESET state, thus registered (user) + MspInit/DeInit callbacks can be used during the Init/DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_USART_RegisterCallback() before calling HAL_USART_DeInit() + or HAL_USART_Init() function. + + [..] + When The compilation define USE_HAL_USART_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available + and weak (surcharged) callbacks are used. + + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup USART USART + * @brief HAL USART Synchronous module driver + * @{ + */ + +#ifdef HAL_USART_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup USART_Private_Constants USART Private Constants + * @{ + */ +#define USART_DUMMY_DATA ((uint16_t) 0xFFFF) /*!< USART transmitted dummy data */ +#define USART_TEACK_REACK_TIMEOUT 1000U /*!< USART TX or RX enable acknowledge time-out value */ +#define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \ + USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8 | \ + USART_CR1_FIFOEN )) /*!< USART CR1 fields of parameters set by USART_SetConfig API */ + +#define USART_CR2_FIELDS ((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | \ + USART_CR2_LBCL | USART_CR2_STOP | USART_CR2_SLVEN | \ + USART_CR2_DIS_NSS)) /*!< USART CR2 fields of parameters set by USART_SetConfig API */ + +#define USART_CR3_FIELDS ((uint32_t)(USART_CR3_TXFTCFG | USART_CR3_RXFTCFG )) /*!< USART or USART CR3 fields of parameters set by USART_SetConfig API */ + +#define USART_BRR_MIN 0x10U /* USART BRR minimum authorized value */ +#define USART_BRR_MAX 0xFFFFU /* USART BRR maximum authorized value */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup USART_Private_Functions + * @{ + */ +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) +void USART_InitCallbacksToDefault(USART_HandleTypeDef *husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ +static void USART_EndTransfer(USART_HandleTypeDef *husart); +static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); +static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); +static void USART_DMAError(DMA_HandleTypeDef *hdma); +static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma); +static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma); +static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout); +static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart); +static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart); +static void USART_TxISR_8BIT(USART_HandleTypeDef *husart); +static void USART_TxISR_16BIT(USART_HandleTypeDef *husart); +static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart); +static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart); +static void USART_EndTransmit_IT(USART_HandleTypeDef *husart); +static void USART_RxISR_8BIT(USART_HandleTypeDef *husart); +static void USART_RxISR_16BIT(USART_HandleTypeDef *husart); +static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart); +static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart); + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup USART_Exported_Functions USART Exported Functions + * @{ + */ + +/** @defgroup USART_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to initialize the USART + in asynchronous and in synchronous modes. + (+) For the asynchronous mode only these parameters can be configured: + (++) Baud Rate + (++) Word Length + (++) Stop Bit + (++) Parity: If the parity is enabled, then the MSB bit of the data written + in the data register is transmitted but is changed by the parity bit. + (++) USART polarity + (++) USART phase + (++) USART LastBit + (++) Receiver/transmitter modes + + [..] + The HAL_USART_Init() function follows the USART synchronous configuration + procedure (details for the procedure are available in reference manual). + +@endverbatim + + Depending on the frame length defined by the M1 and M0 bits (7-bit, + 8-bit or 9-bit), the possible USART formats are listed in the + following table. + + Table 1. USART frame format. + +-----------------------------------------------------------------------+ + | M1 bit | M0 bit | PCE bit | USART frame | + |---------|---------|-----------|---------------------------------------| + | 0 | 0 | 0 | | SB | 8 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 0 | 1 | | SB | 7 bit data | PB | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 1 | 0 | | SB | 9 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 0 | 1 | 1 | | SB | 8 bit data | PB | STB | | + |---------|---------|-----------|---------------------------------------| + | 1 | 0 | 0 | | SB | 7 bit data | STB | | + |---------|---------|-----------|---------------------------------------| + | 1 | 0 | 1 | | SB | 6 bit data | PB | STB | | + +-----------------------------------------------------------------------+ + + * @{ + */ + +/** + * @brief Initialize the USART mode according to the specified + * parameters in the USART_InitTypeDef and initialize the associated handle. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart) +{ + /* Check the USART handle allocation */ + if (husart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_USART_INSTANCE(husart->Instance)); + + if (husart->State == HAL_USART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + husart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + USART_InitCallbacksToDefault(husart); + + if (husart->MspInitCallback == NULL) + { + husart->MspInitCallback = HAL_USART_MspInit; + } + + /* Init the low level hardware */ + husart->MspInitCallback(husart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_USART_MspInit(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + + husart->State = HAL_USART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_USART_DISABLE(husart); + + /* Set the Usart Communication parameters */ + if (USART_SetConfig(husart) == HAL_ERROR) + { + return HAL_ERROR; + } + + /* In Synchronous mode, the following bits must be kept cleared: + - LINEN bit in the USART_CR2 register + - HDSEL, SCEN and IREN bits in the USART_CR3 register. + */ + husart->Instance->CR2 &= ~USART_CR2_LINEN; + husart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN); + + /* Enable the Peripheral */ + __HAL_USART_ENABLE(husart); + + /* TEACK and/or REACK to check before moving husart->State to Ready */ + return (USART_CheckIdleState(husart)); +} + +/** + * @brief DeInitialize the USART peripheral. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart) +{ + /* Check the USART handle allocation */ + if (husart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_USART_INSTANCE(husart->Instance)); + + husart->State = HAL_USART_STATE_BUSY; + + husart->Instance->CR1 = 0x0U; + husart->Instance->CR2 = 0x0U; + husart->Instance->CR3 = 0x0U; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + if (husart->MspDeInitCallback == NULL) + { + husart->MspDeInitCallback = HAL_USART_MspDeInit; + } + /* DeInit the low level hardware */ + husart->MspDeInitCallback(husart); +#else + /* DeInit the low level hardware */ + HAL_USART_MspDeInit(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_RESET; + + /* Process Unlock */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Initialize the USART MSP. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_MspInit(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USART_MspInit can be implemented in the user file + */ +} + +/** + * @brief DeInitialize the USART MSP. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_MspDeInit(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USART_MspDeInit can be implemented in the user file + */ +} + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User USART Callback + * To be used instead of the weak predefined callback + * @param husart usart handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_USART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID + * @arg @ref HAL_USART_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_USART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID + * @arg @ref HAL_USART_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_USART_TX_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_USART_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_USART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_USART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID + * @arg @ref HAL_USART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID + * @arg @ref HAL_USART_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_USART_MSPDEINIT_CB_ID MspDeInit Callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status ++ */ +HAL_StatusTypeDef HAL_USART_RegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID, + pUSART_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(husart); + + if (husart->State == HAL_USART_STATE_READY) + { + switch (CallbackID) + { + case HAL_USART_TX_HALFCOMPLETE_CB_ID : + husart->TxHalfCpltCallback = pCallback; + break; + + case HAL_USART_TX_COMPLETE_CB_ID : + husart->TxCpltCallback = pCallback; + break; + + case HAL_USART_RX_HALFCOMPLETE_CB_ID : + husart->RxHalfCpltCallback = pCallback; + break; + + case HAL_USART_RX_COMPLETE_CB_ID : + husart->RxCpltCallback = pCallback; + break; + + case HAL_USART_TX_RX_COMPLETE_CB_ID : + husart->TxRxCpltCallback = pCallback; + break; + + case HAL_USART_ERROR_CB_ID : + husart->ErrorCallback = pCallback; + break; + + case HAL_USART_ABORT_COMPLETE_CB_ID : + husart->AbortCpltCallback = pCallback; + break; + + case HAL_USART_RX_FIFO_FULL_CB_ID : + husart->RxFifoFullCallback = pCallback; + break; + + case HAL_USART_TX_FIFO_EMPTY_CB_ID : + husart->TxFifoEmptyCallback = pCallback; + break; + + case HAL_USART_MSPINIT_CB_ID : + husart->MspInitCallback = pCallback; + break; + + case HAL_USART_MSPDEINIT_CB_ID : + husart->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (husart->State == HAL_USART_STATE_RESET) + { + switch (CallbackID) + { + case HAL_USART_MSPINIT_CB_ID : + husart->MspInitCallback = pCallback; + break; + + case HAL_USART_MSPDEINIT_CB_ID : + husart->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(husart); + + return status; +} + +/** + * @brief Unregister an USART Callback + * USART callaback is redirected to the weak predefined callback + * @param husart usart handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_USART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID + * @arg @ref HAL_USART_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_USART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID + * @arg @ref HAL_USART_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_USART_TX_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_USART_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_USART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_USART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID + * @arg @ref HAL_USART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID + * @arg @ref HAL_USART_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_USART_MSPDEINIT_CB_ID MspDeInit Callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_UnRegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(husart); + + if (HAL_USART_STATE_READY == husart->State) + { + switch (CallbackID) + { + case HAL_USART_TX_HALFCOMPLETE_CB_ID : + husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + break; + + case HAL_USART_TX_COMPLETE_CB_ID : + husart->TxCpltCallback = HAL_USART_TxCpltCallback; /* Legacy weak TxCpltCallback */ + break; + + case HAL_USART_RX_HALFCOMPLETE_CB_ID : + husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + break; + + case HAL_USART_RX_COMPLETE_CB_ID : + husart->RxCpltCallback = HAL_USART_RxCpltCallback; /* Legacy weak RxCpltCallback */ + break; + + case HAL_USART_TX_RX_COMPLETE_CB_ID : + husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ + break; + + case HAL_USART_ERROR_CB_ID : + husart->ErrorCallback = HAL_USART_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_USART_ABORT_COMPLETE_CB_ID : + husart->AbortCpltCallback = HAL_USART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + break; + + case HAL_USART_RX_FIFO_FULL_CB_ID : + husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */ + break; + + case HAL_USART_TX_FIFO_EMPTY_CB_ID : + husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */ + break; + + case HAL_USART_MSPINIT_CB_ID : + husart->MspInitCallback = HAL_USART_MspInit; /* Legacy weak MspInitCallback */ + break; + + case HAL_USART_MSPDEINIT_CB_ID : + husart->MspDeInitCallback = HAL_USART_MspDeInit; /* Legacy weak MspDeInitCallback */ + break; + + default : + /* Update the error code */ + husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_USART_STATE_RESET == husart->State) + { + switch (CallbackID) + { + case HAL_USART_MSPINIT_CB_ID : + husart->MspInitCallback = HAL_USART_MspInit; + break; + + case HAL_USART_MSPDEINIT_CB_ID : + husart->MspDeInitCallback = HAL_USART_MspDeInit; + break; + + default : + /* Update the error code */ + husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(husart); + + return status; +} +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + + +/** + * @} + */ + +/** @defgroup USART_Exported_Functions_Group2 IO operation functions + * @brief USART Transmit and Receive functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to manage the USART synchronous + data transfers. + + [..] The USART supports master mode only: it cannot receive or send data related to an input + clock (SCLK is always an output). + + [..] + + (#) There are two modes of transfer: + (++) Blocking mode: The communication is performed in polling mode. + The HAL status of all data processing is returned by the same function + after finishing transfer. + (++) No-Blocking mode: The communication is performed using Interrupts + or DMA, These API's return the HAL status. + The end of the data processing will be indicated through the + dedicated USART IRQ when using Interrupt mode or the DMA IRQ when + using DMA mode. + The HAL_USART_TxCpltCallback(), HAL_USART_RxCpltCallback() and HAL_USART_TxRxCpltCallback() user callbacks + will be executed respectively at the end of the transmit or Receive process + The HAL_USART_ErrorCallback()user callback will be executed when a communication error is detected + + (#) Blocking mode API's are : + (++) HAL_USART_Transmit() in simplex mode + (++) HAL_USART_Receive() in full duplex receive only + (++) HAL_USART_TransmitReceive() in full duplex mode + + (#) Non-Blocking mode API's with Interrupt are : + (++) HAL_USART_Transmit_IT() in simplex mode + (++) HAL_USART_Receive_IT() in full duplex receive only + (++) HAL_USART_TransmitReceive_IT() in full duplex mode + (++) HAL_USART_IRQHandler() + + (#) No-Blocking mode API's with DMA are : + (++) HAL_USART_Transmit_DMA() in simplex mode + (++) HAL_USART_Receive_DMA() in full duplex receive only + (++) HAL_USART_TransmitReceive_DMA() in full duplex mode + (++) HAL_USART_DMAPause() + (++) HAL_USART_DMAResume() + (++) HAL_USART_DMAStop() + + (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode: + (++) HAL_USART_TxCpltCallback() + (++) HAL_USART_RxCpltCallback() + (++) HAL_USART_TxHalfCpltCallback() + (++) HAL_USART_RxHalfCpltCallback() + (++) HAL_USART_ErrorCallback() + (++) HAL_USART_TxRxCpltCallback() + + (#) Non-Blocking mode transfers could be aborted using Abort API's : + (++) HAL_USART_Abort() + (++) HAL_USART_Abort_IT() + + (#) For Abort services based on interrupts (HAL_USART_Abort_IT), a Abort Complete Callbacks is provided: + (++) HAL_USART_AbortCpltCallback() + + (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. + Errors are handled as follows : + (++) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is + to be evaluated by user : this concerns Frame Error, + Parity Error or Noise Error in Interrupt mode reception . + Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify + error type, and HAL_USART_ErrorCallback() user callback is executed. + Transfer is kept ongoing on USART side. + If user wants to abort it, Abort services should be called by user. + (++) Error is considered as Blocking : Transfer could not be completed properly and is aborted. + This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode. + Error code is set to allow user to identify error type, + and HAL_USART_ErrorCallback() user callback is executed. + +@endverbatim + * @{ + */ + +/** + * @brief Simplex send an amount of data in blocking mode. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pTxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits) + * (as sent data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pTxData. + * @param husart USART handle. + * @param pTxData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size, + uint32_t Timeout) +{ + const uint8_t *ptxdata8bits; + const uint16_t *ptxdata16bits; + uint32_t tickstart; + + if (husart->State == HAL_USART_STATE_READY) + { + if ((pTxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pTxData buffer provided as input parameter + should be aligned on a u16 frontier, as data to be filled into TDR will be + handled through a u16 cast. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if ((((uint32_t)pTxData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_TX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + husart->TxXferSize = Size; + husart->TxXferCount = Size; + + /* In case of 9bits/No Parity transfer, pTxData needs to be handled as a uint16_t pointer */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + ptxdata8bits = NULL; + ptxdata16bits = (const uint16_t *) pTxData; + } + else + { + ptxdata8bits = pTxData; + ptxdata16bits = NULL; + } + + /* Check the remaining data to be sent */ + while (husart->TxXferCount > 0U) + { + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + if (ptxdata8bits == NULL) + { + husart->Instance->TDR = (uint16_t)(*ptxdata16bits & 0x01FFU); + ptxdata16bits++; + } + else + { + husart->Instance->TDR = (uint8_t)(*ptxdata8bits & 0xFFU); + ptxdata8bits++; + } + + husart->TxXferCount--; + } + + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + + /* Clear Transmission Complete Flag */ + __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); + + /* Clear overrun flag and discard the received data */ + __HAL_USART_CLEAR_OREFLAG(husart); + __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + + /* At end of Tx process, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in blocking mode. + * @note To receive synchronous data, dummy data are simultaneously transmitted. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pRxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on a half word frontier + * (16 bits) (as received data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required to ensure + * proper alignment for pRxData. + * @param husart USART handle. + * @param pRxData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) +{ + uint8_t *prxdata8bits; + uint16_t *prxdata16bits; + uint16_t uhMask; + uint32_t tickstart; + + if (husart->State == HAL_USART_STATE_READY) + { + if ((pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pRxData buffer provided as input parameter + should be aligned on a u16 frontier, as data to be received from RDR will be + handled through a u16 cast. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if ((((uint32_t)pRxData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_RX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + husart->RxXferSize = Size; + husart->RxXferCount = Size; + + /* Computation of USART mask to apply to RDR register */ + USART_MASK_COMPUTATION(husart); + uhMask = husart->Mask; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + prxdata8bits = NULL; + prxdata16bits = (uint16_t *) pRxData; + } + else + { + prxdata8bits = pRxData; + prxdata16bits = NULL; + } + + /* as long as data have to be received */ + while (husart->RxXferCount > 0U) + { + if (husart->SlaveMode == USART_SLAVEMODE_DISABLE) + { + /* Wait until TXE flag is set to send dummy byte in order to generate the + * clock for the slave to send data. + * Whatever the frame length (7, 8 or 9-bit long), the same dummy value + * can be written for all the cases. */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x0FF); + } + + /* Wait for RXNE Flag */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + + if (prxdata8bits == NULL) + { + *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask); + prxdata16bits++; + } + else + { + *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); + prxdata8bits++; + } + + husart->RxXferCount--; + + } + + /* Clear SPI slave underrun flag and discard transmit data */ + if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) + { + __HAL_USART_CLEAR_UDRFLAG(husart); + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + } + + /* At end of Rx process, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Full-Duplex Send and Receive an amount of data in blocking mode. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data and the received data are handled as sets of u16. In this case, Size must indicate the number + * of u16 available through pTxData and through pRxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffers containing data to be sent/received, should be aligned on a half word frontier + * (16 bits) (as sent/received data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required to ensure + * proper alignment for pTxData and pRxData. + * @param husart USART handle. + * @param pTxData pointer to TX data buffer (u8 or u16 data elements). + * @param pRxData pointer to RX data buffer (u8 or u16 data elements). + * @param Size amount of data elements (u8 or u16) to be sent (same amount to be received). + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size, uint32_t Timeout) +{ + uint8_t *prxdata8bits; + uint16_t *prxdata16bits; + const uint8_t *ptxdata8bits; + const uint16_t *ptxdata16bits; + uint16_t uhMask; + uint16_t rxdatacount; + uint32_t tickstart; + + if (husart->State == HAL_USART_STATE_READY) + { + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pTxData and pRxData buffers provided as input parameter + should be aligned on a u16 frontier, as data to be filled into TDR/retrieved from RDR will be + handled through a u16 cast. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if (((((uint32_t)pTxData) & 1U) != 0U) || ((((uint32_t)pRxData) & 1U) != 0U)) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_RX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + husart->RxXferSize = Size; + husart->TxXferSize = Size; + husart->TxXferCount = Size; + husart->RxXferCount = Size; + + /* Computation of USART mask to apply to RDR register */ + USART_MASK_COMPUTATION(husart); + uhMask = husart->Mask; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + prxdata8bits = NULL; + ptxdata8bits = NULL; + ptxdata16bits = (const uint16_t *) pTxData; + prxdata16bits = (uint16_t *) pRxData; + } + else + { + prxdata8bits = pRxData; + ptxdata8bits = pTxData; + ptxdata16bits = NULL; + prxdata16bits = NULL; + } + + if ((husart->TxXferCount == 0x01U) || (husart->SlaveMode == USART_SLAVEMODE_ENABLE)) + { + /* Wait until TXE flag is set to send data */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + if (ptxdata8bits == NULL) + { + husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask); + ptxdata16bits++; + } + else + { + husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU)); + ptxdata8bits++; + } + + husart->TxXferCount--; + } + + /* Check the remain data to be sent */ + /* rxdatacount is a temporary variable for MISRAC2012-Rule-13.5 */ + rxdatacount = husart->RxXferCount; + while ((husart->TxXferCount > 0U) || (rxdatacount > 0U)) + { + if (husart->TxXferCount > 0U) + { + /* Wait until TXE flag is set to send data */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + if (ptxdata8bits == NULL) + { + husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask); + ptxdata16bits++; + } + else + { + husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU)); + ptxdata8bits++; + } + + husart->TxXferCount--; + } + + if (husart->RxXferCount > 0U) + { + /* Wait for RXNE Flag */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + + if (prxdata8bits == NULL) + { + *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask); + prxdata16bits++; + } + else + { + *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); + prxdata8bits++; + } + + husart->RxXferCount--; + } + rxdatacount = husart->RxXferCount; + } + + /* At end of TxRx process, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Send an amount of data in interrupt mode. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pTxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer containing data to be sent, should be aligned on a half word frontier + * (16 bits) (as sent data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required to ensure + * proper alignment for pTxData. + * @param husart USART handle. + * @param pTxData pointer to data buffer (u8 or u16 data elements). + * @param Size amount of data elements (u8 or u16) to be sent. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size) +{ + if (husart->State == HAL_USART_STATE_READY) + { + if ((pTxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pTxData buffer provided as input parameter + should be aligned on a u16 frontier, as data to be filled into TDR will be + handled through a u16 cast. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if ((((uint32_t)pTxData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->pTxBuffPtr = pTxData; + husart->TxXferSize = Size; + husart->TxXferCount = Size; + husart->TxISR = NULL; + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_TX; + + /* The USART Error Interrupts: (Frame error, noise error, overrun error) + are not managed by the USART Transmit Process to avoid the overrun interrupt + when the usart mode is configured for transmit and receive "USART_MODE_TX_RX" + to benefit for the frame error and noise interrupts the usart mode should be + configured only for transmit "USART_MODE_TX" */ + + /* Configure Tx interrupt processing */ + if (husart->FifoMode == USART_FIFOMODE_ENABLE) + { + /* Set the Tx ISR function pointer according to the data word length */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + husart->TxISR = USART_TxISR_16BIT_FIFOEN; + } + else + { + husart->TxISR = USART_TxISR_8BIT_FIFOEN; + } + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + /* Enable the TX FIFO threshold interrupt */ + __HAL_USART_ENABLE_IT(husart, USART_IT_TXFT); + } + else + { + /* Set the Tx ISR function pointer according to the data word length */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + husart->TxISR = USART_TxISR_16BIT; + } + else + { + husart->TxISR = USART_TxISR_8BIT; + } + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + /* Enable the USART Transmit Data Register Empty Interrupt */ + __HAL_USART_ENABLE_IT(husart, USART_IT_TXE); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in interrupt mode. + * @note To receive synchronous data, dummy data are simultaneously transmitted. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pRxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on a half word frontier + * (16 bits) (as received data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required to ensure + * proper alignment for pRxData. + * @param husart USART handle. + * @param pRxData pointer to data buffer (u8 or u16 data elements). + * @param Size amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size) +{ + uint16_t nb_dummy_data; + + if (husart->State == HAL_USART_STATE_READY) + { + if ((pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pRxData buffer provided as input parameter + should be aligned on a u16 frontier, as data to be received from RDR will be + handled through a u16 cast. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if ((((uint32_t)pRxData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->pRxBuffPtr = pRxData; + husart->RxXferSize = Size; + husart->RxXferCount = Size; + husart->RxISR = NULL; + + USART_MASK_COMPUTATION(husart); + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_RX; + + /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */ + SET_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Configure Rx interrupt processing */ + if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) + { + /* Set the Rx ISR function pointer according to the data word length */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + husart->RxISR = USART_RxISR_16BIT_FIFOEN; + } + else + { + husart->RxISR = USART_RxISR_8BIT_FIFOEN; + } + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + /* Enable the USART Parity Error interrupt and RX FIFO Threshold interrupt */ + if (husart->Init.Parity != USART_PARITY_NONE) + { + SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); + } + SET_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); + } + else + { + /* Set the Rx ISR function pointer according to the data word length */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + husart->RxISR = USART_RxISR_16BIT; + } + else + { + husart->RxISR = USART_RxISR_8BIT; + } + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + /* Enable the USART Parity Error and Data Register not empty Interrupts */ + if (husart->Init.Parity != USART_PARITY_NONE) + { + SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE); + } + else + { + SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + } + } + + if (husart->SlaveMode == USART_SLAVEMODE_DISABLE) + { + /* Send dummy data in order to generate the clock for the Slave to send the next data. + When FIFO mode is disabled only one data must be transferred. + When FIFO mode is enabled data must be transmitted until the RX FIFO reaches its threshold. + */ + if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) + { + for (nb_dummy_data = husart->NbRxDataToProcess ; nb_dummy_data > 0U ; nb_dummy_data--) + { + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); + } + } + else + { + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); + } + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Full-Duplex Send and Receive an amount of data in interrupt mode. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data and the received data are handled as sets of u16. In this case, Size must indicate the number + * of u16 available through pTxData and through pRxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffers containing data to be sent/received, should be aligned on a half word frontier + * (16 bits) (as sent/received data will be handled using u16 pointer cast). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required to ensure + * proper alignment for pTxData and pRxData. + * @param husart USART handle. + * @param pTxData pointer to TX data buffer (u8 or u16 data elements). + * @param pRxData pointer to RX data buffer (u8 or u16 data elements). + * @param Size amount of data elements (u8 or u16) to be sent (same amount to be received). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size) +{ + + if (husart->State == HAL_USART_STATE_READY) + { + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pTxData and pRxData buffers provided as input parameter + should be aligned on a u16 frontier, as data to be filled into TDR/retrieved from RDR will be + handled through a u16 cast. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if (((((uint32_t)pTxData) & 1U) != 0U) || ((((uint32_t)pRxData) & 1U) != 0U)) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->pRxBuffPtr = pRxData; + husart->RxXferSize = Size; + husart->RxXferCount = Size; + husart->pTxBuffPtr = pTxData; + husart->TxXferSize = Size; + husart->TxXferCount = Size; + + /* Computation of USART mask to apply to RDR register */ + USART_MASK_COMPUTATION(husart); + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_TX_RX; + + /* Configure TxRx interrupt processing */ + if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess)) + { + /* Set the Rx ISR function pointer according to the data word length */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + husart->TxISR = USART_TxISR_16BIT_FIFOEN; + husart->RxISR = USART_RxISR_16BIT_FIFOEN; + } + else + { + husart->TxISR = USART_TxISR_8BIT_FIFOEN; + husart->RxISR = USART_RxISR_8BIT_FIFOEN; + } + + /* Process Locked */ + __HAL_UNLOCK(husart); + + /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */ + SET_BIT(husart->Instance->CR3, USART_CR3_EIE); + + if (husart->Init.Parity != USART_PARITY_NONE) + { + /* Enable the USART Parity Error interrupt */ + SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); + } + + /* Enable the TX and RX FIFO Threshold interrupts */ + SET_BIT(husart->Instance->CR3, (USART_CR3_TXFTIE | USART_CR3_RXFTIE)); + } + else + { + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + husart->TxISR = USART_TxISR_16BIT; + husart->RxISR = USART_RxISR_16BIT; + } + else + { + husart->TxISR = USART_TxISR_8BIT; + husart->RxISR = USART_RxISR_8BIT; + } + + /* Process Locked */ + __HAL_UNLOCK(husart); + + /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */ + SET_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Enable the USART Parity Error and USART Data Register not empty Interrupts */ + if (husart->Init.Parity != USART_PARITY_NONE) + { + SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE); + } + else + { + SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + } + + /* Enable the USART Transmit Data Register Empty Interrupt */ + SET_BIT(husart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Send an amount of data in DMA mode. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pTxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits) + * (as sent data will be handled by DMA from halfword frontier). Depending on compilation chain, + * use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pTxData. + * @param husart USART handle. + * @param pTxData pointer to data buffer (u8 or u16 data elements). + * @param Size amount of data elements (u8 or u16) to be sent. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size) +{ + HAL_StatusTypeDef status = HAL_OK; + const uint32_t *tmp; + + if (husart->State == HAL_USART_STATE_READY) + { + if ((pTxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pTxData buffer provided as input parameter + should be aligned on a u16 frontier, as data copy into TDR will be + handled by DMA from a u16 frontier. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if ((((uint32_t)pTxData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->pTxBuffPtr = pTxData; + husart->TxXferSize = Size; + husart->TxXferCount = Size; + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_TX; + + if (husart->hdmatx != NULL) + { + /* Set the USART DMA transfer complete callback */ + husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt; + + /* Set the USART DMA Half transfer complete callback */ + husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt; + + /* Set the DMA error callback */ + husart->hdmatx->XferErrorCallback = USART_DMAError; + + /* Enable the USART transmit DMA channel */ + tmp = (const uint32_t *)&pTxData; + status = HAL_DMA_Start_IT(husart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); + } + + if (status == HAL_OK) + { + /* Clear the TC flag in the ICR register */ + __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + /* Enable the DMA transfer for transmit request by setting the DMAT bit + in the USART CR3 register */ + SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); + + return HAL_OK; + } + else + { + /* Set error code to DMA */ + husart->ErrorCode = HAL_USART_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + /* Restore husart->State to ready */ + husart->State = HAL_USART_STATE_READY; + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in DMA mode. + * @note When the USART parity is enabled (PCE = 1), the received data contain + * the parity bit (MSB position). + * @note The USART DMA transmit channel must be configured in order to generate the clock for the slave. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pRxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffer for storing data to be received, should be aligned on + * a half word frontier (16 bits) (as received data will be handled by DMA from halfword frontier). + * Depending on compilation chain, use of specific alignment compilation directives or pragmas + * might be required to ensure proper alignment for pRxData. + * @param husart USART handle. + * @param pRxData pointer to data buffer (u8 or u16 data elements). + * @param Size amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t *tmp = (uint32_t *)&pRxData; + + /* Check that a Rx process is not already ongoing */ + if (husart->State == HAL_USART_STATE_READY) + { + if ((pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pRxData buffer provided as input parameter + should be aligned on a u16 frontier, as data copy from RDR will be + handled by DMA from a u16 frontier. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if ((((uint32_t)pRxData) & 1U) != 0U) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->pRxBuffPtr = pRxData; + husart->RxXferSize = Size; + husart->pTxBuffPtr = pRxData; + husart->TxXferSize = Size; + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_RX; + + if (husart->hdmarx != NULL) + { + /* Set the USART DMA Rx transfer complete callback */ + husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt; + + /* Set the USART DMA Half transfer complete callback */ + husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt; + + /* Set the USART DMA Rx transfer error callback */ + husart->hdmarx->XferErrorCallback = USART_DMAError; + + /* Enable the USART receive DMA channel */ + status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t *)tmp, Size); + } + + if ((status == HAL_OK) && + (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) + { + /* Enable the USART transmit DMA channel: the transmit channel is used in order + to generate in the non-blocking mode the clock to the slave device, + this mode isn't a simplex receive mode but a full-duplex receive mode */ + + /* Set the USART DMA Tx Complete and Error callback to Null */ + if (husart->hdmatx != NULL) + { + husart->hdmatx->XferErrorCallback = NULL; + husart->hdmatx->XferHalfCpltCallback = NULL; + husart->hdmatx->XferCpltCallback = NULL; + status = HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); + } + } + + if (status == HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + if (husart->Init.Parity != USART_PARITY_NONE) + { + /* Enable the USART Parity Error Interrupt */ + SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); + } + + /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */ + SET_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Enable the DMA transfer for the receiver request by setting the DMAR bit + in the USART CR3 register */ + SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); + + /* Enable the DMA transfer for transmit request by setting the DMAT bit + in the USART CR3 register */ + SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); + + return HAL_OK; + } + else + { + if (husart->hdmarx != NULL) + { + status = HAL_DMA_Abort(husart->hdmarx); + } + + /* No need to check on error code */ + UNUSED(status); + + /* Set error code to DMA */ + husart->ErrorCode = HAL_USART_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + /* Restore husart->State to ready */ + husart->State = HAL_USART_STATE_READY; + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Full-Duplex Transmit Receive an amount of data in non-blocking mode. + * @note When the USART parity is enabled (PCE = 1) the data received contain the parity bit. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data and the received data are handled as sets of u16. In this case, Size must indicate the number + * of u16 available through pTxData and through pRxData. + * @note When USART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * address of user data buffers containing data to be sent/received, should be aligned on a half word frontier + * (16 bits) (as sent/received data will be handled by DMA from halfword frontier). Depending on compilation + * chain, use of specific alignment compilation directives or pragmas might be required + * to ensure proper alignment for pTxData and pRxData. + * @param husart USART handle. + * @param pTxData pointer to TX data buffer (u8 or u16 data elements). + * @param pRxData pointer to RX data buffer (u8 or u16 data elements). + * @param Size amount of data elements (u8 or u16) to be received/sent. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size) +{ + HAL_StatusTypeDef status; + const uint32_t *tmp; + + if (husart->State == HAL_USART_STATE_READY) + { + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* In case of 9bits/No Parity transfer, pTxData and pRxData buffers provided as input parameter + should be aligned on a u16 frontier, as data copy to/from TDR/RDR will be + handled by DMA from a u16 frontier. */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + if (((((uint32_t)pTxData) & 1U) != 0U) || ((((uint32_t)pRxData) & 1U) != 0U)) + { + return HAL_ERROR; + } + } + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->pRxBuffPtr = pRxData; + husart->RxXferSize = Size; + husart->pTxBuffPtr = pTxData; + husart->TxXferSize = Size; + + husart->ErrorCode = HAL_USART_ERROR_NONE; + husart->State = HAL_USART_STATE_BUSY_TX_RX; + + if ((husart->hdmarx != NULL) && (husart->hdmatx != NULL)) + { + /* Set the USART DMA Rx transfer complete callback */ + husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt; + + /* Set the USART DMA Half transfer complete callback */ + husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt; + + /* Set the USART DMA Tx transfer complete callback */ + husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt; + + /* Set the USART DMA Half transfer complete callback */ + husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt; + + /* Set the USART DMA Tx transfer error callback */ + husart->hdmatx->XferErrorCallback = USART_DMAError; + + /* Set the USART DMA Rx transfer error callback */ + husart->hdmarx->XferErrorCallback = USART_DMAError; + + /* Enable the USART receive DMA channel */ + tmp = (uint32_t *)&pRxData; + status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(const uint32_t *)tmp, Size); + + /* Enable the USART transmit DMA channel */ + if (status == HAL_OK) + { + tmp = (const uint32_t *)&pTxData; + status = HAL_DMA_Start_IT(husart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size); + } + } + else + { + status = HAL_ERROR; + } + + if (status == HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + if (husart->Init.Parity != USART_PARITY_NONE) + { + /* Enable the USART Parity Error Interrupt */ + SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); + } + + /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */ + SET_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Clear the TC flag in the ICR register */ + __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF); + + /* Enable the DMA transfer for the receiver request by setting the DMAR bit + in the USART CR3 register */ + SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); + + /* Enable the DMA transfer for transmit request by setting the DMAT bit + in the USART CR3 register */ + SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); + + return HAL_OK; + } + else + { + if (husart->hdmarx != NULL) + { + status = HAL_DMA_Abort(husart->hdmarx); + } + + /* No need to check on error code */ + UNUSED(status); + + /* Set error code to DMA */ + husart->ErrorCode = HAL_USART_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + /* Restore husart->State to ready */ + husart->State = HAL_USART_STATE_READY; + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Pause the DMA Transfer. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart) +{ + const HAL_USART_StateTypeDef state = husart->State; + + /* Process Locked */ + __HAL_LOCK(husart); + + if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) && + (state == HAL_USART_STATE_BUSY_TX)) + { + /* Disable the USART DMA Tx request */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); + } + else if ((state == HAL_USART_STATE_BUSY_RX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable the USART DMA Tx request */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); + } + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); + CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Disable the USART DMA Rx request */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); + } + } + else + { + /* Nothing to do */ + } + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Resume the DMA Transfer. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart) +{ + const HAL_USART_StateTypeDef state = husart->State; + + /* Process Locked */ + __HAL_LOCK(husart); + + if (state == HAL_USART_STATE_BUSY_TX) + { + /* Enable the USART DMA Tx request */ + SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); + } + else if ((state == HAL_USART_STATE_BUSY_RX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + /* Clear the Overrun flag before resuming the Rx transfer*/ + __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF); + + /* Re-enable PE and ERR (Frame error, noise error, overrun error) interrupts */ + if (husart->Init.Parity != USART_PARITY_NONE) + { + SET_BIT(husart->Instance->CR1, USART_CR1_PEIE); + } + SET_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Enable the USART DMA Rx request before the DMA Tx request */ + SET_BIT(husart->Instance->CR3, USART_CR3_DMAR); + + /* Enable the USART DMA Tx request */ + SET_BIT(husart->Instance->CR3, USART_CR3_DMAT); + } + else + { + /* Nothing to do */ + } + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Stop the DMA Transfer. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart) +{ + /* The Lock is not implemented on this API to allow the user application + to call the HAL USART API under callbacks HAL_USART_TxCpltCallback() / HAL_USART_RxCpltCallback() / + HAL_USART_TxHalfCpltCallback / HAL_USART_RxHalfCpltCallback: + indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete + interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of + the stream and the corresponding call back is executed. */ + + /* Disable the USART Tx/Rx DMA requests */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the USART DMA tx channel */ + if (husart->hdmatx != NULL) + { + if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + husart->ErrorCode = HAL_USART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + /* Abort the USART DMA rx channel */ + if (husart->hdmarx != NULL) + { + if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + husart->ErrorCode = HAL_USART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + + USART_EndTransfer(husart); + husart->State = HAL_USART_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfers (blocking mode). + * @param husart USART handle. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable USART Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart) +{ + /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | + USART_CR1_TCIE)); + CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); + + /* Abort the USART DMA Tx channel if enabled */ + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable the USART DMA Tx request if enabled */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the USART DMA Tx channel : use blocking DMA Abort API (no callback) */ + if (husart->hdmatx != NULL) + { + /* Set the USART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + husart->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + husart->ErrorCode = HAL_USART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Abort the USART DMA Rx channel if enabled */ + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable the USART DMA Rx request if enabled */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the USART DMA Rx channel : use blocking DMA Abort API (no callback) */ + if (husart->hdmarx != NULL) + { + /* Set the USART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + husart->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + husart->ErrorCode = HAL_USART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx and Rx transfer counters */ + husart->TxXferCount = 0U; + husart->RxXferCount = 0U; + + /* Clear the Error flags in the ICR register */ + __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); + + /* Flush the whole TX FIFO (if needed) */ + if (husart->FifoMode == USART_FIFOMODE_ENABLE) + { + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + } + + /* Discard the received data */ + __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); + + /* Restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + + /* Reset Handle ErrorCode to No Error */ + husart->ErrorCode = HAL_USART_ERROR_NONE; + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfers (Interrupt mode). + * @param husart USART handle. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable USART Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USART_Abort_IT(USART_HandleTypeDef *husart) +{ + uint32_t abortcplt = 1U; + + /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | + USART_CR1_TCIE)); + CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); + + /* If DMA Tx and/or DMA Rx Handles are associated to USART Handle, DMA Abort complete callbacks should be initialised + before any call to DMA Abort functions */ + /* DMA Tx Handle is valid */ + if (husart->hdmatx != NULL) + { + /* Set DMA Abort Complete callback if USART DMA Tx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) + { + husart->hdmatx->XferAbortCallback = USART_DMATxAbortCallback; + } + else + { + husart->hdmatx->XferAbortCallback = NULL; + } + } + /* DMA Rx Handle is valid */ + if (husart->hdmarx != NULL) + { + /* Set DMA Abort Complete callback if USART DMA Rx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) + { + husart->hdmarx->XferAbortCallback = USART_DMARxAbortCallback; + } + else + { + husart->hdmarx->XferAbortCallback = NULL; + } + } + + /* Abort the USART DMA Tx channel if enabled */ + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable DMA Tx at USART level */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the USART DMA Tx channel : use non blocking DMA Abort API (callback) */ + if (husart->hdmatx != NULL) + { + /* USART Tx DMA Abort callback has already been initialised : + will lead to call HAL_USART_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(husart->hdmatx) != HAL_OK) + { + husart->hdmatx->XferAbortCallback = NULL; + } + else + { + abortcplt = 0U; + } + } + } + + /* Abort the USART DMA Rx channel if enabled */ + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable the USART DMA Rx request if enabled */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the USART DMA Rx channel : use non blocking DMA Abort API (callback) */ + if (husart->hdmarx != NULL) + { + /* USART Rx DMA Abort callback has already been initialised : + will lead to call HAL_USART_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK) + { + husart->hdmarx->XferAbortCallback = NULL; + abortcplt = 1U; + } + else + { + abortcplt = 0U; + } + } + } + + /* if no DMA abort complete callback execution is required => call user Abort Complete callback */ + if (abortcplt == 1U) + { + /* Reset Tx and Rx transfer counters */ + husart->TxXferCount = 0U; + husart->RxXferCount = 0U; + + /* Reset errorCode */ + husart->ErrorCode = HAL_USART_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); + + /* Flush the whole TX FIFO (if needed) */ + if (husart->FifoMode == USART_FIFOMODE_ENABLE) + { + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + } + + /* Discard the received data */ + __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); + + /* Restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Complete Callback */ + husart->AbortCpltCallback(husart); +#else + /* Call legacy weak Abort Complete Callback */ + HAL_USART_AbortCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief Handle USART interrupt request. + * @param husart USART handle. + * @retval None + */ +void HAL_USART_IRQHandler(USART_HandleTypeDef *husart) +{ + uint32_t isrflags = READ_REG(husart->Instance->ISR); + uint32_t cr1its = READ_REG(husart->Instance->CR1); + uint32_t cr3its = READ_REG(husart->Instance->CR3); + + uint32_t errorflags; + uint32_t errorcode; + + /* If no error occurs */ + errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF | + USART_ISR_UDR)); + if (errorflags == 0U) + { + /* USART in mode Receiver ---------------------------------------------------*/ + if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) + || ((cr3its & USART_CR3_RXFTIE) != 0U))) + { + if (husart->RxISR != NULL) + { + husart->RxISR(husart); + } + return; + } + } + + /* If some errors occur */ + if ((errorflags != 0U) + && (((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U) + || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U))) + { + /* USART parity error interrupt occurred -------------------------------------*/ + if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U)) + { + __HAL_USART_CLEAR_IT(husart, USART_CLEAR_PEF); + + husart->ErrorCode |= HAL_USART_ERROR_PE; + } + + /* USART frame error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_USART_CLEAR_IT(husart, USART_CLEAR_FEF); + + husart->ErrorCode |= HAL_USART_ERROR_FE; + } + + /* USART noise error interrupt occurred --------------------------------------*/ + if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + __HAL_USART_CLEAR_IT(husart, USART_CLEAR_NEF); + + husart->ErrorCode |= HAL_USART_ERROR_NE; + } + + /* USART Over-Run interrupt occurred -----------------------------------------*/ + if (((isrflags & USART_ISR_ORE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || + ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U))) + { + __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF); + + husart->ErrorCode |= HAL_USART_ERROR_ORE; + } + + /* USART Receiver Timeout interrupt occurred ---------------------------------*/ + if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) + { + __HAL_USART_CLEAR_IT(husart, USART_CLEAR_RTOF); + + husart->ErrorCode |= HAL_USART_ERROR_RTO; + } + + /* USART SPI slave underrun error interrupt occurred -------------------------*/ + if (((isrflags & USART_ISR_UDR) != 0U) && ((cr3its & USART_CR3_EIE) != 0U)) + { + /* Ignore SPI slave underrun errors when reception is going on */ + if (husart->State == HAL_USART_STATE_BUSY_RX) + { + __HAL_USART_CLEAR_UDRFLAG(husart); + return; + } + else + { + __HAL_USART_CLEAR_UDRFLAG(husart); + husart->ErrorCode |= HAL_USART_ERROR_UDR; + } + } + + /* Call USART Error Call back function if need be --------------------------*/ + if (husart->ErrorCode != HAL_USART_ERROR_NONE) + { + /* USART in mode Receiver ---------------------------------------------------*/ + if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) + && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) + || ((cr3its & USART_CR3_RXFTIE) != 0U))) + { + if (husart->RxISR != NULL) + { + husart->RxISR(husart); + } + } + + /* If Overrun error occurs, or if any error occurs in DMA mode reception, + consider error as blocking */ + errorcode = husart->ErrorCode & HAL_USART_ERROR_ORE; + if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) || + (errorcode != 0U)) + { + /* Blocking error : transfer is aborted + Set the USART state ready to be able to start again the process, + Disable Interrupts, and disable DMA requests, if ongoing */ + USART_EndTransfer(husart); + + /* Abort the USART DMA Rx channel if enabled */ + if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) + { + /* Disable the USART DMA Rx request if enabled */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR | USART_CR3_DMAR); + + /* Abort the USART DMA Tx channel */ + if (husart->hdmatx != NULL) + { + /* Set the USART Tx DMA Abort callback to NULL : no callback + executed at end of DMA abort procedure */ + husart->hdmatx->XferAbortCallback = NULL; + + /* Abort DMA TX */ + (void)HAL_DMA_Abort_IT(husart->hdmatx); + } + + /* Abort the USART DMA Rx channel */ + if (husart->hdmarx != NULL) + { + /* Set the USART Rx DMA Abort callback : + will lead to call HAL_USART_ErrorCallback() at end of DMA abort procedure */ + husart->hdmarx->XferAbortCallback = USART_DMAAbortOnError; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK) + { + /* Call Directly husart->hdmarx->XferAbortCallback function in case of error */ + husart->hdmarx->XferAbortCallback(husart->hdmarx); + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Error Callback */ + husart->ErrorCallback(husart); +#else + /* Call legacy weak Error Callback */ + HAL_USART_ErrorCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Error Callback */ + husart->ErrorCallback(husart); +#else + /* Call legacy weak Error Callback */ + HAL_USART_ErrorCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + } + else + { + /* Non Blocking error : transfer could go on. + Error is notified to user through user error callback */ +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Error Callback */ + husart->ErrorCallback(husart); +#else + /* Call legacy weak Error Callback */ + HAL_USART_ErrorCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + husart->ErrorCode = HAL_USART_ERROR_NONE; + } + } + return; + + } /* End if some error occurs */ + + + /* USART in mode Transmitter ------------------------------------------------*/ + if (((isrflags & USART_ISR_TXE_TXFNF) != 0U) + && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U) + || ((cr3its & USART_CR3_TXFTIE) != 0U))) + { + if (husart->TxISR != NULL) + { + husart->TxISR(husart); + } + return; + } + + /* USART in mode Transmitter (transmission end) -----------------------------*/ + if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U)) + { + USART_EndTransmit_IT(husart); + return; + } + + /* USART TX Fifo Empty occurred ----------------------------------------------*/ + if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U)) + { +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Fifo Empty Callback */ + husart->TxFifoEmptyCallback(husart); +#else + /* Call legacy weak Tx Fifo Empty Callback */ + HAL_USARTEx_TxFifoEmptyCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + return; + } + + /* USART RX Fifo Full occurred ----------------------------------------------*/ + if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U)) + { +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Fifo Full Callback */ + husart->RxFifoFullCallback(husart); +#else + /* Call legacy weak Rx Fifo Full Callback */ + HAL_USARTEx_RxFifoFullCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + return; + } +} + +/** + * @brief Tx Transfer completed callback. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USART_TxCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Tx Half Transfer completed callback. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_USART_TxHalfCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Rx Transfer completed callback. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_USART_RxCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Rx Half Transfer completed callback. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USART_RxHalfCpltCallback can be implemented in the user file + */ +} + +/** + * @brief Tx/Rx Transfers completed callback for the non-blocking process. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USART_TxRxCpltCallback can be implemented in the user file + */ +} + +/** + * @brief USART error callback. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USART_ErrorCallback can be implemented in the user file. + */ +} + +/** + * @brief USART Abort Complete callback. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USART_AbortCpltCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup USART_Exported_Functions_Group4 Peripheral State and Error functions + * @brief USART Peripheral State and Error functions + * +@verbatim + ============================================================================== + ##### Peripheral State and Error functions ##### + ============================================================================== + [..] + This subsection provides functions allowing to : + (+) Return the USART handle state + (+) Return the USART handle error code + +@endverbatim + * @{ + */ + + +/** + * @brief Return the USART handle state. + * @param husart pointer to a USART_HandleTypeDef structure that contains + * the configuration information for the specified USART. + * @retval USART handle state + */ +HAL_USART_StateTypeDef HAL_USART_GetState(const USART_HandleTypeDef *husart) +{ + return husart->State; +} + +/** + * @brief Return the USART error code. + * @param husart pointer to a USART_HandleTypeDef structure that contains + * the configuration information for the specified USART. + * @retval USART handle Error Code + */ +uint32_t HAL_USART_GetError(const USART_HandleTypeDef *husart) +{ + return husart->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup USART_Private_Functions USART Private Functions + * @{ + */ + +/** + * @brief Initialize the callbacks to their default values. + * @param husart USART handle. + * @retval none + */ +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) +void USART_InitCallbacksToDefault(USART_HandleTypeDef *husart) +{ + /* Init the USART Callback settings */ + husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + husart->TxCpltCallback = HAL_USART_TxCpltCallback; /* Legacy weak TxCpltCallback */ + husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + husart->RxCpltCallback = HAL_USART_RxCpltCallback; /* Legacy weak RxCpltCallback */ + husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ + husart->ErrorCallback = HAL_USART_ErrorCallback; /* Legacy weak ErrorCallback */ + husart->AbortCpltCallback = HAL_USART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */ + husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */ +} +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + +/** + * @brief End ongoing transfer on USART peripheral (following error detection or Transfer completion). + * @param husart USART handle. + * @retval None + */ +static void USART_EndTransfer(USART_HandleTypeDef *husart) +{ + /* Disable TXEIE, TCIE, RXNE, RXFT, TXFT, PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | + USART_CR1_TCIE)); + CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE)); + + /* At end of process, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; +} + +/** + * @brief DMA USART transmit process complete callback. + * @param hdma DMA handle. + * @retval None + */ +static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); + + /* DMA Normal mode */ + if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC)) + { + husart->TxXferCount = 0U; + + if (husart->State == HAL_USART_STATE_BUSY_TX) + { + /* Disable the DMA transfer for transmit request by resetting the DMAT bit + in the USART CR3 register */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); + + /* Enable the USART Transmit Complete Interrupt */ + __HAL_USART_ENABLE_IT(husart, USART_IT_TC); + } + } + /* DMA Circular mode */ + else + { + if (husart->State == HAL_USART_STATE_BUSY_TX) + { +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Complete Callback */ + husart->TxCpltCallback(husart); +#else + /* Call legacy weak Tx Complete Callback */ + HAL_USART_TxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + } +} + +/** + * @brief DMA USART transmit process half complete callback. + * @param hdma DMA handle. + * @retval None + */ +static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) +{ + USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Half Complete Callback */ + husart->TxHalfCpltCallback(husart); +#else + /* Call legacy weak Tx Half Complete Callback */ + HAL_USART_TxHalfCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA USART receive process complete callback. + * @param hdma DMA handle. + * @retval None + */ +static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); + + /* DMA Normal mode */ + if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC)) + { + husart->RxXferCount = 0U; + + /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); + CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Disable the DMA RX transfer for the receiver request by resetting the DMAR bit + in USART CR3 register */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR); + /* similarly, disable the DMA TX transfer that was started to provide the + clock to the slave device */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); + + if (husart->State == HAL_USART_STATE_BUSY_RX) + { +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Complete Callback */ + husart->RxCpltCallback(husart); +#else + /* Call legacy weak Rx Complete Callback */ + HAL_USART_RxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + /* The USART state is HAL_USART_STATE_BUSY_TX_RX */ + else + { +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Rx Complete Callback */ + husart->TxRxCpltCallback(husart); +#else + /* Call legacy weak Tx Rx Complete Callback */ + HAL_USART_TxRxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + husart->State = HAL_USART_STATE_READY; + } + /* DMA circular mode */ + else + { + if (husart->State == HAL_USART_STATE_BUSY_RX) + { +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Complete Callback */ + husart->RxCpltCallback(husart); +#else + /* Call legacy weak Rx Complete Callback */ + HAL_USART_RxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + /* The USART state is HAL_USART_STATE_BUSY_TX_RX */ + else + { +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Rx Complete Callback */ + husart->TxRxCpltCallback(husart); +#else + /* Call legacy weak Tx Rx Complete Callback */ + HAL_USART_TxRxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + } +} + +/** + * @brief DMA USART receive process half complete callback. + * @param hdma DMA handle. + * @retval None + */ +static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) +{ + USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Half Complete Callback */ + husart->RxHalfCpltCallback(husart); +#else + /* Call legacy weak Rx Half Complete Callback */ + HAL_USART_RxHalfCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA USART communication error callback. + * @param hdma DMA handle. + * @retval None + */ +static void USART_DMAError(DMA_HandleTypeDef *hdma) +{ + USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); + + husart->RxXferCount = 0U; + husart->TxXferCount = 0U; + USART_EndTransfer(husart); + + husart->ErrorCode |= HAL_USART_ERROR_DMA; + husart->State = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Error Callback */ + husart->ErrorCallback(husart); +#else + /* Call legacy weak Error Callback */ + HAL_USART_ErrorCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA USART communication abort callback, when initiated by HAL services on Error + * (To be called at end of DMA Abort procedure following error occurrence). + * @param hdma DMA handle. + * @retval None + */ +static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma) +{ + USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); + husart->RxXferCount = 0U; + husart->TxXferCount = 0U; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Error Callback */ + husart->ErrorCallback(husart); +#else + /* Call legacy weak Error Callback */ + HAL_USART_ErrorCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA USART Tx communication abort callback, when initiated by user + * (To be called at end of DMA Tx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Rx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +{ + USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); + + husart->hdmatx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (husart->hdmarx != NULL) + { + if (husart->hdmarx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + husart->TxXferCount = 0U; + husart->RxXferCount = 0U; + + /* Reset errorCode */ + husart->ErrorCode = HAL_USART_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); + + /* Restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Complete Callback */ + husart->AbortCpltCallback(husart); +#else + /* Call legacy weak Abort Complete Callback */ + HAL_USART_AbortCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + +} + + +/** + * @brief DMA USART Rx communication abort callback, when initiated by user + * (To be called at end of DMA Rx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Tx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +{ + USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent); + + husart->hdmarx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (husart->hdmatx != NULL) + { + if (husart->hdmatx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + husart->TxXferCount = 0U; + husart->RxXferCount = 0U; + + /* Reset errorCode */ + husart->ErrorCode = HAL_USART_ERROR_NONE; + + /* Clear the Error flags in the ICR register */ + __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF); + + /* Restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Complete Callback */ + husart->AbortCpltCallback(husart); +#else + /* Call legacy weak Abort Complete Callback */ + HAL_USART_AbortCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ +} + + +/** + * @brief Handle USART Communication Timeout. It waits + * until a flag is no longer in the specified status. + * @param husart USART handle. + * @param Flag Specifies the USART flag to check. + * @param Status the actual Flag status (SET or RESET). + * @param Tickstart Tick start value + * @param Timeout timeout duration. + * @retval HAL status + */ +static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) +{ + /* Wait until flag is set */ + while ((__HAL_USART_GET_FLAG(husart, Flag) ? SET : RESET) == Status) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_TIMEOUT; + } + } + } + return HAL_OK; +} + +/** + * @brief Configure the USART peripheral. + * @param husart USART handle. + * @retval HAL status + */ +static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart) +{ + uint32_t tmpreg; + USART_ClockSourceTypeDef clocksource; + HAL_StatusTypeDef ret = HAL_OK; + uint16_t brrtemp; + uint32_t usartdiv = 0x00000000; + uint32_t pclk; + + /* Check the parameters */ + assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity)); + assert_param(IS_USART_PHASE(husart->Init.CLKPhase)); + assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit)); + assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate)); + assert_param(IS_USART_WORD_LENGTH(husart->Init.WordLength)); + assert_param(IS_USART_STOPBITS(husart->Init.StopBits)); + assert_param(IS_USART_PARITY(husart->Init.Parity)); + assert_param(IS_USART_MODE(husart->Init.Mode)); + assert_param(IS_USART_PRESCALER(husart->Init.ClockPrescaler)); + + /*-------------------------- USART CR1 Configuration -----------------------*/ + /* Clear M, PCE, PS, TE and RE bits and configure + * the USART Word Length, Parity and Mode: + * set the M bits according to husart->Init.WordLength value + * set PCE and PS bits according to husart->Init.Parity value + * set TE and RE bits according to husart->Init.Mode value + * force OVER8 to 1 to allow to reach the maximum speed (Fclock/8) */ + tmpreg = (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.Mode | USART_CR1_OVER8; + MODIFY_REG(husart->Instance->CR1, USART_CR1_FIELDS, tmpreg); + + /*---------------------------- USART CR2 Configuration ---------------------*/ + /* Clear and configure the USART Clock, CPOL, CPHA, LBCL STOP and SLVEN bits: + * set CPOL bit according to husart->Init.CLKPolarity value + * set CPHA bit according to husart->Init.CLKPhase value + * set LBCL bit according to husart->Init.CLKLastBit value (used in SPI master mode only) + * set STOP[13:12] bits according to husart->Init.StopBits value */ + tmpreg = (uint32_t)(USART_CLOCK_ENABLE); + tmpreg |= (uint32_t)husart->Init.CLKLastBit; + tmpreg |= ((uint32_t)husart->Init.CLKPolarity | (uint32_t)husart->Init.CLKPhase); + tmpreg |= (uint32_t)husart->Init.StopBits; + MODIFY_REG(husart->Instance->CR2, USART_CR2_FIELDS, tmpreg); + + /*-------------------------- USART PRESC Configuration -----------------------*/ + /* Configure + * - USART Clock Prescaler : set PRESCALER according to husart->Init.ClockPrescaler value */ + MODIFY_REG(husart->Instance->PRESC, USART_PRESC_PRESCALER, husart->Init.ClockPrescaler); + + /*-------------------------- USART BRR Configuration -----------------------*/ + /* BRR is filled-up according to OVER8 bit setting which is forced to 1 */ + USART_GETCLOCKSOURCE(husart, clocksource); + + switch (clocksource) + { + case USART_CLOCKSOURCE_PCLK1: + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler)); + break; + case USART_CLOCKSOURCE_HSI: + usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HSI_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler)); + break; + case USART_CLOCKSOURCE_SYSCLK: + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler)); + break; + case USART_CLOCKSOURCE_LSE: + usartdiv = (uint32_t)(USART_DIV_SAMPLING8(LSE_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler)); + break; + default: + ret = HAL_ERROR; + break; + } + + /* USARTDIV must be greater than or equal to 0d16 and smaller than or equal to ffff */ + if ((usartdiv >= USART_BRR_MIN) && (usartdiv <= USART_BRR_MAX)) + { + brrtemp = (uint16_t)(usartdiv & 0xFFF0U); + brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U); + husart->Instance->BRR = brrtemp; + } + else + { + ret = HAL_ERROR; + } + + /* Initialize the number of data to process during RX/TX ISR execution */ + husart->NbTxDataToProcess = 1U; + husart->NbRxDataToProcess = 1U; + + /* Clear ISR function pointers */ + husart->RxISR = NULL; + husart->TxISR = NULL; + + return ret; +} + +/** + * @brief Check the USART Idle State. + * @param husart USART handle. + * @retval HAL status + */ +static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart) +{ + uint32_t tickstart; + + /* Initialize the USART ErrorCode */ + husart->ErrorCode = HAL_USART_ERROR_NONE; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + /* Check if the Transmitter is enabled */ + if ((husart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE) + { + /* Wait until TEACK flag is set */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_TEACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } + /* Check if the Receiver is enabled */ + if ((husart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) + { + /* Wait until REACK flag is set */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_REACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } + + /* Initialize the USART state*/ + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Simplex send an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_USART_Transmit_IT(). + * @note The USART errors are not managed to avoid the overrun error. + * @note ISR function executed when FIFO mode is disabled and when the + * data word length is less than 9 bits long. + * @param husart USART handle. + * @retval None + */ +static void USART_TxISR_8BIT(USART_HandleTypeDef *husart) +{ + const HAL_USART_StateTypeDef state = husart->State; + + /* Check that a Tx process is ongoing */ + if ((state == HAL_USART_STATE_BUSY_TX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + if (husart->TxXferCount == 0U) + { + /* Disable the USART Transmit data register empty interrupt */ + __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); + + /* Enable the USART Transmit Complete Interrupt */ + __HAL_USART_ENABLE_IT(husart, USART_IT_TC); + } + else + { + husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF); + husart->pTxBuffPtr++; + husart->TxXferCount--; + } + } +} + +/** + * @brief Simplex send an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_USART_Transmit_IT(). + * @note The USART errors are not managed to avoid the overrun error. + * @note ISR function executed when FIFO mode is disabled and when the + * data word length is 9 bits long. + * @param husart USART handle. + * @retval None + */ +static void USART_TxISR_16BIT(USART_HandleTypeDef *husart) +{ + const HAL_USART_StateTypeDef state = husart->State; + const uint16_t *tmp; + + if ((state == HAL_USART_STATE_BUSY_TX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + if (husart->TxXferCount == 0U) + { + /* Disable the USART Transmit data register empty interrupt */ + __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); + + /* Enable the USART Transmit Complete Interrupt */ + __HAL_USART_ENABLE_IT(husart, USART_IT_TC); + } + else + { + tmp = (const uint16_t *) husart->pTxBuffPtr; + husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU); + husart->pTxBuffPtr += 2U; + husart->TxXferCount--; + } + } +} + +/** + * @brief Simplex send an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_USART_Transmit_IT(). + * @note The USART errors are not managed to avoid the overrun error. + * @note ISR function executed when FIFO mode is enabled and when the + * data word length is less than 9 bits long. + * @param husart USART handle. + * @retval None + */ +static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart) +{ + const HAL_USART_StateTypeDef state = husart->State; + uint16_t nb_tx_data; + + /* Check that a Tx process is ongoing */ + if ((state == HAL_USART_STATE_BUSY_TX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + for (nb_tx_data = husart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--) + { + if (husart->TxXferCount == 0U) + { + /* Disable the TX FIFO threshold interrupt */ + __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT); + + /* Enable the USART Transmit Complete Interrupt */ + __HAL_USART_ENABLE_IT(husart, USART_IT_TC); + + break; /* force exit loop */ + } + else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET) + { + husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF); + husart->pTxBuffPtr++; + husart->TxXferCount--; + } + else + { + /* Nothing to do */ + } + } + } +} + +/** + * @brief Simplex send an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_USART_Transmit_IT(). + * @note The USART errors are not managed to avoid the overrun error. + * @note ISR function executed when FIFO mode is enabled and when the + * data word length is 9 bits long. + * @param husart USART handle. + * @retval None + */ +static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart) +{ + const HAL_USART_StateTypeDef state = husart->State; + const uint16_t *tmp; + uint16_t nb_tx_data; + + /* Check that a Tx process is ongoing */ + if ((state == HAL_USART_STATE_BUSY_TX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + for (nb_tx_data = husart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--) + { + if (husart->TxXferCount == 0U) + { + /* Disable the TX FIFO threshold interrupt */ + __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT); + + /* Enable the USART Transmit Complete Interrupt */ + __HAL_USART_ENABLE_IT(husart, USART_IT_TC); + + break; /* force exit loop */ + } + else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET) + { + tmp = (const uint16_t *) husart->pTxBuffPtr; + husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU); + husart->pTxBuffPtr += 2U; + husart->TxXferCount--; + } + else + { + /* Nothing to do */ + } + } + } +} + +/** + * @brief Wraps up transmission in non-blocking mode. + * @param husart Pointer to a USART_HandleTypeDef structure that contains + * the configuration information for the specified USART module. + * @retval None + */ +static void USART_EndTransmit_IT(USART_HandleTypeDef *husart) +{ + /* Disable the USART Transmit Complete Interrupt */ + __HAL_USART_DISABLE_IT(husart, USART_IT_TC); + + /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */ + __HAL_USART_DISABLE_IT(husart, USART_IT_ERR); + + /* Clear TxISR function pointer */ + husart->TxISR = NULL; + + if (husart->State == HAL_USART_STATE_BUSY_TX) + { + /* Clear overrun flag and discard the received data */ + __HAL_USART_CLEAR_OREFLAG(husart); + __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); + + /* Tx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Complete Callback */ + husart->TxCpltCallback(husart); +#else + /* Call legacy weak Tx Complete Callback */ + HAL_USART_TxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else if (husart->RxXferCount == 0U) + { + /* TxRx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Rx Complete Callback */ + husart->TxRxCpltCallback(husart); +#else + /* Call legacy weak Tx Rx Complete Callback */ + HAL_USART_TxRxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else + { + /* Nothing to do */ + } +} + + +/** + * @brief Simplex receive an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_USART_Receive_IT(). + * @note ISR function executed when FIFO mode is disabled and when the + * data word length is less than 9 bits long. + * @param husart USART handle + * @retval None + */ +static void USART_RxISR_8BIT(USART_HandleTypeDef *husart) +{ + const HAL_USART_StateTypeDef state = husart->State; + uint16_t txdatacount; + uint16_t uhMask = husart->Mask; + uint32_t txftie; + + if ((state == HAL_USART_STATE_BUSY_RX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask); + husart->pRxBuffPtr++; + husart->RxXferCount--; + + if (husart->RxXferCount == 0U) + { + /* Disable the USART Parity Error Interrupt and RXNE interrupt*/ + CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); + + /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Clear RxISR function pointer */ + husart->RxISR = NULL; + + /* txftie and txdatacount are temporary variables for MISRAC2012-Rule-13.5 */ + txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); + txdatacount = husart->TxXferCount; + + if (state == HAL_USART_STATE_BUSY_RX) + { + /* Clear SPI slave underrun flag and discard transmit data */ + if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) + { + __HAL_USART_CLEAR_UDRFLAG(husart); + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + } + + /* Rx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Complete Callback */ + husart->RxCpltCallback(husart); +#else + /* Call legacy weak Rx Complete Callback */ + HAL_USART_RxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && + (txftie != USART_CR3_TXFTIE) && + (txdatacount == 0U)) + { + /* TxRx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Rx Complete Callback */ + husart->TxRxCpltCallback(husart); +#else + /* Call legacy weak Tx Rx Complete Callback */ + HAL_USART_TxRxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else + { + /* Nothing to do */ + } + } + else if ((state == HAL_USART_STATE_BUSY_RX) && + (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) + { + /* Send dummy byte in order to generate the clock for the Slave to Send the next data */ + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); + } + else + { + /* Nothing to do */ + } + } +} + +/** + * @brief Simplex receive an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_USART_Receive_IT(). + * @note ISR function executed when FIFO mode is disabled and when the + * data word length is 9 bits long. + * @param husart USART handle + * @retval None + */ +static void USART_RxISR_16BIT(USART_HandleTypeDef *husart) +{ + const HAL_USART_StateTypeDef state = husart->State; + uint16_t txdatacount; + uint16_t *tmp; + uint16_t uhMask = husart->Mask; + uint32_t txftie; + + if ((state == HAL_USART_STATE_BUSY_RX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + tmp = (uint16_t *) husart->pRxBuffPtr; + *tmp = (uint16_t)(husart->Instance->RDR & uhMask); + husart->pRxBuffPtr += 2U; + husart->RxXferCount--; + + if (husart->RxXferCount == 0U) + { + /* Disable the USART Parity Error Interrupt and RXNE interrupt*/ + CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)); + + /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE); + + /* Clear RxISR function pointer */ + husart->RxISR = NULL; + + /* txftie and txdatacount are temporary variables for MISRAC2012-Rule-13.5 */ + txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); + txdatacount = husart->TxXferCount; + + if (state == HAL_USART_STATE_BUSY_RX) + { + /* Clear SPI slave underrun flag and discard transmit data */ + if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) + { + __HAL_USART_CLEAR_UDRFLAG(husart); + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + } + + /* Rx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Complete Callback */ + husart->RxCpltCallback(husart); +#else + /* Call legacy weak Rx Complete Callback */ + HAL_USART_RxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && + (txftie != USART_CR3_TXFTIE) && + (txdatacount == 0U)) + { + /* TxRx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Rx Complete Callback */ + husart->TxRxCpltCallback(husart); +#else + /* Call legacy weak Tx Rx Complete Callback */ + HAL_USART_TxRxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else + { + /* Nothing to do */ + } + } + else if ((state == HAL_USART_STATE_BUSY_RX) && + (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) + { + /* Send dummy byte in order to generate the clock for the Slave to Send the next data */ + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); + } + else + { + /* Nothing to do */ + } + } +} + +/** + * @brief Simplex receive an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_USART_Receive_IT(). + * @note ISR function executed when FIFO mode is enabled and when the + * data word length is less than 9 bits long. + * @param husart USART handle + * @retval None + */ +static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart) +{ + HAL_USART_StateTypeDef state = husart->State; + uint16_t txdatacount; + uint16_t rxdatacount; + uint16_t uhMask = husart->Mask; + uint16_t nb_rx_data; + uint32_t txftie; + + /* Check that a Rx process is ongoing */ + if ((state == HAL_USART_STATE_BUSY_RX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + for (nb_rx_data = husart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--) + { + if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET) + { + *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); + husart->pRxBuffPtr++; + husart->RxXferCount--; + + if (husart->RxXferCount == 0U) + { + /* Disable the USART Parity Error Interrupt */ + CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); + + /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) + and RX FIFO Threshold interrupt */ + CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* Clear RxISR function pointer */ + husart->RxISR = NULL; + + /* txftie and txdatacount are temporary variables for MISRAC2012-Rule-13.5 */ + txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); + txdatacount = husart->TxXferCount; + + if (state == HAL_USART_STATE_BUSY_RX) + { + /* Clear SPI slave underrun flag and discard transmit data */ + if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) + { + __HAL_USART_CLEAR_UDRFLAG(husart); + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + } + + /* Rx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + state = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Complete Callback */ + husart->RxCpltCallback(husart); +#else + /* Call legacy weak Rx Complete Callback */ + HAL_USART_RxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && + (txftie != USART_CR3_TXFTIE) && + (txdatacount == 0U)) + { + /* TxRx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + state = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Rx Complete Callback */ + husart->TxRxCpltCallback(husart); +#else + /* Call legacy weak Tx Rx Complete Callback */ + HAL_USART_TxRxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else + { + /* Nothing to do */ + } + } + else if ((state == HAL_USART_STATE_BUSY_RX) && + (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) + { + /* Send dummy byte in order to generate the clock for the Slave to Send the next data */ + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); + } + else + { + /* Nothing to do */ + } + } + } + + /* When remaining number of bytes to receive is less than the RX FIFO + threshold, next incoming frames are processed as if FIFO mode was + disabled (i.e. one interrupt per received frame). + */ + rxdatacount = husart->RxXferCount; + if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess)) + { + /* Disable the USART RXFT interrupt*/ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); + + /* Update the RxISR function pointer */ + husart->RxISR = USART_RxISR_8BIT; + + /* Enable the USART Data Register Not Empty interrupt */ + SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + + if ((husart->TxXferCount == 0U) && + (state == HAL_USART_STATE_BUSY_TX_RX) && + (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) + { + /* Send dummy byte in order to generate the clock for the Slave to Send the next data */ + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); + } + } + } + else + { + /* Clear RXNE interrupt flag */ + __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); + } +} + +/** + * @brief Simplex receive an amount of data in non-blocking mode. + * @note Function called under interruption only, once + * interruptions have been enabled by HAL_USART_Receive_IT(). + * @note ISR function executed when FIFO mode is enabled and when the + * data word length is 9 bits long. + * @param husart USART handle + * @retval None + */ +static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart) +{ + HAL_USART_StateTypeDef state = husart->State; + uint16_t txdatacount; + uint16_t rxdatacount; + uint16_t *tmp; + uint16_t uhMask = husart->Mask; + uint16_t nb_rx_data; + uint32_t txftie; + + /* Check that a Tx process is ongoing */ + if ((state == HAL_USART_STATE_BUSY_RX) || + (state == HAL_USART_STATE_BUSY_TX_RX)) + { + for (nb_rx_data = husart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--) + { + if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET) + { + tmp = (uint16_t *) husart->pRxBuffPtr; + *tmp = (uint16_t)(husart->Instance->RDR & uhMask); + husart->pRxBuffPtr += 2U; + husart->RxXferCount--; + + if (husart->RxXferCount == 0U) + { + /* Disable the USART Parity Error Interrupt */ + CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE); + + /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) + and RX FIFO Threshold interrupt */ + CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE)); + + /* Clear RxISR function pointer */ + husart->RxISR = NULL; + + /* txftie and txdatacount are temporary variables for MISRAC2012-Rule-13.5 */ + txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE); + txdatacount = husart->TxXferCount; + + if (state == HAL_USART_STATE_BUSY_RX) + { + /* Clear SPI slave underrun flag and discard transmit data */ + if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) + { + __HAL_USART_CLEAR_UDRFLAG(husart); + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + } + + /* Rx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + state = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Rx Complete Callback */ + husart->RxCpltCallback(husart); +#else + /* Call legacy weak Rx Complete Callback */ + HAL_USART_RxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) && + (txftie != USART_CR3_TXFTIE) && + (txdatacount == 0U)) + { + /* TxRx process is completed, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + state = HAL_USART_STATE_READY; + +#if (USE_HAL_USART_REGISTER_CALLBACKS == 1) + /* Call registered Tx Rx Complete Callback */ + husart->TxRxCpltCallback(husart); +#else + /* Call legacy weak Tx Rx Complete Callback */ + HAL_USART_TxRxCpltCallback(husart); +#endif /* USE_HAL_USART_REGISTER_CALLBACKS */ + } + else + { + /* Nothing to do */ + } + } + else if ((state == HAL_USART_STATE_BUSY_RX) && + (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) + { + /* Send dummy byte in order to generate the clock for the Slave to Send the next data */ + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); + } + else + { + /* Nothing to do */ + } + } + } + + /* When remaining number of bytes to receive is less than the RX FIFO + threshold, next incoming frames are processed as if FIFO mode was + disabled (i.e. one interrupt per received frame). + */ + rxdatacount = husart->RxXferCount; + if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess)) + { + /* Disable the USART RXFT interrupt*/ + CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE); + + /* Update the RxISR function pointer */ + husart->RxISR = USART_RxISR_16BIT; + + /* Enable the USART Data Register Not Empty interrupt */ + SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE); + + if ((husart->TxXferCount == 0U) && + (state == HAL_USART_STATE_BUSY_TX_RX) && + (husart->SlaveMode == USART_SLAVEMODE_DISABLE)) + { + /* Send dummy byte in order to generate the clock for the Slave to Send the next data */ + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF); + } + } + } + else + { + /* Clear RXNE interrupt flag */ + __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST); + } +} + +/** + * @} + */ + +#endif /* HAL_USART_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_usart_ex.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_usart_ex.c new file mode 100644 index 0000000..5738689 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_usart_ex.c @@ -0,0 +1,541 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_usart_ex.c + * @author MCD Application Team + * @brief Extended USART HAL module driver. + * This file provides firmware functions to manage the following extended + * functionalities of the Universal Synchronous Receiver Transmitter Peripheral (USART). + * + Peripheral Control functions + * + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### USART peripheral extended features ##### + ============================================================================== + + (#) FIFO mode enabling/disabling and RX/TX FIFO threshold programming. + + -@- When USART operates in FIFO mode, FIFO mode must be enabled prior + starting RX/TX transfers. Also RX/TX FIFO thresholds must be + configured prior starting RX/TX transfers. + + (#) Slave mode enabling/disabling and NSS pin configuration. + + -@- When USART operates in Slave mode, Slave mode must be enabled prior + starting RX/TX transfers. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +/** @defgroup USARTEx USARTEx + * @brief USART Extended HAL module driver + * @{ + */ + +#ifdef HAL_USART_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/** @defgroup USARTEx_Private_Constants USARTEx Private Constants + * @{ + */ +/* USART RX FIFO depth */ +#define RX_FIFO_DEPTH 8U + +/* USART TX FIFO depth */ +#define TX_FIFO_DEPTH 8U +/** + * @} + */ + +/* Private define ------------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup USARTEx_Private_Functions USARTEx Private Functions + * @{ + */ +static void USARTEx_SetNbDataToProcess(USART_HandleTypeDef *husart); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup USARTEx_Exported_Functions USARTEx Exported Functions + * @{ + */ + +/** @defgroup USARTEx_Exported_Functions_Group1 IO operation functions + * @brief Extended USART Transmit/Receive functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + This subsection provides a set of FIFO mode related callback functions. + + (#) TX/RX Fifos Callbacks: + (+) HAL_USARTEx_RxFifoFullCallback() + (+) HAL_USARTEx_TxFifoEmptyCallback() + +@endverbatim + * @{ + */ + +/** + * @brief USART RX Fifo full callback. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USARTEx_RxFifoFullCallback can be implemented in the user file. + */ +} + +/** + * @brief USART TX Fifo empty callback. + * @param husart USART handle. + * @retval None + */ +__weak void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_USARTEx_TxFifoEmptyCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup USARTEx_Exported_Functions_Group2 Peripheral Control functions + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] This section provides the following functions: + (+) HAL_USARTEx_EnableSPISlaveMode() API enables the SPI slave mode + (+) HAL_USARTEx_DisableSPISlaveMode() API disables the SPI slave mode + (+) HAL_USARTEx_ConfigNSS API configures the Slave Select input pin (NSS) + (+) HAL_USARTEx_EnableFifoMode() API enables the FIFO mode + (+) HAL_USARTEx_DisableFifoMode() API disables the FIFO mode + (+) HAL_USARTEx_SetTxFifoThreshold() API sets the TX FIFO threshold + (+) HAL_USARTEx_SetRxFifoThreshold() API sets the RX FIFO threshold + + +@endverbatim + * @{ + */ + +/** + * @brief Enable the SPI slave mode. + * @note When the USART operates in SPI slave mode, it handles data flow using + * the serial interface clock derived from the external SCLK signal + * provided by the external master SPI device. + * @note In SPI slave mode, the USART must be enabled before starting the master + * communications (or between frames while the clock is stable). Otherwise, + * if the USART slave is enabled while the master is in the middle of a + * frame, it will become desynchronized with the master. + * @note The data register of the slave needs to be ready before the first edge + * of the communication clock or before the end of the ongoing communication, + * otherwise the SPI slave will transmit zeros. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->State = HAL_USART_STATE_BUSY; + + /* Save actual USART configuration */ + tmpcr1 = READ_REG(husart->Instance->CR1); + + /* Disable USART */ + __HAL_USART_DISABLE(husart); + + /* In SPI slave mode mode, the following bits must be kept cleared: + - LINEN and CLKEN bit in the USART_CR2 register + - HDSEL, SCEN and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(husart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(husart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); + + /* Enable SPI slave mode */ + SET_BIT(husart->Instance->CR2, USART_CR2_SLVEN); + + /* Restore USART configuration */ + WRITE_REG(husart->Instance->CR1, tmpcr1); + + husart->SlaveMode = USART_SLAVEMODE_ENABLE; + + husart->State = HAL_USART_STATE_READY; + + /* Enable USART */ + __HAL_USART_ENABLE(husart); + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Disable the SPI slave mode. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->State = HAL_USART_STATE_BUSY; + + /* Save actual USART configuration */ + tmpcr1 = READ_REG(husart->Instance->CR1); + + /* Disable USART */ + __HAL_USART_DISABLE(husart); + + /* Disable SPI slave mode */ + CLEAR_BIT(husart->Instance->CR2, USART_CR2_SLVEN); + + /* Restore USART configuration */ + WRITE_REG(husart->Instance->CR1, tmpcr1); + + husart->SlaveMode = USART_SLAVEMODE_DISABLE; + + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Configure the Slave Select input pin (NSS). + * @note Software NSS management: SPI slave will always be selected and NSS + * input pin will be ignored. + * @note Hardware NSS management: the SPI slave selection depends on NSS + * input pin. The slave is selected when NSS is low and deselected when + * NSS is high. + * @param husart USART handle. + * @param NSSConfig NSS configuration. + * This parameter can be one of the following values: + * @arg @ref USART_NSS_HARD + * @arg @ref USART_NSS_SOFT + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); + assert_param(IS_USART_NSS(NSSConfig)); + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->State = HAL_USART_STATE_BUSY; + + /* Save actual USART configuration */ + tmpcr1 = READ_REG(husart->Instance->CR1); + + /* Disable USART */ + __HAL_USART_DISABLE(husart); + + /* Program DIS_NSS bit in the USART_CR2 register */ + MODIFY_REG(husart->Instance->CR2, USART_CR2_DIS_NSS, NSSConfig); + + /* Restore USART configuration */ + WRITE_REG(husart->Instance->CR1, tmpcr1); + + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Enable the FIFO mode. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->State = HAL_USART_STATE_BUSY; + + /* Save actual USART configuration */ + tmpcr1 = READ_REG(husart->Instance->CR1); + + /* Disable USART */ + __HAL_USART_DISABLE(husart); + + /* Enable FIFO mode */ + SET_BIT(tmpcr1, USART_CR1_FIFOEN); + husart->FifoMode = USART_FIFOMODE_ENABLE; + + /* Restore USART configuration */ + WRITE_REG(husart->Instance->CR1, tmpcr1); + + /* Determine the number of data to process during RX/TX ISR execution */ + USARTEx_SetNbDataToProcess(husart); + + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Disable the FIFO mode. + * @param husart USART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->State = HAL_USART_STATE_BUSY; + + /* Save actual USART configuration */ + tmpcr1 = READ_REG(husart->Instance->CR1); + + /* Disable USART */ + __HAL_USART_DISABLE(husart); + + /* Enable FIFO mode */ + CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN); + husart->FifoMode = USART_FIFOMODE_DISABLE; + + /* Restore USART configuration */ + WRITE_REG(husart->Instance->CR1, tmpcr1); + + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Set the TXFIFO threshold. + * @param husart USART handle. + * @param Threshold TX FIFO threshold value + * This parameter can be one of the following values: + * @arg @ref USART_TXFIFO_THRESHOLD_1_8 + * @arg @ref USART_TXFIFO_THRESHOLD_1_4 + * @arg @ref USART_TXFIFO_THRESHOLD_1_2 + * @arg @ref USART_TXFIFO_THRESHOLD_3_4 + * @arg @ref USART_TXFIFO_THRESHOLD_7_8 + * @arg @ref USART_TXFIFO_THRESHOLD_8_8 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold) +{ + uint32_t tmpcr1; + + /* Check parameters */ + assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); + assert_param(IS_USART_TXFIFO_THRESHOLD(Threshold)); + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->State = HAL_USART_STATE_BUSY; + + /* Save actual USART configuration */ + tmpcr1 = READ_REG(husart->Instance->CR1); + + /* Disable USART */ + __HAL_USART_DISABLE(husart); + + /* Update TX threshold configuration */ + MODIFY_REG(husart->Instance->CR3, USART_CR3_TXFTCFG, Threshold); + + /* Determine the number of data to process during RX/TX ISR execution */ + USARTEx_SetNbDataToProcess(husart); + + /* Restore USART configuration */ + WRITE_REG(husart->Instance->CR1, tmpcr1); + + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @brief Set the RXFIFO threshold. + * @param husart USART handle. + * @param Threshold RX FIFO threshold value + * This parameter can be one of the following values: + * @arg @ref USART_RXFIFO_THRESHOLD_1_8 + * @arg @ref USART_RXFIFO_THRESHOLD_1_4 + * @arg @ref USART_RXFIFO_THRESHOLD_1_2 + * @arg @ref USART_RXFIFO_THRESHOLD_3_4 + * @arg @ref USART_RXFIFO_THRESHOLD_7_8 + * @arg @ref USART_RXFIFO_THRESHOLD_8_8 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold) +{ + uint32_t tmpcr1; + + /* Check the parameters */ + assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); + assert_param(IS_USART_RXFIFO_THRESHOLD(Threshold)); + + /* Process Locked */ + __HAL_LOCK(husart); + + husart->State = HAL_USART_STATE_BUSY; + + /* Save actual USART configuration */ + tmpcr1 = READ_REG(husart->Instance->CR1); + + /* Disable USART */ + __HAL_USART_DISABLE(husart); + + /* Update RX threshold configuration */ + MODIFY_REG(husart->Instance->CR3, USART_CR3_RXFTCFG, Threshold); + + /* Determine the number of data to process during RX/TX ISR execution */ + USARTEx_SetNbDataToProcess(husart); + + /* Restore USART configuration */ + WRITE_REG(husart->Instance->CR1, tmpcr1); + + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup USARTEx_Private_Functions + * @{ + */ + +/** + * @brief Calculate the number of data to process in RX/TX ISR. + * @note The RX FIFO depth and the TX FIFO depth is extracted from + * the USART configuration registers. + * @param husart USART handle. + * @retval None + */ +static void USARTEx_SetNbDataToProcess(USART_HandleTypeDef *husart) +{ + uint8_t rx_fifo_depth; + uint8_t tx_fifo_depth; + uint8_t rx_fifo_threshold; + uint8_t tx_fifo_threshold; + /* 2 0U/1U added for MISRAC2012-Rule-18.1_b and MISRAC2012-Rule-18.1_d */ + static const uint8_t numerator[] = {1U, 1U, 1U, 3U, 7U, 1U, 0U, 0U}; + static const uint8_t denominator[] = {8U, 4U, 2U, 4U, 8U, 1U, 1U, 1U}; + + if (husart->FifoMode == USART_FIFOMODE_DISABLE) + { + husart->NbTxDataToProcess = 1U; + husart->NbRxDataToProcess = 1U; + } + else + { + rx_fifo_depth = RX_FIFO_DEPTH; + tx_fifo_depth = TX_FIFO_DEPTH; + rx_fifo_threshold = (uint8_t)((READ_BIT(husart->Instance->CR3, + USART_CR3_RXFTCFG) >> USART_CR3_RXFTCFG_Pos) & 0xFFU); + tx_fifo_threshold = (uint8_t)((READ_BIT(husart->Instance->CR3, + USART_CR3_TXFTCFG) >> USART_CR3_TXFTCFG_Pos) & 0xFFU); + husart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) / + (uint16_t)denominator[tx_fifo_threshold]; + husart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) / + (uint16_t)denominator[rx_fifo_threshold]; + } +} +/** + * @} + */ + +#endif /* HAL_USART_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_wwdg.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_wwdg.c new file mode 100644 index 0000000..c2aca28 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_wwdg.c @@ -0,0 +1,420 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_wwdg.c + * @author MCD Application Team + * @brief WWDG HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Window Watchdog (WWDG) peripheral: + * + Initialization and Configuration functions + * + IO operation functions + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### WWDG Specific features ##### + ============================================================================== + [..] + Once enabled the WWDG generates a system reset on expiry of a programmed + time period, unless the program refreshes the counter (T[6;0] downcounter) + before reaching 0x3F value (i.e. a reset is generated when the counter + value rolls down from 0x40 to 0x3F). + + (+) An MCU reset is also generated if the counter value is refreshed + before the counter has reached the refresh window value. This + implies that the counter must be refreshed in a limited window. + (+) Once enabled the WWDG cannot be disabled except by a system reset. + (+) If required by application, an Early Wakeup Interrupt can be triggered + in order to be warned before WWDG expiration. The Early Wakeup Interrupt + (EWI) can be used if specific safety operations or data logging must + be performed before the actual reset is generated. When the downcounter + reaches 0x40, interrupt occurs. This mechanism requires WWDG interrupt + line to be enabled in NVIC. Once enabled, EWI interrupt cannot be + disabled except by a system reset. + (+) WWDGRST flag in RCC CSR register can be used to inform when a WWDG + reset occurs. + (+) The WWDG counter input clock is derived from the APB clock divided + by a programmable prescaler. + (+) WWDG clock (Hz) = PCLK1 / (4096 * Prescaler) + (+) WWDG timeout (mS) = 1000 * (T[5;0] + 1) / WWDG clock (Hz) + where T[5;0] are the lowest 6 bits of Counter. + (+) WWDG Counter refresh is allowed between the following limits : + (++) min time (mS) = 1000 * (Counter - Window) / WWDG clock + (++) max time (mS) = 1000 * (Counter - 0x40) / WWDG clock + (+) Typical values: + (++) Counter min (T[5;0] = 0x00) at 64 MHz (PCLK1) with zero prescaler: + max timeout before reset: approximately 64us + (++) Counter max (T[5;0] = 0x3F) at 64 MHz (PCLK1) with prescaler + dividing by 128: + max timeout before reset: approximately 524.28ms + + ##### How to use this driver ##### + ============================================================================== + + *** Common driver usage *** + =========================== + + [..] + (+) Enable WWDG APB1 clock using __HAL_RCC_WWDG_CLK_ENABLE(). + (+) Configure the WWDG prescaler, refresh window value, counter value and early + interrupt status using HAL_WWDG_Init() function. This will automatically + enable WWDG and start its downcounter. Time reference can be taken from + function exit. Care must be taken to provide a counter value + greater than 0x40 to prevent generation of immediate reset. + (+) If the Early Wakeup Interrupt (EWI) feature is enabled, an interrupt is + generated when the counter reaches 0x40. When HAL_WWDG_IRQHandler is + triggered by the interrupt service routine, flag will be automatically + cleared and HAL_WWDG_WakeupCallback user callback will be executed. User + can add his own code by customization of callback HAL_WWDG_WakeupCallback. + (+) Then the application program must refresh the WWDG counter at regular + intervals during normal operation to prevent an MCU reset, using + HAL_WWDG_Refresh() function. This operation must occur only when + the counter is lower than the refresh window value already programmed. + + *** Callback registration *** + ============================= + + [..] + The compilation define USE_HAL_WWDG_REGISTER_CALLBACKS when set to 1 allows + the user to configure dynamically the driver callbacks. Use Functions + HAL_WWDG_RegisterCallback() to register a user callback. + + (+) Function HAL_WWDG_RegisterCallback() allows to register following + callbacks: + (++) EwiCallback : callback for Early WakeUp Interrupt. + (++) MspInitCallback : WWDG MspInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + (+) Use function HAL_WWDG_UnRegisterCallback() to reset a callback to + the default weak (surcharged) function. HAL_WWDG_UnRegisterCallback() + takes as parameters the HAL peripheral handle and the Callback ID. + This function allows to reset following callbacks: + (++) EwiCallback : callback for Early WakeUp Interrupt. + (++) MspInitCallback : WWDG MspInit. + + [..] + When calling HAL_WWDG_Init function, callbacks are reset to the + corresponding legacy weak (surcharged) functions: + HAL_WWDG_EarlyWakeupCallback() and HAL_WWDG_MspInit() only if they have + not been registered before. + + [..] + When compilation define USE_HAL_WWDG_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registering feature is not available + and weak (surcharged) callbacks are used. + + *** WWDG HAL driver macros list *** + =================================== + [..] + Below the list of available macros in WWDG HAL driver. + (+) __HAL_WWDG_ENABLE: Enable the WWDG peripheral + (+) __HAL_WWDG_GET_FLAG: Get the selected WWDG's flag status + (+) __HAL_WWDG_CLEAR_FLAG: Clear the WWDG's pending flags + (+) __HAL_WWDG_ENABLE_IT: Enable the WWDG early wakeup interrupt + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_HAL_Driver + * @{ + */ + +#ifdef HAL_WWDG_MODULE_ENABLED +/** @defgroup WWDG WWDG + * @brief WWDG HAL module driver. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup WWDG_Exported_Functions WWDG Exported Functions + * @{ + */ + +/** @defgroup WWDG_Exported_Functions_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions. + * +@verbatim + ============================================================================== + ##### Initialization and Configuration functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and start the WWDG according to the specified parameters + in the WWDG_InitTypeDef of associated handle. + (+) Initialize the WWDG MSP. + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the WWDG according to the specified. + * parameters in the WWDG_InitTypeDef of associated handle. + * @param hwwdg pointer to a WWDG_HandleTypeDef structure that contains + * the configuration information for the specified WWDG module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg) +{ + /* Check the WWDG handle allocation */ + if (hwwdg == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance)); + assert_param(IS_WWDG_PRESCALER(hwwdg->Init.Prescaler)); + assert_param(IS_WWDG_WINDOW(hwwdg->Init.Window)); + assert_param(IS_WWDG_COUNTER(hwwdg->Init.Counter)); + assert_param(IS_WWDG_EWI_MODE(hwwdg->Init.EWIMode)); + +#if (USE_HAL_WWDG_REGISTER_CALLBACKS == 1) + /* Reset Callback pointers */ + if (hwwdg->EwiCallback == NULL) + { + hwwdg->EwiCallback = HAL_WWDG_EarlyWakeupCallback; + } + + if (hwwdg->MspInitCallback == NULL) + { + hwwdg->MspInitCallback = HAL_WWDG_MspInit; + } + + /* Init the low level hardware */ + hwwdg->MspInitCallback(hwwdg); +#else + /* Init the low level hardware */ + HAL_WWDG_MspInit(hwwdg); +#endif /* USE_HAL_WWDG_REGISTER_CALLBACKS */ + + /* Set WWDG Counter */ + WRITE_REG(hwwdg->Instance->CR, (WWDG_CR_WDGA | hwwdg->Init.Counter)); + + /* Set WWDG Prescaler and Window */ + WRITE_REG(hwwdg->Instance->CFR, (hwwdg->Init.EWIMode | hwwdg->Init.Prescaler | hwwdg->Init.Window)); + + /* Return function status */ + return HAL_OK; +} + + +/** + * @brief Initialize the WWDG MSP. + * @param hwwdg pointer to a WWDG_HandleTypeDef structure that contains + * the configuration information for the specified WWDG module. + * @note When rewriting this function in user file, mechanism may be added + * to avoid multiple initialize when HAL_WWDG_Init function is called + * again to change parameters. + * @retval None + */ +__weak void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hwwdg); + + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_WWDG_MspInit could be implemented in the user file + */ +} + + +#if (USE_HAL_WWDG_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User WWDG Callback + * To be used instead of the weak (surcharged) predefined callback + * @param hwwdg WWDG handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_WWDG_EWI_CB_ID Early WakeUp Interrupt Callback ID + * @arg @ref HAL_WWDG_MSPINIT_CB_ID MspInit callback ID + * @param pCallback pointer to the Callback function + * @retval status + */ +HAL_StatusTypeDef HAL_WWDG_RegisterCallback(WWDG_HandleTypeDef *hwwdg, HAL_WWDG_CallbackIDTypeDef CallbackID, + pWWDG_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + status = HAL_ERROR; + } + else + { + switch (CallbackID) + { + case HAL_WWDG_EWI_CB_ID: + hwwdg->EwiCallback = pCallback; + break; + + case HAL_WWDG_MSPINIT_CB_ID: + hwwdg->MspInitCallback = pCallback; + break; + + default: + status = HAL_ERROR; + break; + } + } + + return status; +} + + +/** + * @brief Unregister a WWDG Callback + * WWDG Callback is redirected to the weak (surcharged) predefined callback + * @param hwwdg WWDG handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_WWDG_EWI_CB_ID Early WakeUp Interrupt Callback ID + * @arg @ref HAL_WWDG_MSPINIT_CB_ID MspInit callback ID + * @retval status + */ +HAL_StatusTypeDef HAL_WWDG_UnRegisterCallback(WWDG_HandleTypeDef *hwwdg, HAL_WWDG_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + switch (CallbackID) + { + case HAL_WWDG_EWI_CB_ID: + hwwdg->EwiCallback = HAL_WWDG_EarlyWakeupCallback; + break; + + case HAL_WWDG_MSPINIT_CB_ID: + hwwdg->MspInitCallback = HAL_WWDG_MspInit; + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} +#endif /* USE_HAL_WWDG_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup WWDG_Exported_Functions_Group2 IO operation functions + * @brief IO operation functions + * +@verbatim + ============================================================================== + ##### IO operation functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Refresh the WWDG. + (+) Handle WWDG interrupt request and associated function callback. + +@endverbatim + * @{ + */ + +/** + * @brief Refresh the WWDG. + * @param hwwdg pointer to a WWDG_HandleTypeDef structure that contains + * the configuration information for the specified WWDG module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg) +{ + /* Write to WWDG CR the WWDG Counter value to refresh with */ + WRITE_REG(hwwdg->Instance->CR, (hwwdg->Init.Counter)); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Handle WWDG interrupt request. + * @note The Early Wakeup Interrupt (EWI) can be used if specific safety operations + * or data logging must be performed before the actual reset is generated. + * The EWI interrupt is enabled by calling HAL_WWDG_Init function with + * EWIMode set to WWDG_EWI_ENABLE. + * When the downcounter reaches the value 0x40, and EWI interrupt is + * generated and the corresponding Interrupt Service Routine (ISR) can + * be used to trigger specific actions (such as communications or data + * logging), before resetting the device. + * @param hwwdg pointer to a WWDG_HandleTypeDef structure that contains + * the configuration information for the specified WWDG module. + * @retval None + */ +void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg) +{ + /* Check if Early Wakeup Interrupt is enable */ + if (__HAL_WWDG_GET_IT_SOURCE(hwwdg, WWDG_IT_EWI) != RESET) + { + /* Check if WWDG Early Wakeup Interrupt occurred */ + if (__HAL_WWDG_GET_FLAG(hwwdg, WWDG_FLAG_EWIF) != RESET) + { + /* Clear the WWDG Early Wakeup flag */ + __HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF); + +#if (USE_HAL_WWDG_REGISTER_CALLBACKS == 1) + /* Early Wakeup registered callback */ + hwwdg->EwiCallback(hwwdg); +#else + /* Early Wakeup callback */ + HAL_WWDG_EarlyWakeupCallback(hwwdg); +#endif /* USE_HAL_WWDG_REGISTER_CALLBACKS */ + } + } +} + + +/** + * @brief WWDG Early Wakeup callback. + * @param hwwdg pointer to a WWDG_HandleTypeDef structure that contains + * the configuration information for the specified WWDG module. + * @retval None + */ +__weak void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hwwdg); + + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_WWDG_EarlyWakeupCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_WWDG_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_adc.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_adc.c new file mode 100644 index 0000000..d941ced --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_adc.c @@ -0,0 +1,787 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_adc.c + * @author MCD Application Team + * @brief ADC LL module driver + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_adc.h" +#include "stm32g0xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (ADC1) + +/** @addtogroup ADC_LL ADC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup ADC_LL_Private_Constants + * @{ + */ + +/* Definitions of ADC hardware constraints delays */ +/* Note: Only ADC peripheral HW delays are defined in ADC LL driver driver, */ +/* not timeout values: */ +/* Timeout values for ADC operations are dependent to device clock */ +/* configuration (system clock versus ADC clock), */ +/* and therefore must be defined in user application. */ +/* Refer to @ref ADC_LL_EC_HW_DELAYS for description of ADC timeout */ +/* values definition. */ +/* Note: ADC timeout values are defined here in CPU cycles to be independent */ +/* of device clock setting. */ +/* In user application, ADC timeout values should be defined with */ +/* temporal values, in function of device clock settings. */ +/* Highest ratio CPU clock frequency vs ADC clock frequency: */ +/* - ADC clock from synchronous clock with AHB prescaler 512, */ +/* APB prescaler 16, ADC prescaler 4. */ +/* - ADC clock from asynchronous clock (HSI) with prescaler 1, */ +/* with highest ratio CPU clock frequency vs HSI clock frequency: */ +/* CPU clock frequency max 56MHz, HSI frequency 16MHz: ratio 4. */ +/* Unit: CPU cycles. */ +#define ADC_CLOCK_RATIO_VS_CPU_HIGHEST (512UL * 16UL * 4UL) +#define ADC_TIMEOUT_DISABLE_CPU_CYCLES (ADC_CLOCK_RATIO_VS_CPU_HIGHEST * 1UL) +#define ADC_TIMEOUT_STOP_CONVERSION_CPU_CYCLES (ADC_CLOCK_RATIO_VS_CPU_HIGHEST * 1UL) +/* Note: CCRDY handshake requires 1APB + 2 ADC + 3 APB cycles */ +/* after the channel configuration has been changed. */ +/* Driver timeout is approximated to 6 CPU cycles. */ +#define ADC_TIMEOUT_CCRDY_CPU_CYCLES (ADC_CLOCK_RATIO_VS_CPU_HIGHEST * 6UL) + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup ADC_LL_Private_Macros + * @{ + */ + +/* Check of parameters for configuration of ADC hierarchical scope: */ +/* common to several ADC instances. */ +#define IS_LL_ADC_COMMON_CLOCK(__CLOCK__) \ + (((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV1) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV2) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV4) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV6) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV8) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV10) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV12) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV16) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV32) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV64) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV128) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC_DIV256) \ + ) + +#define IS_LL_ADC_CLOCK_FREQ_MODE(__CLOCK_FREQ_MODE__) \ + (((__CLOCK_FREQ_MODE__) == LL_ADC_CLOCK_FREQ_MODE_HIGH) \ + || ((__CLOCK_FREQ_MODE__) == LL_ADC_CLOCK_FREQ_MODE_LOW) \ + ) + +/* Check of parameters for configuration of ADC hierarchical scope: */ +/* ADC instance. */ +#define IS_LL_ADC_CLOCK(__CLOCK__) \ + (((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV4) \ + || ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV2) \ + || ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV1) \ + || ((__CLOCK__) == LL_ADC_CLOCK_ASYNC) \ + ) + +#define IS_LL_ADC_RESOLUTION(__RESOLUTION__) \ + (((__RESOLUTION__) == LL_ADC_RESOLUTION_12B) \ + || ((__RESOLUTION__) == LL_ADC_RESOLUTION_10B) \ + || ((__RESOLUTION__) == LL_ADC_RESOLUTION_8B) \ + || ((__RESOLUTION__) == LL_ADC_RESOLUTION_6B) \ + ) + +#define IS_LL_ADC_DATA_ALIGN(__DATA_ALIGN__) \ + (((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_RIGHT) \ + || ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_LEFT) \ + ) + +#define IS_LL_ADC_LOW_POWER(__LOW_POWER__) \ + (((__LOW_POWER__) == LL_ADC_LP_MODE_NONE) \ + || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT) \ + || ((__LOW_POWER__) == LL_ADC_LP_AUTOPOWEROFF) \ + || ((__LOW_POWER__) == LL_ADC_LP_AUTOWAIT_AUTOPOWEROFF) \ + ) + +/* Check of parameters for configuration of ADC hierarchical scope: */ +/* ADC group regular */ +#if defined(TIM15) && defined(TIM6) && defined(TIM2) +#define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \ + (((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_TRGO2) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH4 ) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM6_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM15_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11) \ + ) +#elif defined(TIM15) && defined(TIM6) +#define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \ + (((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_TRGO2) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH4 ) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM6_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM15_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11) \ + ) +#elif defined(TIM2) +#define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \ + (((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_TRGO2) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH4 ) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11) \ + ) +#else +#define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \ + (((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_TRGO2) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH4 ) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11) \ + ) +#endif /* TIM15 && TIM6 && TIM2 */ + +#define IS_LL_ADC_REG_CONTINUOUS_MODE(__REG_CONTINUOUS_MODE__) \ + (((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_SINGLE) \ + || ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_CONTINUOUS) \ + ) + +#define IS_LL_ADC_REG_DMA_TRANSFER(__REG_DMA_TRANSFER__) \ + (((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_NONE) \ + || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_LIMITED) \ + || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_UNLIMITED) \ + ) + +#define IS_LL_ADC_REG_OVR_DATA_BEHAVIOR(__REG_OVR_DATA_BEHAVIOR__) \ + (((__REG_OVR_DATA_BEHAVIOR__) == LL_ADC_REG_OVR_DATA_PRESERVED) \ + || ((__REG_OVR_DATA_BEHAVIOR__) == LL_ADC_REG_OVR_DATA_OVERWRITTEN) \ + ) + +#define IS_LL_ADC_REG_SEQ_MODE(__REG_SEQ_MODE__) \ + (((__REG_SEQ_MODE__) == LL_ADC_REG_SEQ_FIXED) \ + || ((__REG_SEQ_MODE__) == LL_ADC_REG_SEQ_CONFIGURABLE) \ + ) + +#define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__) \ + (((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS) \ + ) + +#define IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(__REG_SEQ_DISCONT_MODE__) \ + (((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_DISABLE) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_1RANK) \ + ) + +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup ADC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup ADC_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize registers of all ADC instances belonging to + * the same ADC common instance to their default reset values. + * @note This function is performing a hard reset, using high level + * clock source RCC ADC reset. + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC common registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_ADC_CommonDeInit(ADC_Common_TypeDef *ADCxy_COMMON) +{ + /* Check the parameters */ + assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON)); + + /* Prevent unused argument(s) compilation warning if no assert_param check */ + (void)(ADCxy_COMMON); + + /* Force reset of ADC clock (core clock) */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_ADC); + + /* Release reset of ADC clock (core clock) */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_ADC); + + return SUCCESS; +} + +/** + * @brief Initialize some features of ADC common parameters + * (all ADC instances belonging to the same ADC common instance) + * and multimode (for devices with several ADC instances available). + * @note The setting of ADC common parameters is conditioned to + * ADC instances state: + * All ADC instances belonging to the same ADC common instance + * must be disabled. + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @param pADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC common registers are initialized + * - ERROR: ADC common registers are not initialized + */ +ErrorStatus LL_ADC_CommonInit(ADC_Common_TypeDef *ADCxy_COMMON, LL_ADC_CommonInitTypeDef *pADC_CommonInitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON)); + assert_param(IS_LL_ADC_COMMON_CLOCK(pADC_CommonInitStruct->CommonClock)); + + /* Note: Hardware constraint (refer to description of functions */ + /* "LL_ADC_SetCommonXXX()": */ + /* On this STM32 series, setting of these features is conditioned to */ + /* ADC state: */ + /* All ADC instances of the ADC common group must be disabled. */ + if (__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(ADCxy_COMMON) == 0UL) + { + /* Configuration of ADC hierarchical scope: */ + /* - common to several ADC */ + /* (all ADC instances belonging to the same ADC common instance) */ + /* - Set ADC clock (conversion clock) */ + LL_ADC_SetCommonClock(ADCxy_COMMON, pADC_CommonInitStruct->CommonClock); + } + else + { + /* Initialization error: One or several ADC instances belonging to */ + /* the same ADC common instance are not disabled. */ + status = ERROR; + } + + return status; +} + +/** + * @brief Set each @ref LL_ADC_CommonInitTypeDef field to default value. + * @param pADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *pADC_CommonInitStruct) +{ + /* Set pADC_CommonInitStruct fields to default values */ + /* Set fields of ADC common */ + /* (all ADC instances belonging to the same ADC common instance) */ + pADC_CommonInitStruct->CommonClock = LL_ADC_CLOCK_ASYNC_DIV2; + +} + +/** + * @brief De-initialize registers of the selected ADC instance + * to their default reset values. + * @note To reset all ADC instances quickly (perform a hard reset), + * use function @ref LL_ADC_CommonDeInit(). + * @note If this functions returns error status, it means that ADC instance + * is in an unknown state. + * In this case, perform a hard reset using high level + * clock source RCC ADC reset. + * Refer to function @ref LL_ADC_CommonDeInit(). + * @param ADCx ADC instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC registers are de-initialized + * - ERROR: ADC registers are not de-initialized + */ +ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx) +{ + ErrorStatus status = SUCCESS; + + __IO uint32_t timeout_cpu_cycles = 0UL; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_INSTANCE(ADCx)); + + /* Disable ADC instance if not already disabled. */ + if (LL_ADC_IsEnabled(ADCx) == 1UL) + { + /* Set ADC group regular trigger source to SW start to ensure to not */ + /* have an external trigger event occurring during the conversion stop */ + /* ADC disable process. */ + LL_ADC_REG_SetTriggerSource(ADCx, LL_ADC_REG_TRIG_SOFTWARE); + + /* Stop potential ADC conversion on going on ADC group regular. */ + if (LL_ADC_REG_IsConversionOngoing(ADCx) != 0UL) + { + if (LL_ADC_REG_IsStopConversionOngoing(ADCx) == 0UL) + { + LL_ADC_REG_StopConversion(ADCx); + } + } + + /* Wait for ADC conversions are effectively stopped */ + timeout_cpu_cycles = ADC_TIMEOUT_STOP_CONVERSION_CPU_CYCLES; + while (LL_ADC_REG_IsStopConversionOngoing(ADCx) == 1UL) + { + timeout_cpu_cycles--; + if (timeout_cpu_cycles == 0UL) + { + /* Time-out error */ + status = ERROR; + break; + } + } + + /* Disable the ADC instance */ + LL_ADC_Disable(ADCx); + + /* Wait for ADC instance is effectively disabled */ + timeout_cpu_cycles = ADC_TIMEOUT_DISABLE_CPU_CYCLES; + while (LL_ADC_IsDisableOngoing(ADCx) == 1UL) + { + timeout_cpu_cycles--; + if (timeout_cpu_cycles == 0UL) + { + /* Time-out error */ + status = ERROR; + break; + } + } + } + + /* Check whether ADC state is compliant with expected state */ + if (READ_BIT(ADCx->CR, + (ADC_CR_ADSTP | ADC_CR_ADSTART + | ADC_CR_ADDIS | ADC_CR_ADEN) + ) + == 0UL) + { + /* ========== Reset ADC registers ========== */ + /* Reset register IER */ + CLEAR_BIT(ADCx->IER, + (LL_ADC_IT_ADRDY + | LL_ADC_IT_EOC + | LL_ADC_IT_EOS + | LL_ADC_IT_OVR + | LL_ADC_IT_EOSMP + | LL_ADC_IT_AWD1 + | LL_ADC_IT_AWD2 + | LL_ADC_IT_AWD3 + | LL_ADC_IT_EOCAL + | LL_ADC_IT_CCRDY + ) + ); + + /* Reset register ISR */ + SET_BIT(ADCx->ISR, + (LL_ADC_FLAG_ADRDY + | LL_ADC_FLAG_EOC + | LL_ADC_FLAG_EOS + | LL_ADC_FLAG_OVR + | LL_ADC_FLAG_EOSMP + | LL_ADC_FLAG_AWD1 + | LL_ADC_FLAG_AWD2 + | LL_ADC_FLAG_AWD3 + | LL_ADC_FLAG_EOCAL + | LL_ADC_FLAG_CCRDY + ) + ); + + /* Reset register CR */ + /* Bits ADC_CR_ADCAL, ADC_CR_ADSTP, ADC_CR_ADSTART are in access mode */ + /* "read-set": no direct reset applicable. */ + CLEAR_BIT(ADCx->CR, ADC_CR_ADVREGEN); + + /* Reset register CFGR1 */ + CLEAR_BIT(ADCx->CFGR1, + (ADC_CFGR1_AWD1CH | ADC_CFGR1_AWD1EN | ADC_CFGR1_AWD1SGL | ADC_CFGR1_DISCEN + | ADC_CFGR1_AUTOFF | ADC_CFGR1_WAIT | ADC_CFGR1_CONT | ADC_CFGR1_OVRMOD + | ADC_CFGR1_EXTEN | ADC_CFGR1_EXTSEL | ADC_CFGR1_ALIGN | ADC_CFGR1_RES + | ADC_CFGR1_SCANDIR | ADC_CFGR1_DMACFG | ADC_CFGR1_DMAEN) + ); + + /* Reset register CFGR2 */ + /* Note: Update of ADC clock mode is conditioned to ADC state disabled: */ + /* already done above. */ + CLEAR_BIT(ADCx->CFGR2, + (ADC_CFGR2_CKMODE + | ADC_CFGR2_TOVS | ADC_CFGR2_OVSS | ADC_CFGR2_OVSR + | ADC_CFGR2_OVSE) + ); + + /* Reset register SMPR */ + CLEAR_BIT(ADCx->SMPR, ADC_SMPR_SMP1 | ADC_SMPR_SMP2 | ADC_SMPR_SMPSEL); + + /* Reset register AWD1TR */ + MODIFY_REG(ADCx->AWD1TR, ADC_AWD1TR_HT1 | ADC_AWD1TR_LT1, ADC_AWD1TR_HT1); + + /* Reset register AWD2TR */ + MODIFY_REG(ADCx->AWD2TR, ADC_AWD2TR_HT2 | ADC_AWD2TR_LT2, ADC_AWD2TR_HT2); + + /* Reset register AWD3TR */ + MODIFY_REG(ADCx->AWD3TR, ADC_AWD3TR_HT3 | ADC_AWD3TR_LT3, ADC_AWD3TR_HT3); + + /* Reset register CHSELR */ + CLEAR_BIT(ADCx->CHSELR, + (ADC_CHSELR_CHSEL18 | ADC_CHSELR_CHSEL17 | ADC_CHSELR_CHSEL16 + | ADC_CHSELR_CHSEL15 | ADC_CHSELR_CHSEL14 | ADC_CHSELR_CHSEL13 | ADC_CHSELR_CHSEL12 + | ADC_CHSELR_CHSEL11 | ADC_CHSELR_CHSEL10 | ADC_CHSELR_CHSEL9 | ADC_CHSELR_CHSEL8 + | ADC_CHSELR_CHSEL7 | ADC_CHSELR_CHSEL6 | ADC_CHSELR_CHSEL5 | ADC_CHSELR_CHSEL4 + | ADC_CHSELR_CHSEL3 | ADC_CHSELR_CHSEL2 | ADC_CHSELR_CHSEL1 | ADC_CHSELR_CHSEL0) + ); + + /* Wait for ADC channel configuration ready */ + timeout_cpu_cycles = ADC_TIMEOUT_CCRDY_CPU_CYCLES; + while (LL_ADC_IsActiveFlag_CCRDY(ADCx) == 0UL) + { + timeout_cpu_cycles--; + if (timeout_cpu_cycles == 0UL) + { + /* Time-out error */ + status = ERROR; + break; + } + } + + /* Clear flag ADC channel configuration ready */ + LL_ADC_ClearFlag_CCRDY(ADCx); + + /* Reset register DR */ + /* bits in access mode read only, no direct reset applicable */ + + /* Reset register CALFACT */ + CLEAR_BIT(ADCx->CALFACT, ADC_CALFACT_CALFACT); + + } + else + { + /* ADC instance is in an unknown state */ + /* Need to performing a hard reset of ADC instance, using high level */ + /* clock source RCC ADC reset. */ + /* Caution: On this STM32 series, if several ADC instances are available */ + /* on the selected device, RCC ADC reset will reset */ + /* all ADC instances belonging to the common ADC instance. */ + status = ERROR; + } + + return status; +} + +/** + * @brief Initialize some features of ADC instance. + * @note These parameters have an impact on ADC scope: ADC instance. + * Refer to corresponding unitary functions into + * @ref ADC_LL_EF_Configuration_ADC_Instance . + * @note The setting of these parameters by function @ref LL_ADC_Init() + * is conditioned to ADC state: + * ADC instance must be disabled. + * This condition is applied to all ADC features, for efficiency + * and compatibility over all STM32 families. However, the different + * features can be set under different ADC state conditions + * (setting possible with ADC enabled without conversion on going, + * ADC enabled with conversion on going, ...) + * Each feature can be updated afterwards with a unitary function + * and potentially with ADC in a different state than disabled, + * refer to description of each function for setting + * conditioned to ADC state. + * @note After using this function, some other features must be configured + * using LL unitary functions. + * The minimum configuration remaining to be done is: + * - Set ADC group regular sequencer: + * Depending on the sequencer mode (refer to + * function @ref LL_ADC_REG_SetSequencerConfigurable() ): + * - map channel on the selected sequencer rank. + * Refer to function @ref LL_ADC_REG_SetSequencerRanks(); + * - map channel on rank corresponding to channel number. + * Refer to function @ref LL_ADC_REG_SetSequencerChannels(); + * - Set ADC channel sampling time + * Refer to function LL_ADC_SetSamplingTimeCommonChannels(); + * Refer to function LL_ADC_SetChannelSamplingTime(); + * @param ADCx ADC instance + * @param pADC_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC registers are initialized + * - ERROR: ADC registers are not initialized + */ +ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, LL_ADC_InitTypeDef *pADC_InitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_INSTANCE(ADCx)); + + assert_param(IS_LL_ADC_CLOCK(pADC_InitStruct->Clock)); + assert_param(IS_LL_ADC_RESOLUTION(pADC_InitStruct->Resolution)); + assert_param(IS_LL_ADC_DATA_ALIGN(pADC_InitStruct->DataAlignment)); + assert_param(IS_LL_ADC_LOW_POWER(pADC_InitStruct->LowPowerMode)); + + /* Note: Hardware constraint (refer to description of this function): */ + /* ADC instance must be disabled. */ + if (LL_ADC_IsEnabled(ADCx) == 0UL) + { + /* Configuration of ADC hierarchical scope: */ + /* - ADC instance */ + /* - Set ADC data resolution */ + /* - Set ADC conversion data alignment */ + /* - Set ADC low power mode */ + MODIFY_REG(ADCx->CFGR1, + ADC_CFGR1_RES + | ADC_CFGR1_ALIGN + | ADC_CFGR1_WAIT + | ADC_CFGR1_AUTOFF + , + pADC_InitStruct->Resolution + | pADC_InitStruct->DataAlignment + | pADC_InitStruct->LowPowerMode + ); + + MODIFY_REG(ADCx->CFGR2, + ADC_CFGR2_CKMODE + , + pADC_InitStruct->Clock + ); + } + else + { + /* Initialization error: ADC instance is not disabled. */ + status = ERROR; + } + + return status; +} + +/** + * @brief Set each @ref LL_ADC_InitTypeDef field to default value. + * @param pADC_InitStruct Pointer to a @ref LL_ADC_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_ADC_StructInit(LL_ADC_InitTypeDef *pADC_InitStruct) +{ + /* Set pADC_InitStruct fields to default values */ + /* Set fields of ADC instance */ + pADC_InitStruct->Clock = LL_ADC_CLOCK_SYNC_PCLK_DIV2; + pADC_InitStruct->Resolution = LL_ADC_RESOLUTION_12B; + pADC_InitStruct->DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; + pADC_InitStruct->LowPowerMode = LL_ADC_LP_MODE_NONE; + +} + +/** + * @brief Initialize some features of ADC group regular. + * @note These parameters have an impact on ADC scope: ADC group regular. + * Refer to corresponding unitary functions into + * @ref ADC_LL_EF_Configuration_ADC_Group_Regular + * (functions with prefix "REG"). + * @note The setting of these parameters by function @ref LL_ADC_Init() + * is conditioned to ADC state: + * ADC instance must be disabled. + * This condition is applied to all ADC features, for efficiency + * and compatibility over all STM32 families. However, the different + * features can be set under different ADC state conditions + * (setting possible with ADC enabled without conversion on going, + * ADC enabled with conversion on going, ...) + * Each feature can be updated afterwards with a unitary function + * and potentially with ADC in a different state than disabled, + * refer to description of each function for setting + * conditioned to ADC state. + * @note Before using this function, ADC group regular sequencer + * must be configured: refer to function + * @ref LL_ADC_REG_SetSequencerConfigurable(). + * @note After using this function, other features must be configured + * using LL unitary functions. + * The minimum configuration remaining to be done is: + * - Set ADC group regular sequencer: + * Depending on the sequencer mode (refer to + * function @ref LL_ADC_REG_SetSequencerConfigurable() ): + * - map channel on the selected sequencer rank. + * Refer to function @ref LL_ADC_REG_SetSequencerRanks(); + * - map channel on rank corresponding to channel number. + * Refer to function @ref LL_ADC_REG_SetSequencerChannels(); + * - Set ADC channel sampling time + * Refer to function LL_ADC_SetSamplingTimeCommonChannels(); + * Refer to function LL_ADC_SetChannelSamplingTime(); + * @param ADCx ADC instance + * @param pADC_RegInitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC registers are initialized + * - ERROR: ADC registers are not initialized + */ +ErrorStatus LL_ADC_REG_Init(ADC_TypeDef *ADCx, LL_ADC_REG_InitTypeDef *pADC_RegInitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_INSTANCE(ADCx)); + assert_param(IS_LL_ADC_REG_TRIG_SOURCE(pADC_RegInitStruct->TriggerSource)); + assert_param(IS_LL_ADC_REG_CONTINUOUS_MODE(pADC_RegInitStruct->ContinuousMode)); + assert_param(IS_LL_ADC_REG_DMA_TRANSFER(pADC_RegInitStruct->DMATransfer)); + assert_param(IS_LL_ADC_REG_OVR_DATA_BEHAVIOR(pADC_RegInitStruct->Overrun)); + + if (LL_ADC_REG_GetSequencerConfigurable(ADCx) != LL_ADC_REG_SEQ_FIXED) + { + assert_param(IS_LL_ADC_REG_SEQ_SCAN_LENGTH(pADC_RegInitStruct->SequencerLength)); + } + + if ((LL_ADC_REG_GetSequencerConfigurable(ADCx) == LL_ADC_REG_SEQ_FIXED) + || (pADC_RegInitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) + ) + { + assert_param(IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(pADC_RegInitStruct->SequencerDiscont)); + + /* ADC group regular continuous mode and discontinuous mode */ + /* can not be enabled simultenaeously */ + assert_param((pADC_RegInitStruct->ContinuousMode == LL_ADC_REG_CONV_SINGLE) + || (pADC_RegInitStruct->SequencerDiscont == LL_ADC_REG_SEQ_DISCONT_DISABLE)); + } + + /* Note: Hardware constraint (refer to description of this function): */ + /* ADC instance must be disabled. */ + if (LL_ADC_IsEnabled(ADCx) == 0UL) + { + /* Configuration of ADC hierarchical scope: */ + /* - ADC group regular */ + /* - Set ADC group regular trigger source */ + /* - Set ADC group regular sequencer length */ + /* - Set ADC group regular sequencer discontinuous mode */ + /* - Set ADC group regular continuous mode */ + /* - Set ADC group regular conversion data transfer: no transfer or */ + /* transfer by DMA, and DMA requests mode */ + /* - Set ADC group regular overrun behavior */ + /* Note: On this STM32 series, ADC trigger edge is set to value 0x0 by */ + /* setting of trigger source to SW start. */ + if ((LL_ADC_REG_GetSequencerConfigurable(ADCx) == LL_ADC_REG_SEQ_FIXED) + || (pADC_RegInitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) + ) + { + /* Case of sequencer mode fixed + or sequencer length >= 2 ranks with sequencer mode fully configurable: + discontinuous mode configured */ + MODIFY_REG(ADCx->CFGR1, + ADC_CFGR1_EXTSEL + | ADC_CFGR1_EXTEN + | ADC_CFGR1_DISCEN + | ADC_CFGR1_CONT + | ADC_CFGR1_DMAEN + | ADC_CFGR1_DMACFG + | ADC_CFGR1_OVRMOD + , + pADC_RegInitStruct->TriggerSource + | pADC_RegInitStruct->SequencerDiscont + | pADC_RegInitStruct->ContinuousMode + | pADC_RegInitStruct->DMATransfer + | pADC_RegInitStruct->Overrun + ); + } + else + { + /* Case of sequencer mode fully configurable + and sequencer length 1 rank (sequencer disabled): + discontinuous mode discarded (fixed to disable) */ + MODIFY_REG(ADCx->CFGR1, + ADC_CFGR1_EXTSEL + | ADC_CFGR1_EXTEN + | ADC_CFGR1_DISCEN + | ADC_CFGR1_CONT + | ADC_CFGR1_DMAEN + | ADC_CFGR1_DMACFG + | ADC_CFGR1_OVRMOD + , + pADC_RegInitStruct->TriggerSource + | LL_ADC_REG_SEQ_DISCONT_DISABLE + | pADC_RegInitStruct->ContinuousMode + | pADC_RegInitStruct->DMATransfer + | pADC_RegInitStruct->Overrun + ); + } + + /* Set ADC group regular sequencer length */ + if (LL_ADC_REG_GetSequencerConfigurable(ADCx) != LL_ADC_REG_SEQ_FIXED) + { + LL_ADC_REG_SetSequencerLength(ADCx, pADC_RegInitStruct->SequencerLength); + } + } + else + { + /* Initialization error: ADC instance is not disabled. */ + status = ERROR; + } + return status; +} + +/** + * @brief Set each @ref LL_ADC_REG_InitTypeDef field to default value. + * @param pADC_RegInitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef *pADC_RegInitStruct) +{ + /* Set pADC_RegInitStruct fields to default values */ + /* Set fields of ADC group regular */ + /* Note: On this STM32 series, ADC trigger edge is set to value 0x0 by */ + /* setting of trigger source to SW start. */ + pADC_RegInitStruct->TriggerSource = LL_ADC_REG_TRIG_SOFTWARE; + pADC_RegInitStruct->SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE; + pADC_RegInitStruct->SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE; + pADC_RegInitStruct->ContinuousMode = LL_ADC_REG_CONV_SINGLE; + pADC_RegInitStruct->DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE; + pADC_RegInitStruct->Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* ADC1 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_comp.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_comp.c new file mode 100644 index 0000000..1992087 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_comp.c @@ -0,0 +1,252 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_comp.c + * @author MCD Application Team + * @brief COMP LL module driver + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_comp.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (COMP1) || defined (COMP2) + +/** @addtogroup COMP_LL COMP + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup COMP_LL_Private_Macros + * @{ + */ + +/* Check of parameters for configuration of COMP hierarchical scope: */ +/* COMP instance. */ + +#define IS_LL_COMP_POWER_MODE(__POWER_MODE__) \ + ( ((__POWER_MODE__) == LL_COMP_POWERMODE_HIGHSPEED) \ + || ((__POWER_MODE__) == LL_COMP_POWERMODE_MEDIUMSPEED) \ + ) + +/* Note: On this STM32 series, comparator input plus parameters are */ +/* the same on all COMP instances. */ +/* However, comparator instance kept as macro parameter for */ +/* compatibility with other STM32 families. */ +#define IS_LL_COMP_INPUT_PLUS(__COMP_INSTANCE__, __INPUT_PLUS__) \ + ( ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO1) \ + || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO2) \ + || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO3) \ + ) + +/* Note: On this STM32 series, comparator input minus parameters are */ +/* the same on all COMP instances. */ +/* However, comparator instance kept as macro parameter for */ +/* compatibility with other STM32 families. */ +#define IS_LL_COMP_INPUT_MINUS(__COMP_INSTANCE__, __INPUT_MINUS__) \ + ( ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_1_4VREFINT) \ + || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_1_2VREFINT) \ + || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_3_4VREFINT) \ + || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_VREFINT) \ + || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_DAC1_CH1) \ + || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_DAC1_CH2) \ + || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_IO1) \ + || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_IO2) \ + || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_IO3) \ + ) + +#define IS_LL_COMP_INPUT_HYSTERESIS(__INPUT_HYSTERESIS__) \ + ( ((__INPUT_HYSTERESIS__) == LL_COMP_HYSTERESIS_NONE) \ + || ((__INPUT_HYSTERESIS__) == LL_COMP_HYSTERESIS_LOW) \ + || ((__INPUT_HYSTERESIS__) == LL_COMP_HYSTERESIS_MEDIUM) \ + || ((__INPUT_HYSTERESIS__) == LL_COMP_HYSTERESIS_HIGH) \ + ) + +#define IS_LL_COMP_OUTPUT_POLARITY(__POLARITY__) \ + ( ((__POLARITY__) == LL_COMP_OUTPUTPOL_NONINVERTED) \ + || ((__POLARITY__) == LL_COMP_OUTPUTPOL_INVERTED) \ + ) + +#define IS_LL_COMP_OUTPUT_BLANKING_SOURCE(__OUTPUT_BLANKING_SOURCE__) \ + ( ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_NONE) \ + || ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_TIM1_OC4) \ + || ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_TIM1_OC5) \ + || ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_TIM2_OC3) \ + || ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_TIM3_OC3) \ + || ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_TIM15_OC2) \ + ) + +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup COMP_LL_Exported_Functions + * @{ + */ + +/** @addtogroup COMP_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize registers of the selected COMP instance + * to their default reset values. + * @note If comparator is locked, de-initialization by software is + * not possible. + * The only way to unlock the comparator is a device hardware reset. + * @param COMPx COMP instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: COMP registers are de-initialized + * - ERROR: COMP registers are not de-initialized + */ +ErrorStatus LL_COMP_DeInit(COMP_TypeDef *COMPx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_COMP_ALL_INSTANCE(COMPx)); + + /* Note: Hardware constraint (refer to description of this function): */ + /* COMP instance must not be locked. */ + if (LL_COMP_IsLocked(COMPx) == 0UL) + { + LL_COMP_WriteReg(COMPx, CSR, 0x00000000UL); + + } + else + { + /* Comparator instance is locked: de-initialization by software is */ + /* not possible. */ + /* The only way to unlock the comparator is a device hardware reset. */ + status = ERROR; + } + + return status; +} + +/** + * @brief Initialize some features of COMP instance. + * @note This function configures features of the selected COMP instance. + * Some features are also available at scope COMP common instance + * (common to several COMP instances). + * Refer to functions having argument "COMPxy_COMMON" as parameter. + * @param COMPx COMP instance + * @param COMP_InitStruct Pointer to a @ref LL_COMP_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: COMP registers are initialized + * - ERROR: COMP registers are not initialized + */ +ErrorStatus LL_COMP_Init(COMP_TypeDef *COMPx, LL_COMP_InitTypeDef *COMP_InitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_COMP_ALL_INSTANCE(COMPx)); + assert_param(IS_LL_COMP_POWER_MODE(COMP_InitStruct->PowerMode)); + assert_param(IS_LL_COMP_INPUT_PLUS(COMPx, COMP_InitStruct->InputPlus)); + assert_param(IS_LL_COMP_INPUT_MINUS(COMPx, COMP_InitStruct->InputMinus)); + assert_param(IS_LL_COMP_INPUT_HYSTERESIS(COMP_InitStruct->InputHysteresis)); + assert_param(IS_LL_COMP_OUTPUT_POLARITY(COMP_InitStruct->OutputPolarity)); + assert_param(IS_LL_COMP_OUTPUT_BLANKING_SOURCE(COMP_InitStruct->OutputBlankingSource)); + + /* Note: Hardware constraint (refer to description of this function) */ + /* COMP instance must not be locked. */ + if (LL_COMP_IsLocked(COMPx) == 0UL) + { + /* Configuration of comparator instance : */ + /* - PowerMode */ + /* - InputPlus */ + /* - InputMinus */ + /* - InputHysteresis */ + /* - OutputPolarity */ + /* - OutputBlankingSource */ + MODIFY_REG(COMPx->CSR, + COMP_CSR_PWRMODE + | COMP_CSR_INPSEL + | COMP_CSR_INMSEL + | COMP_CSR_HYST + | COMP_CSR_POLARITY + | COMP_CSR_BLANKING + , + COMP_InitStruct->PowerMode + | COMP_InitStruct->InputPlus + | COMP_InitStruct->InputMinus + | COMP_InitStruct->InputHysteresis + | COMP_InitStruct->OutputPolarity + | COMP_InitStruct->OutputBlankingSource + ); + + } + else + { + /* Initialization error: COMP instance is locked. */ + status = ERROR; + } + + return status; +} + +/** + * @brief Set each @ref LL_COMP_InitTypeDef field to default value. + * @param COMP_InitStruct Pointer to a @ref LL_COMP_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_COMP_StructInit(LL_COMP_InitTypeDef *COMP_InitStruct) +{ + /* Set COMP_InitStruct fields to default values */ + COMP_InitStruct->PowerMode = LL_COMP_POWERMODE_MEDIUMSPEED; + COMP_InitStruct->InputPlus = LL_COMP_INPUT_PLUS_IO1; + COMP_InitStruct->InputMinus = LL_COMP_INPUT_MINUS_VREFINT; + COMP_InitStruct->InputHysteresis = LL_COMP_HYSTERESIS_NONE; + COMP_InitStruct->OutputPolarity = LL_COMP_OUTPUTPOL_NONINVERTED; + COMP_InitStruct->OutputBlankingSource = LL_COMP_BLANKINGSRC_NONE; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* COMP1 || COMP2 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crc.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crc.c new file mode 100644 index 0000000..5b841d2 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crc.c @@ -0,0 +1,103 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_crc.c + * @author MCD Application Team + * @brief CRC LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_crc.h" +#include "stm32g0xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (CRC) + +/** @addtogroup CRC_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CRC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup CRC_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize CRC registers (Registers restored to their default values). + * @param CRCx CRC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: CRC registers are de-initialized + * - ERROR: CRC registers are not de-initialized + */ +ErrorStatus LL_CRC_DeInit(CRC_TypeDef *CRCx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_CRC_ALL_INSTANCE(CRCx)); + + if (CRCx == CRC) + { + /* Force CRC reset */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_CRC); + + /* Release CRC reset */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_CRC); + } + else + { + status = ERROR; + } + + return (status); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (CRC) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crs.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crs.c new file mode 100644 index 0000000..806b0d9 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crs.c @@ -0,0 +1,83 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_crs.h + * @author MCD Application Team + * @brief CRS LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_crs.h" +#include "stm32g0xx_ll_bus.h" + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined(CRS) + +/** @defgroup CRS_LL CRS + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CRS_LL_Exported_Functions + * @{ + */ + +/** @addtogroup CRS_LL_EF_Init + * @{ + */ + +/** + * @brief De-Initializes CRS peripheral registers to their default reset values. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: CRS registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_CRS_DeInit(void) +{ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_CRS); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_CRS); + + return SUCCESS; +} + + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(CRS) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dac.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dac.c new file mode 100644 index 0000000..44816d5 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dac.c @@ -0,0 +1,293 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_dac.c + * @author MCD Application Team + * @brief DAC LL module driver + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_dac.h" +#include "stm32g0xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined(DAC1) + +/** @addtogroup DAC_LL DAC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup DAC_LL_Private_Macros + * @{ + */ +#define IS_LL_DAC_CHANNEL(__DAC_CHANNEL__) \ + ( ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1) \ + || ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_2) \ + ) + +#define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__) \ + ( ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM3_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9) \ + ) + +#define IS_LL_DAC_WAVE_AUTO_GENER_MODE(__WAVE_AUTO_GENERATION_MODE__) \ + ( ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NONE) \ + || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE) \ + || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE) \ + ) + +#define IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(__WAVE_AUTO_GENERATION_MODE__, __WAVE_AUTO_GENERATION_CONFIG__) \ + ( (((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE) \ + && ( ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BIT0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS1_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS2_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS3_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS4_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS5_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS6_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS7_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS8_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS9_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS10_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS11_0)) \ + ) \ + ||(((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE) \ + && ( ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_3) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_7) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_15) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_31) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_63) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_127) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_255) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_511) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1023) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_2047) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_4095)) \ + ) \ + ) + +#define IS_LL_DAC_OUTPUT_BUFFER(__OUTPUT_BUFFER__) \ + ( ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_ENABLE) \ + || ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_DISABLE) \ + ) + +#define IS_LL_DAC_OUTPUT_CONNECTION(__OUTPUT_CONNECTION__) \ + ( ((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_GPIO) \ + || ((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_INTERNAL) \ + ) + +#define IS_LL_DAC_OUTPUT_MODE(__OUTPUT_MODE__) \ + ( ((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_NORMAL) \ + || ((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_SAMPLE_AND_HOLD) \ + ) + +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DAC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup DAC_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize registers of the selected DAC instance + * to their default reset values. + * @param DACx DAC instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DAC registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_DAC_DeInit(DAC_TypeDef *DACx) +{ + /* Check the parameters */ + assert_param(IS_DAC_ALL_INSTANCE(DACx)); + + /* Force reset of DAC clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_DAC1); + + /* Release reset of DAC clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_DAC1); + + return SUCCESS; +} + +/** + * @brief Initialize some features of DAC channel. + * @note @ref LL_DAC_Init() aims to ease basic configuration of a DAC channel. + * Leaving it ready to be enabled and output: + * a level by calling one of + * @ref LL_DAC_ConvertData12RightAligned + * @ref LL_DAC_ConvertData12LeftAligned + * @ref LL_DAC_ConvertData8RightAligned + * or one of the supported autogenerated wave. + * @note This function allows configuration of: + * - Output mode + * - Trigger + * - Wave generation + * @note The setting of these parameters by function @ref LL_DAC_Init() + * is conditioned to DAC state: + * DAC channel must be disabled. + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 + * @param DAC_InitStruct Pointer to a @ref LL_DAC_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DAC registers are initialized + * - ERROR: DAC registers are not initialized + */ +ErrorStatus LL_DAC_Init(DAC_TypeDef *DACx, uint32_t DAC_Channel, LL_DAC_InitTypeDef *DAC_InitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_DAC_ALL_INSTANCE(DACx)); + assert_param(IS_LL_DAC_CHANNEL(DAC_Channel)); + assert_param(IS_LL_DAC_TRIGGER_SOURCE(DAC_InitStruct->TriggerSource)); + assert_param(IS_LL_DAC_OUTPUT_BUFFER(DAC_InitStruct->OutputBuffer)); + assert_param(IS_LL_DAC_OUTPUT_CONNECTION(DAC_InitStruct->OutputConnection)); + assert_param(IS_LL_DAC_OUTPUT_MODE(DAC_InitStruct->OutputMode)); + assert_param(IS_LL_DAC_WAVE_AUTO_GENER_MODE(DAC_InitStruct->WaveAutoGeneration)); + if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE) + { + assert_param(IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(DAC_InitStruct->WaveAutoGeneration, + DAC_InitStruct->WaveAutoGenerationConfig)); + } + + /* Note: Hardware constraint (refer to description of this function) */ + /* DAC instance must be disabled. */ + if (LL_DAC_IsEnabled(DACx, DAC_Channel) == 0UL) + { + /* Configuration of DAC channel: */ + /* - TriggerSource */ + /* - WaveAutoGeneration */ + /* - OutputBuffer */ + /* - OutputConnection */ + /* - OutputMode */ + if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE) + { + MODIFY_REG(DACx->CR, + (DAC_CR_TSEL1 + | DAC_CR_WAVE1 + | DAC_CR_MAMP1 + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + , + (DAC_InitStruct->TriggerSource + | DAC_InitStruct->WaveAutoGeneration + | DAC_InitStruct->WaveAutoGenerationConfig + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); + } + else + { + MODIFY_REG(DACx->CR, + (DAC_CR_TSEL1 + | DAC_CR_WAVE1 + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + , + (DAC_InitStruct->TriggerSource + | LL_DAC_WAVE_AUTO_GENERATION_NONE + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); + } + MODIFY_REG(DACx->MCR, + (DAC_MCR_MODE1_1 + | DAC_MCR_MODE1_0 + | DAC_MCR_MODE1_2 + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + , + (DAC_InitStruct->OutputBuffer + | DAC_InitStruct->OutputConnection + | DAC_InitStruct->OutputMode + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); + } + else + { + /* Initialization error: DAC instance is not disabled. */ + status = ERROR; + } + return status; +} + +/** + * @brief Set each @ref LL_DAC_InitTypeDef field to default value. + * @param DAC_InitStruct pointer to a @ref LL_DAC_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_DAC_StructInit(LL_DAC_InitTypeDef *DAC_InitStruct) +{ + /* Set DAC_InitStruct fields to default values */ + DAC_InitStruct->TriggerSource = LL_DAC_TRIG_SOFTWARE; + DAC_InitStruct->WaveAutoGeneration = LL_DAC_WAVE_AUTO_GENERATION_NONE; + /* Note: Parameter discarded if wave auto generation is disabled, */ + /* set anyway to its default value. */ + DAC_InitStruct->WaveAutoGenerationConfig = LL_DAC_NOISE_LFSR_UNMASK_BIT0; + DAC_InitStruct->OutputBuffer = LL_DAC_OUTPUT_BUFFER_ENABLE; + DAC_InitStruct->OutputConnection = LL_DAC_OUTPUT_CONNECT_GPIO; + DAC_InitStruct->OutputMode = LL_DAC_OUTPUT_MODE_NORMAL; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DAC1 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c new file mode 100644 index 0000000..044436e --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c @@ -0,0 +1,367 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_dma.c + * @author MCD Application Team + * @brief DMA LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_dma.h" +#include "stm32g0xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (DMA1) || defined (DMA2) + +/** @defgroup DMA_LL DMA + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup DMA_LL_Private_Macros + * @{ + */ +#define IS_LL_DMA_DIRECTION(__VALUE__) (((__VALUE__) == LL_DMA_DIRECTION_PERIPH_TO_MEMORY) || \ + ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) || \ + ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_MEMORY)) + +#define IS_LL_DMA_MODE(__VALUE__) (((__VALUE__) == LL_DMA_MODE_NORMAL) || \ + ((__VALUE__) == LL_DMA_MODE_CIRCULAR)) + +#define IS_LL_DMA_PERIPHINCMODE(__VALUE__) (((__VALUE__) == LL_DMA_PERIPH_INCREMENT) || \ + ((__VALUE__) == LL_DMA_PERIPH_NOINCREMENT)) + +#define IS_LL_DMA_MEMORYINCMODE(__VALUE__) (((__VALUE__) == LL_DMA_MEMORY_INCREMENT) || \ + ((__VALUE__) == LL_DMA_MEMORY_NOINCREMENT)) + +#define IS_LL_DMA_PERIPHDATASIZE(__VALUE__) (((__VALUE__) == LL_DMA_PDATAALIGN_BYTE) || \ + ((__VALUE__) == LL_DMA_PDATAALIGN_HALFWORD) || \ + ((__VALUE__) == LL_DMA_PDATAALIGN_WORD)) + +#define IS_LL_DMA_MEMORYDATASIZE(__VALUE__) (((__VALUE__) == LL_DMA_MDATAALIGN_BYTE) || \ + ((__VALUE__) == LL_DMA_MDATAALIGN_HALFWORD) || \ + ((__VALUE__) == LL_DMA_MDATAALIGN_WORD)) + +#define IS_LL_DMA_NBDATA(__VALUE__) ((__VALUE__) <= 0x0000FFFFU) + +#define IS_LL_DMA_PERIPHREQUEST(__VALUE__) ((__VALUE__) <= LL_DMAMUX_MAX_REQ) + +#define IS_LL_DMA_PRIORITY(__VALUE__) (((__VALUE__) == LL_DMA_PRIORITY_LOW) || \ + ((__VALUE__) == LL_DMA_PRIORITY_MEDIUM) || \ + ((__VALUE__) == LL_DMA_PRIORITY_HIGH) || \ + ((__VALUE__) == LL_DMA_PRIORITY_VERYHIGH)) + +#if defined(DMA2) +#define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, CHANNEL) ((((INSTANCE) == DMA1) && \ + (((CHANNEL) == LL_DMA_CHANNEL_1) || \ + ((CHANNEL) == LL_DMA_CHANNEL_2) || \ + ((CHANNEL) == LL_DMA_CHANNEL_3) || \ + ((CHANNEL) == LL_DMA_CHANNEL_4) || \ + ((CHANNEL) == LL_DMA_CHANNEL_5) || \ + ((CHANNEL) == LL_DMA_CHANNEL_6) || \ + ((CHANNEL) == LL_DMA_CHANNEL_7))) || \ + (((INSTANCE) == DMA2) && \ + (((CHANNEL) == LL_DMA_CHANNEL_1) || \ + ((CHANNEL) == LL_DMA_CHANNEL_2) || \ + ((CHANNEL) == LL_DMA_CHANNEL_3) || \ + ((CHANNEL) == LL_DMA_CHANNEL_4) || \ + ((CHANNEL) == LL_DMA_CHANNEL_5)))) +#else /* DMA1 */ +#if defined(DMA1_Channel7) +#define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, CHANNEL) ((((INSTANCE) == DMA1) && \ + (((CHANNEL) == LL_DMA_CHANNEL_1) || \ + ((CHANNEL) == LL_DMA_CHANNEL_2) || \ + ((CHANNEL) == LL_DMA_CHANNEL_3) || \ + ((CHANNEL) == LL_DMA_CHANNEL_4) || \ + ((CHANNEL) == LL_DMA_CHANNEL_5) || \ + ((CHANNEL) == LL_DMA_CHANNEL_6) || \ + ((CHANNEL) == LL_DMA_CHANNEL_7)))) +#else +#define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, CHANNEL) ((((INSTANCE) == DMA1) && \ + (((CHANNEL) == LL_DMA_CHANNEL_1) || \ + ((CHANNEL) == LL_DMA_CHANNEL_2) || \ + ((CHANNEL) == LL_DMA_CHANNEL_3) || \ + ((CHANNEL) == LL_DMA_CHANNEL_4) || \ + ((CHANNEL) == LL_DMA_CHANNEL_5)))) +#endif /* DMA1_Channel8 */ +#endif /* DMA2 */ +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DMA_LL_Exported_Functions + * @{ + */ + +/** @addtogroup DMA_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the DMA registers to their default reset values. + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @arg @ref LL_DMA_CHANNEL_ALL + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DMA registers are de-initialized + * - ERROR: DMA registers are not de-initialized + */ +ErrorStatus LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Channel) +{ + ErrorStatus status = SUCCESS; + + /* Check the DMA Instance DMAx and Channel parameters*/ + assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel) || (Channel == LL_DMA_CHANNEL_ALL)); + + if (Channel == LL_DMA_CHANNEL_ALL) + { + if (DMAx == DMA1) + { + /* Force reset of DMA clock */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA1); + + /* Release reset of DMA clock */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA1); + } +#if defined(DMA2) + else if (DMAx == DMA2) + { + /* Force reset of DMA clock */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA2); + + /* Release reset of DMA clock */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA2); + } +#endif /* DMA2 */ + else + { + status = ERROR; + } + } + else + { + DMA_Channel_TypeDef *tmp; + + tmp = (DMA_Channel_TypeDef *)(__LL_DMA_GET_CHANNEL_INSTANCE(DMAx, Channel)); + + /* Disable the selected DMAx_Channely */ + CLEAR_BIT(tmp->CCR, DMA_CCR_EN); + + /* Reset DMAx_Channely control register */ + WRITE_REG(tmp->CCR, 0U); + + /* Reset DMAx_Channely remaining bytes register */ + WRITE_REG(tmp->CNDTR, 0U); + + /* Reset DMAx_Channely peripheral address register */ + WRITE_REG(tmp->CPAR, 0U); + + /* Reset DMAx_Channely memory address register */ + WRITE_REG(tmp->CMAR, 0U); + + /* Reset Request register field for DMAx Channel */ + LL_DMA_SetPeriphRequest(DMAx, Channel, LL_DMAMUX_REQ_MEM2MEM); + + if (Channel == LL_DMA_CHANNEL_1) + { + /* Reset interrupt pending bits for DMAx Channel1 */ + LL_DMA_ClearFlag_GI1(DMAx); + } + else if (Channel == LL_DMA_CHANNEL_2) + { + /* Reset interrupt pending bits for DMAx Channel2 */ + LL_DMA_ClearFlag_GI2(DMAx); + } + else if (Channel == LL_DMA_CHANNEL_3) + { + /* Reset interrupt pending bits for DMAx Channel3 */ + LL_DMA_ClearFlag_GI3(DMAx); + } + else if (Channel == LL_DMA_CHANNEL_4) + { + /* Reset interrupt pending bits for DMAx Channel4 */ + LL_DMA_ClearFlag_GI4(DMAx); + } + else if (Channel == LL_DMA_CHANNEL_5) + { + /* Reset interrupt pending bits for DMAx Channel5 */ + LL_DMA_ClearFlag_GI5(DMAx); + } +#if defined(DMA1_Channel6) + else if (Channel == LL_DMA_CHANNEL_6) + { + /* Reset interrupt pending bits for DMAx Channel6 */ + LL_DMA_ClearFlag_GI6(DMAx); + } +#endif /* DMA1_Channel6 */ +#if defined(DMA1_Channel7) + else if (Channel == LL_DMA_CHANNEL_7) + { + /* Reset interrupt pending bits for DMAx Channel7 */ + LL_DMA_ClearFlag_GI7(DMAx); + } +#endif /* DMA1_Channel7 */ + else + { + status = ERROR; + } + } + + return status; +} + +/** + * @brief Initialize the DMA registers according to the specified parameters in DMA_InitStruct. + * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use helper macros : + * @arg @ref __LL_DMA_GET_INSTANCE + * @arg @ref __LL_DMA_GET_CHANNEL + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param DMA_InitStruct pointer to a @ref LL_DMA_InitTypeDef structure. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DMA registers are initialized + * - ERROR: Not applicable + */ +ErrorStatus LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitTypeDef *DMA_InitStruct) +{ + /* Check the DMA Instance DMAx and Channel parameters*/ + assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel)); + + /* Check the DMA parameters from DMA_InitStruct */ + assert_param(IS_LL_DMA_DIRECTION(DMA_InitStruct->Direction)); + assert_param(IS_LL_DMA_MODE(DMA_InitStruct->Mode)); + assert_param(IS_LL_DMA_PERIPHINCMODE(DMA_InitStruct->PeriphOrM2MSrcIncMode)); + assert_param(IS_LL_DMA_MEMORYINCMODE(DMA_InitStruct->MemoryOrM2MDstIncMode)); + assert_param(IS_LL_DMA_PERIPHDATASIZE(DMA_InitStruct->PeriphOrM2MSrcDataSize)); + assert_param(IS_LL_DMA_MEMORYDATASIZE(DMA_InitStruct->MemoryOrM2MDstDataSize)); + assert_param(IS_LL_DMA_NBDATA(DMA_InitStruct->NbData)); + assert_param(IS_LL_DMA_PERIPHREQUEST(DMA_InitStruct->PeriphRequest)); + assert_param(IS_LL_DMA_PRIORITY(DMA_InitStruct->Priority)); + + /*---------------------------- DMAx CCR Configuration ------------------------ + * Configure DMAx_Channely: data transfer direction, data transfer mode, + * peripheral and memory increment mode, + * data size alignment and priority level with parameters : + * - Direction: DMA_CCR_DIR and DMA_CCR_MEM2MEM bits + * - Mode: DMA_CCR_CIRC bit + * - PeriphOrM2MSrcIncMode: DMA_CCR_PINC bit + * - MemoryOrM2MDstIncMode: DMA_CCR_MINC bit + * - PeriphOrM2MSrcDataSize: DMA_CCR_PSIZE[1:0] bits + * - MemoryOrM2MDstDataSize: DMA_CCR_MSIZE[1:0] bits + * - Priority: DMA_CCR_PL[1:0] bits + */ + LL_DMA_ConfigTransfer(DMAx, Channel, DMA_InitStruct->Direction | \ + DMA_InitStruct->Mode | \ + DMA_InitStruct->PeriphOrM2MSrcIncMode | \ + DMA_InitStruct->MemoryOrM2MDstIncMode | \ + DMA_InitStruct->PeriphOrM2MSrcDataSize | \ + DMA_InitStruct->MemoryOrM2MDstDataSize | \ + DMA_InitStruct->Priority); + + /*-------------------------- DMAx CMAR Configuration ------------------------- + * Configure the memory or destination base address with parameter : + * - MemoryOrM2MDstAddress: DMA_CMAR_MA[31:0] bits + */ + LL_DMA_SetMemoryAddress(DMAx, Channel, DMA_InitStruct->MemoryOrM2MDstAddress); + + /*-------------------------- DMAx CPAR Configuration ------------------------- + * Configure the peripheral or source base address with parameter : + * - PeriphOrM2MSrcAddress: DMA_CPAR_PA[31:0] bits + */ + LL_DMA_SetPeriphAddress(DMAx, Channel, DMA_InitStruct->PeriphOrM2MSrcAddress); + + /*--------------------------- DMAx CNDTR Configuration ----------------------- + * Configure the peripheral base address with parameter : + * - NbData: DMA_CNDTR_NDT[15:0] bits + */ + LL_DMA_SetDataLength(DMAx, Channel, DMA_InitStruct->NbData); + + /*--------------------------- DMAMUXx CCR Configuration ---------------------- + * Configure the DMA request for DMA Channels on DMAMUX Channel x with parameter : + * - PeriphRequest: DMA_CxCR[7:0] bits + */ + LL_DMA_SetPeriphRequest(DMAx, Channel, DMA_InitStruct->PeriphRequest); + + return SUCCESS; +} + +/** + * @brief Set each @ref LL_DMA_InitTypeDef field to default value. + * @param DMA_InitStruct Pointer to a @ref LL_DMA_InitTypeDef structure. + * @retval None + */ +void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct) +{ + /* Set DMA_InitStruct fields to default values */ + DMA_InitStruct->PeriphOrM2MSrcAddress = 0x00000000U; + DMA_InitStruct->MemoryOrM2MDstAddress = 0x00000000U; + DMA_InitStruct->Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY; + DMA_InitStruct->Mode = LL_DMA_MODE_NORMAL; + DMA_InitStruct->PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; + DMA_InitStruct->MemoryOrM2MDstIncMode = LL_DMA_MEMORY_NOINCREMENT; + DMA_InitStruct->PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE; + DMA_InitStruct->MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE; + DMA_InitStruct->NbData = 0x00000000U; + DMA_InitStruct->PeriphRequest = LL_DMAMUX_REQ_MEM2MEM; + DMA_InitStruct->Priority = LL_DMA_PRIORITY_LOW; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DMA1 || DMA2 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_exti.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_exti.c new file mode 100644 index 0000000..47b635a --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_exti.c @@ -0,0 +1,293 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_exti.c + * @author MCD Application Team + * @brief EXTI LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_exti.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (EXTI) + +/** @defgroup EXTI_LL EXTI + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup EXTI_LL_Private_Macros + * @{ + */ + +#define IS_LL_EXTI_LINE_0_31(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_0_31) == 0x00000000U) +#if defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +#define IS_LL_EXTI_LINE_32_63(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_32_63) == 0x00000000U) +#endif /* STM32G081xx || STM32G071xx || STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ +#define IS_LL_EXTI_MODE(__VALUE__) (((__VALUE__) == LL_EXTI_MODE_IT) \ + || ((__VALUE__) == LL_EXTI_MODE_EVENT) \ + || ((__VALUE__) == LL_EXTI_MODE_IT_EVENT)) + + +#define IS_LL_EXTI_TRIGGER(__VALUE__) (((__VALUE__) == LL_EXTI_TRIGGER_NONE) \ + || ((__VALUE__) == LL_EXTI_TRIGGER_RISING) \ + || ((__VALUE__) == LL_EXTI_TRIGGER_FALLING) \ + || ((__VALUE__) == LL_EXTI_TRIGGER_RISING_FALLING)) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup EXTI_LL_Exported_Functions + * @{ + */ + +/** @addtogroup EXTI_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the EXTI registers to their default reset values. + * @retval An ErrorStatus enumeration value: + * - 0x00: EXTI registers are de-initialized + */ +uint32_t LL_EXTI_DeInit(void) +{ + /* Interrupt mask register set to default reset values */ + LL_EXTI_WriteReg(IMR1, 0xFFF80000U); + /* Event mask register set to default reset values */ + LL_EXTI_WriteReg(EMR1, 0x00000000U); + /* Rising Trigger selection register set to default reset values */ + LL_EXTI_WriteReg(RTSR1, 0x00000000U); + /* Falling Trigger selection register set to default reset values */ + LL_EXTI_WriteReg(FTSR1, 0x00000000U); + /* Software interrupt event register set to default reset values */ + LL_EXTI_WriteReg(SWIER1, 0x00000000U); + /* Pending register set to default reset values */ +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) + LL_EXTI_WriteReg(RPR1, 0x0017FFFFU); + LL_EXTI_WriteReg(FPR1, 0x0017FFFFU); +#elif defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G061xx) || defined(STM32G051xx) + LL_EXTI_WriteReg(RPR1, 0x0007FFFFU); + LL_EXTI_WriteReg(FPR1, 0x0007FFFFU); +#elif defined(STM32G041xx) || defined(STM32G031xx) + LL_EXTI_WriteReg(RPR1, 0x0001FFFFU); + LL_EXTI_WriteReg(FPR1, 0x0001FFFFU); +#elif defined(STM32G0B0xx) || defined(STM32G070xx) || defined(STM32G050xx) || defined(STM32G030xx) + LL_EXTI_WriteReg(RPR1, 0x0000FFFFU); + LL_EXTI_WriteReg(FPR1, 0x0000FFFFU); +#endif /* STM32G0C1xx || STM32G0B1xx */ + +#if defined(STM32G081xx) || defined(STM32G071xx) + /* Interrupt mask register 2 set to default reset values */ + LL_EXTI_WriteReg(IMR2, 0x00000003U); + /* Event mask register 2 set to default reset values */ + LL_EXTI_WriteReg(EMR2, 0x00000000U); +#elif defined(STM32G0C1xx) || defined(STM32G0B1xx) + /* Interrupt mask register 2 set to default reset values */ + LL_EXTI_WriteReg(IMR2, 0x0000001FU); + /* Event mask register 2 set to default reset values */ + LL_EXTI_WriteReg(EMR2, 0x00000000U); + /* Rising Trigger selection register set to default reset values */ + LL_EXTI_WriteReg(RTSR2, 0x00000000U); + /* Falling Trigger selection register set to default reset values */ + LL_EXTI_WriteReg(FTSR2, 0x00000000U); + /* Software interrupt event register set to default reset values */ + LL_EXTI_WriteReg(SWIER2, 0x00000000U); + /* Pending register set to default reset values */ + LL_EXTI_WriteReg(RPR2, 0x00000004U); + LL_EXTI_WriteReg(FPR2, 0x00000004U); +#elif defined(STM32G0B0xx) + /* Interrupt mask register 2 set to default reset values */ + LL_EXTI_WriteReg(IMR2, 0x00000010U); + /* Event mask register 2 set to default reset values */ + LL_EXTI_WriteReg(EMR2, 0x00000000U); +#endif /* STM32G081xx || STM32G071xx */ + + return 0x00u; +} + +/** + * @brief Initialize the EXTI registers according to the specified parameters in EXTI_InitStruct. + * @param EXTI_InitStruct pointer to a @ref LL_EXTI_InitTypeDef structure. + * @retval An ErrorStatus enumeration value: + * - 0x00: EXTI registers are initialized + * - any other value : wrong configuration + */ +uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct) +{ + uint32_t status = 0x00u; + + /* Check the parameters */ + assert_param(IS_LL_EXTI_LINE_0_31(EXTI_InitStruct->Line_0_31)); +#if defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) + assert_param(IS_LL_EXTI_LINE_32_63(EXTI_InitStruct->Line_32_63)); +#endif /* STM32G081xx || STM32G071xx || STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->LineCommand)); + assert_param(IS_LL_EXTI_MODE(EXTI_InitStruct->Mode)); + + /* ENABLE LineCommand */ + if (EXTI_InitStruct->LineCommand != DISABLE) + { + assert_param(IS_LL_EXTI_TRIGGER(EXTI_InitStruct->Trigger)); + + /* Configure EXTI Lines in range from 0 to 31 */ + if (EXTI_InitStruct->Line_0_31 != LL_EXTI_LINE_NONE) + { + switch (EXTI_InitStruct->Mode) + { + case LL_EXTI_MODE_IT: + /* First Disable Event on provided Lines */ + LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31); + /* Then Enable IT on provided Lines */ + LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31); + break; + case LL_EXTI_MODE_EVENT: + /* First Disable IT on provided Lines */ + LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31); + /* Then Enable Event on provided Lines */ + LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31); + break; + case LL_EXTI_MODE_IT_EVENT: + /* Directly Enable IT & Event on provided Lines */ + LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31); + LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31); + break; + default: + status = 0x01u; + break; + } + if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE) + { + switch (EXTI_InitStruct->Trigger) + { + case LL_EXTI_TRIGGER_RISING: + /* First Disable Falling Trigger on provided Lines */ + LL_EXTI_DisableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); + /* Then Enable Rising Trigger on provided Lines */ + LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); + break; + case LL_EXTI_TRIGGER_FALLING: + /* First Disable Rising Trigger on provided Lines */ + LL_EXTI_DisableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); + /* Then Enable Falling Trigger on provided Lines */ + LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); + break; + case LL_EXTI_TRIGGER_RISING_FALLING: + LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); + LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); + break; + default: + status |= 0x02u; + break; + } + } + } +#if defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) + /* Configure EXTI Lines in range from 32 to 63 */ + if (EXTI_InitStruct->Line_32_63 != LL_EXTI_LINE_NONE) + { + switch (EXTI_InitStruct->Mode) + { + case LL_EXTI_MODE_IT: + /* First Disable Event on provided Lines */ + LL_EXTI_DisableEvent_32_63(EXTI_InitStruct->Line_32_63); + /* Then Enable IT on provided Lines */ + LL_EXTI_EnableIT_32_63(EXTI_InitStruct->Line_32_63); + break; + case LL_EXTI_MODE_EVENT: + /* First Disable IT on provided Lines */ + LL_EXTI_DisableIT_32_63(EXTI_InitStruct->Line_32_63); + /* Then Enable Event on provided Lines */ + LL_EXTI_EnableEvent_32_63(EXTI_InitStruct->Line_32_63); + break; + case LL_EXTI_MODE_IT_EVENT: + /* Directly Enable IT & Event on provided Lines */ + LL_EXTI_EnableIT_32_63(EXTI_InitStruct->Line_32_63); + LL_EXTI_EnableEvent_32_63(EXTI_InitStruct->Line_32_63); + break; + default: + status |= 0x04u; + break; + } + } +#endif /* STM32G081xx || STM32G071xx || STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + } + /* DISABLE LineCommand */ + else + { + /* De-configure EXTI Lines in range from 0 to 31 */ + LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31); + LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31); +#if defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) + /* De-configure EXTI Lines in range from 32 to 63 */ + LL_EXTI_DisableIT_32_63(EXTI_InitStruct->Line_32_63); + LL_EXTI_DisableEvent_32_63(EXTI_InitStruct->Line_32_63); +#endif /* STM32G081xx || STM32G071xx || STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + } + + return status; +} + +/** + * @brief Set each @ref LL_EXTI_InitTypeDef field to default value. + * @param EXTI_InitStruct Pointer to a @ref LL_EXTI_InitTypeDef structure. + * @retval None + */ +void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct) +{ + EXTI_InitStruct->Line_0_31 = LL_EXTI_LINE_NONE; +#if defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) + EXTI_InitStruct->Line_32_63 = LL_EXTI_LINE_NONE; +#endif /* STM32G081xx || STM32G071xx || STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + EXTI_InitStruct->LineCommand = DISABLE; + EXTI_InitStruct->Mode = LL_EXTI_MODE_IT; + EXTI_InitStruct->Trigger = LL_EXTI_TRIGGER_FALLING; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (EXTI) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_gpio.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_gpio.c new file mode 100644 index 0000000..91c7fb4 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_gpio.c @@ -0,0 +1,278 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_gpio.c + * @author MCD Application Team + * @brief GPIO LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_gpio.h" +#include "stm32g0xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) + +/** @addtogroup GPIO_LL + * @{ + */ +/** MISRA C:2012 deviation rule has been granted for following rules: + * Rule-12.2 - Medium: RHS argument is in interval [0,INF] which is out of + * range of the shift operator in following API : + * LL_GPIO_Init + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup GPIO_LL_Private_Macros + * @{ + */ +#define IS_LL_GPIO_PIN(__VALUE__) (((0x00u) < (__VALUE__)) && ((__VALUE__) <= (LL_GPIO_PIN_ALL))) + +#define IS_LL_GPIO_MODE(__VALUE__) (((__VALUE__) == LL_GPIO_MODE_INPUT) ||\ + ((__VALUE__) == LL_GPIO_MODE_OUTPUT) ||\ + ((__VALUE__) == LL_GPIO_MODE_ALTERNATE) ||\ + ((__VALUE__) == LL_GPIO_MODE_ANALOG)) + +#define IS_LL_GPIO_OUTPUT_TYPE(__VALUE__) (((__VALUE__) == LL_GPIO_OUTPUT_PUSHPULL) ||\ + ((__VALUE__) == LL_GPIO_OUTPUT_OPENDRAIN)) + +#define IS_LL_GPIO_SPEED(__VALUE__) (((__VALUE__) == LL_GPIO_SPEED_FREQ_LOW) ||\ + ((__VALUE__) == LL_GPIO_SPEED_FREQ_MEDIUM) ||\ + ((__VALUE__) == LL_GPIO_SPEED_FREQ_HIGH) ||\ + ((__VALUE__) == LL_GPIO_SPEED_FREQ_VERY_HIGH)) + +#define IS_LL_GPIO_PULL(__VALUE__) (((__VALUE__) == LL_GPIO_PULL_NO) ||\ + ((__VALUE__) == LL_GPIO_PULL_UP) ||\ + ((__VALUE__) == LL_GPIO_PULL_DOWN)) + +#if defined(GPIOE) +#define IS_LL_GPIO_ALTERNATE(__VALUE__) (((__VALUE__) == LL_GPIO_AF_0 ) ||\ + ((__VALUE__) == LL_GPIO_AF_1 ) ||\ + ((__VALUE__) == LL_GPIO_AF_2 ) ||\ + ((__VALUE__) == LL_GPIO_AF_3 ) ||\ + ((__VALUE__) == LL_GPIO_AF_4 ) ||\ + ((__VALUE__) == LL_GPIO_AF_5 ) ||\ + ((__VALUE__) == LL_GPIO_AF_6 ) ||\ + ((__VALUE__) == LL_GPIO_AF_7 ) ||\ + ((__VALUE__) == LL_GPIO_AF_8 ) ||\ + ((__VALUE__) == LL_GPIO_AF_9 ) ||\ + ((__VALUE__) == LL_GPIO_AF_10 )) +#else +#define IS_LL_GPIO_ALTERNATE(__VALUE__) (((__VALUE__) == LL_GPIO_AF_0 ) ||\ + ((__VALUE__) == LL_GPIO_AF_1 ) ||\ + ((__VALUE__) == LL_GPIO_AF_2 ) ||\ + ((__VALUE__) == LL_GPIO_AF_3 ) ||\ + ((__VALUE__) == LL_GPIO_AF_4 ) ||\ + ((__VALUE__) == LL_GPIO_AF_5 ) ||\ + ((__VALUE__) == LL_GPIO_AF_6 ) ||\ + ((__VALUE__) == LL_GPIO_AF_7 )) +#endif /* GPIOE */ +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup GPIO_LL_Exported_Functions + * @{ + */ + +/** @addtogroup GPIO_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize GPIO registers (Registers restored to their default values). + * @param GPIOx GPIO Port + * @retval An ErrorStatus enumeration value: + * - SUCCESS: GPIO registers are de-initialized + * - ERROR: Wrong GPIO Port + */ +ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + + /* Force and Release reset on clock of GPIOx Port */ + if (GPIOx == GPIOA) + { + LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOA); + LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOA); + } + else if (GPIOx == GPIOB) + { + LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOB); + LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOB); + } + else if (GPIOx == GPIOC) + { + LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOC); + LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOC); + } +#if defined(GPIOD) + else if (GPIOx == GPIOD) + { + LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOD); + LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOD); + } +#endif /* GPIOD */ +#if defined(GPIOE) + else if (GPIOx == GPIOE) + { + LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOE); + LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOE); + } +#endif /* GPIOE */ +#if defined(GPIOF) + else if (GPIOx == GPIOF) + { + LL_IOP_GRP1_ForceReset(LL_IOP_GRP1_PERIPH_GPIOF); + LL_IOP_GRP1_ReleaseReset(LL_IOP_GRP1_PERIPH_GPIOF); + } +#endif /* GPIOF */ + else + { + status = ERROR; + } + + return (status); +} + +/** + * @brief Initialize GPIO registers according to the specified parameters in GPIO_InitStruct. + * @param GPIOx GPIO Port + * @param GPIO_InitStruct pointer to a @ref LL_GPIO_InitTypeDef structure + * that contains the configuration information for the specified GPIO peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: GPIO registers are initialized according to GPIO_InitStruct content + * - ERROR: Not applicable + */ +ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct) +{ + uint32_t pinpos; + uint32_t currentpin; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_LL_GPIO_PIN(GPIO_InitStruct->Pin)); + assert_param(IS_LL_GPIO_MODE(GPIO_InitStruct->Mode)); + assert_param(IS_LL_GPIO_PULL(GPIO_InitStruct->Pull)); + + /* ------------------------- Configure the port pins ---------------- */ + /* Initialize pinpos on first pin set */ + pinpos = 0; + + /* Configure the port pins */ + while (((GPIO_InitStruct->Pin) >> pinpos) != 0x00u) + { + /* Get current io position */ + currentpin = (GPIO_InitStruct->Pin) & (0x00000001uL << pinpos); + + if (currentpin != 0x00u) + { + if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) + { + /* Check Speed mode parameters */ + assert_param(IS_LL_GPIO_SPEED(GPIO_InitStruct->Speed)); + + /* Speed mode configuration */ + LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed); + + /* Check Output mode parameters */ + assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); + + /* Output mode configuration*/ + LL_GPIO_SetPinOutputType(GPIOx, currentpin, GPIO_InitStruct->OutputType); + } + + /* Pull-up Pull down resistor configuration*/ + LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull); + + if (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE) + { + /* Check Alternate parameter */ + assert_param(IS_LL_GPIO_ALTERNATE(GPIO_InitStruct->Alternate)); + + /* Speed mode configuration */ + if (currentpin < LL_GPIO_PIN_8) + { + LL_GPIO_SetAFPin_0_7(GPIOx, currentpin, GPIO_InitStruct->Alternate); + } + else + { + LL_GPIO_SetAFPin_8_15(GPIOx, currentpin, GPIO_InitStruct->Alternate); + } + } + + /* Pin Mode configuration */ + LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); + } + pinpos++; + } + + return (SUCCESS); +} + +/** + * @brief Set each @ref LL_GPIO_InitTypeDef field to default value. + * @param GPIO_InitStruct pointer to a @ref LL_GPIO_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ + +void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct) +{ + /* Reset GPIO init structure parameters values */ + GPIO_InitStruct->Pin = LL_GPIO_PIN_ALL; + GPIO_InitStruct->Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct->Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct->OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct->Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct->Alternate = LL_GPIO_AF_0; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_i2c.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_i2c.c new file mode 100644 index 0000000..226b8a2 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_i2c.c @@ -0,0 +1,234 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_i2c.c + * @author MCD Application Team + * @brief I2C LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_i2c.h" +#include "stm32g0xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (I2C1) || defined (I2C2) || defined (I2C3) + +/** @defgroup I2C_LL I2C + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup I2C_LL_Private_Macros + * @{ + */ + +#define IS_LL_I2C_PERIPHERAL_MODE(__VALUE__) (((__VALUE__) == LL_I2C_MODE_I2C) || \ + ((__VALUE__) == LL_I2C_MODE_SMBUS_HOST) || \ + ((__VALUE__) == LL_I2C_MODE_SMBUS_DEVICE) || \ + ((__VALUE__) == LL_I2C_MODE_SMBUS_DEVICE_ARP)) + +#define IS_LL_I2C_ANALOG_FILTER(__VALUE__) (((__VALUE__) == LL_I2C_ANALOGFILTER_ENABLE) || \ + ((__VALUE__) == LL_I2C_ANALOGFILTER_DISABLE)) + +#define IS_LL_I2C_DIGITAL_FILTER(__VALUE__) ((__VALUE__) <= 0x0000000FU) + +#define IS_LL_I2C_OWN_ADDRESS1(__VALUE__) ((__VALUE__) <= 0x000003FFU) + +#define IS_LL_I2C_TYPE_ACKNOWLEDGE(__VALUE__) (((__VALUE__) == LL_I2C_ACK) || \ + ((__VALUE__) == LL_I2C_NACK)) + +#define IS_LL_I2C_OWN_ADDRSIZE(__VALUE__) (((__VALUE__) == LL_I2C_OWNADDRESS1_7BIT) || \ + ((__VALUE__) == LL_I2C_OWNADDRESS1_10BIT)) +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup I2C_LL_Exported_Functions + * @{ + */ + +/** @addtogroup I2C_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the I2C registers to their default reset values. + * @param I2Cx I2C Instance. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: I2C registers are de-initialized + * - ERROR: I2C registers are not de-initialized + */ +ErrorStatus LL_I2C_DeInit(I2C_TypeDef *I2Cx) +{ + ErrorStatus status = SUCCESS; + + /* Check the I2C Instance I2Cx */ + assert_param(IS_I2C_ALL_INSTANCE(I2Cx)); + + if (I2Cx == I2C1) + { + /* Force reset of I2C clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C1); + + /* Release reset of I2C clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C1); + } + else if (I2Cx == I2C2) + { + /* Force reset of I2C clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C2); + + /* Release reset of I2C clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C2); + + } +#if defined(I2C3) + else if (I2Cx == I2C3) + { + /* Force reset of I2C clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C3); + + /* Release reset of I2C clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C3); + } +#endif /* I2C3 */ + else + { + status = ERROR; + } + + return status; +} + +/** + * @brief Initialize the I2C registers according to the specified parameters in I2C_InitStruct. + * @param I2Cx I2C Instance. + * @param I2C_InitStruct pointer to a @ref LL_I2C_InitTypeDef structure. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: I2C registers are initialized + * - ERROR: Not applicable + */ +ErrorStatus LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct) +{ + /* Check the I2C Instance I2Cx */ + assert_param(IS_I2C_ALL_INSTANCE(I2Cx)); + + /* Check the I2C parameters from I2C_InitStruct */ + assert_param(IS_LL_I2C_PERIPHERAL_MODE(I2C_InitStruct->PeripheralMode)); + assert_param(IS_LL_I2C_ANALOG_FILTER(I2C_InitStruct->AnalogFilter)); + assert_param(IS_LL_I2C_DIGITAL_FILTER(I2C_InitStruct->DigitalFilter)); + assert_param(IS_LL_I2C_OWN_ADDRESS1(I2C_InitStruct->OwnAddress1)); + assert_param(IS_LL_I2C_TYPE_ACKNOWLEDGE(I2C_InitStruct->TypeAcknowledge)); + assert_param(IS_LL_I2C_OWN_ADDRSIZE(I2C_InitStruct->OwnAddrSize)); + + /* Disable the selected I2Cx Peripheral */ + LL_I2C_Disable(I2Cx); + + /*---------------------------- I2Cx CR1 Configuration ------------------------ + * Configure the analog and digital noise filters with parameters : + * - AnalogFilter: I2C_CR1_ANFOFF bit + * - DigitalFilter: I2C_CR1_DNF[3:0] bits + */ + LL_I2C_ConfigFilters(I2Cx, I2C_InitStruct->AnalogFilter, I2C_InitStruct->DigitalFilter); + + /*---------------------------- I2Cx TIMINGR Configuration -------------------- + * Configure the SDA setup, hold time and the SCL high, low period with parameter : + * - Timing: I2C_TIMINGR_PRESC[3:0], I2C_TIMINGR_SCLDEL[3:0], I2C_TIMINGR_SDADEL[3:0], + * I2C_TIMINGR_SCLH[7:0] and I2C_TIMINGR_SCLL[7:0] bits + */ + LL_I2C_SetTiming(I2Cx, I2C_InitStruct->Timing); + + /* Enable the selected I2Cx Peripheral */ + LL_I2C_Enable(I2Cx); + + /*---------------------------- I2Cx OAR1 Configuration ----------------------- + * Disable, Configure and Enable I2Cx device own address 1 with parameters : + * - OwnAddress1: I2C_OAR1_OA1[9:0] bits + * - OwnAddrSize: I2C_OAR1_OA1MODE bit + */ + LL_I2C_DisableOwnAddress1(I2Cx); + LL_I2C_SetOwnAddress1(I2Cx, I2C_InitStruct->OwnAddress1, I2C_InitStruct->OwnAddrSize); + + /* OwnAdress1 == 0 is reserved for General Call address */ + if (I2C_InitStruct->OwnAddress1 != 0U) + { + LL_I2C_EnableOwnAddress1(I2Cx); + } + + /*---------------------------- I2Cx MODE Configuration ----------------------- + * Configure I2Cx peripheral mode with parameter : + * - PeripheralMode: I2C_CR1_SMBDEN and I2C_CR1_SMBHEN bits + */ + LL_I2C_SetMode(I2Cx, I2C_InitStruct->PeripheralMode); + + /*---------------------------- I2Cx CR2 Configuration ------------------------ + * Configure the ACKnowledge or Non ACKnowledge condition + * after the address receive match code or next received byte with parameter : + * - TypeAcknowledge: I2C_CR2_NACK bit + */ + LL_I2C_AcknowledgeNextData(I2Cx, I2C_InitStruct->TypeAcknowledge); + + return SUCCESS; +} + +/** + * @brief Set each @ref LL_I2C_InitTypeDef field to default value. + * @param I2C_InitStruct Pointer to a @ref LL_I2C_InitTypeDef structure. + * @retval None + */ +void LL_I2C_StructInit(LL_I2C_InitTypeDef *I2C_InitStruct) +{ + /* Set I2C_InitStruct fields to default values */ + I2C_InitStruct->PeripheralMode = LL_I2C_MODE_I2C; + I2C_InitStruct->Timing = 0U; + I2C_InitStruct->AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; + I2C_InitStruct->DigitalFilter = 0U; + I2C_InitStruct->OwnAddress1 = 0U; + I2C_InitStruct->TypeAcknowledge = LL_I2C_NACK; + I2C_InitStruct->OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* I2C1 || I2C2 || I2C3 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lptim.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lptim.c new file mode 100644 index 0000000..43012ee --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lptim.c @@ -0,0 +1,318 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_lptim.c + * @author MCD Application Team + * @brief LPTIM LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_lptim.h" +#include "stm32g0xx_ll_bus.h" +#include "stm32g0xx_ll_rcc.h" + + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (LPTIM1) || defined (LPTIM2) + +/** @addtogroup LPTIM_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup LPTIM_LL_Private_Macros + * @{ + */ +#define IS_LL_LPTIM_CLOCK_SOURCE(__VALUE__) (((__VALUE__) == LL_LPTIM_CLK_SOURCE_INTERNAL) \ + || ((__VALUE__) == LL_LPTIM_CLK_SOURCE_EXTERNAL)) + +#define IS_LL_LPTIM_CLOCK_PRESCALER(__VALUE__) (((__VALUE__) == LL_LPTIM_PRESCALER_DIV1) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV2) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV4) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV8) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV16) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV32) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV64) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV128)) + +#define IS_LL_LPTIM_WAVEFORM(__VALUE__) (((__VALUE__) == LL_LPTIM_OUTPUT_WAVEFORM_PWM) \ + || ((__VALUE__) == LL_LPTIM_OUTPUT_WAVEFORM_SETONCE)) + +#define IS_LL_LPTIM_OUTPUT_POLARITY(__VALUE__) (((__VALUE__) == LL_LPTIM_OUTPUT_POLARITY_REGULAR) \ + || ((__VALUE__) == LL_LPTIM_OUTPUT_POLARITY_INVERSE)) +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup LPTIM_Private_Functions LPTIM Private Functions + * @{ + */ +/** + * @} + */ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LPTIM_LL_Exported_Functions + * @{ + */ + +/** @addtogroup LPTIM_LL_EF_Init + * @{ + */ + +/** + * @brief Set LPTIMx registers to their reset values. + * @param LPTIMx LP Timer instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: LPTIMx registers are de-initialized + * - ERROR: invalid LPTIMx instance + */ +ErrorStatus LL_LPTIM_DeInit(LPTIM_TypeDef *LPTIMx) +{ + ErrorStatus result = SUCCESS; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(LPTIMx)); + + if (LPTIMx == LPTIM1) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_LPTIM1); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_LPTIM1); + } +#if defined(LPTIM2) + else if (LPTIMx == LPTIM2) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_LPTIM2); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_LPTIM2); + } +#endif /* LPTIM2 */ + else + { + result = ERROR; + } + + return result; +} + +/** + * @brief Set each fields of the LPTIM_InitStruct structure to its default + * value. + * @param LPTIM_InitStruct pointer to a @ref LL_LPTIM_InitTypeDef structure + * @retval None + */ +void LL_LPTIM_StructInit(LL_LPTIM_InitTypeDef *LPTIM_InitStruct) +{ + /* Set the default configuration */ + LPTIM_InitStruct->ClockSource = LL_LPTIM_CLK_SOURCE_INTERNAL; + LPTIM_InitStruct->Prescaler = LL_LPTIM_PRESCALER_DIV1; + LPTIM_InitStruct->Waveform = LL_LPTIM_OUTPUT_WAVEFORM_PWM; + LPTIM_InitStruct->Polarity = LL_LPTIM_OUTPUT_POLARITY_REGULAR; +} + +/** + * @brief Configure the LPTIMx peripheral according to the specified parameters. + * @note LL_LPTIM_Init can only be called when the LPTIM instance is disabled. + * @note LPTIMx can be disabled using unitary function @ref LL_LPTIM_Disable(). + * @param LPTIMx LP Timer Instance + * @param LPTIM_InitStruct pointer to a @ref LL_LPTIM_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: LPTIMx instance has been initialized + * - ERROR: LPTIMx instance hasn't been initialized + */ +ErrorStatus LL_LPTIM_Init(LPTIM_TypeDef *LPTIMx, const LL_LPTIM_InitTypeDef *LPTIM_InitStruct) +{ + ErrorStatus result = SUCCESS; + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(LPTIMx)); + assert_param(IS_LL_LPTIM_CLOCK_SOURCE(LPTIM_InitStruct->ClockSource)); + assert_param(IS_LL_LPTIM_CLOCK_PRESCALER(LPTIM_InitStruct->Prescaler)); + assert_param(IS_LL_LPTIM_WAVEFORM(LPTIM_InitStruct->Waveform)); + assert_param(IS_LL_LPTIM_OUTPUT_POLARITY(LPTIM_InitStruct->Polarity)); + + /* The LPTIMx_CFGR register must only be modified when the LPTIM is disabled + (ENABLE bit is reset to 0). + */ + if (LL_LPTIM_IsEnabled(LPTIMx) == 1UL) + { + result = ERROR; + } + else + { + /* Set CKSEL bitfield according to ClockSource value */ + /* Set PRESC bitfield according to Prescaler value */ + /* Set WAVE bitfield according to Waveform value */ + /* Set WAVEPOL bitfield according to Polarity value */ + MODIFY_REG(LPTIMx->CFGR, + (LPTIM_CFGR_CKSEL | LPTIM_CFGR_PRESC | LPTIM_CFGR_WAVE | LPTIM_CFGR_WAVPOL), + LPTIM_InitStruct->ClockSource | \ + LPTIM_InitStruct->Prescaler | \ + LPTIM_InitStruct->Waveform | \ + LPTIM_InitStruct->Polarity); + } + + return result; +} + +/** + * @brief Disable the LPTIM instance + * @rmtoll CR ENABLE LL_LPTIM_Disable + * @param LPTIMx Low-Power Timer instance + * @note The following sequence is required to solve LPTIM disable HW limitation. + * Please check Errata Sheet ES0335 for more details under "MCU may remain + * stuck in LPTIM interrupt when entering Stop mode" section. + * @retval None + */ +void LL_LPTIM_Disable(LPTIM_TypeDef *LPTIMx) +{ + LL_RCC_ClocksTypeDef rcc_clock; + uint32_t tmpclksource = 0; + uint32_t tmpIER; + uint32_t tmpCFGR; + uint32_t tmpCMP; + uint32_t tmpARR; + uint32_t primask_bit; + uint32_t tmpCFGR2; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(LPTIMx)); + + /* Enter critical section */ + primask_bit = __get_PRIMASK(); + __set_PRIMASK(1) ; + + /********** Save LPTIM Config *********/ + /* Save LPTIM source clock */ + switch ((uint32_t)LPTIMx) + { + case LPTIM1_BASE: + tmpclksource = LL_RCC_GetLPTIMClockSource(LL_RCC_LPTIM1_CLKSOURCE); + break; +#if defined(LPTIM2) + case LPTIM2_BASE: + tmpclksource = LL_RCC_GetLPTIMClockSource(LL_RCC_LPTIM2_CLKSOURCE); + break; +#endif /* LPTIM2 */ + default: + break; + } + + /* Save LPTIM configuration registers */ + tmpIER = LPTIMx->IER; + tmpCFGR = LPTIMx->CFGR; + tmpCMP = LPTIMx->CMP; + tmpARR = LPTIMx->ARR; + tmpCFGR2 = LPTIMx->CFGR2; + + /************* Reset LPTIM ************/ + (void)LL_LPTIM_DeInit(LPTIMx); + + /********* Restore LPTIM Config *******/ + LL_RCC_GetSystemClocksFreq(&rcc_clock); + + if ((tmpCMP != 0UL) || (tmpARR != 0UL)) + { + /* Force LPTIM source kernel clock from APB */ + switch ((uint32_t)LPTIMx) + { + case LPTIM1_BASE: + LL_RCC_SetLPTIMClockSource(LL_RCC_LPTIM1_CLKSOURCE_PCLK1); + break; +#if defined(LPTIM2) + case LPTIM2_BASE: + LL_RCC_SetLPTIMClockSource(LL_RCC_LPTIM2_CLKSOURCE_PCLK1); + break; +#endif /* LPTIM2 */ + default: + break; + } + + if (tmpCMP != 0UL) + { + /* Restore CMP and ARR registers (LPTIM should be enabled first) */ + LPTIMx->CR |= LPTIM_CR_ENABLE; + LPTIMx->CMP = tmpCMP; + + /* Polling on CMP write ok status after above restore operation */ + do + { + rcc_clock.SYSCLK_Frequency--; /* Used for timeout */ + } while (((LL_LPTIM_IsActiveFlag_CMPOK(LPTIMx) != 1UL)) && ((rcc_clock.SYSCLK_Frequency) > 0UL)); + + LL_LPTIM_ClearFlag_CMPOK(LPTIMx); + } + + if (tmpARR != 0UL) + { + LPTIMx->CR |= LPTIM_CR_ENABLE; + LPTIMx->ARR = tmpARR; + + LL_RCC_GetSystemClocksFreq(&rcc_clock); + /* Polling on ARR write ok status after above restore operation */ + do + { + rcc_clock.SYSCLK_Frequency--; /* Used for timeout */ + } + while (((LL_LPTIM_IsActiveFlag_ARROK(LPTIMx) != 1UL)) && ((rcc_clock.SYSCLK_Frequency) > 0UL)); + + LL_LPTIM_ClearFlag_ARROK(LPTIMx); + } + + + /* Restore LPTIM source kernel clock */ + LL_RCC_SetLPTIMClockSource(tmpclksource); + } + + /* Restore configuration registers (LPTIM should be disabled first) */ + LPTIMx->CR &= ~(LPTIM_CR_ENABLE); + LPTIMx->IER = tmpIER; + LPTIMx->CFGR = tmpCFGR; + LPTIMx->CFGR2 = tmpCFGR2; + + /* Exit critical section: restore previous priority mask */ + __set_PRIMASK(primask_bit); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* LPTIM1 || LPTIM2 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lpuart.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lpuart.c new file mode 100644 index 0000000..db0d07b --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lpuart.c @@ -0,0 +1,311 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_lpuart.c + * @author MCD Application Team + * @brief LPUART LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_lpuart.h" +#include "stm32g0xx_ll_rcc.h" +#include "stm32g0xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (LPUART1) || defined (LPUART2) + +/** @addtogroup LPUART_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup LPUART_LL_Private_Constants + * @{ + */ + +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup LPUART_LL_Private_Macros + * @{ + */ + +/* Check of parameters for configuration of LPUART registers */ + +#define IS_LL_LPUART_PRESCALER(__VALUE__) (((__VALUE__) == LL_LPUART_PRESCALER_DIV1) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV2) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV4) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV6) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV8) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV10) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV12) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV16) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV32) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV64) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV128) \ + || ((__VALUE__) == LL_LPUART_PRESCALER_DIV256)) + +/* __BAUDRATE__ Depending on constraints applicable for LPUART BRR register */ +/* value : */ +/* - fck must be in the range [3 x baudrate, 4096 x baudrate] */ +/* - LPUART_BRR register value should be >= 0x300 */ +/* - LPUART_BRR register value should be <= 0xFFFFF (20 bits) */ +/* Baudrate specified by the user should belong to [8, 21300000].*/ +#define IS_LL_LPUART_BAUDRATE(__BAUDRATE__) (((__BAUDRATE__) <= 21300000U) && ((__BAUDRATE__) >= 8U)) + +/* __VALUE__ BRR content must be greater than or equal to 0x300. */ +#define IS_LL_LPUART_BRR_MIN(__VALUE__) ((__VALUE__) >= 0x300U) + +/* __VALUE__ BRR content must be lower than or equal to 0xFFFFF. */ +#define IS_LL_LPUART_BRR_MAX(__VALUE__) ((__VALUE__) <= 0x000FFFFFU) + +#define IS_LL_LPUART_DIRECTION(__VALUE__) (((__VALUE__) == LL_LPUART_DIRECTION_NONE) \ + || ((__VALUE__) == LL_LPUART_DIRECTION_RX) \ + || ((__VALUE__) == LL_LPUART_DIRECTION_TX) \ + || ((__VALUE__) == LL_LPUART_DIRECTION_TX_RX)) + +#define IS_LL_LPUART_PARITY(__VALUE__) (((__VALUE__) == LL_LPUART_PARITY_NONE) \ + || ((__VALUE__) == LL_LPUART_PARITY_EVEN) \ + || ((__VALUE__) == LL_LPUART_PARITY_ODD)) + +#define IS_LL_LPUART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_LPUART_DATAWIDTH_7B) \ + || ((__VALUE__) == LL_LPUART_DATAWIDTH_8B) \ + || ((__VALUE__) == LL_LPUART_DATAWIDTH_9B)) + +#define IS_LL_LPUART_STOPBITS(__VALUE__) (((__VALUE__) == LL_LPUART_STOPBITS_1) \ + || ((__VALUE__) == LL_LPUART_STOPBITS_2)) + +#define IS_LL_LPUART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_LPUART_HWCONTROL_NONE) \ + || ((__VALUE__) == LL_LPUART_HWCONTROL_RTS) \ + || ((__VALUE__) == LL_LPUART_HWCONTROL_CTS) \ + || ((__VALUE__) == LL_LPUART_HWCONTROL_RTS_CTS)) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LPUART_LL_Exported_Functions + * @{ + */ + +/** @addtogroup LPUART_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize LPUART registers (Registers restored to their default values). + * @param LPUARTx LPUART Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: LPUART registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_LPUART_DeInit(const USART_TypeDef *LPUARTx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_LPUART_INSTANCE(LPUARTx)); + + if (LPUARTx == LPUART1) + { + /* Force reset of LPUART peripheral */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_LPUART1); + + /* Release reset of LPUART peripheral */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_LPUART1); + } +#if defined(LPUART2) + else if (LPUARTx == LPUART2) + { + /* Force reset of LPUART peripheral */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_LPUART2); + + /* Release reset of LPUART peripheral */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_LPUART2); + } +#endif /* LPUART2 */ + else + { + status = ERROR; + } + + return (status); +} + +/** + * @brief Initialize LPUART registers according to the specified + * parameters in LPUART_InitStruct. + * @note As some bits in LPUART configuration registers can only be written when + * the LPUART is disabled (USART_CR1_UE bit =0), + * LPUART Peripheral should be in disabled state prior calling this function. + * Otherwise, ERROR result will be returned. + * @note Baud rate value stored in LPUART_InitStruct BaudRate field, should be valid (different from 0). + * @param LPUARTx LPUART Instance + * @param LPUART_InitStruct pointer to a @ref LL_LPUART_InitTypeDef structure + * that contains the configuration information for the specified LPUART peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: LPUART registers are initialized according to LPUART_InitStruct content + * - ERROR: Problem occurred during LPUART Registers initialization + */ +ErrorStatus LL_LPUART_Init(USART_TypeDef *LPUARTx, const LL_LPUART_InitTypeDef *LPUART_InitStruct) +{ + ErrorStatus status = ERROR; +#if defined(LPUART2) + uint32_t periphclk = LL_RCC_PERIPH_FREQUENCY_NO; +#else + uint32_t periphclk; +#endif /* LPUART2 */ + + /* Check the parameters */ + assert_param(IS_LPUART_INSTANCE(LPUARTx)); + assert_param(IS_LL_LPUART_PRESCALER(LPUART_InitStruct->PrescalerValue)); + assert_param(IS_LL_LPUART_BAUDRATE(LPUART_InitStruct->BaudRate)); + assert_param(IS_LL_LPUART_DATAWIDTH(LPUART_InitStruct->DataWidth)); + assert_param(IS_LL_LPUART_STOPBITS(LPUART_InitStruct->StopBits)); + assert_param(IS_LL_LPUART_PARITY(LPUART_InitStruct->Parity)); + assert_param(IS_LL_LPUART_DIRECTION(LPUART_InitStruct->TransferDirection)); + assert_param(IS_LL_LPUART_HWCONTROL(LPUART_InitStruct->HardwareFlowControl)); + + /* LPUART needs to be in disabled state, in order to be able to configure some bits in + CRx registers. Otherwise (LPUART not in Disabled state) => return ERROR */ + if (LL_LPUART_IsEnabled(LPUARTx) == 0U) + { + /*---------------------------- LPUART CR1 Configuration ----------------------- + * Configure LPUARTx CR1 (LPUART Word Length, Parity and Transfer Direction bits) with parameters: + * - DataWidth: USART_CR1_M bits according to LPUART_InitStruct->DataWidth value + * - Parity: USART_CR1_PCE, USART_CR1_PS bits according to LPUART_InitStruct->Parity value + * - TransferDirection: USART_CR1_TE, USART_CR1_RE bits according to LPUART_InitStruct->TransferDirection value + */ + MODIFY_REG(LPUARTx->CR1, + (USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE), + (LPUART_InitStruct->DataWidth | LPUART_InitStruct->Parity | LPUART_InitStruct->TransferDirection)); + + /*---------------------------- LPUART CR2 Configuration ----------------------- + * Configure LPUARTx CR2 (Stop bits) with parameters: + * - Stop Bits: USART_CR2_STOP bits according to LPUART_InitStruct->StopBits value. + */ + LL_LPUART_SetStopBitsLength(LPUARTx, LPUART_InitStruct->StopBits); + + /*---------------------------- LPUART CR3 Configuration ----------------------- + * Configure LPUARTx CR3 (Hardware Flow Control) with parameters: + * - HardwareFlowControl: USART_CR3_RTSE, USART_CR3_CTSE bits according + * to LPUART_InitStruct->HardwareFlowControl value. + */ + LL_LPUART_SetHWFlowCtrl(LPUARTx, LPUART_InitStruct->HardwareFlowControl); + + /*---------------------------- LPUART BRR Configuration ----------------------- + * Retrieve Clock frequency used for LPUART Peripheral + */ +#if defined(LPUART2) + if (LPUARTx == LPUART1) + { + periphclk = LL_RCC_GetLPUARTClockFreq(LL_RCC_LPUART1_CLKSOURCE); + } + else if (LPUARTx == LPUART2) + { + periphclk = LL_RCC_GetLPUARTClockFreq(LL_RCC_LPUART2_CLKSOURCE); + } + else + { + /* Nothing to do, as error code is already assigned to ERROR value */ + } +#else + periphclk = LL_RCC_GetLPUARTClockFreq(LL_RCC_LPUART1_CLKSOURCE); +#endif /* LPUART2 */ + + /* Configure the LPUART Baud Rate : + - prescaler value is required + - valid baud rate value (different from 0) is required + - Peripheral clock as returned by RCC service, should be valid (different from 0). + */ + if ((periphclk != LL_RCC_PERIPH_FREQUENCY_NO) + && (LPUART_InitStruct->BaudRate != 0U)) + { + status = SUCCESS; + LL_LPUART_SetBaudRate(LPUARTx, + periphclk, + LPUART_InitStruct->PrescalerValue, + LPUART_InitStruct->BaudRate); + + /* Check BRR is greater than or equal to 0x300 */ + assert_param(IS_LL_LPUART_BRR_MIN(LPUARTx->BRR)); + + /* Check BRR is lower than or equal to 0xFFFFF */ + assert_param(IS_LL_LPUART_BRR_MAX(LPUARTx->BRR)); + } + + /*---------------------------- LPUART PRESC Configuration ----------------------- + * Configure LPUARTx PRESC (Prescaler) with parameters: + * - PrescalerValue: LPUART_PRESC_PRESCALER bits according to LPUART_InitStruct->PrescalerValue value. + */ + LL_LPUART_SetPrescaler(LPUARTx, LPUART_InitStruct->PrescalerValue); + } + + return (status); +} + +/** + * @brief Set each @ref LL_LPUART_InitTypeDef field to default value. + * @param LPUART_InitStruct pointer to a @ref LL_LPUART_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ + +void LL_LPUART_StructInit(LL_LPUART_InitTypeDef *LPUART_InitStruct) +{ + /* Set LPUART_InitStruct fields to default values */ + LPUART_InitStruct->PrescalerValue = LL_LPUART_PRESCALER_DIV1; + LPUART_InitStruct->BaudRate = 9600U; + LPUART_InitStruct->DataWidth = LL_LPUART_DATAWIDTH_8B; + LPUART_InitStruct->StopBits = LL_LPUART_STOPBITS_1; + LPUART_InitStruct->Parity = LL_LPUART_PARITY_NONE ; + LPUART_InitStruct->TransferDirection = LL_LPUART_DIRECTION_TX_RX; + LPUART_InitStruct->HardwareFlowControl = LL_LPUART_HWCONTROL_NONE; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* LPUART1 || LPUART2 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_pwr.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_pwr.c new file mode 100644 index 0000000..a44b0bd --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_pwr.c @@ -0,0 +1,82 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_pwr.c + * @author MCD Application Team + * @brief PWR LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_pwr.h" +#include "stm32g0xx_ll_bus.h" + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined(PWR) + +/** @defgroup PWR_LL PWR + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWR_LL_Exported_Functions + * @{ + */ + +/** @addtogroup PWR_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the PWR registers to their default reset values. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: PWR registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_PWR_DeInit(void) +{ + /* Force reset of PWR clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_PWR); + + /* Release reset of PWR clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_PWR); + + return SUCCESS; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined(PWR) */ +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c new file mode 100644 index 0000000..fe11123 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c @@ -0,0 +1,1380 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_rcc.c + * @author MCD Application Team + * @brief RCC LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_rcc.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @addtogroup RCC_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup RCC_LL_Private_Macros + * @{ + */ +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +#define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE)) +#elif defined(STM32G081xx) || defined(STM32G071xx) || defined(STM32G070xx) +#define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE)) +#else +#define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_USART1_CLKSOURCE) +#endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + +#if defined(LPUART1) && defined(LPUART2) +#define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_LPUART2_CLKSOURCE)) +#elif defined(LPUART1) +#define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE) +#endif /* LPUART1 && LPUART2 */ + +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +#define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE)) +#else +#define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) +#endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + +#if defined(LPTIM1) || defined(LPTIM2) +#define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE)) +#endif /* LPTIM1 || LPTIM2 */ + +#if defined(RNG) +#define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE)) +#endif /* RNG */ + +#define IS_LL_RCC_ADC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_ADC_CLKSOURCE)) + +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +#define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_I2S2_CLKSOURCE)) +#else +#define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE)) +#endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + +#if defined(CEC) +#define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE)) +#endif /* CEC */ + +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +#define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE)) +#endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + +#if defined(FDCAN1) || defined(FDCAN2) +#define IS_LL_RCC_FDCAN_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_FDCAN_CLKSOURCE)) +#endif /* FDCAN1 || FDCAN2 */ + +#if defined(RCC_CCIPR_TIM1SEL) && defined(RCC_CCIPR_TIM15SEL) +#define IS_LL_RCC_TIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_TIM1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_TIM15_CLKSOURCE)) +#elif defined(RCC_CCIPR_TIM1SEL) +#define IS_LL_RCC_TIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_TIM1_CLKSOURCE)) +#endif /* RCC_CCIPR_TIM1SEL */ + + + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup RCC_LL_Private_Functions RCC Private functions + * @{ + */ +static uint32_t RCC_GetSystemClockFreq(void); +static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency); +static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency); +static uint32_t RCC_PLL_GetFreqDomain_SYS(void); +static uint32_t RCC_PLL_GetFreqDomain_ADC(void); +static uint32_t RCC_PLL_GetFreqDomain_I2S1(void); +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +static uint32_t RCC_PLL_GetFreqDomain_I2S2(void); +static uint32_t RCC_PLL_GetFreqDomain_USB(void); +#endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ +#if defined(FDCAN1) || defined(FDCAN2) +static uint32_t RCC_PLL_GetFreqDomain_FDCAN(void); +#endif /* FDCAN1 || FDCAN2 */ +#if defined(RNG) +static uint32_t RCC_PLL_GetFreqDomain_RNG(void); +#endif /* RNG */ +#if defined(RCC_PLLQ_SUPPORT) && defined(RCC_CCIPR_TIM1SEL) +static uint32_t RCC_PLL_GetFreqDomain_TIM1(void); +#endif /* RCC_PLLQ_SUPPORT && RCC_CCIPR_TIM1SEL */ +#if defined(RCC_CCIPR_TIM15SEL) +static uint32_t RCC_PLL_GetFreqDomain_TIM15(void); +#endif /* RCC_CCIPR_TIM15SEL */ +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RCC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup RCC_LL_EF_Init + * @{ + */ + +/** + * @brief Reset the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE and PLL OFF + * - AHB and APB1 prescaler set to 1. + * - CSS, MCO OFF + * - All interrupts disabled + * @note This function does not modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RCC registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_RCC_DeInit(void) +{ + /* Set HSION bit and wait for HSI READY bit */ + LL_RCC_HSI_Enable(); + while (LL_RCC_HSI_IsReady() != 1U) + {} + + /* Set HSITRIM bits to reset value*/ + LL_RCC_HSI_SetCalibTrimming(0x40U); + + /* Reset CFGR register */ + LL_RCC_WriteReg(CFGR, 0x00000000U); + + /* Reset whole CR register but HSI in 2 steps in case HSEBYP is set */ + LL_RCC_WriteReg(CR, RCC_CR_HSION); + while (LL_RCC_HSE_IsReady() != 0U) + {} + LL_RCC_WriteReg(CR, RCC_CR_HSION); + + /* Wait for PLL READY bit to be reset */ + while (LL_RCC_PLL_IsReady() != 0U) + {} + + /* Reset PLLCFGR register */ + LL_RCC_WriteReg(PLLCFGR, 16U << RCC_PLLCFGR_PLLN_Pos); + + /* Disable all interrupts */ + LL_RCC_WriteReg(CIER, 0x00000000U); + + /* Clear all interrupts flags */ + LL_RCC_WriteReg(CICR, 0xFFFFFFFFU); + + return SUCCESS; +} + +/** + * @} + */ + +/** @addtogroup RCC_LL_EF_Get_Freq + * @brief Return the frequencies of different on chip clocks; System, AHB and APB1 buses clocks + * and different peripheral clocks available on the device. + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE divided by HSI division factor(**) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***) + * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(***) + * or HSI_VALUE(**) multiplied/divided by the PLL factors. + * @note (**) HSI_VALUE is a constant defined in this file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (***) HSE_VALUE is a constant defined in this file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * @note The result of this function could be incorrect when using fractional + * value for HSE crystal. + * @note This function can be used by the user application to compute the + * baud-rate for the communication peripherals or configure other parameters. + * @{ + */ + +/** + * @brief Return the frequencies of different on chip clocks; System, AHB and APB1 buses clocks + * @note Each time SYSCLK, HCLK and/or PCLK1 clock changes, this function + * must be called to update structure fields. Otherwise, any + * configuration based on this function will be incorrect. + * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies + * @retval None + */ +void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks) +{ + /* Get SYSCLK frequency */ + RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq(); + + /* HCLK clock frequency */ + RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency); + + /* PCLK1 clock frequency */ + RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency); +} + +/** + * @brief Return USARTx clock frequency + * @param USARTxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_USART1_CLKSOURCE + * @arg @ref LL_RCC_USART2_CLKSOURCE + * @arg @ref LL_RCC_USART3_CLKSOURCE + * @retval USART clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready + */ +uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource) +{ + uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource)); + + if (USARTxSource == LL_RCC_USART1_CLKSOURCE) + { + /* USART1CLK clock frequency */ + switch (LL_RCC_GetUSARTClockSource(USARTxSource)) + { + case LL_RCC_USART1_CLKSOURCE_SYSCLK: /* USART1 Clock is System Clock */ + usart_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_USART1_CLKSOURCE_HSI: /* USART1 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + usart_frequency = HSI_VALUE; + } + break; + + case LL_RCC_USART1_CLKSOURCE_LSE: /* USART1 Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady() == 1U) + { + usart_frequency = LSE_VALUE; + } + break; + + case LL_RCC_USART1_CLKSOURCE_PCLK1: /* USART1 Clock is PCLK1 */ + default: + usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#if defined(RCC_CCIPR_USART2SEL) + else if (USARTxSource == LL_RCC_USART2_CLKSOURCE) + { + /* USART2CLK clock frequency */ + switch (LL_RCC_GetUSARTClockSource(USARTxSource)) + { + case LL_RCC_USART2_CLKSOURCE_SYSCLK: /* USART2 Clock is System Clock */ + usart_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_USART2_CLKSOURCE_HSI: /* USART2 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + usart_frequency = HSI_VALUE; + } + break; + + case LL_RCC_USART2_CLKSOURCE_LSE: /* USART2 Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady() == 1U) + { + usart_frequency = LSE_VALUE; + } + break; + + case LL_RCC_USART2_CLKSOURCE_PCLK1: /* USART2 Clock is PCLK1 */ + default: + usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#endif /* RCC_CCIPR_USART2SEL */ +#if defined(RCC_CCIPR_USART3SEL) + else if (USARTxSource == LL_RCC_USART3_CLKSOURCE) + { + /* USART3CLK clock frequency */ + switch (LL_RCC_GetUSARTClockSource(USARTxSource)) + { + case LL_RCC_USART3_CLKSOURCE_SYSCLK: /* USART3 Clock is System Clock */ + usart_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_USART3_CLKSOURCE_HSI: /* USART3 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + usart_frequency = HSI_VALUE; + } + break; + + case LL_RCC_USART3_CLKSOURCE_LSE: /* USART3 Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady() == 1U) + { + usart_frequency = LSE_VALUE; + } + break; + + case LL_RCC_USART3_CLKSOURCE_PCLK1: /* USART3 Clock is PCLK1 */ + default: + usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#endif /* RCC_CCIPR_USART3SEL */ + else + { + /* nothing to do */ + } + return usart_frequency; +} + +/** + * @brief Return I2Cx clock frequency + * @param I2CxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_I2C1_CLKSOURCE + * @retval I2C clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready + */ +uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource) +{ + uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource)); + + if (I2CxSource == LL_RCC_I2C1_CLKSOURCE) + { + /* I2C1 CLK clock frequency */ + switch (LL_RCC_GetI2CClockSource(I2CxSource)) + { + case LL_RCC_I2C1_CLKSOURCE_SYSCLK: /* I2C1 Clock is System Clock */ + i2c_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_I2C1_CLKSOURCE_HSI: /* I2C1 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + i2c_frequency = HSI_VALUE; + } + break; + + case LL_RCC_I2C1_CLKSOURCE_PCLK1: /* I2C1 Clock is PCLK1 */ + default: + i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#if defined(RCC_CCIPR_I2C2SEL) + else if (I2CxSource == LL_RCC_I2C2_CLKSOURCE) + { + /* I2C2 CLK clock frequency */ + switch (LL_RCC_GetI2CClockSource(I2CxSource)) + { + case LL_RCC_I2C2_CLKSOURCE_SYSCLK: /* I2C2 Clock is System Clock */ + i2c_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_I2C2_CLKSOURCE_HSI: /* I2C2 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + i2c_frequency = HSI_VALUE; + } + break; + + case LL_RCC_I2C2_CLKSOURCE_PCLK1: /* I2C2 Clock is PCLK1 */ + default: + i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#endif /* RCC_CCIPR_I2C2SEL */ + else + { + /* nothing to do */ + } + + return i2c_frequency; +} + +/** + * @brief Return I2Sx clock frequency + * @param I2SxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE + * @retval I2S clock frequency (in Hz) + * @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + */ +uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource) +{ + uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource)); + + if (I2SxSource == LL_RCC_I2S1_CLKSOURCE) + { + /* I2S1 CLK clock frequency */ + switch (LL_RCC_GetI2SClockSource(I2SxSource)) + { + case LL_RCC_I2S1_CLKSOURCE_HSI: /* I2S1 Clock is HSI */ + i2s_frequency = HSI_VALUE; + break; + + case LL_RCC_I2S1_CLKSOURCE_PLL: /* I2S1 Clock is PLL"P" */ + if (LL_RCC_PLL_IsReady() == 1U) + { + if (LL_RCC_PLL_IsEnabledDomain_I2S1() == 1U) + { + i2s_frequency = RCC_PLL_GetFreqDomain_I2S1(); + } + } + break; + + + case LL_RCC_I2S1_CLKSOURCE_PIN: /* I2S1 Clock is External clock */ + i2s_frequency = EXTERNAL_CLOCK_VALUE; + break; + + case LL_RCC_I2S1_CLKSOURCE_SYSCLK: /* I2S1 Clock is System Clock */ + default: + i2s_frequency = RCC_GetSystemClockFreq(); + break; + } + } +#if defined(RCC_CCIPR2_I2S2SEL) + else if (I2SxSource == LL_RCC_I2S2_CLKSOURCE) + { + /* I2S2 CLK clock frequency */ + switch (LL_RCC_GetI2SClockSource(I2SxSource)) + { + case LL_RCC_I2S2_CLKSOURCE_HSI: /* I2S2 Clock is HSI */ + i2s_frequency = HSI_VALUE; + break; + + case LL_RCC_I2S2_CLKSOURCE_PLL: /* I2S2 Clock is PLL"P" */ + if (LL_RCC_PLL_IsReady() == 1U) + { + if (LL_RCC_PLL_IsEnabledDomain_I2S2() == 1U) + { + i2s_frequency = RCC_PLL_GetFreqDomain_I2S2(); + } + } + break; + + case LL_RCC_I2S2_CLKSOURCE_PIN: /* I2S2 Clock is External clock */ + i2s_frequency = EXTERNAL_CLOCK_VALUE; + break; + + case LL_RCC_I2S2_CLKSOURCE_SYSCLK: /* I2S2 Clock is System Clock */ + default: + i2s_frequency = RCC_GetSystemClockFreq(); + break; + } + } +#endif /* RCC_CCIPR2_I2S2SEL */ + else + { + } + return i2s_frequency; +} + +#if defined(LPUART1) || defined(LPUART2) +/** + * @brief Return LPUARTx clock frequency + * @param LPUARTxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_LPUART1_CLKSOURCE + * @arg @ref LL_RCC_LPUART2_CLKSOURCE (*) + * @retval LPUART clock frequency (in Hz) + * @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready + * (*) feature not available on all devices + */ +uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource) +{ + uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_LPUART_CLKSOURCE(LPUARTxSource)); + + if (LPUARTxSource == LL_RCC_LPUART1_CLKSOURCE) + { + /* LPUART1CLK clock frequency */ + switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource)) + { + case LL_RCC_LPUART1_CLKSOURCE_SYSCLK: /* LPUART1 Clock is System Clock */ + lpuart_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_LPUART1_CLKSOURCE_HSI: /* LPUART1 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + lpuart_frequency = HSI_VALUE; + } + break; + + case LL_RCC_LPUART1_CLKSOURCE_LSE: /* LPUART1 Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady() == 1U) + { + lpuart_frequency = LSE_VALUE; + } + break; + + case LL_RCC_LPUART1_CLKSOURCE_PCLK1: /* LPUART1 Clock is PCLK1 */ + default: + lpuart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#if defined(LPUART2) + else if (LPUARTxSource == LL_RCC_LPUART2_CLKSOURCE) + { + /* LPUART2CLK clock frequency */ + switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource)) + { + case LL_RCC_LPUART2_CLKSOURCE_SYSCLK: /* LPUART2 Clock is System Clock */ + lpuart_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_LPUART2_CLKSOURCE_HSI: /* LPUART2 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + lpuart_frequency = HSI_VALUE; + } + break; + + case LL_RCC_LPUART2_CLKSOURCE_LSE: /* LPUART2 Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady() == 1U) + { + lpuart_frequency = LSE_VALUE; + } + break; + + case LL_RCC_LPUART2_CLKSOURCE_PCLK1: /* LPUART2 Clock is PCLK1 */ + default: + lpuart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#endif /* LPUART2 */ + else + { + /*nothing to do*/ + } + + return lpuart_frequency; +} +#endif /* LPUART1 */ + +#if defined(LPTIM1) && defined(LPTIM2) +/** + * @brief Return LPTIMx clock frequency + * @param LPTIMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE + * @arg @ref LL_RCC_LPTIM2_CLKSOURCE + * @retval LPTIM clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready + */ +uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource) +{ + uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource)); + + if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE) + { + /* LPTIM1CLK clock frequency */ + switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource)) + { + case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */ + if (LL_RCC_LSI_IsReady() == 1U) + { + lptim_frequency = LSI_VALUE; + } + break; + + case LL_RCC_LPTIM1_CLKSOURCE_HSI: /* LPTIM1 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + lptim_frequency = HSI_VALUE; + } + break; + + case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady() == 1U) + { + lptim_frequency = LSE_VALUE; + } + break; + + case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: /* LPTIM1 Clock is PCLK1 */ + default: + lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } + else + { + /* LPTIM2CLK clock frequency */ + switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource)) + { + case LL_RCC_LPTIM2_CLKSOURCE_LSI: /* LPTIM2 Clock is LSI Osc. */ + if (LL_RCC_LSI_IsReady() == 1U) + { + lptim_frequency = LSI_VALUE; + } + break; + + case LL_RCC_LPTIM2_CLKSOURCE_HSI: /* LPTIM2 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady() == 1U) + { + lptim_frequency = HSI_VALUE; + } + break; + + case LL_RCC_LPTIM2_CLKSOURCE_LSE: /* LPTIM2 Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady() == 1U) + { + lptim_frequency = LSE_VALUE; + } + break; + + case LL_RCC_LPTIM2_CLKSOURCE_PCLK1: /* LPTIM2 Clock is PCLK1 */ + default: + lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } + + return lptim_frequency; +} +#endif /* LPTIM1 && LPTIM2 */ + +#if defined(RCC_CCIPR_TIM1SEL) || defined(RCC_CCIPR_TIM15SEL) +/** + * @brief Return TIMx clock frequency + * @param TIMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_TIM1_CLKSOURCE + * @if defined(STM32G081xx) + * @arg @ref LL_RCC_TIM15_CLKSOURCE + * @endif + * @retval TIMx clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready + */ +uint32_t LL_RCC_GetTIMClockFreq(uint32_t TIMxSource) +{ + uint32_t tim_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_TIM_CLKSOURCE(TIMxSource)); + + if (TIMxSource == LL_RCC_TIM1_CLKSOURCE) + { + /* TIM1CLK clock frequency */ + switch (LL_RCC_GetTIMClockSource(TIMxSource)) + { + case LL_RCC_TIM1_CLKSOURCE_PLL: /* TIM1 Clock is PLLQ */ + if (LL_RCC_PLL_IsReady() == 1U) + { + if (LL_RCC_PLL_IsEnabledDomain_TIM1() == 1U) + { + tim_frequency = RCC_PLL_GetFreqDomain_TIM1(); + } + } + break; + + case LL_RCC_TIM1_CLKSOURCE_PCLK1: /* TIM1 Clock is PCLK1 */ + default: + tim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#if defined(TIM15) + else + { + if (TIMxSource == LL_RCC_TIM15_CLKSOURCE) + { + /* TIM15CLK clock frequency */ + switch (LL_RCC_GetTIMClockSource(TIMxSource)) + { + case LL_RCC_TIM15_CLKSOURCE_PLL: /* TIM1 Clock is PLLQ */ + if (LL_RCC_PLL_IsReady() == 1U) + { + if (LL_RCC_PLL_IsEnabledDomain_TIM15() == 1U) + { + tim_frequency = RCC_PLL_GetFreqDomain_TIM15(); + } + } + break; + + case LL_RCC_TIM15_CLKSOURCE_PCLK1: /* TIM15 Clock is PCLK1 */ + default: + tim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } + } +#endif /* TIM15 */ + return tim_frequency; +} +#endif /* RCC_CCIPR_TIM1SEL && RCC_CCIPR_TIM15SEL */ + + +#if defined(RNG) +/** + * @brief Return RNGx clock frequency + * @param RNGxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE + * @retval RNG clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI) or PLL is not ready + * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected + */ +uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource) +{ + uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + uint32_t rngdiv; + + /* Check parameter */ + assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource)); + + /* RNGCLK clock frequency */ + switch (LL_RCC_GetRNGClockSource(RNGxSource)) + { + case LL_RCC_RNG_CLKSOURCE_PLL: /* PLL clock used as RNG clock source */ + if (LL_RCC_PLL_IsReady() == 1U) + { + if (LL_RCC_PLL_IsEnabledDomain_RNG() == 1U) + { + rng_frequency = RCC_PLL_GetFreqDomain_RNG(); + rngdiv = (1UL << ((READ_BIT(RCC->CCIPR, RCC_CCIPR_RNGDIV)) >> RCC_CCIPR_RNGDIV_Pos)); + rng_frequency = (rng_frequency / rngdiv); + } + } + break; + + case LL_RCC_RNG_CLKSOURCE_HSI_DIV8: /* HSI clock divided by 8 used as RNG clock source */ + rng_frequency = HSI_VALUE / 8U; + rngdiv = (1UL << ((READ_BIT(RCC->CCIPR, RCC_CCIPR_RNGDIV)) >> RCC_CCIPR_RNGDIV_Pos)); + rng_frequency = (rng_frequency / rngdiv); + break; + case LL_RCC_RNG_CLKSOURCE_SYSCLK: /* SYSCLK clock used as RNG clock source */ + rng_frequency = RCC_GetSystemClockFreq(); + rngdiv = (1UL << ((READ_BIT(RCC->CCIPR, RCC_CCIPR_RNGDIV)) >> RCC_CCIPR_RNGDIV_Pos)); + rng_frequency = (rng_frequency / rngdiv); + break; + + case LL_RCC_RNG_CLKSOURCE_NONE: /* No clock used as RNG clock source */ + default: + rng_frequency = LL_RCC_PERIPH_FREQUENCY_NA; + break; + + } + + return rng_frequency; +} +#endif /* RNG */ + +#if defined(CEC) +/** + * @brief Return CEC clock frequency + * @param CECxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE + * @retval CEC clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready + */ +uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource) +{ + uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource)); + + /* CECCLK clock frequency */ + switch (LL_RCC_GetCECClockSource(CECxSource)) + { + case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady() == 1U) + { + cec_frequency = LSE_VALUE; + } + break; + + case LL_RCC_CEC_CLKSOURCE_HSI_DIV488: /* CEC Clock is HSI Osc. */ + default: + if (LL_RCC_HSI_IsReady() == 1U) + { + cec_frequency = (HSI_VALUE / 488U); + } + break; + } + + return cec_frequency; +} +#endif /* CEC */ + +#if defined(FDCAN1) || defined(FDCAN2) +/** + * @brief Return FDCANx clock frequency + * @param FDCANxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_FDCAN_CLKSOURCE + * @retval FDCANx clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready + */ +uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource) +{ + uint32_t fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_FDCAN_CLKSOURCE(FDCANxSource)); + + /* FDCANCLK clock frequency */ + switch (LL_RCC_GetFDCANClockSource(FDCANxSource)) + { + case LL_RCC_FDCAN_CLKSOURCE_PLL: /* FDCAN Clock is PLL "Q" Osc. */ + if (LL_RCC_PLL_IsReady() == 1U) + { + if (LL_RCC_PLL_IsEnabledDomain_FDCAN() == 1U) + { + fdcan_frequency = RCC_PLL_GetFreqDomain_FDCAN(); + } + } + break; + + case LL_RCC_FDCAN_CLKSOURCE_HSE: /* FDCAN Clock is HSE Osc. */ + if (LL_RCC_HSE_IsReady() == 1U) + { + fdcan_frequency = HSE_VALUE; + } + break; + + case LL_RCC_FDCAN_CLKSOURCE_PCLK1: /* FDCAN Clock is PCLK1 */ + default: + fdcan_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + + return fdcan_frequency; +} +#endif /* FDCAN1 || FDCAN2 */ + +/** + * @brief Return ADCx clock frequency + * @param ADCxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC_CLKSOURCE + * @retval ADC clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI) or PLL is not ready + * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected + */ +uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource) +{ + uint32_t adc_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_ADC_CLKSOURCE(ADCxSource)); + + /* ADCCLK clock frequency */ + switch (LL_RCC_GetADCClockSource(ADCxSource)) + { + case LL_RCC_ADC_CLKSOURCE_SYSCLK: /* SYSCLK clock used as ADC clock source */ + adc_frequency = RCC_GetSystemClockFreq(); + break; + case LL_RCC_ADC_CLKSOURCE_HSI : /* HSI clock used as ADC clock source */ + adc_frequency = HSI_VALUE; + break; + + case LL_RCC_ADC_CLKSOURCE_PLL: /* PLLP clock used as ADC clock source */ + if (LL_RCC_PLL_IsReady() == 1U) + { + if (LL_RCC_PLL_IsEnabledDomain_ADC() == 1U) + { + adc_frequency = RCC_PLL_GetFreqDomain_ADC(); + } + } + break; + default: + adc_frequency = LL_RCC_PERIPH_FREQUENCY_NA; + break; + } + + return adc_frequency; +} + +/** + * @brief Return RTC clock frequency + * @retval RTC clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillators (LSI, LSE or HSE) are not ready + * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected + */ +uint32_t LL_RCC_GetRTCClockFreq(void) +{ + uint32_t rtc_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* RTCCLK clock frequency */ + switch (LL_RCC_GetRTCClockSource()) + { + case LL_RCC_RTC_CLKSOURCE_LSE: /* LSE clock used as RTC clock source */ + if (LL_RCC_LSE_IsReady() == 1U) + { + rtc_frequency = LSE_VALUE; + } + break; + + case LL_RCC_RTC_CLKSOURCE_LSI: /* LSI clock used as RTC clock source */ + if (LL_RCC_LSI_IsReady() == 1U) + { + rtc_frequency = LSI_VALUE; + } + break; + + case LL_RCC_RTC_CLKSOURCE_HSE_DIV32: /* HSE clock used as ADC clock source */ + rtc_frequency = HSE_VALUE / 32U; + break; + + case LL_RCC_RTC_CLKSOURCE_NONE: /* No clock used as RTC clock source */ + default: + rtc_frequency = LL_RCC_PERIPH_FREQUENCY_NA; + break; + } + + return rtc_frequency; +} + +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +/** + * @brief Return USBx clock frequency + * @param USBxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE + * @retval USB clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI48) or PLL is not ready + * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected + */ +uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource) +{ + uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource)); + + /* USBCLK clock frequency */ + switch (LL_RCC_GetUSBClockSource(USBxSource)) + { +#if defined(RCC_HSI48_SUPPORT) + case LL_RCC_USB_CLKSOURCE_HSI48: /* HSI48 used as USB clock source */ + if (LL_RCC_HSI48_IsReady() != 0U) + { + usb_frequency = HSI48_VALUE; + } + break; +#endif /* RCC_HSI48_SUPPORT */ + + case LL_RCC_USB_CLKSOURCE_HSE: /* HSE used as USB clock source */ + if (LL_RCC_HSE_IsReady() != 0U) + { + usb_frequency = HSE_VALUE; + } + break; + + case LL_RCC_USB_CLKSOURCE_PLL: /* PLL clock used as USB clock source */ + if (LL_RCC_PLL_IsReady() != 0U) + { + if (LL_RCC_PLL_IsEnabledDomain_USB() != 0U) + { + usb_frequency = RCC_PLL_GetFreqDomain_USB(); + } + } + break; + + default: + usb_frequency = LL_RCC_PERIPH_FREQUENCY_NA; + break; + } + + return usb_frequency; +} +#endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx) */ + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup RCC_LL_Private_Functions + * @{ + */ + +/** + * @brief Return SYSTEM clock frequency + * @retval SYSTEM clock frequency (in Hz) + */ +static uint32_t RCC_GetSystemClockFreq(void) +{ + uint32_t frequency; + uint32_t hsidiv; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (LL_RCC_GetSysClkSource()) + { + case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ + frequency = HSE_VALUE; + break; + + case LL_RCC_SYS_CLKSOURCE_STATUS_PLL: /* PLL used as system clock source */ + frequency = RCC_PLL_GetFreqDomain_SYS(); + break; + + case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ + default: + hsidiv = (1UL << ((READ_BIT(RCC->CR, RCC_CR_HSIDIV)) >> RCC_CR_HSIDIV_Pos)); + frequency = (HSI_VALUE / hsidiv); + break; + } + + return frequency; +} + +/** + * @brief Return HCLK clock frequency + * @param SYSCLK_Frequency SYSCLK clock frequency + * @retval HCLK clock frequency (in Hz) + */ +static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency) +{ + /* HCLK clock frequency */ + return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler()); +} + +/** + * @brief Return PCLK1 clock frequency + * @param HCLK_Frequency HCLK clock frequency + * @retval PCLK1 clock frequency (in Hz) + */ +static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency) +{ + /* PCLK1 clock frequency */ + return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler()); +} +/** + * @brief Return PLL clock frequency used for system domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_SYS(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + pllinputfreq = HSI_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR()); +} +/** + * @brief Return PLL clock frequency used for ADC domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_ADC(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + ADC Domain clock = PLL_VCO / PLLP + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_ADC_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP()); +} + +#if defined(FDCAN1) || defined(FDCAN2) +/** + * @brief Return PLL clock frequency used for FDCAN domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_FDCAN(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN + + FDCAN Domain clock = PLL_VCO / PLLQ + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_FDCAN_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ()); +} +#endif /* FDCAN1 || FDCAN2 */ + +/** + * @brief Return PLL clock frequency used for I2S1 domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_I2S1(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + I2S1 Domain clock = PLL_VCO / PLLP + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_I2S1_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP()); +} + +#if defined(RCC_CCIPR2_I2S2SEL) +/** + * @brief Return PLL clock frequency used for I2S2 domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_I2S2(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + I2S2 Domain clock = PLL_VCO / PLLP + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_I2S2_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP()); +} +#endif /* RCC_CCIPR2_I2S2SEL */ + +#if defined(RNG) +/** + * @brief Return PLL clock frequency used for RNG domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_RNG(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN + + RNG Domain clock = PLL_VCO / PLLQ + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_RNG_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ()); +} +#endif /* RNG */ + +#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx) +/** + * @brief Return PLL clock frequency used for USB domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_USB(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN + + RNG Domain clock = PLL_VCO / PLLQ + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_USB_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ()); +} +#endif /* STM32G0C1xx || STM32G0B1xx || STM32G0B0xx */ + +#if defined(RCC_PLLQ_SUPPORT) && defined(RCC_CCIPR_TIM1SEL) +/** + * @brief Return PLL clock frequency used for TIM1 domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_TIM1(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN + + TIM1 Domain clock = PLL_VCO / PLLQ + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_TIM1_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ()); +} +#endif /* RCC_PLLQ_SUPPORT */ + +#if defined(RCC_CCIPR_TIM15SEL) +/** + * @brief Return PLL clock frequency used for TIM15 domain + * @retval PLL clock frequency (in Hz) + */ +static uint32_t RCC_PLL_GetFreqDomain_TIM15(void) +{ + uint32_t pllinputfreq; + uint32_t pllsource; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN + + TIM15 Domain clock = PLL_VCO / PLLQ + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_TIM15_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ()); +} +#endif /* RCC_CCIPR_TIM15SEL */ +/** + * @} + */ + +/** + * @} + */ + +#endif /* RCC */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rng.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rng.c new file mode 100644 index 0000000..1f66536 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rng.c @@ -0,0 +1,145 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_rng.c + * @author MCD Application Team + * @brief RNG LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_rng.h" +#include "stm32g0xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (RNG) + +/** @addtogroup RNG_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup RNG_LL_Private_Macros RNG Private Macros + * @{ + */ +#define IS_LL_RNG_CED(__MODE__) (((__MODE__) == LL_RNG_CED_ENABLE) || \ + ((__MODE__) == LL_RNG_CED_DISABLE)) + +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RNG_LL_Exported_Functions + * @{ + */ + +/** @addtogroup RNG_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize RNG registers (Registers restored to their default values). + * @param RNGx RNG Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RNG registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_RNG_DeInit(RNG_TypeDef *RNGx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_RNG_ALL_INSTANCE(RNGx)); + if (RNGx == RNG) + { + /* Enable RNG reset state */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_RNG); + + /* Release RNG from reset state */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_RNG); + } + else + { + status = ERROR; + } + + return status; +} + +/** + * @brief Initialize RNG registers according to the specified parameters in RNG_InitStruct. + * @param RNGx RNG Instance + * @param RNG_InitStruct pointer to a LL_RNG_InitTypeDef structure + * that contains the configuration information for the specified RNG peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RNG registers are initialized according to RNG_InitStruct content + * - ERROR: not applicable + */ +ErrorStatus LL_RNG_Init(RNG_TypeDef *RNGx, LL_RNG_InitTypeDef *RNG_InitStruct) +{ + /* Check the parameters */ + assert_param(IS_RNG_ALL_INSTANCE(RNGx)); + assert_param(IS_LL_RNG_CED(RNG_InitStruct->ClockErrorDetection)); + + /* Clock Error Detection configuration */ + MODIFY_REG(RNGx->CR, RNG_CR_CED, RNG_InitStruct->ClockErrorDetection); + + return (SUCCESS); +} + +/** + * @brief Set each @ref LL_RNG_InitTypeDef field to default value. + * @param RNG_InitStruct pointer to a @ref LL_RNG_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_RNG_StructInit(LL_RNG_InitTypeDef *RNG_InitStruct) +{ + /* Set RNG_InitStruct fields to default values */ + RNG_InitStruct->ClockErrorDetection = LL_RNG_CED_ENABLE; + +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* RNG */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rtc.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rtc.c new file mode 100644 index 0000000..5633fde --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rtc.c @@ -0,0 +1,861 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_rtc.c + * @author MCD Application Team + * @brief RTC LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_rtc.h" +#include "stm32g0xx_ll_cortex.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined(RTC) + +/** @addtogroup RTC_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup RTC_LL_Private_Constants + * @{ + */ +/* Default values used for prescaler */ +#define RTC_ASYNCH_PRESC_DEFAULT 0x0000007FU +#define RTC_SYNCH_PRESC_DEFAULT 0x000000FFU + +/* Values used for timeout */ +#define RTC_INITMODE_TIMEOUT 1000U /* 1s when tick set to 1ms */ +#define RTC_SYNCHRO_TIMEOUT 1000U /* 1s when tick set to 1ms */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup RTC_LL_Private_Macros + * @{ + */ + +#define IS_LL_RTC_HOURFORMAT(__VALUE__) (((__VALUE__) == LL_RTC_HOURFORMAT_24HOUR) \ + || ((__VALUE__) == LL_RTC_HOURFORMAT_AMPM)) + +#define IS_LL_RTC_ASYNCH_PREDIV(__VALUE__) ((__VALUE__) <= 0x7FU) + +#define IS_LL_RTC_SYNCH_PREDIV(__VALUE__) ((__VALUE__) <= 0x7FFFU) + +#define IS_LL_RTC_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_FORMAT_BIN) \ + || ((__VALUE__) == LL_RTC_FORMAT_BCD)) + +#define IS_LL_RTC_TIME_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_TIME_FORMAT_AM_OR_24) \ + || ((__VALUE__) == LL_RTC_TIME_FORMAT_PM)) + +#define IS_LL_RTC_HOUR12(__HOUR__) (((__HOUR__) > 0U) && ((__HOUR__) <= 12U)) +#define IS_LL_RTC_HOUR24(__HOUR__) ((__HOUR__) <= 23U) +#define IS_LL_RTC_MINUTES(__MINUTES__) ((__MINUTES__) <= 59U) +#define IS_LL_RTC_SECONDS(__SECONDS__) ((__SECONDS__) <= 59U) + +#define IS_LL_RTC_WEEKDAY(__VALUE__) (((__VALUE__) == LL_RTC_WEEKDAY_MONDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_TUESDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_WEDNESDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_THURSDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_FRIDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_SATURDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_SUNDAY)) + +#define IS_LL_RTC_DAY(__DAY__) (((__DAY__) >= 1U) && ((__DAY__) <= 31U)) + +#define IS_LL_RTC_MONTH(__MONTH__) (((__MONTH__) >= 1U) && ((__MONTH__) <= 12U)) + +#define IS_LL_RTC_YEAR(__YEAR__) ((__YEAR__) <= 99U) + +#define IS_LL_RTC_ALMA_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMA_MASK_NONE) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_DATEWEEKDAY) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_HOURS) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_MINUTES) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_SECONDS) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_ALL)) + +#define IS_LL_RTC_ALMB_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMB_MASK_NONE) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_DATEWEEKDAY) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_HOURS) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_MINUTES) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_SECONDS) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_ALL)) + + +#define IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) || \ + ((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_WEEKDAY)) + +#define IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) || \ + ((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_WEEKDAY)) + + +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RTC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup RTC_LL_EF_Init + * @{ + */ + +/** + * @brief De-Initializes the RTC registers to their default reset values. + * @note This function does not reset the RTC Clock source and RTC Backup Data + * registers. + * @param RTCx RTC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC registers are de-initialized + * - ERROR: RTC registers are not de-initialized + */ +ErrorStatus LL_RTC_DeInit(RTC_TypeDef *RTCx) +{ + ErrorStatus status = ERROR; + + /* Check the parameter */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Set Initialization mode */ + if (LL_RTC_EnterInitMode(RTCx) != ERROR) + { + /* Reset TR, DR and CR registers */ + WRITE_REG(RTCx->TR, 0x00000000U); +#if defined(RTC_WAKEUP_SUPPORT) + WRITE_REG(RTCx->WUTR, RTC_WUTR_WUT); +#endif /* RTC_WAKEUP_SUPPORT */ + WRITE_REG(RTCx->DR , (RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0)); + /* Reset All CR bits except CR[2:0] */ +#if defined(RTC_WAKEUP_SUPPORT) + WRITE_REG(RTCx->CR, (READ_REG(RTCx->CR) & RTC_CR_WUCKSEL)); +#else + WRITE_REG(RTCx->CR, 0x00000000U); +#endif /* RTC_WAKEUP_SUPPORT */ + WRITE_REG(RTCx->PRER, (RTC_PRER_PREDIV_A | RTC_SYNCH_PRESC_DEFAULT)); + WRITE_REG(RTCx->ALRMAR, 0x00000000U); + WRITE_REG(RTCx->ALRMBR, 0x00000000U); + WRITE_REG(RTCx->SHIFTR, 0x00000000U); + WRITE_REG(RTCx->CALR, 0x00000000U); + WRITE_REG(RTCx->ALRMASSR, 0x00000000U); + WRITE_REG(RTCx->ALRMBSSR, 0x00000000U); + + /* Exit Initialization mode */ + LL_RTC_DisableInitMode(RTCx); + + /* Wait till the RTC RSF flag is set */ + status = LL_RTC_WaitForSynchro(RTCx); + } + + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return status; +} + +/** + * @brief Initializes the RTC registers according to the specified parameters + * in RTC_InitStruct. + * @param RTCx RTC Instance + * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure that contains + * the configuration information for the RTC peripheral. + * @note The RTC Prescaler register is write protected and can be written in + * initialization mode only. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC registers are initialized + * - ERROR: RTC registers are not initialized + */ +ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_HOURFORMAT(RTC_InitStruct->HourFormat)); + assert_param(IS_LL_RTC_ASYNCH_PREDIV(RTC_InitStruct->AsynchPrescaler)); + assert_param(IS_LL_RTC_SYNCH_PREDIV(RTC_InitStruct->SynchPrescaler)); + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Set Initialization mode */ + if (LL_RTC_EnterInitMode(RTCx) != ERROR) + { + /* Set Hour Format */ + LL_RTC_SetHourFormat(RTCx, RTC_InitStruct->HourFormat); + + /* Configure Synchronous and Asynchronous prescaler factor */ + LL_RTC_SetSynchPrescaler(RTCx, RTC_InitStruct->SynchPrescaler); + LL_RTC_SetAsynchPrescaler(RTCx, RTC_InitStruct->AsynchPrescaler); + + /* Exit Initialization mode */ + LL_RTC_DisableInitMode(RTCx); + + status = SUCCESS; + } + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return status; +} + +/** + * @brief Set each @ref LL_RTC_InitTypeDef field to default value. + * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct) +{ + /* Set RTC_InitStruct fields to default values */ + RTC_InitStruct->HourFormat = LL_RTC_HOURFORMAT_24HOUR; + RTC_InitStruct->AsynchPrescaler = RTC_ASYNCH_PRESC_DEFAULT; + RTC_InitStruct->SynchPrescaler = RTC_SYNCH_PRESC_DEFAULT; +} + +/** + * @brief Set the RTC current time. + * @param RTCx RTC Instance + * @param RTC_Format This parameter can be one of the following values: + * @arg @ref LL_RTC_FORMAT_BIN + * @arg @ref LL_RTC_FORMAT_BCD + * @param RTC_TimeStruct pointer to a RTC_TimeTypeDef structure that contains + * the time configuration information for the RTC. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Time register is configured + * - ERROR: RTC Time register is not configured + */ +ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_FORMAT(RTC_Format)); + + if (RTC_Format == LL_RTC_FORMAT_BIN) + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(RTC_TimeStruct->Hours)); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat)); + } + else + { + RTC_TimeStruct->TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(RTC_TimeStruct->Hours)); + } + assert_param(IS_LL_RTC_MINUTES(RTC_TimeStruct->Minutes)); + assert_param(IS_LL_RTC_SECONDS(RTC_TimeStruct->Seconds)); + } + else + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours))); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat)); + } + else + { + RTC_TimeStruct->TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours))); + } + assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes))); + assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds))); + } + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Set Initialization mode */ + if (LL_RTC_EnterInitMode(RTCx) != ERROR) + { + /* Check the input parameters format */ + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, RTC_TimeStruct->Hours, + RTC_TimeStruct->Minutes, RTC_TimeStruct->Seconds); + } + else + { + LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Hours), + __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Minutes), + __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Seconds)); + } + + /* Exit Initialization mode */ + LL_RTC_DisableInitMode(RTCx); + + /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ + if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U) + { + status = LL_RTC_WaitForSynchro(RTCx); + } + else + { + status = SUCCESS; + } + } + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return status; +} + +/** + * @brief Set each @ref LL_RTC_TimeTypeDef field to default value (Time = 00h:00min:00sec). + * @param RTC_TimeStruct pointer to a @ref LL_RTC_TimeTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct) +{ + /* Time = 00h:00min:00sec */ + RTC_TimeStruct->TimeFormat = LL_RTC_TIME_FORMAT_AM_OR_24; + RTC_TimeStruct->Hours = 0U; + RTC_TimeStruct->Minutes = 0U; + RTC_TimeStruct->Seconds = 0U; +} + +/** + * @brief Set the RTC current date. + * @param RTCx RTC Instance + * @param RTC_Format This parameter can be one of the following values: + * @arg @ref LL_RTC_FORMAT_BIN + * @arg @ref LL_RTC_FORMAT_BCD + * @param RTC_DateStruct pointer to a RTC_DateTypeDef structure that contains + * the date configuration information for the RTC. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Day register is configured + * - ERROR: RTC Day register is not configured + */ +ErrorStatus LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_FORMAT(RTC_Format)); + + if ((RTC_Format == LL_RTC_FORMAT_BIN) && ((RTC_DateStruct->Month & 0x10U) == 0x10U)) + { + RTC_DateStruct->Month = (RTC_DateStruct->Month & (uint8_t)~(0x10U)) + 0x0AU; + } + if (RTC_Format == LL_RTC_FORMAT_BIN) + { + assert_param(IS_LL_RTC_YEAR(RTC_DateStruct->Year)); + assert_param(IS_LL_RTC_MONTH(RTC_DateStruct->Month)); + assert_param(IS_LL_RTC_DAY(RTC_DateStruct->Day)); + } + else + { + assert_param(IS_LL_RTC_YEAR(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Year))); + assert_param(IS_LL_RTC_MONTH(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Month))); + assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Day))); + } + assert_param(IS_LL_RTC_WEEKDAY(RTC_DateStruct->WeekDay)); + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Set Initialization mode */ + if (LL_RTC_EnterInitMode(RTCx) != ERROR) + { + /* Check the input parameters format */ + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, RTC_DateStruct->Day, RTC_DateStruct->Month, RTC_DateStruct->Year); + } + else + { + LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Day), + __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Month), __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Year)); + } + + /* Exit Initialization mode */ + LL_RTC_DisableInitMode(RTCx); + + /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ + if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U) + { + status = LL_RTC_WaitForSynchro(RTCx); + } + else + { + status = SUCCESS; + } + } + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return status; +} + +/** + * @brief Set each @ref LL_RTC_DateTypeDef field to default value (date = Monday, January 01 xx00) + * @param RTC_DateStruct pointer to a @ref LL_RTC_DateTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_DATE_StructInit(LL_RTC_DateTypeDef *RTC_DateStruct) +{ + /* Monday, January 01 xx00 */ + RTC_DateStruct->WeekDay = LL_RTC_WEEKDAY_MONDAY; + RTC_DateStruct->Day = 1U; + RTC_DateStruct->Month = LL_RTC_MONTH_JANUARY; + RTC_DateStruct->Year = 0U; +} + +/** + * @brief Set the RTC Alarm A. + * @note The Alarm register can only be written when the corresponding Alarm + * is disabled (Use @ref LL_RTC_ALMA_Disable function). + * @param RTCx RTC Instance + * @param RTC_Format This parameter can be one of the following values: + * @arg @ref LL_RTC_FORMAT_BIN + * @arg @ref LL_RTC_FORMAT_BCD + * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that + * contains the alarm configuration parameters. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ALARMA registers are configured + * - ERROR: ALARMA registers are not configured + */ +ErrorStatus LL_RTC_ALMA_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct) +{ + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_FORMAT(RTC_Format)); + assert_param(IS_LL_RTC_ALMA_MASK(RTC_AlarmStruct->AlarmMask)); + assert_param(IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel)); + + if (RTC_Format == LL_RTC_FORMAT_BIN) + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours)); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); + } + else + { + RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours)); + } + assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes)); + assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds)); + + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) + { + assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay)); + } + else + { + assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay)); + } + } + else + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); + } + else + { + RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); + } + + assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes))); + assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds))); + + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) + { + assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); + } + else + { + assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); + } + } + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Select weekday selection */ + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) + { + /* Set the date for ALARM */ + LL_RTC_ALMA_DisableWeekday(RTCx); + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_ALMA_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); + } + else + { + LL_RTC_ALMA_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay)); + } + } + else + { + /* Set the week day for ALARM */ + LL_RTC_ALMA_EnableWeekday(RTCx); + LL_RTC_ALMA_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); + } + + /* Configure the Alarm register */ + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours, + RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds); + } + else + { + LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours), + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes), + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds)); + } + /* Set ALARM mask */ + LL_RTC_ALMA_SetMask(RTCx, RTC_AlarmStruct->AlarmMask); + + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return SUCCESS; +} + +/** + * @brief Set the RTC Alarm B. + * @note The Alarm register can only be written when the corresponding Alarm + * is disabled (@ref LL_RTC_ALMB_Disable function). + * @param RTCx RTC Instance + * @param RTC_Format This parameter can be one of the following values: + * @arg @ref LL_RTC_FORMAT_BIN + * @arg @ref LL_RTC_FORMAT_BCD + * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that + * contains the alarm configuration parameters. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ALARMB registers are configured + * - ERROR: ALARMB registers are not configured + */ +ErrorStatus LL_RTC_ALMB_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct) +{ + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_FORMAT(RTC_Format)); + assert_param(IS_LL_RTC_ALMB_MASK(RTC_AlarmStruct->AlarmMask)); + assert_param(IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel)); + + if (RTC_Format == LL_RTC_FORMAT_BIN) + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours)); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); + } + else + { + RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours)); + } + assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes)); + assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds)); + + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) + { + assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay)); + } + else + { + assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay)); + } + } + else + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); + } + else + { + RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); + } + + assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes))); + assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds))); + + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) + { + assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); + } + else + { + assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); + } + } + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Select weekday selection */ + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) + { + /* Set the date for ALARM */ + LL_RTC_ALMB_DisableWeekday(RTCx); + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_ALMB_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); + } + else + { + LL_RTC_ALMB_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay)); + } + } + else + { + /* Set the week day for ALARM */ + LL_RTC_ALMB_EnableWeekday(RTCx); + LL_RTC_ALMB_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); + } + + /* Configure the Alarm register */ + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours, + RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds); + } + else + { + LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours), + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes), + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds)); + } + /* Set ALARM mask */ + LL_RTC_ALMB_SetMask(RTCx, RTC_AlarmStruct->AlarmMask); + + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return SUCCESS; +} + +/** + * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec / + * Day = 1st day of the month/Mask = all fields are masked). + * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_ALMA_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct) +{ + /* Alarm Time Settings : Time = 00h:00mn:00sec */ + RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMA_TIME_FORMAT_AM; + RTC_AlarmStruct->AlarmTime.Hours = 0U; + RTC_AlarmStruct->AlarmTime.Minutes = 0U; + RTC_AlarmStruct->AlarmTime.Seconds = 0U; + + /* Alarm Day Settings : Day = 1st day of the month */ + RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMA_DATEWEEKDAYSEL_DATE; + RTC_AlarmStruct->AlarmDateWeekDay = 1U; + + /* Alarm Masks Settings : Mask = all fields are not masked */ + RTC_AlarmStruct->AlarmMask = LL_RTC_ALMA_MASK_NONE; +} + +/** + * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec / + * Day = 1st day of the month/Mask = all fields are masked). + * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_ALMB_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct) +{ + /* Alarm Time Settings : Time = 00h:00mn:00sec */ + RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMB_TIME_FORMAT_AM; + RTC_AlarmStruct->AlarmTime.Hours = 0U; + RTC_AlarmStruct->AlarmTime.Minutes = 0U; + RTC_AlarmStruct->AlarmTime.Seconds = 0U; + + /* Alarm Day Settings : Day = 1st day of the month */ + RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMB_DATEWEEKDAYSEL_DATE; + RTC_AlarmStruct->AlarmDateWeekDay = 1U; + + /* Alarm Masks Settings : Mask = all fields are not masked */ + RTC_AlarmStruct->AlarmMask = LL_RTC_ALMB_MASK_NONE; +} + +/** + * @brief Enters the RTC Initialization mode. + * @note The RTC Initialization mode is write protected, use the + * @ref LL_RTC_DisableWriteProtection before calling this function. + * @param RTCx RTC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC is in Init mode + * - ERROR: RTC is not in Init mode + */ +ErrorStatus LL_RTC_EnterInitMode(RTC_TypeDef *RTCx) +{ + __IO uint32_t timeout = RTC_INITMODE_TIMEOUT; + ErrorStatus status = SUCCESS; + uint32_t tmp; + + /* Check the parameter */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + + /* Check if the Initialization mode is set */ + if (LL_RTC_IsActiveFlag_INIT(RTCx) == 0U) + { + /* Set the Initialization mode */ + LL_RTC_EnableInitMode(RTCx); + + /* Wait till RTC is in INIT state and if Time out is reached exit */ + tmp = LL_RTC_IsActiveFlag_INIT(RTCx); + while ((timeout != 0U) && (tmp != 1U)) + { + if (LL_SYSTICK_IsActiveCounterFlag() == 1U) + { + timeout --; + } + tmp = LL_RTC_IsActiveFlag_INIT(RTCx); + if (timeout == 0U) + { + status = ERROR; + } + } + } + return status; +} + +/** + * @brief Exit the RTC Initialization mode. + * @note When the initialization sequence is complete, the calendar restarts + * counting after 4 RTCCLK cycles. + * @note The RTC Initialization mode is write protected, use the + * @ref LL_RTC_DisableWriteProtection before calling this function. + * @param RTCx RTC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC exited from in Init mode + * - ERROR: Not applicable + */ +ErrorStatus LL_RTC_ExitInitMode(RTC_TypeDef *RTCx) +{ + /* Check the parameter */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + + /* Disable initialization mode */ + LL_RTC_DisableInitMode(RTCx); + + return SUCCESS; +} + +/** + * @brief Waits until the RTC Time and Day registers (RTC_TR and RTC_DR) are + * synchronized with RTC APB clock. + * @note The RTC Resynchronization mode is write protected, use the + * @ref LL_RTC_DisableWriteProtection before calling this function. + * @note To read the calendar through the shadow registers after Calendar + * initialization, calendar update or after wakeup from low power modes + * the software must first clear the RSF flag. + * The software must then wait until it is set again before reading + * the calendar, which means that the calendar registers have been + * correctly copied into the RTC_TR and RTC_DR shadow registers. + * @param RTCx RTC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC registers are synchronised + * - ERROR: RTC registers are not synchronised + */ +ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx) +{ + __IO uint32_t timeout = RTC_SYNCHRO_TIMEOUT; + ErrorStatus status = SUCCESS; + uint32_t tmp; + + /* Check the parameter */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + + /* Clear RSF flag */ + LL_RTC_ClearFlag_RS(RTCx); + + /* Wait the registers to be synchronised */ + tmp = LL_RTC_IsActiveFlag_RS(RTCx); + while ((timeout != 0U) && (tmp != 0U)) + { + if (LL_SYSTICK_IsActiveCounterFlag() == 1U) + { + timeout--; + } + tmp = LL_RTC_IsActiveFlag_RS(RTCx); + if (timeout == 0U) + { + status = ERROR; + } + } + + if (status != ERROR) + { + timeout = RTC_SYNCHRO_TIMEOUT; + tmp = LL_RTC_IsActiveFlag_RS(RTCx); + while ((timeout != 0U) && (tmp != 1U)) + { + if (LL_SYSTICK_IsActiveCounterFlag() == 1U) + { + timeout--; + } + tmp = LL_RTC_IsActiveFlag_RS(RTCx); + if (timeout == 0U) + { + status = ERROR; + } + } + } + + return (status); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RTC) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_spi.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_spi.c new file mode 100644 index 0000000..c1eb892 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_spi.c @@ -0,0 +1,547 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_spi.c + * @author MCD Application Team + * @brief SPI LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_spi.h" +#include "stm32g0xx_ll_bus.h" +#include "stm32g0xx_ll_rcc.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (SPI1) || defined (SPI2) || defined (SPI3) + +/** @addtogroup SPI_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup SPI_LL_Private_Constants SPI Private Constants + * @{ + */ +/* SPI registers Masks */ +#define SPI_CR1_CLEAR_MASK (SPI_CR1_CPHA | SPI_CR1_CPOL | SPI_CR1_MSTR | \ + SPI_CR1_BR | SPI_CR1_LSBFIRST | SPI_CR1_SSI | \ + SPI_CR1_SSM | SPI_CR1_RXONLY | SPI_CR1_CRCL | \ + SPI_CR1_CRCNEXT | SPI_CR1_CRCEN | SPI_CR1_BIDIOE | \ + SPI_CR1_BIDIMODE) +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup SPI_LL_Private_Macros SPI Private Macros + * @{ + */ +#define IS_LL_SPI_TRANSFER_DIRECTION(__VALUE__) (((__VALUE__) == LL_SPI_FULL_DUPLEX) \ + || ((__VALUE__) == LL_SPI_SIMPLEX_RX) \ + || ((__VALUE__) == LL_SPI_HALF_DUPLEX_RX) \ + || ((__VALUE__) == LL_SPI_HALF_DUPLEX_TX)) + +#define IS_LL_SPI_MODE(__VALUE__) (((__VALUE__) == LL_SPI_MODE_MASTER) \ + || ((__VALUE__) == LL_SPI_MODE_SLAVE)) + +#define IS_LL_SPI_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_SPI_DATAWIDTH_4BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_5BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_6BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_7BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_8BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_9BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_10BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_11BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_12BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_13BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_14BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_15BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_16BIT)) + +#define IS_LL_SPI_POLARITY(__VALUE__) (((__VALUE__) == LL_SPI_POLARITY_LOW) \ + || ((__VALUE__) == LL_SPI_POLARITY_HIGH)) + +#define IS_LL_SPI_PHASE(__VALUE__) (((__VALUE__) == LL_SPI_PHASE_1EDGE) \ + || ((__VALUE__) == LL_SPI_PHASE_2EDGE)) + +#define IS_LL_SPI_NSS(__VALUE__) (((__VALUE__) == LL_SPI_NSS_SOFT) \ + || ((__VALUE__) == LL_SPI_NSS_HARD_INPUT) \ + || ((__VALUE__) == LL_SPI_NSS_HARD_OUTPUT)) + +#define IS_LL_SPI_BAUDRATE(__VALUE__) (((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV2) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV4) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV8) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV16) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV32) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV64) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV128) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV256)) + +#define IS_LL_SPI_BITORDER(__VALUE__) (((__VALUE__) == LL_SPI_LSB_FIRST) \ + || ((__VALUE__) == LL_SPI_MSB_FIRST)) + +#define IS_LL_SPI_CRCCALCULATION(__VALUE__) (((__VALUE__) == LL_SPI_CRCCALCULATION_ENABLE) \ + || ((__VALUE__) == LL_SPI_CRCCALCULATION_DISABLE)) + +#define IS_LL_SPI_CRC_POLYNOMIAL(__VALUE__) ((__VALUE__) >= 0x1U) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup SPI_LL_Exported_Functions + * @{ + */ + +/** @addtogroup SPI_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the SPI registers to their default reset values. + * @param SPIx SPI Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: SPI registers are de-initialized + * - ERROR: SPI registers are not de-initialized + */ +ErrorStatus LL_SPI_DeInit(SPI_TypeDef *SPIx) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_SPI_ALL_INSTANCE(SPIx)); + +#if defined(SPI1) + if (SPIx == SPI1) + { + /* Force reset of SPI clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI1); + + /* Release reset of SPI clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI1); + + status = SUCCESS; + } +#endif /* SPI1 */ +#if defined(SPI2) + if (SPIx == SPI2) + { + /* Force reset of SPI clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI2); + + /* Release reset of SPI clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI2); + + status = SUCCESS; + } +#endif /* SPI2 */ +#if defined(SPI3) + if (SPIx == SPI3) + { + /* Force reset of SPI clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI3); + + /* Release reset of SPI clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI3); + + status = SUCCESS; + } +#endif /* SPI3 */ + + return status; +} + +/** + * @brief Initialize the SPI registers according to the specified parameters in SPI_InitStruct. + * @note As some bits in SPI configuration registers can only be written when the SPI is disabled (SPI_CR1_SPE bit =0), + * SPI peripheral should be in disabled state prior calling this function. Otherwise, ERROR result will be returned. + * @param SPIx SPI Instance + * @param SPI_InitStruct pointer to a @ref LL_SPI_InitTypeDef structure + * @retval An ErrorStatus enumeration value. (Return always SUCCESS) + */ +ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct) +{ + ErrorStatus status = ERROR; + + /* Check the SPI Instance SPIx*/ + assert_param(IS_SPI_ALL_INSTANCE(SPIx)); + + /* Check the SPI parameters from SPI_InitStruct*/ + assert_param(IS_LL_SPI_TRANSFER_DIRECTION(SPI_InitStruct->TransferDirection)); + assert_param(IS_LL_SPI_MODE(SPI_InitStruct->Mode)); + assert_param(IS_LL_SPI_DATAWIDTH(SPI_InitStruct->DataWidth)); + assert_param(IS_LL_SPI_POLARITY(SPI_InitStruct->ClockPolarity)); + assert_param(IS_LL_SPI_PHASE(SPI_InitStruct->ClockPhase)); + assert_param(IS_LL_SPI_NSS(SPI_InitStruct->NSS)); + assert_param(IS_LL_SPI_BAUDRATE(SPI_InitStruct->BaudRate)); + assert_param(IS_LL_SPI_BITORDER(SPI_InitStruct->BitOrder)); + assert_param(IS_LL_SPI_CRCCALCULATION(SPI_InitStruct->CRCCalculation)); + + if (LL_SPI_IsEnabled(SPIx) == 0x00000000U) + { + /*---------------------------- SPIx CR1 Configuration ------------------------ + * Configure SPIx CR1 with parameters: + * - TransferDirection: SPI_CR1_BIDIMODE, SPI_CR1_BIDIOE and SPI_CR1_RXONLY bits + * - Master/Slave Mode: SPI_CR1_MSTR bit + * - ClockPolarity: SPI_CR1_CPOL bit + * - ClockPhase: SPI_CR1_CPHA bit + * - NSS management: SPI_CR1_SSM bit + * - BaudRate prescaler: SPI_CR1_BR[2:0] bits + * - BitOrder: SPI_CR1_LSBFIRST bit + * - CRCCalculation: SPI_CR1_CRCEN bit + */ + MODIFY_REG(SPIx->CR1, + SPI_CR1_CLEAR_MASK, + SPI_InitStruct->TransferDirection | SPI_InitStruct->Mode | + SPI_InitStruct->ClockPolarity | SPI_InitStruct->ClockPhase | + SPI_InitStruct->NSS | SPI_InitStruct->BaudRate | + SPI_InitStruct->BitOrder | SPI_InitStruct->CRCCalculation); + + /*---------------------------- SPIx CR2 Configuration ------------------------ + * Configure SPIx CR2 with parameters: + * - DataWidth: DS[3:0] bits + * - NSS management: SSOE bit + */ + MODIFY_REG(SPIx->CR2, + SPI_CR2_DS | SPI_CR2_SSOE, + SPI_InitStruct->DataWidth | (SPI_InitStruct->NSS >> 16U)); + + /* Set Rx FIFO to Quarter (1 Byte) in case of 8 Bits mode. No DataPacking by default */ + if (SPI_InitStruct->DataWidth < LL_SPI_DATAWIDTH_9BIT) + { + LL_SPI_SetRxFIFOThreshold(SPIx, LL_SPI_RX_FIFO_TH_QUARTER); + } + + /*---------------------------- SPIx CRCPR Configuration ---------------------- + * Configure SPIx CRCPR with parameters: + * - CRCPoly: CRCPOLY[15:0] bits + */ + if (SPI_InitStruct->CRCCalculation == LL_SPI_CRCCALCULATION_ENABLE) + { + assert_param(IS_LL_SPI_CRC_POLYNOMIAL(SPI_InitStruct->CRCPoly)); + LL_SPI_SetCRCPolynomial(SPIx, SPI_InitStruct->CRCPoly); + } + status = SUCCESS; + } + +#if defined (SPI_I2S_SUPPORT) + /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ + CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD); +#endif /* SPI_I2S_SUPPORT */ + return status; +} + +/** + * @brief Set each @ref LL_SPI_InitTypeDef field to default value. + * @param SPI_InitStruct pointer to a @ref LL_SPI_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct) +{ + /* Set SPI_InitStruct fields to default values */ + SPI_InitStruct->TransferDirection = LL_SPI_FULL_DUPLEX; + SPI_InitStruct->Mode = LL_SPI_MODE_SLAVE; + SPI_InitStruct->DataWidth = LL_SPI_DATAWIDTH_8BIT; + SPI_InitStruct->ClockPolarity = LL_SPI_POLARITY_LOW; + SPI_InitStruct->ClockPhase = LL_SPI_PHASE_1EDGE; + SPI_InitStruct->NSS = LL_SPI_NSS_HARD_INPUT; + SPI_InitStruct->BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2; + SPI_InitStruct->BitOrder = LL_SPI_MSB_FIRST; + SPI_InitStruct->CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; + SPI_InitStruct->CRCPoly = 7U; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#if defined(SPI_I2S_SUPPORT) +/** @addtogroup I2S_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup I2S_LL_Private_Constants I2S Private Constants + * @{ + */ +/* I2S registers Masks */ +#define I2S_I2SCFGR_CLEAR_MASK (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | \ + SPI_I2SCFGR_CKPOL | SPI_I2SCFGR_I2SSTD | \ + SPI_I2SCFGR_I2SCFG | SPI_I2SCFGR_I2SMOD ) + +#define I2S_I2SPR_CLEAR_MASK 0x0002U +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup I2S_LL_Private_Macros I2S Private Macros + * @{ + */ + +#define IS_LL_I2S_DATAFORMAT(__VALUE__) (((__VALUE__) == LL_I2S_DATAFORMAT_16B) \ + || ((__VALUE__) == LL_I2S_DATAFORMAT_16B_EXTENDED) \ + || ((__VALUE__) == LL_I2S_DATAFORMAT_24B) \ + || ((__VALUE__) == LL_I2S_DATAFORMAT_32B)) + +#define IS_LL_I2S_CPOL(__VALUE__) (((__VALUE__) == LL_I2S_POLARITY_LOW) \ + || ((__VALUE__) == LL_I2S_POLARITY_HIGH)) + +#define IS_LL_I2S_STANDARD(__VALUE__) (((__VALUE__) == LL_I2S_STANDARD_PHILIPS) \ + || ((__VALUE__) == LL_I2S_STANDARD_MSB) \ + || ((__VALUE__) == LL_I2S_STANDARD_LSB) \ + || ((__VALUE__) == LL_I2S_STANDARD_PCM_SHORT) \ + || ((__VALUE__) == LL_I2S_STANDARD_PCM_LONG)) + +#define IS_LL_I2S_MODE(__VALUE__) (((__VALUE__) == LL_I2S_MODE_SLAVE_TX) \ + || ((__VALUE__) == LL_I2S_MODE_SLAVE_RX) \ + || ((__VALUE__) == LL_I2S_MODE_MASTER_TX) \ + || ((__VALUE__) == LL_I2S_MODE_MASTER_RX)) + +#define IS_LL_I2S_MCLK_OUTPUT(__VALUE__) (((__VALUE__) == LL_I2S_MCLK_OUTPUT_ENABLE) \ + || ((__VALUE__) == LL_I2S_MCLK_OUTPUT_DISABLE)) + +#define IS_LL_I2S_AUDIO_FREQ(__VALUE__) ((((__VALUE__) >= LL_I2S_AUDIOFREQ_8K) \ + && ((__VALUE__) <= LL_I2S_AUDIOFREQ_192K)) \ + || ((__VALUE__) == LL_I2S_AUDIOFREQ_DEFAULT)) + +#define IS_LL_I2S_PRESCALER_LINEAR(__VALUE__) ((__VALUE__) >= 0x2U) + +#define IS_LL_I2S_PRESCALER_PARITY(__VALUE__) (((__VALUE__) == LL_I2S_PRESCALER_PARITY_EVEN) \ + || ((__VALUE__) == LL_I2S_PRESCALER_PARITY_ODD)) +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup I2S_LL_Exported_Functions + * @{ + */ + +/** @addtogroup I2S_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the SPI/I2S registers to their default reset values. + * @param SPIx SPI Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: SPI registers are de-initialized + * - ERROR: SPI registers are not de-initialized + */ +ErrorStatus LL_I2S_DeInit(SPI_TypeDef *SPIx) +{ + return LL_SPI_DeInit(SPIx); +} + +/** + * @brief Initializes the SPI/I2S registers according to the specified parameters in I2S_InitStruct. + * @note As some bits in SPI configuration registers can only be written when the SPI is disabled (SPI_CR1_SPE bit =0), + * SPI peripheral should be in disabled state prior calling this function. Otherwise, ERROR result will be returned. + * @param SPIx SPI Instance + * @param I2S_InitStruct pointer to a @ref LL_I2S_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: SPI registers are Initialized + * - ERROR: SPI registers are not Initialized + */ +ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct) +{ + uint32_t i2sdiv = 2U; + uint32_t i2sodd = 0U; + uint32_t packetlength = 1U; + uint32_t tmp; + LL_RCC_ClocksTypeDef rcc_clocks; + uint32_t sourceclock; + ErrorStatus status = ERROR; + + /* Check the I2S parameters */ + assert_param(IS_I2S_ALL_INSTANCE(SPIx)); + assert_param(IS_LL_I2S_MODE(I2S_InitStruct->Mode)); + assert_param(IS_LL_I2S_STANDARD(I2S_InitStruct->Standard)); + assert_param(IS_LL_I2S_DATAFORMAT(I2S_InitStruct->DataFormat)); + assert_param(IS_LL_I2S_MCLK_OUTPUT(I2S_InitStruct->MCLKOutput)); + assert_param(IS_LL_I2S_AUDIO_FREQ(I2S_InitStruct->AudioFreq)); + assert_param(IS_LL_I2S_CPOL(I2S_InitStruct->ClockPolarity)); + + if (LL_I2S_IsEnabled(SPIx) == 0x00000000U) + { + /*---------------------------- SPIx I2SCFGR Configuration -------------------- + * Configure SPIx I2SCFGR with parameters: + * - Mode: SPI_I2SCFGR_I2SCFG[1:0] bit + * - Standard: SPI_I2SCFGR_I2SSTD[1:0] and SPI_I2SCFGR_PCMSYNC bits + * - DataFormat: SPI_I2SCFGR_CHLEN and SPI_I2SCFGR_DATLEN bits + * - ClockPolarity: SPI_I2SCFGR_CKPOL bit + */ + + /* Write to SPIx I2SCFGR */ + MODIFY_REG(SPIx->I2SCFGR, + I2S_I2SCFGR_CLEAR_MASK, + I2S_InitStruct->Mode | I2S_InitStruct->Standard | + I2S_InitStruct->DataFormat | I2S_InitStruct->ClockPolarity | + SPI_I2SCFGR_I2SMOD); + + /*---------------------------- SPIx I2SPR Configuration ---------------------- + * Configure SPIx I2SPR with parameters: + * - MCLKOutput: SPI_I2SPR_MCKOE bit + * - AudioFreq: SPI_I2SPR_I2SDIV[7:0] and SPI_I2SPR_ODD bits + */ + + /* If the requested audio frequency is not the default, compute the prescaler (i2sodd, i2sdiv) + * else, default values are used: i2sodd = 0U, i2sdiv = 2U. + */ + if (I2S_InitStruct->AudioFreq != LL_I2S_AUDIOFREQ_DEFAULT) + { + /* Check the frame length (For the Prescaler computing) + * Default value: LL_I2S_DATAFORMAT_16B (packetlength = 1U). + */ + if (I2S_InitStruct->DataFormat != LL_I2S_DATAFORMAT_16B) + { + /* Packet length is 32 bits */ + packetlength = 2U; + } + + /* I2S Clock source is System clock: Get System Clock frequency */ + LL_RCC_GetSystemClocksFreq(&rcc_clocks); + + /* Get the source clock value: based on System Clock value */ + sourceclock = rcc_clocks.SYSCLK_Frequency; + + /* Compute the Real divider depending on the MCLK output state with a floating point */ + if (I2S_InitStruct->MCLKOutput == LL_I2S_MCLK_OUTPUT_ENABLE) + { + /* MCLK output is enabled */ + tmp = (((((sourceclock / 256U) * 10U) / I2S_InitStruct->AudioFreq)) + 5U); + } + else + { + /* MCLK output is disabled */ + tmp = (((((sourceclock / (32U * packetlength)) * 10U) / I2S_InitStruct->AudioFreq)) + 5U); + } + + /* Remove the floating point */ + tmp = tmp / 10U; + + /* Check the parity of the divider */ + i2sodd = (tmp & (uint16_t)0x0001U); + + /* Compute the i2sdiv prescaler */ + i2sdiv = ((tmp - i2sodd) / 2U); + + /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ + i2sodd = (i2sodd << 8U); + } + + /* Test if the divider is 1 or 0 or greater than 0xFF */ + if ((i2sdiv < 2U) || (i2sdiv > 0xFFU)) + { + /* Set the default values */ + i2sdiv = 2U; + i2sodd = 0U; + } + + /* Write to SPIx I2SPR register the computed value */ + WRITE_REG(SPIx->I2SPR, i2sdiv | i2sodd | I2S_InitStruct->MCLKOutput); + + status = SUCCESS; + } + return status; +} + +/** + * @brief Set each @ref LL_I2S_InitTypeDef field to default value. + * @param I2S_InitStruct pointer to a @ref LL_I2S_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct) +{ + /*--------------- Reset I2S init structure parameters values -----------------*/ + I2S_InitStruct->Mode = LL_I2S_MODE_SLAVE_TX; + I2S_InitStruct->Standard = LL_I2S_STANDARD_PHILIPS; + I2S_InitStruct->DataFormat = LL_I2S_DATAFORMAT_16B; + I2S_InitStruct->MCLKOutput = LL_I2S_MCLK_OUTPUT_DISABLE; + I2S_InitStruct->AudioFreq = LL_I2S_AUDIOFREQ_DEFAULT; + I2S_InitStruct->ClockPolarity = LL_I2S_POLARITY_LOW; +} + +/** + * @brief Set linear and parity prescaler. + * @note To calculate value of PrescalerLinear(I2SDIV[7:0] bits) and PrescalerParity(ODD bit)\n + * Check Audio frequency table and formulas inside Reference Manual (SPI/I2S). + * @param SPIx SPI Instance + * @param PrescalerLinear value Min_Data=0x02 and Max_Data=0xFF. + * @param PrescalerParity This parameter can be one of the following values: + * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN + * @arg @ref LL_I2S_PRESCALER_PARITY_ODD + * @retval None + */ +void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity) +{ + /* Check the I2S parameters */ + assert_param(IS_I2S_ALL_INSTANCE(SPIx)); + assert_param(IS_LL_I2S_PRESCALER_LINEAR(PrescalerLinear)); + assert_param(IS_LL_I2S_PRESCALER_PARITY(PrescalerParity)); + + /* Write to SPIx I2SPR */ + MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV | SPI_I2SPR_ODD, PrescalerLinear | (PrescalerParity << 8U)); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* SPI_I2S_SUPPORT */ + +#endif /* defined (SPI1) || defined (SPI2) || defined (SPI3) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_tim.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_tim.c new file mode 100644 index 0000000..e5a8732 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_tim.c @@ -0,0 +1,1369 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_tim.c + * @author MCD Application Team + * @brief TIM LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_tim.h" +#include "stm32g0xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (TIM1) || defined (TIM2) || defined (TIM3) || defined (TIM4) || defined (TIM14) || defined (TIM15) || defined (TIM16) || defined (TIM17) || defined (TIM6) || defined (TIM7) + +/** @addtogroup TIM_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup TIM_LL_Private_Macros + * @{ + */ +#define IS_LL_TIM_COUNTERMODE(__VALUE__) (((__VALUE__) == LL_TIM_COUNTERMODE_UP) \ + || ((__VALUE__) == LL_TIM_COUNTERMODE_DOWN) \ + || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_UP) \ + || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_DOWN) \ + || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_UP_DOWN)) + +#define IS_LL_TIM_CLOCKDIVISION(__VALUE__) (((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV1) \ + || ((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV2) \ + || ((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV4)) + +#define IS_LL_TIM_OCMODE(__VALUE__) (((__VALUE__) == LL_TIM_OCMODE_FROZEN) \ + || ((__VALUE__) == LL_TIM_OCMODE_ACTIVE) \ + || ((__VALUE__) == LL_TIM_OCMODE_INACTIVE) \ + || ((__VALUE__) == LL_TIM_OCMODE_TOGGLE) \ + || ((__VALUE__) == LL_TIM_OCMODE_FORCED_INACTIVE) \ + || ((__VALUE__) == LL_TIM_OCMODE_FORCED_ACTIVE) \ + || ((__VALUE__) == LL_TIM_OCMODE_PWM1) \ + || ((__VALUE__) == LL_TIM_OCMODE_PWM2) \ + || ((__VALUE__) == LL_TIM_OCMODE_RETRIG_OPM1) \ + || ((__VALUE__) == LL_TIM_OCMODE_RETRIG_OPM2) \ + || ((__VALUE__) == LL_TIM_OCMODE_COMBINED_PWM1) \ + || ((__VALUE__) == LL_TIM_OCMODE_COMBINED_PWM2) \ + || ((__VALUE__) == LL_TIM_OCMODE_ASSYMETRIC_PWM1) \ + || ((__VALUE__) == LL_TIM_OCMODE_ASSYMETRIC_PWM2)) + +#define IS_LL_TIM_OCSTATE(__VALUE__) (((__VALUE__) == LL_TIM_OCSTATE_DISABLE) \ + || ((__VALUE__) == LL_TIM_OCSTATE_ENABLE)) + +#define IS_LL_TIM_OCPOLARITY(__VALUE__) (((__VALUE__) == LL_TIM_OCPOLARITY_HIGH) \ + || ((__VALUE__) == LL_TIM_OCPOLARITY_LOW)) + +#define IS_LL_TIM_OCIDLESTATE(__VALUE__) (((__VALUE__) == LL_TIM_OCIDLESTATE_LOW) \ + || ((__VALUE__) == LL_TIM_OCIDLESTATE_HIGH)) + +#define IS_LL_TIM_ACTIVEINPUT(__VALUE__) (((__VALUE__) == LL_TIM_ACTIVEINPUT_DIRECTTI) \ + || ((__VALUE__) == LL_TIM_ACTIVEINPUT_INDIRECTTI) \ + || ((__VALUE__) == LL_TIM_ACTIVEINPUT_TRC)) + +#define IS_LL_TIM_ICPSC(__VALUE__) (((__VALUE__) == LL_TIM_ICPSC_DIV1) \ + || ((__VALUE__) == LL_TIM_ICPSC_DIV2) \ + || ((__VALUE__) == LL_TIM_ICPSC_DIV4) \ + || ((__VALUE__) == LL_TIM_ICPSC_DIV8)) + +#define IS_LL_TIM_IC_FILTER(__VALUE__) (((__VALUE__) == LL_TIM_IC_FILTER_FDIV1) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N2) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N4) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV2_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV2_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV4_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV4_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV8_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV8_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N5) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N5) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N8)) + +#define IS_LL_TIM_IC_POLARITY(__VALUE__) (((__VALUE__) == LL_TIM_IC_POLARITY_RISING) \ + || ((__VALUE__) == LL_TIM_IC_POLARITY_FALLING) \ + || ((__VALUE__) == LL_TIM_IC_POLARITY_BOTHEDGE)) + +#define IS_LL_TIM_ENCODERMODE(__VALUE__) (((__VALUE__) == LL_TIM_ENCODERMODE_X2_TI1) \ + || ((__VALUE__) == LL_TIM_ENCODERMODE_X2_TI2) \ + || ((__VALUE__) == LL_TIM_ENCODERMODE_X4_TI12)) + +#define IS_LL_TIM_IC_POLARITY_ENCODER(__VALUE__) (((__VALUE__) == LL_TIM_IC_POLARITY_RISING) \ + || ((__VALUE__) == LL_TIM_IC_POLARITY_FALLING)) + +#define IS_LL_TIM_OSSR_STATE(__VALUE__) (((__VALUE__) == LL_TIM_OSSR_DISABLE) \ + || ((__VALUE__) == LL_TIM_OSSR_ENABLE)) + +#define IS_LL_TIM_OSSI_STATE(__VALUE__) (((__VALUE__) == LL_TIM_OSSI_DISABLE) \ + || ((__VALUE__) == LL_TIM_OSSI_ENABLE)) + +#define IS_LL_TIM_LOCK_LEVEL(__VALUE__) (((__VALUE__) == LL_TIM_LOCKLEVEL_OFF) \ + || ((__VALUE__) == LL_TIM_LOCKLEVEL_1) \ + || ((__VALUE__) == LL_TIM_LOCKLEVEL_2) \ + || ((__VALUE__) == LL_TIM_LOCKLEVEL_3)) + +#define IS_LL_TIM_BREAK_STATE(__VALUE__) (((__VALUE__) == LL_TIM_BREAK_DISABLE) \ + || ((__VALUE__) == LL_TIM_BREAK_ENABLE)) + +#define IS_LL_TIM_BREAK_POLARITY(__VALUE__) (((__VALUE__) == LL_TIM_BREAK_POLARITY_LOW) \ + || ((__VALUE__) == LL_TIM_BREAK_POLARITY_HIGH)) + +#define IS_LL_TIM_BREAK_FILTER(__VALUE__) (((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV1) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV1_N2) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV1_N4) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV1_N8) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV2_N6) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV2_N8) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV4_N6) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV4_N8) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV8_N6) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV8_N8) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV16_N5) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV16_N6) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV16_N8) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV32_N5) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV32_N6) \ + || ((__VALUE__) == LL_TIM_BREAK_FILTER_FDIV32_N8)) + +#define IS_LL_TIM_BREAK_AFMODE(__VALUE__) (((__VALUE__) == LL_TIM_BREAK_AFMODE_INPUT) \ + || ((__VALUE__) == LL_TIM_BREAK_AFMODE_BIDIRECTIONAL)) + +#define IS_LL_TIM_BREAK2_STATE(__VALUE__) (((__VALUE__) == LL_TIM_BREAK2_DISABLE) \ + || ((__VALUE__) == LL_TIM_BREAK2_ENABLE)) + +#define IS_LL_TIM_BREAK2_POLARITY(__VALUE__) (((__VALUE__) == LL_TIM_BREAK2_POLARITY_LOW) \ + || ((__VALUE__) == LL_TIM_BREAK2_POLARITY_HIGH)) + +#define IS_LL_TIM_BREAK2_FILTER(__VALUE__) (((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV1) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV1_N2) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV1_N4) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV1_N8) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV2_N6) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV2_N8) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV4_N6) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV4_N8) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV8_N6) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV8_N8) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV16_N5) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV16_N6) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV16_N8) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV32_N5) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV32_N6) \ + || ((__VALUE__) == LL_TIM_BREAK2_FILTER_FDIV32_N8)) + +#define IS_LL_TIM_BREAK2_AFMODE(__VALUE__) (((__VALUE__) == LL_TIM_BREAK2_AFMODE_INPUT) \ + || ((__VALUE__) == LL_TIM_BREAK2_AFMODE_BIDIRECTIONAL)) + +#define IS_LL_TIM_AUTOMATIC_OUTPUT_STATE(__VALUE__) (((__VALUE__) == LL_TIM_AUTOMATICOUTPUT_DISABLE) \ + || ((__VALUE__) == LL_TIM_AUTOMATICOUTPUT_ENABLE)) +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup TIM_LL_Private_Functions TIM Private Functions + * @{ + */ +static ErrorStatus OC1Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus OC2Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus OC3Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus OC4Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus OC5Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus OC6Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus IC1Config(TIM_TypeDef *TIMx, const LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +static ErrorStatus IC2Config(TIM_TypeDef *TIMx, const LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +static ErrorStatus IC3Config(TIM_TypeDef *TIMx, const LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +static ErrorStatus IC4Config(TIM_TypeDef *TIMx, const LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_LL_Exported_Functions + * @{ + */ + +/** @addtogroup TIM_LL_EF_Init + * @{ + */ + +/** + * @brief Set TIMx registers to their reset values. + * @param TIMx Timer instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: invalid TIMx instance + */ +ErrorStatus LL_TIM_DeInit(TIM_TypeDef *TIMx) +{ + ErrorStatus result = SUCCESS; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(TIMx)); + + if (TIMx == TIM1) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM1); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM1); + } +#if defined(TIM2) + else if (TIMx == TIM2) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM2); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM2); + } +#endif /* TIM2 */ +#if defined(TIM3) + else if (TIMx == TIM3) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM3); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM3); + } +#endif /* TIM3 */ +#if defined(TIM4) + else if (TIMx == TIM4) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM4); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM4); + } +#endif /* TIM4 */ +#if defined(TIM6) + else if (TIMx == TIM6) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM6); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM6); + } +#endif /* TIM6 */ +#if defined(TIM7) + else if (TIMx == TIM7) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM7); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM7); + } +#endif /* TIM7 */ + else if (TIMx == TIM14) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM14); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM14); + } +#if defined(TIM15) + else if (TIMx == TIM15) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM15); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM15); + } +#endif /* TIM15 */ + else if (TIMx == TIM16) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM16); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM16); + } +#if defined(TIM17) + else if (TIMx == TIM17) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM17); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM17); + } +#endif /* TIM17 */ + else + { + result = ERROR; + } + + return result; +} + +/** + * @brief Set the fields of the time base unit configuration data structure + * to their default values. + * @param TIM_InitStruct pointer to a @ref LL_TIM_InitTypeDef structure (time base unit configuration data structure) + * @retval None + */ +void LL_TIM_StructInit(LL_TIM_InitTypeDef *TIM_InitStruct) +{ + /* Set the default configuration */ + TIM_InitStruct->Prescaler = (uint16_t)0x0000; + TIM_InitStruct->CounterMode = LL_TIM_COUNTERMODE_UP; + TIM_InitStruct->Autoreload = 0xFFFFFFFFU; + TIM_InitStruct->ClockDivision = LL_TIM_CLOCKDIVISION_DIV1; + TIM_InitStruct->RepetitionCounter = 0x00000000U; +} + +/** + * @brief Configure the TIMx time base unit. + * @param TIMx Timer Instance + * @param TIM_InitStruct pointer to a @ref LL_TIM_InitTypeDef structure + * (TIMx time base unit configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_TIM_Init(TIM_TypeDef *TIMx, const LL_TIM_InitTypeDef *TIM_InitStruct) +{ + uint32_t tmpcr1; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_COUNTERMODE(TIM_InitStruct->CounterMode)); + assert_param(IS_LL_TIM_CLOCKDIVISION(TIM_InitStruct->ClockDivision)); + + tmpcr1 = LL_TIM_ReadReg(TIMx, CR1); + + if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) + { + /* Select the Counter Mode */ + MODIFY_REG(tmpcr1, (TIM_CR1_DIR | TIM_CR1_CMS), TIM_InitStruct->CounterMode); + } + + if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) + { + /* Set the clock division */ + MODIFY_REG(tmpcr1, TIM_CR1_CKD, TIM_InitStruct->ClockDivision); + } + + /* Write to TIMx CR1 */ + LL_TIM_WriteReg(TIMx, CR1, tmpcr1); + + /* Set the Autoreload value */ + LL_TIM_SetAutoReload(TIMx, TIM_InitStruct->Autoreload); + + /* Set the Prescaler value */ + LL_TIM_SetPrescaler(TIMx, TIM_InitStruct->Prescaler); + + if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) + { + /* Set the Repetition Counter value */ + LL_TIM_SetRepetitionCounter(TIMx, TIM_InitStruct->RepetitionCounter); + } + + /* Generate an update event to reload the Prescaler + and the repetition counter value (if applicable) immediately */ + LL_TIM_GenerateEvent_UPDATE(TIMx); + + return SUCCESS; +} + +/** + * @brief Set the fields of the TIMx output channel configuration data + * structure to their default values. + * @param TIM_OC_InitStruct pointer to a @ref LL_TIM_OC_InitTypeDef structure + * (the output channel configuration data structure) + * @retval None + */ +void LL_TIM_OC_StructInit(LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct) +{ + /* Set the default configuration */ + TIM_OC_InitStruct->OCMode = LL_TIM_OCMODE_FROZEN; + TIM_OC_InitStruct->OCState = LL_TIM_OCSTATE_DISABLE; + TIM_OC_InitStruct->OCNState = LL_TIM_OCSTATE_DISABLE; + TIM_OC_InitStruct->CompareValue = 0x00000000U; + TIM_OC_InitStruct->OCPolarity = LL_TIM_OCPOLARITY_HIGH; + TIM_OC_InitStruct->OCNPolarity = LL_TIM_OCPOLARITY_HIGH; + TIM_OC_InitStruct->OCIdleState = LL_TIM_OCIDLESTATE_LOW; + TIM_OC_InitStruct->OCNIdleState = LL_TIM_OCIDLESTATE_LOW; +} + +/** + * @brief Configure the TIMx output channel. + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @arg @ref LL_TIM_CHANNEL_CH5 + * @arg @ref LL_TIM_CHANNEL_CH6 + * @param TIM_OC_InitStruct pointer to a @ref LL_TIM_OC_InitTypeDef structure (TIMx output channel configuration + * data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx output channel is initialized + * - ERROR: TIMx output channel is not initialized + */ +ErrorStatus LL_TIM_OC_Init(TIM_TypeDef *TIMx, uint32_t Channel, const LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct) +{ + ErrorStatus result = ERROR; + + switch (Channel) + { + case LL_TIM_CHANNEL_CH1: + result = OC1Config(TIMx, TIM_OC_InitStruct); + break; + case LL_TIM_CHANNEL_CH2: + result = OC2Config(TIMx, TIM_OC_InitStruct); + break; + case LL_TIM_CHANNEL_CH3: + result = OC3Config(TIMx, TIM_OC_InitStruct); + break; + case LL_TIM_CHANNEL_CH4: + result = OC4Config(TIMx, TIM_OC_InitStruct); + break; + case LL_TIM_CHANNEL_CH5: + result = OC5Config(TIMx, TIM_OC_InitStruct); + break; + case LL_TIM_CHANNEL_CH6: + result = OC6Config(TIMx, TIM_OC_InitStruct); + break; + default: + break; + } + + return result; +} + +/** + * @brief Set the fields of the TIMx input channel configuration data + * structure to their default values. + * @param TIM_ICInitStruct pointer to a @ref LL_TIM_IC_InitTypeDef structure (the input channel configuration + * data structure) + * @retval None + */ +void LL_TIM_IC_StructInit(LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Set the default configuration */ + TIM_ICInitStruct->ICPolarity = LL_TIM_IC_POLARITY_RISING; + TIM_ICInitStruct->ICActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; + TIM_ICInitStruct->ICPrescaler = LL_TIM_ICPSC_DIV1; + TIM_ICInitStruct->ICFilter = LL_TIM_IC_FILTER_FDIV1; +} + +/** + * @brief Configure the TIMx input channel. + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param TIM_IC_InitStruct pointer to a @ref LL_TIM_IC_InitTypeDef structure (TIMx input channel configuration data + * structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx output channel is initialized + * - ERROR: TIMx output channel is not initialized + */ +ErrorStatus LL_TIM_IC_Init(TIM_TypeDef *TIMx, uint32_t Channel, const LL_TIM_IC_InitTypeDef *TIM_IC_InitStruct) +{ + ErrorStatus result = ERROR; + + switch (Channel) + { + case LL_TIM_CHANNEL_CH1: + result = IC1Config(TIMx, TIM_IC_InitStruct); + break; + case LL_TIM_CHANNEL_CH2: + result = IC2Config(TIMx, TIM_IC_InitStruct); + break; + case LL_TIM_CHANNEL_CH3: + result = IC3Config(TIMx, TIM_IC_InitStruct); + break; + case LL_TIM_CHANNEL_CH4: + result = IC4Config(TIMx, TIM_IC_InitStruct); + break; + default: + break; + } + + return result; +} + +/** + * @brief Fills each TIM_EncoderInitStruct field with its default value + * @param TIM_EncoderInitStruct pointer to a @ref LL_TIM_ENCODER_InitTypeDef structure (encoder interface + * configuration data structure) + * @retval None + */ +void LL_TIM_ENCODER_StructInit(LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct) +{ + /* Set the default configuration */ + TIM_EncoderInitStruct->EncoderMode = LL_TIM_ENCODERMODE_X2_TI1; + TIM_EncoderInitStruct->IC1Polarity = LL_TIM_IC_POLARITY_RISING; + TIM_EncoderInitStruct->IC1ActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; + TIM_EncoderInitStruct->IC1Prescaler = LL_TIM_ICPSC_DIV1; + TIM_EncoderInitStruct->IC1Filter = LL_TIM_IC_FILTER_FDIV1; + TIM_EncoderInitStruct->IC2Polarity = LL_TIM_IC_POLARITY_RISING; + TIM_EncoderInitStruct->IC2ActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; + TIM_EncoderInitStruct->IC2Prescaler = LL_TIM_ICPSC_DIV1; + TIM_EncoderInitStruct->IC2Filter = LL_TIM_IC_FILTER_FDIV1; +} + +/** + * @brief Configure the encoder interface of the timer instance. + * @param TIMx Timer Instance + * @param TIM_EncoderInitStruct pointer to a @ref LL_TIM_ENCODER_InitTypeDef structure (TIMx encoder interface + * configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_TIM_ENCODER_Init(TIM_TypeDef *TIMx, const LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_ENCODERMODE(TIM_EncoderInitStruct->EncoderMode)); + assert_param(IS_LL_TIM_IC_POLARITY_ENCODER(TIM_EncoderInitStruct->IC1Polarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_EncoderInitStruct->IC1ActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_EncoderInitStruct->IC1Prescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_EncoderInitStruct->IC1Filter)); + assert_param(IS_LL_TIM_IC_POLARITY_ENCODER(TIM_EncoderInitStruct->IC2Polarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_EncoderInitStruct->IC2ActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_EncoderInitStruct->IC2Prescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_EncoderInitStruct->IC2Filter)); + + /* Disable the CC1 and CC2: Reset the CC1E and CC2E Bits */ + TIMx->CCER &= (uint32_t)~(TIM_CCER_CC1E | TIM_CCER_CC2E); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Configure TI1 */ + tmpccmr1 &= (uint32_t)~(TIM_CCMR1_CC1S | TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1ActiveInput >> 16U); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1Filter >> 16U); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1Prescaler >> 16U); + + /* Configure TI2 */ + tmpccmr1 &= (uint32_t)~(TIM_CCMR1_CC2S | TIM_CCMR1_IC2F | TIM_CCMR1_IC2PSC); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2ActiveInput >> 8U); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2Filter >> 8U); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2Prescaler >> 8U); + + /* Set TI1 and TI2 polarity and enable TI1 and TI2 */ + tmpccer &= (uint32_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP | TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= (uint32_t)(TIM_EncoderInitStruct->IC1Polarity); + tmpccer |= (uint32_t)(TIM_EncoderInitStruct->IC2Polarity << 4U); + tmpccer |= (uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E); + + /* Set encoder mode */ + LL_TIM_SetEncoderMode(TIMx, TIM_EncoderInitStruct->EncoderMode); + + /* Write to TIMx CCMR1 */ + LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Set the fields of the TIMx Hall sensor interface configuration data + * structure to their default values. + * @param TIM_HallSensorInitStruct pointer to a @ref LL_TIM_HALLSENSOR_InitTypeDef structure (HALL sensor interface + * configuration data structure) + * @retval None + */ +void LL_TIM_HALLSENSOR_StructInit(LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct) +{ + /* Set the default configuration */ + TIM_HallSensorInitStruct->IC1Polarity = LL_TIM_IC_POLARITY_RISING; + TIM_HallSensorInitStruct->IC1Prescaler = LL_TIM_ICPSC_DIV1; + TIM_HallSensorInitStruct->IC1Filter = LL_TIM_IC_FILTER_FDIV1; + TIM_HallSensorInitStruct->CommutationDelay = 0U; +} + +/** + * @brief Configure the Hall sensor interface of the timer instance. + * @note TIMx CH1, CH2 and CH3 inputs connected through a XOR + * to the TI1 input channel + * @note TIMx slave mode controller is configured in reset mode. + Selected internal trigger is TI1F_ED. + * @note Channel 1 is configured as input, IC1 is mapped on TRC. + * @note Captured value stored in TIMx_CCR1 correspond to the time elapsed + * between 2 changes on the inputs. It gives information about motor speed. + * @note Channel 2 is configured in output PWM 2 mode. + * @note Compare value stored in TIMx_CCR2 corresponds to the commutation delay. + * @note OC2REF is selected as trigger output on TRGO. + * @note LL_TIM_IC_POLARITY_BOTHEDGE must not be used for TI1 when it is used + * when TIMx operates in Hall sensor interface mode. + * @param TIMx Timer Instance + * @param TIM_HallSensorInitStruct pointer to a @ref LL_TIM_HALLSENSOR_InitTypeDef structure (TIMx HALL sensor + * interface configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_TIM_HALLSENSOR_Init(TIM_TypeDef *TIMx, const LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct) +{ + uint32_t tmpcr2; + uint32_t tmpccmr1; + uint32_t tmpccer; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY_ENCODER(TIM_HallSensorInitStruct->IC1Polarity)); + assert_param(IS_LL_TIM_ICPSC(TIM_HallSensorInitStruct->IC1Prescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_HallSensorInitStruct->IC1Filter)); + + /* Disable the CC1 and CC2: Reset the CC1E and CC2E Bits */ + TIMx->CCER &= (uint32_t)~(TIM_CCER_CC1E | TIM_CCER_CC2E); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx SMCR register value */ + tmpsmcr = LL_TIM_ReadReg(TIMx, SMCR); + + /* Connect TIMx_CH1, CH2 and CH3 pins to the TI1 input */ + tmpcr2 |= TIM_CR2_TI1S; + + /* OC2REF signal is used as trigger output (TRGO) */ + tmpcr2 |= LL_TIM_TRGO_OC2REF; + + /* Configure the slave mode controller */ + tmpsmcr &= (uint32_t)~(TIM_SMCR_TS | TIM_SMCR_SMS); + tmpsmcr |= LL_TIM_TS_TI1F_ED; + tmpsmcr |= LL_TIM_SLAVEMODE_RESET; + + /* Configure input channel 1 */ + tmpccmr1 &= (uint32_t)~(TIM_CCMR1_CC1S | TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC); + tmpccmr1 |= (uint32_t)(LL_TIM_ACTIVEINPUT_TRC >> 16U); + tmpccmr1 |= (uint32_t)(TIM_HallSensorInitStruct->IC1Filter >> 16U); + tmpccmr1 |= (uint32_t)(TIM_HallSensorInitStruct->IC1Prescaler >> 16U); + + /* Configure input channel 2 */ + tmpccmr1 &= (uint32_t)~(TIM_CCMR1_OC2M | TIM_CCMR1_OC2FE | TIM_CCMR1_OC2PE | TIM_CCMR1_OC2CE); + tmpccmr1 |= (uint32_t)(LL_TIM_OCMODE_PWM2 << 8U); + + /* Set Channel 1 polarity and enable Channel 1 and Channel2 */ + tmpccer &= (uint32_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP | TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= (uint32_t)(TIM_HallSensorInitStruct->IC1Polarity); + tmpccer |= (uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E); + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx SMCR */ + LL_TIM_WriteReg(TIMx, SMCR, tmpsmcr); + + /* Write to TIMx CCMR1 */ + LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + /* Write to TIMx CCR2 */ + LL_TIM_OC_SetCompareCH2(TIMx, TIM_HallSensorInitStruct->CommutationDelay); + + return SUCCESS; +} + +/** + * @brief Set the fields of the Break and Dead Time configuration data structure + * to their default values. + * @param TIM_BDTRInitStruct pointer to a @ref LL_TIM_BDTR_InitTypeDef structure (Break and Dead Time configuration + * data structure) + * @retval None + */ +void LL_TIM_BDTR_StructInit(LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct) +{ + /* Set the default configuration */ + TIM_BDTRInitStruct->OSSRState = LL_TIM_OSSR_DISABLE; + TIM_BDTRInitStruct->OSSIState = LL_TIM_OSSI_DISABLE; + TIM_BDTRInitStruct->LockLevel = LL_TIM_LOCKLEVEL_OFF; + TIM_BDTRInitStruct->DeadTime = (uint8_t)0x00; + TIM_BDTRInitStruct->BreakState = LL_TIM_BREAK_DISABLE; + TIM_BDTRInitStruct->BreakPolarity = LL_TIM_BREAK_POLARITY_LOW; + TIM_BDTRInitStruct->BreakFilter = LL_TIM_BREAK_FILTER_FDIV1; + TIM_BDTRInitStruct->BreakAFMode = LL_TIM_BREAK_AFMODE_INPUT; + TIM_BDTRInitStruct->Break2State = LL_TIM_BREAK2_DISABLE; + TIM_BDTRInitStruct->Break2Polarity = LL_TIM_BREAK2_POLARITY_LOW; + TIM_BDTRInitStruct->Break2Filter = LL_TIM_BREAK2_FILTER_FDIV1; + TIM_BDTRInitStruct->Break2AFMode = LL_TIM_BREAK2_AFMODE_INPUT; + TIM_BDTRInitStruct->AutomaticOutput = LL_TIM_AUTOMATICOUTPUT_DISABLE; +} + +/** + * @brief Configure the Break and Dead Time feature of the timer instance. + * @note As the bits BK2P, BK2E, BK2F[3:0], BKF[3:0], AOE, BKP, BKE, OSSI, OSSR + * and DTG[7:0] can be write-locked depending on the LOCK configuration, it + * can be necessary to configure all of them during the first write access to + * the TIMx_BDTR register. + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @note Macro IS_TIM_BKIN2_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a second break input. + * @param TIMx Timer Instance + * @param TIM_BDTRInitStruct pointer to a @ref LL_TIM_BDTR_InitTypeDef structure (Break and Dead Time configuration + * data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Break and Dead Time is initialized + * - ERROR: not applicable + */ +ErrorStatus LL_TIM_BDTR_Init(TIM_TypeDef *TIMx, const LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct) +{ + uint32_t tmpbdtr = 0; + + /* Check the parameters */ + assert_param(IS_TIM_BREAK_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OSSR_STATE(TIM_BDTRInitStruct->OSSRState)); + assert_param(IS_LL_TIM_OSSI_STATE(TIM_BDTRInitStruct->OSSIState)); + assert_param(IS_LL_TIM_LOCK_LEVEL(TIM_BDTRInitStruct->LockLevel)); + assert_param(IS_LL_TIM_BREAK_STATE(TIM_BDTRInitStruct->BreakState)); + assert_param(IS_LL_TIM_BREAK_POLARITY(TIM_BDTRInitStruct->BreakPolarity)); + assert_param(IS_LL_TIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTRInitStruct->AutomaticOutput)); + + /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, + the OSSI State, the dead time value and the Automatic Output Enable Bit */ + + /* Set the BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, TIM_BDTRInitStruct->DeadTime); + MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, TIM_BDTRInitStruct->LockLevel); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, TIM_BDTRInitStruct->OSSIState); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, TIM_BDTRInitStruct->OSSRState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, TIM_BDTRInitStruct->BreakState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, TIM_BDTRInitStruct->BreakPolarity); + MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, TIM_BDTRInitStruct->AutomaticOutput); + MODIFY_REG(tmpbdtr, TIM_BDTR_MOE, TIM_BDTRInitStruct->AutomaticOutput); + if (IS_TIM_ADVANCED_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_BREAK_FILTER(TIM_BDTRInitStruct->BreakFilter)); + assert_param(IS_LL_TIM_BREAK_AFMODE(TIM_BDTRInitStruct->BreakAFMode)); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKF, TIM_BDTRInitStruct->BreakFilter); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKBID, TIM_BDTRInitStruct->BreakAFMode); + } + + if (IS_TIM_BKIN2_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_BREAK2_STATE(TIM_BDTRInitStruct->Break2State)); + assert_param(IS_LL_TIM_BREAK2_POLARITY(TIM_BDTRInitStruct->Break2Polarity)); + assert_param(IS_LL_TIM_BREAK2_FILTER(TIM_BDTRInitStruct->Break2Filter)); + assert_param(IS_LL_TIM_BREAK2_AFMODE(TIM_BDTRInitStruct->Break2AFMode)); + + /* Set the BREAK2 input related BDTR bit-fields */ + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2F, (TIM_BDTRInitStruct->Break2Filter)); + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2E, TIM_BDTRInitStruct->Break2State); + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2P, TIM_BDTRInitStruct->Break2Polarity); + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2BID, TIM_BDTRInitStruct->Break2AFMode); + } + + /* Set TIMx_BDTR */ + LL_TIM_WriteReg(TIMx, BDTR, tmpbdtr); + + return SUCCESS; +} +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup TIM_LL_Private_Functions TIM Private Functions + * @brief Private functions + * @{ + */ +/** + * @brief Configure the TIMx output channel 1. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 1 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC1Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + + /* Disable the Channel 1: Reset the CC1E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC1E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); + + /* Reset Capture/Compare selection Bits */ + CLEAR_BIT(tmpccmr1, TIM_CCMR1_CC1S); + + /* Set the Output Compare Mode */ + MODIFY_REG(tmpccmr1, TIM_CCMR1_OC1M, TIM_OCInitStruct->OCMode); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC1P, TIM_OCInitStruct->OCPolarity); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC1E, TIM_OCInitStruct->OCState); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the complementary output Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC1NP, TIM_OCInitStruct->OCNPolarity << 2U); + + /* Set the complementary output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC1NE, TIM_OCInitStruct->OCNState << 2U); + + /* Set the Output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS1, TIM_OCInitStruct->OCIdleState); + + /* Set the complementary output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS1N, TIM_OCInitStruct->OCNIdleState << 1U); + } + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx CCMR1 */ + LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH1(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx output channel 2. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 2 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC2Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + + /* Disable the Channel 2: Reset the CC2E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC2E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); + + /* Reset Capture/Compare selection Bits */ + CLEAR_BIT(tmpccmr1, TIM_CCMR1_CC2S); + + /* Select the Output Compare Mode */ + MODIFY_REG(tmpccmr1, TIM_CCMR1_OC2M, TIM_OCInitStruct->OCMode << 8U); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC2P, TIM_OCInitStruct->OCPolarity << 4U); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC2E, TIM_OCInitStruct->OCState << 4U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the complementary output Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC2NP, TIM_OCInitStruct->OCNPolarity << 6U); + + /* Set the complementary output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC2NE, TIM_OCInitStruct->OCNState << 6U); + + /* Set the Output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS2, TIM_OCInitStruct->OCIdleState << 2U); + + /* Set the complementary output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS2N, TIM_OCInitStruct->OCNIdleState << 3U); + } + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx CCMR1 */ + LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH2(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx output channel 3. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 3 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC3Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + + /* Disable the Channel 3: Reset the CC3E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC3E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = LL_TIM_ReadReg(TIMx, CCMR2); + + /* Reset Capture/Compare selection Bits */ + CLEAR_BIT(tmpccmr2, TIM_CCMR2_CC3S); + + /* Select the Output Compare Mode */ + MODIFY_REG(tmpccmr2, TIM_CCMR2_OC3M, TIM_OCInitStruct->OCMode); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC3P, TIM_OCInitStruct->OCPolarity << 8U); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC3E, TIM_OCInitStruct->OCState << 8U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the complementary output Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC3NP, TIM_OCInitStruct->OCNPolarity << 10U); + + /* Set the complementary output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC3NE, TIM_OCInitStruct->OCNState << 10U); + + /* Set the Output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS3, TIM_OCInitStruct->OCIdleState << 4U); + + /* Set the complementary output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS3N, TIM_OCInitStruct->OCNIdleState << 5U); + } + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx CCMR2 */ + LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH3(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx output channel 4. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 4 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC4Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + + /* Disable the Channel 4: Reset the CC4E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC4E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = LL_TIM_ReadReg(TIMx, CCMR2); + + /* Reset Capture/Compare selection Bits */ + CLEAR_BIT(tmpccmr2, TIM_CCMR2_CC4S); + + /* Select the Output Compare Mode */ + MODIFY_REG(tmpccmr2, TIM_CCMR2_OC4M, TIM_OCInitStruct->OCMode << 8U); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC4P, TIM_OCInitStruct->OCPolarity << 12U); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC4E, TIM_OCInitStruct->OCState << 12U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the Output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS4, TIM_OCInitStruct->OCIdleState << 6U); + } + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx CCMR2 */ + LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH4(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx output channel 5. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 5 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC5Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr3; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CC5_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + + /* Disable the Channel 5: Reset the CC5E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC5E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CCMR3 register value */ + tmpccmr3 = LL_TIM_ReadReg(TIMx, CCMR3); + + /* Select the Output Compare Mode */ + MODIFY_REG(tmpccmr3, TIM_CCMR3_OC5M, TIM_OCInitStruct->OCMode); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC5P, TIM_OCInitStruct->OCPolarity << 16U); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC5E, TIM_OCInitStruct->OCState << 16U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the Output Idle state */ + MODIFY_REG(TIMx->CR2, TIM_CR2_OIS5, TIM_OCInitStruct->OCIdleState << 8U); + + } + + /* Write to TIMx CCMR3 */ + LL_TIM_WriteReg(TIMx, CCMR3, tmpccmr3); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH5(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx output channel 6. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 6 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC6Config(TIM_TypeDef *TIMx, const LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr3; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CC6_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + + /* Disable the Channel 5: Reset the CC6E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC6E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CCMR3 register value */ + tmpccmr3 = LL_TIM_ReadReg(TIMx, CCMR3); + + /* Select the Output Compare Mode */ + MODIFY_REG(tmpccmr3, TIM_CCMR3_OC6M, TIM_OCInitStruct->OCMode << 8U); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC6P, TIM_OCInitStruct->OCPolarity << 20U); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC6E, TIM_OCInitStruct->OCState << 20U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the Output Idle state */ + MODIFY_REG(TIMx->CR2, TIM_CR2_OIS6, TIM_OCInitStruct->OCIdleState << 10U); + } + + /* Write to TIMx CCMR3 */ + LL_TIM_WriteReg(TIMx, CCMR3, tmpccmr3); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH6(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx input channel 1. + * @param TIMx Timer Instance + * @param TIM_ICInitStruct pointer to the the TIMx input channel 1 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus IC1Config(TIM_TypeDef *TIMx, const LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= (uint32_t)~TIM_CCER_CC1E; + + /* Select the Input and set the filter and the prescaler value */ + MODIFY_REG(TIMx->CCMR1, + (TIM_CCMR1_CC1S | TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC), + (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 16U); + + /* Select the Polarity and set the CC1E Bit */ + MODIFY_REG(TIMx->CCER, + (TIM_CCER_CC1P | TIM_CCER_CC1NP), + (TIM_ICInitStruct->ICPolarity | TIM_CCER_CC1E)); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx input channel 2. + * @param TIMx Timer Instance + * @param TIM_ICInitStruct pointer to the the TIMx input channel 2 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus IC2Config(TIM_TypeDef *TIMx, const LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= (uint32_t)~TIM_CCER_CC2E; + + /* Select the Input and set the filter and the prescaler value */ + MODIFY_REG(TIMx->CCMR1, + (TIM_CCMR1_CC2S | TIM_CCMR1_IC2F | TIM_CCMR1_IC2PSC), + (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 8U); + + /* Select the Polarity and set the CC2E Bit */ + MODIFY_REG(TIMx->CCER, + (TIM_CCER_CC2P | TIM_CCER_CC2NP), + ((TIM_ICInitStruct->ICPolarity << 4U) | TIM_CCER_CC2E)); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx input channel 3. + * @param TIMx Timer Instance + * @param TIM_ICInitStruct pointer to the the TIMx input channel 3 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus IC3Config(TIM_TypeDef *TIMx, const LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); + + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCER &= (uint32_t)~TIM_CCER_CC3E; + + /* Select the Input and set the filter and the prescaler value */ + MODIFY_REG(TIMx->CCMR2, + (TIM_CCMR2_CC3S | TIM_CCMR2_IC3F | TIM_CCMR2_IC3PSC), + (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 16U); + + /* Select the Polarity and set the CC3E Bit */ + MODIFY_REG(TIMx->CCER, + (TIM_CCER_CC3P | TIM_CCER_CC3NP), + ((TIM_ICInitStruct->ICPolarity << 8U) | TIM_CCER_CC3E)); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx input channel 4. + * @param TIMx Timer Instance + * @param TIM_ICInitStruct pointer to the the TIMx input channel 4 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus IC4Config(TIM_TypeDef *TIMx, const LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= (uint32_t)~TIM_CCER_CC4E; + + /* Select the Input and set the filter and the prescaler value */ + MODIFY_REG(TIMx->CCMR2, + (TIM_CCMR2_CC4S | TIM_CCMR2_IC4F | TIM_CCMR2_IC4PSC), + (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 8U); + + /* Select the Polarity and set the CC2E Bit */ + MODIFY_REG(TIMx->CCER, + (TIM_CCER_CC4P | TIM_CCER_CC4NP), + ((TIM_ICInitStruct->ICPolarity << 12U) | TIM_CCER_CC4E)); + + return SUCCESS; +} + + +/** + * @} + */ + +/** + * @} + */ + +#endif /* TIM1 || TIM2 || TIM3 || TIM4 || TIM14 || TIM15 || TIM16 || TIM17 || TIM6 || TIM7 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_ucpd.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_ucpd.c new file mode 100644 index 0000000..9139a36 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_ucpd.c @@ -0,0 +1,186 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_ucpd.c + * @author MCD Application Team + * @brief UCPD LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_ucpd.h" +#include "stm32g0xx_ll_bus.h" +#include "stm32g0xx_ll_rcc.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ +#if defined (UCPD1) || defined (UCPD2) +/** @addtogroup UCPD_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup UCPD_LL_Private_Constants UCPD Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup UCPD_LL_Private_Macros UCPD Private Macros + * @{ + */ + + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup UCPD_LL_Exported_Functions + * @{ + */ + +/** @addtogroup UCPD_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the UCPD registers to their default reset values. + * @param UCPDx ucpd Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ucpd registers are de-initialized + * - ERROR: ucpd registers are not de-initialized + */ +ErrorStatus LL_UCPD_DeInit(UCPD_TypeDef *UCPDx) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_UCPD_ALL_INSTANCE(UCPDx)); + + LL_UCPD_Disable(UCPDx); + + if (UCPD1 == UCPDx) + { + /* Force reset of ucpd clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UCPD1); + + /* Release reset of ucpd clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UCPD1); + + /* Disable ucpd clock */ + LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_UCPD1); + + status = SUCCESS; + } + if (UCPD2 == UCPDx) + { + /* Force reset of ucpd clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UCPD2); + + /* Release reset of ucpd clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UCPD2); + + /* Disable ucpd clock */ + LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_UCPD2); + + status = SUCCESS; + } + + return status; +} + +/** + * @brief Initialize the ucpd registers according to the specified parameters in UCPD_InitStruct. + * @note As some bits in ucpd configuration registers can only be written when the ucpd is disabled + * (ucpd_CR1_SPE bit =0), UCPD peripheral should be in disabled state prior calling this function. + * Otherwise, ERROR result will be returned. + * @param UCPDx UCPD Instance + * @param UCPD_InitStruct pointer to a @ref LL_UCPD_InitTypeDef structure that contains + * the configuration information for the UCPD peripheral. + * @retval An ErrorStatus enumeration value. (Return always SUCCESS) + */ +ErrorStatus LL_UCPD_Init(UCPD_TypeDef *UCPDx, LL_UCPD_InitTypeDef *UCPD_InitStruct) +{ + /* Check the ucpd Instance UCPDx*/ + assert_param(IS_UCPD_ALL_INSTANCE(UCPDx)); + + if (UCPD1 == UCPDx) + { + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_UCPD1); + } + + if (UCPD2 == UCPDx) + { + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_UCPD2); + } + + LL_UCPD_Disable(UCPDx); + + /*---------------------------- UCPDx CFG1 Configuration ------------------------*/ + MODIFY_REG(UCPDx->CFG1, + UCPD_CFG1_PSC_UCPDCLK | UCPD_CFG1_TRANSWIN | UCPD_CFG1_IFRGAP | UCPD_CFG1_HBITCLKDIV, + UCPD_InitStruct->psc_ucpdclk | (UCPD_InitStruct->transwin << UCPD_CFG1_TRANSWIN_Pos) | + (UCPD_InitStruct->IfrGap << UCPD_CFG1_IFRGAP_Pos) | UCPD_InitStruct->HbitClockDiv); + + return SUCCESS; +} + +/** + * @brief Set each @ref LL_UCPD_InitTypeDef field to default value. + * @param UCPD_InitStruct pointer to a @ref LL_UCPD_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_UCPD_StructInit(LL_UCPD_InitTypeDef *UCPD_InitStruct) +{ + /* Set UCPD_InitStruct fields to default values */ + UCPD_InitStruct->psc_ucpdclk = LL_UCPD_PSC_DIV2; + UCPD_InitStruct->transwin = 0x7; /* Divide by 8 */ + UCPD_InitStruct->IfrGap = 0x10; /* Divide by 17 */ + UCPD_InitStruct->HbitClockDiv = 0x0D; /* Divide by 14 to produce HBITCLK */ +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (UCPD1) || defined (UCPD2) */ +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usart.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usart.c new file mode 100644 index 0000000..c5f9ef0 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usart.c @@ -0,0 +1,468 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_usart.c + * @author MCD Application Team + * @brief USART LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_usart.h" +#include "stm32g0xx_ll_rcc.h" +#include "stm32g0xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +#if defined (USART1) || defined (USART2) || defined (USART3) || defined (USART4) || defined (USART5) || defined (USART6) + +/** @addtogroup USART_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup USART_LL_Private_Macros + * @{ + */ + +#define IS_LL_USART_PRESCALER(__VALUE__) (((__VALUE__) == LL_USART_PRESCALER_DIV1) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV2) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV4) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV6) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV8) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV10) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV12) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV16) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV32) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV64) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV128) \ + || ((__VALUE__) == LL_USART_PRESCALER_DIV256)) + +/* __BAUDRATE__ The maximum Baud Rate is derived from the maximum clock available + * divided by the smallest oversampling used on the USART (i.e. 8) */ +#define IS_LL_USART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) <= 8000000U) + +/* __VALUE__ In case of oversampling by 16 and 8, BRR content must be greater than or equal to 16d. */ +#define IS_LL_USART_BRR_MIN(__VALUE__) ((__VALUE__) >= 16U) + +#define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \ + || ((__VALUE__) == LL_USART_DIRECTION_RX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) + +#define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \ + || ((__VALUE__) == LL_USART_PARITY_EVEN) \ + || ((__VALUE__) == LL_USART_PARITY_ODD)) + +#define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_7B) \ + || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ + || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) + +#define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \ + || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) + +#define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \ + || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) + +#define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \ + || ((__VALUE__) == LL_USART_PHASE_2EDGE)) + +#define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \ + || ((__VALUE__) == LL_USART_POLARITY_HIGH)) + +#define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \ + || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) + +#define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \ + || ((__VALUE__) == LL_USART_STOPBITS_1) \ + || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ + || ((__VALUE__) == LL_USART_STOPBITS_2)) + +#define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \ + || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup USART_LL_Exported_Functions + * @{ + */ + +/** @addtogroup USART_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize USART registers (Registers restored to their default values). + * @param USARTx USART Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: USART registers are de-initialized + * - ERROR: USART registers are not de-initialized + */ +ErrorStatus LL_USART_DeInit(const USART_TypeDef *USARTx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(USARTx)); + + if (USARTx == USART1) + { + /* Force reset of USART clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_USART1); + + /* Release reset of USART clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_USART1); + } + else if (USARTx == USART2) + { + /* Force reset of USART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART2); + + /* Release reset of USART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART2); + } +#if defined(USART3) + else if (USARTx == USART3) + { + /* Force reset of USART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART3); + + /* Release reset of USART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART3); + } +#endif /* USART3 */ +#if defined(USART4) + else if (USARTx == USART4) + { + /* Force reset of USART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART4); + + /* Release reset of USART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART4); + } +#endif /* USART4 */ +#if defined(USART5) + else if (USARTx == USART5) + { + /* Force reset of USART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART5); + + /* Release reset of USART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART5); + } +#endif /* USART5 */ +#if defined(USART6) + else if (USARTx == USART6) + { + /* Force reset of USART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART6); + + /* Release reset of USART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART6); + } +#endif /* USART6 */ + else + { + status = ERROR; + } + + return (status); +} + +/** + * @brief Initialize USART registers according to the specified + * parameters in USART_InitStruct. + * @note As some bits in USART configuration registers can only be written when + * the USART is disabled (USART_CR1_UE bit =0), USART Peripheral should be in disabled state prior calling + * this function. Otherwise, ERROR result will be returned. + * @note Baud rate value stored in USART_InitStruct BaudRate field, should be valid (different from 0). + * @param USARTx USART Instance + * @param USART_InitStruct pointer to a LL_USART_InitTypeDef structure + * that contains the configuration information for the specified USART peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: USART registers are initialized according to USART_InitStruct content + * - ERROR: Problem occurred during USART Registers initialization + */ +ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, const LL_USART_InitTypeDef *USART_InitStruct) +{ + ErrorStatus status = ERROR; + uint32_t periphclk = LL_RCC_PERIPH_FREQUENCY_NO; +#if !defined(RCC_CCIPR_USART3SEL)&&!defined(RCC_CCIPR_USART4SEL)||(!defined(RCC_CCIPR_USART2SEL))||!defined(RCC_CCIPR_USART5SEL)||!defined(RCC_CCIPR_USART6SEL) + LL_RCC_ClocksTypeDef RCC_Clocks; +#endif /* USART clock selection flags */ + + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(USARTx)); + assert_param(IS_LL_USART_PRESCALER(USART_InitStruct->PrescalerValue)); + assert_param(IS_LL_USART_BAUDRATE(USART_InitStruct->BaudRate)); + assert_param(IS_LL_USART_DATAWIDTH(USART_InitStruct->DataWidth)); + assert_param(IS_LL_USART_STOPBITS(USART_InitStruct->StopBits)); + assert_param(IS_LL_USART_PARITY(USART_InitStruct->Parity)); + assert_param(IS_LL_USART_DIRECTION(USART_InitStruct->TransferDirection)); + assert_param(IS_LL_USART_HWCONTROL(USART_InitStruct->HardwareFlowControl)); + assert_param(IS_LL_USART_OVERSAMPLING(USART_InitStruct->OverSampling)); + + /* USART needs to be in disabled state, in order to be able to configure some bits in + CRx registers */ + if (LL_USART_IsEnabled(USARTx) == 0U) + { + /*---------------------------- USART CR1 Configuration --------------------- + * Configure USARTx CR1 (USART Word Length, Parity, Mode and Oversampling bits) with parameters: + * - DataWidth: USART_CR1_M bits according to USART_InitStruct->DataWidth value + * - Parity: USART_CR1_PCE, USART_CR1_PS bits according to USART_InitStruct->Parity value + * - TransferDirection: USART_CR1_TE, USART_CR1_RE bits according to USART_InitStruct->TransferDirection value + * - Oversampling: USART_CR1_OVER8 bit according to USART_InitStruct->OverSampling value. + */ + MODIFY_REG(USARTx->CR1, + (USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | + USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8), + (USART_InitStruct->DataWidth | USART_InitStruct->Parity | + USART_InitStruct->TransferDirection | USART_InitStruct->OverSampling)); + + /*---------------------------- USART CR2 Configuration --------------------- + * Configure USARTx CR2 (Stop bits) with parameters: + * - Stop Bits: USART_CR2_STOP bits according to USART_InitStruct->StopBits value. + * - CLKEN, CPOL, CPHA and LBCL bits are to be configured using LL_USART_ClockInit(). + */ + LL_USART_SetStopBitsLength(USARTx, USART_InitStruct->StopBits); + + /*---------------------------- USART CR3 Configuration --------------------- + * Configure USARTx CR3 (Hardware Flow Control) with parameters: + * - HardwareFlowControl: USART_CR3_RTSE, USART_CR3_CTSE bits according to + * USART_InitStruct->HardwareFlowControl value. + */ + LL_USART_SetHWFlowCtrl(USARTx, USART_InitStruct->HardwareFlowControl); + + /*---------------------------- USART BRR Configuration --------------------- + * Retrieve Clock frequency used for USART Peripheral + */ + if (USARTx == USART1) + { + periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART1_CLKSOURCE); + } + else if (USARTx == USART2) + { +#if defined(RCC_CCIPR_USART2SEL) + periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART2_CLKSOURCE); +#else + /* USART2 clock is PCLK */ + LL_RCC_GetSystemClocksFreq(&RCC_Clocks); + periphclk = RCC_Clocks.PCLK1_Frequency; +#endif /* USART2 Clock selector flag */ + } +#if defined(USART3) + else if (USARTx == USART3) + { +#if defined(RCC_CCIPR_USART3SEL) + periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART3_CLKSOURCE); +#else + /* USART3 clock is PCLK */ + LL_RCC_GetSystemClocksFreq(&RCC_Clocks); + periphclk = RCC_Clocks.PCLK1_Frequency; +#endif /* USART3 Clock selector flag */ + } +#endif /* USART3 */ +#if defined(USART4) + else if (USARTx == USART4) + { +#if defined(RCC_CCIPR_USART4SEL) + periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART4_CLKSOURCE); +#else + /* USART4 clock is PCLK1 */ + LL_RCC_GetSystemClocksFreq(&RCC_Clocks); + periphclk = RCC_Clocks.PCLK1_Frequency; +#endif /* RCC_CCIPR_USART4SEL */ + } +#endif /* USART4 */ +#if defined(USART5) + else if (USARTx == USART5) + { + /* USART5 clock is PCLK1 */ + LL_RCC_GetSystemClocksFreq(&RCC_Clocks); + periphclk = RCC_Clocks.PCLK1_Frequency; + } +#endif /* USART5 */ +#if defined(USART6) + else if (USARTx == USART6) + { + /* USART6 clock is PCLK1 */ + LL_RCC_GetSystemClocksFreq(&RCC_Clocks); + periphclk = RCC_Clocks.PCLK1_Frequency; + } +#endif /* USART6 */ + else + { + /* Nothing to do, as error code is already assigned to ERROR value */ + } + + /* Configure the USART Baud Rate : + - prescaler value is required + - valid baud rate value (different from 0) is required + - Peripheral clock as returned by RCC service, should be valid (different from 0). + */ + if ((periphclk != LL_RCC_PERIPH_FREQUENCY_NO) + && (USART_InitStruct->BaudRate != 0U)) + { + status = SUCCESS; + LL_USART_SetBaudRate(USARTx, + periphclk, + USART_InitStruct->PrescalerValue, + USART_InitStruct->OverSampling, + USART_InitStruct->BaudRate); + + /* Check BRR is greater than or equal to 16d */ + assert_param(IS_LL_USART_BRR_MIN(USARTx->BRR)); + } + + /*---------------------------- USART PRESC Configuration ----------------------- + * Configure USARTx PRESC (Prescaler) with parameters: + * - PrescalerValue: USART_PRESC_PRESCALER bits according to USART_InitStruct->PrescalerValue value. + */ + LL_USART_SetPrescaler(USARTx, USART_InitStruct->PrescalerValue); + } + /* Endif (=> USART not in Disabled state => return ERROR) */ + + return (status); +} + +/** + * @brief Set each @ref LL_USART_InitTypeDef field to default value. + * @param USART_InitStruct pointer to a @ref LL_USART_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ + +void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct) +{ + /* Set USART_InitStruct fields to default values */ + USART_InitStruct->PrescalerValue = LL_USART_PRESCALER_DIV1; + USART_InitStruct->BaudRate = 9600U; + USART_InitStruct->DataWidth = LL_USART_DATAWIDTH_8B; + USART_InitStruct->StopBits = LL_USART_STOPBITS_1; + USART_InitStruct->Parity = LL_USART_PARITY_NONE ; + USART_InitStruct->TransferDirection = LL_USART_DIRECTION_TX_RX; + USART_InitStruct->HardwareFlowControl = LL_USART_HWCONTROL_NONE; + USART_InitStruct->OverSampling = LL_USART_OVERSAMPLING_16; +} + +/** + * @brief Initialize USART Clock related settings according to the + * specified parameters in the USART_ClockInitStruct. + * @note As some bits in USART configuration registers can only be written when + * the USART is disabled (USART_CR1_UE bit =0), USART Peripheral should be in disabled state prior calling + * this function. Otherwise, ERROR result will be returned. + * @param USARTx USART Instance + * @param USART_ClockInitStruct pointer to a @ref LL_USART_ClockInitTypeDef structure + * that contains the Clock configuration information for the specified USART peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: USART registers related to Clock settings are initialized according + * to USART_ClockInitStruct content + * - ERROR: Problem occurred during USART Registers initialization + */ +ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, const LL_USART_ClockInitTypeDef *USART_ClockInitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check USART Instance and Clock signal output parameters */ + assert_param(IS_UART_INSTANCE(USARTx)); + assert_param(IS_LL_USART_CLOCKOUTPUT(USART_ClockInitStruct->ClockOutput)); + + /* USART needs to be in disabled state, in order to be able to configure some bits in + CRx registers */ + if (LL_USART_IsEnabled(USARTx) == 0U) + { + /* Ensure USART instance is USART capable */ + assert_param(IS_USART_INSTANCE(USARTx)); + + /* Check clock related parameters */ + assert_param(IS_LL_USART_CLOCKPOLARITY(USART_ClockInitStruct->ClockPolarity)); + assert_param(IS_LL_USART_CLOCKPHASE(USART_ClockInitStruct->ClockPhase)); + assert_param(IS_LL_USART_LASTBITCLKOUTPUT(USART_ClockInitStruct->LastBitClockPulse)); + + /*---------------------------- USART CR2 Configuration ----------------------- + * Configure USARTx CR2 (Clock signal related bits) with parameters: + * - Clock Output: USART_CR2_CLKEN bit according to USART_ClockInitStruct->ClockOutput value + * - Clock Polarity: USART_CR2_CPOL bit according to USART_ClockInitStruct->ClockPolarity value + * - Clock Phase: USART_CR2_CPHA bit according to USART_ClockInitStruct->ClockPhase value + * - Last Bit Clock Pulse Output: USART_CR2_LBCL bit according to USART_ClockInitStruct->LastBitClockPulse value. + */ + MODIFY_REG(USARTx->CR2, + USART_CR2_CLKEN | USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL, + USART_ClockInitStruct->ClockOutput | USART_ClockInitStruct->ClockPolarity | + USART_ClockInitStruct->ClockPhase | USART_ClockInitStruct->LastBitClockPulse); + } + /* Else (USART not in Disabled state => return ERROR */ + else + { + status = ERROR; + } + + return (status); +} + +/** + * @brief Set each field of a @ref LL_USART_ClockInitTypeDef type structure to default value. + * @param USART_ClockInitStruct pointer to a @ref LL_USART_ClockInitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct) +{ + /* Set LL_USART_ClockInitStruct fields with default values */ + USART_ClockInitStruct->ClockOutput = LL_USART_CLOCK_DISABLE; + USART_ClockInitStruct->ClockPolarity = LL_USART_POLARITY_LOW; /* Not relevant when ClockOutput = + LL_USART_CLOCK_DISABLE */ + USART_ClockInitStruct->ClockPhase = LL_USART_PHASE_1EDGE; /* Not relevant when ClockOutput = + LL_USART_CLOCK_DISABLE */ + USART_ClockInitStruct->LastBitClockPulse = LL_USART_LASTCLKPULSE_NO_OUTPUT; /* Not relevant when ClockOutput = + LL_USART_CLOCK_DISABLE */ +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* USART1 || USART2 || USART3 || USART4 || USART5 || USART6 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + + diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usb.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usb.c new file mode 100644 index 0000000..875ea74 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usb.c @@ -0,0 +1,1398 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_usb.c + * @author MCD Application Team + * @brief USB Low Layer HAL module driver. + * + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Initialization/de-initialization functions + * + I/O operation functions + * + Peripheral Control functions + * + Peripheral State functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Fill parameters of Init structure in USB_OTG_CfgTypeDef structure. + + (#) Call USB_CoreInit() API to initialize the USB Core peripheral. + + (#) The upper HAL HCD/PCD driver will call the right routines for its internal processes. + + @endverbatim + + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" + +/** @addtogroup STM32G0xx_LL_USB_DRIVER + * @{ + */ + +#if defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) +#if defined (USB_DRD_FS) +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +static HAL_StatusTypeDef USB_CoreReset(USB_DRD_TypeDef *USBx); +#if (USE_USB_DOUBLE_BUFFER == 1U) +static HAL_StatusTypeDef USB_HC_BULK_DB_StartXfer(USB_DRD_TypeDef *USBx, + USB_DRD_HCTypeDef *hc, + uint32_t ch_reg, + uint32_t *len); + +static HAL_StatusTypeDef USB_HC_ISO_DB_StartXfer(USB_DRD_TypeDef *USBx, + USB_DRD_HCTypeDef *hc, + uint32_t len); +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + +/** + * @brief Reset the USB Core (needed after USB clock settings change) + * @param USBx Selected device + * @retval HAL status + */ +static HAL_StatusTypeDef USB_CoreReset(USB_DRD_TypeDef *USBx) +{ + /* Disable Host Mode */ + USBx->CNTR &= ~USB_CNTR_HOST; + + /* Force Reset IP */ + USBx->CNTR |= USB_CNTR_USBRST; + + return HAL_OK; +} + +/** + * @brief Initializes the USB Core + * @param USBx USB Instance + * @param cfg pointer to a USB_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_CoreInit(USB_DRD_TypeDef *USBx, USB_DRD_CfgTypeDef cfg) +{ + UNUSED(cfg); + HAL_StatusTypeDef state; + + /* Reset after a PHY select */ + state = USB_CoreReset(USBx); + + /* Clear pending interrupts */ + USBx->ISTR = 0U; + + return state; +} + +/** + * @brief USB_EnableGlobalInt + * Enables the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_EnableGlobalInt(USB_DRD_TypeDef *USBx) +{ + uint32_t winterruptmask; + + /* Clear pending interrupts */ + USBx->ISTR = 0U; + + /* Set winterruptmask variable */ + winterruptmask = USB_CNTR_CTRM | USB_CNTR_WKUPM | + USB_CNTR_SUSPM | USB_CNTR_ERRM | + USB_CNTR_SOFM | USB_CNTR_ESOFM | + USB_CNTR_RESETM | USB_CNTR_L1REQM; + + /* Set interrupt mask */ + USBx->CNTR = winterruptmask; + + return HAL_OK; +} + +/** + * @brief USB_DisableGlobalInt + * Disable the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DisableGlobalInt(USB_DRD_TypeDef *USBx) +{ + uint32_t winterruptmask; + + /* Set winterruptmask variable */ + winterruptmask = USB_CNTR_CTRM | USB_CNTR_WKUPM | + USB_CNTR_SUSPM | USB_CNTR_ERRM | + USB_CNTR_SOFM | USB_CNTR_ESOFM | + USB_CNTR_RESETM | USB_CNTR_L1REQM; + + /* Clear interrupt mask */ + USBx->CNTR &= ~winterruptmask; + + return HAL_OK; +} + +/** + * @brief USB_SetCurrentMode Set functional mode + * @param USBx Selected device + * @param mode current core mode + * This parameter can be one of the these values: + * @arg USB_DEVICE_MODE Peripheral mode + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetCurrentMode(USB_DRD_TypeDef *USBx, USB_DRD_ModeTypeDef mode) +{ + if (mode == USB_DEVICE_MODE) + { + USBx->CNTR &= ~USB_CNTR_HOST; + } + else + { + USBx->CNTR |= USB_CNTR_HOST; + } + + return HAL_OK; +} + +/** + * @brief USB_DevInit Initializes the USB controller registers + * for device mode + * @param USBx Selected device + * @param cfg pointer to a USB_DRD_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevInit(USB_DRD_TypeDef *USBx, USB_DRD_CfgTypeDef cfg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(cfg); + /* Force Reset */ + USBx->CNTR = USB_CNTR_USBRST; + + /* Release Reset */ + USBx->CNTR &= ~USB_CNTR_USBRST; + + /* Set the Device Mode */ + (void)USB_SetCurrentMode(USBx, USB_DEVICE_MODE); + + /* Clear pending interrupts */ + USBx->ISTR = 0U; + + return HAL_OK; +} + +#if defined (HAL_PCD_MODULE_ENABLED) +/** + * @brief Activate and configure an endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateEndpoint(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint32_t wEpRegVal; + + wEpRegVal = PCD_GET_ENDPOINT(USBx, ep->num) & USB_EP_T_MASK; + + /* initialize Endpoint */ + switch (ep->type) + { + case EP_TYPE_CTRL: + wEpRegVal |= USB_EP_CONTROL; + break; + + case EP_TYPE_BULK: + wEpRegVal |= USB_EP_BULK; + break; + + case EP_TYPE_INTR: + wEpRegVal |= USB_EP_INTERRUPT; + break; + + case EP_TYPE_ISOC: + wEpRegVal |= USB_EP_ISOCHRONOUS; + break; + + default: + ret = HAL_ERROR; + break; + } + + PCD_SET_ENDPOINT(USBx, ep->num, (wEpRegVal | USB_EP_VTRX | USB_EP_VTTX)); + + PCD_SET_EP_ADDRESS(USBx, ep->num, ep->num); + + if (ep->doublebuffer == 0U) + { + if (ep->is_in != 0U) + { + /*Set the endpoint Transmit buffer address */ + PCD_SET_EP_TX_ADDRESS(USBx, ep->num, ep->pmaadress); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK); + } + else + { + /* Configure TX Endpoint to disabled state */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + } + else + { + /* Set the endpoint Receive buffer address */ + PCD_SET_EP_RX_ADDRESS(USBx, ep->num, ep->pmaadress); + + /* Set the endpoint Receive buffer counter */ + PCD_SET_EP_RX_CNT(USBx, ep->num, ep->maxpacket); + PCD_CLEAR_RX_DTOG(USBx, ep->num); + + if (ep->num == 0U) + { + /* Configure VALID status for EP0 */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); + } + else + { + /* Configure NAK status for OUT Endpoint */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_NAK); + } + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + /* Double Buffer */ + else + { + if (ep->type == EP_TYPE_BULK) + { + /* Set bulk endpoint as double buffered */ + PCD_SET_BULK_EP_DBUF(USBx, ep->num); + } + else + { + /* Set the ISOC endpoint in double buffer mode */ + PCD_CLEAR_EP_KIND(USBx, ep->num); + } + + /* Set buffer address for double buffered mode */ + PCD_SET_EP_DBUF_ADDR(USBx, ep->num, ep->pmaaddr0, ep->pmaaddr1); + + if (ep->is_in == 0U) + { + /* Clear the data toggle bits for the endpoint IN/OUT */ + PCD_CLEAR_RX_DTOG(USBx, ep->num); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + else + { + /* Clear the data toggle bits for the endpoint IN/OUT */ + PCD_CLEAR_RX_DTOG(USBx, ep->num); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK); + } + else + { + /* Configure TX Endpoint to disabled state */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + return ret; +} + +/** + * @brief De-activate and de-initialize an endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeactivateEndpoint(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep) +{ + if (ep->doublebuffer == 0U) + { + if (ep->is_in != 0U) + { + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + /* Configure DISABLE status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + + else + { + PCD_CLEAR_RX_DTOG(USBx, ep->num); + + /* Configure DISABLE status for the Endpoint */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + /* Double Buffer */ + else + { + if (ep->is_in == 0U) + { + /* Clear the data toggle bits for the endpoint IN/OUT*/ + PCD_CLEAR_RX_DTOG(USBx, ep->num); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + /* Reset value of the data toggle bits for the endpoint out*/ + PCD_TX_DTOG(USBx, ep->num); + + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + else + { + /* Clear the data toggle bits for the endpoint IN/OUT*/ + PCD_CLEAR_RX_DTOG(USBx, ep->num); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + PCD_RX_DTOG(USBx, ep->num); + + /* Configure DISABLE status for the Endpoint*/ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + return HAL_OK; +} + +/** + * @brief USB_EPStartXfer setup and starts a transfer over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPStartXfer(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep) +{ + uint32_t len; +#if (USE_USB_DOUBLE_BUFFER == 1U) + uint16_t pmabuffer; + uint16_t wEPVal; +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + /* IN endpoint */ + if (ep->is_in == 1U) + { + /*Multi packet transfer*/ + if (ep->xfer_len > ep->maxpacket) + { + len = ep->maxpacket; + } + else + { + len = ep->xfer_len; + } + + /* configure and validate Tx endpoint */ + if (ep->doublebuffer == 0U) + { + USB_WritePMA(USBx, ep->xfer_buff, ep->pmaadress, (uint16_t)len); + PCD_SET_EP_TX_CNT(USBx, ep->num, len); + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else + { + /* double buffer bulk management */ + if (ep->type == EP_TYPE_BULK) + { + if (ep->xfer_len_db > ep->maxpacket) + { + /* enable double buffer */ + PCD_SET_BULK_EP_DBUF(USBx, ep->num); + + /* each Time to write in PMA xfer_len_db will */ + ep->xfer_len_db -= len; + + /* Fill the two first buffer in the Buffer0 & Buffer1 */ + if ((PCD_GET_ENDPOINT(USBx, ep->num) & USB_EP_DTOG_TX) != 0U) + { + /* Set the Double buffer counter for pmabuffer1 */ + PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr1; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + ep->xfer_buff += len; + + if (ep->xfer_len_db > ep->maxpacket) + { + ep->xfer_len_db -= len; + } + else + { + len = ep->xfer_len_db; + ep->xfer_len_db = 0U; + } + + /* Set the Double buffer counter for pmabuffer0 */ + PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr0; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + else + { + /* Set the Double buffer counter for pmabuffer0 */ + PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr0; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + ep->xfer_buff += len; + + if (ep->xfer_len_db > ep->maxpacket) + { + ep->xfer_len_db -= len; + } + else + { + len = ep->xfer_len_db; + ep->xfer_len_db = 0U; + } + + /* Set the Double buffer counter for pmabuffer1 */ + PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr1; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + } + /* auto Switch to single buffer mode when transfer xfer_len_db; + + /* disable double buffer mode for Bulk endpoint */ + PCD_CLEAR_BULK_EP_DBUF(USBx, ep->num); + + /* Set Tx count with nbre of byte to be transmitted */ + PCD_SET_EP_TX_CNT(USBx, ep->num, len); + pmabuffer = ep->pmaaddr0; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + } + else /* manage isochronous double buffer IN mode */ + { + /* each Time to write in PMA xfer_len_db will */ + ep->xfer_len_db -= len; + + /* Fill the data buffer */ + if ((PCD_GET_ENDPOINT(USBx, ep->num) & USB_EP_DTOG_TX) != 0U) + { + /* Set the Double buffer counter for pmabuffer1 */ + PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr1; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + else + { + /* Set the Double buffer counter for pmabuffer0 */ + PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr0; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_VALID); + } + else /* OUT endpoint */ + { + if (ep->doublebuffer == 0U) + { + /* Multi packet transfer */ + if (ep->xfer_len > ep->maxpacket) + { + len = ep->maxpacket; + ep->xfer_len -= len; + } + else + { + len = ep->xfer_len; + ep->xfer_len = 0U; + } + /* configure and validate Rx endpoint */ + PCD_SET_EP_RX_CNT(USBx, ep->num, len); + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else + { + /* First Transfer Coming From HAL_PCD_EP_Receive & From ISR */ + /* Set the Double buffer counter */ + if (ep->type == EP_TYPE_BULK) + { + PCD_SET_EP_DBUF_CNT(USBx, ep->num, ep->is_in, ep->maxpacket); + + /* Coming from ISR */ + if (ep->xfer_count != 0U) + { + /* update last value to check if there is blocking state */ + wEPVal = (uint16_t)PCD_GET_ENDPOINT(USBx, ep->num); + + /*Blocking State */ + if ((((wEPVal & USB_EP_DTOG_RX) != 0U) && ((wEPVal & USB_EP_DTOG_TX) != 0U)) || + (((wEPVal & USB_EP_DTOG_RX) == 0U) && ((wEPVal & USB_EP_DTOG_TX) == 0U))) + { + PCD_FREE_USER_BUFFER(USBx, ep->num, 0U); + } + } + } + /* iso out double */ + else if (ep->type == EP_TYPE_ISOC) + { + /* Multi packet transfer */ + if (ep->xfer_len > ep->maxpacket) + { + len = ep->maxpacket; + ep->xfer_len -= len; + } + else + { + len = ep->xfer_len; + ep->xfer_len = 0U; + } + PCD_SET_EP_DBUF_CNT(USBx, ep->num, ep->is_in, len); + } + else + { + return HAL_ERROR; + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); + } + + return HAL_OK; +} + + +/** + * @brief USB_EPSetStall set a stall condition over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPSetStall(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep) +{ + if (ep->is_in != 0U) + { + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_STALL); + } + else + { + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_STALL); + } + + return HAL_OK; +} + +/** + * @brief USB_EPClearStall Clear a stall condition over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPClearStall(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep) +{ + if (ep->doublebuffer == 0U) + { + if (ep->is_in != 0U) + { + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK); + } + } + else + { + PCD_CLEAR_RX_DTOG(USBx, ep->num); + + /* Configure VALID status for the Endpoint */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); + } + } + + return HAL_OK; +} + +/** + * @brief USB_EPStoptXfer Stop transfer on an EP + * @param USBx usb device instance + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPStopXfer(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep) +{ + /* IN endpoint */ + if (ep->is_in == 1U) + { + if (ep->doublebuffer == 0U) + { + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK); + } + else + { + /* Configure TX Endpoint to disabled state */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + } + } + else /* OUT endpoint */ + { + if (ep->doublebuffer == 0U) + { + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_NAK); + } + else + { + /* Configure RX Endpoint to disabled state */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + } + } + } + + return HAL_OK; +} +#endif /* defined (HAL_PCD_MODULE_ENABLED) */ + +/** + * @brief USB_StopDevice Stop the usb device mode + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_StopDevice(USB_DRD_TypeDef *USBx) +{ + /* disable all interrupts and force USB reset */ + USBx->CNTR = USB_CNTR_USBRST; + + /* clear interrupt status register */ + USBx->ISTR = 0U; + + /* switch-off device */ + USBx->CNTR = (USB_CNTR_USBRST | USB_CNTR_PDWN); + + return HAL_OK; +} + +/** + * @brief USB_SetDevAddress Stop the usb device mode + * @param USBx Selected device + * @param address new device address to be assigned + * This parameter can be a value from 0 to 255 + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetDevAddress(USB_DRD_TypeDef *USBx, uint8_t address) +{ + if (address == 0U) + { + /* set device address and enable function */ + USBx->DADDR = USB_DADDR_EF; + } + + return HAL_OK; +} + +/** + * @brief USB_DevConnect Connect the USB device by enabling the pull-up/pull-down + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevConnect(USB_DRD_TypeDef *USBx) +{ + /* Enabling DP Pull-UP bit to Connect internal PU resistor on USB DP line */ + USBx->BCDR |= USB_BCDR_DPPU; + + return HAL_OK; +} + +/** + * @brief USB_DevDisconnect Disconnect the USB device by disabling the pull-up/pull-down + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevDisconnect(USB_DRD_TypeDef *USBx) +{ + /* Disable DP Pull-Up bit to disconnect the Internal PU resistor on USB DP line */ + USBx->BCDR &= ~(USB_BCDR_DPPU); + + return HAL_OK; +} + +/** + * @brief USB_ReadInterrupts return the global USB interrupt status + * @param USBx Selected device + * @retval USB Global Interrupt status + */ +uint32_t USB_ReadInterrupts(USB_DRD_TypeDef *USBx) +{ + uint32_t tmpreg; + + tmpreg = USBx->ISTR; + return tmpreg; +} + +/** + * @brief USB_ActivateRemoteWakeup : active remote wakeup signalling + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_DRD_TypeDef *USBx) +{ + USBx->CNTR |= USB_CNTR_L2RES; + + return HAL_OK; +} + +/** + * @brief USB_DeActivateRemoteWakeup de-active remote wakeup signalling + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_DRD_TypeDef *USBx) +{ + USBx->CNTR &= ~USB_CNTR_L2RES; + + return HAL_OK; +} + +/** + * @brief Copy a buffer from user memory area to packet memory area (PMA) + * @param USBx USB peripheral instance register address. + * @param pbUsrBuf pointer to user memory area. + * @param wPMABufAddr address into PMA. + * @param wNBytes no. of bytes to be copied. + * @retval None + */ +void USB_WritePMA(USB_DRD_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + UNUSED(USBx); + uint32_t WrVal; + uint32_t count; + __IO uint32_t *pdwVal; + uint32_t NbWords = ((uint32_t)wNBytes + 3U) >> 2U; + /* Due to the PMA access 32bit only so the last non word data should be processed alone */ + uint16_t remaining_bytes = wNBytes % 4U; + uint8_t *pBuf = pbUsrBuf; + + /* Check if there is a remaining byte */ + if (remaining_bytes != 0U) + { + NbWords--; + } + + /* Get the PMA Buffer pointer */ + pdwVal = (__IO uint32_t *)(USB_DRD_PMAADDR + (uint32_t)wPMABufAddr); + + /* Write the Calculated Word into the PMA related Buffer */ + for (count = NbWords; count != 0U; count--) + { + *pdwVal = __UNALIGNED_UINT32_READ(pBuf); + pdwVal++; + /* Increment pBuf 4 Time as Word Increment */ + pBuf++; + pBuf++; + pBuf++; + pBuf++; + } + + /* When Number of data is not word aligned, write the remaining Byte */ + if (remaining_bytes != 0U) + { + WrVal = 0U; + + do + { + WrVal |= (uint32_t)(*(uint8_t *)pBuf) << (8U * count); + count++; + pBuf++; + remaining_bytes--; + } while (remaining_bytes != 0U); + + *pdwVal = WrVal; + } +} + +/** + * @brief Copy data from packet memory area (PMA) to user memory buffer + * @param USBx USB peripheral instance register address. + * @param pbUsrBuf pointer to user memory area. + * @param wPMABufAddr address into PMA. + * @param wNBytes no. of bytes to be copied. + * @retval None + */ +void USB_ReadPMA(USB_DRD_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + UNUSED(USBx); + uint32_t count; + uint32_t RdVal; + __IO uint32_t *pdwVal; + uint32_t NbWords = ((uint32_t)wNBytes + 3U) >> 2U; + /*Due to the PMA access 32bit only so the last non word data should be processed alone */ + uint16_t remaining_bytes = wNBytes % 4U; + uint8_t *pBuf = pbUsrBuf; + + /* Get the PMA Buffer pointer */ + pdwVal = (__IO uint32_t *)(USB_DRD_PMAADDR + (uint32_t)wPMABufAddr); + + /* if nbre of byte is not word aligned decrement the nbre of word*/ + if (remaining_bytes != 0U) + { + NbWords--; + } + + /*Read the Calculated Word From the PMA related Buffer*/ + for (count = NbWords; count != 0U; count--) + { + __UNALIGNED_UINT32_WRITE(pBuf, *pdwVal); + + pdwVal++; + pBuf++; + pBuf++; + pBuf++; + pBuf++; + } + + /*When Number of data is not word aligned, read the remaining byte*/ + if (remaining_bytes != 0U) + { + RdVal = *(__IO uint32_t *)pdwVal; + + do + { + *(uint8_t *)pBuf = (uint8_t)(RdVal >> (8U * (uint8_t)(count))); + count++; + pBuf++; + remaining_bytes--; + } while (remaining_bytes != 0U); + } +} + + +/*------------------------------------------------------------------------*/ +/* HOST API */ +/*------------------------------------------------------------------------*/ + +/** + * @brief USB_HostInit Initializes the USB DRD controller registers + * for Host mode + * @param USBx Selected device + * @param cfg pointer to a USB_DRD_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_HostInit(USB_DRD_TypeDef *USBx, USB_DRD_CfgTypeDef cfg) +{ + UNUSED(cfg); + + /* Clear All Pending Interrupt */ + USBx->ISTR = 0U; + + /* Disable all interrupts */ + USBx->CNTR &= ~(USB_CNTR_CTRM | USB_CNTR_PMAOVRM | USB_CNTR_ERRM | + USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_DCON | + USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_L1REQM); + + /* Clear All Pending Interrupt */ + USBx->ISTR = 0U; + + /* Enable Global interrupt */ + USBx->CNTR |= (USB_CNTR_CTRM | USB_CNTR_PMAOVRM | USB_CNTR_ERRM | + USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_DCON | + USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_L1REQM); + + /* Remove Reset */ + USBx->CNTR &= ~USB_CNTR_USBRST; + + return HAL_OK; +} + + +/** + * @brief USB_DRD_ResetPort : Reset Host Port + * @param USBx Selected device + * @retval HAL status + * @note (1)The application must wait at least 10 ms + * before clearing the reset bit. + */ +HAL_StatusTypeDef USB_ResetPort(USB_DRD_TypeDef *USBx) +{ + /* Force USB Reset */ + USBx->CNTR |= USB_CNTR_USBRST; + HAL_Delay(100); + /* Release USB Reset */ + USBx->CNTR &= ~USB_CNTR_USBRST; + HAL_Delay(30); + + return HAL_OK; +} + +/** + * @brief Return Host Core speed + * @param USBx Selected device + * @retval speed Host speed + * This parameter can be one of these values + * @arg USB_DRD_SPEED_FS Full speed mode + * @arg USB_DRD_SPEED_LS Low speed mode + */ +uint32_t USB_GetHostSpeed(USB_DRD_TypeDef *USBx) +{ + if ((USBx->ISTR & USB_ISTR_LS_DCONN) != 0U) + { + return USB_DRD_SPEED_LS; + } + else + { + return USB_DRD_SPEED_FS; + } +} + +/** + * @brief Return Host Current Frame number + * @param USBx Selected device + * @retval current frame number + */ +uint32_t USB_GetCurrentFrame(USB_DRD_TypeDef *USBx) +{ + return USBx->FNR & 0x7FFU; +} + +/** + * @brief Set the channel Kind (Single/double buffer mode) + * @param USBx Selected device + * @param phy_ch_num Selected device + * @param db_state double state can be USB_DRD_XXX_DBUFF_ENBALE/USB_DRD_XXX_DBUFF_DISABLE + * @retval HAL status + */ +HAL_StatusTypeDef USB_HC_DoubleBuffer(USB_DRD_TypeDef *USBx, + uint8_t phy_ch_num, uint8_t db_state) +{ + uint32_t tmp; + + if ((db_state == USB_DRD_BULK_DBUFF_ENBALE) || (db_state == USB_DRD_ISOC_DBUFF_DISABLE)) + { + tmp = (USB_DRD_GET_CHEP(USBx, phy_ch_num) | USB_CH_KIND) & USB_CHEP_DB_MSK; + } + else + { + tmp = USB_DRD_GET_CHEP(USBx, phy_ch_num) & (~USB_CH_KIND) & USB_CHEP_DB_MSK; + } + + /* Set the device speed in case using HUB FS with device LS */ + USB_DRD_SET_CHEP(USBx, phy_ch_num, tmp); + + return HAL_OK; +} + +/** + * @brief Initialize a host channel + * @param USBx Selected device + * @param phy_ch_num Channel number + * This parameter can be a value from 1 to 15 + * @param epnum Endpoint number + * This parameter can be a value from 1 to 15 + * @param dev_address Current device address + * This parameter can be a value from 0 to 255 + * @param speed Current device speed + * This parameter can be one of these values: + * @arg USB_DRD_SPEED_FULL Full speed mode + * @arg USB_DRD_SPEED_LOW Low speed mode + * @param ep_type Endpoint Type + * This parameter can be one of these values: + * @arg EP_TYPE_CTRL Control type + * @arg EP_TYPE_ISOC Isochronous type + * @arg EP_TYPE_BULK Bulk type + * @arg EP_TYPE_INTR Interrupt type + * @param mps Max Packet Size + * This parameter can be a value from 0 to 32K + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_Init(USB_DRD_TypeDef *USBx, uint8_t phy_ch_num, + uint8_t epnum, uint8_t dev_address, uint8_t speed, + uint8_t ep_type, uint16_t mps) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint32_t wChRegVal; + uint32_t HostCoreSpeed; + + UNUSED(mps); + + wChRegVal = USB_DRD_GET_CHEP(USBx, phy_ch_num) & USB_CH_T_MASK; + + /* initialize host Channel */ + switch (ep_type) + { + case EP_TYPE_CTRL: + wChRegVal |= USB_EP_CONTROL; + break; + + case EP_TYPE_BULK: + wChRegVal |= USB_EP_BULK; + break; + + case EP_TYPE_INTR: + wChRegVal |= USB_EP_INTERRUPT; + break; + + case EP_TYPE_ISOC: + wChRegVal |= USB_EP_ISOCHRONOUS; + break; + + default: + ret = HAL_ERROR; + break; + } + + wChRegVal &= ~USB_CHEP_DEVADDR; + wChRegVal |= (((uint32_t)dev_address << USB_CHEP_DEVADDR_Pos) | + ((uint32_t)epnum & 0x0FU)); + + /* Get Host core Speed */ + HostCoreSpeed = USB_GetHostSpeed(USBx); + + /* Set the device speed in case using HUB FS with device LS */ + if ((speed == USB_DRD_SPEED_LS) && (HostCoreSpeed == USB_DRD_SPEED_FS)) + { + wChRegVal |= USB_CHEP_LSEP; + } + + /* Set the dev_address & ep type */ + USB_DRD_SET_CHEP(USBx, phy_ch_num, (wChRegVal | USB_CH_VTRX | USB_CH_VTTX)); + + return ret; +} + +/** + * @brief Start a transfer over a host channel + * @param USBx Selected device + * @param hc pointer to host channel structure + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_StartXfer(USB_DRD_TypeDef *USBx, USB_DRD_HCTypeDef *hc) +{ + uint32_t len; + uint32_t phy_ch_num = (uint32_t)hc->phy_ch_num; +#if (USE_USB_DOUBLE_BUFFER == 1U) + uint32_t ch_reg = USB_DRD_GET_CHEP(USBx, phy_ch_num); +#endif /* USE_USB_DOUBLE_BUFFER */ + + if (hc->ch_dir == CH_IN_DIR) /* In Channel */ + { + /* Multi packet transfer */ + if (hc->xfer_len > hc->max_packet) + { + len = hc->max_packet; + } + else + { + len = hc->xfer_len; + } + + if (hc->doublebuffer == 0U) + { + /* Set RX buffer count */ + USB_DRD_SET_CHEP_RX_CNT(USBx, phy_ch_num, len); + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else if (hc->ep_type == EP_TYPE_BULK) + { + /* Double buffer activated */ + if ((hc->xfer_len > hc->max_packet)) + { + (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_ENBALE); + + /*Set the Double buffer counter*/ + USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 0U, len); + USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 0U, len); + } + else /* switch to single buffer mode */ + { + (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_DISABLE); + + /* Set RX buffer count */ + USB_DRD_SET_CHEP_RX_CNT(USBx, phy_ch_num, len); + } + } + else /* isochronous */ + { + /* Set the Double buffer counter */ + USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 0U, len); + USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 0U, len); + } +#endif /* USE_USB_DOUBLE_BUFFER */ + + /*Enable host channel */ + USB_DRD_SET_CHEP_RX_STATUS(USBx, phy_ch_num, USB_CHEP_RX_STRX); + } + else /* Out Channel */ + { + /* Multi packet transfer*/ + if (hc->xfer_len > hc->max_packet) + { + len = hc->max_packet; + } + else + { + len = hc->xfer_len; + } + + /* configure and validate Tx endpoint */ + if (hc->doublebuffer == 0U) + { + USB_WritePMA(USBx, hc->xfer_buff, hc->pmaadress, (uint16_t)len); + USB_DRD_SET_CHEP_TX_CNT(USBx, phy_ch_num, (uint16_t)len); + + /*SET PID SETUP */ + if ((hc->data_pid) == HC_PID_SETUP) + { + USB_DRD_CHEP_TX_SETUP(USBx, phy_ch_num); + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else if (hc->ep_type == EP_TYPE_BULK) + { + (void)USB_HC_BULK_DB_StartXfer(USBx, hc, ch_reg, &len); + } + else + { + (void)USB_HC_ISO_DB_StartXfer(USBx, hc, len); + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + /* Enable host channel */ + USB_DRD_SET_CHEP_TX_STATUS(USBx, hc->phy_ch_num, USB_CH_TX_VALID); + } + + return HAL_OK; +} + +#if (USE_USB_DOUBLE_BUFFER == 1U) +/** + * @brief Start Transfer of Channel isochronous out double buffer + * @param USBx Selected device + * @param hc_num Host Channel number + * This parameter can be a value from 1 to 15 + * @param len Transfer Length + * @retval HAL state + */ +static HAL_StatusTypeDef USB_HC_ISO_DB_StartXfer(USB_DRD_TypeDef *USBx, + USB_DRD_HCTypeDef *hc, + uint32_t len) +{ + uint32_t phy_ch_num = (uint32_t)hc->phy_ch_num; + + /* check the DTOG_TX to determine in which buffer we should write */ + if ((USB_DRD_GET_CHEP(USBx, phy_ch_num) & USB_CH_DTOG_TX) != 0U) + { + USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 1U, len); + USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)len); + } + else + { + /* DTOGTX=0 */ + /* Set the Double buffer counter for pmabuffer0 */ + USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 1U, len); + USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr1, (uint16_t)len); + } + + return HAL_OK; +} + +/** + * @brief Start Transfer of Channel bulk out double buffer + * @param USBx Selected device + * @param hc_num Host Channel number + * This parameter can be a value from 1 to 15 + * @param ch_reg snapshot of the CHEPR register + * @param len Transfer Length + * @retval HAL state + */ +static HAL_StatusTypeDef USB_HC_BULK_DB_StartXfer(USB_DRD_TypeDef *USBx, + USB_DRD_HCTypeDef *hc, + uint32_t ch_reg, + uint32_t *len) +{ + uint32_t phy_ch_num = (uint32_t)hc->phy_ch_num; + + /* -Double Buffer Mangement- */ + if (hc->xfer_len_db > hc->max_packet) + { + /* enable double buffer mode */ + (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_ENBALE); + *len = hc->max_packet; + hc->xfer_len_db -= *len; + + /* Prepare two buffer before enabling host */ + if ((ch_reg & USB_CH_DTOG_TX) == 0U) + { + /* Write Buffer0 */ + USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 1U, (uint16_t)*len); + USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)*len); + } + else + { + /* Write Buffer1 */ + USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 1U, (uint16_t)*len); + USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr1, (uint16_t)*len); + } + + hc->xfer_buff += *len; + + /* Multi packet transfer */ + if (hc->xfer_len_db > hc->max_packet) + { + hc->xfer_len_db -= *len; + } + else + { + *len = hc->xfer_len_db; + hc->xfer_len_db = 0U; + } + + if ((ch_reg & USB_CH_DTOG_TX) == 0U) + { + /* Write Buffer1 */ + USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 1U, (uint16_t)*len); + USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr1, (uint16_t)*len); + } + else + { + /* Write Buffer0 */ + USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 1U, (uint16_t)*len); + USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)*len); + } + } + else + { + /* Disable bulk double buffer mode */ + (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_DISABLE); + USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)*len); + USB_DRD_SET_CHEP_TX_CNT(USBx, phy_ch_num, (uint16_t)*len); + } + + return HAL_OK; +} +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + +/** + * @brief Halt a host channel in + * @param USBx Selected device + * @param hc_num Host Channel number + * This parameter can be a value from 1 to 15 + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_IN_Halt(USB_DRD_TypeDef *USBx, uint8_t phy_ch) +{ + /* Set disable to Channel */ + USB_DRD_SET_CHEP_RX_STATUS(USBx, phy_ch, USB_CH_RX_DIS); + + return HAL_OK; +} + + +/** + * @brief Halt a host channel out + * @param USBx Selected device + * @param hc_num Host Channel number + * This parameter can be a value from 1 to 15 + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_OUT_Halt(USB_DRD_TypeDef *USBx, uint8_t phy_ch) +{ + /* Set disable to Channel */ + USB_DRD_SET_CHEP_TX_STATUS(USBx, phy_ch, USB_CH_TX_DIS); + + return HAL_OK; +} + +/** + * @brief Stop Host Core + * @param USBx Selected device + * @retval HAL state + */ +HAL_StatusTypeDef USB_StopHost(USB_DRD_TypeDef *USBx) +{ + USBx->ISTR &= ~(USB_ISTR_DIR | USB_ISTR_L1REQ | + USB_ISTR_ESOF | USB_ISTR_SOF | + USB_ISTR_RESET | USB_ISTR_DCON | + USB_ISTR_SUSP | USB_ISTR_WKUP | + USB_ISTR_ERR | USB_ISTR_PMAOVR | + USB_ISTR_CTR); + + /* Set PowerDown */ + USBx->CNTR |= USB_CNTR_PDWN; + + /* Force a Reset */ + USBx->CNTR |= USB_CNTR_USBRST; + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB_DRD_FS) */ +#endif /* defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) */ + +/** + * @} + */ diff --git a/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_utils.c b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_utils.c new file mode 100644 index 0000000..8cd59f4 --- /dev/null +++ b/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_utils.c @@ -0,0 +1,574 @@ +/** + ****************************************************************************** + * @file stm32g0xx_ll_utils.c + * @author MCD Application Team + * @brief UTILS LL module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_ll_utils.h" +#include "stm32g0xx_ll_rcc.h" +#include "stm32g0xx_ll_system.h" +#include "stm32g0xx_ll_pwr.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32G0xx_LL_Driver + * @{ + */ + +/** @addtogroup UTILS_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup UTILS_LL_Private_Constants + * @{ + */ +#define UTILS_MAX_FREQUENCY 64000000U /*!< Maximum frequency for system clock, in Hz */ + +/* Defines used for PLL range */ +#define UTILS_PLLVCO_INPUT_MIN 4000000U /*!< Frequency min for PLLVCO input, in Hz */ +#define UTILS_PLLVCO_INPUT_MAX 8000000U /*!< Frequency max for PLLVCO input, in Hz */ +#define UTILS_PLLVCO_OUTPUT_MIN 64000000U /*!< Frequency min for PLLVCO output, in Hz */ +#define UTILS_PLLVCO_OUTPUT_MAX 344000000U /*!< Frequency max for PLLVCO output, in Hz */ + +/* Defines used for HSE range */ +#define UTILS_HSE_FREQUENCY_MIN 4000000U /*!< Frequency min for HSE frequency, in Hz */ +#define UTILS_HSE_FREQUENCY_MAX 48000000U /*!< Frequency max for HSE frequency, in Hz */ + +/* Defines used for FLASH latency according to HCLK Frequency */ +#define UTILS_SCALE1_LATENCY1_FREQ 24000000U /*!< HCLK frequency to set FLASH latency 1 in power scale 1 */ +#define UTILS_SCALE1_LATENCY2_FREQ 48000000U /*!< HCLK frequency to set FLASH latency 2 in power scale 1 */ +#define UTILS_SCALE1_LATENCY3_FREQ 64000000U /*!< HCLK frequency to set FLASH latency 3 in power scale 1 */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup UTILS_LL_Private_Macros + * @{ + */ +#define IS_LL_UTILS_SYSCLK_DIV(__VALUE__) (((__VALUE__) == LL_RCC_SYSCLK_DIV_1) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_2) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_4) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_8) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_16) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_64) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_128) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_256) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_512)) + +#define IS_LL_UTILS_APB1_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB1_DIV_1) \ + || ((__VALUE__) == LL_RCC_APB1_DIV_2) \ + || ((__VALUE__) == LL_RCC_APB1_DIV_4) \ + || ((__VALUE__) == LL_RCC_APB1_DIV_8) \ + || ((__VALUE__) == LL_RCC_APB1_DIV_16)) + +#define IS_LL_UTILS_HSI_DIV(__VALUE__) (((__VALUE__) == LL_RCC_HSI_DIV_1) \ + || ((__VALUE__) == LL_RCC_HSI_DIV_2) \ + || ((__VALUE__) == LL_RCC_HSI_DIV_4) \ + || ((__VALUE__) == LL_RCC_HSI_DIV_8) \ + || ((__VALUE__) == LL_RCC_HSI_DIV_16) \ + || ((__VALUE__) == LL_RCC_HSI_DIV_32) \ + || ((__VALUE__) == LL_RCC_HSI_DIV_64) \ + || ((__VALUE__) == LL_RCC_HSI_DIV_128)) + +#define IS_LL_UTILS_PLLM_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLLM_DIV_1) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_2) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_3) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_4) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_5) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_6) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_7) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_8)) + +#define IS_LL_UTILS_PLLN_VALUE(__VALUE__) ((8U <= (__VALUE__)) && ((__VALUE__) <= 86U)) + +#define IS_LL_UTILS_PLLR_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLLR_DIV_2) \ + || ((__VALUE__) == LL_RCC_PLLR_DIV_3) \ + || ((__VALUE__) == LL_RCC_PLLR_DIV_4) \ + || ((__VALUE__) == LL_RCC_PLLR_DIV_5) \ + || ((__VALUE__) == LL_RCC_PLLR_DIV_6) \ + || ((__VALUE__) == LL_RCC_PLLR_DIV_7) \ + || ((__VALUE__) == LL_RCC_PLLR_DIV_8)) + +#define IS_LL_UTILS_PLLVCO_INPUT(__VALUE__) ((UTILS_PLLVCO_INPUT_MIN <= (__VALUE__)) && ((__VALUE__) <= UTILS_PLLVCO_INPUT_MAX)) + +#define IS_LL_UTILS_PLLVCO_OUTPUT(__VALUE__) ((UTILS_PLLVCO_OUTPUT_MIN <= (__VALUE__)) && ((__VALUE__) <= UTILS_PLLVCO_OUTPUT_MAX)) + +#define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((__VALUE__) <= UTILS_MAX_FREQUENCY) + +#define IS_LL_UTILS_HSE_BYPASS(__STATE__) (((__STATE__) == LL_UTILS_HSEBYPASS_ON) \ + || ((__STATE__) == LL_UTILS_HSEBYPASS_OFF)) + +#define IS_LL_UTILS_HSE_FREQUENCY(__FREQUENCY__) (((__FREQUENCY__) >= UTILS_HSE_FREQUENCY_MIN) && ((__FREQUENCY__) <= UTILS_HSE_FREQUENCY_MAX)) +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup UTILS_LL_Private_Functions UTILS Private functions + * @{ + */ +static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, + LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct); +static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); +static ErrorStatus UTILS_PLL_IsBusy(void); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup UTILS_LL_Exported_Functions + * @{ + */ + +/** @addtogroup UTILS_LL_EF_DELAY + * @{ + */ + +/** + * @brief This function configures the Cortex-M SysTick source to have 1ms time base. + * @note When a RTOS is used, it is recommended to avoid changing the Systick + * configuration by calling this function, for a delay use rather osDelay RTOS service. + * @param HCLKFrequency HCLK frequency in Hz + * @note HCLK frequency can be calculated thanks to RCC helper macro or function @ref LL_RCC_GetSystemClocksFreq + * @retval None + */ +void LL_Init1msTick(uint32_t HCLKFrequency) +{ + /* Use frequency provided in argument */ + LL_InitTick(HCLKFrequency, 1000U); +} + +/** + * @brief This function provides accurate delay (in milliseconds) based + * on SysTick counter flag + * @note When a RTOS is used, it is recommended to avoid using blocking delay + * and use rather osDelay service. + * @note To respect 1ms timebase, user should call @ref LL_Init1msTick function which + * will configure Systick to 1ms + * @param Delay specifies the delay time length, in milliseconds. + * @retval None + */ +void LL_mDelay(uint32_t Delay) +{ + __IO uint32_t tmp = SysTick->CTRL; /* Clear the COUNTFLAG first */ + uint32_t tmpDelay; /* MISRAC2012-Rule-17.8 */ + /* Add this code to indicate that local variable is not used */ + ((void)tmp); + tmpDelay = Delay; + /* Add a period to guaranty minimum wait */ + if (tmpDelay < LL_MAX_DELAY) + { + tmpDelay ++; + } + + while (tmpDelay != 0U) + { + if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U) + { + tmpDelay --; + } + } +} + +/** + * @} + */ + +/** @addtogroup UTILS_EF_SYSTEM + * @brief System Configuration functions + * + @verbatim + =============================================================================== + ##### System Configuration functions ##### + =============================================================================== + [..] + System, AHB and APB buses clocks configuration + + (+) The maximum frequency of the SYSCLK, HCLK, PCLK1 is 64000000 Hz. + @endverbatim + @internal + Depending on the device voltage range, the maximum frequency should be + adapted accordingly: + + (++) Table 1. HCLK clock frequency. + (++) +-------------------------------------------------------+ + (++) | Latency | HCLK clock frequency (MHz) | + (++) | |-------------------------------------| + (++) | | voltage range 1 | voltage range 2 | + (++) | | 1.08V - 1.32V | 0.9 V - 1.10V | + (++) |-----------------|------------------|------------------| + (++) |0WS(1 CPU cycles)| HCLK <= 24 | HCLK <= 8 | + (++) |-----------------|------------------|------------------| + (++) |1WS(2 CPU cycles)| HCLK <= 48 | HCLK <= 16 | + (++) |-----------------|------------------|------------------| + (++) |2WS(3 CPU cycles)| HCLK <= 64 | - | + (++) |-----------------|------------------|------------------| + + @endinternal + * @{ + */ + +/** + * @brief This function sets directly SystemCoreClock CMSIS variable. + * @note Variable can be calculated also through SystemCoreClockUpdate function. + * @param HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) + * @retval None + */ +void LL_SetSystemCoreClock(uint32_t HCLKFrequency) +{ + /* HCLK clock frequency */ + SystemCoreClock = HCLKFrequency; +} + +/** + * @brief This function configures system clock at maximum frequency with HSI as clock source of the PLL + * @note The application need to ensure that PLL is disabled. + * @note Function is based on the following formula: + * - PLL output frequency = (((HSI frequency / PLLM) * PLLN) / PLLR) + * - PLLM: ensure that the VCO input frequency ranges from 4 to 16 MHz (PLLVCO_input = HSI frequency / PLLM) + * - PLLN: ensure that the VCO output frequency is between 64 and 344 MHz (PLLVCO_output = PLLVCO_input * PLLN) + * - PLLR: ensure that max frequency at 64000000 Hz is reach (PLLVCO_output / PLLR) + * @param UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains + * the configuration information for the PLL. + * @param UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains + * the configuration information for the BUS prescalers. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Max frequency configuration done + * - ERROR: Max frequency configuration not done + */ +ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, + LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) +{ + ErrorStatus status; + uint32_t pllfreq; + + /* Check if one of the PLL is enabled */ + if (UTILS_PLL_IsBusy() == SUCCESS) + { + /* Calculate the new PLL output frequency */ + pllfreq = UTILS_GetPLLOutputFrequency(HSI_VALUE, UTILS_PLLInitStruct); + + /* Enable HSI if not enabled */ + if (LL_RCC_HSI_IsReady() != 1U) + { + LL_RCC_HSI_Enable(); + while (LL_RCC_HSI_IsReady() != 1U) + { + /* Wait for HSI ready */ + } + } + + /* Configure PLL */ + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN, + UTILS_PLLInitStruct->PLLR); + + /* Enable PLL and switch system clock to PLL */ + status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct); + } + else + { + /* Current PLL configuration cannot be modified */ + status = ERROR; + } + + return status; +} + +/** + * @brief This function configures system clock with HSE as clock source of the PLL + * @note The application need to ensure that PLL is disabled. + * @note Function is based on the following formula: + * - PLL output frequency = (((HSE frequency / PLLM) * PLLN) / PLLR) + * - PLLM: ensure that the VCO input frequency ranges from 4 to 16 MHz (PLLVCO_input = HSE frequency / PLLM) + * - PLLN: ensure that the VCO output frequency is between 64 and 344 MHz (PLLVCO_output = PLLVCO_input * PLLN) + * - PLLR: ensure that max frequency at 64000000 Hz is reached (PLLVCO_output / PLLR) + * @param HSEFrequency Value between Min_Data = 4000000 and Max_Data = 48000000 + * @param HSEBypass This parameter can be one of the following values: + * @arg @ref LL_UTILS_HSEBYPASS_ON + * @arg @ref LL_UTILS_HSEBYPASS_OFF + * @param UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains + * the configuration information for the PLL. + * @param UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains + * the configuration information for the BUS prescalers. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Max frequency configuration done + * - ERROR: Max frequency configuration not done + */ +ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, + LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) +{ + ErrorStatus status; + uint32_t pllfreq; + + /* Check the parameters */ + assert_param(IS_LL_UTILS_HSE_FREQUENCY(HSEFrequency)); + assert_param(IS_LL_UTILS_HSE_BYPASS(HSEBypass)); + + /* Check if one of the PLL is enabled */ + if (UTILS_PLL_IsBusy() == SUCCESS) + { + /* Calculate the new PLL output frequency */ + pllfreq = UTILS_GetPLLOutputFrequency(HSEFrequency, UTILS_PLLInitStruct); + + /* Enable HSE if not enabled */ + if (LL_RCC_HSE_IsReady() != 1U) + { + /* Check if need to enable HSE bypass feature or not */ + if (HSEBypass == LL_UTILS_HSEBYPASS_ON) + { + LL_RCC_HSE_EnableBypass(); + } + else + { + LL_RCC_HSE_DisableBypass(); + } + + /* Enable HSE */ + LL_RCC_HSE_Enable(); + while (LL_RCC_HSE_IsReady() != 1U) + { + /* Wait for HSE ready */ + } + } + + /* Configure PLL */ + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN, + UTILS_PLLInitStruct->PLLR); + + /* Enable PLL and switch system clock to PLL */ + status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct); + } + else + { + /* Current PLL configuration cannot be modified */ + status = ERROR; + } + + return status; +} + +/** + * @brief Update number of Flash wait states in line with new frequency and current + * voltage range. + * @param HCLKFrequency HCLK frequency + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Latency has been modified + * - ERROR: Latency cannot be modified + */ +ErrorStatus LL_SetFlashLatency(uint32_t HCLKFrequency) +{ + uint32_t timeout; + uint32_t getlatency; + uint32_t latency; + ErrorStatus status; + + /* Frequency cannot be equal to 0 or greater than max clock */ + if ((HCLKFrequency == 0U) || (HCLKFrequency > UTILS_SCALE1_LATENCY3_FREQ)) + { + status = ERROR; + } + else + { + if (HCLKFrequency > UTILS_SCALE1_LATENCY2_FREQ) + { + /* 48 < HCLK <= 64 => 2WS (3 CPU cycles) */ + latency = LL_FLASH_LATENCY_2; + } + else + { + if (HCLKFrequency > UTILS_SCALE1_LATENCY1_FREQ) + { + /* 24 < HCLK <= 48 => 1WS (2 CPU cycles) */ + latency = LL_FLASH_LATENCY_1; + } + else + { + /* else HCLKFrequency < 24MHz default LL_FLASH_LATENCY_0 0WS */ + latency = LL_FLASH_LATENCY_0; + } + } + + LL_FLASH_SetLatency(latency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + timeout = 2u; + do + { + /* Wait for Flash latency to be updated */ + getlatency = LL_FLASH_GetLatency(); + timeout--; + } while ((getlatency != latency) && (timeout > 0u)); + + if(getlatency != latency) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + + return status; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup UTILS_LL_Private_Functions + * @{ + */ + +/** + * @brief Function to check that PLL can be modified + * @param PLL_InputFrequency PLL input frequency (in Hz) + * @param UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains + * the configuration information for the PLL. + * @retval PLL output frequency (in Hz) + */ +static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct) +{ + uint32_t pllfreq; + + /* Check the parameters */ + assert_param(IS_LL_UTILS_PLLM_VALUE(UTILS_PLLInitStruct->PLLM)); + assert_param(IS_LL_UTILS_PLLN_VALUE(UTILS_PLLInitStruct->PLLN)); + assert_param(IS_LL_UTILS_PLLR_VALUE(UTILS_PLLInitStruct->PLLR)); + + /* Check different PLL parameters according to RM */ + /* - PLLM: ensure that the VCO input frequency ranges from 4 to 16 MHz. */ + pllfreq = PLL_InputFrequency / (((UTILS_PLLInitStruct->PLLM >> RCC_PLLCFGR_PLLM_Pos) + 1U)); + assert_param(IS_LL_UTILS_PLLVCO_INPUT(pllfreq)); + + /* - PLLN: ensure that the VCO output frequency is between 64 and 344 MHz.*/ + pllfreq = pllfreq * (UTILS_PLLInitStruct->PLLN & (RCC_PLLCFGR_PLLN >> RCC_PLLCFGR_PLLN_Pos)); + assert_param(IS_LL_UTILS_PLLVCO_OUTPUT(pllfreq)); + + /* - PLLR: ensure that max frequency at 64000000 Hz is reached */ + pllfreq = pllfreq / (((UTILS_PLLInitStruct->PLLR >> RCC_PLLCFGR_PLLR_Pos) + 1U)); + assert_param(IS_LL_UTILS_PLL_FREQUENCY(pllfreq)); + + return pllfreq; +} + +/** + * @brief Function to check that PLL can be modified + * @retval An ErrorStatus enumeration value: + * - SUCCESS: PLL modification can be done + * - ERROR: PLL is busy + */ +static ErrorStatus UTILS_PLL_IsBusy(void) +{ + ErrorStatus status = SUCCESS; + + /* Check if PLL is busy*/ + if (LL_RCC_PLL_IsReady() != 0U) + { + /* PLL configuration cannot be modified */ + status = ERROR; + } + + return status; +} + +/** + * @brief Function to enable PLL and switch system clock to PLL + * @param SYSCLK_Frequency SYSCLK frequency + * @param UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains + * the configuration information for the BUS prescalers. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: No problem to switch system to PLL + * - ERROR: Problem to switch system to PLL + */ +static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) +{ + ErrorStatus status = SUCCESS; + uint32_t hclk_frequency; + + assert_param(IS_LL_UTILS_SYSCLK_DIV(UTILS_ClkInitStruct->AHBCLKDivider)); + assert_param(IS_LL_UTILS_APB1_DIV(UTILS_ClkInitStruct->APB1CLKDivider)); + + /* Calculate HCLK frequency */ + hclk_frequency = __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, UTILS_ClkInitStruct->AHBCLKDivider); + + /* Increasing the number of wait states because of higher CPU frequency */ + if (SystemCoreClock < hclk_frequency) + { + /* Set FLASH latency to highest latency */ + status = LL_SetFlashLatency(hclk_frequency); + } + + /* Update system clock configuration */ + if (status == SUCCESS) + { + /* Enable PLL */ + LL_RCC_PLL_Enable(); + LL_RCC_PLL_EnableDomain_SYS(); + while (LL_RCC_PLL_IsReady() != 1U) + { + /* Wait for PLL ready */ + } + + /* Sysclk activation on the main PLL */ + LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider); + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) + { + /* Wait for system clock switch to PLL */ + } + + /* Set APB1 & APB2 prescaler*/ + LL_RCC_SetAPB1Prescaler(UTILS_ClkInitStruct->APB1CLKDivider); + } + + /* Decreasing the number of wait states because of lower CPU frequency */ + if (SystemCoreClock > hclk_frequency) + { + /* Set FLASH latency to lowest latency */ + status = LL_SetFlashLatency(hclk_frequency); + } + + /* Update SystemCoreClock variable */ + if (status == SUCCESS) + { + LL_SetSystemCoreClock(hclk_frequency); + } + + return status; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..089a767 --- /dev/null +++ b/Makefile @@ -0,0 +1,217 @@ +########################################################################################################################## +# File automatically-generated by tool: [projectgenerator] version: [3.18.0-B7] date: [Mon Jan 16 04:46:19 CST 2023] +########################################################################################################################## + +# ------------------------------------------------ +# Generic Makefile (based on gcc) +# +# ChangeLog : +# 2017-02-10 - Several enhancements + project update mode +# 2015-07-22 - first version +# ------------------------------------------------ + +###################################### +# target +###################################### +TARGET = radio-gnumake_test + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization +OPT = -Og + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +C_SOURCES = \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_gpio.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cortex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_exti.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c \ +Core/Src/tim.c \ +Core/Src/main.c \ +Core/Src/stm32g0xx_it.c \ +Core/Src/stm32g0xx_hal_msp.c \ +Core/Src/gpio.c \ +Core/Src/usart.c \ +Core/Src/spi.c \ +Core/Src/system_stm32g0xx.c \ +Core/RotaryCoder/RotaryCoder.c \ +Core/ST7735/st7735.c \ +Core/ST7735/UI/monoimg.c \ +Core/ST7735/UI/ui.c \ +#Core/kt0915/KT0915.C \ +#Core/SWI2C/i2c_sw.c \ +#Core/APP/app.c + + +# ASM sources +ASM_SOURCES = \ +startup_stm32g030xx.s + + +####################################### +# binaries +####################################### +PREFIX = arm-none-eabi- +# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) +# either it can be added to the PATH environment variable. +ifdef GCC_PATH +CC = $(GCC_PATH)/$(PREFIX)gcc +AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp +CP = $(GCC_PATH)/$(PREFIX)objcopy +SZ = $(GCC_PATH)/$(PREFIX)size +else +CC = $(PREFIX)gcc +AS = $(PREFIX)gcc -x assembler-with-cpp +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size +endif +HEX = $(CP) -O ihex +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = -mcpu=cortex-m0plus + +# fpu +# NONE for Cortex-M0/M0+/M3 + +# float-abi + + +# mcu +MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) + +# macros for gcc +# AS defines +AS_DEFS = + +# C defines +C_DEFS = \ +-DUSE_HAL_DRIVER \ +-DSTM32G030xx + + +# AS includes +AS_INCLUDES = + +# C includes +C_INCLUDES = \ +-ICore/Inc \ +-IDrivers/STM32G0xx_HAL_Driver/Inc \ +-IDrivers/STM32G0xx_HAL_Driver/Inc/Legacy \ +-IDrivers/CMSIS/Device/ST/STM32G0xx/Include \ +-IDrivers/CMSIS/Include \ +-ICore/RotaryCoder \ +-IDrivers/CMSIS/Include \ +-ICore/ST7735 \ +-ICore/ST7735/UI \ +# -ICore/ST7735/Images \ +#-ICore/kt0915 \ +#-ICore/SWI2C \ +#-ICore/APP + + + +# compile gcc flags +ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +ifeq ($(DEBUG), 1) +CFLAGS += -g -gdwarf-2 +endif + + +# Generate dependency information +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = STM32G030C8Tx_FLASH.ld + +# libraries +LIBS = -lc -lm -lnosys +LIBDIR = +LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections \ +-u_printf_float + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) +vpath %.s $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ + +$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) + $(AS) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(HEX) $< $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** diff --git a/Makefile.bak b/Makefile.bak new file mode 100644 index 0000000..384654a --- /dev/null +++ b/Makefile.bak @@ -0,0 +1,209 @@ +########################################################################################################################## +# File automatically-generated by tool: [projectgenerator] version: [3.18.0-B7] date: [Sun Jan 15 03:57:37 CST 2023] +########################################################################################################################## + +# ------------------------------------------------ +# Generic Makefile (based on gcc) +# +# ChangeLog : +# 2017-02-10 - Several enhancements + project update mode +# 2015-07-22 - first version +# ------------------------------------------------ + +###################################### +# target +###################################### +TARGET = radio-gnumake_test + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization +OPT = -Og + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +C_SOURCES = \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_gpio.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cortex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_exti.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c \ +Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c \ +Core/Src/tim.c \ +Core/Src/main.c \ +Core/Src/stm32g0xx_it.c \ +Core/Src/stm32g0xx_hal_msp.c \ +Core/Src/gpio.c \ +Core/Src/usart.c \ +Core/Src/spi.c \ +Core/Src/system_stm32g0xx.c \ +Core/RotaryCoder/RotaryCoder.c +#Core/kt0915/KT0915.C \ +#Core/kt0915/KT0915.C \ +#Core/ST7735/fonts.c \ +#Core/SWI2C/i2c_sw.c \ + + +# ASM sources +ASM_SOURCES = \ +startup_stm32g030xx.s + + +####################################### +# binaries +####################################### +PREFIX = arm-none-eabi- +# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) +# either it can be added to the PATH environment variable. +ifdef GCC_PATH +CC = $(GCC_PATH)/$(PREFIX)gcc +AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp +CP = $(GCC_PATH)/$(PREFIX)objcopy +SZ = $(GCC_PATH)/$(PREFIX)size +else +CC = $(PREFIX)gcc +AS = $(PREFIX)gcc -x assembler-with-cpp +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size +endif +HEX = $(CP) -O ihex +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = -mcpu=cortex-m0plus + +# fpu +# NONE for Cortex-M0/M0+/M3 + +# float-abi + + +# mcu +MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) + +# macros for gcc +# AS defines +AS_DEFS = + +# C defines +C_DEFS = \ +-DUSE_HAL_DRIVER \ +-DSTM32G030xx + + +# AS includes +AS_INCLUDES = + +# C includes +C_INCLUDES = \ +-ICore/Inc \ +-IDrivers/STM32G0xx_HAL_Driver/Inc \ +-IDrivers/STM32G0xx_HAL_Driver/Inc/Legacy \ +-IDrivers/CMSIS/Device/ST/STM32G0xx/Include \ +-IDrivers/CMSIS/Include \ +-ICore/RotaryCoder +#-ICore/kt0915 \ +#-ICore/SWI2C \ + + + +# compile gcc flags +ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +ifeq ($(DEBUG), 1) +CFLAGS += -g -gdwarf-2 +endif + + +# Generate dependency information +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = STM32G030C8Tx_FLASH.ld + +# libraries +LIBS = -lc -lm -lnosys +LIBDIR = +LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) +vpath %.s $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ + +$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) + $(AS) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(HEX) $< $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** diff --git a/STM32G030C8Tx_FLASH.ld b/STM32G030C8Tx_FLASH.ld new file mode 100644 index 0000000..bae6fd6 --- /dev/null +++ b/STM32G030C8Tx_FLASH.ld @@ -0,0 +1,189 @@ +/* +****************************************************************************** +** + +** File : LinkerScript.ld +** +** Author : STM32CubeMX +** +** Abstract : Linker script for STM32G030C8Tx series +** 64Kbytes FLASH and 8Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

    © COPYRIGHT(c) 2019 STMicroelectronics

    +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K +FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + + diff --git a/cmd.jexe b/cmd.jexe new file mode 100644 index 0000000..ba2f7eb --- /dev/null +++ b/cmd.jexe @@ -0,0 +1,9 @@ +Device STM32G030C8 +SelectInterface SWD +Speed auto +Connect +LoadFile build/radio-gnumake_test.bin 0x8000000 +VerifyBin build/radio-gnumake_test.bin 0x8000000 +Reset +Go +EXit diff --git a/flash.sh b/flash.sh new file mode 100755 index 0000000..9e3740e --- /dev/null +++ b/flash.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +JLinkExe cmd.jexe diff --git a/openocd.cfg b/openocd.cfg new file mode 100644 index 0000000..46109b4 --- /dev/null +++ b/openocd.cfg @@ -0,0 +1,5 @@ +# Sample OpenOCD configuration for the STM32F3DISCOVERY development board + +source [find interface/stlink.cfg] + +source [find target/stm32g0x0.cfg] diff --git a/openocd.gdb b/openocd.gdb new file mode 100644 index 0000000..7795319 --- /dev/null +++ b/openocd.gdb @@ -0,0 +1,40 @@ +target extended-remote :3333 + +# print demangled symbols +set print asm-demangle on + +# set backtrace limit to not have infinite backtrace loops +set backtrace limit 32 + +# detect unhandled exceptions, hard faults and panics +break DefaultHandler +break HardFault +break rust_begin_unwind +# # run the next few lines so the panic message is printed immediately +# # the number needs to be adjusted for your panic handler +# commands $bpnum +# next 4 +# end + +# *try* to stop at the user entry point (it might be gone due to inlining) +break main + +monitor arm semihosting enable + +# # send captured ITM to the file itm.fifo +# # (the microcontroller SWO pin must be connected to the programmer SWO pin) +# # 8000000 must match the core clock frequency +# monitor tpiu config internal itm.txt uart off 8000000 + +# # OR: make the microcontroller SWO pin output compatible with UART (8N1) +# # 8000000 must match the core clock frequency +# # 2000000 is the frequency of the SWO pin +# monitor tpiu config external uart off 8000000 2000000 + +# # enable ITM port 0 +# monitor itm port 0 on + +load + +# start the process but immediately halt the processor +stepi diff --git a/radio-gnumake_test.ioc b/radio-gnumake_test.ioc new file mode 100644 index 0000000..7eb6e7c --- /dev/null +++ b/radio-gnumake_test.ioc @@ -0,0 +1,240 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats=[] +CAD.pinconfig=Dual +CAD.provider= +File.Version=6 +GPIO.groupedBy=Group By Peripherals +KeepUserPlacement=false +Mcu.CPN=STM32G030C8T6 +Mcu.Family=STM32G0 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SPI1 +Mcu.IP3=SYS +Mcu.IP4=TIM3 +Mcu.IP5=USART1 +Mcu.IPNb=6 +Mcu.Name=STM32G030C(6-8)Tx +Mcu.Package=LQFP48 +Mcu.Pin0=PC13 +Mcu.Pin1=PF0-OSC_IN (PF0) +Mcu.Pin10=PA7 +Mcu.Pin11=PA8 +Mcu.Pin12=PA9 +Mcu.Pin13=PC6 +Mcu.Pin14=PC7 +Mcu.Pin15=PA10 +Mcu.Pin16=PA11 [PA9] +Mcu.Pin17=PA12 [PA10] +Mcu.Pin18=PA13 +Mcu.Pin19=PA14-BOOT0 +Mcu.Pin2=PF1-OSC_OUT (PF1) +Mcu.Pin20=PA15 +Mcu.Pin21=PD0 +Mcu.Pin22=PD1 +Mcu.Pin23=PD2 +Mcu.Pin24=PD3 +Mcu.Pin25=PB3 +Mcu.Pin26=PB4 +Mcu.Pin27=VP_SYS_VS_Systick +Mcu.Pin3=PA0 +Mcu.Pin4=PA1 +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PA4 +Mcu.Pin8=PA5 +Mcu.Pin9=PA6 +Mcu.PinsNb=28 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32G030C8Tx +MxCube.Version=6.7.0 +MxDb.Version=DB.6.0.70 +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SVC_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.SysTick_IRQn=true\:3\:0\:false\:false\:true\:false\:true\:false +PA0.GPIOParameters=GPIO_PuPd,GPIO_Label +PA0.GPIO_Label=KEY_1 +PA0.GPIO_PuPd=GPIO_PULLUP +PA0.Locked=true +PA0.Signal=GPIO_Input +PA1.GPIOParameters=GPIO_PuPd,GPIO_Label +PA1.GPIO_Label=KEY_2 +PA1.GPIO_PuPd=GPIO_PULLUP +PA1.Locked=true +PA1.Signal=GPIO_Input +PA10.Mode=Asynchronous +PA10.Signal=USART1_RX +PA11\ [PA9].GPIOParameters=GPIO_Label +PA11\ [PA9].GPIO_Label=LED_3 +PA11\ [PA9].Locked=true +PA11\ [PA9].Signal=GPIO_Output +PA12\ [PA10].GPIOParameters=GPIO_Label +PA12\ [PA10].GPIO_Label=LED_4 +PA12\ [PA10].Locked=true +PA12\ [PA10].Signal=GPIO_Output +PA13.Locked=true +PA13.Mode=Serial_Wire +PA13.Signal=SYS_SWDIO +PA14-BOOT0.Mode=Serial_Wire +PA14-BOOT0.Signal=SYS_SWCLK +PA15.GPIOParameters=GPIO_Label +PA15.GPIO_Label=LED_STATUS +PA15.Locked=true +PA15.Signal=GPIO_Output +PA2.GPIOParameters=GPIO_PuPd,GPIO_Label +PA2.GPIO_Label=KEY_3 +PA2.GPIO_PuPd=GPIO_PULLUP +PA2.Locked=true +PA2.Signal=GPIO_Input +PA3.GPIOParameters=GPIO_PuPd,GPIO_Label +PA3.GPIO_Label=KEY_4 +PA3.GPIO_PuPd=GPIO_PULLUP +PA3.Locked=true +PA3.Signal=GPIO_Input +PA4.GPIOParameters=GPIO_PuPd,GPIO_Label +PA4.GPIO_Label=KEY_5 +PA4.GPIO_PuPd=GPIO_PULLUP +PA4.Locked=true +PA4.Signal=GPIO_Input +PA5.Locked=true +PA5.Mode=TX_Only_Simplex_Unidirect_Master +PA5.Signal=SPI1_SCK +PA6.GPIOParameters=GPIO_Label +PA6.GPIO_Label=LCD_BK +PA6.Locked=true +PA6.Signal=GPIO_Output +PA7.Locked=true +PA7.Mode=TX_Only_Simplex_Unidirect_Master +PA7.Signal=SPI1_MOSI +PA8.GPIOParameters=GPIO_Label +PA8.GPIO_Label=LED_2 +PA8.Locked=true +PA8.Signal=GPIO_Output +PA9.Mode=Asynchronous +PA9.Signal=USART1_TX +PB3.GPIOParameters=GPIO_Label +PB3.GPIO_Label=SWI2C_SCL +PB3.Locked=true +PB3.Signal=GPIO_Output +PB4.GPIOParameters=GPIO_Label +PB4.GPIO_Label=SWI2C_SDA +PB4.Locked=true +PB4.Signal=GPIO_Output +PC13.GPIOParameters=GPIO_PuPd,GPIO_Label +PC13.GPIO_Label=ENCODER_KEY +PC13.GPIO_PuPd=GPIO_PULLUP +PC13.Locked=true +PC13.Signal=GPIO_Input +PC6.GPIOParameters=GPIO_PuPd,GPIO_Label +PC6.GPIO_Label=ENCODER_A +PC6.GPIO_PuPd=GPIO_PULLUP +PC6.Locked=true +PC6.Signal=S_TIM3_CH1 +PC7.GPIOParameters=GPIO_PuPd,GPIO_Label +PC7.GPIO_Label=ENCODER_B +PC7.GPIO_PuPd=GPIO_PULLUP +PC7.Locked=true +PC7.Signal=S_TIM3_CH2 +PD0.GPIOParameters=GPIO_Label +PD0.GPIO_Label=LCD_RST +PD0.Locked=true +PD0.Signal=GPIO_Output +PD1.GPIOParameters=GPIO_PuPd,GPIO_Label +PD1.GPIO_Label=KEY_6 +PD1.GPIO_PuPd=GPIO_PULLUP +PD1.Locked=true +PD1.Signal=GPIO_Input +PD2.GPIOParameters=GPIO_Label +PD2.GPIO_Label=LCD_DC +PD2.Locked=true +PD2.Signal=GPIO_Output +PD3.GPIOParameters=GPIO_Label +PD3.GPIO_Label=LED_1 +PD3.Locked=true +PD3.Signal=GPIO_Output +PF0-OSC_IN\ (PF0).Locked=true +PF0-OSC_IN\ (PF0).Mode=HSE-External-Oscillator +PF0-OSC_IN\ (PF0).Signal=RCC_OSC_IN +PF1-OSC_OUT\ (PF1).Locked=true +PF1-OSC_OUT\ (PF1).Mode=HSE-External-Oscillator +PF1-OSC_OUT\ (PF1).Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=true +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32G030C8Tx +ProjectManager.FirmwarePackage=STM32Cube FW_G0 V1.6.1 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=radio-gnumake_test.ioc +ProjectManager.ProjectName=radio-gnumake_test +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=Makefile +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_TIM3_Init-TIM3-false-HAL-true +RCC.ADCFreq_Value=64000000 +RCC.AHBFreq_Value=64000000 +RCC.APBFreq_Value=64000000 +RCC.APBTimFreq_Value=64000000 +RCC.CortexFreq_Value=64000000 +RCC.EXTERNAL_CLOCK_VALUE=12288000 +RCC.FCLKCortexFreq_Value=64000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=64000000 +RCC.HSE_VALUE=8000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=64000000 +RCC.I2S1Freq_Value=64000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APBFreq_Value,APBTimFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2S1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLRCLKFreq_Value,PLLSourceVirtual,PWRFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +RCC.LSCOPinFreq_Value=32000 +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=64000000 +RCC.PLLN=16 +RCC.PLLPoutputFreq_Value=64000000 +RCC.PLLRCLKFreq_Value=64000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.PWRFreq_Value=64000000 +RCC.SYSCLKFreq_VALUE=64000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.USART1Freq_Value=64000000 +RCC.VCOInputFreq_Value=8000000 +RCC.VCOOutputFreq_Value=128000000 +SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface +SH.S_TIM3_CH1.ConfNb=1 +SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface +SH.S_TIM3_CH2.ConfNb=1 +SPI1.CalculateBaudRate=32.0 MBits/s +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER +TIM3.EncoderMode=TIM_ENCODERMODE_TI1 +TIM3.IC1Polarity=TIM_ICPOLARITY_FALLING +TIM3.IC2Polarity=TIM_ICPOLARITY_FALLING +TIM3.IPParameters=Prescaler,EncoderMode,IC2Polarity,IC1Polarity +TIM3.Prescaler=0 +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom diff --git a/startup_stm32g030xx.s b/startup_stm32g030xx.s new file mode 100644 index 0000000..7a57780 --- /dev/null +++ b/startup_stm32g030xx.s @@ -0,0 +1,270 @@ +/** + ****************************************************************************** + * @file startup_stm32g030xx.s + * @author MCD Application Team + * @brief STM32G030xx devices vector table GCC toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M0+ processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018-2021 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +.syntax unified +.cpu cortex-m0plus +.fpu softvfp +.thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r0, =_estack + mov sp, r0 /* set stack pointer */ + +/* Call the clock system initialization function.*/ + bl SystemInit + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call static constructors */ + bl __libc_init_array +/* Call the application s entry point.*/ + bl main + +LoopForever: + b LoopForever + +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler + +/****************************************************************************** +* +* The minimal vector table for a Cortex M0. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word 0 + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler /* Window WatchDog */ + .word 0 /* reserved */ + .word RTC_TAMP_IRQHandler /* RTC through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_1_IRQHandler /* EXTI Line 0 and 1 */ + .word EXTI2_3_IRQHandler /* EXTI Line 2 and 3 */ + .word EXTI4_15_IRQHandler /* EXTI Line 4 to 15 */ + .word 0 /* reserved */ + .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ + .word DMA1_Channel2_3_IRQHandler /* DMA1 Channel 2 and Channel 3 */ + .word DMA1_Ch4_5_DMAMUX1_OVR_IRQHandler /* DMA1 Channel 4 to Channel 5, DMAMUX1 overrun */ + .word ADC1_IRQHandler /* ADC1 */ + .word TIM1_BRK_UP_TRG_COM_IRQHandler /* TIM1 Break, Update, Trigger and Commutation */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word 0 /* reserved */ + .word TIM3_IRQHandler /* TIM3 */ + .word 0 /* reserved */ + .word 0 /* reserved */ + .word TIM14_IRQHandler /* TIM14 */ + .word 0 /* reserved */ + .word TIM16_IRQHandler /* TIM16 */ + .word TIM17_IRQHandler /* TIM17 */ + .word I2C1_IRQHandler /* I2C1 */ + .word I2C2_IRQHandler /* I2C2 */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word 0 /* reserved */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak RTC_TAMP_IRQHandler + .thumb_set RTC_TAMP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_1_IRQHandler + .thumb_set EXTI0_1_IRQHandler,Default_Handler + + .weak EXTI2_3_IRQHandler + .thumb_set EXTI2_3_IRQHandler,Default_Handler + + .weak EXTI4_15_IRQHandler + .thumb_set EXTI4_15_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_3_IRQHandler + .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler + + .weak DMA1_Ch4_5_DMAMUX1_OVR_IRQHandler + .thumb_set DMA1_Ch4_5_DMAMUX1_OVR_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak TIM1_BRK_UP_TRG_COM_IRQHandler + .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM14_IRQHandler + .thumb_set TIM14_IRQHandler,Default_Handler + + .weak TIM16_IRQHandler + .thumb_set TIM16_IRQHandler,Default_Handler + + .weak TIM17_IRQHandler + .thumb_set TIM17_IRQHandler,Default_Handler + + .weak I2C1_IRQHandler + .thumb_set I2C1_IRQHandler,Default_Handler + + .weak I2C2_IRQHandler + .thumb_set I2C2_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler diff --git a/tools/img/image-to-mem.py b/tools/img/image-to-mem.py new file mode 100644 index 0000000..ae04d25 --- /dev/null +++ b/tools/img/image-to-mem.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +# vim: set ai et ts=4 sw=4: + +from PIL import Image +import sys +import os + +if len(sys.argv) < 2: + print("Usage: {} ".format(sys.argv[0])) + sys.exit(1) + +fname = sys.argv[1] + +img = Image.open(fname) +""" if img.width != 160 or img.height != 128: + print("Error: 160x128 image expected"); + sys.exit(2) """ + +print("const uint16_t test_img[][160] = {"); + +for y in range(0, img.height): + s = "{" + for x in range(0, img.width): + (r, g, b) = img.getpixel( (x, y) ) + color565 = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3) + # for right endiness, so ST7735_DrawImage would work + color565 = ((color565 & 0xFF00) >> 8) | ((color565 & 0xFF) << 8) + s += "0x{:04X},".format(color565) + s += "}," + print(s) + +print("};")
    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

    h9C6wldt*tH-n5VP}R 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≈#OWI%s-=&`RL3FmyVjALnJQXa{J+|I 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%0A&YomcteCdr#0^ebo{!h9DN8pk`CK&|4 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

    >5KMgpIW%RIS)KfyYbF@v@L(RlK=9A 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%0An^macmOCZHnT|X&Ad1inCV2 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

    ;GLMA|s4?;#j$qERW0d;x7WC?^!ff`qYjDeCh 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�ue9q##IV;&-q-TXh^6LbycIhSL`XOJ@HY6R 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

    Z@@t6?%0rLeD2wjwQ09a^ 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

    ZHPX>L;pkEpEErb4L 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�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�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 z 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%0A9>KE&>CP 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

    m|y1 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

    ibz%GeZtd7ElmbhJq!gx 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%0At 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νRR=;; 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